Professional Documents
Culture Documents
E1godf F
E1godf F
time-dependent one dimensional Euler * C equations for an ideal gas by Godunov methods with * C several approximate Rieman solvers of the * C approximate flux type, namely * * * C INTFLX = 1: The Roe Riemann solver * C INTFLX = 2: The HLLC Riemann solver * C INTFLX = 3: The HLL Riemann solver * C INTFLX = 4: The Rusanov "Riemann" solver * * * C Input file: e1godf.ini (initial data) * C Output file: e1godf.out (numerical results) * * * C Revision: 31st May 1999 * * * C Programer: E. F. Toro * * * C Theory is found in Chaps. 4, 6, 9, 10 and 11 of Reference 1 * C and in original references therein * * * C 1. Toro, E. F., "Riemann Solvers and Numerical * C Methods for Fluid Dynamics" * C Springer-Verlag, * C Second Edition, 1999 * * * C This program is part of * * * C NUMERICA * C A Library of Source Codes for Teaching, * C Research and Applications, * C by E. F. Toro * C Published by NUMERITEK LTD, * C Website: www.numeritek.com * * * *----------------------------------------------------------------------* * C Driver program * IMPLICIT NONE * C Declaration of variables * INTEGER INTFLX, CELLS, N, NFREQU, NTMAXI * REAL CFLCOE, PSCALE, TIME, TIMDIF, TIMEOU, TIMTOL * COMMON /DRIVER/ CFLCOE, INTFLX, CELLS, NFREQU, NTMAXI, TIMEOU, & PSCALE * DATA TIME, TIMTOL /0.0, 1.0E-06/ * C Parameters of problem are read in from file "e1godf.ini" *
CALL READER * C * * C * Initial conditions are set up CALL INITIA(CELLS) Time marching procedure WRITE(6,*)'---------------------------------------------' WRITE(6,*)' Time step N TIME TIMEOU' WRITE(6,*)'---------------------------------------------' * DO 10 N = 1, NTMAXI * C * * C * * C C * Boundary conditions are set CALL BCONDI(CELLS) Courant-Friedrichs-Lewy (CFL) condition imposed CALL CFLCON(CFLCOE, CELLS, N, TIME, TIMEOU) Intercell numerical fluxes are computed. Three choices are available IF(INTFLX.EQ.1)CALL IF(INTFLX.EQ.2)CALL IF(INTFLX.EQ.3)CALL IF(INTFLX.EQ.4)CALL * C * * IF(MOD(N,NFREQU).EQ.0)WRITE(6,20)N, TIME, TIMEOU * C * * IF(TIMDIF.LE.TIMTOL)THEN * C * * WRITE(6,*)'---------------------------------------------' WRITE(6,*)' Number of time steps = ',N WRITE(6,*)'---------------------------------------------' * GOTO 30 ENDIF * 10 * 20 30 * END * FORMAT(I12,6X,2(F12.7, 4X)) CONTINUE CONTINUE Solution is written to "e1godf.out' at specified time CALL OUTPUT(CELLS, PSCALE) Check output time TIMDIF = ABS(TIME - TIMEOU) ROE(CELLS) HLLC(CELLS) HLL(CELLS) RUSANOV(CELLS)
* *----------------------------------------------------------------------* * SUBROUTINE READER C C Purpose: to read initial parameters of the problem * C Input variables * C DOMLEN : Domain length C DIAPH1 : Position of diaphragm 1 C CELLS : Number of computing cells C GAMMA : Ratio of specific heats C TIMEOU : Output time C DLINIT : Initial density on left section of tube C ULINIT : Initial velocity on left section of tube C PLINIT : Initial pressure on left section of tube C DMINIT : Initial density on middle section of tube C UMINIT : Initial velocity on middle section of tube C PMINIT : Initial pressure on middle section of tube C DRINIT : Initial density on right section of tube C URINIT : Initial velocity on right section of tube C PRINIT : Initial pressure on right section of tube C DIAPH2 : Position of diaphragm 2 C CFLCOE : Courant number coefficient C IBCLEF : Type of left boundary conditions C IBCRIG : Type of right boundary conditions C NFREQU : Output frequency to screen C NTMAXI : Maximum number of time steps C PSCALE : Pressure scaling factor C INTFLX : Choice of intercell flux * IMPLICIT NONE * C Declaration of variables * INTEGER INTFLX , IBCLEF, IBCRIG, CELLS, NFREQU, NTMAXI * REAL CFLCOE, DOMLEN, DIAPH1, DIAPH2, PSCALE, TIMEOU, & DLINIT, ULINIT, PLINIT, DMINIT, UMINIT, PMINIT, DRINIT, & URINIT, PRINIT, & GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 * COMMON /BOUNDA/ IBCLEF, IBCRIG COMMON /DOMAIN/ DOMLEN, DIAPH1, DIAPH2 COMMON /DRIVER/ CFLCOE, INTFLX, CELLS, NFREQU, NTMAXI, TIMEOU, & PSCALE COMMON /INISTA/ DLINIT, ULINIT, PLINIT, DMINIT, UMINIT, PMINIT, & DRINIT, URINIT, PRINIT COMMON /GAMMAS/ GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 * OPEN(UNIT = 1, FILE = 'e1godf.ini', STATUS = 'UNKNOWN') * READ(1,*)DOMLEN READ(1,*)DIAPH1 READ(1,*)CELLS READ(1,*)GAMMA READ(1,*)TIMEOU READ(1,*)DLINIT READ(1,*)ULINIT
READ(1,*)PLINIT READ(1,*)DMINIT READ(1,*)UMINIT READ(1,*)PMINIT READ(1,*)DRINIT READ(1,*)URINIT READ(1,*)PRINIT READ(1,*)DIAPH2 READ(1,*)CFLCOE READ(1,*)IBCLEF READ(1,*)IBCRIG READ(1,*)NFREQU READ(1,*)NTMAXI READ(1,*)PSCALE READ(1,*)INTFLX * CLOSE(1) * C * Input data is echoed to screen WRITE(6,*) WRITE(6,*)'Input data echoed to screen' WRITE(6,*) WRITE(6,*)'DOMLEN = ',DOMLEN WRITE(6,*)'DIAPH1 = ',DIAPH1 WRITE(6,*)'CELLS = ',CELLS WRITE(6,*)'GAMMA = ',GAMMA WRITE(6,*)'TIMEOU = ',TIMEOU WRITE(6,*)'DLINIT = ',DLINIT WRITE(6,*)'ULINIT = ',ULINIT WRITE(6,*)'PLINIT = ',PLINIT WRITE(6,*)'DMINIT = ',DMINIT WRITE(6,*)'UMINIT = ',UMINIT WRITE(6,*)'PMINIT = ',PMINIT WRITE(6,*)'DRINIT = ',DRINIT WRITE(6,*)'URINIT = ',URINIT WRITE(6,*)'PRINIT = ',PRINIT WRITE(6,*)'DIAPH2 = ',DIAPH2 WRITE(6,*)'CFLCOE = ',CFLCOE WRITE(6,*)'IBCLEF = ',IBCLEF WRITE(6,*)'IBCRIG = ',IBCRIG WRITE(6,*)'NFREQU = ',NFREQU WRITE(6,*)'NTMAXI = ',NTMAXI WRITE(6,*)'PSCALE = ',PSCALE WRITE(6,*)'INTFLX = ',INTFLX * END * * *----------------------------------------------------------------------* * SUBROUTINE INITIA(CELLS) * C Purpose: to set initial conditions * IMPLICIT NONE * C Declaration of variables * INTEGER I, CELLS, IDIM
DOMLEN, DIAPH1, DIAPH2, DT, DX, D, U, P, CS, DLINIT, ULINIT, PLINIT, DMINIT, UMINIT, PMINIT, DRINIT, URINIT, PRINIT, XPOS, GAMMA, G1, G2, G3, G4, G5, G6, G7, G8
PARAMETER (IDIM = 3000) DIMENSION D(-1:IDIM+2),U(-1:IDIM+2),P(-1:IDIM+2),CS(3,-1:IDIM+2) * COMMON /DOMAIN/ DOMLEN, DIAPH1, DIAPH2 COMMON /INISTA/ DLINIT, ULINIT, PLINIT, DMINIT, UMINIT, PMINIT, & DRINIT, URINIT, PRINIT COMMON /GAMMAS/ GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 COMMON /PRIMIT/ D, U, P COMMON /CONSER/ CS COMMON /MESHPA/ DT, DX * C * Compute gamma related constants G1 G2 G3 G4 G5 G6 G7 G8 * C * * C C * * XPOS = (REAL(I) - 0.5)*DX * IF(XPOS.LE.DIAPH1)THEN * C * Set initial values in left section of domaim D(I) = DLINIT U(I) = ULINIT P(I) = PLINIT ENDIF * IF(XPOS.GT.DIAPH1.AND.XPOS.LE.DIAPH2)THEN * C * Set initial values in middle section of domaim D(I) = DMINIT U(I) = UMINIT P(I) = PMINIT ENDIF * IF(XPOS.GT.DIAPH2)THEN * C Set initial values in right section of domaim = = = = = = = = (GAMMA - 1.0)/(2.0*GAMMA) (GAMMA + 1.0)/(2.0*GAMMA) 2.0*GAMMA/(GAMMA - 1.0) 2.0/(GAMMA - 1.0) 2.0/(GAMMA + 1.0) (GAMMA - 1.0)/(GAMMA + 1.0) (GAMMA - 1.0)/2.0 GAMMA - 1.0
Calculate mesh size DX DX = DOMLEN/REAL(CELLS) Set initial data in tube of length DOMLEN, which is divided into 3 sections by diaphragms at positions DIAPH1 and DIAPH2 DO 10 I = 1, CELLS
* D(I) = DRINIT U(I) = URINIT P(I) = PRINIT ENDIF * C * Compute conserved variables CS(1,I) = D(I) CS(2,I) = D(I)*U(I) CS(3,I) = 0.5*CS(2,I)*U(I) + P(I)/G8 * 10 * END * * *----------------------------------------------------------------------* * SUBROUTINE BCONDI(CELLS) * C Purpose: to set boundary conditions * IMPLICIT NONE * C Declaration of variables * INTEGER IBCLEF, IBCRIG, CELLS, IDIM * REAL D, U, P * PARAMETER (IDIM = 3000) * DIMENSION D(-1:IDIM+2), U(-1:IDIM+2), P(-1:IDIM+2) * COMMON /PRIMIT/ D, U, P COMMON /BOUNDA/ IBCLEF, IBCRIG * IF(IBCLEF.EQ.0)THEN * C Transmissive boundary conditions on the left * D(0) = D(1) U(0) = U(1) P(0) = P(1) * ELSE * C Reflective boundary conditions on the left * D(0) = D(1) U(0) = -U(1) P(0) = P(1) * ENDIF * IF(IBCRIG.EQ.0)THEN * C Transmissive boundary conditions on the right * CONTINUE
D(CELLS + 1) = D(CELLS) U(CELLS + 1) = U(CELLS) P(CELLS + 1) = P(CELLS) * ELSE * C * Reflective boundary conditions on the right D(CELLS + 1) = D(CELLS) U(CELLS + 1) = -U(CELLS) P(CELLS + 1) = P(CELLS) * ENDIF * END * * *----------------------------------------------------------------------* * SUBROUTINE CFLCON(CFLCOE, CELLS, N, TIME, TIMEOU) * C Purpose: to apply the CFL condition to find a stable time C step size DT * IMPLICIT NONE * C Declaration of variables * INTEGER I, CELLS, IDIM, N * REAL C, CFLCOE, D, DT, DX, P, SMAX, SBEXTD, TIME, & TIMEOU, U, & GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 * PARAMETER (IDIM = 3000) * DIMENSION D(-1:IDIM+2), U(-1:IDIM+2), P(-1:IDIM+2), C(-1:IDIM+2) * COMMON /GAMMAS/ GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 COMMON /PRIMIT/ D, U, P COMMON /SOUNDS/ C COMMON /MESHPA/ DT, DX * SMAX = 0.0 * C Find maximum velocity SMAX present in data * DO 10 I = 0, CELLS + 1 * C Compute speed of sound * C(I) = SQRT(GAMMA*P(I)/D(I)) * SBEXTD = ABS(U(I)) + C(I) IF(SBEXTD.GT.SMAX)SMAX = SBEXTD 10 CONTINUE * C Compute time step DT, for early times reduce its size * DT = CFLCOE*DX/SMAX
* C C * * C * * C * * C * *
For early times DT is reduced to compensate for approximate calculation of SMAX IF(N.LE.5)DT = 0.2*DT Check size of DT to avoid exceeding output time IF((TIME + DT).GT.TIMEOU)THEN Recompute DT DT = TIMEOU - TIME ENDIF Find current time TIME = TIME + DT END
* * *----------------------------------------------------------------------* * SUBROUTINE OUTPUT(CELLS, PSCALE) * C Purpose: to output the solution at a specified time TIMEOU * IMPLICIT NONE * C Declaration of variables * INTEGER I, CELLS, IDIM * REAL D, DT, DX, ENERGI, P, PSCALE, U, XPOS, & GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 * PARAMETER (IDIM = 3000) * DIMENSION D(-1:IDIM+2),U(-1:IDIM+2),P(-1:IDIM+2) * COMMON /GAMMAS/ GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 COMMON /PRIMIT/ D, U, P COMMON /MESHPA/ DT, DX * OPEN(UNIT = 1, FILE = 'e1godf.out', STATUS = 'UNKNOWN') * DO 10 I = 1, CELLS XPOS = (REAL(I) - 0.5)*DX ENERGI = P(I)/D(I)/G8/PSCALE WRITE(1,20)XPOS, D(I), U(I), P(I)/PSCALE, ENERGI 10 CONTINUE * CLOSE(1) * 20 FORMAT(5(F14.6,2X)) * END * *
*----------------------------------------------------------------------* * SUBROUTINE UPDATE(CELLS) * C Purpose: to update the solution according to the conservative C formula and compute physical variables * IMPLICIT NONE * C Declaration of variables * INTEGER I, K, CELLS, IDIM * REAL DT, DX, DTODX, D, U, P, CS, FI, & GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 * PARAMETER (IDIM = 3000) * DIMENSION D(-1:IDIM+2), U(-1:IDIM+2), P(-1:IDIM+2), & CS(3,-1:IDIM+2), FI(3,-1:IDIM+2) * COMMON /GAMMAS/ GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 COMMON /PRIMIT/ D, U, P COMMON /CONSER/ CS COMMON /FLUXES/ FI COMMON /MESHPA/ DT, DX * DTODX = DT/DX * DO 10 I = 1, CELLS * DO 20 K = 1, 3 CS(K,I) = CS(K,I) + DTODX*(FI(K,I-1) - FI(K,I)) 20 CONTINUE * 10 CONTINUE * C Compute physical variables * DO 30 I = 1, CELLS D(I) = CS(1,I) U(I) = CS(2,I)/D(I) P(I) = G8*(CS(3,I) - 0.5*CS(2,I)*U(I)) 30 CONTINUE * END * * *----------------------------------------------------------------------* * SUBROUTINE ROE(CELLS) * C Purpose: to compute an intercell Godunov flux using C the ROE approximate Riemann solver with entropy C fix according to Harten and Hyman. See Chap. 11 C of Ref. 1 and original references therein * IMPLICIT NONE * C Declaration of variables
* INTEGER I, CELLS, IDIM, K * REAL & & & & * PARAMETER (IDIM = 3000) * & & * COMMON COMMON COMMON COMMON COMMON COMMON COMMON * DATA TOLSON /0.1/ * C C * C C * * IF(I.LT.1.OR.I.GT.CELLS)THEN CS(1,I) = D(I) CS(2,I) = D(I)*U(I) CS(3,I) = 0.5* D(I)*U(I)*U(I) + P(I)/G8 ENDIF * FD(1,I) = CS(2,I) FD(2,I) = CS(2,I)*U(I) + P(I) FD(3,I) = U(I)*(CS(3,I) + P(I)) * 10 * C * * DL UL PL CL EL HL * DR UR PR CR = = = = D(I U(I P(I C(I + + + + 1) 1) 1) 1) = = = = = = D(I) U(I) P(I) C(I) CS(3, I) (EL + PL)/DL CONTINUE Solve Riemann problem (i,i+1) and store quantities in I DO 20 I = 0, CELLS Parameter TOLSON determines application of entropy fix. For TOLSON non-positive, no entropy fix is applied. Compute fluxes on data and conserved variables in fictitious cells DO 10 I = 0, CELLS + 1 /STATES/ /PRIMIT/ /SOUNDS/ /CONSER/ /FLUXES/ /MESHPA/ /GAMMAS/ DL, UL, PL, CL, DR, UR, PR, CR D, U, P C CS FI DT, DX GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 DIMENSION D(-1:IDIM+2),U(-1:IDIM+2),P(-1:IDIM+2),C(-1:IDIM+2), CS(3,-1:IDIM+2),FD(3,-1:IDIM+2),FI(3,-1:IDIM+2), REVEC(3) AK, C, CFLM, CL, CM, CMM, CR, CS, D, DL, DM, DP, DR, DT, DU, DX, EL, ER, EVAL, FD, FI, HL, HM, HR, P, PL, PR, REVEC, RM, SIG, SML, SMR, SNEW, TOLSON, U, UL, UM, UMM, UR, GAMMA, G1, G2, G3, G4, G5, G6, G7, G8
ER = CS(3, I + 1) HR = (ER + PR)/DR * C * * DM UM HM CM * C * * C * * C * = = = = RM*DL (UL + RM*UR)/(1.0 + RM) (HL + RM*HR)/(1.0 + RM) SQRT(G8*(HM - 0.5*UM*UM)) Compute Roe averages RM = SQRT(DR/DL)
Compute increments DU = UR - UL DP = PR - PL Identify wave pattern IF(UM.GT.0.0)THEN Contact wave goes to the right EVAL = UM - CM SNEW = EVAL AK = (DP - DM*CM*DU)/(2.0*CM*CM)
* C * * C * * C * C C * *
Define Courant number CFLM CFLM = EVAL*DT/DX Test for left sonic rarefaction IF(ABS(CFLM).LT.TOLSON)THEN Small left wave speed is identified Use Roe's Riemann solver to find particle speed UMM and sound speed CMM in start left state SIG = 1.0 CALL STARVALS(SIG, DL, UL, EL, AK, UM, CM, HM, UMM, CMM)
* SML = UL - CL SMR = UMM - CMM * IF(SML.LT.0.0.AND.SMR.GT.0.0)THEN * C * * ENDIF ENDIF * C * * Compute one-sided intercell flux from left side IF(SNEW.LT.0.0)THEN Left wave is a sonic rarefaction, speed is modified SNEW = SML*(SMR - EVAL)/(SMR - SML)
C *
* C * 30 * C * 40 * * ELSE * C *
Compute one-sided intercell flux DO 30 K = 1, 3 FI(K, I) = FD(K,I) + SNEW*AK*REVEC(K) CONTINUE ELSE Compute one-sided intercell flux DO 40 K = 1, 3 FI(K,I) = FD(K,I) CONTINUE ENDIF
Contact wave goes to the right EVAL = UM + CM SNEW = EVAL AK = (DP + DM*CM*DU)/(2.0*CM*CM)
* C * * C * * C * C C * *
Define Courant number CFLM CFLM = EVAL*DT/DX Test for left sonic rarefaction IF(ABS(CFLM).LT.TOLSON)THEN Small right wave speed is identified Use Roe's Riemann solver to find particle speed UMM and sound speed CMM in start right state SIG = -1.0 CALL STARVALS(SIG, DR, UR, ER, AK, UM, CM, HM, UMM, CMM)
* SML = UMM + CMM SMR = UR + CR * IF(SML.LT.0.0.AND.SMR.GT.0.0)THEN * C * * ENDIF * ENDIF * Right wave is a sonic rarefaction, speed is modified SNEW = SMR*(EVAL - SML)/(SMR - SML)
C * * C *
Compute one-sided intercell flux from right side IF(SNEW.GT.0.0)THEN Compute right eigenvectors REVEC(1) = 1.0 REVEC(2) = UM + CM REVEC(3) = HM + UM*CM
Compute one-sided intercell flux DO 50 K = 1, 3 FI(K, I)=FD(K, I+1) - SNEW*AK*REVEC(K) CONTINUE ELSE Compute one-sided intercell flux DO 60 K=1,3 FI(K, I) = FD(K, I + 1) CONTINUE ENDIF
* *----------------------------------------------------------------------* * SUBROUTINE STARVALS(SIG, DK, UK, EK, AK, UM, CM, HM, UMM, CMM) * C Purpose: to compute particle velocity and sound speed in C appropriate Star state, according to Roe's Riemann C solver for states, in order to apply entropy fix C of Harten and Hyman. See Chap. 11, Ref. 1 * IMPLICIT NONE * C Declaration of variables * REAL AK, CM, CMM, DK, DMK, EK, HM, PM, SIG, UK, UM, UMM, & GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 * COMMON /GAMMAS/ GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 * DMK = DK + SIG*AK UMM = (DK*UK + SIG*AK*(UM - SIG*CM))/DMK PM = G8*(EK + SIG*AK*(HM - SIG*UM*CM) - 0.5*DMK*UMM*UMM) CMM = SQRT(GAMMA*PM/DMK) * END * * *----------------------------------------------------------------------*
* SUBROUTINE HLLC(CELLS) C C C C * * C * * REAL & & * PARAMETER (IDIM = 3000) * & & * COMMON COMMON COMMON COMMON COMMON COMMON * C C * * IF(I.LT.1.OR.I.GT.CELLS)THEN CS(1,I) = D(I) CS(2,I) = D(I)*U(I) CS(3,I) = 0.5* D(I)*U(I)*U(I) + P(I)/G8 ENDIF * FD(1,I) = CS(2,I) FD(2,I) = CS(2,I)*U(I) + P(I) FD(3,I) = U(I)*(CS(3,I) + P(I)) * 10 * C * * DL UL PL CL * DR UR PR CR = = = = D(I U(I P(I C(I + + + + 1) 1) 1) 1) = = = = D(I) U(I) P(I) C(I) CONTINUE Solve Riemann problem (i,i+1) and store quantities in I DO 20 I = 0, CELLS /STATES/ /PRIMIT/ /SOUNDS/ /CONSER/ /FLUXES/ /GAMMAS/ DL, UL, PL, CL, DR, UR, PR, CR D, U, P C CS FI GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 DIMENSION D(-1:IDIM+2), U(-1:IDIM+2), P(-1:IDIM+2), C(-1:IDIM+2), CS(3,-1:IDIM+2), FD(3,-1:IDIM+2), FI(3,-1:IDIM+2), CSL(3), CSR(3) C, CL, CR, CS, CSL, CSR, D, DL, DR, ENEL, ENER, FD, FI, P, PL, PR, SL, SM, SR, U, UL, UR, GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 Purpose: to compute an intercell Godunov flux using the HLLC approximate Riemann solver. See Chap. 10 Ref. 1 IMPLICIT NONE Declaration of variables INTEGER I, CELLS, IDIM, K
* C C * *
Calculate estimates for wave speeds using adaptive approximate-state Riemann solvers CALL ESTIME(SL, SM, SR) IF(SL.GE.0.0)THEN
* C * 30 * *
* C * * C *
Subsonic flow IF(SM.GE.0.0)THEN Subsonic flow to the right ENEL ENEL CSL(1) CSL(2) CSL(3) = = = = = CS(3, I)/DL ENEL + (SM - UL)*(SM + PL/(DL*(SL - UL))) DL*(SL - UL)/(SL - SM) CSL(1)*SM CSL(1)*ENEL
* 40 * ELSE * C * Subsonic flow to the left ENER ENER CSR(1) CSR(2) CSR(3) * 50 * IF(SR.LE.0.0)THEN * C * 60 * ENDIF Left-going supersonic flow DO 60 K = 1, 3 FI(K, I) = FD(K, I + 1) CONTINUE DO 50 K = 1, 3 FI(K, I) = FD(K, I + 1) + SR*(CSR(K) - CS(K, I + 1)) CONTINUE ENDIF ENDIF = = = = = CS(3,I+1)/DR ENER + (SM - UR)*(SM + PR/(DR*(SR - UR))) DR*(SR - UR)/(SR - SM) CSR(1)*SM CSR(1)*ENER DO 40 K = 1, 3 FI(K, I) = FD(K, I) + SL*(CSL(K) - CS(K, I)) CONTINUE
20 * *
CONTINUE END
* *----------------------------------------------------------------------* * SUBROUTINE HLL(CELLS) * C Purpose: to compute an intercell Godunov flux using C the HLL approximate Riemann solver. See Chap 10, C Ref. 1 and original references therein * IMPLICIT NONE * C Declaration of variables * INTEGER I, CELLS, IDIM, K * REAL C, CL, CR, CS, D, DL, DR, FD, FI, HLLFLUX, & P, PL, PR, SL, SM, SR, U, UL, UR, & GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 * PARAMETER (IDIM = 3000) * DIMENSION D(-1:IDIM+2), U(-1:IDIM+2), P(-1:IDIM+2), C(-1:IDIM+2), & CS(3,-1:IDIM+2), FD(3,-1:IDIM+2), FI(3,-1:IDIM+2) * COMMON /STATES/ DL, UL, PL, CL, DR, UR, PR, CR COMMON /PRIMIT/ D, U, P COMMON /SOUNDS/ C COMMON /CONSER/ CS COMMON /FLUXES/ FI COMMON /GAMMAS/ GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 * C Compute fluxes on data and conserved variables C in fictitious cells * DO 10 I = 0, CELLS + 1 * IF(I.LT.1.OR.I.GT.CELLS)THEN CS(1,I) = D(I) CS(2,I) = D(I)*U(I) CS(3,I) = 0.5* D(I)*U(I)*U(I) + P(I)/G8 ENDIF * FD(1,I) = CS(2,I) FD(2,I) = CS(2,I)*U(I) + P(I) FD(3,I) = U(I)*(CS(3,I) + P(I)) * 10 CONTINUE * C Solve Riemann problem (i,i+1) and store quantities in I * DO 20 I = 0, CELLS * DL = D(I) UL = U(I) PL = P(I) CL = C(I)
* DR UR PR CR * C C * * IF(SL.GE.0.0)THEN * C * 30 * ENDIF * IF(SL.LE.0.0.AND.SR.GE.0.0)THEN * C * Subsonic flow DO 40 K = 1, HLLFLUX = HLLFLUX = FI(K,I) = CONTINUE ENDIF * IF(SR.LE.0.0)THEN * C * 60 * ENDIF 20 * END * * *----------------------------------------------------------------------* * SUBROUTINE RUSANOV(CELLS) C C Purpose: to compute an intercell Godunov flux using C the Rusanov approximate "Riemann solver". C See Chap. 10, Ref. 1 * IMPLICIT NONE * C Declaration of variables * CONTINUE Left-going supersonic flow DO 60 K = 1, 3 FI(K, I) = FD(K, I + 1) CONTINUE 3 SR*FD(K, I) - SL*FD(K, I + 1) HLLFLUX + SL*SR*(CS(K, I + 1) - CS(K, I)) HLLFLUX/(SR - SL) Right-going supersonic flow DO 30 K = 1, 3 FI(K, I) = FD(K, I) CONTINUE = = = = D(I U(I P(I C(I + + + + 1) 1) 1) 1)
Calculate estimates for wave speeds using adaptive approximate-state Riemann solvers CALL ESTIME(SL, SM, SR)
40 *
INTEGER I, CELLS, IDIM, K * REAL & & * PARAMETER (IDIM = 3000) * & * COMMON COMMON COMMON COMMON COMMON COMMON * C C * * IF(I.LT.1.OR.I.GT.CELLS)THEN CS(1,I) = D(I) CS(2,I) = D(I)*U(I) CS(3,I) = 0.5* D(I)*U(I)*U(I) + P(I)/G8 ENDIF * FD(1,I) = CS(2,I) FD(2,I) = CS(2,I)*U(I) + P(I) FD(3,I) = U(I)*(CS(3,I) + P(I)) * 10 * C * * DL UL PL CL * DR UR PR CR * C C * * IF(SL.GE.0.0)THEN * C * Right-going supersonic flow DO 30 K = 1, 3 FI(K, I) = FD(K, I) = = = = D(I U(I P(I C(I + + + + 1) 1) 1) 1) = = = = D(I) U(I) P(I) C(I) CONTINUE Solve Riemann problem (i,i+1) and store quantities in I DO 20 I = 0, CELLS /STATES/ /PRIMIT/ /SOUNDS/ /CONSER/ /FLUXES/ /GAMMAS/ DL, UL, PL, CL, DR, UR, PR, CR D, U, P C CS FI GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 DIMENSION D(-1:IDIM+2), U(-1:IDIM+2), P(-1:IDIM+2), C(-1:IDIM+2), CS(3,-1:IDIM+2), FD(3,-1:IDIM+2), FI(3,-1:IDIM+2) C, CL, CR, CS, D, DL, DR, FD, FI, RUSFLUX, P, PL, PR, SL, SM, SR, SPLUS, U, UL, UR, GAMMA, G1, G2, G3, G4, G5, G6, G7, G8
Calculate estimates for wave speeds using adaptive approximate-state Riemann solvers CALL ESTIME(SL, SM, SR)
30 * *
* C * C * * C *
Subsonic flow Compute single wave speed SPLUS = MAX(ABS(SL), ABS(SR)) Compute Rusanov flux DO 40 K = 1, 3 RUSFLUX = 0.5*(FD(K, I) + FD(K, I + 1)) FI(K,I) = RUSFLUX + 0.5*SPLUS*(CS(K, I) - CS(K, I + 1)) CONTINUE ENDIF
40 * *
IF(SR.LE.0.0)THEN * C * 60 * ENDIF * 20 * END * * *----------------------------------------------------------------------* * SUBROUTINE ESTIME(SL, SM, SR) * C Purpose: to compute wave speed estimates for the HLLC Riemann C solver using and adaptive approximate-state Riemann C solver including the PVRS, TRRS and TSRS solvers. C See Chap. 9, Ref. 1 * IMPLICIT NONE * C Declaration of variables * REAL DL, UL, PL, CL, DR, UR, PR, CR, & GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 , & CUP, GEL, GER, PM, PMAX, PMIN, PPV, PQ, & PTL, PTR, QMAX, QUSER, SL, SM, SR, UM * COMMON /GAMMAS/ GAMMA, G1, G2, G3, G4, G5, G6, G7, G8 COMMON /STATES/ DL, UL, PL, CL, DR, UR, PR, CR * QUSER = 2.0 * C Compute guess pressure from PVRS Riemann solver CONTINUE Left-going supersonic flow DO 60 K = 1, 3 FI(K, I) = FD(K, I + 1) CONTINUE
* CUP PPV PPV PMIN PMAX QMAX * IF(QMAX.LE.QUSER.AND.(PMIN.LE.PPV.AND.PPV.LE.PMAX))THEN * C * * ELSE IF(PPV.LT.PMIN)THEN * C * Select Two-Rarefaction Riemann solver PQ UM PTL PTR PM * ELSE * C * Use Two-Shock Riemann solver with PVRS as estimate GEL GER PM UM ENDIF ENDIF * C * = = = = SQRT((G5/DL)/(G6*PL + PPV)) SQRT((G5/DR)/(G6*PR + PPV)) (GEL*PL + GER*PR - (UR - UL))/(GEL + GER) 0.5*(UL + UR) + 0.5*(GER*(PM - PR) - GEL*(PM - PL)) = = = = = (PL/PR)**G1 (PQ*UL/CL + UR/CR + G4*(PQ - 1.0))/(PQ/CL + 1.0/CR) 1.0 + G7*(UL - UM)/CL 1.0 + G7*(UM - UR)/CR 0.5*(PL*PTL**G3 + PR*PTR**G3) Select PRVS Riemann solver PM = PPV UM = 0.5*(UL + UR) + 0.5*(PL - PR)/CUP = = = = = = 0.25*(DL + DR)*(CL + CR) 0.5*(PL + PR) + 0.5*(UL - UR)*CUP MAX(0.0, PPV) MIN(PL, PR) MAX(PL, PR) PMAX/PMIN