c
c c file name GXPOTFLO.HTM 070405 C**** SUBROUTINE GXPOTC is called from GREX3, group 19, section 5, C and is entered only when POTVEL and POTCMP are set to T, and C only for ISWEEP > 1. C C.... The library case 117 makes use of it. C SUBROUTINE GXPOTC(EPOR,NPOR,HPOR,FACTOR,EXPNNT,NZ) INCLUDE 'farray' INCLUDE 'grdear' INCLUDE 'grdloc' INCLUDE 'satgrd' COMMON/GENI/NXNY,IGFIL(59) COMMON/RDA1/DTFALS(150) INTEGER EPOR,NPOR,HPOR COMMON/NAMFN/NAMFUN,NAMSUB CHARACTER*6 NAMFUN,NAMSUB C NAMSUB = 'GXPOTC' C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! C.... Only the high porosity is modified here, and by reference C to the W velocity alone. If help is needed in generalising the C coding to take account of other directions, please contact CHAM C user support. See core library case 117 for exemplification. C C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! IF(STORE(HPOR)) THEN IF(STORE(W1).AND.IZ.NE.NZ) THEN SETPOR=.TRUE. L0HPOR=L0F(HPOR) L0W1=L0F(W1) c.... under-relaxation factor IF(DTFALS(HPOR).LT.0.0) THEN FAC1=-DTFALS(HPOR) ELSE FAC1=1.0 ENDIF c.... adjust HPOR DO 100 I=1,NXNY IF(F(L0HPOR+I).GT.1.E-6) THEN TERM=1.0 - FACTOR*F(L0W1+I)**2 IF(TERM.GT.1.E-5) THEN TERM=TERM ** EXPNNT ELSE CALL WRIT40('!! Velocity supersonic. Method invalid!!') CALL SET_ERR(230,'Error. Velocity supersonic. Method invalid.' * ,1) C CALL EAROUT(1) ENDIF F(L0HPOR+I)=F(L0HPOR+I) + FAC1*(TERM - F(L0HPOR+I)) ENDIF 100 CONTINUE ENDIF ELSE CALL WRIT40('Store HPOR for POTVEL = T and NZ > 1 ') CALL SET_ERR(231,'Error. Store HPOR for POTVEL = T and NZ > 1.' * ,1) C CALL EAROUT(1) ENDIF NAMSUB = 'gxpotc' END C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! c C**** SUBROUTINE GXPOTV is called from GREX3, group 19, section 5, C and is entered only when POTVEL is set to T, and called only C for ISWEEP.GT.1 C C The logical functions XF and XF0 are used to detect whether the C x (ie N, E, or H) face is a solid fluid boundary or has a zero C porosity value. C C.... Core-library case 116 exemplifies the use of this subroutine. C SUBROUTINE GXPOTV(EPOR,NPOR,HPOR,NZ,DZGG,BFC) INCLUDE 'farray' INCLUDE 'grdloc' INCLUDE 'satgrd' INCLUDE 'grdear' INCLUDE 'grdbfc' COMMON/IDATA/NX,NY,IDFL(118) COMMON/GENI/NXNY,IGFIL1(59) COMMON/LDATA/LFIL1(7),XCYCLE,LFIL2(76) COMMON /NAMFN/NAMFUN,NAMSUB INTEGER EPOR,NPOR,HPOR CHARACTER*6 NAMFUN,NAMSUB LOGICAL BFC,XCYCLE,EF,NF,HF,EF0,NF0,HF0,EQZ,SLD C NAMSUB = 'GXPOTV' LBPOT = LBNAME('POT') L0POT= L0F(LBPOT) c..................................................... U1 IF(STORE(U1) .AND. NX.GT.1) THEN L0U1=L0F(U1) IF(EPOR.NE.0) L0EPOR=L0F(EPOR) IF(BFC) THEN L0DXG=L0B(DXGPE) + (IZ-1)*NXNY ELSE L0DXG=L0F(DXG2D) ENDIF DO 10 IX=1,NX IPLUS=NY IF(IX.EQ.NX) IPLUS=IPLUS-NXNY DO 10 IY=1,NY I=IY+(IX-1)*NY IE=I+IPLUS F(L0U1+I)=(F(L0POT+I)-F(L0POT+IE))/F(L0DXG+I) IF(EF(I).OR.EF0(I)) THEN F(L0U1+I) = 0.0 ELSEIF(EPOR.NE.0) THEN IF(EQZ(F(L0EPOR+I))) F(L0U1+I) = 0.0 ENDIF 10 CONTINUE IF(STORE(P1)) THEN L0P1=L0F(P1) DO IX=1,NX DO IY=1,NY I=IY+(IX-1)*NY IW = I - NY IF(.NOT.XCYCLE) THEN IF(IX.EQ.1) THEN F(L0P1+I)=F(L0P1+I) - 0.5*F(L0U1+I)**2 ELSEIF(IX.EQ.NX) THEN F(L0P1+I)=F(L0P1+I) - 0.5*F(L0U1+IW)**2 ELSE F(L0P1+I)=F(L0P1+I) - 0.125*(F(L0U1+I)+F(L0U1+IW))**2 ENDIF ELSE IF(IX.EQ.1) IW=IW + NXNY F(L0P1+I)=F(L0P1+I) - 0.125*(F(L0U1+I)+F(L0U1+IW))**2 ENDIF IF(SLD(I)) F(L0P1+I)=0.0 ENDDO ENDDO ENDIF ENDIF c IF(STORE(V1) .AND. NY.GT.1) THEN L0V1=L0F(V1) IF(NPOR.NE.0) L0NPOR=L0F(NPOR) IF(BFC) THEN L0DYG=L0B(DYGPN) + (IZ-1)*NXNY ELSE L0DYG=L0F(DYG2D) ENDIF DO 20 IX=1,NX DO 20 IY=1,NY I=IY+(IX-1)*NY IN=I+1 F(L0V1+I)=(F(L0POT+I)-F(L0POT+IN))/F(L0DYG+I) IF(IY.EQ.NY.OR.NF(I).OR.NF0(I)) THEN F(L0V1+I) = 0.0 ELSEIF(NPOR.NE.0) THEN IF(EQZ(F(L0NPOR+I))) F(L0V1+I) = 0.0 ENDIF 20 CONTINUE IF(STORE(P1)) THEN L0P1=L0F(P1) DO IX=1,NX DO IY=1,NY I=IY+(IX-1)*NY IS=I-1 IF(IY.EQ.1) THEN F(L0P1+I)=F(L0P1+I) - 0.5*F(L0V1+I)**2 ELSEIF(IY.EQ.NY) THEN F(L0P1+I)=F(L0P1+I) - 0.5*F(L0V1+IS)**2 ELSE F(L0P1+I)=F(L0P1+I) - 0.125*(F(L0V1+I) + F(L0V1+IS)) **2 ENDIF IF(SLD(I)) F(L0P1+I)=0.0 ENDDO ENDDO ENDIF ENDIF c IF(STORE(W1) .AND. NZ.GT.1 .AND. IZ.NE.NZ) THEN L0POTH = L0F(HIGH(LBPOT)) L0W1=L0F(W1) IF(BFC) L0DZG=L0B(DZGPH) + (IZ-1)*NXNY IF(HPOR.NE.0) L0HPOR=L0F(HPOR) DO 30 I=1,NXNY IF(BFC) THEN DELZ=F(L0DZG+I) ELSE DELZ=DZG ENDIF F(L0W1+I)=(F(L0POT+I)-F(L0POTH+I))/DELZ IF(HF(I).OR.HF0(I)) THEN F(L0W1+I) = 0.0 ELSEIF(HPOR.NE.0) THEN IF(EQZ(F(L0HPOR+I))) F(L0W1+I) = 0.0 ENDIF 30 CONTINUE IF(STORE(P1)) THEN L0P1=L0F(P1) L0LOW1=L0F(LOW(W1)) DO IX=1,NX DO IY=1,NY I=IY+(IX-1)*NY IF(IZSTEP.EQ.1) THEN F(L0P1+I)=F(L0P1+I) - 0.5*F(L0W1+I)**2 ELSEIF(IZSTEP.EQ.NZ) THEN F(L0P1+I)=F(L0P1+I) - 0.5*F(L0LOW1+I)**2 ELSE F(L0P1+I)=F(L0P1+I) - 0.125*(F(L0W1+I) + F(L0LOW1+I))**2 ENDIF IF(SLD(I)) F(L0P1+I)=0.0 ENDDO ENDDO ENDIF ENDIF NAMSUB = 'gxpotv' END c C**** SUBROUTINE GXPSIV is called from GREX3, group 19, section 5, C and is entered only when LPSIV is set to T, and called only C for ISWEEP.GT.1 C SUBROUTINE GXPSIV(BFC) INCLUDE 'farray' INCLUDE 'grdloc' INCLUDE 'satgrd' INCLUDE 'grdear' INCLUDE 'grdbfc' COMMON/IDATA/NX,NY,IDFL(118) COMMON/GENI/NXNY,IGFIL1(59) C COMMON/LDATA/LFIL1(7),XCYCLE,LFIL2(76) COMMON /NAMFN/NAMFUN,NAMSUB CHARACTER*6 NAMFUN,NAMSUB LOGICAL BFC C NAMSUB = 'GXPSIV' LBPSIV = LBNAME('PSIV') IF(LBPSIV.NE.0) L0PSIV= L0F(LBPSIV) c..................................................... U1 IF(STORE(U1) .AND. NX.GT.1) THEN L0U1=L0F(U1) IF(BFC) THEN L0DYG=L0B(DYGPN) + (IZ-1)*NXNY ELSE L0DYV=L0F(DYV2D) ENDIF DO IX=1,NX DO IY=1,NY I=IY+(IX-1)*NY IF(IY.EQ.1) THEN F(L0U1+I)=0.0 ELSE F(L0U1+I)=( F(L0PSIV+I) - F(L0PSIV+I-1) ) / F(L0DYV+I) ENDIF ENDDO ENDDO ENDIF c..................................................... V1 IF(STORE(V1) .AND. NY.GT.1) THEN L0V1=L0F(V1) IF(BFC) THEN L0DXG=L0B(DXGPE) + (IZ-1)*NXNY ELSE L0DXU=L0F(DXU2D) ENDIF DO IX=1,NX DO IY=1,NY I=IY+(IX-1)*NY IF(IX.EQ.1) THEN F(L0V1+I) = 0.0 ELSE F(L0V1+I)=( F(L0PSIV+I-NY) - F(L0PSIV+I) ) / F(L0DXU+I) ENDIF ENDDO ENDDO ENDIF c....................................................PSID for display LBPSID=LBNAME('PSID') IF(LBPSID.NE.0) THEN L0PSID=L0F(LBPSID) DO IX=2,NX DO IY=2,NY I=IY+(IX-1)*NY F(L0PSID+I)= 0.25*( F(L0PSIV+I) + F(L0PSIV+I-1) 1 + F(L0PSIV+I-NY) + F(L0PSIV+I-1-NY) ) ENDDO ENDDO ENDIF namsub = 'grex3 ' END c