MOM6
|
Thickness diffusion (or Gent McWilliams)
Thickness diffusion is implemented via along-layer mass fluxes
\[ h^\dagger \leftarrow h^n - \Delta t \nabla \cdot ( \vec{uh}^* ) \]
where the mass fluxes are cast as the difference in vector streamfunction
\[ \vec{uh}^* = \delta_k \vec{\psi} . \]
The GM implementation of thickness diffusion made the streamfunction proportional to the potential density slope
\[ \vec{\psi} = - \kappa_h \frac{\nabla_z \rho}{\partial_z \rho} = \frac{g\kappa_h}{\rho_o} \frac{\nabla \rho}{N^2} = \kappa_h \frac{M^2}{N^2} \]
but for robustness the scheme is implemented as
\[ \vec{\psi} = \kappa_h \frac{M^2}{\sqrt{N^4 + M^4}} \]
since the quantity \(\frac{M^2}{\sqrt{N^2 + M^2}}\) is bounded between $-1$ and $1$ and does not change sign if \(N^2<0\).
Optionally, the method of Ferrari et al, 2010, can be used to obtain the streamfunction which solves the vertically elliptic equation:
\[ \gamma_F \partial_z c^2 \partial_z \psi - N_*^2 \psi = ( 1 + \gamma_F ) \kappa_h N_*^2 \frac{M^2}{\sqrt{N^4+M^4}} \]
which recovers the previous streamfunction relation in the limit that \( c \rightarrow 0 \). Here, \(c=\max(c_{min},c_g)\) is the maximum of either \(c_{min}\) and either the first baroclinic mode wave-speed or the equivalent barotropic mode wave-speed. \(N_*^2 = \max(N^2,0)\) is a non-negative form of the square of the Brunt-Vaisala frequency. The parameter \(\gamma_F\) is used to reduce the vertical smoothing length scale.
\[ \kappa_h = \left( \kappa_o + \alpha_{s} L_{s}^2 < S N > + \alpha_{M} \kappa_{M} \right) r(\Delta x,L_d) \]
where \( S \) is the isoneutral slope magnitude, \( N \) is the square root of Brunt-Vaisala frequency, \(\kappa_{M}\) is the diffusivity calculated by the MEKE parameterization (mom_meke module) and \( r(\Delta x,L_d) \) is a function of the local resolution (ratio of grid-spacing, \(\Delta x\), to deformation radius, \(L_d\)). The length \(L_s\) is provided by the mom_lateral_mixing_coeffs module (enabled with USE_VARIABLE_MIXING=True
and the term \(<SN>\) is the vertical average slope times the Brunt-Vaisala frequency prescribed by Visbeck et al., 1996.
The result of the above expression is subsequently bounded by minimum and maximum values, including an upper diffusivity consistent with numerical stability ( \( \kappa_{cfl} \) is calculated internally).
\[ \kappa_h \leftarrow \min{\left( \kappa_{max}, \kappa_{cfl}, \max{\left( \kappa_{min}, \kappa_h \right)} \right)} f(c_g,z) \]
where \(f(c_g,z)\) is a vertical structure function. \(f(c_g,z)\) is calculated in module mom_lateral_mixing_coeffs. If KHTH_USE_EBT_STRUCT=True
then \(f(c_g,z)\) is set to look like the equivalent barotropic modal velocity structure. Otherwise \(f(c_g,z)=1\) and the diffusivity is independent of depth.
In order to calculate meaningful slopes in vanished layers, temporary copies of the thermodynamic variables are passed through a vertical smoother, function vert_fill_ts():
\begin{eqnarray*} \left[ 1 + \Delta t \kappa_{smth} \frac{\partial^2}{\partial_z^2} \right] \theta & \leftarrow & \theta \\ \left[ 1 + \Delta t \kappa_{smth} \frac{\partial^2}{\partial_z^2} \right] s & \leftarrow & s \end{eqnarray*}
Symbol | Module parameter |
---|---|
- | THICKNESSDIFFUSE |
\( \kappa_o \) | KHTH |
\( \alpha_{s} \) | KHTH_SLOPE_CFF |
\( \kappa_{min} \) | KHTH_MIN |
\( \kappa_{max} \) | KHTH_MAX |
- | KHTH_MAX_CFL |
\( \kappa_{smth} \) | KD_SMOOTH |
\( \alpha_{M} \) | MEKE_KHTH_FAC (from mom_meke module) |
- | KHTH_USE_EBT_STRUCT (from mom_lateral_mixing_coeffs module) |
- | KHTH_USE_FGNV_STREAMFUNCTION |
\( \gamma_F \) | FGNV_FILTER_SCALE |
\( c_{min} \) | FGNV_C_MIN |
Ferrari, R., S.M. Griffies, A.J.G. Nurser and G.K. Vallis, 2010: A boundary-value problem for the parameterized mesoscale eddy transport. Ocean Modelling, 32, 143-156. http://doi.org/10.1016/j.ocemod.2010.01.004
Viscbeck, M., J.C. Marshall, H. Jones, 1996: On he dynamics of convective "chimneys" in the ocean. J. Phys. Oceangr., 26, 1721-1734. http://dx.doi.org/10.1175/1520-0485(1996)026%3C1721:DOICRI%3E2.0.CO;2
Data Types | |
type | thickness_diffuse_cs |
Control structure for thickness diffusion. More... | |
Functions/Subroutines | |
subroutine, public | thickness_diffuse (h, uhtr, vhtr, tv, dt, G, GV, US, MEKE, VarMix, CDp, CS) |
Calculates thickness diffusion coefficients and applies thickness diffusion to layer thicknesses, h. Diffusivities are limited to ensure stability. Also returns along-layer mass fluxes used in the continuity equation. More... | |
subroutine | thickness_diffuse_full (h, e, Kh_u, Kh_v, tv, uhD, vhD, cg1, dt, G, GV, US, MEKE, CS, int_slope_u, int_slope_v, slope_x, slope_y) |
Calculates parameterized layer transports for use in the continuity equation. Fluxes are limited to give positive definite thicknesses. Called by thickness_diffuse(). More... | |
subroutine | streamfn_solver (nk, c2_h, hN2, sfn) |
Tridiagonal solver for streamfunction at interfaces. More... | |
subroutine | add_detangling_kh (h, e, Kh_u, Kh_v, KH_u_CFL, KH_v_CFL, tv, dt, G, GV, US, CS, int_slope_u, int_slope_v) |
Modifies thickness diffusivities to untangle layer structures. More... | |
subroutine, public | thickness_diffuse_init (Time, G, GV, US, param_file, diag, CDp, CS) |
Initialize the thickness diffusion module/structure. More... | |
subroutine, public | thickness_diffuse_get_kh (CS, KH_u_GME, KH_v_GME, G) |
Copies ubtav and vbtav from private type into arrays. More... | |
subroutine, public | thickness_diffuse_end (CS) |
Deallocate the thickness diffusion control structure. More... | |
|
private |
Modifies thickness diffusivities to untangle layer structures.
[in] | g | Ocean grid structure |
[in] | gv | Vertical grid structure |
[in] | us | A dimensional unit scaling type |
[in] | h | Layer thickness [H ~> m or kg m-2] |
[in] | e | Interface positions [Z ~> m] |
[in,out] | kh_u | Thickness diffusivity on interfaces at u points [L2 T-1 ~> m2 s-1] |
[in,out] | kh_v | Thickness diffusivity on interfaces at v points [L2 T-1 ~> m2 s-1] |
[in] | kh_u_cfl | Maximum stable thickness diffusivity at u points [L2 T-1 ~> m2 s-1] |
[in] | kh_v_cfl | Maximum stable thickness diffusivity at v points [L2 T-1 ~> m2 s-1] |
[in] | tv | Thermodynamics structure |
[in] | dt | Time increment [T ~> s] |
cs | Control structure for thickness diffusion | |
[in,out] | int_slope_u | Ratio that determine how much of the isopycnal slopes are taken directly from the interface slopes without consideration of density gradients. |
[in,out] | int_slope_v | Ratio that determine how much of the isopycnal slopes are taken directly from the interface slopes without consideration of density gradients. |
Definition at line 1353 of file MOM_thickness_diffuse.F90.
Referenced by thickness_diffuse().
|
private |
Tridiagonal solver for streamfunction at interfaces.
[in] | nk | Number of layers |
[in] | c2_h | Wave speed squared over thickness in layers [L2 Z-1 T-2 ~> m s-2] |
[in] | hn2 | Thickness times N2 at interfaces [L2 Z-1 T-2 ~> m s-2] |
[in,out] | sfn | Streamfunction [Z L2 T-1 ~> m3 s-1] or arbitrary units On entry, equals diffusivity times slope. On exit, equals the streamfunction. |
Definition at line 1319 of file MOM_thickness_diffuse.F90.
Referenced by thickness_diffuse_full().
subroutine, public mom_thickness_diffuse::thickness_diffuse | ( | real, dimension( g %isd: g %ied, g %jsd: g %jed, g %ke), intent(inout) | h, |
real, dimension( g %isdb: g %iedb, g %jsd: g %jed, g %ke), intent(inout) | uhtr, | ||
real, dimension( g %isd: g %ied, g %jsdb: g %jedb, g %ke), intent(inout) | vhtr, | ||
type(thermo_var_ptrs), intent(in) | tv, | ||
real, intent(in) | dt, | ||
type(ocean_grid_type), intent(in) | G, | ||
type(verticalgrid_type), intent(in) | GV, | ||
type(unit_scale_type), intent(in) | US, | ||
type(meke_type), pointer | MEKE, | ||
type(varmix_cs), pointer | VarMix, | ||
type(cont_diag_ptrs), intent(inout) | CDp, | ||
type(thickness_diffuse_cs), pointer | CS | ||
) |
Calculates thickness diffusion coefficients and applies thickness diffusion to layer thicknesses, h. Diffusivities are limited to ensure stability. Also returns along-layer mass fluxes used in the continuity equation.
[in] | g | Ocean grid structure |
[in] | gv | Vertical grid structure |
[in] | us | A dimensional unit scaling type |
[in,out] | h | Layer thickness [H ~> m or kg m-2] |
[in,out] | uhtr | Accumulated zonal mass flux [L2 H ~> m3 or kg] |
[in,out] | vhtr | Accumulated meridional mass flux [L2 H ~> m3 or kg] |
[in] | tv | Thermodynamics structure |
[in] | dt | Time increment [T ~> s] |
meke | MEKE control structure | |
varmix | Variable mixing coefficients | |
[in,out] | cdp | Diagnostics for the continuity equation |
cs | Control structure for thickness diffusion |
Definition at line 100 of file MOM_thickness_diffuse.F90.
References add_detangling_kh(), mom_diag_mediator::diag_update_remap_grids(), mom_error_handler::mom_error(), and thickness_diffuse_full().
Referenced by mom::step_mom_dynamics().
subroutine, public mom_thickness_diffuse::thickness_diffuse_end | ( | type(thickness_diffuse_cs), pointer | CS | ) |
Deallocate the thickness diffusion control structure.
cs | Control structure for thickness diffusion |
Definition at line 1982 of file MOM_thickness_diffuse.F90.
|
private |
Calculates parameterized layer transports for use in the continuity equation. Fluxes are limited to give positive definite thicknesses. Called by thickness_diffuse().
[in] | g | Ocean grid structure |
[in] | gv | Vertical grid structure |
[in] | us | A dimensional unit scaling type |
[in] | h | Layer thickness [H ~> m or kg m-2] |
[in] | e | Interface positions [Z ~> m] |
[in] | kh_u | Thickness diffusivity on interfaces at u points [L2 T-1 ~> m2 s-1] |
[in] | kh_v | Thickness diffusivity on interfaces at v points [L2 T-1 ~> m2 s-1] |
[in] | tv | Thermodynamics structure |
[out] | uhd | Zonal mass fluxes [H L2 T-1 ~> m3 s-1 or kg s-1] |
[out] | vhd | Meridional mass fluxes [H L2 T-1 ~> m3 s-1 or kg s-1] |
cg1 | Wave speed [L T-1 ~> m s-1] | |
[in] | dt | Time increment [T ~> s] |
meke | MEKE control structure | |
cs | Control structure for thickness diffusion | |
[in] | int_slope_u | Ratio that determine how much of the isopycnal slopes are taken directly from the interface slopes without consideration of density gradients [nondim]. |
[in] | int_slope_v | Ratio that determine how much of the isopycnal slopes are taken directly from the interface slopes without consideration of density gradients [nondim]. |
[in] | slope_x | Isopycnal slope at u-points |
[in] | slope_y | Isopycnal slope at v-points |
Definition at line 533 of file MOM_thickness_diffuse.F90.
References mom_error_handler::mom_error(), streamfn_solver(), and mom_isopycnal_slopes::vert_fill_ts().
Referenced by thickness_diffuse().
subroutine, public mom_thickness_diffuse::thickness_diffuse_get_kh | ( | type(thickness_diffuse_cs), pointer | CS, |
real, dimension( g %isdb: g %iedb, g %jsd: g %jed, g %ke+1), intent(inout) | KH_u_GME, | ||
real, dimension( g %isd: g %ied, g %jsdb: g %jedb, g %ke+1), intent(inout) | KH_v_GME, | ||
type(ocean_grid_type), intent(in) | G | ||
) |
Copies ubtav and vbtav from private type into arrays.
cs | Control structure for this module | |
[in] | g | Grid structure |
[in,out] | kh_u_gme | interface height diffusivities at u-faces [L2 T-1 ~> m2 s-1] |
[in,out] | kh_v_gme | interface height diffusivities at v-faces [L2 T-1 ~> m2 s-1] |
Definition at line 1960 of file MOM_thickness_diffuse.F90.
subroutine, public mom_thickness_diffuse::thickness_diffuse_init | ( | type(time_type), intent(in) | Time, |
type(ocean_grid_type), intent(in) | G, | ||
type(verticalgrid_type), intent(in) | GV, | ||
type(unit_scale_type), intent(in) | US, | ||
type(param_file_type), intent(in) | param_file, | ||
type(diag_ctrl), intent(inout), target | diag, | ||
type(cont_diag_ptrs), intent(inout) | CDp, | ||
type(thickness_diffuse_cs), pointer | CS | ||
) |
Initialize the thickness diffusion module/structure.
[in] | time | Current model time |
[in] | g | Ocean grid structure |
[in] | gv | Vertical grid structure |
[in] | us | A dimensional unit scaling type |
[in] | param_file | Parameter file handles |
[in,out] | diag | Diagnostics control structure |
[in,out] | cdp | Continuity equation diagnostics |
cs | Control structure for thickness diffusion |
Definition at line 1769 of file MOM_thickness_diffuse.F90.
References mom_error_handler::mom_error().
Referenced by mom::initialize_mom().