c
C.... FILE NAME GXIO.FTN-------------------------------- 110225
C.... FILE NAME GXIO.FTN-------------------------------- 110225
SUBROUTINE GXIO
INCLUDE 'patnos'
INCLUDE 'patcmn'
INCLUDE 'objnam'
INCLUDE 'farray'
INCLUDE 'd_earth/parvar'
INCLUDE 'satear'
INCLUDE 'grdloc'
INCLUDE 'satgrd'
INCLUDE 'grdear'
INCLUDE 'grdbfc'
INCLUDE 'd_earth/pbcstr'
INCLUDE 'parear'
INCLUDE 'lbnamer'
COMMON/SA1/LBENTI,LBFIL3(4)
COMMON/GENI/NXNY,IGFIL1(8),NFM,IGF(21),IPRL,IBTAU,ILTLS,IGFIL(15),
1 ITEM1,ITEM2,ISPH1,ISPH2,ICON1,ICON2,IPRPS,IRADX,IRADY,IRADZ,IVFOL
COMMON/DRHODP/ITEMP,IDEN/DVMOD/IDVCGR
COMMON/INDAUX/IFL0(4),NSTO,NSOL,IFL(14)
COMMON /INTDMN/IDMN,NUMDMN,NXMAX,NYMAX,NZMAX,NXYMAX,NXYZMX,NCLTOT,
1 NDOMMX
COMMON /GEODMN0/ I3DAEX,I3DANY,I3DAHZ,I3DVOL,I3DDXG,I3DDYG,I3DDZG,
1 I3DDX,I3DDY,I3DDZ,I2DAWB,I2DASB,I2DALB
COMMON /FACES/L0FACE,L0FACZ
COMMON /VRMCMN/L0MSKZ
COMMON/TSKEMI/ LBKP,LBKT,LBET,LBVOSQ,LBOMEG
1 /TSKEMR/ GKTDKP
LOGICAL SLD,QEQ,QNE,FLUID1,DOIT,GRN,LINVRO,MASKPT,QLE,LPTDMN,LEZ,
1 LPAR,EQZ,ISACTIVECELLS,ALTERD
CXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX USER SECTION STARTS:
C
REAL NORML(3),VELIN(3),VELOUT(3),DIR(3),MASFLOW
PARAMETER (MAXDMN = 10)
CHARACTER*12 COBNAM,COBNM2,BLOCKNAM,CVAL*68,PATNM*8
INTEGER L0PCOEF(MAXDMN),L0BLKOUT(MAXDMN),L0BLKIN(MAXDMN),
1 L0DENIN(MAXDMN),L0TOTVEL(MAXDMN),L0VELI(MAXDMN),
1 L0TOTVELO(MAXDMN),L0VELO(MAXDMN),L0PCOEF2(MAXDMN),
1 L0DENIN2(1),L0TOTVEL2(MAXDMN),L0VELI2(MAXDMN),
1 L0TOTVELO2(MAXDMN),L0VELO2(MAXDMN),L0ARATI(MAXDMN),
1 L0ARATO(MAXDMN),L0KEIN(MAXDMN),L0EPIN(MAXDMN),
1 L0GXO(MAXDMN),L0GXI(MAXDMN),NGXIN(MAXDMN),NGXOUT(MAXDMN),
1 L0TOTAREA(MAXDMN),LINKTO(MAXDMN),LINKFROM(MAXDMN),
1 L0ADDQ(MAXDMN),L0VEL(MAXDMN),L0REL(MAXDMN),L0VL2(MAXDMN),
1 L0RL2(MAXDMN),L0IADQ(MAXDMN),L0TURBIN(MAXDMN),
1 L0IADC(MAXDMN,150),L0ADDC(MAXDMN,150),
1 L0ADMIN(MAXDMN,150),L0ADMAX(MAXDMN,150),L0HUNIT(MAXDMN)
C INTEGER INDPATCH
C REAL GETCOVAL4
SAVE L0PCOEF,L0BLKOUT,L0BLKIN,L0DENIN,L0TOTVEL,L0VELI,
1 L0TOTVELO,L0VELO,L0PCOEF2,L0DENIN2,L0TOTVEL2,L0VELI2,
1 L0TOTVELO2,L0VELO2,L0ARATI,L0ARATO,ISURN,ITM3,
1 L0KEIN,L0EPIN,L0GXO,L0GXI,NGXIN,NGXOUT,L0TOTAREA,LINKTO,
1 LINKFROM,L0ADDQ,L0VEL,L0REL,L0VL2,L0RL2,NCELL,ILIM,L0IADQ,
1 L0TURBIN,L0ADDC,L0IADC,L0ADMIN,L0ADMAX
SAVE LPAR,ALTERD
C
C***********************************************************************
IF(IGR==1.AND.ISC==2) THEN
IF(USP) RETURN
IF(NUMDMN>MAXDMN) THEN
CALL WRITBL
CALL WRITST
CALL WRIT40('Please increase MAXDMN in GXIO')
CALL WRIT2I('Current ',MAXDMN,'; Needed',NUMDMN)
CALL WRITST
CALL SET_ERR(557,'MAXDMN too small in GXINOUT',1)
RETURN
ENDIF
C.... Loop over all FGV domains
100 CONTINUE
IF(IDMN>1) CALL INDXDM
NGXIN(IDMN)=0
NGXOUT(IDMN)=0
NCELL=0
LPAR=MIMD.AND.NPROC>1
C... Count ins and outs
CALL GXMAKE0(L0GXO(IDMN),NUMPAT,'GXO') ! stores for sequence number
CALL GXMAKE0(L0GXI(IDMN),NUMPAT,'GXI') ! indexed by patch
ILIM=ITWO(GD_NUMPAT,NUMPAT,LPAR) ! for parallel loop over global patches
DO I=1,ILIM
IF(LPAR) THEN
II=GD_INDPAT(I,1); IF(II<0) CYCLE ! if patch not in domain skip
ELSE
II=I
ENDIF
IF(.NOT.LPTDMN(II)) CYCLE ! not this domain
COBNAM=OBJNAM(II); CVAL=' '
CALL GETSDC(COBNAM,'OUTLET',CVAL)
IF(CVAL=='GXO') THEN ! found ANGLED-OUT
NGXOUT(IDMN)=NGXOUT(IDMN)+1
F(L0GXO(IDMN)+II)=NGXOUT(IDMN)
CVAL=' '
CALL GETSDC(COBNAM,'DEDUCED',CVAL) ! external velocity deduced
IF(CVAL=='YES') THEN ! get max number of cells in patch
CALL GETPAT(II,IR,GTYP,IX1,IX2,IY1,IY2,IZ1,IZ2,IT1,IT2)
NCELL=MAX(NCELL,(IX2-IX1+1)*(IY2-IY1+1)*(IZ2-IZ1+1))
ENDIF
CVAL=' '
CALL GETSDC(COBNAM,'DEDUCED2',CVAL) ! external velocity deduced
IF(CVAL=='YES') THEN
CALL GETPAT(II,IR,GTYP,IX1,IX2,IY1,IY2,IZ1,IZ2,IT1,IT2)
NCELL=MAX(NCELL,(IX2-IX1+1)*(IY2-IY1+1)*(IZ2-IZ1+1))
ENDIF
ENDIF
CVAL=' '
CALL GETSDC(COBNAM,'INLET',CVAL)
IF(CVAL=='GXI') THEN ! found ANGLED-IN
NGXIN(IDMN)=NGXIN(IDMN)+1
F(L0GXI(IDMN)+II)=NGXIN(IDMN)
ENDIF
ENDDO
C... Sum number of GXI's over all processors to ensure all have arrays set
IF(LPAR) CALL GLSUMI(NGXIN(IDMN))
IF(NGXOUT(IDMN)>0) THEN ! there are GXOs
NUM=NGXOUT(IDMN) ! stores are indexed by sequence number
CALL GXMAKE0(L0PCOEF(IDMN),NUM,'PCOEFF') ! P1 coefficient
CALL GXMAKE0(L0BLKOUT(IDMN),NUM,'BLKOUT') ! parent blockage
CALL GXMAKE0(L0TOTVELO(IDMN),NUM,'TOTVELO') ! outlet total velocity
CALL GXMAKE0(L0VELO(IDMN),3*NUM,'VELOUT') ! outlet velocity vector
CALL GXMAKE0(L0ARATO(IDMN),NUM,'ARATO') ! outlet area ratio
IF(NCELL>0) THEN
CALL GXMAKE(L0REL(IDMN),NUM,'RELX') ! relaxation for deduced
CALL GXMAKE(L0VEL(IDMN),NUM*NCELL,'VELIN') ! initial guess for deduced
ENDIF
IF(.NOT.ONEPHS) THEN
CALL GXMAKE0(L0PCOEF2(IDMN),NUM,'PCOEFF') ! P2 coefficient
CALL GXMAKE0(L0TOTVELO2(IDMN),NUM,'TOTVELO') ! outlet total velocity
CALL GXMAKE0(L0VELO2(IDMN),3*NUM,'VELOUT') ! outlet velocity vector
IF(NCELL>0) THEN
CALL GXMAKE(L0RL2(IDMN),NUM,'RELX2') ! relaxation for deduced
CALL GXMAKE(L0VL2(IDMN),NUM*NCELL,'VELIN2') ! initial guess for deduced
ENDIF
ENDIF
ENDIF
C
IF(NGXIN(IDMN)>0) THEN ! there are GXIs
NUM=NGXIN(IDMN) ! stores are indexed by sequence number
CALL GXMAKE0(L0BLKIN(IDMN),NUM,'BLKIN') ! parent blockage
CALL GXMAKE0(L0DENIN(IDMN),NUM,'DENIN') ! inlet density
CALL GXMAKE0(L0TOTVEL(IDMN),NUM,'TOTVEL') ! inlet total velocity
CALL GXMAKE0(L0VELI(IDMN),3*NUM,'VELIN') ! inlet velocity vector
CALL GXMAKE0(L0ARATI(IDMN),NUM,'ARATO') ! intlet area ratio
IF(.NOT.ONEPHS) THEN
CALL GXMAKE0(L0DENIN2(IDMN),NUM,'DENIN') ! inlet density
CALL GXMAKE0(L0TOTVEL2(IDMN),NUM,'TOTVEL') ! inlet total velocity
CALL GXMAKE0(L0VELI2(IDMN),3*NUM,'VELIN') ! inlet velocity vector
ENDIF
IF(GRN(ENUT)) THEN
CALL GXMAKE0(L0KEIN(IDMN),NUM,'KEIN')
CALL GXMAKE0(L0EPIN(IDMN),NUM,'EPIN')
CALL GXMAKE0(L0TURBIN(IDMN),NUM,'TURBIN')
ENDIF
CALL GXMAKE0(L0TOTAREA(IDMN),NUM,'TOTAREA')
NUM2=ITWO(ILIM,NUM,LPAR) ! parallel LINKTO is global, sequential is not
CALL GXMAKE0(LINKTO(IDMN),NUM2,'LINKTO')
CALL GXMAKE0(L0ADDQ(IDMN),NUM,'ADDQ')
CALL GXMAKE0(L0IADQ(IDMN),NUM,'IADQ')
DO IPHI=16,NPHI
IF(.NOT.SOLVE(IPHI)) CYCLE
CALL GXMAKE0(L0IADC(IDMN,IPHI),NUM,'IADC')
CALL GXMAKE0(L0ADDC(IDMN,IPHI),NUM,'ADDC')
CALL GXMAKE0(L0ADMIN(IDMN,IPHI),NUM,'MINVAL')
CALL GXMAKE0(L0ADMAX(IDMN,IPHI),NUM,'MAXVAL')
IF(NAME(IPHI)=='MH2O') CALL GXMAKE0(L0HUNIT(IDMN),NUM,
1 'HUNIT')
ENDDO
ENDIF
C
IOUT=0; IIN=0
DO IP=1,ILIM ! loop over patches to get and set data from Q1
IF(LPAR) THEN ! get object name for parallel
COBNAM=GD_OBJNAM(IP)
II=GD_INDPAT(IP,1) ! get local patch number. -ve means not on this proc.
ELSE
II=IP
IF(.NOT.LPTDMN(II)) CYCLE ! not this domain
COBNAM=OBJNAM(II) ! name of object for current patch
ENDIF
CVAL=' '; CALL GETSDC(COBNAM,'OUTLET',CVAL)
IF(II>0.AND.CVAL=='GXO') THEN ! found ANGLED-OUT on this processor
IOUT=IOUT+1
C... deal with angled outlets
PCOEFF=1000. ! default P1 coefficient
CALL GETSDR(COBNAM,'PCOEF',PCOEFF) ! get P1 coefficient
F(L0PCOEF(IDMN)+IOUT)=PCOEFF ! store for later use
BLOCKNAM=' '; IBLK=0
CALL GETSDC(COBNAM,'BLOCKAGE',BLOCKNAM) ! get name of parent
IF(BLOCKNAM/=' ') THEN ! parent name set, so find patch number
DO III=1,ILIM
IF(LPAR) THEN ! get object name for parallel
COBNM2=GD_OBJNAM(III)
ELSE
COBNM2= OBJNAM(III)
ENDIF
IF(COBNM2==BLOCKNAM) THEN
IF(LPAR) THEN
IBLK=GD_INDPAT(III,1)
ELSE
IBLK=III
ENDIF
EXIT
ENDIF
ENDDO
ENDIF
C... If IBLK is zero, angled-out will attach to any blockage it intersects
F(L0BLKOUT(IDMN)+IOUT)=FLOAT(IBLK) ! store for later use
C... Set total outlet velocity if present
TOTVELO=-999.
CALL GETSDR(COBNAM,'TOTVELO',TOTVELO) ! outlet total velocity
F(L0TOTVELO(IDMN)+IOUT)=TOTVELO
C... Set outlet velocity vector if total velocity not set
IF(QEQ(TOTVELO,-999.0)) THEN ! outlet velocity vector
CVAL='NO'
CALL GETSDC(COBNAM,'DEDUCED',CVAL) ! outlet total velocity
IF(CVAL=='NO') THEN ! set external velocity
CALL GETSDR(COBNAM,'UOUT',F(L0VELO(IDMN)+(IOUT-1)*3+1))
! get U
CALL GETSDR(COBNAM,'VOUT',F(L0VELO(IDMN)+(IOUT-1)*3+2))
! get V
CALL GETSDR(COBNAM,'WOUT',F(L0VELO(IDMN)+(IOUT-1)*3+3))
! get W
ELSE ! deduced external velocity
F(L0TOTVELO(IDMN)+IOUT)=-9999.0
VIN=0.0
CALL GETSDR(COBNAM,'VELIN',VIN) ! initial guess
DO IC=1,NCELL
F(L0VEL(IDMN)+(IOUT-1)*NCELL+IC)=VIN
ENDDO
RELX=0.3
CALL GETSDR(COBNAM,'RELAX',RELX) ! relaxation factor
F(L0REL(IDMN)+IOUT)=RELX
ENDIF
ENDIF
C... Set outlet area ratio
ARAT=1.0
CALL GETSDR(COBNAM,'ARATO',ARAT)
F(L0ARATO(IDMN)+IOUT)=ARAT
IF(.NOT.ONEPHS) THEN
PCOEFF=1000000. ! default P2 coefficient
CALL GETSDR(COBNAM,'PCOEF2',PCOEFF) ! get P2 coefficient
F(L0PCOEF2(IDMN)+IOUT)=PCOEFF ! store for later use
C... Set total outlet velocity if present
TOTVELO=-999.
CALL GETSDR(COBNAM,'TOTVELO2',TOTVELO) ! outlet total velocity
F(L0TOTVELO2(IDMN)+IOUT)=TOTVELO
C... Set outlet velocity vector if total velocity not set
IF(QEQ(TOTVELO,-999.0)) THEN ! outlet velocity vector
CVAL='NO'
CALL GETSDC(COBNAM,'DEDUCED2',CVAL) ! outlet total velocity
IF(CVAL=='NO') THEN
CALL GETSDR(COBNAM,'UOUT2',F(L0VELO2(IDMN)+(IOUT-1)*3
1 +1)) ! get U comp
CALL GETSDR(COBNAM,'VOUT2',F(L0VELO2(IDMN)+(IOUT-1)*3
1 +2)) ! get V comp
CALL GETSDR(COBNAM,'WOUT2',F(L0VELO2(IDMN)+(IOUT-1)*3
1 +3)) ! get W comp
ELSE
F(L0TOTVELO2(IDMN)+IOUT)=-9999.0
VIN=0.0
CALL GETSDR(COBNAM,'VELIN2',VIN)
DO IC=1,NCELL
F(L0VL2(IDMN)+(IOUT-1)*NCELL+IC)=VIN
ENDDO
RELX=0.3
CALL GETSDR(COBNAM,'RELAX2',RELX)
F(L0RL2(IDMN)+IOUT)=RELX
ENDIF
ENDIF
ENDIF
C... If STORE(CARE) in Q1, save surface areas into CARE
LBARR=LBNAME('CARE')
IF(LBARR>0) THEN ! need area
C... get patch limits, and sum surface area
L0FACZ0=L0FACZ; IZSTEP=1
IF(II<0) GO TO 10021 ! skip loop for parallel, other processor
CALL GETPAT(II,IREG,TYP,JXF,JXL,JYF,JYL,JZF,JZL,JTF,JTL)
IBLK=NINT(F(L0BLKOUT(IDMN)+IOUT))
DO IZZ=JZF,JZL
IZZM1=(IZZ-1)*NXNY
L0FACZ= L0FACE+IZZM1
L0ARR=L0F(ANYZ(LBARR,IZZ))
IF(MASKPT(II)) L0MSKZ= L0PVAR(22,II,IZZ)
L0PAT=L0PATNO(IDMN)+(IZZ-1)*NXNY ! index for patch-number store
IPW=0
DO IXX=JXF,JXL
DO IYY=JYF,JYL
I=(IXX-1)*NY+IYY; IPW= IPW+ 1
F(L0ARR+I)=0.0
IF(LPAR) THEN
IF(.NOT.ISACTIVECELLS(IXX,IYY,IZZ)) CYCLE
ENDIF
IF(.NOT.SLD(I).AND.LINVRO(IPW))THEN
CALL GET_SURFACE(IXX,IYY,IZZ,IBLK,L0PAT,CAREA,
1 NORML,IPLUS)
F(L0ARR+I)=CAREA
ENDIF
ENDDO
ENDDO
ENDDO
10021 CONTINUE
ENDIF
ENDIF
C
CVAL=' '; CALL GETSDC(COBNAM,'INLET',CVAL)
IF(CVAL=='GXI') THEN ! found ANGLED-IN
C... Deal with Angled inlets, and cartesian velocities in polar
IF(II>0) IIN=IIN+1
C... find parent blockage if set
BLOCKNAM=' '; IBLK=0
CALL GETSDC(COBNAM,'BLOCKAGE',BLOCKNAM) ! get name of parent
IF(BLOCKNAM/=' ') THEN ! parent name set, so find patch number
DO III=1,ILIM
IF(LPAR) THEN ! get object name for parallel
COBNM2=GD_OBJNAM(III)
ELSE
COBNM2= OBJNAM(III)
ENDIF
IF(COBNM2==BLOCKNAM) THEN
IBLK=III
EXIT
ENDIF
ENDDO
ENDIF
IF(II>0) F(L0BLKIN(IDMN)+IIN)=FLOAT(IBLK)
BLOCKNAM=' '; IBLK=0
CALL GETSDC(COBNAM,'LINKTO',BLOCKNAM) ! get name of linked
IF(BLOCKNAM/=' ') THEN
IF(BLOCKNAM=='NEXT') THEN ! find next ANGLED-IN
C... search for next ANGLED-IN in list
DO III=IP+1,ILIM
CVAL=' '
IF(LPAR) THEN
COBNAM=GD_OBJNAM(III)
CALL GETSDC(COBNAM,'INLET',CVAL)
ELSE
CALL GETSDC(OBJNAM(III),'INLET',CVAL)
ENDIF
IF(CVAL=='GXI') THEN
IBLK=III
EXIT
ENDIF
ENDDO
IF(IBLK==0) THEN
CALL WRIT40('No NEXT ANGLED-IN found for '
1 //OBJNAM(II))
ENDIF
ELSEIF(BLOCKNAM=='PREVIOUS') THEN ! find previous ANGLED-IN
C... search for previous ANGLED-IN in list
DO III=IP-1,1,-1
CVAL=' '
IF(LPAR) THEN
COBNAM=GD_OBJNAM(III)
CALL GETSDC(COBNAM,'INLET',CVAL)
ELSE
CALL GETSDC(OBJNAM(III),'INLET',CVAL)
ENDIF
IF(CVAL=='GXI') THEN
IBLK=III
EXIT
ENDIF
ENDDO
IF(IBLK==0) THEN
CALL WRIT40('No PREVIOUS ANGLED-IN found for '
1 //OBJNAM(II))
ENDIF
ELSE ! search for named ANGLED-IN
C... search for named ANGLED-IN
DO III=1,ILIM
IF(LPAR) THEN
COBNAM=GD_OBJNAM(III)
ELSE
COBNAM=OBJNAM(III)
ENDIF
IF(COBNAM==BLOCKNAM) THEN
IBLK=III
EXIT
ENDIF
ENDDO
IF(IBLK==0) THEN
CALL WRIT40('Cannot find linked ANGLED-IN for '
1 //OBJNAM(II))
ENDIF
ENDIF
IF(IBLK==0) THEN ! error finding linked ANGLED-IN
CALL SET_ERR(574,'Cannot find linked ANGLED-IN for '
1 //OBJNAM(II),1)
ENDIF
IF(II>0) THEN
TADD=-999.0
CALL GETSDR(OBJNAM(II),'TADD',TADD) ! get additional temp
IF(QNE(TADD,-999.0)) THEN ! found it
F(L0ADDQ(IDMN)+IIN)=TADD
F(L0IADQ(IDMN)+IIN)=2.
ELSE ! not found, try exit temp
TOUT=-999.0
CALL GETSDR(OBJNAM(II),'TOUT',TOUT) ! get exit temp
IF(QNE(TOUT,-999.0)) THEN ! found it
F(L0ADDQ(IDMN)+IIN)=TOUT
F(L0IADQ(IDMN)+IIN)=1.
ELSE ! not found, try added heat
QADD=0.0
CALL GETSDR(OBJNAM(II),'QADD',QADD) ! get additional heat
F(L0ADDQ(IDMN)+IIN)=QADD
F(L0IADQ(IDMN)+IIN)=0.
ENDIF
ENDIF
IF(ITEM1>0) THEN
TMIN=VARMIN(ITEM1);CALL GETSDR(OBJNAM(II),'TMIN',TMIN)
F(L0ADMIN(IDMN,ITEM1)+IIN)=TMIN
TMAX=VARMAX(ITEM1);CALL GETSDR(OBJNAM(II),'TMAX',TMAX)
F(L0ADMAX(IDMN,ITEM1)+IIN)=TMAX
ELSEIF(SOLVE(H1)) THEN
HMIN=VARMIN(H1); CALL GETSDR(OBJNAM(II),'HMIN',HMIN)
F(L0ADMIN(IDMN,H1)+IIN)=HMIN
HMAX=VARMAX(H1); CALL GETSDR(OBJNAM(II),'HMAX',HMAX)
F(L0ADMAX(IDMN,H1)+IIN)=HMAX
ENDIF
IF(ITEM2>0) THEN
TMIN=VARMIN(ITEM2);CALL GETSDR(OBJNAM(II),'TMIN',TMIN)
F(L0ADMIN(IDMN,ITEM2)+IIN)=TMIN
TMAX=VARMAX(ITEM2);CALL GETSDR(OBJNAM(II),'TMAX',TMAX)
F(L0ADMAX(IDMN,ITEM2)+IIN)=TMAX
ELSEIF(SOLVE(H2)) THEN
HMIN=VARMIN(H2); CALL GETSDR(OBJNAM(II),'HMIN',HMIN)
F(L0ADMIN(IDMN,H2)+IIN)=HMIN
HMAX=VARMAX(H2); CALL GETSDR(OBJNAM(II),'HMAX',HMAX)
F(L0ADMAX(IDMN,H2)+IIN)=HMAX
ENDIF
C.... Source-type flag held in F(L0IADC(IDMN,IPHI),IIN)
C 0 - added flux CFLX
C 1 - fixed exit value COUT
C 2 - added exit value CADD
C 3 - % removal CREM
C IPHI - variable index, II - angled-in counter
DO IPHI=16,NPHI
IF(IPHI==ITEM1.OR.IPHI==ITEM2) CYCLE
IF(.NOT.SOLVE(IPHI)) CYCLE
CADD=-999.0
WRITE(CVAL,'(''CREM'',I3.3)') IPHI; LL=LENGZZ(CVAL)
CALL GETSDR(OBJNAM(II),CVAL(1:LL),CADD) ! Removal %
IF(QNE(CADD,-999.0)) THEN ! found it
F(L0ADDC(IDMN,IPHI)+IIN)=CADD
F(L0IADC(IDMN,IPHI)+IIN)=3.
ELSE ! not found, try additional C
WRITE(CVAL,'(''CADD'',I3.3)') IPHI; LL=LENGZZ(CVAL)
CALL GETSDR(OBJNAM(II),CVAL(1:LL),CADD) ! get additional C
IF(QNE(CADD,-999.0)) THEN ! found it
F(L0ADDC(IDMN,IPHI)+IIN)=CADD
F(L0IADC(IDMN,IPHI)+IIN)=2.
ELSE ! not found, try exit C
COUT=-999.0
WRITE(CVAL,'(''COUT'',I3.3)') IPHI;LL=LENGZZ(CVAL)
CALL GETSDR(OBJNAM(II),CVAL(1:LL),COUT) ! get exit C
IF(QNE(COUT,-999.0)) THEN ! found it
F(L0ADDC(IDMN,IPHI)+IIN)=COUT
F(L0IADC(IDMN,IPHI)+IIN)=1.
ELSE ! not found, try added C flux
CADD=0.0
WRITE(CVAL,'(''CFLX'',I3.3)')IPHI;L=LENGZZ(CVAL)
CALL GETSDR(OBJNAM(II),CVAL(1:L),CADD) ! get additional C
F(L0ADDC(IDMN,IPHI)+IIN)=CADD
F(L0IADC(IDMN,IPHI)+IIN)=0.
ENDIF
ENDIF
ENDIF
WRITE(CVAL,'(''CMIN'',I3.3)') IPHI; LL=LENGZZ(CVAL)
CMIN=VARMIN(IPHI)
CALL GETSDR(OBJNAM(II),CVAL(1:LL),CMIN)
F(L0ADMIN(IDMN,IPHI)+IIN)=CMIN
WRITE(CVAL,'(''CMAX'',I3.3)') IPHI; LL=LENGZZ(CVAL)
CMAX=VARMAX(IPHI)
CALL GETSDR(OBJNAM(II),CVAL(1:LL),CMAX)
F(L0ADMAX(IDMN,IPHI)+IIN)=CMAX
IF(NAME(IPHI)=='MH2O') THEN
IHUNIT=0; CALL GETSDI(OBJNAM(II),'HUNIT',IHUNIT)
F(L0HUNIT(IDMN)+IIN) = IHUNIT
ENDIF
ENDDO
ENDIF
ENDIF
IINL=ITWO(IP,IIN,LPAR)
F(LINKTO(IDMN)+IINL)=FLOAT(IBLK)
C... set inlet density
IF(RHO1<=0.0) THEN ! initialise inlet density
RHOIN=1.0
ELSE
RHOIN=RHO1
ENDIF
CALL GETSDR(COBNAM,'DENIN',RHOIN) ! get density at inlet
IF(II>0) F(L0DENIN(IDMN)+IIN)=RHOIN
C... Set inlet area ratio
ARAT=1.0
CALL GETSDR(COBNAM,'ARATI',ARAT)
IF(II>0) F(L0ARATI(IDMN)+IIN)=ARAT
C... Set total inlet velocity if present
TOTVEL=-999.
CALL GETSDR(COBNAM,'TOTVEL',TOTVEL) ! inlet total velocity
IF(QNE(TOTVEL,-999.0).AND.II>0) THEN
C... for -ve total velocity, set density to GRND, to flag in-cell density
IF(TOTVEL<0.0) F(L0DENIN(IDMN)+IIN)=GRND
ENDIF
IF(II>0) F(L0TOTVEL(IDMN)+IIN)=TOTVEL
C... Set inlet velocity vector if total velocity not set
IF(QEQ(TOTVEL,-999.0)) THEN ! inlet velocity vector
UVEL=0.0; VVEL=0.0; WVEL=0.0
CALL GETSDR(COBNAM,'UIN',UVEL) ! get U cmp
CALL GETSDR(COBNAM,'VIN',VVEL) ! get V cmp
CALL GETSDR(COBNAM,'WIN',WVEL) ! get W cmp
IF(II>0) THEN ! on this processor
F(L0VELI(IDMN)+(IIN-1)*3+1)=UVEL
F(L0VELI(IDMN)+(IIN-1)*3+2)=VVEL
F(L0VELI(IDMN)+(IIN-1)*3+3)=WVEL
ENDIF
ENDIF
C... Set inlet volumetric or mass flow rate
CALL SUB2R(VOLFLOW,-999.0,MASFLOW,-999.0)
CALL GETSDR(COBNAM,'VOLFLOW',VOLFLOW) ! inlet volume flow
CALL GETSDR(COBNAM,'MASFLOW',MASFLOW) ! inlet mass flow
C... If STORE(CARE) in Q1, save surface ares into CARE
LBARR=LBNAME('CARE')
IF(QNE(VOLFLOW,-999.0).OR.QNE(MASFLOW,-999.0).OR.
1 GRN(ENUT).OR.ISG62==1.OR.LBARR>0) THEN ! need area
C... get patch limits, and sum surface area
TOTAREA=0.0
L0FACZ0=L0FACZ
IF(II<0) GO TO 1002 ! skip loop for parallel, other processor
CALL GETPAT(II,IREG,TYP,JXF,JXL,JYF,JYL,JZF,JZL,JTF,JTL)
IBLK=NINT(F(L0BLKIN(IDMN)+IIN))
IZSTEP=1 ! initialise for L0F
DO IZZ=JZF,JZL
IZZM1=(IZZ-1)*NXNY
L0FACZ= L0FACE+IZZM1
IF(LBARR>0) L0ARR=L0F(ANYZ(LBARR,IZZ))
IF(MASKPT(II)) L0MSKZ= L0PVAR(22,II,IZZ)
L0PAT=L0PATNO(IDMN)+(IZZ-1)*NXNY ! index for patch-number store
IPW=0
DO IXX=JXF,JXL
DO IYY=JYF,JYL
I=(IXX-1)*NY+IYY; IPW= IPW+ 1
IF(LBARR>0) F(L0ARR+I)=0.0
IF(LPAR) THEN
IF(.NOT.ISACTIVECELLS(IXX,IYY,IZZ)) CYCLE
ENDIF
IF(.NOT.SLD(I).AND.LINVRO(IPW))THEN
CALL GET_SURFACE(IXX,IYY,IZZ,IBLK,L0PAT,CAREA,
1 NORML,IPLUS)
TOTAREA=TOTAREA+CAREA
IF(LBARR>0) F(L0ARR+I)=CAREA
ENDIF
ENDDO
ENDDO
ENDDO
1002 CONTINUE
IF(LPAR) CALL GLSUM(TOTAREA) ! sum over all processors
IF(II>0) F(L0TOTAREA(IDMN)+IIN)=TOTAREA
C.... deduce total velocity from flowrate/area
IF(QNE(VOLFLOW,-999.0).AND.II>0) THEN
F(L0TOTVEL(IDMN)+IIN)=VOLFLOW/(ARAT*TOTAREA+TINY)
C... for -ve volume flow rate, set density to GRND, to flag in-cell density
IF(VOLFLOW<0.0) F(L0DENIN(IDMN)+IIN)=GRND
ELSEIF(QNE(MASFLOW,-999.0).AND.II>0) THEN
F(L0TOTVEL(IDMN)+IIN)=MASFLOW/(ARAT*RHOIN*TOTAREA+TINY)
C... for mass flow rate, set density to -ve, to flag mass flow
F(L0DENIN(IDMN)+IIN)=-RHOIN
ENDIF
L0FACZ=L0FACZ0
ENDIF
IF(GRN(ENUT).AND.II>0) THEN
LBENTI=LBNAME('ENTI')
C... Inlet values for Turbulence
TURBIN=-999.; CALL GETSDR(COBNAM,'TURBIN',TURBIN)
F(L0TURBIN(IDMN)+IIN)=TURBIN
IF(QNE(TURBIN,-999.0)) THEN ! Intensity was set
IF(QEQ(F(L0TOTVEL(IDMN)+IIN),-999.)) THEN
VEL= (F(L0VELI(IDMN)+(IIN-1)*3+1)**2+
1 F(L0VELI(IDMN)+(IIN-1)*3+2)**2+
1 F(L0VELI(IDMN)+(IIN-1)*3+3)**2)**0.5
ELSE
VEL=F(L0TOTVEL(IDMN)+IIN)
ENDIF
GKEIN=(TURBIN*VEL)**2
F(L0KEIN(IDMN)+IIN)=GKEIN
VISCRAT=-999.0; CALL GETSDR(COBNAM,'VISCRAT',VISCRAT)
IF(VISCRAT>0.0) THEN ! Viscosity ratio
ENULIN=1E-5; CALL GETSDR(COBNAM,'ENULIN',ENULIN)
IF(IENUTA<21) THEN
EPINL=CMU*CD*GKEIN**2/(VISCRAT*ENULIN)
ELSE
EPINL=ENULIN*VISCRAT
ENDIF
ELSE ! length scale
GLEN=-999.0; CALL GETSDR(COBNAM,'REFLEN',GLEN)
IF(GLEN<0.0) GLEN=0.1*(TOTAREA/(4.*ATAN(1.)))**0.5 ! hydraulic radius
IF(IENUTA<21) THEN
EPINL=CMUCD**0.75*GKEIN**1.5/GLEN
ELSE
EPINL=CMUCD**0.25*GKEIN**0.5*GLEN
ENDIF
ENDIF
F(L0EPIN(IDMN)+IIN)=EPINL
ELSE ! Intensity not set, so get inlet KE and EP
GKEIN=-999.; CALL GETSDR(COBNAM,'KEIN',GKEIN)
IF(QNE(GKEIN,-999.)) THEN
IF(SOLVE(KE)) THEN
F(L0KEIN(IDMN)+IIN)=GKEIN
ENDIF
ENDIF
GEPIN=-999.; CALL GETSDR(COBNAM,'EPIN',GEPIN)
IF(QNE(GEPIN,-999.)) THEN
IF(SOLVE(EP).OR.SOLVE(LBOMEG).OR.SOLVE(LBET).OR.
1 SOLVE(LBKP) .OR.SOLVE(LBKT).OR.
1 SOLVE(LBENTI)) THEN
F(L0EPIN(IDMN)+IIN)=GEPIN
ENDIF
ENDIF
ENDIF
ENDIF
IF(.NOT.ONEPHS) THEN
C... set inlet density
IF(RHO2<=0.0) THEN ! initialise inlet density
RHOIN=1000.0
ELSE
RHOIN=RHO2
ENDIF
CALL GETSDR(COBNAM,'DENIN2',RHOIN) ! get density at inlet
IF(II>0) F(L0DENIN2(IDMN)+IIN)=RHOIN
C... Set total inlet velocity if present
TOTVEL=-999.
CALL GETSDR(COBNAM,'TOTVEL2',TOTVEL) ! inlet total velocity
IF(QNE(TOTVEL,-999.0).AND.II>0) THEN
C... for -ve total velocity, set density to -1, to flag in-cell density
IF(TOTVEL<0.0) F(L0DENIN2(IDMN)+IIN)=-1.0
ENDIF
IF(II>0) F(L0TOTVEL2(IDMN)+IIN)=TOTVEL
C... Set inlet velocity vector if total velocity not set
IF(QEQ(TOTVEL,-999.0)) THEN ! inlet velocity vector
UVEL=0.0; VVEL=0.0; WVEL=0.0
CALL GETSDR(COBNAM,'UIN2',UVEL) ! get U
CALL GETSDR(COBNAM,'VIN2',VVEL) ! get V
CALL GETSDR(COBNAM,'WIN2',WVEL) ! get W
IF(II>0) THEN
F(L0VELI2(IDMN)+(IIN-1)*3+1)=UVEL
F(L0VELI2(IDMN)+(IIN-1)*3+2)=VVEL
F(L0VELI2(IDMN)+(IIN-1)*3+3)=WVEL
ENDIF
ENDIF
C... Set inlet volumetric flow rate
CALL SUB2R(VOLFLOW,-999.0,MASFLOW,-999.0)
CALL GETSDR(COBNAM,'VOLFLOW2',VOLFLOW) ! inlet volume flow
CALL GETSDR(COBNAM,'MASFLOW2',MASFLOW) ! inlet mass flow
IF(QNE(VOLFLOW,-999.0).OR.QNE(MASFLOW,-999.0)) THEN ! extraction rate set
C... get patch limits, and sum surface area
TOTAREA=0.0
IF(II<0) GO TO 1003
CALL GETPAT(II,IREG,TYP,JXF,JXL,JYF,JYL,JZF,JZL,JTF,
1 JTL)
L0FACZ0=L0FACZ
DO IZZ=JZF,JZL
IZZM1=(IZZ-1)*NXNY
L0FACZ= L0FACE+IZZM1
IF(MASKPT(II)) L0MSKZ= L0PVAR(22,II,IZZ)
L0PAT=L0PATNO(IDMN)+(IZZ-1)*NXNY ! index for patch-number store
IPW=0
IBLK=NINT(F(L0BLKIN(IDMN)+IIN))
DO IXX=JXF,JXL
DO IYY=JYF,JYL
I=(IXX-1)*NY+IYY
IPW= IPW+ 1
IF(.NOT.SLD(I).AND.LINVRO(IPW)) THEN
CALL GET_SURFACE(IXX,IYY,IZZ,IBLK,L0PAT,
1 CAREA,NORML,IPLUS)
TOTAREA=TOTAREA+CAREA
ENDIF
ENDDO
ENDDO
ENDDO
1003 CONTINUE
IF(LPAR) CALL GLSUM(TOTAREA)
IF(QNE(VOLFLOW,-999.0).AND.II>0) THEN
C.... deduce total velocity from flowrate/area
F(L0TOTVEL2(IDMN)+IIN)=VOLFLOW/(ARAT*TOTAREA+TINY)
C... for -ve flow rate, set density to -1, to flag in-cell density
IF(VOLFLOW<0.0) F(L0DENIN2(IDMN)+IIN)=-1.0
ELSEIF(QNE(MASFLOW,-999.0).AND.II>0) THEN
F(L0TOTVEL2(IDMN)+IIN)=MASFLOW/(ARAT*TOTAREA*RHOIN+
1 TINY)
ENDIF
ENDIF
ENDIF
ENDIF
ENDDO
C... loop back for next FGV domain
IF(IDMN1) THEN
IDMN=1
CALL INDXDM
ENDIF
C... set index for SURN
ISURN=LBSURN
C... set index for T3
ITM3=LBNAME('T3')
C*****************************************************************
C
C--- GROUP 13. Boundary conditions and special sources
C Index for Coefficient - CO
C Index for Value - VAL
ELSEIF(IGR==13.AND.ISC==3) THEN
C------------------- SECTION 3 ------------- coefficient = GRND2
C
C Fixed pressure at OPENING - set pressure
C ----------------------------------------
C The patch name can be anything. The COefficient for P1 must be set to GRND2.
C The COefficient for T3 can also be set to GRND2 to set a radiative loss
C to the surroundings. The VALue for T3 sets the external temperature.
C
C Inputs:
C SPEDAT(SET,object_name,OUTLET,C,GXO) - identifies this as an Angled-out patch
C SPEDAT(SET,object_name,BLOCKAGE,C,name_of_blockage) - sets the
C name of the blockage object this outlet sits on. If not set,
C it will sit on any blockage within the bounding box.
C SPEDAT(SET,object_name,PCOEF,R,pressure_coefficient) - sets
C the coefficient used to fix the pressure. If not set, 1000 is used.
C
IOUT=NINT(F(L0GXO(IDMN)+IPAT))
IIN=NINT(F(L0GXI(IDMN)+IPAT))
DOIT=(IOUT+IIN)>0
IF(DOIT) THEN
IPT=MAX(IOUT,IIN)
DOIT=.FALSE.
IF(INDVAR==P1.OR.INDVAR==P2.OR.INDVAR==R1.OR.
1 INDVAR==R2) THEN
C... Set CO for fixed pressure
IF(FLUID1(INDVAR)) THEN
PCOEFF=F(L0PCOEF(IDMN) +IPT) ! get P1 coefficient
ELSE
PCOEFF=F(L0PCOEF2(IDMN)+IPT) ! get P2 coefficient
ENDIF
IF(LEZ(PCOEFF)) THEN
CALL GETCOV(NPATCH,INDVAR,GCO,GVAL)
L0P1=L0F(P1); l0vall=0
if(lbname('PVAL')>0) then
l0vall=l0f(lbname('PVAL'))
endif
ENDIF
DOIT=.TRUE.
ELSEIF(INDVAR==ITM3) THEN
C... prepare CO for T3
SIGMA=5.6697E-08
L0T3=L0F(ITM3)
CALL GETCOV(NPATCH,INDVAR,GCO,GVAL)
TW =GVAL+TEMP0
TW2=TW**2
TW3=TW**3
DOIT=.TRUE.
ENDIF
IF(DOIT) THEN
L0CO=L0F(CO) ! index for COefficient
L0PAT=L0PATNO(IDMN)+(IZ-1)*NXNY ! index for patch-number store
IF(HOL.OR.SURF.OR.LEZ(PCOEFF)) THEN
IDEN=ITWO(DEN1,DEN2,FLUID1(INDVAR))
L0DEN=L0F(IDEN)
IF(RSG163==0.0) RSG163=1.0
ENDIF
C... get parent blockage patch number
IF(IOUT>0) THEN
IBLK=NINT(F(L0BLKOUT(IDMN)+IPT))
ELSE
IBLK=NINT(F(L0BLKIN(IDMN)+IPT))
ENDIF
IPW=0
C... loop over all cells in bounding box
DO IX=IXF,IXL
DO IY=IYF,IYL
I=(IX-1)*NY+IY
F(L0CO+I)=0.0 ! initialise CO to 0.0
C... locate cells which are in fluid, but have patch number >0,
C i.e. lie on fluid-side of intersection of outlet and blockage
IPW=IPW+1
IF(.NOT.SLD(I).AND.LINVRO(IPW)) THEN
CALL GET_SURFACE(IX,IY,IZ,IBLK,L0PAT,CAREA,NORML,IPLS)
C... CAREA is surface area in affected cell.
IF(CAREA>0.0) THEN
IF(INDVAR==ITM3) THEN
C... Set CO for T3 - equivalent of *RAD patch
T3=F(L0T3+I)+TEMP0
F(L0CO+I)=SIGMA*CAREA*(T3**3+T3**2*TW+T3*TW2+TW3)
ELSE
C... Set CO for mass flow - Pcoeff*area
IF(HOL.OR.SURF) THEN
C... For HOL or SURF, CO is set to local density*surface_area_in_cell
F(L0CO+I)=F(L0DEN+I)*CAREA*RSG163
ELSE
IF(LEZ(PCOEFF)) THEN
C... Mass flow is m = A.sqrt(abs(C)(V-Pp))
GCO=ABS(PCOEFF)*F(L0DEN+I)
GCO=GCO/(SQRT(ABS(GCO*(GVAL-F(L0P1+I))))+TINY)
F(L0CO+I)=GCO*CAREA
if(l0vall>0) then
f(l0vall+i)=gco*carea*(GVAL-F(L0P1+I))
endif
ELSE
C... otherwise CO is set to PCOEF*surface_area_in_cell
F(L0CO+I)=PCOEFF*CAREA
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDDO
ENDDO
ENDIF
ENDIF
ELSEIF(IGR==13.AND.ISC==14) THEN
C------------------- SECTION 14 ------------------- value = GRND2
C
C Fixed pressure at OPENING - set external velocities
C -------------------------
C
C The patch name can be anything. The VALue for velocity must be set to GRND2
C if it is to be set to a user-set or deduced value.
C
C Inputs:
C SPEDAT(SET,object_name,OUTLET,C,GXO) - identifies this as an Angled-out patch
C SPEDAT(SET,object_name,TOTVELO,R,velocity_normal_to_surface) - this
C sets the velocity magnitude normal to the blockage-object surface.
C If it is not set, the following SPEDATs will be used:
C SPEDAT(SET,object_name,UOUT,R,U_component)
C SPEDAT(SET,object_name,VOUT,R,V_component)
C SPEDAT(SET,object_name,WOUT,R,W_component)
C These set the components of the vector at the outlet.
C Alternatively, the velocity can be deduced from mass-flux/density.
C SPEDAT(SET,object_name,DEDUCED,C,YES)
C SPEDAT(SET,object_name,VELIN,R,initial_guess_for_external_velocity)
C SPEDAT(SET,object_name,RELAX,R,linear_relaxation_factor_for_external_velocity)
C
IPT=NINT(F(L0GXO(IDMN)+IPAT))
IF(IPT>0) THEN ! current patch is for ANGLED-OUT
L0PAT=L0PATNO(IDMN)+(IZ-1)*NXNY ! index for patch-number store
L0VAL=L0F(VAL) ! index for VALue
IF(FLUID1(INDVAR)) THEN
TOTVELO=F(L0TOTVELO(IDMN) +IPT) ! total velocity at outlet
L0VOUT=L0VELO(IDMN)
KPVMAS=PVMASS
L0DEN=L0F(DEN1)
IF(TOTVELO==-9999.0.AND.NCELL>0) THEN ! deduced
RELX=F(L0REL(IDMN)+IPT)
L0V=L0VEL(IDMN)+(IPT-1)*NCELL
ENDIF
LBVOUT=LBNAME('VOUT')
ELSE
TOTVELO=F(L0TOTVELO2(IDMN)+IPT) ! total velocity at outlet
L0VOUT=L0VELO2(IDMN)
KPVMAS=PVMAS2
L0DEN=L0F(DEN2)
IF(TOTVELO==-9999.0.AND.NCELL>0) THEN ! deduced
RELX=F(L0RL2(IDMN)+IPT)
L0V=L0VL2(IDMN)+(IPT-1)*NCELL
ENDIF
LBVOUT=LBNAME('VOU2')
ENDIF
IF(LBVOUT>0) L0VOUT=L0F(LBVOUT)
ARAT=F(L0ARATO(IDMN)+IPT) ! area ratio
IF(QEQ(TOTVELO,-999.)) THEN ! velocity components set
VELOUT(1)=F(L0VOUT+(IPT-1)*3+1) ! get U component at outlet
VELOUT(2)=F(L0VOUT+(IPT-1)*3+2) ! get V component at outlet
VELOUT(3)=F(L0VOUT+(IPT-1)*3+3) ! get W component at outlet
IF(INDVAR==U1.OR.INDVAR==U2) THEN ! set direction vector
CALL VECTOR(DIR,1.,0.,0.); IDIR=1
ELSEIF(INDVAR==V1.OR.INDVAR==V2) THEN
CALL VECTOR(DIR,0.,1.,0.); IDIR=2
ELSEIF(INDVAR==W1.OR.INDVAR==W2) THEN
CALL VECTOR(DIR,0.,0.,1.); IDIR=3
ELSE
IDIR=0
ENDIF
IF(INDVAR>=U1.AND.INDVAR<=W2) VEL=DOT(VELOUT,DIR) ! get velocity magnitude in velocity d
ELSEIF(QEQ(TOTVELO,-9999.).OR.QEQ(TOTVELO,SAME)) THEN ! velocity is deduced
L0MIN = L0PVAR(KPVMAS,IPAT,IZ)
L0MINH= L0PVAR(KPVMAS,IPAT,IZ+1)
IDIR=ITWO((INDVAR-1)/2,0,INDVAR>=U1.AND.INDVAR<=W2) ! for velocity IDIR is based on dire
ENDIF
L0XU=L0F(XU2D)
L0XG=L0F(XG2D)
IBLK=NINT(F(L0BLKOUT(IDMN)+IPT)) ! get parent blockage patch number
IPW=0
IF(TOTVELO==-9999.0.AND.NCELL>0) THEN ! deduced
CALL GETPAT(IPAT,IREG,RTYP,JXF,JXL,JYF,JYL,JZF,JZL,JTF,JTL)
IZADD=(IZ-JZF)*(JXL-JXF+1)*(JYL-JYF+1)
ENDIF
C... Deduce external value from VFOL
IF(INDVAR==ISURN) THEN ! Phase 1
L0SURN=L0F(ISURN)
L0MIN = L0PVAR(KPVMAS,IPAT,IZ)
CALL GETCV(IPAT,IVFOL,GCO,GVAL)
RHOEXT=1./GVAL ! VAL for VFOL has been set to 1/density
RHOLIQ=F(INDPRTB(IPRPSA,0)+1)
SURNEXT=RTWO(1.,0., ABS((RHOEXT-RHOLIQ)/RHOLIQ)<=1E-3)
ELSEIF(INDVAR==LBSRN2) THEN ! Phase 3
L0SURN=L0F(LBSRN2)
L0MIN = L0PVAR(KPVMAS,IPAT,IZ)
CALL GETCV(IPAT,LBVFL2,GCO,GVAL)
RHOEXT=1./GVAL ! VAL for VFOL has been set to 1/density
RHOLIQ=F(INDPRTB(IPRPSC,0)+1)
SURNEXT=RTWO(1.,0., ABS((RHOEXT-RHOLIQ)/RHOLIQ)<=1E-3)
ELSEIF(SURF) THEN ! not SURN / SRN2 but VOF
CALL GETCV(IPAT,IVFOL,GCO,GVAL)
RHOEXT=1./(GVAL+TINY) ! VAL for VFOL has been set to 1/density
RHOLIQ=F(INDPRTB(IPRPSA,0)+1)
SURNEXT=RTWO(1.,0., ABS((RHOEXT-RHOLIQ)/RHOLIQ)<=1E-3)
IF(LBVFL2>0) THEN ! Phase 3
CALL GETCV(IPAT,LBVFL2,GCO,GVAL)
RHOXT2=1./(GVAL+TINY) ! VAL for VFOL has been set to 1/density
RHOLQ2=F(INDPRTB(IPRPSC,0)+1)
SURNXT2=RTWO(1.,0., ABS((RHOXT2-RHOLQ2)/RHOLQ2)<=1E-3)
ELSE ! no Phase 3
SURNXT2=0.0
ENDIF
IF(SURNEXT==0.0.AND.SURNXT2==0.0) THEN ! No Phase 1 or 3, must be 2
RHOEXT=F(INDPRTB(IPRPSB,0)+1)
ELSEIF(SURNEXT==1.0) THEN ! Phase 1
RHOEXT=F(INDPRTB(IPRPSA,0)+1)
ELSE ! Phase 3
RHOEXT=F(INDPRTB(IPRPSC,0)+1)
ENDIF
ENDIF
C... When solving for W1/W2 the East & North areas and cell volumes have been staggered
C in Z by averaging IZ & IZ+1 values. Here we need the true areas, so we unstagger
C them before using in GET_SURFACE. Afterwards, we have to stagger them again as Earth
C will still expect them to be staggered and so will unstagger after completing W1/W2
ALTERD=.FALSE. ! initialse staggered flag to not staggered
IF((INDVAR==W1.OR.INDVAR==W2).AND.(IZ==1.OR.(NZ>1.AND.
1 IZ/=NZ))) THEN
IF(.NOT.(NZ==1.OR.(NX==1.AND.NY==1))) THEN
ALTERD=.TRUE. ! set flag to staggered
CALL RSTGMZ ! this undoes the staggering of East & North areas and volumes
ENDIF
ENDIF
DO IX=IXF,IXL ! loop over all cells in bounding box
DO IY=IYF,IYL
I=(IX-1)*NY+IY
IPW=IPW+1
IJKDM=(IX-1)*NY+IY+(IZ-1)*NXNY ! cell index in 3D
F(L0VAL+I)=0.0 ! initialise VAL to 0.0
C... locate cells which are in fluid, but have patch number >0,
C i.e. lie on fluid-side of intersection of inlet and blockage
IF(.NOT.SLD(I).AND.LINVRO(IPW)) THEN
CALL GET_SURFACE(IX,IY,IZ,IBLK,L0PAT,CAREA,NORML,IPLUS)
C... CAREA is surface area in affected cell.
IF(CAREA>0.0) THEN
C... VAL set to velocity component in relevant direction
IF(QEQ(TOTVELO,-999.)) THEN ! velocity vector has been set
IF(CARTES.OR.INDVAR>V2) THEN
IF(INDVAR==ISURN.OR.INDVAR==LBSRN2) THEN
VELIO=ABS(DOT(VELOUT,NORML))
ELSE
VELIO=VEL
ENDIF
ELSE ! Polar U1-V2
UC=VELOUT(1) ! set cartesian components
VC=VELOUT(2)
IF(INDVAR=U1.AND.INDVAR<=W2.AND.ISWEEP>FSWEEP+1)
! 1 THEN
IF(INDVAR>=U1.AND.INDVAR<=W2)
1 THEN
L0MASS=ITWO(L0MIN,L0MINH,IPLUS==0)
IF(SURF) THEN ! For vof use density of incoming fluid
VEL=F(L0MASS+IPW)/(ARAT*CAREA*RHOEXT+TINY)
ELSE ! otherwise use in-cell density
VEL=F(L0MASS+IPW)/(ARAT*CAREA*F(L0DEN+I)+TINY)
ENDIF
IF(NCELL>0) THEN
IV=IPW+IZADD
VEL=(1.-RELX)*F(L0V+IV)+RELX*VEL ! relax inflow velocity
F(L0V+IV)=VEL
ENDIF
IF(LBVOUT>0) F(L0VOUT+I)=VEL
ELSE ! not velocity, used stored outflow velocity
IF(NCELL>0) THEN
IV=IPW+IZADD
VEL=F(L0V+IV)
ENDIF
ENDIF
IF(IDIR>0) THEN ! for velocity, resolve into surface direction
VELIO=NORML(IDIR)*VEL
ELSE
VELIO=VEL
ENDIF
ELSEIF(QEQ(TOTVELO,SAME)) THEN
FLO=F(L0MIN+IPW) ! mass flow in patch, +ve in, -ve out
IF(FLO>=0.0) THEN ! inflow
VELIO=FLO/(F(L0DEN+I)*CAREA*ARAT+TINY)
ENDIF
ELSE ! velocity normal to surface has been set
IF(INDVAR>=U1.AND.INDVAR<=W2) THEN
IDIR=(INDVAR-1)/2
VELIO=TOTVELO*NORML(IDIR) ! resolve into grid direction
ELSE
VELIO=TOTVELO
ENDIF
ENDIF
IF(INDVAR>=U1.AND.INDVAR<=W1) THEN ! momentum sources
F(L0VAL+I)=VELIO
ELSEIF(INDVAR==ISURN.OR.INDVAR==LBSRN2) THEN
FLO=F(L0MIN+IPW) ! mass flow in patch, +ve in, -ve out
IF(FLO<=0.0) THEN ! outflow
F(L0VAL+I)=FLO*F(L0SURN+I)/(F(L0DEN+I)) ! take in-cell value
ELSE ! inflow
F(L0VAL+I)=SURNEXT*ABS(VELIO)*CAREA ! take external value
ENDIF
ENDIF
ENDIF
ENDIF
ENDDO
ENDDO
C... Here we stagger the areas and volumes again, but only for W1 & W2
IF(ALTERD) CALL STAGMZ
ENDIF
C
C Fixed flow rate at Angled INLET
C -------------------------------
C
C The patch name can be anything. The COVALs should be:
C COVAL(GXIn, P1, FIXFLU, GRND2)
C COVAL(GXIn, vel, ONLYMS, GRND2)
C
C Inputs:
C SPEDAT(SET,object_name,INLET,C,GXI) - identifies this as an Angled-in patch
C SPEDAT(SET,object_name,BLOCKAGE,C,name_of_blockage) - sets the
C name of the blockage object this inlet sits on. If not set,
C it will sit on any blockage within the bounding box.
C SPEDAT(SET,object_name,TOTVEL,R,velocity_normal_to_surface) - this
C sets the velocity magnitude normal to the blockage-object surface.
C If it is not set, the following SPEDATs will be used:
C SPEDAT(SET,object_name,UIN,R,U_component)
C SPEDAT(SET,object_name,VIN,R,V_component)
C SPEDAT(SET,object_name,WIN,R,W_component)
C These set the components of the inlet vector.
C or SPEDAT(SET,object_name,VOLFLOW,R,volumetric_flow_rate) - this sets
C the volumetric flow rate. The velocity is deduced from flowrate
C divided by the total inlet area.
C or SPEDAT(SET,object_name,MASFLOW,R,mass_flow_rate) - this sets
C the mass flow rate. The velocity is deduced from flowrate
C divided by the total inlet area divided by the inlet density.
C SPEDAT(SET,object_name,DENIN,R,inlet_density) - this sets the inlet
C density. if not set, RHO1 is used. If that is GRNDn, 1.0 is used.
C For fixed outflows, the inlet density is stored as -1, to flag the
C use of the in-cell density.
C
C... To link the outflow from one ANGELD-IN to the inflow to another, use
C SPEDAT(SET,object_name, LINKTO,C,previous / next)
C previous links to the immediately preceeding ANGLED-IN,
C next links to the following ANGLED-IN
IPT=NINT(F(L0GXI(IDMN)+IPAT)) ! angled-in sequence number
IF(IPT>0) THEN ! current patch is for ANGLED-IN
L0PAT=L0PATNO(IDMN)+(IZ-1)*NXNY ! index for patch-number store
L0VAL=L0F(VAL) ! index for VALue
IF(FLUID1(INDVAR)) THEN
RHOIN=F(L0DENIN(IDMN) +IPT) ! get density at inlet
C... RHOin=GRND signals -ve normal velocity or -ve volume flow rate
C... RHOin < 0 signals fixed mass flow rate
TOTVEL=F(L0TOTVEL(IDMN)+IPT) ! total velocity at inlet
L0VIN=L0VELI(IDMN)
L0DEN=L0F(DEN1) ! index for density
ELSE
RHOIN=F(L0DENIN2(IDMN) +IPT) ! get density at inlet
TOTVEL=F(L0TOTVEL2(IDMN)+IPT) ! total velocity at inlet
L0VIN=L0VELI2(IDMN)
L0DEN=L0F(DEN2) ! index for density
ENDIF
ARAT=F(L0ARATI(IDMN)+IPT) ! area ratio
IF(QEQ(TOTVEL,-999.)) THEN
VELIN(1)=F(L0VIN+(IPT-1)*3+1) ! get U component at inlet
VELIN(2)=F(L0VIN+(IPT-1)*3+2) ! get V component at inlet
VELIN(3)=F(L0VIN+(IPT-1)*3+3) ! get W component at inlet
IF(INDVAR==U1.OR.INDVAR==U2) THEN ! set direction vector
CALL VECTOR(DIR,1.,0.,0.)
ELSEIF(INDVAR==V1.OR.INDVAR==V2) THEN
CALL VECTOR(DIR,0.,1.,0.)
ELSEIF(INDVAR==W1.OR.INDVAR==W2) THEN
CALL VECTOR(DIR,0.,0.,1.)
ENDIF
VEL=DOT(VELIN,DIR) ! get velocity magnitude in velocity direction
ENDIF
IBLK=NINT(F(L0BLKIN(IDMN)+IPT))
IDIR=(INDVAR-1)/2
IPW=0
l0vall=0; l0inv=0
if(indvar==u1) then
if(lbname('UVAL')>0) then
l0vall=l0f(lbname('UVAL'))
endif
elseif(indvar==v1) then
if(lbname('VVAL')>0) then
l0vall=l0f(lbname('VVAL'))
endif
elseif(indvar==w1) then
if(lbname('WVAL')>0) then
l0vall=l0f(lbname('WVAL'))
endif
elseif(indvar==p1.or.indvar==r1) then
if(lbname('PVAL')>0) then
l0vall=l0f(lbname('PVAL'))
endif
if(lbname('#INV')>0) then
l0inv=l0f(lbname('#INV'))
endif
elseif(indvar==u2) then
if(lbname('UVL2')>0) then
l0vall=l0f(lbname('UVL2'))
endif
elseif(indvar==v2) then
if(lbname('VVL2')>0) then
l0vall=l0f(lbname('VVL2'))
endif
elseif(indvar==w2) then
if(lbname('WVL2')>0) then
l0vall=l0f(lbname('WVL2'))
endif
elseif(indvar==p2.or.indvar==r2) then
if(lbname('PVL2')>0) then
l0vall=l0f(lbname('PVL2'))
endif
endif
l0arr=0; if(lbname('CARE')>0) l0arr=l0f(lbname('CARE'))
IF(.NOT.CARTES) THEN
L0XU=L0F(XU2D)
L0XG=L0F(XG2D)
IF(IURVAL/=0) L0RAD=L0F(RG2D)
ENDIF
IF(INDVAR==ISURN.OR.INDVAR==LBSRN2) THEN
ISRN=ITWO(ISURN,LBSRN2,INDVAR==ISURN)
IVFL=ITWO(IVFOL,LBVFL2,INDVAR==ISURN)
CALL GETCV(IPAT,IVFL,GCO,GVFOL)
RHOEXT=1./GVFOL ! VAL for VFOL has been set to 1/density
IPRPSAC=ITWO(IPRPSA,IPRPSC,INDVAR==ISURN)
RHOLIQ=F(INDPRTB(IPRPSAC,0)+1) ! get fluid density, heavy or third
SURNEXT=RTWO(1.,0., ABS((RHOEXT-RHOLIQ)/RHOLIQ)<=1E-3) ! 1 if fluid, 0 if not
ENDIF
C... When solving for W1/W2 the East & North areas and cell volumes have been staggered
C in Z by averaging IZ & IZ+1 values. Here we need the true areas, so we unstagger
C them before using in GET_SURFACE. Afterwards, we have to stagger them again as Earth
C will still expect them to be staggered and so will unstagger after completing W1/W2
ALTERD=.FALSE. ! initialse staggered flag to not staggered
IF((INDVAR==W1.OR.INDVAR==W2).AND.(IZ==1.OR.(NZ>1.AND.
1 IZ/=NZ))) THEN
IF(.NOT.(NZ==1.OR.(NX==1.AND.NY==1))) THEN
ALTERD=.TRUE. ! set flag to staggered
CALL RSTGMZ ! this undoes the staggering of East & North areas and volumes
ENDIF
ENDIF
DO IX=IXF,IXL ! loop over all cells in bounding box
DO IY=IYF,IYL
I=(IX-1)*NY+IY
IPW=IPW+1
F(L0VAL+I)=0.0 ! initialise VAL to 0.0
C... locate cells which are in fluid, but have patch number >0,
C i.e. lie on fluid-side of intersection of inlet and blockage
CAREA=0.0 ! initialise
if(l0inv>0) then
f(l0inv+i)=itwo(ipt,0,linvro(ipw))
! if(linvro(ipw)) f(l0inv+i)=1.
endif
IF(.NOT.SLD(I).AND.LINVRO(IPW)) THEN
C... In fluid, and within angled-in object. Check if any surface in cell
CALL GET_SURFACE(IX,IY,IZ,IBLK,L0PAT,CAREA,NORML,IPLUS)
ELSEIF(INDVAR==W1.OR.INDVAR==W2) THEN
C... Didn't find any surface. For W, look 1 slab up in case area there
L0MSKZ0=L0MSKZ ! save
IF(MASKPT(IPAT))L0MSKZ=L0PVAR(22,IPAT,IZ+1) ! advance 1 slab
IF(.NOT.SLD(I+NXNY).AND.LINVRO(IPW)) THEN
C... Check if surface on next slab
CALL GET_SURFACE(IX,IY,IZ+1,IBLK,L0PAT,CAREA,NORML,
1 IPLUS)
ENDIF
L0MSKZ=L0MSKZ0 ! restore
ENDIF
C... CAREA is surface area in affected cell.
IF(CAREA>0.0) THEN ! found surface
if(l0arr>0) f(l0arr+i)=carea
IF(INDVAR==P1.OR.INDVAR==P2.OR.INDVAR==R1.OR.
1 INDVAR==R2) THEN
C... mass source is density*surface_area_in_cell*velocity_normal_to_surface
IF(QEQ(TOTVEL,-999.)) THEN ! velocity vector has been set
VELMASS=DOT(VELIN,NORML) ! resolve velocity normal to surf
ELSE ! velocity normal to surface has been set
VELMASS=TOTVEL ! velocity is always normal to surface
ENDIF
C... for +ve density, use in-cell density for -ve velocity
C -ve density signals fixed mass flow so take abs
C density=GRND signals fixed volume outflow use in-cell
IF(RHOIN>0.0) THEN ! fixed flow
IF(VELMASS>=0.0) THEN ! inflow
F(L0VAL+I)=RHOIN*ARAT*CAREA*VELMASS
ELSE ! outflow, use in-cell density
F(L0VAL+I)=F(L0DEN+I)*ARAT*CAREA*VELMASS
ENDIF
ELSEIF(QEQ(RHOIN,GRND)) THEN ! fixed volume out flow
F(L0VAL+I)=F(L0DEN+I)*ARAT*CAREA*VELMASS ! - use in-cell
ELSE ! fixed mass flow - use inlet density
F(L0VAL+I)=ABS(RHOIN)*ARAT*CAREA*VELMASS
ENDIF
if(l0vall>0) f(l0vall+i)=f(l0val+i)
ELSEIF(INDVAR==ISURN.OR.INDVAR==LBSRN2) THEN
C... volume source for SURN is surface_area_in_cell*velocity_normal_to_surface
IF(QEQ(TOTVEL,-999.)) THEN ! velocity vector has been set
VELMASS=DOT(VELIN,NORML) ! resolve velocity normal to surf
ELSE ! velocity normal to surface has been set
VELMASS=TOTVEL ! velocity is always normal to surface
ENDIF
F(L0VAL+I)=ARAT*CAREA*VELMASS*SURNEXT
ELSE ! other sources
IF(INDVAR>=U1.AND.INDVAR<=W2) THEN ! momentum sources
C... VAL set to velocity component in relevant direction
IF(CARTES.OR.INDVAR>V2) THEN ! Cartesian or Polar W1/W2
IF(QEQ(TOTVEL,-999.)) THEN ! velocity vector was set
F(L0VAL+I)=VEL
ELSE ! velocity normal to surface has been set
F(L0VAL+I)=TOTVEL*NORML(IDIR) ! resolve into grid dir
ENDIF
ELSE ! Polar U1-V2
IF(QEQ(TOTVEL,-999.)) THEN ! velocity vector was set
UC=VELIN(1) ! set cartesian components
VC=VELIN(2)
ELSE
UC=NORML(1)*TOTVEL ! cart comp is normal*velocity
VC=NORML(2)*TOTVEL
ENDIF
IF(INDVAR0) f(l0vall+i)=f(l0val+i)
ELSEIF(INDVAR==KE) THEN ! KE
F(L0VAL+I)=F(L0KEIN(IDMN)+IPT)
ELSEIF(INDVAR==EP.OR.INDVAR==LBET.OR.
1 INDVAR==LBENTI) THEN ! EP, ET, ENTI
F(L0VAL+I)=F(L0EPIN(IDMN)+IPT)
ELSEIF(INDVAR==LBOMEG) THEN ! OMEG
F(L0VAL+I)=F(L0EPIN(IDMN)+IPT)/(CMUCD*
1 F(L0KEIN(IDMN)+IPT))
ELSEIF(INDVAR==LBKP) THEN ! KP
F(L0VAL+I)=F(L0KEIN(IDMN)+IPT)/(1+.25)
ELSEIF(INDVAR==LBKT) THEN ! KT
GKTIN=0.25*F(L0KEIN(IDMN)+IPT)/(1+.25)
ENDIF
ENDIF
ENDIF
ENDDO
ENDDO
C... Here we stagger the areas and volumes again, but only for W1 & W2
IF(ALTERD) CALL STAGMZ
ENDIF
ELSEIF(IGR==13.AND.ISC==15) THEN
C------------------- SECTION 15 ------------------- value = GRND3
C
C Fixed flow rate at Polar INLET
C -------------------------------
C
C The patch can be anything. The COVALs should be:
C COVAL(GXIn, P1, FIXFLU, GRND3)
C COVAL(GXIn, vel, ONLYMS, GRND3)
C
C Inputs:
C SPEDAT(SET,object_name,INLET,C,GXI) - identifies this as an Angled-in patch
C SPEDAT(SET,object_name,UIN,R,U_component)
C SPEDAT(SET,object_name,VIN,R,V_component)
C SPEDAT(SET,object_name,WIN,R,W_component)
C These set the cartesian components of the inlet vector.
C SPEDAT(SET,object_name,VOLFLOW,R,volumetric_flow_rate) - this sets
C the volumetric flow rate. The velocity is deduced from flowrate
C divided by total inlet area.
C SPEDAT(SET,object_name,DENIN,R,inlet_density) - this sets the inlet
C density. if not set, RHO1 is used. If that is GRNDn, 1.0 is used.
C For fixed outflows, the inlet density is stored as -1, to flag the
C use of the in-cell density.
C
IPT=NINT(F(L0GXI(IDMN)+IPAT))
IF(IPT>0) THEN ! current patch is for ANGLED-IN
L0PAT=L0PATNO(IDMN)+(IZ-1)*NXNY ! index for patch-number store
L0VAL=L0F(VAL) ! index for VALue
IF(FLUID1(INDVAR)) THEN
RHOIN=F(L0DENIN(IDMN) +IPT) ! get density at inlet
L0VIN=L0VELI(IDMN)
L0DEN=L0F(DEN1)
ELSE
RHOIN=F(L0DENIN2(IDMN) +IPT) ! get density at inlet
L0VIN=L0VELI2(IDMN)
L0DEN=L0F(DEN2)
ENDIF
CALL GETPAT(IPAT,IREG,TYP,JXF,JXL,JYF,JYL,JZF,JZL,JTF,JTL)
ARAT=F(L0ARATI(IDMN)+IPT) ! area ratio
VELIN(1)=F(L0VIN+(IPT-1)*3+1) ! get U component at inlet
VELIN(2)=F(L0VIN+(IPT-1)*3+2) ! get V component at inlet
VELIN(3)=F(L0VIN+(IPT-1)*3+3) ! get W component at inlet
IF(INDVAR==U1.OR.INDVAR==U2) THEN ! set direction vector
CALL VECTOR(DIR,1.,0.,0.)
ELSEIF(INDVAR==V1.OR.INDVAR==V2) THEN
CALL VECTOR(DIR,0.,1.,0.)
ELSEIF(INDVAR==W1.OR.INDVAR==W2) THEN
CALL VECTOR(DIR,0.,0.,1.)
ENDIF
VEL=DOT(VELIN,DIR) ! get velocity magnitude in velocity direction
IPW=0
L0XU=L0F(XU2D)
L0XG=L0F(XG2D)
IF(IURVAL/=0) L0RAD=L0F(RG2D)
C... When solving for W1/W2 the East & North areas and cell volumes have been staggered
C in Z by averaging IZ & IZ+1 values. Here we need the true areas, so we unstagger
C them before using in GET_SURFACE. Afterwards, we have to stagger them again as Earth
C will still expect them to be staggered and so will unstagger after completing W1/W2
ALTERD=.FALSE. ! initialse staggered flag to not staggered
IF((INDVAR==W1.OR.INDVAR==W2).AND.(IZ==1.OR.(NZ>1.AND.
1 IZ/=NZ))) THEN
IF(.NOT.(NZ==1.OR.(NX==1.AND.NY==1))) THEN
ALTERD=.TRUE. ! set flag to staggered
CALL RSTGMZ ! this undoes the staggering of East & North areas and volumes
ENDIF
ENDIF
DO IX=IXF,IXL ! loop over all cells in bounding box
DO IY=IYF,IYL
I=(IX-1)*NY+IY
IPW=IPW+1
F(L0VAL+I)=0.0 ! initialise VAL to 0.0
IF(.NOT.SLD(I))THEN
IJKDM=(IX-1)*NY+IY+(IZ-1)*NXNY ! cell index in 3D
IF(INDVAR==P1.OR.INDVAR==P2.OR.INDVAR==R1.OR.
1 INDVAR==R2.OR.INDVAR==ISURN.OR.INDVAR==LBSRN2) THEN
C... mass source is density*velocity_normal_to_surface
IF(QEQ(TYP,2.)) THEN ! East
VELMASS=-VELIN(1)*COS(F(L0XG+I))+
1 VELIN(2)*SIN(F(L0XG+I))
ELSEIF(QEQ(TYP,3.)) THEN ! West
VELMASS= VELIN(1)*COS(F(L0XG+I))-
1 VELIN(2)*SIN(F(L0XG+I))
ELSEIF(QEQ(TYP,4.)) THEN ! North
VELMASS=-VELIN(1)*SIN(F(L0XG+I))-
1 VELIN(2)*COS(F(L0XG+I))
ELSEIF(QEQ(TYP,5.)) THEN ! South
VELMASS= VELIN(1)*SIN(F(L0XG+I))+
1 VELIN(2)*COS(F(L0XG+I))
ELSEIF(QEQ(TYP,6.)) THEN ! High
VELMASS=-VELIN(3)
ELSE ! Low
VELMASS= VELIN(3)
ENDIF
IF(INDVAR==ISURN.OR.INDVAR==LBSRN2) THEN
C... volume source for SURN is velocity_normal_to_surface
F(L0VAL+I)=ARAT*VELMASS
ELSE
IF(VELMASS>0.0) THEN ! fixed in flow
F(L0VAL+I)=RHOIN*ARAT*VELMASS
ELSE ! fixed out flow - use in-cell
F(L0VAL+I)=F(L0DEN+I)*ARAT*VELMASS
ENDIF
ENDIF
ELSE ! other sources
IF(INDVAR>=U1.AND.INDVAR<=W2) THEN ! momentum sources
C... VAL set to velocity component in relevant direction
IF(INDVAR>V2) THEN ! Polar W1/W2
F(L0VAL+I)=VEL
ELSE ! Polar U1-V2
IF(INDVAR0) THEN ! link to next
ISOR=IR; ITAR=II
ELSE ! link to previous
ISOR=IABS(IR); ITAR=II
ENDIF
IF(LPAR) THEN ! switch ISOR from global to local
PATNM=GD_NAMPAT(ISOR) ! global patch name
IF(PATNM(1:1)=='^') PATNM=GD_NAMPAT(ISOR)(2:)
ISOR = INDPATCH(PATNM) ! local patch index from global name
ENDIF
IF(ISOR<0) THEN ! No patch in current SubDomain
SMASS1 = 0.0
ELSE ! Patch used, look CoVal(4)
CALL GETSO(ISOR,9,SMASS1) ! get phase 1 mass source
ENDIF
IF(LPAR) CALL GLSUM(SMASS1) ! sum over all nodes
RHOIN=RHO1
IF(RHO1<0.0.AND.QNE(RHO1,GRND5).AND.ITEM1==0) THEN
CALL SET_ERR(573,
1 'Linked ANGLED-IN cannot use current density formula',1)
ENDIF
IF(.NOT.ONEPHS) THEN
IF(ISOR<0) THEN ! No patch in current SubDomain
SMASS2 = 0.0
ELSE ! Patch used, look CoVal(4)
CALL GETSO(ISOR,10,SMASS2)
ENDIF
IF(LPAR) CALL GLSUM(SMASS2) ! sum over all nodes
RHOIN2=RHO2
IF(RHO2<0.0.AND.QNE(RHO2,GRND5).AND.ITEM2==0) THEN
CALL SET_ERR(573,
1 'Linked ANGLED-IN cannot use current density formula',1)
ENDIF
ENDIF
IF(ITAR>0) ITR=NINT(F(L0GXI(IDMN)+ITAR)) ! sequence number of target
DO II=1,NSOL
IPHI=MSL(II); IF(IPHI<14) CYCLE
IF(ISOR<0)THEN ! source patch not on this processor
GSOR=0.0; GCO=0.0
ELSE
CALL GETCV(ISOR,IPHI,GCO,GVAL) ! get C V from COVAL
IF(QEQ(GCO,-999.)) THEN ! no source was set so skip
IF(LPAR) THEN
GSOR=0.0 ! set zero value for parallel sum
ELSE
CYCLE ! skip everything for sequential
ENDIF
ELSE
CALL GETSO(ISOR,IPHI,GSOR) ! get source of variable in 'donor'
ENDIF
ENDIF
IF(LPAR) THEN
CALL GLSUM2(GSOR,GCO) ! sum source and CO over all processors
IF(GCO<-998.0) CYCLE ! if CO is < -998, must be -999 somewhere so skip
ENDIF
IF(ITAR<0) CYCLE ! target not on this processor
IF(ONEPHS.OR.FLUID1(IPHI)) THEN
SMASS=SMASS1
ELSE
SMASS=SMASS2
ENDIF
IF(NAME(IPHI)=='TEM1') THEN ! Phase 1 temperature
IF(CP1<0.0) CALL SET_ERR(572,
1 'Linked ANGLED-IN cannot use variable specific heat',1)
IQTAD1=F(L0IADQ(IDMN)+ITR) ! source-type flag
IF(IQTAD1==0) THEN ! additional heat
QADD=F(L0ADDQ(IDMN)+ITR)
GAVE=(GSOR-QADD)/SMASS/CP1-TEMP0 ! subtract as SMASS is -ve!
ELSEIF(IQTAD1==1) THEN ! set exit temperature
GAVE=F(L0ADDQ(IDMN)+ITR)
ELSEIF(IQTAD1==2) THEN ! additional temperature
GAVE=GSOR/SMASS/CP1-TEMP0+F(L0ADDQ(IDMN)+ITR)
ENDIF
TMIN=F(L0ADMIN(IDMN,IPHI)+ITR)
TMAX=F(L0ADMAX(IDMN,IPHI)+ITR)
GAVE=MAX(TMIN,MIN(GAVE,TMAX))
T1AVE=GAVE
ELSEIF(NAME(IPHI)=='TEM2') THEN ! Phase 2 temperaure
IF(CP2<0.0) CALL SET_ERR(572,
1 'Linked ANGLED-IN cannot use variable specific heat',1)
IQTAD1=F(L0IADQ(IDMN)+ITR)
IF(IQTAD1==0) THEN ! additional heat
QADD=F(L0ADDQ(IDMN)+ITR)
GAVE=(GSOR-QADD)/SMASS/CP2-TEMP0
ELSEIF(IQTAD1==1) THEN ! set exit temperature
GAVE=F(L0ADDQ(IDMN)+ITR)
ELSEIF(IQTAD1==2) THEN ! additional temperature
GAVE=GSOR/SMASS/CP2-TEMP0+F(L0ADDQ(IDMN)+ITR)
ENDIF
TMIN=F(L0ADMIN(IDMN,IPHI)+ITR)
TMAX=F(L0ADMAX(IDMN,IPHI)+ITR)
GAVE=MAX(TMIN,MIN(GAVE,TMAX))
T2AVE=GAVE
ELSEIF(IPHI==14.OR.IPHI==15) THEN ! enthalpy
QADD=F(L0ADDQ(IDMN)+ITR)
GAVE=(GSOR-QADD)/SMASS
TMIN=F(L0ADMIN(IDMN,IPHI)+ITR)
TMAX=F(L0ADMAX(IDMN,IPHI)+ITR)
GAVE=MAX(TMIN,MIN(GAVE,TMAX))
ELSE ! other scalars
ICAD=F(L0IADC(IDMN,IPHI)+ITR) ! source-type flag
IF(NAME(IPHI)=='MH2O') THEN ! deal with Humidity equation MH2O
IHUNIT=F(L0HUNIT(IDMN)+ITR) ! get flag for humidity source units
CADD=F(L0ADDC(IDMN,IPHI)+ITR) ! get humidity source value
IF(IHUNIT>0.AND.ICAD<3) THEN ! not mass fraction andnot % reduction
HUMIN=CADD
IF(IHUNIT==1) THEN ! convert from humidity ratio
HUMIN=1.E-3*HUMIN
ELSEIF(IHUNIT==2) THEN ! convert from relative humidity
CALL GETSO(ITAR,ITEM1,GTSOR) ! energy source at this patch
CALL GETSO(ITAR,P1,GMSOR) ! mass source at this patch
TIN=GTSOR/(GMSOR+TINY)/CP1-TEMP0 ! outlet temperature (may be 1 sweep behind)
PVAP = 1.E-2*HUMIN*PVH2O(TIN)
GWRAT = 18.015/28.96
HUMIN = GWRAT*PVAP/(PRESS0-PVAP)
ENDIF
CADD=HUMIN/(1.+HUMIN) ! convert to mass fraction
ENDIF
IF(ICAD==0) THEN ! extra humidity source (flux)
GAVE=(GSOR-CADD)/SMASS ! subtract as SMASS is -ve!
ELSEIF(ICAD==1) THEN ! Set exit humidity
GAVE=CADD
ELSEIF(ICAD==2) THEN ! Set additional exit humidity
GAVE=GSOR/SMASS+CADD
ELSEIF(ICAD==3) THEN ! Set % humidity reduction - treat as % mass fraction reducti
RFAC=1.-(F(L0ADDC(IDMN,IPHI)+ITR)/100.)
GAVE=(GSOR/SMASS)*RFAC ! Reduce by %
ENDIF
CMIN=F(L0ADMIN(IDMN,IPHI)+ITR)
CMAX=F(L0ADMAX(IDMN,IPHI)+ITR)
GAVE=MAX(CMIN,MIN(GAVE,CMAX))
ELSE ! All other scalars not handled above
IF(ICAD==0) THEN ! additional c source
CADD=F(L0ADDC(IDMN,IPHI)+ITR)
GAVE=(GSOR-CADD)/SMASS ! subtract as SMASS is -ve!
ELSEIF(ICAD==1) THEN ! set exit C
GAVE=F(L0ADDC(IDMN,IPHI)+ITR)
ELSEIF(ICAD==2) THEN ! additional C value
GAVE=GSOR/SMASS+F(L0ADDC(IDMN,IPHI)+ITR)
ELSEIF(ICAD==3) THEN ! set % reduction
RFAC=1.-(F(L0ADDC(IDMN,IPHI)+ITR)/100.)
GAVE=(GSOR/SMASS)*RFAC ! Reduce by %
ENDIF
CMIN=F(L0ADMIN(IDMN,IPHI)+ITR)
CMAX=F(L0ADMAX(IDMN,IPHI)+ITR)
GAVE=MAX(CMIN,MIN(GAVE,CMAX))
IF(IPHI==C1) THEN
C1AVE=GAVE
ELSEIF(IPHI==C2) THEN
C2AVE=GAVE
ENDIF
ENDIF
ENDIF
CALL CORCOVAL(ITAR,IPHI,GCO,GAVE) ! set value back
ENDDO
IF(ITAR<0) CYCLE ! target not on this processor
IF(QEQ(RHO1,GRND5)) THEN
IF(EQZ(RHO1A)) THEN
RHOIN=RHO1B*PRESS0/(T1AVE+TEMP0) ! inlet density
ELSE
SPEVOL=RHO1A+(RHO1B-RHO1A)*C1AVE
RHOIN=PRESS0/(SPEVOL*(T1AVE+TEMP0))
ENDIF
ENDIF
IF(QEQ(RHO2,GRND5)) THEN
IF(EQZ(RHO2A)) THEN
RHOIN2=RHO2B*PRESS0/(T2AVE+TEMP0)
ELSE
SPEVOL=RHO2A+(RHO2B-RHO2A)*C2AVE
RHOIN2=PRESS0/(SPEVOL*(T2AVE+TEMP0))
ENDIF
ENDIF
ARAT=F(L0ARATI(IDMN)+ITR) ! area ratio
TOTAREA=F(L0TOTAREA(IDMN)+ITR) ! area
C... Deduce discharge velocity for target as mass/(area*density)
F(L0TOTVEL(IDMN)+ITR)=ABS(SMASS1)/(ARAT*RHOIN*TOTAREA+TINY)
C... for mass flow rate, set density to -ve, to flag mass flow
F(L0DENIN(IDMN)+ITR)=-RHOIN
IF(.NOT.ONEPHS) THEN
F(L0TOTVEL2(IDMN)+ITR)=ABS(SMASS2)/(ARAT*RHOIN2*TOTAREA+
1 TINY)
F(L0DENIN2(IDMN)+ITR)=-RHOIN2
ENDIF
IF(GRN(ENUT)) THEN
C... Inlet values for Turbulence
TURBIN=F(L0TURBIN(IDMN)+ITR)
IF(QNE(TURBIN,-999.0)) THEN ! intensity was set, recompute KE & EP inlet
IF(SOLVE(KE)) THEN
GKEIN=(TURBIN*F(L0TOTVEL(IDMN)+ITR))**2
F(L0KEIN(IDMN)+ITR)=GKEIN
ENDIF
IF(SOLVE(EP).OR.SOLVE(LBOMEG).OR.SOLVE(LBET).OR.
1 SOLVE(LBKP) .OR.SOLVE(LBKT)) THEN
RHYD=(F(L0TOTAREA(IDMN)+ITR)/(4.*ATAN(1.)))**0.5
F(L0EPIN(IDMN)+ITR)=CMUCD**0.75*GKEIN**1.5/(0.1*RHYD)
ELSEIF(SOLVE(LBENTI)) THEN ! Spalart-Allmaras uses EP stores
RHYD=(F(L0TOTAREA(IDMN)+ITR)/(4.*ATAN(1.)))**0.5
GKEIN=(TURBIN*F(L0TOTVEL(IDMN)+ITR))**2
F(L0EPIN(IDMN)+ITR)=CMUCD**0.25*GKEIN**0.5*RHYD
ENDIF
ENDIF
ENDIF ! end enut==grnd
ENDIF ! end 'if linked'
ENDDO ! end loop oer angled-ins
ENDIF
C****************************************************************
END
C---------------------------------------------------------------------
SUBROUTINE GET_SURFACE(IX,IY,IZ,IBLK,L0PAT,CAREA,NORML,IPLUS)
C... This subroutine returns the surface area and surface normal for
C a cell lying on the intersection of a blockage and the current
C patch.
C Inputs:
C IX,IY,IZ - cell index
C IBLK - patch number of blockage. If 0, any blockage will be used
C L0PAT - address of patch-number store
C outputs:
C CAREA - surface area
C NORML(3) - surface normal unit vector
C IPLUS - 1 if surface area is at IZ+1 for W1
C
COMMON/ISG/ISGF1(61),ISG62,ISGF2(38) ! isg62==1 for sparsol
REAL NORML(3)
C
IF(ISG62==0) THEN
CALL GET_SURFACE_P(IX,IY,IZ,IBLK,L0PAT,CAREA,NORML,IPLUS)
ELSE
CALL GET_SURFACE_S(IX,IY,IZ,IBLK,L0PAT,CAREA,NORML,IPLUS)
ENDIF
END
C---------------------------------------------------------------------
SUBROUTINE GET_SURFACE_P(IX,IY,IZ,IBLK,L0PAT,CAREA,NORML,IPLUS)
C... This subroutine returns the surface area and surface normal for
C a cell lying on the intersection of a blockage and the current
C patch. For Parsol and Xparsol.
C Inputs:
C IX,IY,IZ - cell index
C IBLK - patch number of blockage. If 0, any blockage will be used
C L0PAT - address of patch-number store
C outputs:
C CAREA - surface area
C NORML(3) - surface normal unit vector
C IPLUS - 1 if surface area is at IZ+1 for W1
C
INCLUDE 'farray'
INCLUDE 'satear'
INCLUDE 'grdear'
COMMON/LBFFV/P1,P2,U1,U2,V1,V2,W1,W2,R1,R2,RS,KE,EP,H1,H2,
1C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,
1C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,
1C33,C34,C35
INTEGER P1,P2,U1,U2,V1,V2,W1,W2,R1,R2,RS,KE,EP,H1,H2,C1,C2,C3,
1C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,
1C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35
INCLUDE 'd_earth/pbcstr'
COMMON/GENI/NXNY,IGFIL1(8),NFM,IGF(21),IPRL,IBTAU,ILTLS,IGFIL(15),
1 ITEM1,ITEM2,ISPH1,ISPH2,ICON1,ICON2,IPRPS,IRADX,IRADY,IRADZ,IVFOL
COMMON /INTDMN/IDMN,NUMDMN,NXMAX,NYMAX,NZMAX,NXYMAX,NXYZMX,NCLTOT,
1 NDOMMX
COMMON /GEODMN0/ I3DAEX,I3DANY,I3DAHZ,I3DVOL,I3DDXG,I3DDYG,I3DDZG,
1 I3DDX,I3DDY,I3DDZ,I2DAWB,I2DASB,I2DALB
COMMON/F0/KFIL1(17),KZZG, KFIL2(17), KXYXG,KXYXU,KXYYG, KFIL3(266)
COMMON/ISG/ISGF1(61),ISG62,ISGF2(38) ! isg62==1 for sparsol
REAL NORML(3),norm0(3),norm1(3)
LOGICAL DOIT,EQZ,SLD
IPLUS=0
I=(IX-1)*NY+IY ! cell index in plane
IJKDM=(IX-1)*NY+IY+(IZ-1)*NXNY ! cell index in 3D
CAREA=0.0 ! initialise surface area
DOIT=.FALSE. ! initialise 'proceed' flag
IPBC=0
IPBC = IPBSEQ(IDMN,IJKDM) ! get cut-cell number
IF(IPBC>0) THEN ! dealing with cut cell
IF(IBLK==0) THEN ! no blockage specified - any will do
DOIT=F(L0PAT+I)>0.0
ELSE
DOIT=NINT(F(L0PAT+I))==IBLK
ENDIF
IF(DOIT) THEN ! this is the right cell!
ICUTIDX = ISHPB(IDMN,IPBC)
CAREA=F(PBC_CTAR+ICUTIDX) ! surface area of cut cell
CALL VECTOR(NORML,F(PBC_CTVEC(1)+ICUTIDX),
1 F(PBC_CTVEC(2)+ICUTIDX),F(PBC_CTVEC(3)+ICUTIDX))
CALL NORM(NORML) ! unit-normal to cut surface
ENDIF
ELSE ! dealing with un-cut cell
INE=ITWO(I+NY, I,IX 1) ! - West
INN=ITWO(I+1, I,IY 1) ! - South
INH=ITWO(I+NXNY,I,IZ 1) ! - Low
IF(F(L0PAT+INE)>0.0) THEN ! solid to east
IF(IBLK==0) THEN ! any blockage will do
DOIT=.TRUE.
ELSE ! only next to blockage IBLK
DOIT=NINT(F(L0PAT+INE))==IBLK
ENDIF
IF(DOIT) THEN
IJKDME=IJKDM+NY ! neighbour index
IPBCE = IPBSEQ(IDMN,IJKDME) ! neighbour cut-cell index
IF(IPBCE>0) THEN ! neighbour is cut-cell
ICUTIDXE = ISHPB(IDMN,IPBCE)
AREA=F(PBC_DAKAR(4)+ICUTIDXE) ! surface area for cut-cell
ELSE ! neighbour is fully blocked
AREA=F(I3DAEX+IJKDM) ! surface area from cell area
ENDIF
IF(AREA>CAREA) THEN
CAREA=AREA
IF(CARTES) THEN
CALL VECTOR(NORML,-1.,0.,0.) ! set unit vector normal to surface
ELSE
XC=-COS(F(KXYXU+I))
YC= SIN(F(KXYXU+I))
CALL VECTOR(NORML,XC,YC,0.0)
ENDIF
ENDIF
ENDIF
ENDIF
IF(F(L0PAT+INW)>0.0) THEN ! solid to west
IF(IBLK==0) THEN
DOIT=.TRUE.
ELSE
DOIT=NINT(F(L0PAT+INW))==IBLK
ENDIF
IF(DOIT) THEN
IJKDMW=IJKDM-NY
IPBCW = IPBSEQ(IDMN,IJKDMW)
IF(IPBCW>0) THEN
ICUTIDXW = ISHPB(IDMN,IPBCW)
AREA=F(PBC_DAKAR(3)+ICUTIDXW)
ELSE
AREA=F(I3DAEX+IJKDMW)
ENDIF
IF(AREA>CAREA) THEN
CAREA=AREA
IF(CARTES) THEN
CALL VECTOR(NORML,1.,0.,0.)
ELSE
XC= COS(F(KXYXU+I))
YC= -SIN(F(KXYXU+I))
CALL VECTOR(NORML,XC,YC,0.0)
ENDIF
ENDIF
ENDIF
ENDIF
IF(F(L0PAT+INN)>0.0) THEN ! solid to north
IF(IBLK==0) THEN
DOIT=.TRUE.
ELSE
DOIT=NINT(F(L0PAT+INN))==IBLK
ENDIF
IF(DOIT) THEN
IJKDMN=IJKDM+1
IPBCN = IPBSEQ(IDMN,IJKDMN)
IF(IPBCN>0) THEN
ICUTIDXN = ISHPB(IDMN,IPBCN)
AREA=F(PBC_DAKAR(2)+ICUTIDXN)
ELSE
AREA=F(I3DANY+IJKDM)
ENDIF
IF(AREA>CAREA) THEN
CAREA=AREA
IF(CARTES) THEN
CALL VECTOR(NORML,0.,-1.,0.)
ELSE
XC=-SIN(F(KXYXG+I))
YC=-COS(F(KXYXG+I))
CALL VECTOR(NORML,XC,YC,0.0)
ENDIF
ENDIF
ENDIF
ENDIF
IF(F(L0PAT+INS)>0.0) THEN ! solid to south
IF(IBLK==0) THEN
DOIT=.TRUE.
ELSE
DOIT=NINT(F(L0PAT+INS))==IBLK
ENDIF
IF(DOIT) THEN
IJKDMS=IJKDM-1
IPBCS = IPBSEQ(IDMN,IJKDMS)
IF(IPBCS>0) THEN
ICUTIDXS = ISHPB(IDMN,IPBCS)
AREA=F(PBC_DAKAR(1)+ICUTIDXS)
ELSE
AREA=F(I3DANY+IJKDMS)
ENDIF
IF(AREA>CAREA) THEN
CAREA=AREA
IF(CARTES) THEN
CALL VECTOR(NORML,0.,1.,0.)
ELSE
XC=SIN(F(KXYXG+I-1))
YC=COS(F(KXYXG+I-1))
CALL VECTOR(NORML,XC,YC,0.0)
ENDIF
ENDIF
ENDIF
ENDIF
IF(F(L0PAT+INH)>0.0) THEN ! solid to high
IF(IBLK==0) THEN
DOIT=.TRUE.
ELSE
DOIT=NINT(F(L0PAT+INH))==IBLK
ENDIF
IF(DOIT) THEN
IJKDMH=IJKDM+NXNY
IPBCH = IPBSEQ(IDMN,IJKDMH)
IF(IPBCH>0) THEN
ICUTIDXH = ISHPB(IDMN,IPBCH)
AREA=F(PBC_DAKAR(6)+ICUTIDXH)
ELSE
AREA=F(I3DAHZ+IJKDM)
ENDIF
IF(AREA>CAREA) THEN
CAREA=AREA
CALL VECTOR(NORML,0.,0.,-1.)
ENDIF
ENDIF
ENDIF
IF(F(L0PAT+INL)>0.0) THEN ! solid to low
IF(IBLK==0) THEN
DOIT=.TRUE.
ELSE
DOIT=NINT(F(L0PAT+INL))==IBLK
ENDIF
IF(DOIT) THEN
IJKDML=IJKDM-NXNY
IPBCL = IPBSEQ(IDMN,IJKDML)
IF(IPBCL>0) THEN
ICUTIDXL = ISHPB(IDMN,IPBCL)
AREA=F(PBC_DAKAR(5)+ICUTIDXL)
ELSE
AREA=F(I3DAHZ+IJKDML)
ENDIF
IF(AREA>CAREA) THEN
CAREA=AREA
CALL VECTOR(NORML,0.,0.,1.)
ENDIF
ENDIF
ENDIF
ENDIF
IF((INDVAR==W1.OR.INDVAR==W2).AND.EQZ(CAREA).AND.IZ0) THEN ! dealing with cut cell
IF(IBLK==0) THEN
DOIT=F(L0PAT1+I)>0.0
ELSE
DOIT=NINT(F(L0PAT1+I))==IBLK
ENDIF
IF(DOIT) THEN
ICUTIDX = ISHPB(IDMN,IPBC)
CAREA=F(PBC_CTAR+ICUTIDX) ! surface area of cut cell
CALL VECTOR(NORML,F(PBC_CTVEC(1)+ICUTIDX),
1 F(PBC_CTVEC(2)+ICUTIDX),F(PBC_CTVEC(3)+ICUTIDX))
CALL NORM(NORML) ! unit-normal to cut surface
ENDIF
ELSEIF(IZ0.0) THEN ! solid to high
IF(IBLK==0) THEN
DOIT=.TRUE.
ELSE
DOIT=NINT(F(L0PAT1+INH))==IBLK
ENDIF
IF(DOIT) THEN
CALL VECTOR(NORML,0.,0.,-1.)
IJKDMH=IJKDM+NXNY
IPBCH = IPBSEQ(IDMN,IJKDMH)
IF(IPBCH>0) THEN
ICUTIDXH = ISHPB(IDMN,IPBCH)
CAREA=F(PBC_DAKAR(6)+ICUTIDXH)
ELSE
CAREA=F(I3DAHZ+IJKDMH)
ENDIF
ENDIF
ENDIF
ENDIF
IF(CAREA>0) IPLUS=1
ENDIF
END
C---------------------------------------------------------------------
SUBROUTINE GET_SURFACE_S(IX,IY,IZ,IBLK,L0PAT,CAREA,NORML,IPLUS)
C... This subroutine returns the surface area and surface normal for
C a cell lying on the intersection of a blockage and the current
C patch. For Sparsol.
C Inputs:
C IX,IY,IZ - cell index
C IBLK - sequence number of blockage. If 0, any blockage will be used
C L0PAT - address of patch-number store
C outputs:
C CAREA - surface area
C NORML(3) - surface normal unit vector
C IPLUS - 1 if surface area is at IZ+1 for W1
C
use cut_cell_data
INCLUDE 'farray'
INCLUDE 'satear'
INCLUDE 'grdear'
COMMON/LBFFV/P1,P2,U1,U2,V1,V2,W1,W2,R1,R2,RS,KE,EP,H1,H2,
1C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,
1C18,C19,C20,C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,
1C33,C34,C35
INTEGER P1,P2,U1,U2,V1,V2,W1,W2,R1,R2,RS,KE,EP,H1,H2,C1,C2,C3,
1C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,C17,C18,C19,C20,
1C21,C22,C23,C24,C25,C26,C27,C28,C29,C30,C31,C32,C33,C34,C35
INCLUDE 'd_earth/pbcstr'
COMMON/GENI/NXNY,IGFIL1(8),NFM,IGF(21),IPRL,IBTAU,ILTLS,IGFIL(15),
1 ITEM1,ITEM2,ISPH1,ISPH2,ICON1,ICON2,IPRPS,IRADX,IRADY,IRADZ,IVFOL
COMMON /INTDMN/IDMN,NUMDMN,NXMAX,NYMAX,NZMAX,NXYMAX,NXYZMX,NCLTOT,
1 NDOMMX
COMMON /GEODMN0/ I3DAEX,I3DANY,I3DAHZ,I3DVOL,I3DDXG,I3DDYG,I3DDZG,
1 I3DDX,I3DDY,I3DDZ,I2DAWB,I2DASB,I2DALB
! COMMON/F0/KFIL1(17),KZZG, KFIL2(17), KXYXG,KXYXU,KXYYG, KFIL3(266)
COMMON/F0/KXDX,KXXG,KXXU,KXDXG,KXS,KYDY,KYYG,KYR,KYR2,KYRV,KYRV2,
1K12CNN,K12DFN,KYYV,KYDYG,KYS,KZDZ,KZZG,KZP,KZPP,KZAP,KZAH,KZSU,
1KZAL,KZZW,KZDZG,KZWG,KZBLK,KZDZO,KXYDX,KXYDY,KTZPRF,KXYR,KD11,
1KXYRV,KXYXG,KXYXU,KXYYG,KXYYV,KXYDXG,KXYDYG,KZALF,K3PHI,KZAPF,
1KZAHF,KZSUF,KABS,KOR1,K3BB,KCM1,KOR2,KMULM,KMIN1,KMOUT1,KM1,
1K12CON,KGAM,KGAMH,KCLA,KMU,KMUH,K12SOR,KCLA2,KST1,KAE,KAW,KAN,KAS,
1KAH,KAL,KAP,KSU,KARL,IPBIGD,KCM2,KMIN2,KMOUT2,KM2,KLW1AD,KLW2AD,
1KGEN1,KGEN2,K12CNH,IPAWD,IPASD,IPALD,KPLOT,KST2,KAP2,KSU2,KMDOT,
1KS12,IPAED,IPAND,KD12,KMULMH,KD1,KD2,KD3,KD4,KD5,KD6,KD7,KD8,KD9,
1KD10,KDSTAG,KCP1L,KR1H,KZXCY,KCP2L,K12DFH,KU,KU2,KV,KV2,KW,KW2,
1KDU,KDU2,KDV,KDV2,KDW,KDW2,KCE,KCW,KCN,KCS,KCH,KCL,KCE2,KCW2,KCN2,
1KCS2,KCH2,KCL2,KCP1,KRHO1,KRHO1H,KCP2,KRHO2,KRHO2H,IPAHD,KR1,IVOL,
1IAEX,IANY,IAHZ,KXYGR(10),KXYAE,KXYAW,KXYAN,KXYAS,KXYAH,KXYAL,
1KXYVOL,KXYDZ,KXYDZG,KXYDZL,KCP1H,KT1,KT1H,KCP2H,KT2,KT2H,K12CNE,
1KL1,KL1H,K12DFE,KL2,KL2H,IPAE,IPAN,IPAH,IPAP,IPSU,IQDU,IQDU2,IQDV,
1IQDV2,IQDW,IQDW2,IPAS,IPAW,IPAL,KCEA,KCNA,KCHA,KCEA2,KCNA2,KCHA2,
1KX1D,KX2D,KXD,KXAPF,KXAEF,KXAWF,KXSUF,KXPP,KY1D,KY2D,KYD,KYAPF,
1KYANF,KYASF,KYSUF,KYPP,KZ1D,KZ2D,KZD,KYZAW,KYZAE,KXYEA(20),KACO,
1KUCO,KLCO,KCR,KRS,KZYCYP,KDRE,KDRN,KDRH,KRHOM,KRHOMH,KCP1O,KCP2O,
1KGMLM,KGMLMH,IVOLH,KATMP,I1E,I2E,I1N,I2N,I1H,I2H,IFACE,IF1(39)
COMMON/STOGEO/STORGEO
LOGICAL STORGEO
COMMON/ISG/ISGF1(61),ISG62,ISGF2(38) ! isg62==1 for sparsol
COMMON/L0VRPAT/L0IFLP ! for the IFLP index
COMMON/L0PVCM/IDUM1(8),L0FLP2,NPTINF
REAL NORML(3),norm0(3),norm1(3)
INTEGER MAXDIR(1)
LOGICAL DOIT,EQZ,SLD,DOIT2
IPLUS=0
I=(IX-1)*NY+IY ! cell index in plane
IJKDM=(IX-1)*NY+IY+(IZ-1)*NXNY ! cell index in 3D
CAREA=0.0; NORML=0.0 ! initialise surface area and normal
DOIT=.FALSE. ! initialise 'proceed' flag
ICUT=0
IF(ASSOCIATED(CUTCELL)) ICUT = CUTCELL%ICUTM(IJKDM)
IF(ICUT>0) THEN ! dealing with cut cell
IF(IBLK==0) THEN ! no blockage specified - any will do
DOIT=F(L0PAT+I)>0.0.OR.ICUT>0
ELSE
DOIT=CUTCELL%IOBJ(ICUT)==IBLK
ENDIF
IF(DOIT) THEN ! this is the right cell!
CAREA=CUTCELL%AREA(ICUT) ! area of cut surface
CALL VECTOR(NORML,CUTCELL%NORML(1,ICUT),
1 CUTCELL%NORML(2,ICUT),CUTCELL%NORML(3,ICUT))
ENDIF
CALL NORM(NORML) ! unit-normal to cut surface
ELSE ! dealing with un-cut cell
INE=ITWO(I+NY, I,IX 1) ! - West
INN=ITWO(I+1, I,IY 1) ! - South
INH=ITWO(I+NXNY,I,IZ 1) ! - Low
NORML=0.0; NORM0=0.0
IF(IX0.0) THEN ! solid to east
IF(IBLK==0) THEN ! any blockage will do
DOIT=.TRUE.
ELSE ! only next to blockage IBLK
DOIT=NINT(F(L0PAT+INE))==IBLK
ENDIF
C.... don't set area if neighbour is not solid
IF(.NOT.SLD(INE)) DOIT=.FALSE.
IF(DOIT) THEN
IJKDME=IJKDM+NY ! neighbour index
AREA=F(I3DAEX+IJKDM) ! surface area from cell area
IF(AREA>CAREA) THEN
CAREA=AREA ! add area to total
IF(CARTES) THEN
CALL VECTOR(NORML,-1.,0.,0.) ! set unit vector normal to surface
ELSE
XC=-COS(F(KXYXU+I)); YC= SIN(F(KXYXU+I))
CALL VECTOR(NORML,XC,YC,0.0); CALL NORM(NORML)
ENDIF
ENDIF
ENDIF
ENDIF
C
IF(IX>1.AND.F(L0PAT+INW)>0.0) THEN ! solid to west
IF(IBLK==0) THEN
DOIT=.TRUE.
ELSE
DOIT=NINT(F(L0PAT+INW))==IBLK
ENDIF
C.... don't set area if neighbour is not solid
IF(.NOT.SLD(INW)) DOIT=.FALSE.
IF(DOIT) THEN
IJKDMW=IJKDM-NY
AREA=F(I3DAEX+IJKDMW)
IF(AREA>CAREA) THEN
CAREA=AREA
IF(CARTES) THEN
CALL VECTOR(NORML,1.,0.,0.)
ELSE
XC= COS(F(KXYXU+I)); YC= -SIN(F(KXYXU+I))
CALL VECTOR(NORML,XC,YC,0.0); CALL NORM(NORML)
ENDIF
ENDIF
ENDIF
ENDIF
C
IF(IY0.0) THEN ! solid to north
IF(IBLK==0) THEN
DOIT=.TRUE.
ELSE
DOIT=NINT(F(L0PAT+INN))==IBLK
ENDIF
IF(.NOT.SLD(INN)) DOIT=.FALSE.
IF(DOIT) THEN
IJKDMN=IJKDM+1
AREA=F(I3DANY+IJKDM) ! surface area from cell area
IF(AREA>CAREA) THEN
CAREA=AREA
IF(CARTES) THEN
CALL VECTOR(NORML,0.,-1.,0.)
ELSE
XC=-SIN(F(KXYXG+I)); YC=-COS(F(KXYXG+I))
CALL VECTOR(NORML,XC,YC,0.0); CALL NORM(NORML)
ENDIF
ENDIF
ENDIF
ENDIF
C
IF(IY>1.AND.F(L0PAT+INS)>0.0) THEN ! solid to south
IF(IBLK==0) THEN
DOIT=.TRUE.
ELSE
DOIT=NINT(F(L0PAT+INS))==IBLK
ENDIF
C.... don't set area if neighbour is not solid
IF(.NOT.SLD(INS)) DOIT=.FALSE.
IF(DOIT) THEN
IJKDMS=IJKDM-1
AREA=F(I3DANY+IJKDMS)
IF(AREA>CAREA) THEN
CAREA=AREA
IF(CARTES) THEN
CALL VECTOR(NORML,0.,1.,0.)
ELSE
XC=SIN(F(KXYXG+I-1)); YC=COS(F(KXYXG+I-1))
CALL VECTOR(NORML,XC,YC,0.0); CALL NORM(NORML)
ENDIF
ENDIF
ENDIF
ENDIF
C
IF(IZ0.0) THEN ! solid to high
IF(IBLK==0) THEN
DOIT=.TRUE.
ELSE
DOIT=NINT(F(L0PAT+INH))==IBLK
ENDIF
C... don't set area if neighbour is not solid
IF(.NOT.SLD(INH)) DOIT=.FALSE.
IF(DOIT) THEN
IJKDMH=IJKDM+NXNY
AREA=F(I3DAHZ+IJKDM)
IF(AREA>CAREA) THEN
CAREA=AREA
CALL VECTOR(NORML,0.,0.,-1.)
CALL ADDVEC(NORM0,NORML,NORM0)
ENDIF
ENDIF
ENDIF
C
IF(IZ>1.AND.F(L0PAT+INL)>0.0) THEN ! solid to low
IF(IBLK==0) THEN
DOIT=.TRUE.
ELSE
DOIT=NINT(F(L0PAT+INL))==IBLK
ENDIF
C.... don't set area if neighbour is not solid
IF(.NOT.SLD(INL)) DOIT=.FALSE.
IF(DOIT) THEN
IJKDML=IJKDM-NXNY
AREA=F(I3DAHZ+IJKDML)
IF(AREA>CAREA) THEN
CAREA=AREA
CALL VECTOR(NORML,0.,0.,1.)
CALL ADDVEC(NORM0,NORML,NORM0)
ENDIF
ENDIF
ENDIF
ENDIF
IF((INDVAR==W1.OR.INDVAR==W2).AND.EQZ(CAREA).AND.IZ0.0) THEN ! solid to high
IF(IBLK==0) THEN
DOIT=.TRUE.
ELSE
DOIT=NINT(F(L0PAT1+INH))==IBLK
ENDIF
IF(DOIT) THEN
CALL VECTOR(NORML,0.,0.,-1.)
IJKDMH=IJKDM+NXNY
CAREA=F(I3DAHZ+IJKDMH)
ENDIF
ENDIF
ENDIF
IF(CAREA>0) IPLUS=1
ENDIF
END
c