c
c
c
c
C.... SUBROUTINE GXCLDA is called from group 13 of GREX3, and is
C entered when the patch name begins with characters 'CLDA'
C It creates the CO and VAL for the variables of which the NAMEs
C have NOR, SOU, EAS, WES, OLD and NEW as the second, third and
C fourth characters.
C
SUBROUTINE GXCLDA
include 'farray'
INCLUDE 'grdloc'
INCLUDE 'satgrd'
INCLUDE 'grdear'
COMMON/LDATA/LDAT1(7),XCYCLE,LDAT2(10),STEADY,LDAT3(65)
COMMON /NAMFN/NAMFUN,NAMSUB
COMMON /IDATA/NX,NY,NZ,IDFIL(116),NPHI
COMMON/HDA1/NAME(150)
CHARACTER*6 NAMFUN,NAMSUB
CHARACTER*3 NAM
CHARACTER*4 NAME,NAM4
LOGICAL FIRST,LDAT1,XCYCLE,LDAT2,STEADY,LDAT3,deb
SAVE FIRST,INOR,ISOU,IEAS,IWES,IOLD,INEW,LASTEP,LASTIZ,
1 INDFRS,IOLN
DATA FIRST/.TRUE./
C
deb=.false.
c if(deb) then
c write(buff,'(a,2i6,1x,l1)') 'gxclda entered, nx,ny,steady =',
c 1 NX,NY,STEADY
c call put_line(buff,.false.)
c write(buff,'(a,1x,l1,1x,i6)') ',first, isc =',FIRST,ISC
c call put_line(buff,.true.)
c endif
NAMSUB = 'GXCLDA'
IF(FIRST) THEN
C.... Establish the indices of the relevant solved-for variables
CALL SUB4(INOR,0,ISOU,0,IEAS,0,IWES,0)
CALL SUB4(IOLD,0,INEW,0,IOLN,0,INDFRS,0)
CALL SUB3(LASTEP,1,LASTIZ,0,LASTIT,0)
DO 1 I=1,nphi
IF(STORE(I)) THEN
NAM4=NAME(I)
NAM=NAM4(2:4)
IF(NAM.EQ.'NOR') THEN
INOR = I
ELSEIF(NAM.EQ.'SOU') THEN
ISOU = I
ELSEIF(NAM.EQ.'EAS') THEN
IEAS = I
ELSEIF(NAM.EQ.'WES') THEN
IWES = I
ELSEIF(NAM.EQ.'OLD') THEN
IOLD = I
ELSEIF(NAM.EQ.'NEW') THEN
INEW = I
ELSEIF(NAM.EQ.'NEO') THEN
IOLN = I
ENDIF
ENDIF
1 CONTINUE
IF(INOR.NE.0) INDFRS=INOR
IF(ISOU.NE.0) INDFRS=MIN0(INDFRS,ISOU)
IF(IEAS.NE.0) INDFRS=MIN0(INDFRS,IEAS)
IF(IWES.NE.0) INDFRS=MIN0(INDFRS,IWES)
IF(INEW.NE.0) INDFRS=MIN0(INDFRS,INEW)
IF(IOLD.NE.0) INDFRS=MIN0(INDFRS,IOLD)
FIRST=.FALSE.
ENDIF
L0CO=L0F(CO)
c if(deb) then
c write(buff,'(a,2i9)') 'CO, L0CO =',CO,L0CO
c call put_line(buff,.true.)
c endif
IF(ISC.LE.11) THEN
FCODB = F(L0CO+1)
F(L0CO+1)=0.0
c if(deb) then
c write(buff,'(a,1x,1pe10.3)') '1, RETURN FOR ISC.LE.11,
c 1 F(L0CO+1)', fcodb
c call put_line(buff,.false.)
c write(buff,'(a,1x,1pe10.3)') '2, RETURN FOR ISC.LE.11,
c 1 F(L0CO+1)', F(L0CO+1)
c call put_line(buff,.true.)
c endif
RETURN
ENDIF
C.... L0...'S
L0VAL=L0F(VAL)
C.... Return if called with isc.le.co because the coefficients
C will be calculated later; but restore the first-cell value
C which is used in earth to test whether values have been set
IF(NY.GT.1) THEN
L0SOU=L0F(ISOU)
L0NOR=L0F(INOR)
L0CNA=L0F(LCNA)
L0CNAS=L0CNA-1
ENDIF
IF(NX.GT.1) THEN
L0EAS=L0F(IEAS)
L0WES=L0F(IWES)
L0CEA=L0F(LCEA)
L0CEAW=L0CEA-NY
ENDIF
IF(.NOT.STEADY) THEN
RECDT=1.0/DT
L0NEW=L0F(INEW)
L0OLD=L0F(IOLD)
L0OLN=L0F(IOLN)
C.... Note that it is strictly-speaking necessary to distinguish the
C old from the new time flux.
L0MAS=L0F(LM1)
C.... At start of new slab and
IF((ISTEP.NE.LASTEP.OR.IZSTEP.NE.LASTIZ).AND.
1 ISWEEP.EQ.1.AND.INDVAR.EQ.INDFRS.AND.ITHYD.EQ.1) THEN
CALL FN0(-L0OLN,-L0NEW)
c if(deb) call prn('olnu',-l0oln)
CALL SUB2(LASTEP,ISTEP,LASTIZ,IZSTEP)
ENDIF
ENDIF
C.... DO loops begin
IF(NX.GT.1.AND.NY.GT.1.AND..NOT.STEADY) THEN
C.... nx.gt.1, ny.gt.1, unsteady
DO 10 IX=IXF,IXL
CDIR$ IVDEP
DO 10 IY=IYF,IYL
I=IY+(IX-1) * NY
CNA=F(L0CNA+I)
CNAS=F(L0CNAS+I)
IF(IY.EQ.1) CNAS=CNA
IF(IY.EQ.NY) CNA=CNAS
CEA=F(L0CEA+I)
CEAW=F(L0CEAW+I)
IF(.NOT.XCYCLE) THEN
IF(IX.EQ.1) CEAW=CEA
IF(IX.EQ.NX) CEA=CEAW
ENDIF
COL=F(L0MAS+I)*RECDT
C.... INDVAR is north
IF(INDVAR.EQ.INOR) THEN
C.... Donor is south
CNAN=CNA
IF(IY.EQ.NY) CNAN=0.0
CONV=AMAX1(0.0,-CNAN)
FLUX=CONV*F(L0SOU+1+I)
COEF=CONV
C.... Donor is east
CONV=0.25*AMAX1(0.0,-CEA+CNA)
FLUX=FLUX+CONV*F(L0EAS+I)
COEF=COEF+CONV
C.... Donor is west
CONV=0.25*AMAX1(0.0,CEAW+CNA)
FLUX=FLUX+CONV*F(L0WES+I)
COEF=COEF+CONV
C.... Donor is new
CONV=0.25*AMAX1(0.0,-COL+CNA)
FLUX=FLUX+CONV*F(L0NEW+I)
COEF=COEF+CONV
C.... Donor is old
CONV=0.25*AMAX1(0.0,COL+CNA)
FLUX=FLUX+CONV*F(L0OLD+I)
COEF=COEF+CONV
C.... INDVAR is south
ELSEIF(INDVAR.EQ.ISOU) THEN
C.... Donor is north
CNASS=CNAS
IF(IY.EQ.1) CNASS=0.0
CONV=AMAX1(0.0,CNASS)
FLUX=CONV*F(L0NOR-1+I)
COEF=CONV
C.... Donor is east
CONV=0.25*AMAX1(0.0,-CEA-CNAS)
FLUX=FLUX+CONV*F(L0EAS+I)
COEF=COEF+CONV
C.... Donor is west
CONV=0.25*AMAX1(0.0,CEAW-CNAS)
FLUX=FLUX+CONV*F(L0WES+I)
COEF=COEF+CONV
C.... Donor is new
CONV=0.25*AMAX1(0.0,-COL-CNAS)
FLUX=FLUX+CONV*F(L0NEW+I)
COEF=COEF+CONV
C.... Donor is old
CONV=0.25*AMAX1(0.0,COL-CNAS)
FLUX=FLUX+CONV*F(L0OLD+I)
COEF=COEF+CONV
C.... INDVAR is east
ELSEIF(INDVAR.EQ.IEAS) THEN
C.... Donor is north
CONV=0.25*AMAX1(0.0,-CNA+CEA)
FLUX=CONV*F(L0NOR+I)
COEF=CONV
C.... Donor is south
CONV=0.25*AMAX1(0.0,CNAS+CEA)
FLUX=FLUX+CONV*F(L0SOU+I)
COEF=COEF+CONV
C.... Donor is west
CEAE=CEA
IF(IX.EQ.NX.AND..NOT.XCYCLE) CEAE=0.0
CONV=AMAX1(0.0,-CEAE)
FLUX=FLUX+CONV*F(L0WES+NY+I)
COEF=COEF+CONV
C.... Donor is new
CONV=0.25*AMAX1(0.0,-COL+CEA)
FLUX=FLUX+CONV*F(L0NEW+I)
COEF=COEF+CONV
C.... Donor is old
CONV=0.25*AMAX1(0.0,COL+CEA)
FLUX=FLUX+CONV*F(L0OLD+I)
COEF=COEF+CONV
C.... INDVAR is west
ELSEIF(INDVAR.EQ.IWES) THEN
C.... Donor is north
CONV=0.25*AMAX1(0.0,-CNA-CEAW)
FLUX=CONV*F(L0NOR+I)
COEF=CONV
C.... Donor is south
CONV=0.25*AMAX1(0.0,CNAS-CEAW)
FLUX=FLUX+CONV*F(L0SOU+I)
COEF=COEF+CONV
C.... Donor is east
CEAWW=CEAW
IF(IX.EQ.1.AND..NOT.XCYCLE) CEAWW=0.0
CONV=AMAX1(0.0,CEAWW)
FLUX=FLUX+CONV*F(L0EAS-NY+I)
COEF=COEF+CONV
C.... Donor is new
CONV=0.25*AMAX1(0.0,-COL-CEAW)
FLUX=FLUX+CONV*F(L0NEW+I)
COEF=COEF+CONV
C.... Donor is old
CONV=0.25*AMAX1(0.0,COL-CEAW)
FLUX=FLUX+CONV*F(L0OLD+I)
COEF=COEF+CONV
C.... INDVAR is new
ELSEIF(INDVAR.EQ.INEW) THEN
C.... Donor is north
CONV=0.25*AMAX1(0.0,-CNA-COL)
FLUX=CONV*F(L0NOR+I)
COEF=CONV
C.... Donor is south
CONV=0.25*AMAX1(0.0,CNAS+COL)
FLUX=FLUX+CONV*F(L0SOU+I)
COEF=COEF+CONV
C.... Donor is east
CONV=0.25*AMAX1(0.0,-CEA+COL)
FLUX=FLUX+CONV*F(L0EAS+I)
COEF=COEF+CONV
C.... Donor is west
CONV=0.25*AMAX1(0.0,CEAW+COL)
FLUX=FLUX+CONV*F(L0WES+I)
COEF=COEF+CONV
C.... INDVAR is old
ELSEIF(INDVAR.EQ.IOLD) THEN
C.... Donor is north
CONV=0.25*AMAX1(0.0,-CNA-COL)
FLUX=CONV*F(L0NOR+I)
COEF=CONV
C.... Donor is south
CONV=0.25*AMAX1(0.0,CNAS-COL)
FLUX=FLUX+CONV*F(L0SOU+I)
COEF=COEF+CONV
C.... Donor is east
CONV=0.25*AMAX1(0.0,-CEA-COL)
FLUX=FLUX+CONV*F(L0EAS+I)
COEF=COEF+CONV
C.... Donor is west
CONV=0.25*AMAX1(0.0,CEAW-COL)
FLUX=FLUX+CONV*F(L0WES+I)
COEF=COEF+CONV
C.... Donor is new
CONV=COL
FLUX=FLUX+CONV*F(L0OLN+I)
COEF=COEF+CONV
ENDIF
F(L0VAL+I)=FLUX/(COEF+1.E-20)
F(L0CO+I)=COEF
10 CONTINUE
C.... nx.gt.1, ny.gt.1, steady
ELSEIF(NX.GT.1.AND.NY.GT.1.AND.STEADY) THEN
DO 20 IX=IXF,IXL
CDIR$ IVDEP
DO 20 IY=IYF,IYL
I=IY+(IX-1) * NY
FLUX=0.0
COEF=0.0
CNA=F(L0CNA+I)
CNAS=F(L0CNAS+I)
IF(IY.EQ.1) CNAS=CNA
IF(IY.EQ.NY) CNA=CNAS
CEA=F(L0CEA+I)
CEAW=F(L0CEAW+I)
IF(.NOT.XCYCLE) THEN
IF(IX.EQ.1) CEAW=CEA
IF(IX.EQ.NX) CEA=CEAW
ENDIF
C.... INDVAR is north
IF(INDVAR.EQ.INOR) THEN
C.... Donor is south
CNAN=CNA
IF(IY.EQ.NY) CNAN=0.0
CONV=AMAX1(0.0,-CNAN)
FLUX=CONV*F(L0SOU+1+I)
COEF=CONV
C.... Donor is east
CONV=0.5*AMAX1(0.0,-CEA+CNA)
FLUX=FLUX+CONV*F(L0EAS+I)
COEF=COEF+CONV
C.... Donor is west
CONV=0.5*AMAX1(0.0,CEAW+CNA)
FLUX=FLUX+CONV*F(L0WES+I)
COEF=COEF+CONV
C.... INDVAR is south
ELSEIF(INDVAR.EQ.ISOU) THEN
C.... Donor is north
CNASS=CNAS
IF(IY.EQ.1) CNASS=0.0
CONV=AMAX1(0.0,CNASS)
FLUX=CONV*F(L0NOR-1+I)
COEF=CONV
C.... Donor is east
CONV=0.5*AMAX1(0.0,-CEA-CNAS)
FLUX=FLUX+CONV*F(L0EAS+I)
COEF=COEF+CONV
C.... Donor is west
CONV=0.5*AMAX1(0.0,CEAW-CNAS)
FLUX=FLUX+CONV*F(L0WES+I)
COEF=COEF+CONV
C.... INDVAR is east
ELSEIF(INDVAR.EQ.IEAS) THEN
C.... Donor is north
CONV=0.5*AMAX1(0.0,-CNA+CEA)
FLUX=CONV*F(L0NOR+I)
c if(deb) call writ1r('conv n ',conv)
COEF=CONV
C.... Donor is south
CONV=0.5*AMAX1(0.0,CNAS+CEA)
FLUX=FLUX+CONV*F(L0SOU+I)
c if(deb) call writ1r('conv s ',conv)
COEF=COEF+CONV
C.... Donor is west
CEAWW=CEAW
IF(IX.EQ.1.AND..NOT.XCYCLE) CEAWW=0.0
CONV=AMAX1(0.0,-CEAWW)
FLUX=FLUX+CONV*F(L0WES+NY+I)
c if(deb) call writ1r('conv w ',conv)
COEF=COEF+CONV
C.... INDVAR is west
ELSEIF(INDVAR.EQ.IWES) THEN
C.... Donor is north
CONV=0.5*AMAX1(0.0,-CNA-CEAW)
FLUX=CONV*F(L0NOR+I)
COEF=CONV
C.... Donor is south
CONV=0.5*AMAX1(0.0,CNAS-CEAW)
FLUX=FLUX+CONV*F(L0SOU+I)
COEF=COEF+CONV
C.... Donor is east
CEAWW=CEAW
IF(IX.EQ.1.AND..NOT.XCYCLE) CEAWW=0.0
CONV=AMAX1(0.0,CEAWW)
FLUX=FLUX+CONV*F(L0EAS-NY+I)
COEF=COEF+CONV
ENDIF
F(L0VAL+I)=FLUX/(COEF+1.E-20)
F(L0CO+I)=COEF
20 CONTINUE
ELSEIF(NX.GT.1.AND..NOT.STEADY) THEN
C.... ny.eq.1, nx.gt.1, unsteady
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
CDIR$ IVDEP
DO 30 IX=IXF,IXL
I=IX
CEA=F(L0CEA+I)
CEAW=F(L0CEAW+I)
IF(IX.EQ.1) CEAW=CEA
IF(IX.EQ.NX) CEA=CEAW
COL=F(L0MAS+I)*RECDT
C.... INDVAR is east
IF(INDVAR.EQ.IEAS) THEN
C.... Donor is west
CEAE=CEA
IF(IX.EQ.NX.AND..NOT.XCYCLE) CEAE=0.0
CONV=AMAX1(0.0,-CEAE)
FLUX=CONV*F(L0WES+NY+I)
COEF=CONV
C.... Donor is new
CONV=0.5*AMAX1(0.0,-COL+CEA)
FLUX=FLUX+CONV*F(L0NEW+I)
COEF=COEF+CONV
C.... Donor is old
CONV=0.5*AMAX1(0.0,COL+CEA)
FLUX=FLUX+CONV*F(L0OLD+I)
COEF=COEF+CONV
C.... INDVAR is west
ELSEIF(INDVAR.EQ.IWES) THEN
C.... Donor is east
CEAWW=CEAW
IF(IX.EQ.1) CEAWW=0.0
CONV=AMAX1(0.0,CEAWW)
FLUX=CONV*F(L0EAS-NY+I)
COEF=CONV
C.... Donor is new
CONV=0.5*AMAX1(0.0,-COL-CEAW)
FLUX=FLUX+CONV*F(L0NEW+I)
COEF=COEF+CONV
C.... Donor is old
CONV=0.5*AMAX1(0.0,COL-CEAW)
FLUX=FLUX+CONV*F(L0OLD+I)
COEF=COEF+CONV
C.... INDVAR is new
ELSEIF(INDVAR.EQ.INEW) THEN
C.... Donor is east
CONV=0.5*AMAX1(0.0,-CEA+COL)
FLUX=CONV*F(L0EAS+I)
COEF=CONV
C.... Donor is west
CONV=0.5*AMAX1(0.0,CEAW+COL)
FLUX=FLUX+CONV*F(L0WES+I)
COEF=COEF+CONV
C.... INDVAR is old
ELSEIF(INDVAR.EQ.IOLD) THEN
C.... Donor is east
CONV=0.5*AMAX1(0.0,-CEA-COL)
FLUX=CONV*F(L0EAS+I)
COEF=CONV
C.... Donor is west
CONV=0.5*AMAX1(0.0,CEAW-COL)
FLUX=FLUX+CONV*F(L0WES+I)
COEF=COEF+CONV
C.... Donor is new
CONV=COL
FLUX=FLUX+CONV*F(L0OLN+I)
COEF=COEF+CONV
ENDIF
F(L0VAL+I)=FLUX/(COEF+1.E-20)
F(L0CO+I)=COEF
30 CONTINUE
ELSEIF(NY.GT.1.AND..NOT.STEADY) THEN
C.... nx.eq.1, ny.gt.1, unsteady
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
CDIR$ IVDEP
DO 40 IY=IYF,IYL
I=IY
CNA=F(L0CNA+I)
CNAS=F(L0CNAS+I)
IF(IY.EQ.1) CNAS=CNA
IF(IY.EQ.NY) CNA=CNAS
COL=F(L0MAS+I)*RECDT
C.... INDVAR is north
IF(INDVAR.EQ.INOR) THEN
C.... Donor is south
CNAN=CNA
IF(IY.EQ.NY) CNAN=0.0
CONV=AMAX1(0.0,-CNAN)
FLUX=CONV*F(L0SOU+1+I)
COEF=CONV
C.... Donor is new
CONV=0.5*AMAX1(0.0,-COL+CNA)
FLUX=FLUX+CONV*F(L0NEW+I)
COEF=COEF+CONV
C.... Donor is old
CONV=0.5*AMAX1(0.0,COL+CNA)
FLUX=FLUX+CONV*F(L0OLD+I)
COEF=COEF+CONV
C.... INDVAR is south
ELSEIF(INDVAR.EQ.ISOU) THEN
C.... Donor is north
CNASS=CNAS
IF(IY.EQ.1) CNASS=0.0
CONV=AMAX1(0.0,CNASS)
FLUX=CONV*F(L0NOR-1+I)
COEF=CONV
C.... Donor is new
CONV=0.5*AMAX1(0.0,-COL-CNAS)
FLUX=FLUX+CONV*F(L0NEW+I)
COEF=COEF+CONV
C.... Donor is old
CONV=0.5*AMAX1(0.0,COL-CNAS)
FLUX=FLUX+CONV*F(L0OLD+I)
COEF=COEF+CONV
C.... INDVAR is new
ELSEIF(INDVAR.EQ.INEW) THEN
C.... Donor is north
CONV=0.5*AMAX1(0.0,-CNA-COL)
FLUX=CONV*F(L0NOR+I)
COEF=CONV
C.... Donor is south
CONV=0.5*AMAX1(0.0,CNAS+COL)
FLUX=FLUX+CONV*F(L0SOU+I)
COEF=COEF+CONV
C.... INDVAR is old
ELSEIF(INDVAR.EQ.IOLD) THEN
C.... Donor is north
CONV=0.5*AMAX1(0.0,-CNA-COL)
FLUX=CONV*F(L0NOR+I)
COEF=CONV
C.... Donor is south
CONV=0.5*AMAX1(0.0,CNAS-COL)
FLUX=FLUX+CONV*F(L0SOU+I)
COEF=COEF+CONV
C.... Donor is new
CONV=COL
FLUX=FLUX+CONV*F(L0OLN+I)
COEF=COEF+CONV
ENDIF
F(L0VAL+I)=FLUX/(COEF+1.E-20)
F(L0CO+I)=COEF
40 CONTINUE
ENDIF
c if(deb) then
c call writ1i('indvar ',indvar)
c call prn('co ',co)
c call prn('val ',val)
c endif
END
c