Fortran: Module Interface internal_pressure (Source File: internal_pressure.F90)

INTERFACE:

    module internal_pressure
DESCRIPTION:

In GETM, various methods are provided for the calculation of the internal pressure gradients terms in $ x$- and $ y$-direction. These terms which appear as layer-integrated terms in the equations for the layer-integrated momentum are for the eastward momentum $ p_k$ (see equation (26)):

$\displaystyle h_k\left(\frac12h_N(\partial^*_xb)_N +\sum_{j=k}^{N-1}\frac12(h_j+h_{j+1})(\partial^*_xb)_j \right)$ (114)

and for the northward layer-integrated momentum $ q_k$ (see equation (27)):

$\displaystyle h_k\left(\frac12h_N(\partial^*_yb)_N +\sum_{j=k}^{N-1}\frac12(h_j+h_{j+1})(\partial^*_yb)_j \right)$ (115)

The major problem is how to calculate the horizontal (with respect to isogeopotentials) buoyancy gradients $ \partial^*_xb$ and $ \partial^*_yb$, which need to be defined at the interfaces positioned vertically between two velocity points.

The methods for calculating the internal pressure gradient included in GETM are currently:

  1. Method by Mellor et al. (1994), see routine ip_blumberg_mellor
  2. Modified Mellor et al. (1994) method, exact for linear density profiles with $ z$-dependence only, see routine ip_blumberg_mellor_lin
  3. Calculation by mean of linear interpolation to $ z$-levels, see routine ip_z_interpol
  4. Method by Song (1998), see routine ip_song_wright
  5. Method by Chu and Fan (2003), see routine ip_chu_fan
  6. Method by Shchepetkin and McWilliams (2003), see routine ip_shchepetkin_mcwilliams
  7. Method by Stelling and van Kester (1994), see routine ip_stelling_vankester.F90

It is possible, by setting the compiler option SUBSTR_INI_PRESS, to substract the initial pressure gradient from all pressure gradients. This is only advisable for strong stratification without any initial internal pressure gradients. In this case any non-zero values of the resulting numerical initial pressure gradient are due to discretisation errors. USES:

    use exceptions
    use domain, only: imin,imax,jmin,jmax,kmax,az,au,av,H,HU,HV
 #if defined(SPHERICAL) || defined(CURVILINEAR)
    use domain, only: dxu,dyv
 #else
    use domain, only: dx,dy
 #endif
    use variables_3d, only: kmin,hn,hun,hvn,idpdx,idpdy,buoy,ssun,ssvn,ssen
    IMPLICIT NONE
PUBLIC DATA MEMBERS:
    public init_internal_pressure, do_internal_pressure
    integer, public           :: ip_method=1
 #ifdef STATIC
    REALTYPE                  :: zz(I3DFIELD)
 #ifdef SUBSTR_INI_PRESS
    REALTYPE                  :: idpdx0(I3DFIELD),idpdy0(I3DFIELD)
 #endif
 #else
    REALTYPE, allocatable     :: zz(:,:,:)
 #ifdef SUBSTR_INI_PRESS
    REALTYPE, allocatable     :: idpdx0(:,:,:),idpdy0(:,:,:)
 #endif
 #endif
   !PRIVATE DATA MEMBERS:
    integer, private, parameter         :: BLUMBERG_MELLOR=1
    integer, private, parameter         :: BLUMBERG_MELLOR_LIN=2
    integer, private, parameter         :: Z_INTERPOL=3
    integer, private, parameter         :: SONG_WRIGHT=4
    integer, private, parameter         :: CHU_FAN=5
    integer, private, parameter         :: SHCHEPETKIN_MCWILLIAMS=6
    integer, private, parameter         :: STELLING_VANKESTER=7
REVISION HISTORY:
    Original author(s): Hans Burchard & Karsten Bolding



Subsections
kklingbe 2017-10-02