c

C**** SUBROUTINE GXPORA is called from GREX3, group 19, section 3 and
C     when IPORIA is set to greater than zero in SATELLITE.
C
C.... SETPOR must be set to T when the porosities are modified and
C     reset, in order that EARTH knows that geometrical quantities must
C     be re-calculated
C
C     The examples provided are useful for simulating free-surface flow
C     phenomena, with gravity operating in the negative z-direction.
C     Surface waves are represented by allowing the porosities of the
C     upper cells to increase with pressure.
C
C.... The library cases 457-458 exemplify the use of it.
C
C     The following auxiliary subroutines are used:
C     fn0(y,x)                       y = x
C     fn10(y,x1,x2,a,b1,b2)          y = a+b1*x1+b2*x2
C     fn47(y,a,b)                    y = amax1(a,amin1(b,y))
C
      SUBROUTINE GXPORA(SETPOR)
      INCLUDE 'farray'
      INCLUDE 'grdloc'
      INCLUDE 'satgrd'
      INCLUDE 'satear'
      COMMON /IGE/IFIL1(9),IZSTEP,IFIL2,ISWEEP,IFIL3(13)
      LOGICAL SETPOR
      COMMON/NAMFN/NAMFUN,NAMSUB
      CHARACTER*6 NAMFUN,NAMSUB
      NAMSUB = 'GXPORA'
C
      IF(VPOR.NE.0) THEN
        SETPOR=.FALSE.
        IF(STORE(P2)) THEN
C.... Set ?POR = ?POR*PORIA + PORIB*(P1-P2)
          CALL FN10(VPOR,P1,P2,PORIA,PORIB,-PORIB)
          SETPOR = .TRUE.
        ELSE
C.... Set ?POR = PORIA + PORIB * P1 for IPORIA < or = IZSTEP
          IF(IZSTEP.LE.IPORIA) THEN
            L0VPOR=L0F(VPOR)
            L0P1=L0F(P1)
            RELX=MAX(0.0,MIN(1.,ABS(DTFALS(VPOR))))
            IF(ISWEEP==1) RELX=1.0
            RELXM1=1.-RELX
            DO 10 I=1,NX*NY
              IF(F(L0VPOR+I).GT.1.E-6) THEN
                VPR=F(L0VPOR+I)
                F(L0VPOR+I)=RELXM1*VPR+RELX*(PORIA+PORIB*F(L0P1+I))
              ENDIF
   10       CONTINUE
            SETPOR=.TRUE.
          ENDIF
        ENDIF
        IF(SETPOR) THEN
          CALL FN47(VPOR,VARMIN(VPOR),VARMAX(VPOR))
          IF(EPOR.NE.0.AND.NX.GT.1) CALL FN0(EPOR,VPOR)
          IF(NPOR.NE.0.AND.NY.GT.1) CALL FN0(NPOR,VPOR)
          call setblk(izstep)
        ENDIF
      ENDIF
      NAMSUB = 'gxpora'
      END
C!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
c file name            gxmovpor.htm        120704
c
C.... GXMOBS is called from GREX3 (Gr.19 Sc.1) if IPORIB.NE.0 from Group
c            19, section 1, i.e. at the start of each time step, in
c            to compute values of VPOR, EPOR, NPOR or HPOR.
C
C     The following examples are provided:
C     - IPORIB= 1 creates porosities appropriate to a spherical
C                 coordinate system with the y-direction radial;
C     - IPORIB= 2 resets VPOR to model moving piston.
C
C.... Variables PRBLOK and PRUNBL store indices of materials, which will
C     be used by EARTH to fill PRPS-array in just-blocked cells (PRBLOK)
C     and/or unblocked cells (PRUNBL). Just blocked cell is the cell for
C     which VPOR is set to zero at the current time step.
C     By default, PRBLOK= PORPRP; PRUNBL=1.0. The user MUST modify them,
C     if other solids or fluids are used in his/her case.
C
      SUBROUTINE GXMOBS
      INCLUDE 'farray'
      INCLUDE 'satear'
      INCLUDE 'grdloc'
      INCLUDE 'satgrd'
      INCLUDE 'grdear'
 
      COMMON /MOVCMN/LMVCMN(5),PRBLOK,PRUNBL
C     1       /MOVPST/PTYP,IXPS,IYPS,IZPS,LXMOVE,LYMOVE,LZMOVE
      COMMON /MOVPSTI/IXPS,IYPS,IZPS
     1       /MOVPSTL/LXMOVE,LYMOVE,LZMOVE
     1       /MOVPSTR/PTYP
     1       /SLDPRP/SOLPRP,PORPRP,VACPRP
     1       /GENI/ IGFIL2(55),IPRPS,IFIL1(4)
     1       /NAMFN/NAMFUN,NAMSUB
      LOGICAL LMVCMN,QEQ,LXMOVE,LYMOVE,LZMOVE
      CHARACTER*6 NAMFUN,NAMSUB
      SAVE IPF,IPL,JPF,JPL,KPF,KPL,ITPF,ITPL
C
      NAMSUB = 'GXMOBS'
C.... Set SETPOR to true to activate appropriate resetting of arrays
C     used by EARTH test functions
      SETPOR= .TRUE.
C.... Set indices for materials, which will be used by EARTH to fill just
C     blocked (PRBLOK) or/and unblocked (PRUNBL) cells.
      IF(ISTEP.EQ.FSTEP) CALL SUB2R( PRBLOK,PORPRP, PRUNBL,-1.0 )
C.... PISTON: Get the direction of piston movement and the sizes of area
C             which could be covered by piston:
      IF(IPORIB.EQ.2) THEN       ! if the piston-patch is set via spedat
        IF(ISTEP.EQ.FSTEP) THEN  ! determine initial position of piston
                                 ! here i, j and k signify ix, iy, iz
          CALL GETPTC('PISTON',PTYP,IPF,IPL,JPF,JPL,KPF,KPL,ITPF,ITPL)
          LXMOVE= QEQ(PTYP,2.) .OR. QEQ(PTYP,3.) ! deduce direction of motion
          LYMOVE= QEQ(PTYP,4.) .OR. QEQ(PTYP,5.) ! from patch type, e.g. x
          LZMOVE= QEQ(PTYP,6.) .OR. QEQ(PTYP,7.) ! if east or west, y if ..
        ENDIF
C.... This example blocks one cell every other time step. The user is
C     free to introduce other rule of blocking by changing the coding:
        ISTPIS= ISTEP/2
        IF(ISTPIS*2.EQ.ISTEP ) THEN
          PSTPOR= 0.0
          ISTPIS= ISTPIS-1
        ELSE
          PSTPOR= 0.5
        ENDIF
        CALL SUB3(IXPS,IPF-1, IYPS,JPF-1, IZPS,KPF-1)
        IF(LXMOVE) THEN
          IXPS= ITWO(IPF+ISTPIS,IPL-ISTPIS,QEQ(PTYP,2.))
        ELSEIF(LYMOVE) THEN
          IYPS= ITWO(JPF+ISTPIS,JPL-ISTPIS,QEQ(PTYP,4.))
        ELSE
          IZPS= ITWO(KPF+ISTPIS,KPL-ISTPIS,QEQ(PTYP,6.))
        ENDIF
      ENDIF
C.... Loop over whole domain to introduce new blockages:
      CALL SUB2( L0VPOR,0, L0PRPS,0 )
      CALL SUB3( L0EPOR,0, L0NPOR,0, L0HPOR,0 )
      DO 70 IZZ= 1,NZ
C.... Get addresses of blockages for IZ-slab:
        IF(EPOR.NE.0) L0EPOR= L0F(EPOR)
        IF(NPOR.NE.0) L0NPOR= L0F(NPOR)
        IF(HPOR.NE.0) L0HPOR= L0F(HPOR)
        IF(VPOR.NE.0) L0VPOR= L0F(VPOR)
        IF(IPRPS.NE.0) L0PRPS= L0F(IPRPS)
C.... IPORIB switches between various options to set porosities
        IF(IPORIB.EQ.1) THEN
C.... Create porosities appropriate to a spherical coordinate system
C     with the y-direction radial.
          L0XG= L0F(LXXG)
          L0YG= L0F(LYYG)
          L0YV= L0F(LYYV)
          DO 50 IX= 1,NX
            SINXG = SIN(F(L0XG+IX))/(RINNER+YVLAST)
            SINXU = SIN(F(L0XG+IX))/(RINNER+YVLAST)
            L0ECEL= L0EPOR+NY*(IX-1)
            L0NCEL= L0NPOR+NY*(IX-1)
            L0HCEL= L0HPOR+NY*(IX-1)
            L0VCEL= L0VPOR+NY*(IX-1)
            IF(EPOR.NE.0) THEN
              DO 10 IY= 1,NY
                F(L0ECEL+IY)=(RINNER+F(L0YG+IY))*SINXU
  10          CONTINUE
            ENDIF
            IF(NPOR.NE.0) THEN
              DO 20 IY= 1,NY
                F(L0NCEL+IY)=(RINNER+F(L0YV+IY))*SINXG
  20          CONTINUE
            ENDIF
            IF(HPOR.NE.0) THEN
              DO 30 IY= 1,NY
                F(L0HCEL+IY)=(RINNER+F(L0YG+IY))*SINXG
  30          CONTINUE
            ENDIF
            IF(VPOR.NE.0) THEN
              DO 40 IY= 1,NY
                F(L0VCEL+IY)=(RINNER+F(L0YG+IY))*SINXG
  40          CONTINUE
            ENDIF
  50      CONTINUE
        ELSEIF(IPORIB.EQ.2) THEN       ! the moving piston
          IF(ITPF.LE.ISTEP .AND. ISTEP.LE.ITPL) THEN
            IF(KPF.LE.IZZ .AND. IZZ.LE.KPL) THEN
              DO 60 IX= IPF,IPL
                DO 60 IY= JPF,JPL
                  IJ= IY+(IX-1)*NY
                  IF(IX.LT.IXPS .OR. IY.LT.IYPS .OR. IZZ.LT.IZPS) THEN
                    F(L0VPOR+IJ)= 0.0
                  ELSEIF(IX.EQ.IXPS.OR.IY.EQ.IYPS.OR.IZZ.EQ.IZPS) THEN
                    F(L0VPOR+IJ)= PSTPOR
                  ENDIF
  60          CONTINUE
            ENDIF
          ENDIF
        ELSEIF(IPORIB.EQ.3) THEN
c.... north and volume porosities are proportional to IY**2
          FNY=FLOAT(NY)
          RFNY=1.0/FNY
          TERM2=0.0
          DO IY=1,NY
            TERM1=(FLOAT(IY)*RFNY)**2
            F(L0NPOR+IY)=TERM1
            F(L0VPOR+IY)=0.5*(TERM1+TERM2)
            TERM2=TERM1
          ENDDO
        ELSE
C.... The user can introduce his/her own option to set blockages here
        ENDIF
C.... Reset addresses for use in Z-loop:
        IF(NZ.GT.1) CALL RSTADR(IZZ)
  70  CONTINUE
      NAMSUB = 'gxmobs'
      END
c