이 있어야하며 다음 사항을 해결하는 방법에 대한 정보를 찾을 수 없었습니다 :포트란 - 컴파일 오류가 - 나는 다음과 같은 컴파일러 오류로 실행하고 명시 적 유형
: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, 다른 컴파일러 오류가? 할당해야합니까, 아니면이를 수행 할 필요가 없습니까?
이것은 Fortran 90이 아니므로 'stand f90 '을 사용하지 마십시오. –
나는 블라디미르 F에 동의하지만 길이 - 1 문자 변수의 할당 가능한 배열을 사용하려고 할 때를 대비하여 [tag : fortran90]을 제거하는 것을 꺼려했다. 나는 당신이 지연된 길이의 문자들을 신경 쓰지 않는다고 가정했다. (즉, '-stand f90'은 당신이 정말로 원하는 것이 아니다.) 어떤 이유로 어레이를 원한다면 나 또는 다른 사람이 별도로 주소를 지정해야합니다. – francescalus
@fracescalus와 Vladimir F에 감사드립니다. -stand f90 플래그없이 컴파일 한 후 아래에 언급 된 변경 사항이 있으면 오류나 경고가 없습니다. – user2030765