Subroutine CORIOL

source: (hydro.coriol.f90) [ c_92_rp1 release ]



This routine computes the tendency to u and v momentum within a grid box by the Coriolis effect and by advection of momentum through the vector invariant form:

{partial v }over{ partial t } = -(f + %zeta) times v - nabla K

where v is the vector velocity, f is the vertical compontent of the Coriolis parameter, %zeta is the vertical component of the vorticity and K = v^2/2

The tendency returned is partial v / partial t .

and is not mass- nor grid area-weighted. The units are [velocity] / sec, where it is expected that the routine is called with velocity in meters/second and mass in dynamic meters.


The input state is assumed fully ghosted. Output tendencies are NOT ghosted. GHOST will only be called internally if there are fewer than 2 shadow (or halo) rows around the computational core.


The C-grid vector invariant form is done as in Arakawa & Hsu (Mon. We. Rev., 1990) as a second-order scheme.

Vorticity is estimated at the north-east corner of the grid box from the four surrounding velocity points. If no-slip conditions are used, then the estimate of vorticity with zero velocities in land is sufficient. If free-slip conditions are used, the vorticity is set to zero if any of the four surrounding mass points are in land.

Use the following trick to load up U and V over the required range of i1-1:i2+2, j1-1:j2+2, regardless of the number of shadows in the input data. Note that if xshadows >= 2 and yshadows >= 2, then no ghosting is needed inside this routine. In general, 1 = i1-xshadows im = i2 + xshadows, 1 = j1-yshadows , and jm = j2+xshadows

In practice, I recommend at least 2 shadows throughout the code, as this is sufficient for nearly all uses.

Make a new mask which indicates where we have mass in the layer.


The vector invariant treatment was originally developed for the C-grid, and is a second-order Arakawa-Hsu style formulation. The B-grid treatment is not common, but was introduced in OPYC by Josef Oberhuber.

The B-grid relative vorticity was originally computed as

overline{ (%zeta / H) } times v H.

With vanishing layers, this seems to have caused trouble. Since u and v are co-located, we can use

overline{ %zeta } times v

This "works" but conservation properties for either scheme are not fully documented.

Kinetic energy is computed at the u points, then averaged to the h points, and differenced as in the pressure.


TYPE (T_POSEIDON_GRID) :: g Poseidon Grid object
INTEGER :: im Dimensions
INTEGER :: jm Dimensions
INTEGER :: km Dimensions
LOGICAL :: noslip If true, use no slip bcs, otherwise use free slip
LOGICAL :: has_external_mode does model have bottom?
REAL :: H(IM,JM,KM) Layer thickness at primary points (m)
REAL :: Hu(IM,JM,KM) Layer thickness at u points (m)
REAL :: Hv(IM,JM,KM) Layer thickness at u points (m)
REAL :: Uin(IM,JM,KM) Zonal velocity (m/s)
REAL :: Vin(IM,JM,KM) Meridional velocity (m/s)
REAL :: dUdt(IM,JM,KM) Velocity tendencies (m/sec^2)
REAL :: dVdt(IM,JM,KM)
REAL :: Ave_du(IM,JM) Vertical average of velocity tendencies (m/sec^2)
REAL :: Ave_dv(IM,JM)
REAL(REALHIGH) :: Mass_fluxes(IM,JM,KM,2) Zonal mass fluxes used in continuity (m^3/s)
REAL :: dtime Time step in seconds (used only to weight diagnostics)
INTEGER :: PV_scheme The scheme to use for PV calculation one of pvsDefault, pvsSadourny, pvsArakawa_Hsu pvsOberhuber (pvsSuarez and pvsMOM are not yet implemented, but planned)==========================================================================> Local Variables

call CORIOL(g,im,jm,km,noslip,has_external_mode,H,Hu,Hv,Uin,Vin,dUdt,dVdt,[Ave_du],&

[Ave_dv], [Mass_fluxes], [diag], [dtime], [PV_Scheme])

INTENT(IN) :: g,im,jm,km,noslip,has_external_mode,H,Hu,Hv,Uin,Vin,Mass_fluxes,dtime,PV_scheme
INTENT(OUT) :: Ave_du,Ave_dv


Subroutines Called:

assert, Ghost, compute_Mass_at_Vorticity, compute_PotentialVorticity, compute_Limits, Arakawa_scheme, Sadourny_scheme, B_grid_scheme
Subroutines Parameters Variables Use

Poseidon Ocean Model (Release: c_92_rp1 )
Documentation automation by Paul Schopf's DocFort Perl scripts.