subroutine adv_split_u(dt,f,fi,Di,adv,U,DU, & #if defined(SPHERICAL) || defined(CURVILINEAR) dxu,dyu,arcd1, & #endif splitfac,scheme,AH, & mask_flux,mask_update) Note (KK): Keep in sync with interface in advection.F90DESCRIPTION:
Executes an advection step in zonal direction for a 2D quantity. The 1D advection equation
is accompanied by an fractional step for the 1D continuity equation
Here, and denote values before and after this operation, respectively, denote intermediate values when other 1D advection steps come after this and denotes intermediate values when other 1D advection steps came before this. Furthermore, when this -directional split step is repeated during the total time step (Strang splitting), the time step denotes a fraction of the full time step.
The interfacial fluxes are calculated according to the third-order polynomial scheme (so-called P scheme), cast in Lax-Wendroff form by:
with the Courant number and
It should be noted, that for the original Lax-Wendroff scheme and for the first-oder upstream scheme can be recovered.
In order to obtain a monotonic and positive scheme, the factors are limited in the following way:
and, equivalently, for . This so-called PDM-limiter has been described in detail by Leonard (1991), who named the PDM-limited P scheme also ULTIMATE QUICKEST (quadratic upstream interpolation for convective kinematics with estimated stream terms).
Some simpler limiters which do not exploit the third-order polynomial properties of the discretisation (74) have been listed by Zalezak (1987). Among those are the MUSCL scheme by van Leer (1979),
and the Superbee scheme by Roe (1985),
The selector for the schemes is scheme:
|scheme = UPSTREAM:||first-order upstream (monotone)|
|scheme = P2:||third-order polynomial (non-monotone)|
|scheme = SUPERBEE:||second-order TVD (monotone)|
|scheme = MUSCL:||second-order TVD (monotone)|
|scheme = P2_PDM:||third-order ULTIMATE-QUICKEST (monotone)|
Furthermore, the horizontal diffusion in zonal direction with the constant diffusion coefficient AH is carried out here by means of a central difference second-order scheme. USES:
use domain, only: imin,imax,jmin,jmax #if !( defined(SPHERICAL) || defined(CURVILINEAR) ) use domain, only: dx,dy,ard1 #endif use advection, only: adv_interfacial_reconstruction use advection, only: UPSTREAM $ use omp_lib IMPLICIT NONEINPUT PARAMETERS:
Note (KK): in general dxu, dyu and mask_flux do only have valid data within (_IRANGE_HALO_-1,_JRANGE_HALO_). In some cases the original field extension may even be _IRANGE_HALO_. Then explicit declared array bounds _IRANGE_HALO_-1 require a provision of the corresponding subarray and will cause copying of the non-contiguously data into a temporarily array. Therefore they are declared as pointers here. This however requires, that the provided pointers already carry the correct bounds. REALTYPE,intent(in) :: dt,splitfac,AH REALTYPE,dimension(E2DFIELD),intent(in) :: f,U,DU #if defined(SPHERICAL) || defined(CURVILINEAR) REALTYPE,dimension(:,:),pointer,intent(in) :: dxu,dyu REALTYPE,dimension(E2DFIELD),intent(in) :: arcd1 #endif integer,intent(in) :: scheme logical,dimension(:,:),pointer,intent(in) :: mask_flux logical,dimension(E2DFIELD),intent(in) :: mask_updateINPUT/OUTPUT PARAMETERS:
REALTYPE,dimension(E2DFIELD),intent(inout) :: fi,Di,advLOCAL VARIABLES:
REALTYPE,dimension(E2DFIELD) :: uflux logical :: use_limiter,use_AH integer :: i,j,isub REALTYPE :: dti,Dio,advn,cfl,fuu,fu,fdREVISION HISTORY:
Original author(s): Hans Burchard & Karsten Bolding