This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: error: in fold_convert HELP


Jerry,
Thanks for the reply. I am unfortunately quite new to fortran myself,
and am worried i might introduce some new problem if i start cutting
down sprk.f now. I think the best i can do right now is to include the
routine where the error seems to come from. The sprk.f:530: internal
...      line 530 is actually line 255 in the cut down file.

Thanking you in anticipation,

Kevin



Jerry DeLisle wrote:

> KV wrote:
>
>> <mailto:fortran@gcc.gnu.org>Dear all,
>>
>> I am trying to compile FDS4 (fire dynamics simulator) with gfortran. I
>> have installed gcc 4.0 CVS as of 09 May 2005.
>>
>> I get the following error:
>> make
>> /home/veragoo/bin.cvs/usr/local/bin/gfortran -O2 -c sprk.f
>> sprk.f: In function ‘insert_droplets’:
>> sprk.f:530: internal compiler error: in fold_convert, at
>> fold-const.c:1952
>> Please submit a full bug report,
>> with preprocessed source if appropriate.
>> See <URL:http://gcc.gnu.org/bugs.html> for instructions.
>> make: *** [sprk.o] Error 1
>
>
> Can you submit a reduced version of the code in sprk.f so it is
> possible to see what the bug may be?
>
> Jerry
>









      SUBROUTINE INSERT_DROPLETS(T,NM)
C
C Insert sprinkler particles into the domain every DTSPAR seconds.
C
      REAL(EB) T,PHI_RN,RN,FLOW_RATE,DM_ADJUSTED,
     .         THETA_RN,SPHI,CPHI,MASS_SUM,
     .         STHETA,CTHETA,PWT0,TT,PP,
     .         DROPLET_SPEED,XI,YJ,ZK,SHIFT1,SHIFT2,XTMP,YTMP,ZTMP,VLEN,
     .         TRIGT1,TRIGT2,LL,UL,BIN_SIZE
      INTEGER I,J,KS,II,JJ,KK,IND,ITHETA,IPHI,IC,IL,IU,STRATUM,IPC,
     .        DROP_SUM
      INTEGER, INTENT(IN) :: NM
      TYPE (SPRINKLER_TYPE), POINTER :: S
      TYPE (SPRINKLER_HEAD_TYPE), POINTER :: SH
C
      CALL UNPACK_VAR(NM)
C
      TNOW=SECOND()
C
      SPRINKLER_INSERT_LOOP: DO KS=1,NSPR
C
      SH => SPRINKLER_HEAD(KS)
      IF (SH%MESH.NE.NM)    CYCLE SPRINKLER_INSERT_LOOP
      IF (SH%ACT_CODE.LE.0) CYCLE SPRINKLER_INSERT_LOOP
      IF (SH%T.GT.T)        CYCLE SPRINKLER_INSERT_LOOP
C
      IPC = SH%DROPLET_CLASS
      LP=>LAGRANGIAN(IPC)
      IND = SH%INDEX
      S => SPRINKLER(IND)
C
C Compute sprinkler droplet Cumulative Distribution Function (CDF_DROP)
C
      IF (S%OPERATING_PRESSURE.GT.0.) THEN
C
      IF (PRESSURE.LT.0.) THEN
         PIPE_PRESSURE = S%OPERATING_PRESSURE
         ELSE
         PIPE_PRESSURE = PRESSURE
         ENDIF
C
      S%P_FACTOR = SQRT(PIPE_PRESSURE/S%OPERATING_PRESSURE)
C
      PHI_LOOP:   DO IPHI=1,S%NPHI(3)
      THETA_LOOP: DO ITHETA=1,S%NTHETA(3)
      DM_ADJUSTED = S%DROPLET_DIAMETER(ITHETA,IPHI)*
     .   (S%OPERATING_PRESSURE/PIPE_PRESSURE)**ONTH
      CALL DROPLET_SIZE_DISTRIBUTION(DM_ADJUSTED,S%RDROP(:,ITHETA,IPHI),
     .     S%CDF_DROP(:,ITHETA,IPHI),NDC,S%GAMMA,S%SIGMA)
      BIN_SIZE = S%RDROP(NDC,ITHETA,IPHI)/REAL(NSTRATA,EB)
      STRATIFY2: DO I=1,NSTRATA
         LL = (I-1)*BIN_SIZE
         UL =  I   *BIN_SIZE
         LL_LOOP2: DO J=1,NDC
            IF (S%RDROP(J,ITHETA,IPHI).GT.LL) THEN
               IL = J-1 ; S%IL_DROP(I,ITHETA,IPHI) = J-1
               EXIT LL_LOOP2
               ENDIF
            ENDDO LL_LOOP2
         UL_LOOP2: DO J=NDC,1,-1
            IF (S%RDROP(J,ITHETA,IPHI).LE.UL) THEN
               IU = J ; S%IU_DROP(I,ITHETA,IPHI) = J
               EXIT UL_LOOP2
               ENDIF
            ENDDO UL_LOOP2
C
         S%W_DROP(I,ITHETA,IPHI) = S%CDF_DROP(IU,ITHETA,IPHI) -
     .                             S%CDF_DROP(IL,ITHETA,IPHI)
      ENDDO STRATIFY2
      ENDDO THETA_LOOP
      ENDDO PHI_LOOP
C
      S%OPERATING_PRESSURE = -1.
C
      ENDIF
C
C Direction initialization stuff
C
      TRIGT1 = ACOS(-SH%DIR(3))
      IF (SH%DIR(2).EQ.0.) THEN
      TRIGT2 = ACOS(1.)
      ELSE
      TRIGT2 = ACOS(ABS(SH%DIR(1))/
     .             SQRT(SH%DIR(1)**2+SH%DIR(2)**2))
      ENDIF
C
C Droplet insertion loop
C
      MASS_SUM = 0.
      DROP_SUM = 0
C
      DROPLET_INSERT_LOOP: DO I=1,LP%N_INSERT
C
      IF (NLP+1.GT.MAXIMUM_DROPLETS) EXIT DROPLET_INSERT_LOOP
C
      NLP = NLP+1
      IF (NLP.GT.NLPDIM) THEN
         CALL RE_ALLOCATE_DROPLETS(1,NM,0)
         DROPLET=>MESH(NM)%DROPLET
         ENDIF
      DR=>DROPLET(NLP)
C
C Set droplet temperature and phase. Phase indicates
C whether the droplet is in the air (0) or stuck on an object (not 0).
C
      DR%TMP = S%WATER_TEMPERATURE
      DR%T   = T 
      DR%IOR = 0      
      DR%A_X    = 0.
      DR%A_Y    = 0.
      DR%A_Z    = 0.
      DR%CLASS = IPC
      IF (MOD(NLP,LP%SAMPLING).EQ.0) THEN
         DR%SHOW = .TRUE.    
      ELSE
         DR%SHOW = .FALSE.
      ENDIF
C
C Randomly choose theta and phi
C
      CHOOSE_COORDS: DO
C
      CALL RANDOM_NUMBER(RN)
      II = S%I_TABLE(NINT(RN*N_TE))
      JJ = S%J_TABLE(NINT(RN*N_TE))
      CALL RANDOM_NUMBER(RN)
      THETA_RN = S%THETA(II-1) + RN*S%DTHETA
      CALL RANDOM_NUMBER(RN)
      PHI_RN   = S%PHI(JJ-1)   + RN*S%DPHI
C
C  Adjust for rotation of head by rotating about z-axis
C
      PHI_RN = PHI_RN + SH%DIR(4)
C
C  Adjust for tilt of sprinkler pipe
C
      SPHI   = SIN(PHI_RN)
      CPHI   = COS(PHI_RN)
      STHETA = SIN(THETA_RN)
      CTHETA = COS(THETA_RN)
      XTMP   = STHETA*CPHI
      YTMP   = STHETA*SPHI
      ZTMP   = -CTHETA
C
C First rotate about y-axis away from x-axis
C
      VLEN   = SQRT(XTMP**2+ZTMP**2)
      SHIFT1 = ACOS(ABS(XTMP)/VLEN)
      SELECT CASE(INT(SIGN(1._EB,ZTMP)))
      CASE (-1); IF (XTMP.LT.0) SHIFT1 = PI-SHIFT1
      CASE ( 1)
      SELECT CASE(INT(SIGN(1._EB,XTMP)))
      CASE (-1) ; SHIFT1 = SHIFT1+PI
      CASE ( 1) ; SHIFT1 = TWOPI - SHIFT1
      END SELECT
      END SELECT
C
      SHIFT1 = SHIFT1 + TRIGT1
      XTMP = VLEN * COS(SHIFT1)
      ZTMP = -VLEN * SIN(SHIFT1)
C
C Second rotate about z-axis away from x-axis
C
      VLEN   = SQRT(XTMP**2+YTMP**2)
      SHIFT1 = ACOS(ABS(XTMP)/VLEN)
      SELECT CASE(INT(SIGN(1._EB,YTMP)))
      CASE ( 1); IF (XTMP.LT.0) SHIFT1 = PI-SHIFT1
      CASE (-1)
      SELECT CASE(INT(SIGN(1._EB,XTMP)))
      CASE (-1) ; SHIFT1 = SHIFT1+PI
      CASE ( 1) ; SHIFT1 = TWOPI - SHIFT1
      END SELECT
      END SELECT
C
      SHIFT2 = TRIGT2
      SELECT CASE(INT(SIGN(1._EB,SH%DIR(1))))
      CASE (-1); IF (SH%DIR(2).GT.0) SHIFT2 = TWOPI - SHIFT2
      CASE ( 1)
      SELECT CASE(INT(SIGN(1._EB,SH%DIR(2))))
      CASE (-1) ; SHIFT2 = PI-SHIFT2
      CASE ( 1) ; SHIFT2 = SHIFT2+ PI
      END SELECT
      END SELECT
      SHIFT1=SHIFT1+SHIFT2
C
      XTMP = VLEN * COS(SHIFT1)
      YTMP = VLEN * SIN(SHIFT1)
C
      TT = THETA_RN*S%NTHETA(1)/PI
      PP = (PHI_RN-SH%DIR(4))*S%NPHI(1)/TWOPI
      JJ = INT(PP)+1
      II = INT(TT)+1
      DROPLET_SPEED = S%P_FACTOR*S%DROPLET_VELOCITY(II,JJ)
C
C Compute initial position and velocity of droplets
C
      DR%U = DROPLET_SPEED*XTMP
      DR%V = DROPLET_SPEED*YTMP
      DR%W = DROPLET_SPEED*ZTMP
      DR%X = SH%X + S%OFFSET*XTMP
      DR%Y = SH%Y + S%OFFSET*YTMP
      DR%Z = SH%Z + S%OFFSET*ZTMP
C
      IF (TWO_D) THEN
         DR%V = 0.
         DR%Y = SH%Y
         ENDIF
C
      IF (DR%X.LE.XS .OR. DR%X.GE.XF) CYCLE CHOOSE_COORDS
      IF (DR%Y.LE.YS .OR. DR%Y.GE.YF) CYCLE CHOOSE_COORDS
      IF (DR%Z.LE.ZS .OR. DR%Z.GE.ZF) CYCLE CHOOSE_COORDS
C
      XI = CELLSI(FLOOR((DR%X-XS)*RDXINT))
      YJ = CELLSJ(FLOOR((DR%Y-YS)*RDYINT))
      ZK = CELLSK(FLOOR((DR%Z-ZS)*RDZINT))
      II = FLOOR(XI+1.)
      JJ = FLOOR(YJ+1.)
      KK = FLOOR(ZK+1.)
      IC = ICA(II,JJ,KK)
C
      IF (.NOT.SOLID(IC)) EXIT CHOOSE_COORDS
C
      ENDDO CHOOSE_COORDS
C
C Randomly choose droplet size according to Cumulative Distribution
C Function (CDF)
C
      TT = THETA_RN*S%NTHETA(3)/PI
      PP = (PHI_RN-SH%DIR(4))*S%NPHI(3)/TWOPI
      JJ = INT(PP)+1
      II = INT(TT)+1
      STRATUM = MOD(NLP,NSTRATA) + 1
      IL = S%IL_DROP(STRATUM,II,JJ)
      IU = S%IU_DROP(STRATUM,II,JJ)
      CALL RANDOM_CHOICE(S%CDF_DROP(IL:IU,II,JJ),
     .                   S%RDROP(IL:IU,II,JJ),
     .                   IU-IL,DR%R)
      DR%PWT = S%W_DROP(STRATUM,II,JJ)
C
C Sum up mass of water being introduced
C
      MASS_SUM = MASS_SUM + DR%PWT*LP%FTPR*DR%R**3
      DROP_SUM = DROP_SUM + 1
C
      ENDDO DROPLET_INSERT_LOOP
C
C Compute weighting factor for the droplets just inserted
C
      IF (DROP_SUM.GT.0) THEN
      FLOW_RATE = S%K_FACTOR*SQRT(PIPE_PRESSURE)*(LP%DENSITY/1000.)/60.
      PWT0 = MAX(T-SH%T,0.01_EB)
      PWT0 = PWT0/MASS_SUM
C Kevin: This is where the error seems to occur.
      PWT0 = FLOW_RATE*PWT0
      DROPLET(NLP-DROP_SUM+1:NLP)%PWT = 
     .DROPLET(NLP-DROP_SUM+1:NLP)%PWT*PWT0
      ENDIF
C
      SH%T = T    
C
      ENDDO SPRINKLER_INSERT_LOOP
C
C Update the sprinkler droplet insert clock
C
      SPINCLK(NM) = SPINCLK(NM) + DTSPAR
C
      TUSED(8,NM)=TUSED(8,NM)+SECOND()-TNOW
      END SUBROUTINE INSERT_DROPLETS
C

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]