我正在尝试使用英特尔fortran编译器版本14.0.1在Linux集群(Ubuntu 12.04)中构建气象模型。但是在尝试编译fdgrib2模块时,我收到了这条警告消息:
/opt/intel/bin/ifort -c -I. /usr/local/rams60/src/pre/fdgrib2/grib_get.f90
/usr/local/rams60/src/pre/fdgrib2/grib_get.f90(209): warning #8042: This argument must be of type character of length 1. [TOKENS]
print*,'5--'//trim(tokens(1)), len_trim(tokens(1)),ichar(tokens(1))
------------------------------------------------------------^
ar rs fdgrib2.a grib_get.o
rm -f grib_get.o
令牌声明
字符(len = 20):: tokens(100)
尽管有这样的警告,但fdgrib2可执行文件已构建,但在尝试使用其他错误消息运行停止时:
/usr/local/rams60/build/fdgrib2$ ./fdgrib2 -f DGRIB_IN2
num args: 2
---------------------------------------------------------------
GRIB to GDF converter
---------------------------------------------------------------
Namelist file name: DGRIB_IN2
GRIB file name : ./gfs.t00z.pgrbf06.grib2
WGRIB exec :
Assumimg GRIB 2 : /usr/local/grib2/wgrib2/wgrib2
Data date/time : 99999999
Forecast hour : 99999999
3D variables: UGRD VGRD TMP HGT RH
2D variables:
forrtl: severe (59): list-directed I/O syntax error, unit -5, file Internal List-Directed Read
Image PC Routine Line Source
fdgrib2 08076240 Unknown Unknown Unknown
fdgrib2 08074C94 Unknown Unknown Unknown
fdgrib2 08057847 Unknown Unknown Unknown
fdgrib2 0804BFA2 Unknown Unknown Unknown
fdgrib2 0804A827 Unknown Unknown Unknown
libc.so.6 B72E94D3 Unknown Unknown Unknown
fdgrib2进程在grib_get.f90
上的命令处完成 [fortran] call tokenize_ws(lines(1),tokens,ntok)
nb = index(tokens(1),'=')+1
ne = len_trim(tokens(1))
read(tokens(1)(nb:ne),*) longdate [/fortran]
我不是专家fortran程序员所以我不知道如何处理这个问题。任何帮助将不胜感激。
提前致谢
编辑1
添加了print语句以找出错误发生的时间
call tokenize_ws(lines(1),tokens,ntok) nb = index(tokens(1),'=')+1 ne = len_trim(tokens(1)) print*,'P3' print *,lines(1) print *,tokens(1) print *,tokens(1)(nb:ne)
读(令牌(1)(nb:ne),*)longdate
打印*,'P4'
和输出(通过P3但不到达P4)。 2014012000是输入数据文件的正确日期和时间
P3
1.1:0:d=2014012000
1.1:0:d=2014012000
2014012000
forrtl: severe (59): list-directed I/O syntax error, unit -5, file Internal List-Directed Read
Image PC Routine Line Source
fdgrib2 080761C0 Unknown Unknown Unknown
编辑2
tokenize.f90
中子程序tokenize_ws的代码subroutine tokenize_ws(str,tokens,ntok)
implicit none
integer :: ntok
character(len=*) :: str,tokens(*)
character(len=1) :: sep,tab
integer :: ntokmax=100,npt,nch,nc,ntbeg,ntend,n
! this routine "parses" character string str into different pieces
! or tokens by looking for possible token separators (toks
! str contains nch characters. the number of tokens identified is nto
! the character string tokens are stored in tokens.
! Modified 12/11/07: this version tokenizes by white space (spaces and tabs)
sep = char(32)
tab = char(9)
ntok=0
npt=1
nch=len_trim(str)
nc=1
do ntok=1,ntokmax
do n=nc,nch
if(str(n:n) /= sep .and. str(n:n) /= tab) then
ntbeg=n
goto 21
endif
enddo
21 continue
do n=ntbeg,nch
if(str(n:n) == sep .or. str(n:n) == tab) then
ntend=n-1
goto 22
endif
if(n == nch) then
ntend=n
goto 22
endif
enddo
22 continue
tokens(ntok)=str(ntbeg:ntend)
nc=ntend+1
if(nc.ge.nch) goto 25
enddo
25 continue
return
end
编辑3
添加了源代码和输入文件(linux tar文件)
http://ubuntuone.com/5tL2IO8OV5dBxhs18kt1WI
http://ubuntuone.com/1meYXbBuBt1Rxcx4ODMzVp
编辑4
编译选项的输出-traceback -warn -check
和模型运行的输出
2014012000
9 19 forrtl: severe (59): list-directed I/O syntax error, unit -5, file Internal List-Directed Read Image PC
常规线源fdgrib2
080942C0未知未知未知fdgrib2
08092D14未知未知未知fdgrib2
0806F822 grib_get_mod_mp_g 291 grib_get.f90 fdgrib2
08051CD0 MAIN__ 130 dgrib.f90 fdgrib2
0804A757未知未知未知libc.so.6
B72CF4D3未知未知未知
编辑5
将read(tokens(1)(nb:ne),*) longdate
(字符9到19)更改为read(tokens(1)(nb:ne-1),*) (chars 9 to 18) longdate
之后,它似乎正确读取了longdate,预期值为2014012000.但随后出现了另一个错误,因为我发布此信息后我将继续查找寻求解决方案。 fdgrib2是一个“相对较旧”的grib2文件读取代码,但是它起作用并且应该仍然有效,我的错。谢谢你的帮助。
print*,'P3'
print *,lines(1)
print *,tokens(1)
print *,tokens(1)(nb:ne)
print *,nb,ne
read(tokens(1)(nb:ne-1),*) longdate
print*,'P4'
print*,'ddd:', longdate
P3
1.1:0:d=2014012000
1.1:0:d=2014012000
2014012000
9 19
P4
ddd: 2014012000
1--1.1:0:scan=0 input=WE:NS output=WE:SN:grid_template=0:winds(N/S):
--
ppp0: 0 360 181 lat-lon
ppp0: 0.0000000E+00 0.0000000E+00 0.0000000E+00 0.0000000E+00
forrtl: severe (59): list-directed I/O syntax error, unit -5, file Internal List-Directed Read
Image PC Routine Line Source
fdgrib2 08094350 Unknown Unknown Unknown
fdgrib2 08092DA4 Unknown Unknown Unknown
fdgrib2 0806D724 grib_get_mod_mp_g 219 grib_get.f90
fdgrib2 08051D20 MAIN__ 132 dgrib.f90
fdgrib2 0804A757 Unknown Unknown Unknown
libc.so.6 B72984D3 Unknown Unknown Unknown
答案 0 :(得分:2)
如果您尚未完成,请修复编译器引发警告的原因。摘录
ichar(tokens(1))
将长度为20的字符变量传递给ichar
,该变量需要长度为1的变量。
我不知道这会如何导致你后来的问题,但在尝试修复神秘的虫子时,抓住每根稻草通常都是个好主意。
答案 1 :(得分:1)
检查输入文件,特别是崩溃时代码当前正在处理的位置。从tokens(1)(nb:ne)
读取longdate时会出现一些问题,这些问题是由行(1)构成的。您可以添加一些print语句以使其更清晰:
print *,lines(1)
print *,tokens(1)
print *,tokens(1)(nb:ne)
另外,不要担心警告。它不是一段好的代码,但它是在一个print语句中,所以它只是打印出一个没有很好定义的标准输出。
答案 2 :(得分:0)
感谢所有试图提供帮助的人。最后,我可以成功。
我的问题来自一个未针对英特尔编译器优化的旧软件,因此在读取grib2文件时会出现此类错误消息(GRIB2是气象中使用的格式)。实际上,已经上传了该软件的新版本,我可以成功编译并运行。
再次感谢