cc
C.... File Name ................ GREX3.FOR ...................... 211024
c
C This subroutine is called by EARTH within the solution cycle.
C
C Subroutine GREX3, with the subsidiary subroutines GXxxxx,
C allows the PHOENICS EARTH program to access a wide range of
C special physical models, algorithm adjustments and print-out
C features.
C
C 'EX' stands for 'example', signifying that the coding practices
C exhibited here may be used as patterns by PHOENICS users who
C wish to introduce their own models, algorithms, etc.
C
C The GX subroutines that are called in group 13 are activated
C by settings in the SATELLITE, mainly by way of PATCH names.
C Many of them, like GREX3 itself, call on 'utility' subroutines'
C named FNxxx.
C
C The FNxxx subroutines perform various arithmetic operations on
C segments of the F-array corresponding to variables of like kind,
C indicated by the arguments. The FUNCT entry of the Encyclopaedia
C provides full explanations.
C
c
SUBROUTINE GREX3
C--------------------------------------- INCLUDE COMMON BLOCK files
INCLUDE 'patcmn'
INCLUDE 'objnam'
INCLUDE 'farray'
INCLUDE 'satear'
INCLUDE 'grdloc'
INCLUDE 'satgrd'
INCLUDE 'grdear'
INCLUDE 'grdbfc'
INCLUDE 'parear'
INCLUDE 'lbnamer'
CHARACTER*48 COMMAND
COMMON/IMAIN2/IMAIN1(9),ISWSTP,IMAIN2(33)
COMMON/F0/KF01(70),KAP,KF02(233)
1 /MRKCMN/LBMARK,L0MARK
COMMON/LBFC/STORSA(6),STORWD(6),LBFCSP /ARRT/ARRIVT
LOGICAL STORSA,STORWD,LBFCSP,LGTEMP,SPCLGR,ARRIVT
COMMON/RDLOG/LOGQ(10)/RDINT/INTQ(10)/RDREAL/REALQ(10)
COMMON/RAKEEP/RADIAT/DVMOD/IDVCGR
LOGICAL RADIAT,NEZ,dbgloc
COMMON /LRNTM3/L0UTAU,NMWALL,L0WALL,L0DSKN,IVPRST
LOGICAL NOCALC,DRAGON,DRG1ST,PBFC,DFAIL,CALLSL
COMMON/DRAGCM/NOCALC,DRAGON,DRG1ST,PBFC,DFAIL
COMMON /LUNITS/LUNIT(60)
1 /GENL/LFIL1(3),TIMPRN,LGF1(10),debgtz,SWPRIN,LGF2(40),
1 TURB,LGF3(3)
LOGICAL SLIPVL,LG,KEBUOY,LGF1,debgtz,TIMPRN,SWPRIN,LGF2,TURB,LGF3,
1 HOCS,ESCRS,FSQSOR,RADCVD,BLIN,LGXIO,LSUN,LWAVE,SURFT
SAVE SLIPVL,NUMSPPR,KEBUOY,SPCLGR,ESCRS,FSQSOR,HOCS,PSIVEL,
1 BLIN,LWAVE,SURFT
COMMON/GRXFLAGS/LGXIO,LSUN
COMMON/LBINGREX/LBSLU,LBSLV,LBSLW,LBWAVE,LBGENK,LBGNK2,LBMACH,
1 LBPTOT,LBVABS,LBVLSQ,LBPTO2,LBVAB2,LBMAC2,LBFSQ,
1 LBARRT,LBWCRT,LBPSIV,LBVOXY,LBVOYZ,LBVOZX
COMMON/LRNTM1/L0WDIS,L0FMU,L0FONE,L0FTWO,L0REYN,L0REYT,L0UD1,L0UD2
1 ,L0UD3,L0UD4
COMMON /UVWGBF/ IUC1GCV,IVC1GCV,IWC1GCV,IFILGCV(9)
COMMON/PASQLF/ITPRO,PASQBUOY,BUOSSG,MOLEN
LOGICAL PASQBUOY,BUOSSG
COMMON/EXPLOSION/EXPLOS
LOGICAL EXPLOS,PSIVEL
C.... Provision for the use of GRAPH
DIMENSION TIME(100),OR(100,10),LABOR(10),IOSC(10)
CHARACTER*4 LABOR,CG
PARAMETER (NLG=100, NIG=100, NRG=200, NCG=100)
COMMON/LGRND/LG(NLG)/IGRND/IG(NIG)/RGRND/RG(NRG)/CGRND/CG(NCG)
COMMON/NAMFN/NAMFUN,NAMSUB
CHARACTER*6 NAMFUN,NAMSUB
COMMON/GENI/NXNY,IFIL1(8),NFM,IGFIL1(21),IPRL,IBTAU,ILTLS,
1 IGFIL(15),ITEM1,ITEM2,ISPH1,ISPH2,ICON1,ICON2,IPRPS,IRADX,IRADY,
1 IRADZ,IVFOL
PARAMETER (MXXLET=20)
COMMON /LETL0C/ L0C(MXXLET)
CHARACTER*(MXXLET) CINDEX, WREF*2
COMMON /LETBLK/ CINDEX
COMMON/IELAPS/IREC,ITIME1,NUMSOL
COMMON/GRX/NUMSEC
COMMON/RHILO/HI3D,RLO3D
LOGICAL DONE192,GXMON,SLD,DOIT
COMMON/GXMON2/PLTCLSX; LOGICAL PLTCLSX
SAVE DONE192
SAVE TIME,OR,LABOR
DIMENSION DIGIT(10)
CHARACTER*2 DIGIT
DATA DIGIT/'1','2','3','4','5','6','7','8','9','10'/
DATA DONE192 /.FALSE./
c
dbgloc=debgtz.and.dbgrnd
if(dbgloc) then
call writbl
call banner(1,'grex ',040225)
write(14,*)'entry to grex for: igr,isc,indvar ',igr,isc,indvar
endif
if(test) call fcheck(0,'grex3 ')
c----------------------------------------------------------------------
NAMSUB='GREX3'
C.... GO TO the group indicated by IGR, then to section ISC
IF(IGR==19) THEN
GO TO 19
ELSEIF(IGR==13) THEN
GO TO 13
ELSE
GO TO (1,2,3,4,5,6,25,8,9,10,11,12,13,14,25,25,25,25,19,
1 20,21,25,25,24) IGR
ENDIF
C****************************************************************
C
C---- GROUP 1. Run title and other preliminaries
C
1 GO TO (1001,1002,1003),ISC
C
C.... group 1 sections are called in the order 1, 2, 3.
C****************************************************************
C
C * -----------GROUP 1 SECTION 1 ------ Initializations and
C allocations of storage for variables which it is essential to
C dump to the PHI (or PHIDA) file for restart purposes
C
1001 IX=1 ; IY=1
C----------------------------------- Identification of GREX3 to VDU
IF(.NOT.NULLPR.AND.UWATCH)
1 CALL WRYT40('GREX3 of 040225 has been called')
C
IF(READQ1) CALL GXRDQ1 ! Read Q1EAR file when READQ1 = T in Q1
c
c.... Set absolute value below which zeroes will appear in field-value
c print-out (unless debug=t, which sets print0 to 0.0).
c Users wishing to change print0 without re-compiling should insert
c PRT0BEGIN
c PRINT0 [desired value]
c PRT0END
c at the top of their Q1 file
c
IF(.NOT.DEBUG) PRINT0=1.E-11
CALL RQ1R('PRT0','PRINT0',PRINT0)
C.... Set up PATCH-wise storage, if necessary, for GXBFC
IF(BFC) CALL GXBFC
PSIVEL=LBPSIV/=0
C------------------------ PHI and XYZ files for parabolic cases
C
IF(PARAB.OR.(.NOT.STEADY.AND.PNAM==' ')) THEN
IF(IDISPA>0) CALL GXPARA
ENDIF
NUMSEC=0
C.... Initializations dependent on the existence of patch names
RADIAT=.FALSE. ; KEBUOY=.FALSE. ; HOCS=.FALSE. ; FSQSOR=.FALSE.
BLIN=.FALSE. ;LGXIO=.FALSE.; LSUN=.FALSE.; LWAVE=.FALSE.
SURFT=.FALSE. ; PASQBUOY=.FALSE.
DO 10011 I = 1,NUMPAT
IF(NAMPAT(I)(1:6)=='KEBUOY') THEN
KEBUOY=.TRUE.
ELSEIF(NAMPAT(I)(1:4)=='RADI') THEN
RADIAT=.TRUE.
CALL GXRADI(CARTES,TEMP1,DEN1,RHO1) ! Radiation initialization
ELSEIF(NAMPAT(I)(1:4)=='HOCS') THEN
HOCS=.TRUE.
ELSEIF(NAMPAT(I)(1:4)=='STEN') THEN
SURFT=.TRUE.
ELSEIF(NAMPAT(I)(1:5)=='FSQSO') THEN
FSQSOR=.TRUE.
ELSEIF(NAMPAT(I)(1:4)=='BLIN'.OR.NAMPAT(I)(1:4)=='GXBL')THEN
BLIN=.TRUE. ! Boundary-layer inlet profile facility
ELSEIF(.NOT.LWAVE.AND.NAMPAT(I)(1:4)=='WAVE'.AND.IVFOL>0) THEN
CALL GETCOV(NAMPAT(I),IVFOL,GCO,GVAL)
IF(GCO/=-999.) LWAVE=.TRUE.
ELSEIF(.NOT.BFC) THEN
COMMAND=' '
CALL GETSDC(OBJNAM(I),'INLET',COMMAND)
IF(COMMAND==' ') CALL GETSDC(OBJNAM(I),'OUTLET',COMMAND) ! test for
! angled-out object
IF(COMMAND=='GXI'.OR.COMMAND=='GXO') LGXIO=.TRUE.
ENDIF
10011 CONTINUE
LGXIO=LGXIO.OR.(MIMD.AND.NPROC>1)
COMMAND=' '
CALL GETSDC('SUNLIGHT','TIME',COMMAND)
IF(COMMAND/=' ') LSUN=.TRUE.
C---------------------------------- SLIPVL setting
IF(.NOT.ONEPHS) THEN
SLIPVL = LBNAME('SLPU')/=0.OR.LBNAME('SLPV')/=0.OR.
1 LBNAME('SLPW')/=0
IF(SLIPVL) THEN
LBSLU=0 ; LBSLV=0 ;LBSLW=0
IF(SOLVE(3).AND.SOLVE(4)) LBSLU=LBNAME('SLPU')
IF(SOLVE(5).AND.SOLVE(6)) LBSLV=LBNAME('SLPV')
IF(SOLVE(7).AND.SOLVE(8)) LBSLW=LBNAME('SLPW')
ENDIF
IF(NEZ(CPIP)) CALL GXINTP
IF(NEZ(CLIFT)) CALL GXLIFT
ENDIF
IF(BLIN) CALL GXBLIN ! Boundary-layer inlet profile facility
IF(FDFSOL) CALL GXFDFS ! Fully-developed floq
IF(HOCS) CALL GXHOCS
IF(NOX1) CALL GXNOX
IF(NOX2) CALL GXNOX
IF(CHMKIN) CALL GXCHKI(0,0.0)
!!! IF(LSG87) CALL GXTCALC(0,0.0)
IF(LBARRT/=0) CALL GXARRT
IF((GRNDNO(9,TMP1).OR.GRNDNO(10,TMP1)).AND..NOT.LSG87) THEN
ESCRS=.TRUE.
IF(GRNDNO(9,TMP1)) THEN
C Define operating pressure in atmospheres via CHSOC for CHEMKIN
CHSOC=PRESS0/1.01325E5
CALL GXCHKI(0,0.0)
ENDIF
CALL GXSCRI
ELSE
ESCRS=.FALSE.
ENDIF
EXPLOS=.FALSE.
C***************************************************************
CALL UCASZZ(NAMGRD,48)
SPCLGR= YPLS.OR.WALPRN.OR.S2SR
1 .OR.NAMGRD=='FURN'.OR.NAMGRD=='ESTR'.OR.NAMGRD=='FLAR'
1 .OR.NAMGRD=='HTBX'.OR.NAMGRD=='TACT'.OR.NAMGRD=='MICA'
1 .OR.NAMGRD=='CONV'.OR.NAMGRD=='CVD '.OR.NAMGRD=='F1'
1 .OR.NAMGRD=='WATS'.OR.NAMGRD=='WAVE'
LL=LENGZZ(NAMGRD)
IF(SPCLGR.AND.NAMGRD/='NONE') THEN
IF(.NOT.NULLPR) CALL WRIT40
1 ('Special GROUND '//NAMGRD(1:LL)//' is in use ')
ELSEIF(NAMGRD/='NONE') THEN
CALL WRITST
CALL WRITBL
CALL WRIT40
1 ('Stop because '//NAMGRD(1:LL)//' is not known to GREX3 ')
CALL WRYT40
1 ('Stop because '//NAMGRD(1:LL)//' is not known to GREX3 ')
CALL SET_ERR(213,'Error. See result file.',1)
ENDIF
IF(MYID==0) CALL LATEST_DUMP(1,0,0,' ',' ',' ')
GO TO 25
C
C***********************************************************************
C
C * -----------GROUP 1 SECTION 3 ---------------------------
c
C---- Use Section 3 to create storage via MAKE or GXMAKE which it is
C not necessary to dump to the PHI(da) file for restarts.
C
1003 CONTINUE
C
C.... Provision of special EARTH arrays by means of the
C storage-setting subroutine MAKE, used thus:
C CALL MAKE(variable name)
C
C---------------------------------------------------------BFC=T
IF(BFC) THEN
CALL GXBFC
C.... Segment EASP4 is used for buoyancy sources when BFC=T
C (see GXBUOY)
CALL MAKE(EASP4)
C
ENDIF
IF(SURFT) CALL GXSURFT
C
C-------------------------------------------------EASP1, EASP2, EASP3
C
C.... F-array segments with zero-locations EASP1, EASP2 & EASP3 are
C always available, for use as local temporary stores
C (See for example their uses in GXWALL & GXPORA)
CALL MAKE(EASP1)
CALL MAKE(EASP2)
CALL MAKE(EASP3)
CALL MAKE(EASP5) ! to store SKINT in gxwall.for
IF(UCONV.AND.NZ>1) CALL MAKE(EASP20)
C
C-------------------------------------------------------EASP7
C.... Store for k-eps source-term linearisation
IF(BFC.OR.KELIN==1) CALL MAKE(EASP7)
C
C---------------------------------------------------Letter Mask
MXL=MXXLET
CINDEX=' '
DO 111 IPAT=1,NUMPAT
KK=INDEX(NAMPAT(IPAT)(:2),'%')
IF(KK/=0) THEN
WREF=NAMPAT(IPAT)(KK+1:KK+2)
C* WREF(:1) = $ LETTER MASK IN XY PLANE
C* = & LETTER MASK IN ZY PLANE
C* = # LETTER MASK IN XZ PLANE
IF(WREF(:1)=='$' .OR. WREF(:1)=='&'
1 .OR. WREF(:1)=='#') THEN
K=INDEX(CINDEX,WREF(2:2))
IF(K==0) CALL LETMSK(CINDEX,WREF(2:2),L0C,MXL)
ENDIF
ENDIF
111 CONTINUE
C---------------------------------------------------------LGEN1
C.... Provision of storage for square-of-velocity-gradient
C expressions for viscous-dissipation or turbulence-
C energy source.
C
IF(GENK .OR. DUDX.OR.DVDX.OR.DWDX.OR.DUDY.OR.DVDY.OR.DWDY.OR.
1 DUDZ.OR.DVDZ.OR.DWDZ) THEN
IF(BFC) THEN
LIMIT1=1
LIMIT2=18
ELSE
LIMIT1=5
LIMIT2=9
ENDIF
DO 1000 I= LIMIT1,LIMIT2
CALL MAKE(LXYEA(I))
1000 CONTINUE
ENDIF
IF((SOLVE(H1).AND.(GRNDNO(5,TMP1).OR.GRNDNO(6,TMP1)))
1 .OR.(SOLVE(H2).AND.(GRNDNO(5,TMP2).OR.GRNDNO(6,TMP2)))) NCRT=1
IF(IENUTA.EQ.14) CALL GX_REALISABLE_KE
IF(IENUTA.EQ.10.OR.IENUTA.EQ.11) CALL GXKW_WILCOX ! not needed.
IF(IENUTA.EQ.15.OR.IENUTA.EQ.16) CALL GXKW_WILCOX
IF(IENUTA.GE.17.AND.IENUTA.LE.20) CALL GXKW_MENTER
IF(IENUTA.EQ.21.OR.IENUTA.EQ.22) CALL GX_SPALART_ALLMARAS
GO TO 25
C
C***********************************************************************
C * -----------GROUP 1 SECTION 2 Further initializations which
C require that storage shall aready have been allocated
c
1002 CONTINUE
c call fcheck(10,namsub)
IF(KEBUOY) CALL GXKEGB
c call fcheck(20,namsub)
namsub='grex3'
IF(FSQSOR) CALL GXFSQS
C.... Wall-function initializations
IF(TURB .AND. NMWALL>0) CALL GXWFUN
IF(HOCS) CALL GXHOCS
IF(.NOT.ONEPHS) LBWAVE=LBNAME('WAVE')
C.... Possibly set BFC grid by way of coding in GXBFGR
IF(SETBFC.OR.MOVBFC) CALL GXBFGR
IF(LGXIO) CALL GXIO
IF(LSUN) CALL GXSUN
IF(BLIN) CALL GXBLIN ! Boundary-layer inlet profile facility
CALL GXOUTLET
CALL WRTPAT
GO TO 25
c
C*****************************************************************
C
C
C--- GROUP 2. Transience; time-step specification
C
2 CONTINUE
C * Set DT if TLAST has been made <=GRND in satellite
C... Set timestep from Courant Number
IF(TLAST-TFIRST==GRND1) CALL GXTIMESTEP
GO TO 25
C*****************************************************************
C
C
C--- GROUP 3. X-direction grid specification
C
3 CONTINUE
C * Set XRAT if AZXU has been made <=GRND in satellite
GO TO 25
C*****************************************************************
C
C
C--- GROUP 4. Y-direction grid specification
C
4 CONTINUE
C * Set YRAT if AZYV has been made <=GRND in satellite
C
GO TO 25
C*****************************************************************
C
C
C--- GROUP 5. Z-direction grid specification
C
5 CONTINUE
C * Set DZ if AZDZ has been made <=GRND in satellite
IF(GRNDNO(1,AZDZ)) THEN ! azdz = grnd1 or propx
DZ=DZW1*XULAST ! i.e. proportional to xulast
ELSEIF(GRNDNO(2,AZDZ)) THEN ! azdz = grnd2 or propy
DZ=DZW1*YVLAST ! i.e. proportional to yvlast
ENDIF ! dzw1 = proportionality factor
c * Insert DZ in the appropriate slab-wise array
CALL FN1(LXYDZ,DZ)
GO TO 25
C*****************************************************************
C
C
C--- GROUP 6. Body-fitted coordinates or grid distortion
C This group is visited when UGEOM is set .TRUE.. The visits
C occur at the start of each z slab after its geometry has been
C computed. Hence, this is the right place to access AEAST, AHIGH,..
C etc.
6 CONTINUE
C
GO TO 25
C*****************************************************************
C * Make changes for this group only in group 19.
C
C--- GROUP 7. Variables stored, solved & named
C*****************************************************************
C
C
C--- GROUP 8. Terms (in differential equations) & devices
C
8 GO TO (81,82,83,84,85,86,87,88,89,810,811,812,813,814,815,816)
1 ISC
C * Add velocities relative to grid for phase 1 and/or phase 2
C * -----------GROUP 8 SECTION 1 ---------------------------
C--- for U1AD<=GRND--- phase 1 additional velocity (VELAD).
81 CONTINUE
C--- for U1AD<=GRND--- phase 1 additional velocity (VELAD).
c.... The option U1AD=GRND1 adds to U1 a component equal -W1*TAN(ALF)
c where ALF is the east-face grid angle. It is needed for the
c parabolic solver for grids for which constant-x lines are
c not precisely at right angles to constant-z lines. The
c correction is also available for U2, V1 and V2 (see below).
c
IF(GRNDNO(1,U1AD)) CALL GXPVAD(XULAST,XRAT,XU2D,W1,'X')
GO TO 25
C * -----------GROUP 8 SECTION 2 ---------------------------
C--- for U2AD<=GRND--- phase 2 additional velocity (VELAD).
82 CONTINUE
IF(GRNDNO(1,U2AD)) CALL GXPVAD(XULAST,XRAT,XU2D,W2,'X')
GO TO 25
C * -----------GROUP 8 SECTION 3 ---------------------------
83 CONTINUE
C--- for V1AD<=GRND--- phase 1 additional velocity (VELAD).
IF(GRNDNO(1,V1AD)) CALL GXPVAD(YVLAST,YRAT,YV2D,W1,'Y')
GO TO 25
C * -----------GROUP 8 SECTION 4 ---------------------------
C--- for V2AD<=GRND--- phase 2 additional velocity (VELAD).
84 CONTINUE
IF(GRNDNO(1,V2AD)) CALL GXPVAD(YVLAST,YRAT,YV2D,W2,'Y')
GO TO 25
C * -----------GROUP 8 SECTION 5 ---------------------------
C--- for W1AD<=GRND--- phase 1 additional velocity (VELAD).
85 CONTINUE
GO TO 25
C * ----------GROUP 8 SECTION 6 ---------------------------
C--- for W2AD<=GRND--- phase 2 additional velocity (VELAD).
86 CONTINUE
GO TO 25
C * -----------GROUP 8 SECTION 7 ---- VOLUMETRIC SOURCE FOR GALA
C---- Entered when GALA =.TRUE.; block-location index is LSU or LSU2
87 CONTINUE
IF(IEVAP>0) CALL GXEVAP
GO TO 25
C * -----------GROUP 8 SECTION 8 --- CONVECTION COEFFICIENTS
C--- Entered when UCONV =.TRUE.
88 CONTINUE
c call fcheck(881,'grex3 ')
C.... Correction applicable to velocities in compressible flow
IF(COMPRS) THEN ! COMPRS is a PIL variable
IF(INDVAR>=U1.AND.INDVAR<=W2) THEN ! do this only for velocities
IF((INDVAR==U1.OR.INDVAR==U2).AND.NDIREC==3) THEN
CALL GXCMPR(LD11,EAST(P1),P1,1.4)
CALL GXCMPR(LD12,P1,EAST(P1),1.4)
ELSEIF((INDVAR==V1.OR.INDVAR==V2).AND.NDIREC==1) THEN
CALL GXCMPR(LD11,NORTH(P1),P1,1.4)
CALL GXCMPR(LD12,P1,NORTH(P1),1.4)
ELSEIF(INDVAR==W1.OR.INDVAR==W2) THEN
IF(NDIREC==5) THEN
CALL GXCMPR(EASP20,HIGH(P1),P1,1.4)
ELSEIF(NDIREC==6) THEN
CALL GXCMPR(EASP20,P1,HIGH(P1),1.4)
ENDIF
ENDIF
ENDIF
ENDIF
c call fcheck(882,'grex3 ')
C
GO TO 25
C * -----------GROUP 8 SECTION 9 --- DIFFUSION COEFFICIENTS
C.... Entered when UDIFF =.TRUE.; block-location indices are:
C LAE for east, LAN for north, and LD11 for high.
C The user should provide INDVAR and NDIREC IF's as appropriate.
C EARTH will apply the DIFCUT and GP12 modifications after the user
C has made his settings.
C
89 CONTINUE
IF(CHMKIN) CALL GXCHKI(0,0.0)
GO TO 25
C * -----------GROUP 8 SECTION 10 --- CONVECTION NEIGHBOURS
C---- Entered when UCONNE =.TRUE.; block-location indices are LD7
810 CONTINUE
GO TO 25
C * -----------GROUP 8 SECTION 11 --- DIFFUSION NEIGHBOURS
C---- Entered when UDIFNE =.TRUE.; block-location indices are LD7
C for south, west, high or low, and LD8 for north or east.
C User should provide INDVAR and NDIREC IF's as above.
811 CONTINUE
IF(CHMKIN) CALL GXCHKI(0,0.0)
GO TO 25
C * -----------GROUP 8 SECTION 12 --- LINEARISED SOURCES
C---- Entered when USOURC =.TRUE.
812 CONTINUE
IF(FDFSOL) CALL GXFDFS
IF(CHMKIN) CALL GXCHKI(0,0.0)
GO TO 25
C * -----------GROUP 8 SECTION 13 --- CORRECTION COEFFICIENTS
C---- Entered when UCORCO =.TRUE.
813 CONTINUE
GO TO 25
c
C * -----------GROUP 8 SECTION 14 --- USER'S SOLVER
C---- Entered when USOLVE =.TRUE.;
814 CONTINUE
c........................ SLVR and CSG3 are EQUIVALENCEd in GRDLOC
C------------------------- Call Gauss-Seidel solver
IF(SLVR=='GAUS'.AND..NOT.SLBSOL) CALL GXGAUS(OVRRLX,
1 LITER(INDVAR),IXMON,IYMON,IZMON,ENDIT(INDVAR),XCYCLE,LUPR1,LUPR3)
C
USER=.FALSE.
C
CALLSL = INDVAR==1 .OR. INDVAR==3 .OR. INDVAR==5 .OR.
1 INDVAR==7 .OR.(INDVAR>=ICNGRB .AND. INDVAR<=ICNGRC)
IF(CALLSL) THEN
NZZ=NZ
IF( SLBSOL ) NZZ=1
IF( SLVR=='CGGR') THEN
CALL GXCGGR(NX,NY,NZZ)
ELSEIF( SLVR=='CRGR') THEN
CALL GXCRGR(NX,NY,NZZ)
ENDIF
C.... entry to GXCHKI for N-R solvers
ELSEIF(CHMKIN) then
CALL GXCHKI(0,0.0)
ENDIF
C
GO TO 25
C * -----------GROUP 8 SECTION 15 --- Change solution result
C---- Entered when UCORR =.TRUE.; block-location indices are as above.
815 CONTINUE
C.... entry to GXCHKI for N-R solvers
C
IF(CHMKIN) CALL GXCHKI(0,0.0)
GO TO 25
816 CONTINUE
C * ------------------- SECTION 16 --- Change DVEL/DPs if UDVDP = .TRUE.
GO TO 25
C * Make all other group-8 changes in group 19.
C***********************************************************************
C
C
C--- GROUP 9. Properties of the medium (or media)
C
C... EARTH no longer calls Group 9 and 10 of GREX for properties. Instead
C it directly calls subroutine SLBPRP (in EARTH) which itself calls the
c the appropriate one of the following:
c SLBDEN (in GXDENS.HTM) for DENST1
c SLBDRP CMPRS1
c SLBTHE THRME1
c SLBVST VISTRB
c SLBVSL VISCLM
c SLBPRL PRNLAM
c SLBTMP TEMPR1
c SLBSPH SPEHT1
c SLBLEN MIXLN1
c SLBDEN DENST2
c SLBDRP CMPRS2
c SLBTHE THRME2
c SLBTMP TEMPR2
c SLBSPH SPEHT2
c SLBLEN MIXLN2
c SLBIVL INTVL1
c SLBFRC INTFCO
c SLBIMS INTMTR
c SLBIDF INTRC1
c SLBVRM IVRMCO
c
C property flag is set to one of the GRND values. However, if a property
C flag is set to GRND, SLBPRP calls the GROUND subroutine, expecting to
C find there user-provided coding for the property in question.
C
9 GO TO 25
C***********************************************************************
C
C
C--- GROUP 10. Inter-phase-transfer processes and properties
C
C... See comment to Group 9.
10 GO TO 25
C***********************************************************************
C
C
C--- GROUP 11. Initialization of variable or porosity fields
C
11 IF(NPATCH(1:4)=='IBFC') THEN ! Initial field of uniform
CALL GXBFC ! flow in a curvilinear grid
ELSEIF(NPATCH(1:6)=='INIPOL') THEN
CALL GXIPOL
ELSEIF(NPATCH(1:6)=='ICHEMK') THEN
IF(CHMKIN) CALL GXCHKI(0,0.0)
ELSEIF(NPATCH(1:4)=='BLIN'.OR.NPATCH(1:4)=='GXBL') THEN ! Boundary-layer profile
CALL GXBLIN ! Boundary-layer inlet profile facility
ENDIF
GO TO 25
C*****************************************************************
C
C
C--- GROUP 12. Convection and diffusion adjustments
C
12 CONTINUE
GO TO 25
C*****************************************************************
C
C
C--- GROUP 13. Boundary conditions and special sources
C
C * XCYCLE may be changed in group 19.
C
C Sections 1 to 11 for CO
C Sections 12 to 22 for VAL
13 NPAT= NPATCH(1:4)
c.... "Un-comment" call to accutm('grp 13') in three places below, in
c order to compute and print cumulative time spent in group 13.
c Such calls can be placed anywhere; but, since accutm itself takes
c a not-insignificant amount of computer time, they are best
c "commented" when not needed
c
c call accutm('grp 13',1)
c
IF(ISVROB) THEN ! Momentum sources due to swirling fan object
IF(NAMGRD/='HTBX'.AND.NAMGRD/='FLAR') CALL SWIRFAN
ENDIF
IF(NPATCH(1:4)=='BLIN'.OR.NPATCH(1:4)=='GXBL') THEN ! Boundary-layer inlet profile
CALL GXBLIN
ELSEIF(NPATCH(1:3)=='FIR') THEN
CALL GXFIRE ! FIRE
ELSEIF(NPATCH(1:6)=='DENDIF') THEN
IF(INDVAR>2.AND.INDVAR<9) CALL GXDENDIF ! density difference
ELSEIF(NPAT=='KESO') THEN ! Sources of turbulence energy and
!dissipation rate GXKESO
c.... "Un-comment" call to accutm('ke sor') in three places below, in
c order to compute and print cumulative time spent in GXKESO
c call accutm('ke sor',1)
CALL GXKESO(VIST,LEN1,VISL,FIXVAL)
IF(.NOT.LSG4.AND.ISG60==1.AND.ISG62==0)
1 CALL PB2_KESO(VIST,LEN1,VISL,FIXVAL)
c call accutm('ke sor',2)
c if(isweep==lsweep-1.and.istep==lstep)
c 1 call accutm('ke sor',1)
ELSEIF(NPAT=='KEBU') THEN
CALL GXKEGB
C
ELSEIF(NPAT=='RNGM') THEN ! Extra source of EP in RNG k-e model
IF(INDVAR==EP) CALL GXRNGM(VIST,LEN1,FIXFLU)
ELSEIF(NPAT=='KECH') THEN ! Extra source of EP in Chen-Kim k-e model
IF(INDVAR==EP.AND.ISC==16) THEN
L0G=L0F(GEN1); L0K=L0F(KE); L0VAL=L0F(VAL); L0VIST=L0F(VIST)
L0CO=L0F(CO)
DOIT=IENUTA==3.OR.IENUTA==4
DO I=1,NXNY
IF(SLD(I).OR.F(KAP+I)>FIXVAL) THEN
F(L0VAL+I)=0.0; F(L0CO+I)=0.0
ELSE
F(L0VAL+I)=0.25*F(L0G+I)*F(L0G+I)*F(L0VIST+I)*F(L0VIST+I)
1 /(F(L0K+I)+TINY)
IF(DOIT) F(L0VAL+I)=F(L0VAL+I)*F(L0FONE+I)
ENDIF
ENDDO
ENDIF
ELSEIF(NPAT=='SASO') THEN
IF(IENUTA==21.OR.IENUTA==22) CALL GX_SPALART_ALLMARAS
ELSEIF(NPAT=='REKE') THEN
IF(IENUTA==14) CALL GX_REALISABLE_KE
ELSEIF(NPAT=='KWSO') THEN
IF(IENUTA==10.OR.IENUTA==11) CALL GXKW_WILCOX
IF(IENUTA==15.OR.IENUTA==16) CALL GXKW_WILCOX
IF(IENUTA.GE.17.AND.IENUTA.LE.20) CALL GXKW_MENTER
ELSEIF(NPAT=='TSKE') THEN
IF(IENUTA==7) CALL GXTSKE(VIST,LEN1,FIXFLU)
ELSEIF(NPAT=='EYAP') THEN
IF(ILTLS>0) CALL GXEYAP
ELSEIF(NPAT=='BUOY') THEN ! Sources of momentum caused by buoyancy GXBUOY
CALL GXBUOY(BFC,CARTES,PARAB,DEN1,DEN2)
ELSEIF(NPAT=='STEN') THEN ! Sources of momentum caused by surface tension GXSURFT
CALL GXSURFT
ELSEIF(NPAT=='CLDA') THEN ! Conservative low-dispersion algorithm GXCLDA
CALL GXCLDA
ELSEIF(NPAT=='HOCS') THEN ! Higher-order schemes for convection GXHOCS
CALL GXHOCS
C.... Exit boundary condition for Supersonic flow Z-direction.
ELSEIF(NPAT=='OUTL') THEN
IF(INDVAR==P1) THEN
IF(ISC==13) THEN
INDW=ITWO(W1,LBNAME('WCRT'),.NOT.BFC)
CALL FN21(VAL,LOW(INDW),LOW(DEN1),0.0,-0.995)
ENDIF
ENDIF
C
C.... The following call to GXNEPA
C allows the "values" used in a COVAL command to be chosen as
C the "neighbour-values" of the cell in specified space, time or
C "variable-space" directions. The condition for the call is that
C the PATCH name should begin with the characters NE.
ELSEIF(NPAT(1:2)=='NE') THEN
CALL GXNEPA(NPAT)
C
C.... The following call to GXPOLR
C fixes the u- and v-velocities at the circumferential boundary of a
C cylindrical-polar domain for uniform flow at speed POLRA
ELSEIF(NPAT(2:4)=='POL') THEN
IF(.NOT.CARTES) CALL GXPOLR(NPAT(1:2))
C
C.... Sources used to set profiles GXPROF
ELSEIF(NPAT=='PROF') THEN
CALL GXPROF(DEN1,RHO1,FIINIT(H1))
C
C.... Calculate radiation sources . GXRADI
ELSEIF(NPAT=='RADI') THEN
CALL GXRADI(CARTES,TEMP1,DEN1,RHO1)
C
C.... Centrifugal & Coriolis forces due to rotation of
C coordinate system about axis of cylindrical-polar
C system. GXROTA
ELSEIF(NPAT=='ROTA' .AND. .NOT.GCV) THEN
IF(.NOT.CARTES.OR.BFC) CALL GXROTA(BFC,NX)
C
C.... Velocity resolutes at a curved inlet boundary GXBFC
ELSEIF(NPAT(1:3)=='BFC') THEN
CALL GXBFC
C
C.... Time-varying sources GXTIM
ELSEIF(NPAT(1:3)=='TIM') THEN
IF(NEZ(TIMA)) CALL GXTIM
C
C.... Sources provided for single-slab solution of fully-
C developed flow GXFDFS
ELSEIF(NPAT(1:3)=='FDF') THEN
CALL GXFDFS
C
C.... Chemical-reaction source GXCHSO
ELSEIF(NPAT=='CHSO') THEN
IF(.NOT.EXPLOS) THEN
CALL GXCHSO(TEMP1)
ENDIF
C
C.... Scalar fluctuations source GXFSQS
ELSEIF(NPAT=='FSQS') THEN
CALL GXFSQS
C.... Chemical-reaction sources, inlet properties and
C something else - from CHEMKIN GXCHKI
ELSEIF(NPATCH(1:5)=='CHEMK'.OR.NPATCH(1:4)=='NOCP'.OR.
1 NPATCH(1:6)=='CHEMID'.OR.NPATCH(1:5)=='CKWAL') THEN
IF(CHMKIN) CALL GXCHKI(0,0.0)
C.... Finite-rate chemical source terms for extended SCRS model
ELSEIF(ESCRS.AND.NPAT=='SCRS') THEN
CALL GXSCRI
!!! ELSEIF(LSG87) THEN
!!! CALL GXTCALC(0,0.0)
C.... Two-phase-flow patches
ELSEIF(.NOT.ONEPHS) THEN
C.... Momentum source caused by lateral gravity
C in 2-phase flow GXLATG
IF(NPAT=='LATG') THEN
CALL GXLATG
C.... Tentative length-scale source for two-fluid turbulence model
ELSEIF(NPAT=='LESO') THEN
CALL GXLESO('SOUTH')
C.... Shear source of lateral velocity for the 2-fluid
C turbulence model GXSHSO
ELSEIF(NPAT=='SHSO') THEN
CALL GXSHSO(INTFRC,LEN1)
C.... Sources providing for upwinding of the interphase
C transport terms GXIPST
ELSEIF(NPAT(1:4)=='IPST') THEN
CALL GXIPST(INTFRC,CINT(INDVAR),NPATCH)
C.... Sources of momentum for interfacial pressure GXINTP
ELSEIF(NPAT=='INTP') THEN
IF(NEZ(CPIP).AND.ISC==16) CALL GXINTP
C.... Sources of momentum for interfacial lift GXLIFT
ELSEIF(NPAT=='LIFT') THEN
IF(NEZ(CLIFT).AND.ISC==16) CALL GXLIFT
C.... Turbulence modulation due to presence of particles GXDISP
ELSEIF(NPAT=='KEDI') THEN
CALL GXDISP
ENDIF
ENDIF
IF(ISC==13) THEN
IF(.NOT.GCV) THEN
IF(INDVAR>=U1.AND.INDVAR<=W2) THEN
C.... Deduced inflow velocity at fixed-pressure outlet GXOUTLET
CALL GXOUTLET
ENDIF
ELSE
IF(INDVAR==IUC1GCV.OR.INDVAR==IVC1GCV.OR.INDVAR==IWC1GCV) THEN
C.... Deduced inflow velocity at fixed-pressure outlet GXOUTLET
CALL GXOUTLET
ENDIF
ENDIF
ENDIF
C.... Angled inlet and outlet GXIO
IF(LGXIO) CALL GXIO
IF(LSUN) CALL GXSUN
C
IF(LSG62) CALL GXNOX
IF(LSG63) CALL GXNOX
c call accutm('grp 13',2)
c if(isweep==lsweep-1.and.istep==lstep) call accutm('grp 13',3)
GO TO 25
C***************************************************************
C
C
C--- GROUP 14. Downstream pressure for PARAB=.TRUE.
C
14 CONTINUE
GO TO 25
C***************************************************************
C * Make changes for these groups 15, 16, 17 & 18 only in group 19.
C***************************************************************
C
C
C--- GROUP 19. Special calls to GROUND from EARTH
C
19 GO TO (191,192,193,194,195,196,197,198,199,1910,1911),ISC
C
C * ----------GROUP 19 SECTION 1 ---- START OF TIME STEP.
191 CONTINUE
C.... Print or compute new grid and geometry
IF(MOVBFC) CALL GXBFGR
C.... Call to GXMOBS to modify blockages:
C * either to introduce complex initial field for steady cases;
C * or moving obstacles/blockages for unsteady cases; or both.
IF(IPORIB==1.OR.IPORIB==2) CALL GXMOBS
C.... Multiply DYG2D by EPOR, for thin-film lubrication
IF(ADJEPR) CALL FN26(DYG2D,EPOR)
C.... Call GXPIST to expand and contract the grid in accordance
C with the kinematics of crankshaft-connecting-rod mechanisms.
IF(NEZ(W1AD)) THEN
IF(NEZ(AZW1))
1 CALL GXPIST(ISTEP,NZ,TIM,DT,ISWEEP,LSWEEP,NPRINT,NTPRIN)
ENDIF
IF(RESET.AND..NOT.EXPLOS) THEN
CALL GXRSET
ENDIF
IF(.NOT.STEADY.AND.LSUN) CALL GXSUN
IF(.NOT.STEADY.AND.BLIN) CALL GXBLIN
C
GO TO 25
c * ----------group 19 section 2 ---- start of sweep.
192 CONTINUE
IF(SURFT) CALL GXSURFT
IF(MOVBFC) CALL GXBFGR
IF(CHMKIN) CALL GXCHKI(0,0.0)
IF(.NOT.DONE192.AND.IDISPA/=0.AND.ISWEEP==1) THEN ! dumping on start of sweep 1
I1=ITWO(3,2,PNAM(1:2)=='SW')
IF(PNAM(I1:I1+1)=='IN') THEN ! PNAM ends in IN so dump initial field
IF(STEADY.OR.(.NOT.STEADY.AND.(I1==3.OR.(I1==2.AND.
1 ISTEP==1)))) THEN
ISTP0=FSTEP ; ISWP0=FSWEEP ; FSTEP=0 ; FSWEEP=0
ISTP1=ISTEP ; ISWP1=ISWEEP ; ISTEP=0 ; ISWEEP=0
TIM0=TIM; TIM=0.0
CALL DUMPS(PNAM(1:1),GNAM(1:1),0,1,0,1)
FSTEP = ISTP0 ; FSWEEP=ISWP0 ; DONE192=.TRUE.
ISTEP = ISTP1 ; ISWEEP=ISWP1 ; TIM=TIM0
ENDIF
ENDIF
ENDIF
GO TO 25
C * ----------GROUP 19 SECTION 3 ---- START OF IZ SLAB.
C.... Modify porosities
193 IF(IPORIA/=0) THEN
CALL GXPORA(SETPOR)
IF(BFC) THEN
CALL BGEOM(1)
CALL BGEOM(2)
ENDIF
ENDIF
C
IF(LBMARK/=0) L0MARK= L0F(LBMARK)
GO TO 25
C
C * ------------------- SECTION 4 ---- Start of iterations over slab.
C
194 CONTINUE
IF(SURFT) CALL GXSURFT
IF(KEBUOY) CALL GXKEGB
C.... Set DOSKIN to true for WALL patches and correct G-function
IF(TURB) THEN
IF(NMWALL>0) CALL GXWFUN
ENDIF
C.... GXBLIN compute PASQUILL-F profiles for buoyancy forces
IF(PASQBUOY) CALL GXBLIN
IF(IENUTA==10.OR.IENUTA==11) CALL GXKW_WILCOX
IF(IENUTA==15.OR.IENUTA==16) CALL GXKW_WILCOX
IF(IENUTA.GE.17.AND.IENUTA.LE.20) CALL GXKW_MENTER
Call realisable k-e model after upgrading of G-function in E2conn for walls
IF(IENUTA.EQ.14) CALL GX_REALISABLE_KE
IF(IENUTA.EQ.21.OR.IENUTA.EQ.22) CALL GX_SPALART_ALLMARAS
C.... Calculate phase-average z-direction velocities
C Copy coding if velocities for other directions are required
IF(.NOT.ONEPHS) THEN
IF(LBWAVE>0) THEN
L0WAVE=L0F(LBWAVE)
L0R1=L0F(9); L0R2=L0F(10)
L0W1=L0F(7); L0W2=L0F(8)
RH1=1.0/RHO1A; RH2=1.0/RHO2A
DO 1940 I=1,NXNY
F(L0WAVE+I)=(F(L0W1+I)*F(L0R1+I)*RH1 +
1 F(L0W2+I)*F(L0R2+I)*RH2) /
1 (F(L0R1+I)*RH1 + F(L0R2+I)*RH2)
1940 CONTINUE
if(dbgrnd) call prn('wave',lbwave)
ENDIF
C
IF(STORE(P2)) THEN
IF(STORE(VPOR)) THEN
C.... Extra second-phase pressure proportional to volume fraction
C divided by porosity.
CALL FN15(P2,R2,VPOR,0.0,PHS2PA)
ELSE
IF(PHS2P) THEN
C.... Extra second-phase pressure proportional to:
C a*(r2-r2crit)**b if r2 gt r2crit.
L0R2=L0F(R2)
L0P2=L0F(P2)
RLX=ABS(DTFALS(P2))
DO 1941 I=1,NXNY
IF(F(L0R2+I)>PHS2PA) THEN
GP2=PHS2PB*(F(L0R2+I)-PHS2PA)**PHS2PC
ELSE
GP2=0.0
ENDIF
F(L0P2+I)=RLX*GP2+(1.0-RLX)*F(L0P2+I)
1941 CONTINUE
ELSE
C.... Extra second-phase pressure proportional to volume fraction
CALL FN2(P2,R2,0.0,PHS2PA)
ENDIF
ENDIF
ENDIF
ENDIF
IF(LSG62) CALL GXNOX
IF(LSG63) CALL GXNOX
C.... Calculate derivatives of phase 1 temperature
IF(ITEM1>0.OR.TEMP1>0) THEN
LBSCAL= ITWO(ITEM1,TEMP1,ITEM1>0); L0SCAL=L0F(LBSCAL)
IF(ISDTDX.AND.NX>1) THEN
L0DTDX= L0F(LBDTDX)
CALL FN1(-L0DTDX,0.0)
CALL FNDFDX(L0SCAL,L0DTDX,IZSTEP,.TRUE.)
ENDIF
IF(ISDTDY.AND.NY>1) THEN
L0DTDY= L0F(LBDTDY)
CALL FN1(-L0DTDY,0.0)
CALL FNDFDY(L0SCAL,L0DTDY,IZSTEP,.TRUE.)
ENDIF
IF(ISDTDZ.AND.NZ/=1.AND..NOT.PARAB) THEN
L0DTDZ= L0F(LBDTDZ)
CALL FN1(-L0DTDZ,0.0)
CALL FNDFDZ(L0SCAL,L0DTDZ,IZSTEP,.TRUE.)
ENDIF
ENDIF
C.... Calculate derivatives of phase 2 temperature
IF(ITEM2>0.OR.TEMP2>0) THEN
LBSCAL= ITWO(ITEM2,TEMP2,ITEM2>0); L0SCAL=L0F(LBSCAL)
IF(ISDTX2.AND.NX>1) THEN
L0DTDX= L0F(LBDTX2)
CALL FN1(L0DTDX,0.0)
CALL FNDFDX(L0SCAL,L0DTDX,IZSTEP,.TRUE.)
ENDIF
IF(ISDTY2.AND.NY>1) THEN
L0DTDY= L0F(LBDTY2)
CALL FN1(L0DTDY,0.0)
CALL FNDFDY(L0SCAL,L0DTDY,IZSTEP,.TRUE.)
ENDIF
IF(ISDTZ2.AND.NZ/=1.AND..NOT.PARAB) THEN
L0DTDZ= L0F(LBDTZ2)
CALL FN1(L0DTDZ,0.0)
CALL FNDFDZ(L0SCAL,L0DTDZ,IZSTEP,.TRUE.)
ENDIF
ENDIF
GO TO 25
1911 CONTINUE
C * ------------------- SECTION 11---- After calculation of convection
C fluxes for scalars, and of volume
C fractions, but before calculation of
C scalars or velocities
IF(.NOT.ONEPHS) THEN
IF(NEZ(CPIP)) CALL GXINTP
IF(NEZ(CLIFT)) CALL GXLIFT
ENDIF
GO TO 25
199 CONTINUE
C * ------------------- SECTION 9 ---- Start of solution sequence for
C a variable
IF(FSQSOR.AND.INDVAR==LBNAME('FSQ')) CALL GXFSQS
GO TO 25
1910 CONTINUE
C * ------------------- SECTION 10---- Finish of solution sequence for
C a variable
IF(CHMKIN) CALL GXCHKI(0,0.0)
GO TO 25
C
C * ------------------- SECTION 5 ---- Finish of iterations over slab.
195 IF(POTVEL) THEN ! Compute velocities from potential differences.
IF(ISWEEP/=1) THEN
CALL GXPOTV(EPOR,NPOR,HPOR,NZ,DZG,BFC)
IF(POTCMP.AND.ISWEEP>2)
1 CALL GXPOTC(EPOR,NPOR,HPOR,PORIA,PORIB,NZ) ! allow for
ENDIF ! compressibility flow.
ENDIF
IF(PSIVEL) CALL GXPSIV(BFC) ! deduce velocities from stream function psi
IF(FDFSOL) CALL GXFDFS ! fully-developed flow
IF(CHMKIN) CALL GXCHKI(0,0.0) ! chemkin
C.... Turbulence-energy generation rates
IF(LBGENK/=0) CALL FN21(LBGENK,GEN1,VIST,0.0,1.0) ! phase 1
IF(LBGNK2/=0) CALL FN21(LBGNK2,GEN2,VIST,0.0,1.0) ! phase 2
IF(LBVLSQ/=0) CALL FNVLSQ(LBVLSQ,1) ! sum of squares of phase1 velocity
IF(LBVABS/=0) THEN ! absolute velocity, i.e. SQRT(VLSQ)
IF(LBVLSQ/=0) THEN
CALL FN30A(LBVABS,LBVLSQ) ! VABS is SQRT(VLSQ)
ELSE
CALL FNVLSQ(LBVABS,1) ! put VLSQ in VABS, then take square root
CALL FN30A(LBVABS,LBVABS) ! VABS is SQRT(VLSQ)
ENDIF
IF(ISCREY) THEN
L0VOL =L0F(VOL) ; L0VIST=L0F(VIST) ; L0VISL=L0F(VISL)
L0CREY=L0F(LBCREY) ; L0VABS=L0F(LBVABS)
DO I=1,NXNY
IF(.NOT.SLD(I)) F(L0CREY+I)=F(L0VABS+I)*F(L0VOL+I)**0.3333/
1 (F(L0VIST+I)+F(L0VISL+I))
ENDDO
ENDIF
ENDIF
IF(LBVAB2/=0) THEN ! absolute velocity, phase 2
CALL FNVLSQ(LBVAB2,2) ! put VLSQ in VABS, then take square root
CALL FN30A(LBVAB2,LBVAB2) ! VABS is SQRT(VLSQ)
ENDIF
IF(ISTREY) THEN
L0VIST=L0F(VIST); L0VISL=L0F(VISL); L0TREY=L0F(LBTREY)
DO I=1,NXNY
IF(.NOT.SLD(I)) F(L0TREY+I) = F(L0VIST+I)/F(L0VISL+I)
ENDDO
ENDIF
IF(ESCRS) CALL GXSCRI
C....Mach number calculation for Compressible Flow; it must be
c done here as parab=t field printout precedes gr 19 sc 6
IF(PARAB) THEN
IF(LBMACH/=0.OR.LBPTOT/=0)
1 CALL GXMACH(LBMACH,LBPTOT,LBVABS,0.,1)
IF(.NOT.ONEPHS) THEN
IF(LBMAC2/=0.OR.LBPTO2/=0)
1 CALL GXMACH(LBMAC2,LBPTO2,LBVAB2,0.,2)
IF(SLIPVL) THEN ! conditionally compute the slip velocities
IF(LBSLU/=0) CALL FN10(LBSLU,U1,U2,0.0,1.0,-1.0)
IF(LBSLV/=0) CALL FN10(LBSLV,V1,V2,0.0,1.0,-1.0)
IF(LBSLW/=0) CALL FN10(LBSLW,W1,W2,0.0,1.0,-1.0)
ENDIF
ENDIF
ENDIF
GO TO 25
C
C GROUP 19 SECTION 6 Finish of iz slab
196 IF(PARAB) THEN
IF(IDISPA>0) CALL GXPARA
ELSEIF(ARRIVT) THEN
IF(ISWEEP==LSWEEP) CALL GXARRT
ENDIF
C....Mach number calculation for Compressible Flow
IF(.NOT.PARAB) THEN
IF(LBMACH/=0.OR.LBPTOT/=0)
1 CALL GXMACH(LBMACH,LBPTOT,LBVABS,0.,1)
IF(.NOT.ONEPHS) THEN
IF(LBMAC2/=0.OR.LBPTO2/=0)
1 CALL GXMACH(LBMAC2,LBPTO2,LBVAB2,0.,2)
C.... For two-phase flow, conditionally compute the slip velocities
IF(SLIPVL) THEN
IF(LBSLU/=0) CALL FN10(LBSLU,U1,U2,0.0,1.0,-1.0)
IF(LBSLV/=0) CALL FN10(LBSLV,V1,V2,0.0,1.0,-1.0)
IF(LBSLW/=0) CALL FN10(LBSLW,W1,W2,0.0,1.0,-1.0)
ENDIF
ENDIF
ENDIF
IF(LSG62) CALL GXNOX
IF(LSG63) CALL GXNOX
IF(BLIN) CALL GXBLIN ! Boundary-layer inlet profile facility
IF(IZ0) CALL DMPDSP
ENDIF
GO TO 25
C
C GROUP 19 SECTION 7 FINISH OF SWEEP.
197 CONTINUE
C
C.... Sequence permitting intervention to terminate execution
C when a file named STOPJOB exists, for example created by
C editing in a second window
C Note that the name stopjob will not suffice on case-sensitive
C systems such as UNIX
C Note that this may not work on all computer systems, in which
C case the coding from here to STOPJOB END below should be
C deactivated.
IERR=-1
ISTOP=5
IF(MOD(ISWEEP,ISTOP)==0) THEN
IF(MIMD.AND.NPROC>1) THEN
IF(MYID==0) THEN
IF(LUNIT(26)/=0) CALL OPENZZ(26,IERR)
ENDIF
c... pass first proc IERR value to others
CALL RTFSII(IERR)
ELSE
IF(LUNIT(26)/=0) CALL OPENZZ(26,IERR)
ENDIF
ENDIF
IF(IERR==0) THEN
ENUFSW=.TRUE.
LSTEP=ISTEP
LSWEEP=ISWEEP+1
LUNIT(26)=0
CALL WRIT40('file stopjob found; execution stopped ')
CALL WRYT40('file stopjob found; execution will be ')
CALL WRYT40('stopped after completion of print-out ')
ENDIF
c.... stopjob end
IF(CHMKIN) CALL GXCHKI(0,0.0)
C.... Print-out of Y+, stress and Stanton number at WALL-type patches
IF(TURB) THEN
IF(NMWALL>0) THEN
IF(.NOT.NULLPR.AND.(YPLS .OR. WALPRN)) CALL GXYPLS
ENDIF
ENDIF
c
C.... "Time-out" sequence activated by setting the PIL variable ISG20
C equal to the maximum number of seconds which the run may take.
IF(ISG20>0) THEN
CALL SECONDS(NUMSEC)
IF(NUMSEC>=ISG20) THEN
CALL WRITST
CALL WRIT40('Execution "timed out" at numsec seconds')
CALL WRIT1I(' numsec',ISG20)
CALL WRITST
ENUFSW=.TRUE. ; LSTEP=ISTEP
IF(ISWEEP/=LSWEEP) LSWEEP=ISWEEP+1
ENDIF
ENDIF
c
c.... print-out elicited by SPEDAT('PRINT', ... statements in Q1
IF(ISWEEP==FSWEEP) THEN
IF(ISTEP==1) THEN
c.... get number of special-print commands
NUMSPPR=0
CALL GETSDI('PRINT','NUMBER',NUMSPPR)
ENDIF
ENDIF
IF(TIMPRN.AND.SWPRIN.AND..NOT.NULLPR) THEN
C
IF(LBVOXY>0) L0VOXY=M0F1(LBVOXY)
IF(LBVOYZ>0) L0VOYZ=M0F1(LBVOYZ)
IF(LBVOZX>0) L0VOZX=M0F1(LBVOZX)
C
IF(LBVOXY>0.OR.LBVOYZ>0.OR.LBVOZX>0) THEN
DO IZZ = 1,NZ
DO IX=1,NX
DO IY=1,NY
I3D=IY+(IX-1)*NY+(IZZ-1)*NFM
IF(LBVOXY/=0) F(L0VOXY+I3D)=VORTXY(1,IX,IY,IZZ)
IF(LBVOYZ/=0) F(L0VOYZ+I3D)=VORTYZ(1,IX,IY,IZZ)
IF(LBVOZX/=0) F(L0VOZX+I3D)=VORTZX(1,IX,IY,IZZ)
ENDDO
ENDDO
ENDDO
ENDIF
ENDIF
IF(NUMSPPR>0) THEN
IF(TIMPRN.AND.SWPRIN.AND..NOT.NULLPR) THEN
call writ40('Special print-out via spedat commands')
c.... how many commands?
DO I=1,NUMSPPR
c.... get the command
CALL GETSDC('PRINT','COMMAND'//DIGIT(I),COMMAND)
c.... carry out the commands
IF(COMMAND(1:3)=='POW') THEN
c.... do this before the istep test so that result is included in phi
CALL GETSDR('PRINT','POWER',POWER)
IF(MOD(ISTEP,NTPRIN)==0) THEN
CALL WRIT40(COMMAND(10:13)//
1 'holds "power-lawed" values of '
1 //COMMAND(5:8))
CALL WRIT1R('power ',POWER)
ENDIF
CALL PUT_POWER( COMMAND(5:8) , COMMAND(10:13),POWER )
CALL WRITBL
ELSEIF(MOD(ISTEP,NTPRIN)==0) THEN
CALL WRIT40('Spedat print command is '//command)
IF(COMMAND(1:3)=='AVE') THEN
CALL AVERAGE(AVE,COMMAND(5:8))
CALL WRIT40
1 ('mass-average value of '//COMMAND(5:8))
CALL WRIT1R('average ',AVE)
CALL WRITBL
ELSEIF(COMMAND(1:5)=='TOTAL') THEN
CALL SUMALL(SUM,COMMAND(7:10))
CALL WRIT40('total whole-domain amount of '//
1 COMMAND(7:10))
CALL WRIT1R('TOTAL ',SUM)
CALL WRITBL
ELSEIF(COMMAND(1:6)=='MINMAX') THEN
CALL WRIT40('hilo3d called for '//COMMAND(8:11))
CALL HILO3D(LBNAME(COMMAND(8:11)))
CALL WRIT2R('MinValue',RLOW3D,'MaxValue',HI3D)
CALL WRITBL
ELSEIF(COMMAND(1:5)=='VALUE') THEN
CALL GETSDI('PRINT','IXLOC',IXLOC)
CALL GETSDI('PRINT','IYLOC',IYLOC)
CALL GETSDI('PRINT','IZLOC',IZLOC)
CALL GETVAL(COMMAND(7:10),IXLOC,IYLOC,IZLOC)
ENDIF
ENDIF
ENDDO
ENDIF
ENDIF
C.... Dump fields after each IDISPA sweeps, eg for PHOTON viewing
IF(IDISPA/=0) THEN
IF(PNAM(1:2)=='SW') THEN
IF(STEADY) THEN
CALL DUMPS(PNAM(1:1),GNAM(1:1),ISWEEP,IDISPA,IDISPB,IDISPC)
ELSE
STEADY=.TRUE.
CALL DUMPS(PNAM(1:1),GNAM(1:1),ISWEEP,IDISPA,1,LSWEEP)
STEADY=.FALSE.
DONE192=.FALSE.
ENDIF
IF(CALFOR) THEN
IDSPB=ITWO(1,IDISPB,IDISPB==0)
IDSPC=ITWO(LSWEEP,IDISPC,IDISPC==0)
IDSPA=ITWO(1,IDISPA,IDISPA==0)
IF(ISWEEP>=IDSPB.AND.ISWEEP<=IDSPC.AND.
1 MOD(ISWEEP,IDSPA)==0) THEN
CALL FORCES(1) ! Integrate
CALL FORCES(3) ! Output to table file
ENDIF
ENDIF
ENDIF
ENDIF
C.... Angled inlet and outlet GXIO
IF(LGXIO) CALL GXIO
IF(BLIN) CALL GXBLIN ! Boundary-layer inlet profile facility
GO TO 25
C
C GROUP 19 SECTION 8 FINISH OF TIME STEP.
198 CONTINUE
C.... Save fields and cell-corner coordinates to a series of files,
C for examination via VR-Viewer or PHOTON
C.... PNAM and GNAM are the names of the field and (if BFC)
C grid files, and IDISPA is the frequency of dumping.
C They are EQUIVALENCEd in the included Common file GRDLOC to the
C PIL variables CSG1 and CSG2, and can therefore be set in the
C satellite, eq by the line:
C CSG1=PHI;CSG2=XYZ;IDISPA=1
C which will create files p1da or p1, p2da or p2, etc, & x1da or x1,
C etc according to whether phida and xyzda are true (the default)
C or false in the PREFIX file
C
!!! IF(LSG87) CALL GXTCALC(0,0.0)
IF(PNAM(1:2)/='SW'.AND.IDISPA/=0) THEN
LGTEMP=BFC ; BFC=BFC.OR.NOTBFC
CALL DUMPS(PNAM(1:1),GNAM(1:1),ISTEP,IDISPA,IDISPB,IDISPC)
BFC=LGTEMP
IF(CALFOR) THEN
IDSPB=ITWO(1,IDISPB,IDISPB==0)
IDSPC=ITWO(LSTEP,IDISPC,IDISPC==0)
IDSPA=ITWO(1,IDISPA,IDISPA==0)
IF(ISTEP>=IDSPB.AND.ISTEP<=IDSPC.AND.MOD(ISTEP,IDSPA)==0) THEN
CALL FORCES(1) ! Integrate
CALL FORCES(3) ! Output to table file
ENDIF
ENDIF
C... Save monitor plot image for each time step
GXMON=(TSTSWP/=0)
CALL GETSDL('GXMONI','TRANSIENT',GXMON)
IF(GXMON) THEN
IFST=ITWO(FSTEP,IDISPB,IDISPB==0) ! first step to dump
ILST=ITWO(LSTEP,IDISPC,IDISPC==0) ! last step to dump
GXMON=ISTEP>=IFST.AND.ISTEP<=ILST.AND.
1 MOD(ISTEP,IDISPA)==0
ENDIF
IF(GXMON) THEN
IF(PLTCLSX) THEN
COMMAND='gxmoni'
IF (ISTEP>=100000) THEN
WRITE (COMMAND(7:12),FMT='(BN,I6)') ISTEP
ELSEIF(ISTEP>=10000) THEN
WRITE (COMMAND(7:11),FMT='(BN,I5)') ISTEP
ELSEIF(ISTEP>=1000) THEN
WRITE (COMMAND(7:10),FMT='(BN,I4)') ISTEP
ELSEIF(ISTEP>=100) THEN
WRITE (COMMAND(7:9),FMT='(BN,I3)') ISTEP
ELSEIF(ISTEP>=10) THEN
WRITE (COMMAND(7:8),FMT='(BN,I2)') ISTEP
ELSE
WRITE (COMMAND(7:7),FMT='(BN,I1)') ISTEP
ENDIF
LL=LENGZZ(COMMAND)
CALL DUMPZZ(COMMAND(1:LL),LL)
ELSE
!DEC$ IF .NOT.DEFINED(LINUX) .AND. DEFINED(_X64_)
!DEC$ ATTRIBUTES C, ALIAS : 'AllStepsONC' :: SDASCON
!cs interface code
!! IF(ISTEP==IFST.OR.ISTEP==ILST) THEN
CALL SDASCON() ! toggle dumping on
!------------------------------------------------------
!this block is necessary for the super fast cases
!it pauses earth immediately after sending signal to take screenshots
!otherwise the data in the gui may skip a few sweeps before it starts the screenshot r
!corresponding unpause call in abstractions.screenShotAll(special==1)
!DEC$ ATTRIBUTES C, ALIAS : 'earTogglePause' :: ETP
CALL ETP()
!------------------------------------------------------
!! ENDIF
!DEC$ ENDIF
ENDIF
ELSE
!DEC$ IF .NOT.DEFINED(LINUX) .AND. DEFINED(_X64_)
IF(.NOT.PLTCLSX) THEN
!! IF(ISTEP==IFST.OR.ISTEP==ILST) THEN
!DEC$ ATTRIBUTES C, ALIAS : 'dumpAllStepsOFFC' :: SDASCOFF
CALL SDASCOFF() ! toggle dumping off
!! ENDIF
ENDIF
!DEC$ ENDIF
ENDIF
ENDIF
C
IF(MOVBFC) THEN
C.... Print-out versus time by use of GRAPH
TIME(ISTEP)=TIM
C.... set ordinate values
OR(ISTEP,1)=VARONE(LBNAME('VOLU'),1,1)
OR(ISTEP,2)=VARONE(P1,1,1)
IF(ISTEP/=LSTEP) GO TO 25
C.... call GRAPH
C.... set ordinate labels
LABOR(1)='VOLU' ; LABOR(2)='PRES'
IOSC(1)=1 ; IOSC(2)=2 ; IOSC(3)=3 ; IOSC(4)=4
NABDIM=100 ; NORDIM=10 ; NOR=2
ABSIZ=0.6 ; ORSIZ=0.4
C
CALL GRAPH(TIME,NABDIM,ISTEP,'TIME',OR,NORDIM,NOR,
1 LABOR,IOSC,ABSIZ,ORSIZ,3,LUPR1)
C.... end of GRAPH sequence
ENDIF
C
IF(.NOT.STEADY) THEN
IF(.NOT.PARAB.AND.IDISPA>0.AND.PNAM==' ') CALL GXPARA
IF(IDISPD>0) CALL DMPDSP
ENDIF
GO TO 25
C***************************************************************
C
C
C--- GROUP 20. Preliminary print-out
C
20 IF(ECHO) THEN ! echo all 25 data groups to RESULT file
CALL DATPRN(Y,Y,Y,Y, Y,Y,Y,Y, Y,Y,Y,Y, Y,Y,Y,Y,
1 Y,Y,Y,Y, Y,Y,Y,Y, Y)
ELSE ! echo only data group 1 to RESULT
CALL DATPRN(Y,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N)
ENDIF
GO TO 25
C***************************************************************
C
C--- GROUP 21. Special print-out to screen
21 CONTINUE
GO TO 25
C***************************************************************
C * Make changes for these groups 22 and 23 only in group 19.
C***************************************************************
C
C
C--- GROUP 24. Dumps for restarts
C
24 CONTINUE
C * Insert CALL DUMP where required in group 19.
C
25 CONTINUE
if(test) call fcheck(25,'grex3 ')
C***************************************************************
C
IF(SPCLGR) THEN
C.......................................... special GROUNDS
C.... S2SR, for surface-to-surface radiation
IF(S2SR) THEN
RADCVD = .FALSE.
CALL GETSPD('CVD','RADCVD',3,RDUM,IDUM,RADCVD,' ',IERR)
C.... Only call GXS2SR GR.9, SEC 7 when INDVAR is temperature
IF(INDVAR==ITEM1.OR..NOT.(IGR==9.AND.ISC==7)) THEN
IF(RADCVD) THEN
CALL GXS2SR_CVD
ELSE
CALL WRIT40('Please set:')
CALL WRIT40('SPEDAT(SET,CVD,RADCVD,L,T)')
CALL WRIT40('in Q1')
CALL SET_ERR(587,'Old S2SR not supported',1)
ENDIF
ENDIF
ENDIF
IF(NAMGRD=='NONE') THEN
C....NONE
ELSEIF(NAMGRD=='FURN') THEN
C....FURN
CALL FURNGR
C.... ESTER, the aluminium-smelter module
ELSEIF(NAMGRD=='ESTR') THEN
CALL ESTRGR
C....HOTBOX
ELSEIF(NAMGRD=='HTBX') THEN
CALL HTBXGR
C....TACT
ELSEIF(NAMGRD=='TACT') THEN
CALL TACTGR
C....COMPRESSIBLE
ELSEIF(NAMGRD=='CONV') THEN
CALL GXCONV
C....CVD
ELSEIF(NAMGRD=='CVD ') THEN
CALL GXCVD
C....MICA special GROUND's
ELSEIF(NAMGRD=='MICA') THEN
CALL MICAGR
C... F1 - calculates drag and lift for formula-1 car
ELSEIF(NAMGRD=='F1') THEN
CALL F1GRD
C... Water cooled steam condenser WATSTCON
ELSEIF(NAMGRD=='WATS') THEN
CALL GXCOND
ELSEIF(NAMGRD=='WAVE') THEN
CALL GXWAVE
ENDIF
ENDIF
if(test) call fcheck(26,'grex3 ')
NAMSUB='grex3'
if(dbgloc) then
call banner(2,namsub,120121)
endif
END
c