Module ocean_lapgen_friction_mod
OVERVIEW
This module computes the thickness weighted time tendency for
horizontal velocity arising from horizontal Laplacian friction.
This module computes the thickness weighted time tendency for
horizontal velocity arising from horizontal Laplacian friction.
The viscosity used to determine the strength of the tendency
can be a general function of space and time as specified by
the Smagorinsky approach as well as a grid-scale dependent
background viscosity. The form of the friction operator
can be isotropic or anisotropic in the horizontal plane.
OTHER MODULES USED
constants_mod
diag_manager_mod
fms_mod
mpp_domains_mod
mpp_mod
ocean_domains_mod
ocean_obc_mod
ocean_operators_mod
ocean_parameters_mod
ocean_types_mod
ocean_util_mod
ocean_workspace_mod
PUBLIC INTERFACE
PUBLIC ROUTINES
-
ocean_lapgen_friction_init
-
DESCRIPTION
-
Initialize the horizontal Laplacian friction module by
registering fields for diagnostic output and performing some
numerical checks to see that viscosity is set appropriately.
-
lapgen_friction
-
DESCRIPTION
-
This routine computes thickness weighted and density weighted
time tendency for horizontal velocity arising from horizontal
Laplacian friction.
The algorithm is derived from a functional approach that ensures
kinetic energy is consistenty dissipated for all flow configurations.
The triad do-loops are expanded in order to enhance the
ability of cache-based machines to keep most of the variables
on-cache.
Fundamental to the scheme are the rates of horizontal deformation
horizontal tension = DT = (dy)(u/dy)_x - (dx)(v/dx)_y
horizontal strain = DS = (dx)(u/dx)_y + (dy)(v/dy)_x
Units of the tension and strain are sec^-1.
Four tensions and four strains are computed for each velocity point,
corresponding to the four triads surrounding the point.
The following notation is used to distinguish the triads:
(0,1)=northwest triad (1,1)=northeast triad,
(0,0)=southwest triad, (1,0)=southeast triad
A triad contributes when at least one of its velocities is
not a land point. In order to obtain the correct tension
and strain next to boundaries, tension and strain should not be
masked with umask.
-
BDX_EU_smag
-
DESCRIPTION
-
Compute backwards derivative in X of a quantity defined on the east
face of a U-cell. Slightly modified version of BDX_EU used in
ocean_operators.F90. If input is a(i,j) then output is defined
at (i-1/2,j).
BDX_EU_smag(a) has dimensions of a*m^-3
-
INPUT
-
| a |
field defined on the east face of a U-cell
[real, dimension(isd:ied,jsd:jed)] |
-
BDY_NU_smag
-
DESCRIPTION
-
Compute backwards derivative in Y of a quantity defined on the north
face of a U-cell. Slightly modified version of BDY_EU used in
ocean_operators.F90. If input is a(i,j) then output is defined
at (i,j-1/2)
BDY_NU_smag(a) has dimensions of a*m^-3
-
INPUT
-
| a |
field defined on the north face of a U-cell
[real, dimension(isd:ied,jsd:jed)] |
-
anisotropic_ncar
-
DESCRIPTION
-
Spatially-varying anisotropic viscosity initialization
This routine defines NCOM-like spatial distributions of
viscosity coefficients F_PARA and F_PERP.
Uses NCAR CCSM2.0 algorithm with cm^2/sec --> m^2/sec.
written by: Stephen Yeager 3/2000
modified by: Gokhan Danabasoglu (08/2001)
port to mom4: Stephen.Griffies (9/2002)
update to mom4p1 based on new tunes from NCAR
Stephen.Griffies (7/2007)
"A_viscosity" = F_PARA = Along = viscosity parallel to flow
= max{0.5*visc_vel_scale(z)*A*max[dx,dy],vconst_6}
where
A = 0.425 * cos(pi*y*radian/30) + 0.575 for |y*radian| < 30
A = 0.15 otherwise
Here, A provides a horizontal variation for visc_vel_scale.
"B_viscosity" = F_PERP = Across = viscosity perpendicular to flow = max( bu, bv)
and
F_PARA = min(F_PARA, AMAX_CFL),
F_PERP = min(F_PERP, AMAX_CFL),
F_PARA = max(F_PARA, F_PERP)
are enforced
In the above equations,
bu = vconst_1 * ( 1 + vconst_2 * ( 1 + cos( 2*y + pi ) ) )
bv = vconst_3 * beta_f * dx^3 * exp( - (vconst_4 * distance)^2 )
with
beta_f (x,y) = 2 * omega_earth* cos(ULAT(i,j)) / radius
distance (x,y,z) = actual distance to "vconst_5" points
west of the nearest western boundary
dx (x,y) = DXU(i,j)
dy (x,y) = DYU(i,j)
visc_vel_scale (z) = vconst_7 * exp(-zt(k)/visc_vel_scale_length)
visc_vel_scale_length = e-folding scale ( default = 1500.0e2 cm)
y (x,y) = ULAT(i,j), latitude of "u/v" grid pts in radians
In MOM, ULAT(radians) = xu*pi/180 with xu(i,j) the longitude of U grid points in degrees
"vconst_#" are input parameters defined in namelist ocean_lapgen_friction_general_nml.
"vconst_1", "vconst_6", and "vconst_4" have dimensions of cm^2/s,
cm^2/s, and 1/cm, respectively. "vconst_5" is an INTEGER.
NOTE: The nearest western boundary computations are done along the
model i-grid lines. Therefore, viscosity based on these are
only approximate in the high Northern Hemisphere when using
generalized coordinates with coordinate pole(s) shifted onto land.
-
lapgen_viscosity_check
-
DESCRIPTION
-
Subroutine to perform linear stability check for the Laplacian
operator given a value for the horizontal biharmonic viscosity.
-
lapgen_reynolds_check
-
DESCRIPTION
-
Subroutine to compute the LLaplacian grid Reynolds number. Large
Reynolds numbers indicate regions where solution may experience
some grid noise due to lack of enough horizontal friction.
-
INPUT
-
| u |
Horizontal velocity field at time tau
[real, dimension(isd:ied,jsd:jed,nk,2)] |
-
compute_neptune_velocity
-
DESCRIPTION
-
Compute Neptune velocity.
Method follows that used in MOM2 and MOM3 as implemented by
Greg Holloway (zounds@ios.bc.ca) and Michael Eby (eby@uvic.ca)
Coded in mom4 by Stephen.Griffies
Neptune is calculated as an equilibrium streamfunction given by
pnep = -f*snep*snep*ht and is applied through friction whereby
the solution is damped towards the equilibrium streamfunction
rather than being damped towards zero kinetic energy.
ht = depth of tracer cells
snep = spnep + (senep-spnep)*(0.5 + 0.5*cos(2.0*latitude))
Neptune length scale snep has a value of senep at the
equator and smoothly changes to spnep at the poles
Reference:
Holloway, G., 1992: Representing topographic stress for large
scale ocean models, J. Phys. Oceanogr., 22, 1033-1046
Eby and Holloway, 1994: Sensitivity of a large scale ocean model
to a parameterization of topographic stress. JPO, vol. 24,
pages 2577-2588
March 2012
Stephen.Griffies
Algorithm updated to Eby and Holloway (1994)
NAMELIST
&ocean_lapgen_friction_nml
-
use_this_module
Must be true to use this module. Default is false.
[logical]
-
debug_this_module
For debugging by printing checksums.
[logical]
-
viscosity_scale_by_rossby
To scale down the laplacian viscosity according to the relative scale of the
horizontal grid and the first baroclinic Rossby radius. This is a useful
scheme for models that resolve the Rossby radius in the lower latitudes, and so
presumably do not wish to have much laplacian friction, whereas the higher latitudes
need more friction. Default viscosity_scale_by_rossby=.false.
[logical]
-
viscosity_scale_by_rossby_power
The power used to determine the viscosity scaling function.
Default viscosity_scale_by_rossby_power=2.0.
[real]
-
divergence_damp
To damp the divergence field.
[logical]
-
divergence_damp_vel_micom
Velocity scale to set the viscosity used with divergence damping.
[real, units: m/s]
-
k_smag_iso
This is the dimensionless Smagorinsky coefficient used to set the scale
of the Smagorinsky isotropic viscosity.
[real, units: dimensionless]
-
k_smag_aniso
This is the dimensionless Smagorinsky coefficient used to set the scale
of the Smagorinsky anisotropic viscosity.
[real, units: dimensionless]
-
viscosity_ncar
Anisotropic background viscosities used by NCAR.
[logical]
-
viscosity_ncar_2000
Anisotropic background viscosities used by NCAR, using the
formulation as of 2000. Default viscosity_ncar_2000=.true.
[logical]
-
viscosity_ncar_2007
Anisotropic background viscosities used by NCAR, using the
formulation as of 2007. Default viscosity_ncar_2007=.false.
[logical]
-
vel_micom_iso
Velocity scale that is used for computing the MICOM isotropic viscosity.
[real, units: m/sec]
-
vel_micom_aniso
Velocity scale that is used for computing the MICOM anisotropic viscosity.
[real, units: m/sec]
-
equatorial_zonal
Orient the anisotropic friction within a latitudinal band according to zonal direction.
[logical]
-
equatorial_zonal_lat
Latitudinal band to use the zonal friction orientation.
[real]
-
ncar_isotropic_off_equator
Polewards of equatorial_zonal_lat, revert NCAR scheme to isotropic
[logical]
-
equatorial_no_smag
Turn smag off within equatorial_zonal_lat region.
[logical]
-
eq_vel_micom_iso
Velocity scale that is used for computing the MICOM isotropic viscosity within
a user specified equatorial band.
[real]
-
eq_vel_micom_aniso
Velocity scale that is used for computing the MICOM anisotropic viscosity within
a user specified equatorial band.
[real]
-
eq_lat_micom
Equatorial latitude band (degrees) within which the MICOM viscosity is set according
to eq_vel_micom_iso and eq_vel_micom_aniso.
[real]
-
restrict_polar_visc
For restricting the background viscosity poleward of a
latitude. This method may be useful for coupling to an ice model
in which case the horizontal viscosity may need to be a bit
smaller to maintain time step constraints. This is because the
effective friction is larger than that just within the ocean.
[logical]
-
restrict_polar_visc_lat
Latitude poleward of which we restrict the viscosity.
[real]
-
restrict_polar_visc_ratio
Ratio of the normal critical value that we limit the
viscosity to be no greater than. If restrict_polar_visc_ratio=1.0
then there is no special limitation of the viscosity beyond that
of the one-dimensional stability constraint.
[real]
-
bottom_5point
To alleviate problems with small partial cells, it is often necessary to reduce the
operator to the traditional 5-point Laplacian at the ocean bottom. This logical
implements this mixing. Default bottom_5point=.false.
[logical]
-
neptune
Set to true for computing friction relative to Neptune barotropic velocity.
Default neptune=.false.
[logical]
-
neptune_length_eq
Length scale used to compute Neptune velocity at equator.
[real, units: m]
-
neptune_length_pole
Length scale used to compute Neptune velocity at pole.
[real, units: m]
-
neptune_depth_min
Minimum depth scale used for computing Neptune velocity.
Default neptune_depth_min=100.0
[real, units: m]
-
neptune_smooth
For doing a horizontal 1-2-1 smoothing on the diagnosed
neptune velocity scale.
Default neptune_smooth=.true.
[logical]
-
neptune_smooth_num
Number of smoothing passes for neptune velocity.
Default neptune_smooth_num=1.
[integer]
-
vconst_1
Background viscosity for NCAR algorithm.
[real, units: cm^2/sec]
-
vconst_2
For NCAR viscosity algorithm.
[real]
-
vconst_3
For NCAR viscosity algorithm.
[real]
-
vconst_4
For NCAR viscosity algorithm.
[real, units: 1/cm]
-
vconst_5
For NCAR viscosity algorithm.
[integer]
-
vconst_6
For NCAR viscosity algorithm.
[real, units: cm^2/sec]
-
vconst_7
For NCAR viscosity algorithm.
[, units: cm/sec]
-
vconst_8
For NCAR viscosity algorithm.
[, units: degrees]
-
visc_vel_scale_length
For NCAR viscosity algorithm: efolding depth for
depth dependent background viscosity.
Default visc_vel_scale_length=1500.e2 cm
[, units: cm]
-
ncar_isotropic_at_depth
Sets the NCAR scheme to be isotropic beneath a chosen depth.
[logical]
-
ncar_isotropic_depth
Sets the NCAR scheme to be isotropic beneath this chosen depth.
[real, units: m]
-
ncar_isotropic_at_depth_visc
Sets the NCAR scheme to be isotropic beneath this chosen depth, with
minimum viscosity set according to this value.
[real, units: m2/sec]
-
debug_ncar_A
Sets f_perp=f_para for debugging purposes with the NCAR scheme.
[logical]
-
debug_ncar_B
Sets f_para=f_perp for debugging purposes with the NCAR scheme.
[logical]
-
use_side_drag_friction
For converting friction at U-cells next to walls into
a drag law, as per Deremble et al. Use cdbot_array
from ocean_core/ocean_bbc.F90 to compute drag force.
Default use_side_drag_friction=.false.
[logical]
-
side_drag_friction_scaling
Dimensionless scaling used for cdbot_array when setting
side drag friction. So the effective side dragy coefficient
is side_drag_friction_scaling*cdbot_array.
Default side_drag_friction_scaling=1.0.
[real]
-
side_drag_friction_uvmag_max
Maximum magnitude of horizontal velocity used to compute the
side drag friction. This parameter can be useful especially
for pressure models where the bottom cells can be quite thin
and subject to sporadic large magnitudes. We do the same thing with
bottom drag calculations.
Default side_drag_friction_uvmag_max=10.0.
[real, units: m/s]
-
side_drag_friction_max
Maximum magnitude of the side drag induced friction.
This parameter can be useful especially for pressure models
where the bottom cells can be quite thin and subject to sporadic
large magnitudes. We do the same thing with bottom drag calculations.
Default side_drag_friction_max=1.0.
[real, units: N/m^2]
REFERENCES
-
S.M. Griffies and R.W. Hallberg, 2000:
Biharmonic friction with a Smagorinsky viscosity for use in large-scale
eddy-permitting ocean models
Monthly Weather Review, vol. 128, pages 2935-2946
-
R. D. Smith and J. C. McWilliams, 2003:
Anisotropic horizontal viscosity for ocean models,
Ocean Modelling, vol. 5, pages 129-156.
-
Maltrud and Holloway, 2008: Implementing biharmonic neptune in a
global eddying ocean model, Ocean Modelling, vol. 21, pages 22-34.
-
Deremble, Hogg, Berloff, and Dewar, 2011:
On the application of no-slip lateral boundary conditions to coarsely
resolved ocean models, Ocean Modelling.
-
Griffies: Elements of MOM (2012)
NOTES
The ocean model can generally run with both Laplacian and biharmonic friction
enabled at the same time. Such has been found useful for some eddying
ocean simulations.