Fortran在编译时发出警告,在执行时读取错误

时间:2014-01-28 09:39:44

标签: fortran intel-fortran

我正在尝试使用英特尔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

log file

和模型运行的输出

  

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

3 个答案:

答案 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是气象中使用的格式)。实际上,已经上传了该软件的新版本,我可以成功编译并运行。

再次感谢