Fortran文件结束意外错误

时间:2013-11-10 11:52:40

标签: windows fortran gfortran

我正在Fortran中运行一个程序,进行了大量的计算。基本上,它运行几个计算周期的次数与实验中的粒子一样多。

我已经能够成功测试并获得500 000,1 000 000和1 500 000颗粒的输出数据,但是只要我运行的程序包含更多输入粒子(例如,2 000 000或5 000 000) ,它崩溃接近结尾,说明它正在读取的文件中出现“文件结束”错误。读取所提到的文件是我正在执行的计算的必要条件,程序在每个循环中执行此操作。

关于我的是,该程序如何能够准确地完成所有计算1 500 000次,而不是2 000 000次? fortran代码是否有任何限制,使程序在执行大量计算时不稳定?

该程序适用于任何数量低于一定数量的粒子的事实表明一切都应该是有序的。在读取操作结束时重新扫描文件,依此类推。我该如何确定问题?

谢谢。

更新:好的,我正在附上代码,以便人们可以查看它,并希望有人能帮助我。这是第二个计算周期(第一个计算周期即使在计算巨大的粒子数量时也没有显示错误)。

    NSTAT = 0
NSTAP = int(NSTATN/10)
NDSTAT = NSTAP         ! Number STAT for visualisation

10 continue

NSTAT=NSTAT+1

x = 50.*sqrt(RNDM(IY))

y  = 0.
z = 1.E-20
ct = 1.                 ! initial state photon
st = sqrt(1.-ct*ct)
cf = 1.
sf = 0.
ves = 1.
E = YNT2001()

    Call FGAMMA()           !  -> calculation of penetration photons

!** zahler
      IF(NSTAT.GE.NDSTAT) GO TO 15
      GO TO 11
 15   PRINT*, NSTAT
      IAWA = NSTAT*100/NSTATN
      WRITE (TEXTW,103) IAWA
      PRINT*, TEXTW                ! print STAT
      NDSTAT=NDSTAT+NSTAP
 11   IF(NSTAT.GE.NSTATN) GO TO 20
      GO TO 10
!** zahler

20    call RESULT                  ! Results of Calculation

此部分选择随机启动能量并处理计算以及显示输出窗口(zahler)的进度。让我们进一步追踪计算。 FGAMMA:

SUBROUTINE FGAMMA()

      COMMON /SOS/   E,X,Y,Z,CT,ST,CF,SF,W
      COMMON /RMX/   Rmax,Rkmax
      COMMON/OTC/    GOTC,WOTC
      COMMON /ktt/   ktot,kcom,kpho,kpar
      COMMON /RES/   VS,VSI,TD
      COMMON /wpp/   Wp
      COMMON /w51/   w511,IP

      VS = 0.
      VSI = 0.

      ktot = 1;kcom = 1;kpho = 1;kpar = 1
      CALL SIG_phots(E,Stots,SSKs,SSFs,SSPs)

      if(ct > 0.) then
      dl = (Rmax - z)/ct
      else
      dl = - z/ct
      endif

      sss = dl*Stots
      WFZ = 1- exp(-sss)                   ! Wes wzaimodeystwiy

      RN = RNDM(IY)
      IF(RN <= 0.) RN=1.E-4
      DLPR = - LOG(1.-RN*WFZ)/Stots               ! probeg of photon

 1    Z=Z+DLPR*CT
      RR=DLPR*ST
      X=X+RR*CF                            ! new coordianats of photon
      Y=Y+RR*SF

100   continue
!*************** para ****************************
If(E > 1.022) then
Wp= SSPs/STOTs*W*WFZ        ! Probabilaty of paar creation
IP = 1
GP = GOTC
GOTC = 0.06

CALL BLAN()              !!!!!!!!!!!!!! WKLAD of effekt

GOTC = GP
endif
!************** compton **************************
      W= SSKs/STOTs*W*WFZ                        ! Probabilaty of Compton creation
IP = 0
      CALL BLPS()                            !!!!!!!!!!!!!!WKLAD Local Estimation
EP = E
      CALL COMKL3(Ep,E)
      IF(E.LT.GOTC) RETURN
                                            !NEXT COLLISIONS
      ktot = 1;kcom = 1;kpho = 1;kpar = 1
      CALL SIG_phots(E,Stots,SSKs,SSFs,SSPs)

      if(ct > 0.) then
      dl = (Rmax - z)/ct
      else
      dl = - z/ct
      endif
      sss = dl*Stots
      WFZ = 1- exp(-sss)                   ! Wes wzaimodeystwiy
      RN = RNDM(IY)
      IF(RN <= 0.) RN=1.E-4
      DLPR = - LOG(1.-RN*WFZ)/Stots

      Z=Z+DLPR*CT
      RR=DLPR*ST
      X=X+RR*CF
      Y=Y+RR*SF
      GO TO 100
END

正如我们所看到的,这里有更多的子程序。我也提供它们。

SUBROUTINE BLAN()

   COMMON /SOS/   E,X,Y,Z,CT,ST,CF,SF,VES
   COMMON /DET/   XDET,YDET,ZDET
   COMMON /RES/   VS,VSI,TD
   COMMON /OTC/   GOTC,WOTC
   COMMON /A511/  S511s
   COMMON /RMX/   Rmax,Rkmax
   COMMON /ktt/   ktot,kcom,kpho,kpar
   COMMON /wpp/   Wp
   COMMON /w51/   w511,IP

      TW=E
      XW=X
      YW=Y
      ZW=Z
      COSTW=CT         !Memory 1 photon
      SINTW=ST
      COSFW=CF
      SINFW=SF
      VESW=VES
      ves = wp

      XD=XDET-X
      YD=YDET-Y
      ZD=ZDET-Z
      DW = SQRT(XD*XD+YD*YD+ZD*ZD)
      DWW = 1./DW
      AL2=(XDET-X)*DWW
      AM2=(YDET-Y)*DWW
      AN2=(ZDET-Z)*DWW
      if(ZDET > 0.) then
      DWZ = (Rmax-Z)/AN2
      else
      DWZ = -Z/AN2
      endif
!+++++++++++++++++++++++++++++++++++++++++++  RANGE IN MATTER
      CT = AN2
      if(CT > 1. ) CT = 1.
      if(CT < -1.) CT = -1.
      ST = SQRT(1.-CT*CT)
 IF(ST.LE.0.) THEN
      CF = 1.
      SF = 0.
 ELSE
     if(AN2 > 1. ) AN2 = 1.
     if(AN2 < -1.) AN2 = -1.
     CF = AL2/SQRT(1.-AN2*AN2)
     if(CF < -1.) CF =-1.
     if(CF > 1. ) CF = 1.
     WSFK = SQRT(1.-CF*CF)
     SF = AM2/SQRT(1.-AN2*AN2)
     IF(SF > 0.)SF =  WSFK
     IF(SF < 0.)SF = -WSFK
 ENDIF

! FIRST

      RQ=DWZ*S511s
      w511 = EXP(-RQ)*2.
!+++++++++++++++++++++++++++++++++++++++++++  RANGE IN MATTER
      VS = EXP(-RQ)*0.15915*Wp
      VSI=VS*0.511
      TD=0.511

      CALL ANALYS

!!+++++++++++++++++++++++++++++++++++++++++++     first 0.511
      CT=1.-2.*RNDM(IY)
      ST=sqrt(1.-CT*CT)
      Cf=cfp(Sf)
      CSW=CT
      STW=ST
      CFW=CF
      SFW=SF
      E=0.511
      ves = wp
IP = 0.
CALL GAM_511()
!!+++++++++++++++++++++++++++++++++++++++++++    second 0.511
      E=0.511
      CT=-CSW
      ST=-STW
      CF=-CFW
      SF=-SFW
      X=XW
      Y=YW
      Z=ZW
      ves = wp
      IP = 0.
CALL GAM_511()

      E=TW
      X=XW
      Y=YW
      Z=ZW
      CT=COSTW                 !Memory 1 photon
      ST=SINTW
      CF=COSFW
      SF=SINFW
      VES=VESW
      kcom = 1
      kpar = 1
      ktot = 1
      RETURN
END
!************************************************************************
SUBROUTINE BLPS()

      COMMON /RES/  VS,VSI,TD
      COMMON /SOS/  T,X,Y,Z,COST,SINT,COSF,SINF,VES
      COMMON /DET/  XDET,YDET,ZDET
      COMMON /OTC/  GOTC,WOTC
      COMMON /ktt/  ktot,kcom,kpho,kpar
      COMMON /UG1/  SINP,COSP,SFK,CFK
      COMMON /w51/  w511,IP
      COMMON /wpp/  Wp
      COMMON /RMX/  Rmax,Rkmax
      parameter    (pi=3.14159,re=2.8179E-13,rek12=0.5*re*re,pire2=pi*re*re)
      parameter    (amc2=0.511,aimc2=1./amc2)


      COSTW=COST
      SINTW=SINT
      COSFW=COSF
      SINFW=SINF
      VESW=VES

      AL1=SINT*COSF
      AM1=SINT*SINF
      AN1=COST
      DW=SQRT((XDET-X)**2+(YDET-Y)**2+(ZDET-Z)**2)
      DWW = 1./DW
      AL2=(XDET-X)*DWW
      AM2=(YDET-Y)*DWW
      AN2=(ZDET-Z)*DWW
      COSK=AL1*AL2+AM1*AM2+AN1*AN2
      AL=T/0.511
      TD=T/(1.+AL*(1.-COSK))
      IF(TD.lt.GOTC) GO TO 12
      W=TD/T

      e0 = T*aimc2
      twoe01 = 2.*e0+1.
      Wl =alog(twoe01)
      compt1 = 2.*pire2*( (1.+e0)/(e0*e0)*( 2.*(1.+e0)/twoe01-&
               Wl/e0 )+Wl/(2.*e0)-(1.+3.*e0)/(twoe01*twoe01))
      dsdo1 = rek12*W*W*(W+1./W-1.+COSK*COSK)                   !Dsigma/Domega/sig_tot -> Compton
      ot_sec = dsdo1/compt1
!+++++++++++++++++++++++++++++++++++++++++++  RANGE IN MATTER
     COST = AN2
     if(COST > 1. ) COST = 1.
     if(COST < -1.) COST = -1.
     SINT = SQRT(1.-COST*COST)
     IF(SINT.LE.0.) THEN
     COSF = 1.
    SINF = 0.
     ELSE
     if(AN2 > 1. ) AN2 = 1.
     if(AN2 < -1.) AN2 = -1.

      COSF = AL2/SQRT(1.-AN2*AN2)
       if(COSF < -1.) COSF =-1.
       if(COSF > 1. ) COSF = 1.
      WSFK = SQRT(1.-COSF*COSF)
      SFK = AM2/SQRT(1.-AN2*AN2)
       IF(SFK > 0.)SINF =  WSFK
       IF(SFK < 0.)SINF = -WSFK
      ENDIF
      ktot = 1;kcom = 0;kpho =0; kpar = 0
! FIRST
      CALL SIG_phots(TD,SZs,TSK,TSF,TPP)
      if(ZDET > 0.) then
      DWZ = (Rmax-Z)/AN2
      else
      DWZ = -Z/AN2
      endif
      RQ=DWZ*SZs
!+++++++++++++++++++++++++++++++++++++++++++  RANGE IN MATTER
      IF(RQ.GE.35.)  then
      VS = 0.
      VSI = 0.
      GO TO 12
      endif
IP=0
if(IP==0) then
    VS=VES*ot_sec*EXP(-RQ)
    else
    VS=wp*ot_sec*EXP(-RQ)
endif

    IF(VS.LT.WOTC) then
    VS = 0.
    VSI = 0.
    GO TO 12
    endif
    VSI=VS*TD

      CALL ANALYS

12    COST=COSTW
      SINT=SINTW
      COSF=COSFW
      SINF=SINFW
      VES=VESW
      kcom = 1
      kpar = 1
      ktot = 1
END
!*******************************************************
SUBROUTINE GAM_511()

      COMMON /SOS/   E,X,Y,Z,CT,ST,CF,SF,W
      COMMON /RMX/   Rmax,Rkmax
      COMMON/OTC/    GOTC,WOTC
      COMMON /ktt/   ktot,kcom,kpho,kpar
      COMMON /w51/   w511,IP


      ktot = 1;kcom = 1;kpho = 1;kpar = 0
      CALL SIG_phots(E,Stots,SSKs,SSF,SSPs)

      RN = RNDM(IY)
      IF(RN <= 0.) RN=1.E-4
      RNl = - ALOG(RN)
      DLPR = RNl/Stots

      Z=Z+DLPR*CT
      IF(Z < 0.)      RETURN
      IF(Z > Rmax)    RETURN
      RR=DLPR*ST
      X=X+RR*CF
      Y=Y+RR*SF

100   continue

      RN=RNDM(IY)
      STET=1./STOTs
      IF(RN.LT.SSKs*STET)  GO TO 54       !COMPTON
!*************** photo ***************************
      RETURN
!*************************************************
!************** compton **************************
54    continue
IP = 1.
      CALL BLPS()                             !!!!!!!!!!!!!!WKLAD
EP =E
      CALL COMKL3(Ep,E)
      IF(E.LT.GOTC) RETURN
                                             !NEXT COLLISIONS
!      ktot = 1;kcom = 1;kpho = 1;kpar = 0
      CALL SIG_phots(E,Stots,SSKs,SSFs,SSPs)

      RN = RNDM(IY)
      IF(RN.LE.0.) RN=1.E-4
      RNl = - ALOG(RN)/Stots

      Z=Z+DLPR*CT
      if(z < 0.)      return
      IF(Z > Rmax)    RETURN
      RR=DLPR*ST
      X=X+RR*CF
      Y=Y+RR*SF
      GO TO 100
END

Subroutine SIG_phots(E_ph,Stot,Scom,Spho,Spai)
!******************************************************
! ktot ->  total   if = 1
! kcom ->  Compton if = 1
! kpho ->  Photo   if = 1
! kpar ->  Pair    if = 1
!******************************************************

COMMON /SBTgs/etabls(1000),SFLs(1000),SKKs(1000),SPPs(1000),SGTs(1000)
COMMON /SB/  dem,Emin,deb
COMMON /ktt/ ktot,kcom,kpho,kpar

IF(E_ph.LT.1.) THEN
     i = int((E_ph-Emin)*dem)+1
!print*,E_ph,Emin,dem
!read(*,*)
     DX=E_ph-etabls(I)
     AA=DX/(etabls(I+1)-etabls(I))
     Spai = 0.
     IF(ktot.eq.1)   Stot = SGTs(I)+(SGTs(I+1)-SGTs(I))*AA
     IF(kcom.eq.1)   Scom = SKKs(I)+(SKKs(I+1)-SKKs(I))*AA
     IF(kpho.eq.1)   Spho = SFLs(I)+(SFLs(I+1)-SFLs(I))*AA
     return
ENDIF

     i = int((E_ph-1.)*deb)+200
     DX=E_ph-etabls(I)
     AA=DX/(etabls(I+1)-etabls(I))

     IF(ktot.eq.1)   Stot = SGTs(I)+(SGTs(I+1)-SGTs(I))*AA
     IF(kcom.eq.1)   Scom = SKKs(I)+(SKKs(I+1)-SKKs(I))*AA
     IF(kpho.eq.1)   Spho = SFLs(I)+(SFLs(I+1)-SFLs(I))*AA
     Spai = 0.
     IF(E_ph.gT.1.2) THEN
     IF(kpar.eq.1)   Spai = SPPs(I)+(SPPs(I+1)-SPPs(I))*AA
     ENDIF
     return
END

 SUBROUTINE COMKL3(T,TR)
      COMMON /SOS/ E,X,Y,Z,CT,ST,CF,SF,WW
      COMMON /UG1/ SINTP,COSTP,SINFP,COSFP

      TAU = T*1.9569
      TAUS = TAU
      ab = 1./(1.+2.*TAU)
      A = TAU*ab
      AA = A+TAU
      FA = 1.+2.*TAU+ab
      FAK=FA+2.
      GT=TAU-A

6     CSIS=A+RNDM(IY)*GT
      R1=RNDM(IY)
      ETA=RNDM(IY)*FAK
      FIL=FA-2.*(CSIS-A)

      IF(ETA.GT.FIL) THEN
      CSI=AA-CSIS
      ETA=FAK-ETA
      ELSE
      CSI=CSIS
      ENDIF

       AB=1./TAU-1./CSI
       FKA=TAU/CSI+CSI/TAU+AB*(2.+AB)

      IF(ETA.GT.FKA)  THEN
      GO TO 6
      ELSE
      TR=CSI*0.511
      TAU=CSI
      ENDIF

      COSTP = 1.-1./TAU+1./TAUS
      S = 1.-COSTP*COSTP
      IF(S.lt.0.) S = 0.
      COSFP = CFP(SINFP)

      SINTP=SQRT(S)
      CALL UGOLKY(CT,ST,CF,SF,A1,A2,A3,A4,1)
END

SUBROUTINE COMKL(T)
      COMMON/UG1/  STDOP,CTDOP,SFDOP,CFDOP
      COMMON /SOS/ E,X,Y,Z,CT,ST,CF,SF,WW
      TAU=T*1.9569E0
      TS=T
      TAUS=TAU

1     CONTINUE
      ALFR=TAU*(1.+2.D0*RNDM(iy)*TAU)/(1.+2.*TAU)
      AN=1.0/TAU
      AR=1.0/ALFR
      FF=AN*ALFR+TAU*AR+(AN-AR)*(2.0+AN-AR)
      PRW=RNDM(iy)*(1.0+2.0*TAU+1.0/(1.0+2.0*TAU))
       IF(FF.GT.PRW) THEN
       T=ALFR*0.511
       TAU = ALFR
       ELSE
       GO TO 1
       ENDIF

      COSTGP=1.0-(TAUS-TAU)/(TAU*TAUS)
      S=1.0-COSTGP*COSTGP
      if(s.lt.0.0)S=0.0

        CALL azim(CFDOP,SFDOP)
        CTDOP= COSTGP
        STDOP= SQRT(S)
        L=1
        CALL UGOLKY(CT,ST,CF,SF,A1,A2,A3,A4,L)

END

SUBROUTINE UGOLKY(CTE,STE,CFE,SFE,COST,SINT,COSF,SINF,L)

      COMMON/UG1/  ST,CT,SF,CF

      A1=ST*CF
      COST=CTE*CT-STE*A1
      IF(COST.GT.1.)COST=1.
 if(SQRT(1.-COST*COST)<0.) then
 print*,COST,COST*COST
 read(*,*)
 endif
      SINT=SQRT(1.-COST*COST)
      IF(abs(SINT).GT.1.E-5) GO TO 2
1     SINF=0.
      COSF=1.
      GO TO 3
2     A2=STE*CT+CTE*A1
      A1=ST*SF
      COSF=(A2*CFE-A1*SFE)/SINT
      SINF=(A2*SFE+A1*CFE)/SINT
3     GO TO (4,5),L
4     STE=SINT
      CTE=COST
      SFE=SINF
      CFE=COSF
5     RETURN
END

那么......是否足以确定计算大量粒子的误差?

1 个答案:

答案 0 :(得分:0)

问题已解决,它位于用于调试目的的程序体中某处的read(,)语句中。