This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
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