2014-09-19 3 views
2

이 있어야하며 다음 사항을 해결하는 방법에 대한 정보를 찾을 수 없었습니다 :포트란 - 컴파일 오류가 - 나는 다음과 같은 컴파일러 오류로 실행하고 명시 적 유형

:

CAM_netcdf_to_WRF_intermediate.f90(382): warning #8236: Deferred character length in a data object or component declaration is an extension of Standard F90. 
    character(len=:),allocatable :: lon_netcdf_units(:),lon_netcdf_title(:) & 
----------------^ 
CAM_netcdf_to_WRF_intermediate.f90(470): error #6404: This name does not have a type, and must have an explicit type. [NF90_GET_ATTRIBUTE] 
    STATUS = NF90_GET_ATTRIBUTE(NCID, lon_var_id, 'units', lon_netcdf_units) 
-----------^ 

이 프로그램은 다음과 같이 컴파일을

ifort -c -CB -CU -ftrapuv -par_report0 -vec_report0 -heap-arrays -O0 -stand f90 -check all -traceback -fstack-protector -assume protect_parens -implicitnone -debug -gen-interfaces -check arg_temp_created -ftrapuv -g -traceback -convert big_endian -I/opt/cray/netcdf/4.3.0/INTEL/130/include/ CAM_netcdf_to_WRF_intermediate.f90 ; ifort CAM_netcdf_to_WRF_intermediate.o -L/opt/cray/netcdf/4.3.0/INTEL/130/lib -lnetcdf -lnetcdff 

프로그램 :

program CAM_netcdf_to_WRF_intermediate 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    use netcdf 
    implicit none 

    ! Declarations: 
    integer, parameter :: outfile_intermediate = 10 
    integer, parameter :: outfile_intermediate_SST = 11 
    integer, parameter :: outfile_diagnostics = 16 
    integer, parameter :: infile_CAM_files_and_dates = 15 
    character(len=24) :: HDATE 

    ! dimensions: 
    integer, parameter :: nx_CAM=288,ny_CAM=192,nz_CAM=26 & 
     ,nfields=5,nfields2d=9,nfields2d_to_read=5 & 
     ,nz_soil=4,nz_CLM=1,nfields_soil=2 
    integer, parameter :: nz_WRF=38 
    character(len=128) :: netcdf_cam_filename,netcdf_clm_filename,netcdf_pop_filename 
    character(len=128) :: netcdf_ice_filename 
    integer :: iEOF 
    logical :: EOF 
    ! open outpuf log file: 
    open(outfile_diagnostics,form='formatted',file="Output/CCSM2WRF.log") 

    ! read the first date and netcdf file name from the input file: 
    open(infile_CAM_files_and_dates,form='formatted',file="Input/CCSM2WRF.input") 
    read(infile_CAM_files_and_dates,*,iostat=iEOF) netcdf_cam_filename,netcdf_clm_filename,& 
         netcdf_pop_filename,netcdf_ice_filename,hdate 
    if (iEOF<0) then; 
print *, "EOF True" 
    EOF=.true.; 
    else; 
print *, "EOF False" 
    EOF=.false.; 
    end if 
    call dummy_read(nz_WRF,hdate,outfile_diagnostics,outfile_intermediate & 
        ,outfile_intermediate_SST,netcdf_cam_filename & 
        ,netcdf_clm_filename,netcdf_pop_filename & 
        ,netcdf_ice_filename,nx_CAM,ny_CAM,nz_CAM,nfields,nfields2d) 
    stop 
end program CAM_netcdf_to_WRF_intermediate 

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
SUBROUTINE HANDLE_ERR(STATUS) 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
    use netcdf 
    implicit none 
    INTEGER STATUS 
! INCLUDE '/opt/cray/netcdf/4.3.0/INTEL/130/include/netcdf.inc' 
    IF (STATUS .NE. NF90_NOERR) THEN 
    PRINT *, NF90_STRERROR(STATUS) 
    STOP 'Stopped' 
    ENDIF 
END SUBROUTINE HANDLE_ERR 

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
Subroutine dummy_read & 
    (nz_WRF,hdate,outfile_diagnostics,outfile_intermediate & 
    ,outfile_intermediate_SST,netcdf_cam_filename & 
    ,netcdf_clm_filename,netcdf_pop_filename & 
    ,netcdf_ice_filename,nx_CAM,ny_CAM,nz_CAM,nfields,nfields2d) 
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
! !DEC$ ATTRIBUTES REFERENCE :: HDATE 
    use netcdf 
    implicit none 
    integer :: nz_WRF 
    integer :: nx_CAM,ny_CAM,nz_CAM,nfields,nfields2d 
    character(len=128) :: filename 
    character(len=24) :: HDATE 
    integer :: outfile_diagnostics,outfile_intermediate,outfile_intermediate_SST 
    integer :: STATUS, NCID, NCID_clm, NCID_pop, NCID_ice 
    character(len=128) :: netcdf_cam_filename, netcdf_clm_filename, netcdf_pop_filename 
    character(len=128) :: netcdf_ice_filename 
    integer :: lat_var_id,lon_var_id,lev_var_id,time_var_id,nlon_var_id & 
      ! 3d fields 
      ,T_var_id,RH_var_id,U_var_id,V_var_id,GEOP_var_id & 
      ! 2d fields 
      ,PS_var_id,PSL_var_id,LANDFRAC_var_id,TS_var_id,SEAICE_var_id & 
      ! pressure variables 
      ,P0_var_id,hyam_var_id,hybm_var_id & 
      ! soil variables 
      ,SM_var_id,ST_var_id & 
      ! surface geopotential 
      ,TOPO_var_id 
    integer :: field_var_id(nfields),field2d_var_id(nfields2d) & 
      ,lon_lat_netcdf_units_length,lon_lat_netcdf_title_length 
    character(len=:),allocatable :: lon_netcdf_units(:),lon_netcdf_title(:) & 
           ,lat_netcdf_units(:),lat_netcdf_title(:) 
! INCLUDE '/opt/cray/netcdf/4.3.0/INTEL/130/include/netcdf.inc' 

    ! open output files for metgrid in WRF/WPS intermediate format: 
    write(filename,'("Output/FILE:",A13)') hdate(1:13) 
    write(outfile_diagnostics,*) "output intermediate file filename=",filename 
    open(outfile_intermediate,form='unformatted',file=filename) 

    write(filename,'("Output/SST:",A13)') hdate(1:13) 
    write(outfile_diagnostics,*) "output intermediate SST file filename=",filename 
    open(outfile_intermediate_SST,form='unformatted',file=filename) 

    ! CAM 
    STATUS = NF90_OPEN(netcdf_cam_filename, 0, NCID) 
    IF (STATUS .NE. NF90_NOERR) CALL HANDLE_ERR(STATUS) 
    ! CLM 
    STATUS = NF90_OPEN(netcdf_clm_filename, 0, NCID_clm) 
    IF (STATUS .NE. NF90_NOERR) CALL HANDLE_ERR(STATUS) 
    ! POP 
    STATUS = NF90_OPEN(netcdf_pop_filename, 0, NCID_pop) 
    IF (STATUS .NE. NF90_NOERR) CALL HANDLE_ERR(STATUS) 
    ! ICE 
    STATUS = NF90_OPEN(netcdf_ice_filename, 0, NCID_ice) 
    IF (STATUS .NE. NF90_NOERR) CALL HANDLE_ERR(STATUS) 
    write(outfile_diagnostics,*) "done nf90_open" 

    ! read netcdf data for all levels: 
    ! ================================ 

    ! get variable IDs 
    ! 3d: 
    STATUS = NF90_INQ_VARID(NCID, 'lat', lat_var_id) 
    STATUS = NF90_INQ_VARID(NCID, 'lon', lon_var_id) 
    STATUS = NF90_INQ_VARID(NCID, 'lev', lev_var_id) 
    STATUS = NF90_INQ_VARID(NCID, 'time', time_var_id) 
    STATUS = NF90_INQ_VARID(NCID, 'nlon', nlon_var_id) 
    STATUS = NF90_INQ_VARID(NCID, 'T', T_var_id) 
    STATUS = NF90_INQ_VARID(NCID, 'Q', RH_var_id) 
    STATUS = NF90_INQ_VARID(NCID, 'U', U_var_id) 
    STATUS = NF90_INQ_VARID(NCID, 'V', V_var_id) 
    STATUS = NF90_INQ_VARID(NCID, 'Z3', GEOP_var_id) 
    IF (STATUS .NE. NF90_NOERR) CALL HANDLE_ERR(STATUS) 

    ! 2d: 
    STATUS = NF90_INQ_VARID(NCID, 'PS', PS_var_id) 
    STATUS = NF90_INQ_VARID(NCID, 'PSL', PSL_var_id) 
    STATUS = NF90_INQ_VARID(NCID, 'LANDFRAC', LANDFRAC_var_id) 
    STATUS = NF90_INQ_VARID(NCID, 'PHIS', TOPO_var_id) 
    IF (STATUS .NE. NF90_NOERR) CALL HANDLE_ERR(STATUS) 

    ! pressure variables: 
    STATUS = NF90_INQ_VARID(NCID, 'P0', P0_var_id) 
    STATUS = NF90_INQ_VARID(NCID, 'hyam', hyam_var_id) 
    STATUS = NF90_INQ_VARID(NCID, 'hybm', hybm_var_id) 
    IF (STATUS .NE. NF90_NOERR) CALL HANDLE_ERR(STATUS) 

    ! soil temp and moisture: 
    STATUS = NF90_INQ_VARID(NCID_clm, 'SOILWATER_10CM', SM_var_id) 
    STATUS = NF90_INQ_VARID(NCID_clm, 'TSOI_10CM', ST_var_id) 
    IF (STATUS .NE. NF90_NOERR) CALL HANDLE_ERR(STATUS) 

    ! Ying.Liu sst: 
    STATUS = NF90_INQ_VARID(NCID_pop, 'tos', TS_var_id) 
    IF (STATUS .NE. NF90_NOERR) CALL HANDLE_ERR(STATUS) 

    ! Ying.Liu ice: 
    STATUS = NF90_INQ_VARID(NCID_ice, 'aice_d', SEAICE_var_id) 
    IF (STATUS .NE. NF90_NOERR) CALL HANDLE_ERR(STATUS) 

    write(outfile_diagnostics,*) "done NF90_INQ_VARID, field_var_id=",field_var_id 
    write(outfile_diagnostics,*) "field2d_var_id=",field2d_var_id 

    ! get attribute values: title and units 
    ! ===================================== 
    ! get units and titles for lon: 
    STATUS = NF90_INQUIRE_ATTRIBUTE(NCID, lon_var_id, 'units', lon_lat_netcdf_units_length) 
    STATUS = NF90_INQUIRE_ATTRIBUTE(NCID, lon_var_id, 'long_name', lon_lat_netcdf_title_length) 
    IF (STATUS .NE. NF90_NOERR) CALL HANDLE_ERR(STATUS) 
    write(outfile_diagnostics,*) " lon: netcdf units length=",lon_lat_netcdf_units_length & 
     ,"; netcdf title length=",lon_lat_netcdf_title_length 
! allocate(lon_netcdf_units(lon_lat_netcdf_units_length)) 
! allocate(lon_netcdf_title(lon_lat_netcdf_title_length)) 
    STATUS = NF90_GET_ATTRIBUTE(NCID, lon_var_id, 'units', lon_netcdf_units) 
    STATUS = NF90_GET_ATTRIBUTE(NCID, lon_var_id, 'long_name', lon_netcdf_title) 
    IF (STATUS .NE. NF90_NOERR) CALL HANDLE_ERR(STATUS) 
    write(outfile_diagnostics,*) "netcdf title=",lon_netcdf_title,"; units=",lon_netcdf_units 
    ! get units and titles for lat: 
    STATUS = NF90_INQUIRE_ATTRIBUTE(NCID, lat_var_id, 'units', lon_lat_netcdf_units_length) 
    STATUS = NF90_INQUIRE_ATTRIBUTE(NCID, lat_var_id, 'long_name', lon_lat_netcdf_title_length) 
    IF (STATUS .NE. NF90_NOERR) CALL HANDLE_ERR(STATUS) 
    write(outfile_diagnostics,*) " lat: netcdf units length=",lon_lat_netcdf_units_length & 
     ,"; netcdf title length=",lon_lat_netcdf_title_length 
! allocate(lat_netcdf_units(lon_lat_netcdf_units_length)) 
! allocate(lat_netcdf_title(lon_lat_netcdf_title_length)) 
    STATUS = NF90_GET_ATTRIBUTE(NCID, lat_var_id, 'units', lat_netcdf_units) 
    STATUS = NF90_GET_ATTRIBUTE(NCID, lat_var_id, 'long_name', lat_netcdf_title) 
    IF (STATUS .NE. NF90_NOERR) CALL HANDLE_ERR(STATUS) 
    write(outfile_diagnostics,*) "netcdf title=",lat_netcdf_title,"; units=",lat_netcdf_units 
! deallocate(lon_netcdf_units,lon_netcdf_title,lat_netcdf_units,lat_netcdf_title) 

    status=NF90_CLOSE(NCID) 
    status=NF90_CLOSE(NCID_clm) 
    status=NF90_CLOSE(NCID_pop) 
    status=NF90_CLOSE(NCID_ice) 

print *, "Leaving dummy, going to MAIN" 
    return 
end Subroutine dummy_read 

측면 질문 - 나는 모든 라인을 주석 처리를 제거하는 경우

CAM_netcdf_to_WRF_intermediate.f90(467): error #8232: If any object being allocated in the ALLOCATE statement has deferred type parameter, either type specification or SOURCE= or MOLD= specifiers shall appear. [LON_NETCDF_UNITS] 
    allocate(lon_netcdf_units(lon_lat_netcdf_units_length)) 
-----------^ 

가 어떻게 이러한 문자를 할당 가겠어요 : 프로그램의 맨 아래에있는 경도 [위도] _netcdf_units [제목] ocating, 다른 컴파일러 오류가? 할당해야합니까, 아니면이를 수행 할 필요가 없습니까?

+0

이것은 Fortran 90이 아니므로 'stand f90 '을 사용하지 마십시오. –

+0

나는 블라디미르 F에 동의하지만 길이 - 1 문자 변수의 할당 가능한 배열을 사용하려고 할 때를 대비하여 [tag : fortran90]을 제거하는 것을 꺼려했다. 나는 당신이 지연된 길이의 문자들을 신경 쓰지 않는다고 가정했다. (즉, '-stand f90'은 당신이 정말로 원하는 것이 아니다.) 어떤 이유로 어레이를 원한다면 나 또는 다른 사람이 별도로 주소를 지정해야합니다. – francescalus

+0

@fracescalus와 Vladimir F에 감사드립니다. -stand f90 플래그없이 컴파일 한 후 아래에 언급 된 변경 사항이 있으면 오류나 경고가 없습니다. – user2030765

답변

3

API documentation에 따르면 기능은 NF90_GET_ATT이어야합니다. 정확한 함수의 인수

, 속성 코드 속성 "값의 길이를 결정하려고 시도하고, 각각 할당을 위해 다음 지연되어 마치

should be a variable of type character with the len Fortran 90 attribute set to an appropriate value

의 값에 대한 변수 길이 문자 변수를 적절한 길이로 변환합니다. 칭찬할만한 목표.

컴파일러에서 경고하므로 Fortran 90 기능이 아니지만 경고 이상의 문제는 아닙니다. 어떤 문제가하는 것은 거기에 약간의 혼동이

character(len=:),allocatable :: lon_netcdf_units(:) 

이 지연된 길이 문자 변수 인 변수 값의 선언에 의해 제안 된 것으로 보인다, 또한 배열 것입니다. 대신에이 (현재 스칼라)의 가변 길이

character(len=:),allocatable :: lon_netcdf_units 

할당은 '타입 사양 "방법 형태

allocate(character(len=lon_lat_netcdf_units_length) :: lon_netcdf_units) 

따른다. [또는, mold=source= 옵션을 사용할 수 있습니다, 그러나 이들은 여기에 갈 가치가 없습니다.]

[이이 속성의 길이를 반환하는 nf90_inquire_attribute 기능을 기반으로 내 초기 검사는 통화가되지 않을 수 있음을 시사 올바른 주소이고 len= 키워드가 필요합니다.]