c
c
c----------------------------------------------------------------------
c This file contains the following advanced-turbulence-option
c subroutines: GXREYT, GXREYN, GXLRDF, GXEYAP, GXFMU, GXFEPS,
c GXTSKE, GXRNGM,
c
C SUBROUTINE GXREYT is called from subroutine GXENUT and from
C subroutine GXKESO.
C
C
SUBROUTINE GXREYT(K1,K2,K3,K4)
C.... K1=REYT K2=KE K3=EP K4=VISL
include 'farray'
COMMON/RDATA/TINY,RGFIL1(84)
COMMON/IGE/IXF,IXL,IYF,IYL,IGFILL(21)
COMMON/NAMFN/NAMFUN,NAMSUB
CHARACTER*6 NAMFUN,NAMSUB
NAMSUB='GXREYT'
IF(IXL.EQ.0) RETURN
CALL L0F4(K1,K2,K3,K4,I,I2M1,I3M1,I4M1,IADD,'GXREYT')
DO 1 IX=IXF,IXL
I=I+IADD
DO 1 IY=IYF,IYL
I=I+1
1 F(I)=AMAX1(F(I2M1+I)**2/((F(I3M1+I))*F(I4M1+I)+TINY),1.E-9)
NAMSUB='gxreyt'
END
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
c
C SUBROUTINE GXREYN is called from subroutine GXENUT and from
C subroutine GXKESO.
C
SUBROUTINE GXREYN(K1,K2,K3,K4)
C.... K1=REYN K2=KE K3=DIST K4=VISL
include 'farray'
COMMON/IGE/IXF,IXL,IYF,IYL,IGFILL(21)
COMMON/RDATA/TINY,RGFIL1(84)
COMMON/NAMFN/NAMFUN,NAMSUB
CHARACTER*6 NAMFUN,NAMSUB
NAMSUB='GXREYN'
IF(IXL.EQ.0) RETURN
CALL L0F4(K1,K2,K3,K4,I,I2M1,I3M1,I4M1,IADD,'GXREYN')
DO 1 IX=IXF,IXL
I=I+IADD
DO 1 IY=IYF,IYL
I=I+1
1 F(I)=SQRT(ABS(F(I2M1+I))) * F(I3M1+I) / (F(I4M1+I)+TINY)
NAMSUB='gxreyn'
END
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
c
C SUBROUTINE GXLRDF is called from subroutine GXENUT and from
C subroutine GXKESO.
C
SUBROUTINE GXLRDF(JC,L0FMU,L0FONE,L0FTWO,L0REYT,L0REYN)
include 'farray'
COMMON/GENI/NXNY,IGFIL(59)
COMMON/NAMFN/NAMFUN,NAMSUB
CHARACTER*6 NAMFUN,NAMSUB
NAMSUB='GXLRDF'
Compute Fmu
DO 2 J=1,NXNY
GREYN=F(L0REYN+J)
GREYT=F(L0REYT+J)
F(L0FMU+J)=1.0
IF(abs(GREYN).LT.800.0) F(L0FMU+J)=1.-EXP(-0.0165*GREYN)
F(L0FMU+J)=AMAX1(AMIN1(F(L0FMU+J)**2*(1.+20.5/GREYT),1.0),1.E-9)
2 CONTINUE
IF(JC.EQ.1) THEN
Compute Fone and Ftwo
DO 3 J=1,NXNY
F(L0FONE+J)=AMIN1(1.+(0.05/F(L0FMU+J))**3,1.E6)
F(L0FTWO+J)=1.0
GREYT=F(L0REYT+J)
IF(GREYT.LT.4.0) THEN
GRETSQ=AMIN1(GREYT*GREYT,100.)
F(L0FTWO+J)=AMAX1(1.-EXP(-GRETSQ),1.E-10)
ENDIF
3 CONTINUE
ENDIF
NAMSUB='gxlrdf'
END
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
c
C**** SUBROUTINE GXEYAP is called from group 13 OF GREX3 by setting
C the coefficient to FIXFLU and the value to GRND5 in the COVAL
C statement, and is entered only when the patch name begins with
C the character 'EYAP' and the variable LTLS is solved to
C calculate the distance to the nearest wall.
C
SUBROUTINE GXEYAP
include 'farray'
INCLUDE 'grdloc'
INCLUDE 'satgrd'
COMMON /IGE/IXF,IXL,IYF,IYL,IREG,NZSTEP,IGR,ISC,IRUN,IZSTEP,ITHYD,
1 ISWEEP,ISTEP,INDVAR,VAL,CO,NDIREC,WALDIS,PATGEO,IGES20(6)
INTEGER VAL,CO,WALDIS,PATGEO
COMMON/RDATA/TINY,RDATS(84)
COMMON/IDATA/NX,NY,IFILL(118)
COMMON/NAMFN/NAMFUN,NAMSUB
CHARACTER*6 NAMFUN,NAMSUB
C
NAMSUB = 'GXEYAP'
CALL SUB3(L0VAL,L0F(VAL),L0KE,L0F(KE),L0EP,L0F(EP))
L0WDIS=L0F(LBNAME('WDIS'))
GYAPC=AK/CMUCD**0.75
DO 1 I=1,NX*NY
IF(F(L0WDIS+I).LT.TINY) THEN
F(L0VAL+I)=0.0
ELSE
AKE=AMAX1(1.E-10,F(L0KE+I))
AEP=AMAX1(1.E-10,F(L0EP+I))
GLENRT=(AKE**1.5/AEP)/(GYAPC*F(L0WDIS+I))
GYAPS =0.83*(GLENRT-1.0)*GLENRT*GLENRT*AEP**2/AKE
F(L0VAL+I)=AMAX1(0.0,GYAPS)
ENDIF
1 CONTINUE
NAMSUB = 'gxeyap'
END
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
c
C SUBROUTINE GXFMU computes the ENUT damping function required
C by the two-layer k-eps model. The subroutine is called from
C subroutines GXENUT and GXKESO.
C
SUBROUTINE GXFMU(L0FMU,L0REYN)
include 'farray'
COMMON/GENI/NXNY,IGFIL(59)
COMMON/NAMFN/NAMFUN,NAMSUB
CHARACTER*6 NAMFUN,NAMSUB
NAMSUB='GXFMU '
DO 2 J=1,NXNY
GREYN=F(L0REYN+J)
F(L0FMU+J)=1.0
IF(ABS(GREYN).LT.350.0)
1 F(L0FMU+J)=AMAX1(AMIN1(1.-EXP(-0.0198*GREYN),1.0),1.E-9)
2 CONTINUE
NAMSUB='gxfmu '
END
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
c
C SUBROUTINE GXFEPS computes the EP damping function required
C by the two-layer k-eps model. The subroutine is called from
C subroutine GXKESO.
C
SUBROUTINE GXFEPS(L0FTWO,L0REYN)
include 'farray'
COMMON/GENI/NXNY,IGFIL(59)
COMMON/RDATA/TINY,RDATS(84)
COMMON/NAMFN/NAMFUN,NAMSUB
CHARACTER*6 NAMFUN,NAMSUB
NAMSUB='GXFEPS'
DO 2 J=1,NXNY
GREYN=F(L0REYN+J)
F(L0FTWO+J)=1.0
IF(ABS(GREYN).LT.350.0)
1 F(L0FTWO+J)=AMIN1(1.E6,1.+5.3/(GREYN+TINY))
2 CONTINUE
NAMSUB='gxfeps'
END
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
c
C**** SUBROUTINE GXTSKE is called from group 13 OF GREX3 for variables:
C EP, KP, ET, and KT, in that order, when the coefficient & value
C are set to GRND5 in the COVAL statement, and the name of a patch,
C of PHASEM type, begins with the characters 'TSKE'.
C
SUBROUTINE GXTSKE(VIST,LEN1,FIXFLU)
include 'farray'
INCLUDE 'grdloc'
INCLUDE 'satgrd'
COMMON/RDA4/PRT(150)
COMMON /IGE/IXF,IXL,IYF,IYL,IREG,NZSTEP,IGR,ISC,IRUN,IZSTEP,ITHYD,
1 ISWEEP,ISTEP,INDVAR,VAL,CO,NDIREC,WALDIS,PATGEO,IGES20(6)
INTEGER VAL,CO,WALDIS,PATGEO,VIST
COMMON/RDATA/TINY,RGFIL(84)
COMMON/IDATA/NX,NY,IFILL(118)
C COMMON/TSKEM/ GKTDKP,LBKP,LBKT,LBET,LBVOSQ,LBOMEG
COMMON/TSKEMI/ LBKP,LBKT,LBET,LBVOSQ,LBOMEG
1 /TSKEMR/ GKTDKP
COMMON/NAMFN/NAMFUN,NAMSUB
COMMON/SORSM/SORSUM
CHARACTER*6 NAMFUN,NAMSUB
INTEGER COGRN,VALGRN
LOGICAL ZRGRN3
SAVE NXNY,GC3E,GCT1,GCT2,GCT3,L0PRAT,L0TRAT,L0EPOL,L0KE,L0EP,
1 L0PROD,LBKTKP,LBETEP
C
NAMSUB = 'GXTSKE'
IF(IGR.EQ.1 .AND. ISC.EQ.3) THEN
CALL SUB4R( GC3E,0.21, GCT1,0.29, GCT2,1.28, GCT3,1.66 )
CALL GETSPD('KECONST','GC3E',1,GC3E,IDUM,.FALSE.,' ',IERR)
CALL GETSPD('KECONST','GCT1',1,GCT1,IDUM,.FALSE.,' ',IERR)
CALL GETSPD('KECONST','GCT2',1,GCT2,IDUM,.FALSE.,' ',IERR)
CALL GETSPD('KECONST','GCT3',1,GCT3,IDUM,.FALSE.,' ',IERR)
CALL WRITBL
CALL WRIT40('2-scale K-E turbulence model constants ')
CALL WRIT2R('GC3E ',GC3E ,'GCT1 ',GCT1)
CALL WRIT2R('GCT2 ',GCT2 ,'GCT3 ',GCT3)
CALL WRITBL
NXNY=NX*NY
CALL SUB3( LBKP,LBNAME('KP '), LBKT,LBNAME('KT '),
1 LBET,LBNAME('ET ') )
CALL GXMAKE(L0PRAT,NXNY,'PRAT')
CALL GXMAKE(L0TRAT,NXNY,'TRAT')
CALL GXMAKE(L0EPOL,NXNY,'EPOL')
CALL GXMAKE(L0PROD,NXNY,'PROD')
CALL SUB2(LBKTKP,LBNAME('KTKP'),LBETEP,LBNAME('ETEP'))
ELSEIF(IGR.EQ.13) THEN
CALL SUB2(COGRN,ISC-1,VALGRN,ISC-12)
CALL SUB3(L0KE,L0F(KE),L0KT,L0F(LBKT),L0ET,L0F(LBET))
C
IF(INDVAR.EQ.EP) THEN
c ep, energy transfer rate from production to dissipation range
c..... this section is entered first at each slab
IF(COGRN.EQ.5) THEN
L0CO=L0F(CO)
L0KP=L0F(LBKP)
L0EP=L0F(EP)
L0KT=L0F(LBKT)
L0KE=L0F(KE)
L0GEN1=L0F(GEN1)
L0VIST=L0F(VIST)
L0M1=L0F(LM1)
FACTOR=1.3333*C2E
DO 3 I=1,NXNY
F(L0KE+I)=F(L0KP+I)+F(L0KT+I)
c.... create the rate factor for "production" quantities
c store the start of sweep ep
c store the production rate
F(L0PRAT+I)=F(L0EP+I)/(F(L0KP+I)+TINY)
F(L0EPOL+I)=F(L0EP+I)
F(L0PROD+I)=F(L0GEN1+I)*F(L0VIST+I)
c.... create the coefficient
F(L0CO+I)=F(L0PRAT+I)*FACTOR
3 CONTINUE
IF(LBKTKP.NE.0) CALL FN15(LBKTKP,LBKT,LBKP,0.0,1.0)
IF(LBETEP.NE.0) CALL FN15(LBETEP,LBET,EP,0.0,1.0)
ELSEIF(VALGRN.EQ.5) THEN
L0VAL=L0F(VAL)
L0EP=L0F(EP)
L0KE=L0F(KE)
L0SU=L0F(LSU)
L0M1=L0F(LM1)
DO 4 I=1,NXNY
F(L0VAL+I)=F(L0EPOL+I)*0.25
SU=F(L0PROD+I)*F(L0PRAT+I)*F(L0M1+I)
1 * (C1E+GC3E*F(L0PROD+I)/(F(L0EPOL+I)+TINY))
F(L0SU+I)=F(L0SU+I)+SU
SORSUM=SORSUM+SU
4 CONTINUE
ENDIF
C
ELSEIF(INDVAR.EQ.LBKP) THEN
c kp, turbulence energy in production range
IF(COGRN.EQ.5) THEN
L0CO=L0F(CO)
DO 1 I=1,NXNY
F(L0CO+I)=F(L0PRAT+I)*1.5
1 CONTINUE
ELSEIF(VALGRN.EQ.5) THEN
L0VAL=L0F(VAL)
L0SU=L0F(LSU)
L0KP=L0F(LBKP)
L0M1=L0F(LM1)
DO IX=1,NX
DO IY=1,NY
I=(IX-1)*NY+IY
C.... Wall-type patch is present in the cell, so loop over wall-patches
C to check for GRND3 coefficient for KP
IF(ZRGRN3(IX,IY,IZSTEP,I)) THEN
F(L0VAL+I)=F(L0KP+I)
SU = 0.0
ELSE
F(L0VAL+I)=0.3333*F(L0KP+I)
SU= F(L0PROD+I)*F(L0M1+I)
ENDIF
F(L0SU+I)=F(L0SU+I)+SU
SORSUM=SORSUM+SU
ENDDO
ENDDO
ENDIF
C
ELSEIF(INDVAR.EQ.LBET) THEN
c et, dissipation rate of kt
L0ET=L0F(LBET)
L0KT=L0F(LBKT)
IF(COGRN.EQ.5) THEN
L0CO=L0F(CO)
DO 7 I=1,NXNY
F(L0TRAT+I)=F(L0ET+I)/(F(L0KT+I)+TINY)
F(L0CO+I) =F(L0TRAT+I)*GCT3*1.3333
7 CONTINUE
ELSEIF(VALGRN.EQ.5) THEN
L0VAL=L0F(VAL)
L0SU=L0F(LSU)
L0M1=L0F(LM1)
DO 6 I=1,NXNY
GEP=F(L0EPOL+I)
F(L0VAL+I)=0.25*F(L0ET+I)
SU=F(L0M1+I)*(GCT2*F(L0ET+I) +
1 GCT1*GEP )*GEP/(F(L0KT+I)+TINY)
F(L0SU+I)=F(L0SU+I)+SU
SORSUM=SORSUM+SU
6 CONTINUE
ENDIF
ELSEIF(INDVAR.EQ.LBKT) THEN
c kt, turbulence energy in dissipation range
IF(COGRN.EQ.5) THEN
CALL FN2(CO,-L0TRAT,0.0,1.5)
ELSEIF(VALGRN.EQ.5) THEN
L0VAL=L0F(VAL)
L0SU=L0F(LSU)
L0M1=L0F(LM1)
L0KT=L0F(LBKT)
DO 5 I=1,NXNY
F(L0VAL+I) = 0.3333*F(L0KT+I)
SU= F(L0EPOL+I)*F(L0M1+I)
F(L0SU+I)=F(L0SU+I)+SU
SORSUM=SORSUM+SU
5 CONTINUE
ENDIF
ENDIF
ENDIF
NAMSUB = 'gxtske'
END
c file-name gxrng.for 220394
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
c
C**** SUBROUTINE GXRNGM is called from group 13 OF GREX3 by setting
C the coefficient & value to GRND4 in the COVAL statement, and
C is entered only when the patch name begins with the
C character 'RNGM'.
C
C.... The arguments VIST and LEN1 are the integer names used in the
C SATELLITE, indicating which whole-field store will be used for
C the turbulent kinematic viscosity and length scale of phase 1
C respectively.
C
C.... The library cases T300-T306 make use of it.
C
C
SUBROUTINE GXRNGM(VIST,LEN1,FIXFLU)
include 'farray'
INCLUDE 'grdloc'
INCLUDE 'satgrd'
COMMON /IGE/IXF,IXL,IYF,IYL,IREG,NZSTEP,IGR,ISC,IRUN,IZSTEP,ITHYD,
1 ISWEEP,ISTEP,INDVAR,VAL,CO,NDIREC,WALDIS,PATGEO,IGES20(6)
INTEGER VAL,CO,WALDIS,PATGEO,VIST
COMMON/IDATA/NX,NY,IFILL(118)
COMMON/NAMFN/NAMFUN,NAMSUB
CHARACTER*6 NAMFUN,NAMSUB
INTEGER COGRN,VALGRN
SAVE ETA0,BETA,NXNY,JALF,JETA,L0ALF,L0ETA,L0KE,L0EP
C
NAMSUB = 'GXRNGM'
IF(IGR.EQ.1 .AND. ISC.EQ.3) THEN
CALL SUB2R( ETA0,4.38, BETA,0.012 )
NXNY= NX*NY
CALL SUB2( JALF,LBNAME('ALF '), JETA,LBNAME('ETA ') )
IF(JALF.EQ.0) CALL GXMAKE(L0ALF,NXNY,'ALF ')
IF(JETA.EQ.0) CALL GXMAKE(L0ETA,NXNY,'ETA ')
ELSE
CALL SUB2(COGRN,ISC-1,VALGRN,ISC-12)
IF(COGRN.EQ.4) THEN
C.... Coefficient part of the linearized rate-of-strain term R ------CO
C.... If alf > 0, CO = ALF*EP/KE otherwise CO = FIXFLU
C
C where ALF = CMUCD*ETA**3*(1-ETA/ETA0)/(1+BETA*ETA**3) and
C ETA = SQRT(GEN1)*KE/EP
C
CALL SUB3(L0CO,L0F(CO),L0KE,L0F(KE),L0EP,L0F(EP))
L0GEN1=L0F(GEN1)
IF(JALF.NE.0) L0ALF=L0F(JALF)
IF(JETA.NE.0) L0ETA=L0F(JETA)
DO 1 I=1,NXNY
rateco=f(l0ep+i)/(f(l0ke+i)+1.e-20) +1.e-10
F(L0ETA+I)=amin1(1.e3, SQRT(abs(F(L0GEN1+I)))/rateco)
ETA3=F(L0ETA+I)**3
F(L0ALF+I)=CMUCD*ETA3*(ETA0-F(L0ETA+I))/
1 (ETA0*(1.0+BETA*ETA3))
IF(F(L0ALF+I).LT.0) THEN
F(L0CO+I)=FIXFLU
ELSE
F(L0CO+I)=F(L0ALF+I)*rateco
ENDIF
1 CONTINUE
ELSEIF(VALGRN.EQ.4) THEN
C.... Value part of the linearized source ---------------------------VAL
C.... If alf > 0, VAL = 0.0 otherwise VAL = -ALF*EP**2/K
C
L0VAL=L0F(VAL)
FAC=1.0/FIXFLU
DO 2 I=1,NXNY
IF(F(L0ALF+I).LT.0) THEN
F(L0VAL+I)=-F(L0ALF+I)*F(L0EP+I)*F(L0EP+I)*FAC/
1 (F(L0KE+I)+1.E-20)
ELSE
F(L0VAL+I)=0.0
ENDIF
2 CONTINUE
ENDIF
ENDIF
NAMSUB = 'gxrngm'
END
c