Fortran运行时错误:错误的实数

Fortran运行时错误:错误的实数,fortran,gfortran,Fortran,Gfortran,我有一个代码如下所附。它应该读取二进制文件并生成一种特殊格式。(此代码是午睡代码的一部分。)但是,我在执行代码时收到以下错误: At line 127 of file grid2cube.f (unit = 5, file = 'stdin') Fortran runtime error: Bad real number in item 0 of list input 我在主代码中编译的fortran编译器和标志是: FC=/usr/local/bin/mpif90 FFLAGS=-g-O2

我有一个代码如下所附。它应该读取二进制文件并生成一种特殊格式。(此代码是午睡代码的一部分。)但是,我在执行代码时收到以下错误:

At line 127 of file grid2cube.f (unit = 5, file = 'stdin')
Fortran runtime error: Bad real number in item 0 of list input
我在主代码中编译的fortran编译器和标志是:

FC=/usr/local/bin/mpif90 FFLAGS=-g-O2 FPPFLAGS=-DMPI -DFC_HAVE_FLUSH-DFC_HAVE_ABORT LDFLAGS=

此代码也使用相同的标志编译:

/usr/local/bin/mpif90-c-g-O2 grid2cube.f /usr/local/bin/mpif90-o grid2cube grid2cube.o

我还将“-O2”更改为“-O1”和“O0”,并重新编译了所有内容。但是产生了同样的错误。此外,我使用mpich-3.0.4和gfortran作为基础

请帮我纠正这个错误

program grid2cube
      implicit none

      integer           maxp, natmax, nskip

      parameter         (maxp = 12000000)
      parameter         (natmax = 1000)

      integer           ipt, isp, ix, iy, iz, i, ip, natoms, np, 
     .                  mesh(3), nspin, Ind, id(3), iix, iiy,
     .                  iiz, ii, length, lb
      integer           is(natmax), izat(natmax)

      character         sysname*70, fnamein*75, fnameout(2)*75, 
     .                  fnamexv*75, paste*74, task*5, fform*12

      double precision              rho(maxp,2), rhot(maxp,2)

      double precision  cell(3,3), xat(natmax,3), cm(3), rt(3),
     .                  delta(3), dr(3), residual

      external  paste, lb

c ---------------------------------------------------------------------------

      read(*,*)
      read(5,*) sysname
      read(5,*) task
      read(5,*) rt(1),rt(2),rt(3)
      read(5,*) nskip
      read(5,*) fform

      fnamexv = paste(sysname,'.XV')
      if (task .eq. 'rho') then
        fnamein = paste(sysname,'.RHO')
      else if (task .eq. 'drho') then 
        fnamein = paste(sysname,'.DRHO')
      else if (task .eq. 'ldos') then 
        fnamein = paste(sysname,'.LDOS')
      else if (task .eq. 'vt') then 
        fnamein = paste(sysname,'.VT')
      else if (task .eq. 'vh') then 
        fnamein = paste(sysname,'.VH')
      else if (task .eq. 'bader') then 
        fnamein = paste(sysname,'.BADER')
      else
        write(6,*) 'Wrong task'
        write(6,*) 'Accepted values:  rho, drho, ldos, vh, vt, bader'
        write(6,*) '(in lower case!!!!)'
        stop
      endif


      length = lb(fnamein)
      write(6,*) 
      write(6,*) 'Reading grid data from file ',fnamein(1:length)

c read function from the 3D grid --------------------------------------------

      open( unit=1, file=fnamein, form=fform, status='old' )

      if (fform .eq. 'unformatted') then
        read(1) cell
      else if (fform .eq. 'formatted') then
        do ix=1,3
          read(1,*) (cell(iy,ix),iy=1,3)
        enddo
      else
        stop 'ERROR: last input line must be formatted or unformatted'
      endif


      write(6,*) 
      write(6,*) 'Cell vectors'
      write(6,*) 
      write(6,*) cell(1,1),cell(2,1),cell(3,1)
      write(6,*) cell(1,2),cell(2,2),cell(3,2)
      write(6,*) cell(1,3),cell(2,3),cell(3,3)

      residual = 0.0d0
      do ix=1,3
      do iy=ix+1,3
        residual = residual + cell(ix,iy)**2
      enddo
      enddo

      if (residual .gt. 1.0d-6) then
        write(6,*) 
        write(6,*) 'ERROR: this progam can only handle orthogonal cells'
        write(6,*) ' with vectors pointing in the X, Y and Z directions'
        stop
      endif

      if (fform .eq. 'unformatted') then
        read(1) mesh, nspin
      else
        read(1,*) mesh, nspin
      endif

      write(6,*) 
      write(6,*) 'Grid mesh: ',mesh(1),'x',mesh(2),'x',mesh(3)
      write(6,*) 
      write(6,*) 'nspin = ',nspin
      write(6,*) 

      do ix=1,3
        dr(ix)=cell(ix,ix)/mesh(ix)
      enddo

      np = mesh(1) * mesh(2) * mesh(3)
      if (np .gt. maxp) stop 'grid2d: Parameter MAXP too small'
C      read(1) ( (rho(ip,isp), ip = 1, np), isp = 1,nspin)
      do isp=1,nspin
        Ind=0
        if (fform .eq. 'unformatted') then
          do iz=1,mesh(3)
          do iy=1,mesh(2)
            read(1) (rho(Ind+ix,isp),ix=1,mesh(1))
            Ind=Ind+mesh(1)
          enddo
          enddo
        else
          do iz=1,mesh(3)
          do iy=1,mesh(2)
            read(1,'(e15.6)') (rho(Ind+ix,isp),ix=1,mesh(1))
            Ind=Ind+mesh(1)
          enddo
          enddo
        endif
      enddo

C translate cell
      do ix=1,3
        delta(ix) = rt(ix)/dr(ix)
        id(ix) = delta(ix)
        delta(ix) = rt(ix) - id(ix) * dr(ix)
      enddo

      do iz=1,mesh(3)
      do iy=1,mesh(2)
      do ix=1,mesh(1)
        iix=ix+id(1)
        iiy=iy+id(2)
        iiz=iz+id(3)
        if (iix .lt. 1) iix=iix+mesh(1)
        if (iiy .lt. 1) iiy=iiy+mesh(2)
        if (iiz .lt. 1) iiz=iiz+mesh(3)
        if (iix .gt. mesh(1)) iix=iix-mesh(1)
        if (iiy .gt. mesh(2)) iiy=iiy-mesh(2)
        if (iiz .gt. mesh(3)) iiz=iiz-mesh(3)

        if (iix .lt. 1) stop 'ix < 0'
        if (iiy .lt. 1) stop 'iy < 0'
        if (iiz .lt. 1) stop 'iz < 0'
        if (iix .gt. mesh(1)) stop 'ix > cell'
        if (iiy .gt. mesh(2)) stop 'iy > cell'
        if (iiz .gt. mesh(3)) stop 'iz > cell'
        i=ix+(iy-1)*mesh(1)+(iz-1)*mesh(1)*mesh(2)
        ii=iix+(iiy-1)*mesh(1)+(iiz-1)*mesh(1)*mesh(2)
        do isp=1,nspin
          rhot(ii,isp)=rho(i,isp)
        enddo
      enddo
      enddo
      enddo

      close(1)

      open( unit=3, file=fnamexv, status='old', form='formatted')
      read(3,*)
      read(3,*)
      read(3,*)
      read(3,*) natoms
      do i=1,natoms
        read(3,*) is(i),izat(i),(xat(i,ix),ix=1,3)
      enddo

      do i=1,natoms
        do ix=1,3
          xat(i,ix)=xat(i,ix)+rt(ix)-delta(ix)
          if (xat(i,ix) .lt. 0.0) xat(i,ix)=xat(i,ix)+cell(ix,ix)
          if (xat(i,ix) .gt. cell(ix,ix)) 
     .        xat(i,ix)=xat(i,ix)-cell(ix,ix)
        enddo
      enddo
      close(3)



      if (nspin .eq. 1) then
        fnameout(1) = paste(fnamein,'.cube')
      else if (nspin .eq. 2) then
        fnameout(1) = paste(fnamein,'.UP.cube')
        fnameout(2) = paste(fnamein,'.DN.cube')
      else 
        stop 'nspin must be either 1 or 2'
      endif

      do isp=1,nspin

      length = lb(fnameout(isp))
      write(6,*) 'Writing CUBE file ',fnameout(isp)(1:length)

C      open( unit=2, file=fnameout(isp), status='new', form='formatted')
      open( unit=2, file=fnameout(isp), form='formatted')

      length = lb(fnameout(isp))
      write(2,*) fnameout(isp)(1:length)
      write(2,*) fnameout(isp)(1:length)
      write(2,'(i5,4f12.6)') natoms, 0.0,0.0,0.0

      do ix=1,3
        ii = mesh(ix)/nskip
        if (ii*nskip .ne. mesh(ix)) ii = ii+1
        write(2,'(i5,4f12.6)') 
     .    ii,(cell(ix,iy)/ii,iy=1,3)
      enddo

      do i=1,natoms
        write(2,'(i5,4f12.6)') izat(i),0.0,(xat(i,ix),ix=1,3)
      enddo



      do ix=1,mesh(1),nskip
      do iy=1,mesh(2),nskip

        write(2,'(6e13.5)') 
     .  (rhot(ix+(iy-1)*mesh(1)+(iz-1)*mesh(1)*mesh(2),isp), 
     .   iz=1,mesh(3),nskip)

      enddo
      enddo

      close(2)

      enddo

      write(6,*) 

      end


      CHARACTER*(*) FUNCTION PASTE( STR1, STR2 )

C CONCATENATES THE STRINGS STR1 AND STR2 REMOVING BLANKS IN BETWEEN
C Writen by Jose M. Soler

      CHARACTER*(*) STR1, STR2
      DO 10 L = LEN( STR1 ), 1, -1
         IF (STR1(L:L) .NE. ' ') GOTO 20
   10 CONTINUE
   20 PASTE = STR1(1:L)//STR2
      END


      INTEGER FUNCTION LB ( STR1 )

C RETURNS THE SIZE IF STRING STR1 WITH BLANKS REMOVED
C Writen by P. Ordejon from Soler's paste.f

      CHARACTER*(*) STR1
      DO 10 L = LEN( STR1 ), 1, -1
         IF (STR1(L:L) .NE. ' ') GOTO 20
   10 CONTINUE
   20 LB = L
      END
程序grid2cube
隐式无
整数maxp,natmax,nskip
参数(最大值=12000000)
参数(natmax=1000)
整数ipt、isp、ix、iy、iz、i、ip、natoms、np、,
.                  网状物(3)、nspin、Ind、id(3)、iix、iiy、,
.                  iiz,ii,长度,磅
整数为(natmax),izat为(natmax)
字符sysname*70,fnamein*75,fnameout(2)*75,
.                  fnamexv*75,粘贴*74,任务*5,表格*12
双精度rho(maxp,2),rhot(maxp,2)
双精度电池(3,3),xat(natmax,3),cm(3),rt(3),
.                  delta(3),dr(3),残余
外贴,磅
c---------------------------------------------------------------------------
读(*,*)
读取(5,*)系统名
阅读(5,*)任务
读(5,*)rt(1),rt(2),rt(3)
阅读(5,*)nskip
读(5,*)F表格
fnamexv=粘贴(系统名,'.XV')
如果(任务等式'rho'),则
fnamein=粘贴(系统名'.RHO')
否则如果(任务等式“drho”),则
fnamein=粘贴(系统名'.DRHO')
否则如果(task.eq.'ldos'),则
fnamein=粘贴(系统名'.LDOS')
否则如果(任务等式“vt”),则
fnamein=粘贴(系统名,'.VT')
否则,如果(任务等式“vh”),则
fnamein=粘贴(系统名'.VH')
否则,如果(任务等式“bader”),则
fnamein=粘贴(系统名'.BADER')
其他的
写(6,*)“错误任务”
写入(6,*)‘接受值:rho、drho、ldos、vh、vt、bader’
写下(6,*)”(小写!!!!)
停止
恩迪夫
长度=磅(fnamein)
写(6,*)
写入(6,*)“从文件读取网格数据”,fnamein(1:长度)
c从三维网格读取函数--------------------------------------------
打开(单位=1,文件=fnamein,形式=fform,状态=old')
如果(形式等式“未格式化”),则
读(1)单元
否则,如果(格式等式“格式化”),则
do ix=1,3
读取(1,*)(单元格(iy,ix),iy=1,3)
结束循环
其他的
停止“错误:最后一个输入行必须格式化或未格式化”
恩迪夫
写(6,*)
写入(6,*)“单元向量”
写(6,*)
写入(6,*)单元(1,1),单元(2,1),单元(3,1)
写入(6,*)单元(1,2),单元(2,2),单元(3,2)
写入(6,*)单元(1,3)、单元(2,3)、单元(3,3)
剩余=0.0d0
do ix=1,3
do iy=ix+1,3
剩余=剩余+单元(ix,iy)**2
结束循环
结束循环
如果(残余燃气轮机1.0d-6),则
写(6,*)
写入(6,*)'错误:此程序只能处理正交单元格'
写(6,*)‘向量指向X、Y和Z方向’
停止
恩迪夫
如果(形式等式“未格式化”),则
读取(1)个网格,nspin
其他的
读取(1,*)网格,nspin
恩迪夫
写(6,*)
写(6,*)网格:',网格(1),'x',网格(2),'x',网格(3)
写(6,*)
写入(6,*)'nspin=',nspin
写(6,*)
do ix=1,3
dr(ix)=单元(ix,ix)/网格(ix)
结束循环
np=网格(1)*网格(2)*网格(3)
如果(np.gt.maxp)停止“grid2d:参数maxp太小”
C读(1)(rho(ip,isp),ip=1,np,isp=1,nspin)
是否isp=1,nspin
Ind=0
如果(形式等式“未格式化”),则
do iz=1,网格(3)
do iy=1,网格(2)
读取(1)(rho(Ind+ix,isp),ix=1,网格(1))
Ind=Ind+网格(1)
结束循环
结束循环
其他的
do iz=1,网格(3)
do iy=1,网格(2)
读取(1),(e15.6);(rho(Ind+ix,isp),ix=1,网格(1))
Ind=Ind+网格(1)
结束循环
结束循环
恩迪夫
结束循环
C翻译单元
do ix=1,3
增量(ix)=rt(ix)/dr(ix)
id(ix)=增量(ix)
增量(ix)=rt(ix)-id(ix)*dr(ix)
结束循环
do iz=1,网格(3)
do iy=1,网格(2)
do ix=1,网格(1)
iix=ix+id(1)
iiy=iy+id(2)
iiz=iz+id(3)
如果(iix.lt.1)iix=iix+网格(1)
如果(iiy.lt.1)iiy=iiy+网格(2)
如果(iiz.lt.1)iiz=iiz+网格(3)
如果(iix.gt.网格(1))iix=iix网格(1)
如果(iiy.gt.网格(2))iiy=iiy网格(2)
如果(iiz.gt.网格(3))iiz=iiz网格(3)
如果(iix.lt.1)停止“ix<0”
如果(iy.lt.1)停止“iy<0”
如果(iiz.lt.1)停止“iz<0”
如果(iix.gt.网格(1))停止“ix>单元”
如果(iiy.gt.网格(2))停止“iy>单元”
如果(iiz.gt.网格(3))停止“iz>单元”
i=ix+(iy-1)*网格(1)+(iz-1)*网格(1)*网格(2)
ii=iix+(iiy-1)*网格(1)+(iiz-1)*网格(1)*网格(2)
是否isp=1,nspin
rhot(ii,isp)=rho(i,isp)
结束循环
结束循环
结束循环
结束循环
关闭(1)
打开(单位=3,文件=fnamexv,状态为“旧”,格式为“已格式化”)
读(3,*)
读(3,*)
读(3,*)
读(3,*)纳托姆
i=1,纳托姆吗
读(3,*)是(i),izat(i),(xat(i,ix),ix=1,3)
结束循环
i=1,纳托姆吗
do ix=1,3
xat(i,ix)=xat(i,ix)+rt(ix)-delta(ix)
if(xat(i,ix).lt.0)xat(i,ix)=xat(i,ix)+单元(ix,ix)
if(xat(i,ix).gt.单元(ix,ix))
.        xat(i,ix)=xat(i,ix)-单元(ix,ix)
结束循环
结束循环
氯
read(5,*) rt(1),rt(2),rt(3)
read(file_unit_number) rt(1),rt(2),rt(3)