C $Header: /u/gcmpack/MITgcm/pkg/generic_advdiff/gad_pqm_adv_r.F,v 1.1 2016/03/13 01:44:03 jmc Exp $
C $Name: $
# include "GAD_OPTIONS.h"
SUBROUTINE GAD_PQM_ADV_R(meth,bi,bj,
I delT,wvel,wfac,fbar,
O flux,myThid )
C |================================================================|
C | PQM_ADV_R: evaluate grid-cell advective flux in R. |
C | Lagrangian-type Piecewise Quartic Method (PQM). |
C |================================================================|
implicit none
C =============================================== global variables
# include "SIZE.h"
# include "GRID.h"
# include "GAD.h"
C ================================================================
C meth :: advection method.
C bi,bj :: tile indexing
C delT :: level-wise time-steps.
C wvel :: vel.-comp in r-direction.
C wfac :: vel.-flux in r-direction.
C fbar :: grid-cell values.
C flux :: adv.-flux in r-direction.
C myThid :: thread number.
C ================================================================
integer meth
integer bi,bj
_RL delT(1:Nr)
_RL wvel(1-OLx:sNx+OLx,
& 1-OLy:sNy+OLy,
& 1:Nr)
_RL wfac(1-OLx:sNx+OLx,
& 1-OLy:sNy+OLy,
& 1:Nr)
_RL fbar(1-OLx:sNx+OLx,
& 1-OLy:sNy+OLy,
& 1:Nr)
_RL flux(1-OLx:sNx+OLx,
& 1-OLy:sNy+OLy,
& 1:Nr)
integer myThid
C ================================================================
C ix,iy,ir :: grid indexing.
C floc :: col. of grid-cell values.
C mloc :: col. of grid-cell mask values.
C fhat :: col. of poly. coeff.
C - FHAT(:,I) = PQM coeff.
C edge :: col. of edge-wise values/slopes.
C - EDGE(1,:) = VALUE.
C - EDGE(2,:) = DF/DR.
C ohat :: col. of oscl. coeff.
C - OHAT(1,:) = D^1F/DS^1.
C - OHAT(2,:) = D^2F/DS^2.
C ================================================================
integer ix,iy,ir
_RL floc( 1-3:Nr+3)
_RL mloc( 1-3:Nr+3)
_RL fhat(1:5,1-0:Nr+0)
_RL edge(1:2,1-0:Nr+1)
_RL ohat(1:2,1-3:Nr+3)
_RL vsum
C ======================================= mask boundary conditions
mloc( -2) = 0.0 _d 0
mloc( -1) = 0.0 _d 0
mloc( +0) = 0.0 _d 0
mloc(Nr+1) = 0.0 _d 0
mloc(Nr+2) = 0.0 _d 0
mloc(Nr+3) = 0.0 _d 0
C ================================================================
C (1): copy a single row of data onto contiguous storage, treat
C as a set of one-dimensional problems.
C (2): calc. "oscillation-indicators" for each grid-cell if ad-
C vection scheme is WENO-class.
C (3): calc. edge-centred values/slopes by high-order interpol-
C ation.
C (4): calc. cell-centred polynomial profiles with appropriate
C slope-limiting.
C (5): calc. fluxes using a local, semi-lagrangian integration.
C ================================================================
do iy = 1-OLy+0, sNy+OLy-0
do ix = 1-OLx+0, sNx+OLx-0
C ======================================= no flux through surf. bc
flux(ix,iy,+1) = 0.0 _d +0
end
do
end
do
C ==================== calculate transport for interior grid-cells
do iy = 1-OLy+0, sNy+OLy-0
do ix = 1-OLx+0, sNx+OLx-0
vsum = 0.0 _d 0
do ir = +1, Nr
C ================================== quick break on zero transport
vsum = vsum
& + abs(wfac(ix,iy,ir))
C ================================== make local unit-stride copies
floc(ir) = fbar (ix,iy,ir)
mloc(ir) =
& maskC(ix,iy,ir,bi,bj)
end
do
if (vsum .gt. 0. _d 0) then
C ================================== make mask boundary conditions
floc( -2) = floc(+1)
floc( -1) = floc(+1)
floc( +0) = floc(+1)
floc(Nr+1) = floc(Nr)
floc(Nr+2) = floc(Nr)
floc(Nr+3) = floc(Nr)
C ==================== reconstruct derivatives for WENO indicators
if (meth.eq.ENUM_PQM_WENO_LIMIT) then
CALL GAD_OSC_HAT_R(bi,bj,ix,iy,
& mloc,floc,
& ohat,myThid)
end
if
C ==================== reconstruct 5th--order accurate edge values
CALL GAD_PQM_P5E_R(bi,bj,ix,iy,
& mloc,floc,
& edge,myThid)
C ==================== reconstruct coeff. for grid-cell poynomials
CALL GAD_PQM_HAT_R(bi,bj,ix,iy,
& meth,
& mloc,floc,
& edge,ohat,
& fhat,myThid)
C ==================== evaluate integral fluxes on grid-cell edges
CALL GAD_PQM_FLX_R(bi,bj,ix,iy,
& delT,wvel,
& wfac,fhat,
& flux,myThid)
else
do ir = 2, Nr
C ================================== "null" flux on zero transport
flux(ix,iy,ir) = 0. _d 0
end
do
end
if
end
do
end
do
return
c end subroutine GAD_PQM_ADV_R
end