c
```
C..FILE.NAME...............GXPARA.FOR ........................160414
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
c
c
c
C     SUBROUTINE GXPARA
C     The subroutine is called only when
C        PARAB=T  and NZ > 1 or
C        STEADY=F and NZ = 1
C     and IDISPA > 0,
C     in the Q1 file.
C
C     How to set IDISPA (also IDISPB & IDISPC) :
C     IDISPA = 1  elicits the dump of all the z- (or t-) direction slabs
C                 between IZ (or ISTEP) = IDISPB and IDISPC.
C                 limit the bounds for the first slab and the last slab
C                 to be dumped (defaults: IDISPB=1; IDISPC=NZ).
C     IDISPA > 1  it will 'group' IDISPA cells into one and assign the
C                 value of the central cell to the resulting cell, as
C                 shown in the drawing below. Therefore, the number
C                 of the 'group' cell should be odd number.
C                 Even IDISPA's set by users are automatically converted
C                 to the next odd numbers by the program.
C                 Variables IDISPB and IDISPC set the limits in which the
C                 above grouping will happen. It may be noted that this
C                 trade-off between simplicity and generality will
C                 result in the omission of a couple of slabs, which,
C                 being within the bounds defined by IDISPB and IDISPC,
C                 are not enough to form a new 'group'. The adoption
C                 of this practice is justified by the fact that a
C                 large number of slabs are normally used in a parabolic
C                 simulation of flow.
C
C                  -----------------------------
C                  :        :        :         :
C                  -----------------------------       IDISPA=3
C                  :***************************:
C                  :*  1    :  2-->  :  3     *:       ---- old grid
C                  :***************************:
C                  -----------------------------       **** new cell
C                  :***************************:
C                  :*  1    :  2-->  :  3     *:        : Y
C                   ***************************:        :
C                  -----------------------------        :---> Z (or time)
C                  :        :        :         :
C                  -----------------------------
C
C   a)   If both XULAST and YVLAST are constant and DZ for all
C        IZ is known at the start of the computation (i.e AZDZ=0.0)
C        then only a PARADA (formatted) or PARPHI (direct-access)
C        is written in addition to the original phi/phida file.
C
C   b)   If XULAST and/or YVLAST are not functions of IZ, but
C        AZDZ is set, a scratch file named PARAXX is created
C        during execution and its contents written to a PARADA
C        (formatted) or PARPHI (direct-access) in addition to the
C        original phi/phida file at the end of the run.
C
C   c)   If either XULAST, or YVLAST are functions of IZ then a
C        PARZDA (formatted) or PARXYZ (direct-access) file is
C        written in addition to PARDA or PARPHI.
C        PHOTON treats these files as if results of a BFC case.
C
C.... Formatted or direct-access files are created by GXPARA according
C     to whether PHIDA=T or F in PREFIX. Formatted files are named
C     PARPHI and PARXYZ, direct-access files are PARADA and PARZDA.
C
C.... If you do not wish to dump the values of all variables stored,
C     set the names of variables which you do NOT want as a 4-character
C     name, the last 2 characters of which are '**', in the Q1 file;
C     eg  NAME(R2)=R2**
C
C     (original PHIDA or PHI should be used for restart runs,
C--------------------------------------------------------------
SUBROUTINE GXPARA
INCLUDE 'farray'
INCLUDE 'satear'
INCLUDE 'grdloc'
INCLUDE 'satgrd'
INCLUDE 'grdear'
COMMON /PARA1/ MYNAME(150) /PARA2/ MYSTOR(150)
LOGICAL BFGRID, ZVGRID, MYSTOR, PAIRS, DAFILE, NEZ
CHARACTER*(4) MYNAME, MYVNAM
COMMON/LUNITS/LUNIT(60)
COMMON/NAMFN/NAMFUN,NAMSUB
COMMON/AUXDAT/ZCCNF
CHARACTER*6 NAMFUN,NAMSUB,BUFF(4)*256
REAL(4) ARY4(LENREC)
SAVE DAFILE,IREPHI,IREXYZ,NLUPHI,NLUXYZ,NLUSCR,MYFIZ,MYLIZ,
1NZEFF,PAIRS,ZVGRID,BFGRID,IFREQ,IFST,IDUMP,LNRC,IREC,IXYZ,
1ZWLST,ISCR,L0ZT,L0AUX
SAVE IZVG
C
NAMFUN='GXPARA'
NAMSUB=NAMFUN
C*****************************************************************
C.... Determine whether z or time is the parabolic dimension
KZTFR=KZFR
NZT=NZSTEP
IZT=IZ
ELSE
IF(NZ.GT.1) THEN
WRITE(LUPR1,*) 'GXPARA cannot be used for transients if'
WRITE(LUPR1,*) 'NZ exceeds 1. IDISPA has been set = 0  '
IDISPA=0
RETURN
ENDIF
KZTFR=KTFR
NZT=LSTEP
IZT=ISTEP
ENDIF
NZPR=NZT
C.... Group 1 settings
IF(IGR.EQ.1) THEN
IFREQ=1
ZWLST=ZWLAST
ELSE
ZWLST=TLAST
ENDIF
C.... If PHIDA=T in PREFIX, DAFILE is set true.
DAFILE=.FALSE.
IPHI=ITWO(22,23,LUNIT(23).EQ.0)
IF(IPHI.EQ.23) DAFILE=.TRUE.
C
C.... Logical units for output files
IF(.NOT.DAFILE) THEN
IREPHI=31
IREXYZ=32
ELSE
IREPHI=35
IREXYZ=36
ENDIF
C
NLUXYZ=LUNIT(IREXYZ)
NLUPHI=LUNIT(IREPHI)
NLUSCR=LUNIT(33)
C.... See first and last slab
MYFIZ=MAX0(1,IDISPB)
MYLIZ=NZT
IF(IDISPC.GT.0.AND.IDISPC.LE.NZT) MYLIZ=IDISPC
NZEFF=MYLIZ-MYFIZ+1
CALL GXMAKE(L0ZT,NZT,'ZorT')
CALL GXMAKE(L0AUX,MAX0((NX+1)*(NY+1),NZEFF),'IAUX')
C.... Grid types
PAIRS=.FALSE.
ZVGRID=.FALSE.
BFGRID=.FALSE.
IF(NEZ(AZXU).OR.NEZ(AZYV)) THEN ! grid expands, so use BFC treatment
BFGRID=.TRUE.                 ! for PHOTON display
ELSEIF(NEZ(AZDZ)) THEN
ZVGRID=.TRUE.
ELSEIF(F(KZTFR+1).LT.0.0) THEN  ! use method of pairs  for z grid,
C     store high face coords f-array
PAIRS=.TRUE.
IZGR=0
DO 101 J=1,NZT/2
IF(IZGR.LT.NZT) THEN
IZFR=NINT(F(KZTFR+2*J-1))
IZFR=IABS(IZFR)
IF(IZGR.EQ.0) THEN
F(L0ZT+1)=F(KZTFR+2*J)
IF(IZFR.LE.NZPR) THEN
DO 102 I=2,IZFR
F(L0ZT+I)=F(KZTFR+2*J)+F(L0ZT+I-1)
102              CONTINUE
ENDIF
ELSE
IF(IZFR+IZGR.LE.NZPR) THEN
DO 103 I=1,IZFR
F(L0ZT+I+IZGR)=F(KZTFR+2*J)+F(L0ZT+I+IZGR-1)
103              CONTINUE
ENDIF
ENDIF
IZGR=IZGR+IZFR
ENDIF
101      CONTINUE
IF(IZGR.GT.NZPR) THEN
NZT=NZPR+1
GO TO 210
ENDIF
ENDIF
C.... Determine slab frequency for dumping to parphi
IF(IDISPA.GT.1) THEN
IFREQ=IDISPA
IFST=IDISPA/2+1
C.... Check for odd no.
C...  IFREQ is odd so that the middle slab (of band) saved for plotting purposes
IF(IDISPA>2 .AND. MOD(IDISPA,2).EQ.0) IFREQ=IDISPA+1
NZEFF=NZEFF/IFREQ
IDUMP=0
ELSE
IFREQ=1
IFST=0; IDUMP=0
ENDIF
210 CONTINUE
C.... End of Group 1 settings
ENDIF
C*****************************************************************
IF(IGR.EQ.19) THEN
C
C.... Not if iz < myfiz or iz > myliz
IF((IZT.GE.MYFIZ).AND.(IZT.LE.MYLIZ)) THEN
C
C.... F-array zero-location indices of geometrical quantities
L0X=L0F(XU2D)
L0Y=L0F(YV2D)
IF(.NOT.CARTES) L0R=L0F(RV2D)
IF(BFGRID .AND. .NOT.CARTES .AND. NX.GT.1) THEN
L0SP=L0F(EASP2)
L0XG=L0F(XG2D)
ENDIF
C
C.... Part 1: ....................................................
C     First-slab practices for xyz and phi
C
IF(IZT.EQ.MYFIZ) THEN
C
C.... 1a. open files
C
100       CONTINUE
if(debug) call writ1i('open  fl',irephi)
CALL OPENZZ(IREPHI,IOS)
IF(IOS/=0) THEN
CALL CLOSZZ(IREPHI)  ! Close PHI(DA) file then post query about action
C     Likely IOSTAT errors are
IF(IOS==38) THEN     !  38 severe: Error during write
BUFF(1)='Error while writing PHI(DA) file'
ELSEIF(IOS==608) THEN  ! 608 severe: No space left on device
BUFF(1)='No space left on device to write PHI(DA) file'
ELSE
CALL IOEMZZ(IOS,BUFF(1))
ENDIF
BUFF(2)='Close any open files or make more space.'
BUFF(3)='Press OK to retry saving file or Cancel to'
BUFF(4)='continue without saving.'
CALL ERRMSG(BUFF,4,222,IEND)
IF(IEND==0) GOTO 100
RETURN
ENDIF
IF(BFGRID) THEN
111         CONTINUE
CALL OPENZZ(IREXYZ,IOS)
IF(IOS/=0) THEN
CALL CLOSZZ(IREXYZ)  ! Close XYZ(DA) file then post query about action
C     Likely IOSTAT errors are
IF(IOS==38) THEN     !  38 severe: Error during write
BUFF(1)='Error while writing XYZ(DA) file'
ELSEIF(IOS==608) THEN  ! 608 severe: No space left on device
BUFF(1)=
1                   'No space left on device to write XYZ(DA) file'
ELSE
CALL IOEMZZ(IOS,BUFF(1))
ENDIF
BUFF(2)='Close any open files or make more space.'
BUFF(3)='Press OK to retry saving file or Cancel to'
BUFF(4)='continue without saving.'
CALL ERRMSG(BUFF,4,222,IEND)
IF(IEND==0) GOTO 111
RETURN
ENDIF
ENDIF
IF(ZVGRID) THEN
112         CONTINUE
CALL OPENZZ(33,IOS)
IF(IOS/=0) THEN
CALL CLOSZZ(33)  ! Close XYZ(DA) file then post query about action
C     Likely IOSTAT errors are
IF(IOS==38) THEN     !  38 severe: Error during write
BUFF(1)='Error while writing XYZ(DA) file'
ELSEIF(IOS==608) THEN  ! 608 severe: No space left on device
BUFF(1)=
1                   'No space left on device to write XYZ(DA) file'
ELSE
CALL IOEMZZ(IOS,BUFF(1))
ENDIF
BUFF(2)='Close any open files or make more space.'
BUFF(3)='Press OK to retry saving file or Cancel to'
BUFF(4)='continue without saving.'
CALL ERRMSG(BUFF,4,222,IEND)
IF(IEND==0) GOTO 112
RETURN
ENDIF
ENDIF
C
C.... Set record length for PHI or PHIDA files
LNRC=LENREC
IF(.NOT.DAFILE) LNRC=6
C
RRINN=RINNER
IF(BFGRID) RRINN=0.0
IF(.NOT.DAFILE) THEN
C
C.... 1b. nx, ny, nz to xyz
C
IF(BFGRID) WRITE (NLUXYZ, '(3I5)' ) NX+1, NY+1, NZEFF+1
C
C.... 1c. title and other preliminaries to PHI
C
WRITE(NLUPHI,201) MESS(1:40)
201         FORMAT(1X,A40,9A4)
WRITE (NLUPHI,'(1X,79L1)') CARTES,ONEPHS,BFGRID,XCYCLE
WRITE (NLUPHI,'(1X,7I10)') NX,NY,NZEFF,NPHI,DEN1,DEN2,
1                              EPOR,NPOR,HPOR,VPOR,LENREC
WRITE (NLUPHI,'(1PE13.6)') RRINN
ELSE
C
C.... 1b. nx, ny, nz to xyz
C
IF(BFGRID) WRITE (NLUXYZ, REC=1 ) INT4(NX+1), INT4(NY+1),
1           INT4(NZEFF+1)
C
C.... 1c. title and other preliminaries to phi
C
WRITE (NLUPHI,REC=1) MESS(1:40)
WRITE (NLUPHI,REC=2) LOGICAL(CARTES,4),
1           LOGICAL(ONEPHS,4),LOGICAL(BFGRID,4),LOGICAL(XCYCLE,4)
WRITE (NLUPHI,REC=3) INT4(NX),INT4(NY),INT4(NZEFF),
1           INT4(NPHI),INT4(DEN1),INT4(DEN2),INT4(EPOR),
1           INT4(NPOR),INT4(HPOR),INT4(VPOR),INT4(LENREC)
WRITE (NLUPHI,REC=4) REAL(RRINN,4)
ENDIF
C
C.... 1d. variable names to phi
C           NB: name of velocities overwritten if bfgrid
C           (This is because the default vector components
C           used by PHOTON are the cartesian components.)
C
DO 10 II=1, NPHI
MYNAME (II) = NAME (II)
10        CONTINUE
DO 110 JJ=1, NPHI
MYSTOR(JJ)=.FALSE.
MYVNAM=MYNAME(JJ)
IF(STORE(JJ)) then
IF(MYVNAM(3:4).NE.'**') THEN
IF(MOD(IPRN(JJ),5).EQ.0) MYSTOR(JJ)=.TRUE.
ENDIF
ENDIF
110       CONTINUE
IF(BFGRID) THEN
IF(MYSTOR(U1)) MYNAME (U1) = 'UCRT'
IF(MYSTOR(V1)) MYNAME (V1) = 'VCRT'
IF(MYSTOR(W1)) MYNAME (W1) = 'WCRT'
IF(MYSTOR(U2)) MYNAME (U2) = 'U2CR'
IF(MYSTOR(V2)) MYNAME (V2) = 'V2CR'
IF(MYSTOR(W2)) MYNAME (W2) = 'W2CR'
ENDIF
IF(.NOT.DAFILE) THEN
NREC=NUMREC (NPHI,19)
I1=-18
I2=0
DO 11 I=1, NREC
I1=I1+19
I2=MIN0 (I2+19, NPHI)
WRITE (NLUPHI,'(1X,19A4)') (MYNAME (J), J=I1, I2)
11          CONTINUE
ELSE
WRITE (NLUPHI,REC=5) (MYNAME (J), J=1,NPHI)
ENDIF
C
C.... 1e. cell faces (first x, then y, then z) to PHI
C     NB dummy values written if bfgrid since geometry file (xyz) is used
C
IF(DAFILE) IREC=5
DO 12 KK=1, 3
IF(KK.EQ.1) THEN
NN=NX
ELSEIF(KK.EQ.2) THEN
NN=NY
ELSEIF(KK.EQ.3) THEN
NN=NZEFF
ENDIF
NREC=NUMREC (NN,LNRC)
I1=1-LNRC
I2=0
IF(KK.EQ.3.AND.ZVGRID) IZVG=IREC
DO 13 I=1, NREC
I1=I1+LNRC
I2=MIN0 (I2+LNRC, NN)
IF(.NOT.BFGRID.AND..NOT.ZVGRID.AND.KK.EQ.3) THEN
IF(.NOT.PAIRS.AND.MYFIZ.GT.1) F(L0ZT+MYFIZ-1)=
1                 F(KZTFR+MYFIZ-1)
DO 15 J=I1,I2
IF(.NOT.PAIRS) F(L0ZT+J*IFREQ+MYFIZ-1)=F(KZTFR+
1                      J*IFREQ+MYFIZ-1)
IF(MYFIZ.GT.1) F(L0ZT+J*IFREQ+MYFIZ-1)=
1                      F(L0ZT+J*IFREQ+MYFIZ-1)-F(L0ZT+MYFIZ-1)
15               CONTINUE
ENDIF
C.... Formatted files
IF(.NOT.DAFILE) THEN
IF(BFGRID) THEN
WRITE (NLUPHI,1962) (.9999, JJ=I1, I2)
ELSE
IF(KK.EQ.1) WRITE (NLUPHI,1962)
1                              (F(L0X+(JJ-1)*NY+1),JJ=I1,I2)
IF(KK.EQ.2) WRITE (NLUPHI,1962)
1                   (F(L0Y+JJ),JJ=I1,I2)
IF((.NOT.ZVGRID).AND.(KK.EQ.3)) WRITE(NLUPHI,1962)
1                 (F(L0zt+JJ*IFREQ+MYFIZ-1)*ZWLST,JJ=I1,I2)
ENDIF
ELSE
C.... Direct-access files
IREC=IREC+1
IF(BFGRID) THEN
WRITE (NLUPHI,REC=IREC) (REAL(.9999,4), JJ=I1, I2)
ELSE
IF(KK.EQ.1) THEN
WRITE(NLUPHI,REC=IREC)
1                 (REAL(F(L0X+(JJ-1)*NY+1),4),JJ=I1,I2)
ELSEIF(KK.EQ.2) THEN
WRITE(NLUPHI,REC=IREC)(REAL(F(L0Y+JJ),4),JJ=I1,I2)
ELSEIF(.NOT.ZVGRID.AND.KK.EQ.3) THEN
WRITE(NLUPHI,REC=IREC)
1                 (REAL(F(L0zt+JJ*IFREQ+MYFIZ-1)*ZWLST,4),JJ=I1,I2)
ENDIF
ENDIF
ENDIF
13          CONTINUE
12        CONTINUE
C
C.... 1f. pressure correction at each slab to phi
C         (the file will never be used for restarts, so
C         dummy values are written.)
C
IF(.NOT.ZVGRID) THEN
NREC=NUMREC (NZEFF,LNRC)
I1=1-LNRC
I2=0
DO 14 I=1, NREC
I1=I1+LNRC
I2=MIN0 (I2+LNRC, NZEFF)
IF(.NOT.DAFILE) THEN
WRITE (NLUPHI, 1962) (.9999, JJ=I1, I2)
ELSE
IREC=IREC+1
WRITE (NLUPHI, REC=IREC) (REAL(.9999,4), JJ=I1, I2)
ENDIF
14           CONTINUE
ENDIF
C
C.... 1g. and store(phii) to phi
C
IF(.NOT.ZVGRID) THEN
IF(.NOT.DAFILE) THEN
WRITE (NLUPHI,'(1X,79L1)') (MYSTOR(I), I=1, NPHI)
ELSE
IREC=IREC+1
WRITE(NLUPHI,REC=IREC) (LOGICAL(MYSTOR(I),4),I=1,NPHI)
ENDIF
ENDIF
ENDIF
C
C.... Part 2: ....................................................
C     2a.  slab values of each stored var to phi
C          NB: u and v components are converted to cartesian
C          components if bfgrid.and..not.cartes.and.(nx.gt.1)
C
C.... Variables only dumped every ifreq slabs
C
IWRIT=IFST+IDUMP*IFREQ+MYFIZ-1
IF(ZVGRID.AND.IZT.EQ.MYFIZ) ISCR=0
IF((IFREQ.EQ.1).OR.(IWRIT.EQ.IZT)) THEN
DO 20 KK=1, NPHI
IF(MYSTOR(KK)) THEN
L0VAR=L0F(KK)
C
C.... This is the conversion mentioned above; the cartesian
C     components are stored in the spare array EASP2.
C
IF(BFGRID.AND.(.NOT.CARTES).AND.(NX.GT.1).AND
1            .((KK.EQ.U1).OR.(KK.EQ.V1).OR.(KK.EQ.U2).OR.
1            (KK.EQ.V2))) THEN
IF((KK.EQ.U1).OR.(KK.EQ.U2)) THEN
L0ANG=L0X
ELSE
L0ANG=L0XG
ENDIF
DO 21 ICELL=1, NX*NY
F(L0SP+ICELL)=F(L0VAR+ICELL)*COS(F(L0ANG+ICELL))
21               CONTINUE
L0VAR=L0SP
ENDIF
LENPHI=LNRC
IF(ZVGRID) LENPHI=LENREC
NREC=NUMREC (NX*NY,LENPHI)
I1=1-LENPHI
I2=0
DO 22 I=1, NREC
I1=I1+LENPHI
I2=MIN0 (I2+LENPHI, NX*NY)
C.... Formatted files
IF(.NOT.DAFILE.AND..NOT.ZVGRID) THEN
WRITE (NLUPHI, 1962) (F(L0VAR+IJK), IJK=I1, I2)
ELSE
C.... PHIDA file
IF(.NOT.ZVGRID) THEN
IREC=IREC+1
WRITE (NLUPHI,REC=IREC)
1                  (REAL(F(L0VAR+IJK),4), IJK=I1, I2)
C.... Scratch file
ELSE
ISCR=ISCR+1
WRITE (NLUSCR,REC=ISCR)
1                  (REAL(F(L0VAR+IJK),4), IJK=I1, I2)
ENDIF
ENDIF
22             CONTINUE
ENDIF
20         CONTINUE
IDUMP=IDUMP+1
ENDIF
C
C.... 2b. If zvgrid, store the high-face coordinate
C
IF(ZVGRID) THEN
IF(IZT.EQ.MYFIZ) THEN
F(L0AUX+1)=DZ
ELSE
F(L0AUX+IZT-MYFIZ+1)=F(L0AUX+IZT-MYFIZ)+DZ
ENDIF
ENDIF
C
C.... Part 3: ....................................................
C     cell-corner coordinates to xyz if bfgrid
C
IF(BFGRID) THEN
IF(DAFILE.AND.IZT.EQ.MYFIZ) IXYZ=1
IGEOM=(IDUMP)*IFREQ+MYFIZ
IF((IFREQ.EQ.1).OR.(IGEOM.EQ.IZT)) THEN
C
C.... 3a. x coordinates
C
IA=1
DO 30 II=1, NY+1
F(L0AUX+IA)=0.0
IA=IA+1
30           CONTINUE
IF(CARTES) THEN
DO 31 JJ=1,NX
DO 131 II=1,NY+1
F(L0AUX+IA)=F(L0X+NY*(JJ-1)+1)
IA=IA+1
131              CONTINUE
31             CONTINUE
ELSE
DO 32 II=1, NX
F(L0AUX+IA)=RINNER*SIN(F(L0X+NY*(II-1)+1))
IA=IA+1
DO 33 JJ=1, NY
IC=(II-1)*NY+JJ
F(L0AUX+IA)=F(L0R+IC)*SIN(F(L0X+IC))
IA=IA+1
33               CONTINUE
32             CONTINUE
ENDIF
IF(.NOT.DAFILE) THEN
WRITE (NLUXYZ, 1961) (F(L0AUX+II),II=1,(NX+1)*(NY+1))
ELSE
NREC=NUMREC((NY+1)*(NX+1),LENREC)
IDIR=0
IF(IZT.NE.MYFIZ) IXYZ=IXYZ+NREC-1
CALL WRTBFG(LENREC,NREC,IXYZ,IDIR,NLUXYZ,(NX+1)*(NY+1),
1                      L0AUX)
ENDIF
C
C.... 3b. y coordinates
C
IA=1
IF(CARTES) THEN
DO 38 II=1,NX+1
F(L0AUX+IA)=0.0
IA=1+IA
DO 34 JJ=1, NY
F(L0AUX+IA)=F(L0Y+JJ)
IA=IA+1
34               CONTINUE
38             CONTINUE
ELSE
F(L0AUX+1)= RINNER
IA=IA+1
DO 35 JJ=1, NY
F(L0AUX+IA) = F(L0R+JJ)
IA=IA+1
35             CONTINUE
DO 36 II=1, NX
F(L0AUX+IA)=RINNER*COS(F(L0X+NY*(II-1)+1))
IA=IA+1
DO 37 JJ=1, NY
IC=(II-1)*NY+JJ
F(L0AUX+IA)=F(L0R+IC)*COS(F(L0X+IC))
IA=IA+1
37               CONTINUE
36             CONTINUE
ENDIF
IF(.NOT.DAFILE) THEN
WRITE (NLUXYZ, 1961) (F(L0AUX+II),II=1,(NX+1)*(NY+1))
ELSE
NREC=NUMREC((NY+1)*(NX+1),LENREC)
IDIR=0
IXYZ=IXYZ+NREC-1
CALL WRTBFG(LENREC,NREC,IXYZ,IDIR,NLUXYZ,(NX+1)*(NY+1),
1                      L0AUX)
ENDIF
ENDIF
C
C.... 3c. z coordinates
C
IF(IZT.EQ.MYFIZ) THEN
ZCCNF=0.0
ELSE
ZCCNF=ZCCNF+DZ
ENDIF
IF((IFREQ.EQ.1).OR.(IGEOM.EQ.IZT)) THEN
IF(.NOT.DAFILE) THEN
WRITE (NLUXYZ,1961) (ZCCNF, II=1, (NX+1)*(NY+1))
ELSE
NREC=NUMREC((NY+1)*(NX+1),LENREC)
IDIR=1
IXYZ=IXYZ+NREC-1
CALL WRTBFG(LENREC,NREC,IXYZ,IDIR,NLUXYZ,(NX+1)*(NY+1),
1                      L0AUX)
ENDIF
ENDIF
ENDIF
C
C.... Part 4: ....................................................
C     last-slab practices.
C
C.... 4a. If zvgrid, the phi file is completed here, and the
C         scratch file is closed and deleted.
C
IF(ZVGRID.AND.(IZT.EQ.MYLIZ)) THEN
NREC=NUMREC (NZEFF,LNRC)
I1=1-LNRC
I2=0
DO 40 I=1, NREC
I1=I1+LNRC
I2=MIN0 (I2+LNRC, NZEFF)
IF(.NOT.DAFILE) THEN
WRITE (NLUPHI,1962) (F(L0AUX+JJ*IFREQ), JJ=I1,I2)
ELSE
C                IREC=IZVG+1
IREC=IZVG+I
WRITE(NLUPHI,REC=IREC)
1            (REAL(F(L0AUX+JJ*IFREQ),4),JJ=I1,I2)
ENDIF
40         CONTINUE
C
C.... Now pressure correction
C
NREC=NUMREC (NZEFF,LNRC)
I1=1-LNRC
I2=0
DO 41 I=1, NREC
I1=I1+LNRC
I2=MIN0 (I2+LNRC, NZEFF)
IF(.NOT.DAFILE) THEN
WRITE (NLUPHI, 1962) (.9999, JJ=I1, I2)
ELSE
IREC=IREC+1
WRITE (NLUPHI,REC=IREC) (REAL(.9999,4), JJ=I1,I2)
ENDIF
41         CONTINUE
C
C.... Now store (phi)
C
IF(.NOT.DAFILE) THEN
WRITE (NLUPHI,'(1X,79L1)') (MYSTOR(I), I=1, NPHI)
ELSE
IREC=IREC+1
WRITE(NLUPHI,REC=IREC) (LOGICAL(MYSTOR(I),4),I=1,NPHI)
ENDIF
C
C.... Now the scratch file (da file)
C
c            CALL CLOSFL(33)
c            CALL OPENFL(34)
ISCR=0
DO 42 IIZZ=1, NZEFF
DO 43 KK=1, NPHI
IF(MYSTOR(KK)) THEN
NREC=NUMREC (NX*NY,LENREC)
I1=1-LENREC
I2=0
DO 44 I=1, NREC
I1=I1+LENREC
I2=MIN0 (I2+LENREC, NX*NY)
ISCR=ISCR+1
DO IJK=I1,I2
F(L0AUX+IJK)=ARY4(IJK-I1+1)
ENDDO
44               CONTINUE
NREC=NUMREC (NX*NY,LNRC)
I3=1-LNRC
I4=0
DO 144 I=1, NREC
I3=I3+LNRC
I4=MIN0 (I4+LNRC, NX*NY)
IF(.NOT.DAFILE) THEN
WRITE (NLUPHI,1962) (F(L0AUX+IJK), IJK=I3,I4)
ELSE
IREC=IREC+1
WRITE(NLUPHI,REC=IREC)
1                  (REAL(F(L0AUX+IJK),4),IJK=I3,I4)
ENDIF
144              CONTINUE
ENDIF
43           CONTINUE
42         CONTINUE
C
cc            CALL CLOSFL(34)
CALL CLOSFL(33)
ENDIF
C
C.... 4b. write the high face to xyz.
C
IF((IZT.EQ.MYLIZ).AND.BFGRID) THEN
C
C.... x coordinates
IA=1
DO 45 II=1, NY+1
F(L0AUX+IA)=0.0
IA=IA+1
45         CONTINUE
IF(CARTES) THEN
DO 46 JJ=1,NX
DO 146 II=1,NY+1
F(L0AUX+IA)=F(L0X+NY*(JJ-1)+1)
IA=IA+1
146            CONTINUE
46           CONTINUE
ELSE
DO 47 II=1, NX
F(L0AUX+IA)=RINNER*SIN(F(L0X+NY*(II-1)+1))
IA=IA+1
DO 48 JJ=1, NY
IC=(II-1)*NY+JJ
F(L0AUX+IA)=F(L0R+IC)*SIN(F(L0X+IC))
IA=IA+1
48             CONTINUE
47           CONTINUE
ENDIF
IF(.NOT.DAFILE) THEN
WRITE (NLUXYZ, 1961) (F(L0AUX+II),II=1,(NX+1)*(NY+1))
ELSE
NREC=NUMREC((NY+1)*(NX+1),LENREC)
IDIR=0
IXYZ=IXYZ+NREC-1
CALL WRTBFG(LENREC,NREC,IXYZ,IDIR,NLUXYZ,(NX+1)*(NY+1),
1                    L0AUX)
ENDIF
C
C.... y coordinates
C
IA=1
IF(CARTES) THEN
DO 49 II=1,NX+1
F(L0AUX+IA)=0.0
IA=1+IA
DO 149 JJ=1, NY
F(L0AUX+IA)=F(L0Y+JJ)
IA=IA+1
149            CONTINUE
49           CONTINUE
ELSE
F(L0AUX+1)= RINNER
IA=IA+1
DO 410 JJ=1, NY
F(L0AUX+IA) = F(L0R+JJ)
IA=IA+1
410          CONTINUE
DO 411 II=1, NX
F(L0AUX+IA)=RINNER*COS(F(L0X+NY*(II-1)+1))
IA=IA+1
DO 412 JJ=1, NY
IC=(II-1)*NY+JJ
F(L0AUX+IA)=F(L0R+IC)*COS(F(L0X+IC))
IA=IA+1
412            CONTINUE
411          CONTINUE
ENDIF
IF(.NOT.DAFILE) THEN
WRITE (NLUXYZ, 1961) (F(L0AUX+II),II=1,(NX+1)*(NY+1))
ELSE
NREC=NUMREC((NY+1)*(NX+1),LENREC)
IDIR=0
IXYZ=IXYZ+NREC-1
CALL WRTBFG(LENREC,NREC,IXYZ,IDIR,NLUXYZ,(NX+1)*(NY+1),
1                    L0AUX)
ENDIF
C
C.... z coordinates
C
ZCCNF=ZCCNF+DZ
IF(.NOT.DAFILE) THEN
WRITE (NLUXYZ,1961) (ZCCNF,II=1,(NX+1)*(NY+1))
ELSE
NREC=NUMREC((NY+1)*(NX+1),LENREC)
IDIR=1
IXYZ=IXYZ+NREC-1
CALL WRTBFG(LENREC,NREC,IXYZ,IDIR,NLUXYZ,(NX+1)*(NY+1),
1                    L0AUX)
ENDIF
C
C.... 4c. close PHI and XYZ
C
CALL CLOSFL(IREXYZ)
ENDIF
IF(IZT.EQ.MYLIZ) then
if(debug) call writ1i('close fl',irephi)
CALL CLOSFL(IREPHI)
endif
ENDIF
ENDIF
C
1961 FORMAT (5(1PE13.6))
1962 FORMAT (6(1PE13.6))
NAMFUN='gxpara'
NAMSUB=NAMFUN
END
C-----------------------------------------------------------------------
c
SUBROUTINE WRTBFG(LENREC,N,IRXY,IDIR,NLU,NXNY1,L0AUX)
INCLUDE 'farray'
COMMON/AUXDAT/ZCCNF
I1=1-LENREC
I2=0
DO 10 I=1,N
IRXY=IRXY+1
I1=I1+LENREC
I2=MIN0(I2+LENREC,NXNY1)
IF(IDIR.EQ.1) THEN
WRITE(NLU,REC=IRXY) (REAL(ZCCNF,4),KK=I1,I2)
ELSEIF(IDIR.EQ.0) THEN
WRITE(NLU,REC=IRXY) (REAL(F(L0AUX+KK),4),KK=I1,I2)
ENDIF
10   CONTINUE
END
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
C
C     The subroutine is called only when
C     in the Q1 file.
C
C.... The subroutine adds to the cross stream velocity (V1 say)
C     a component equal  -W1*TAN(ALF) where ALF is the grid angle
C.    at the velocity location. It is needed for parabolic
C     contracting and expanding grids, i.e. grids for which
C     constant-y or constant-x lines are not precisely at right
C     angles to constant-z lines. It is essential when using such
C     grids with the IPARAB=4 (wholly supersonic flow) or IPARAB=5
C     (supersonic flow with allowance for a subsonic free stream)
C     options.
C
C-----------------------------------------------------------------------
INCLUDE 'farray'
INCLUDE 'satear'
INCLUDE 'grdloc'
INCLUDE 'satgrd'
INCLUDE 'grdear'
C
COMMON/NAMFN/NAMFUN,NAMSUB
CHARACTER*6 NAMFUN,NAMSUB
CHARACTER*1 CDIR
INTEGER VELZ,XU
C
NAMSUB=NAMFUN
c
c.... IYL is set to NY-1 (and later re-set to NY) to reflect the fact that
c     there is no flow through the outer boundary
IF(CDIR.EQ.'X') THEN
IXL=NX-1
ELSE
IYL=NY-1
ENDIF
GDXDZ=XLAST*(1.-1./XR)/DZ