Module ocean_vert_mix_mod
OVERVIEW
Time tendency from vertical mixing
This module does the following:
--computes the vertical mixing coefficients for tracer and velocity,
--computes thickness weighted and density weighted
time tendency for tracer due to vertical diffusion processes,
--computes the thickness weighted and density weighted
acceleration for velocity due to vertical friction processes.
Account is taken of the differences between Bgrid and Cgrid
implementations of MOM.
OTHER MODULES USED
constants_mod
diag_manager_mod
field_manager_mod
fms_mod
mpp_domains_mod
mpp_mod
ocean_domains_mod
ocean_parameters_mod
ocean_tracer_util_mod
ocean_types_mod
ocean_util_mod
ocean_vert_const_mod
ocean_vert_chen_mod
ocean_vert_gotm_mod
ocean_vert_kpp_test_mod
ocean_vert_kpp_mom4p0_mod
ocean_vert_kpp_mom4p1_mod
ocean_vert_pp_mod
ocean_vert_tidal_mod
ocean_vert_util_mod
ocean_workspace_mod
PUBLIC INTERFACE
PUBLIC ROUTINES
-
ocean_vert_mix_init
-
DESCRIPTION
-
Initialization for the vertical mixing module.
-
diff_cbt_table_init
-
DESCRIPTION
-
Read in static diffusivities that have been entered to the diff_cbt_table.
-
bryan_lewis_init
-
DESCRIPTION
-
Initialize the Bryan-Lewis static background diffusivities.
-
hwf_init
-
DESCRIPTION
-
Initialize the HWF static background diffusivity.
Two forms are available:
1/ Depth dependent form, meant to emulate the Bryan-Lewis approach.
This form is not generally used at GFDL.
2/ Depth independent form motivated by use in the CM2G isopycnal
ocean climate model at GFDL.
-
diff_cbt_tanh_init
-
DESCRIPTION
-
Initialize the tanh background diffusivity.
-
vert_friction_init
-
DESCRIPTION
-
Initialize vertical friction portion of ocean_vert_mix_mod
-
watermass_diag_init
-
DESCRIPTION
-
Initialization of watermass diagnostic output files.
Also determine the logical compute_watermass_diag.
-
vert_mix_coeff
-
DESCRIPTION
-
This subroutine calls the relevant scheme to compute vertical
diffusivity and vertical viscosity. Background values are
also incorporated here.
-
vert_diffuse
-
DESCRIPTION
-
This subroutine computes the thickness weighted and density
weighted time tendency for tracer associated with vertical diffusion
based on explicit time update of the vertical diffusion equation.
MOM only supports aidif==0.0 or aidif==1.0.
MOM does not support cases with 0.0 < aidif < 1.0.
The watermass diagnostics have not been ported to this subroutine
since aidif=0 is rarely used, even in idealized studies.
-
vert_diffuse_implicit
-
DESCRIPTION
-
Contributions to thickness weighted and density weighted time
tendency from time-implicit vertical diffusion.
-
vert_friction_bgrid
-
DESCRIPTION
-
This subroutine computes the thickness weighted and density weighted
acceleration (kg/m^3)*(m^2/s^2) associated with vertical friction.
Assumes here that the horizontal grid is B-grid.
For aidif=1.0, this module does nothing since all vertical friction
is in this case handled implicitly in time, and this is computed
elswewhere.
MOM only supports aidif==0.0 or aidif==1.0.
MOM does not support cases with 0.0 < aidif < 1.0.
Note that smf and bmf have units (kg/m^3)*(m^2/s^2)
So the vertical diffusive fluxes must be in these units
too. For this purpose, we multiply the viscosity by
rho0. This is an approximation consistent with the
Boussinesq approximation. For non-Boussinesq, we
should be using the in situ rho. But to the level of
accuracy that we know the vertical viscosity, and to
the extent that the ocean density is close to rho0,
our use of rho0 for the non-Boussinesq case is of
minor consequence for vertical friction calculation.
Note: the form drag contribution to vertical viscosity
must be handled within aidif=1.0 implicit vertical
mixing. It is ignored in this routine, as its
contribution would generally cause the model to be
unstable.
Note: if try to merge this routine with vert_friction_cgrid
some machines and compilers will change bits by the mere
introduction of extra if-test logic into the calculation.
So we define the separate routines to maintain bit-wise
agreement with older results, with bit-wise agreement a
useful means to check for errors as the model evolves.
-
vert_friction_cgrid
-
DESCRIPTION
-
This subroutine computes the thickness weighted and density weighted
acceleration (kg/m^3)*(m^2/s^2) associated with vertical friction.
Assumes horizontal grid is C-grid.
For aidif=1.0, this module does nothing since all vertical friction
is instead handled implicitly in time, and this is computed in the
velocity module.
MOM only supports aidif==0.0 or aidif==1.0.
MOM does not support cases with 0.0 < aidif < 1.0.
Note that smf and bmf have units (kg/m^3)*(m^2/s^2)
So the vertical diffusive fluxes must be in these units
too. For this purpose, we multiply the viscosity by
rho0. This is an approximation consistent with the
Boussinesq approximation. For non-Boussinesq, we
should be using the in situ rho. But to the level of
accuracy that we know the vertical viscosity, and to
the extent that the ocean density is close to rho0,
our use of rho0 for the non-Boussinesq case is of
minor consequence for vertical friction calculation.
Note: use visc_cbt for both C-grid velocity components,
even though the velocity components sit at different
sides of the tracer cell. This choice is for simplicity.
It also acknowledges that the alternative of introducing
distinct visc_cbt_u and visc_cbt_v would presume knowledge
of subgrid scale features that we really do not have.
So again, visc_cbt is used for both u,v C-grid velocity
components.
Note: the form drag contribution to vertical viscosity
must be handled within aidif=1.0 implicit vertical
mixing. It is ignored in this routine, as its
contribution would generally cause the model to be
unstable.
Note: if try to merge this routine with vert_friction_cgrid
some machines and compilers will change bits by the mere
introduction of extra if-test logic into the calculation.
So we define the separate routines to maintain bit-wise
agreement with older results, with bit-wise agreement a
useful means to check for errors as the model evolves.
-
vert_friction_implicit_bgrid
-
DESCRIPTION
-
Contributions to thickness weighted and density weighted acceleration
from implicit vertical friction.
Assume that the horizontal grid is B-grid.
Note that smf and bmf have units N/m^2. These are the natural units
for surface stress. To include these stresses as boundary terms in the
call to invtri, it is necessary to use vertical viscosities with units
(kg/m^3)*(m2^/s) = N/m^2. This is achieved by multiplying visc_cbu
by rho0 when sent to invtri. For depth-like vertical coordinates, this
is cancelled exactly by the rho0 in rho_dzu. For pressure-like
vertical coordinates, the rho0*visc_cbu introduces a negligible
change in the vertical viscosity that is well within uncertainty
in this coefficient.
Include visc_cbu_form_drag to each of the velocity components
vertical friction.
Note: if try to merge this routine with vert_friction_cgrid
some machines and compilers will change bits by the mere
introduction of extra if-test logic into the calculation.
So we define the separate routines to maintain bit-wise
agreement with older results, with bit-wise agreement a
useful means to check for errors as the model evolves.
-
vert_friction_implicit_cgrid
-
DESCRIPTION
-
Contributions to thickness weighted and density weighted acceleration
from implicit vertical friction.
Assume that the horizontal grid is C-grid.
Note that smf and bmf have units N/m^2. These are the natural units
for surface stress. To include these stresses as boundary terms in the
call to invtri, it is necessary to use vertical viscosities with units
(kg/m^3)*(m2^/s) = N/m^2. This is achieved by multiplying visc_cbu
by rho0 when sent to invtri. For depth-like vertical coordinates, this
is cancelled exactly by the rho0 in rho_dzu. For pressure-like
vertical coordinates, the rho0*visc_cbu introduces a negligible
change in the vertical viscosity that is well within uncertainty
in this coefficient.
Include visc_cbu_form_drag to each of the velocity components
vertical friction.
Note: if try to merge this routine with vert_friction_cgrid
some machines and compilers will change bits by the mere
introduction of extra if-test logic into the calculation.
So we define the separate routines to maintain bit-wise
agreement with older results, with bit-wise agreement a
useful means to check for errors as the model evolves.
Note: use visc_cbt for both C-grid velocity components,
even though the velocity components sit at different
sides of the tracer cell. This choice is for simplicity.
It also acknowledges that the alternative of introducing
distinct visc_cbt_u and visc_cbt_v would presume knowledge
of subgrid scale features that we really do not have.
So again, visc_cbt is used for both u,v C-grid velocity
components.
-
on_comp_domain
-
DESCRIPTION
-
Determine if the point is in comp-domain for the processor.
-
invcosh
-
DESCRIPTION
-
Inverse cosh function. Argument must be >=1.
-
vmix_min_dissipation
-
DESCRIPTION
-
Impose a floor to the dissipation arising from vertical tracer diffusion.
-
watermass_diag
-
DESCRIPTION
-
Diagnose watermass transformation diagnostics for
--sbc
--bbc
--vmix = diff_cbt + K33-implicit neutral diffusion
Estimations of the contributions from diff_cbt alone, and
from K33-implicit alone, are computed in vert_diffuse_watermass_diag.
The diagnostic for vdiffuse computes all processes in one
invtri call, which is actually how the model prognostically
updates tracers from vertical diffusion.
The sum of the sbc + bbc + vmix should equal to the
full vdiffuse diagnostic, so that, for example,
neut_rho_vdiffuse = neut_rho_sbc + neut_rho_bbc + neut_rho_vmix
Additionally, we should have
neut_rho_vmix = neut_rho_diff_cbt + neut_rho_k33
with the terms neut_rho_diff_cbt and neut_rho_k33 computed
in routine vert_diffuse_watermass_diag.
watermass_diag is called prior to implicit update of the tracer
fields, so that the initial taup1 value contains only explicit
in-time tendencies. The incremental tendencies are diagnosed
in this routine by various calls to invtri using same methods
as for the prognostic calculation.
This routine requires the logical compute_watermass_diag=.true.,
which is determined inside watermass_diag_init.
-
vert_diffuse_implicit_diag
-
DESCRIPTION
-
Diagnose contributions from time-implicit vertical diffusion.
We perform the diagnostics using the taup1 value of the tracer
concentration, obtained after performing the invtri step.
The fluxes are diagnosed as if we are performing an explicit-time
update, but using the taup1 values of the tracer concentrations.
This diagnostic suffers from time truncation errors relative to the
prognostic calculation, since the prognostic time update is performed using
an invtri calculation. However, the errors are small. The alternative
method, which is to separate the combined invtri step into individual
physical mixing processes is not an option, since this step is not equivalent
algorithmically to the single invtri mixing step.
It is for this reason that we perform the diagnostic step using this
"explicit flux computed with time-implicit computed concentration" approach.
In contrast to the interior mixing, the boundary fluxes can be diagnostically
split from the invtri step, as these fluxes are determined prior to the
vert_diffuse_implicit routine. Hence, the boundary flux contributions can
be diagnosed either by calling an invtri step passing just the stf and btf
terms, or by using the even simpler methods in this subroutine.
-
vert_diffuse_watermass_diag
-
DESCRIPTION
-
Diagnose contributions from time-implicit vertical diffusion
acting on watermasses from diff_cbt and k33.
We perform the diagnostics using the taup1 value of the tracer
concentration, obtained after performing the invtri step.
The fluxes are diagnosed as if we are performing an explicit-time
update, but using the taup1 values of the tracer concentrations.
This diagnostic suffers from time truncation errors relative to the
prognostic calculation, since the prognostic time update is performed using
an invtri calculation. However, the errors are small. The alternative
method, which is to separate the combined invtri step into individual
physical mixing processes is not an option, since this step is not equivalent
algorithmically to the single invtri mixing step.
It is for this reason that we perform the diagnostic step using this
"explicit flux computed with time-implicit computed concentration" approach.
-
ocean_vert_mix_restart
-
DESCRIPTION
-
Write out restart files registered through register_restart_file
-
ocean_vert_mix_end
-
DESCRIPTION
-
Chen Scheme requires output of Krauss mixed layer for
reproducible results.
GOTM requires fields for advection tendency.
NAMELIST
&ocean_vert_mix_nml
-
debug_this_module
For debugging purposes.
[logical]
-
aidif
aidif=1 for implicit in time solution of the vertical mixing equation.
aidif=0 for explicit in time solution of the vertical mixing equation.
semi-implicit method with 0 < aidif < 1 is not fully supported in MOM.
[real]
-
use_explicit_vert_diffuse
Must be true to use time-explicit vertical tracer diffusion.
[logical]
-
verbose_init
For verbose writes during initialization.
[logical]
-
vert_mix_scheme
To determine the vertical mixing scheme:
"const", "kpp", "kpp_mom4p0","kpp_mom4p1", "chen", "pp", or "gotm".
[character]
-
vert_diff_back_via_max
If .true. then include a static background diffusivity
via the max function, as used in mom4p0d. The alternative
is via simply adding the background to the diffusivity
obtained via other approaches. This option remains for
legacy. Default is vert_diff_back_via_max=.true.
[logical]
-
vert_visc_back
If .true. then include a static depth dependent vertical
viscosity which is used only if running w/ constant
vertical viscosity scheme. Standard application is when
have a model with fine vertical resolution, yet no mixed
layer scheme. Wind stress must be spread deeper than the
top cell, or the model may go unstable, or at the least it
will produce spuriously large vertical shears.
[logical]
-
visc_cbu_back_max
For use in setting background vertical viscosity.
[real, units: m^2/sec]
-
visc_cbu_back_min
For use in setting background vertical viscosity.
[real, units: m^2/sec]
-
visc_cbu_back_zmid
Mid-point of tanh function used to define background vertical viscosity.
[real, units: m]
-
visc_cbu_back_zwid
Width of tanh function used to define background vertical viscosity.
[real, units: m]
-
diff_cbt_tanh
For enabling tanh background vertical diffusivity profile.
Default diff_cbt_tanh=.false.
[logical]
-
diff_cbt_tanh_max
For use in setting background vertical diffusivity.
Default diff_cbt_tanh_max=1e-3.
[real, units: m^2/sec]
-
diff_cbt_tanh_min
For use in setting background vertical diffusivity.
Default diff_cbt_tanh_min=2e-5.
[real, units: m^2/sec]
-
diff_cbt_tanh_zmid
Mid-point of tanh function used to define background vertical diffusivity.
Default diff_cbt_tanh_zmid=150.0.
[real, units: m]
-
diff_cbt_tanh_zwid
Width of tanh function used to define background vertical diffusivity.
Default diff_cbt_tanh_zwid=30.0.
[real, units: m]
-
hwf_diffusivity
3D background diffusivity which gets smaller in equatorial region.
Based on the work of Henyey etal (1986).
This scheme should NOT be used if Bryan-Lewis is used.
Default hwf_diffusivity=.false.
[logical]
-
hwf_diffusivity_3d
3D background diffusivity which gets smaller in equatorial region.
Based on the work of Henyey etal (1986).
This form has not been used much at GFDL, with preference given to
a simpler two-dimensional (depth independent) form assessed with the
default hwf_diffusivity_3d=.false.
[logical]
-
hwf_depth_transition
Depth of transition for hwf scheme. The HWF method actually has
no depth dependence. But we include the atan depth dependency
from Bryan-Lewis, for those cases where we wish to replace
Bryan-Lewis with the HWF scheme. To get the usual Bryan-Lewis
transition, set hwf_depth_transition=2500.0. However, since
we often use hwf in the presence of tide mixing, we do not wish to
have any depth dependence, in which case the default is
hwf_depth_transition=2500.0e4.
[real, units: m]
-
hwf_min_diffusivity
Minimum diffusivity for the HWF scheme.
Default hwf_min_diffusivity=2e-6.
[real, units: m^2/sec]
-
hwf_30_diffusivity
Diffusivity at 30deg latitude for the HWF scheme.
Default hwf_30_diffusivity=2e-5.
[real, units: m^2/sec]
-
hwf_N0_2Omega
Ratio of the typical Buoyancy frequency to
twice the earth's rotation period.
Default hwf_N0_2Omega=20.0.
[real, units: dimensionless]
-
bryan_lewis_diffusivity
If .true. then add a Bryan-Lewis background to the
diffusivity. This background is a time-independent function
of depth. This diffusivity is NOT used when have
use_pp_vert_mix_coeff=.true.
This scheme should NOT be used if HWF is used.
[logical]
-
bryan_lewis_lat_depend
If .true. then allow for Bryan-Lewis background to be different
outside of a tropical band than inside the band.
[logical]
-
bryan_lewis_lat_transition
North/South latitude where transition from Bryan-Lewis values
in the tropic to those in the higher latitudes.
[real]
-
afkph_90, dfkph_90, sfkph_90, zfkph_90
Parameters setting the Bryan-Lewis vertical diffusivity profile.
When use bryan_lewis_lat_depend, these are the values used in the pole.
[real, units: dimensionless]
-
afkph_00, dfkph_00, sfkph_00, zfkph_00
Parameters setting the Bryan-Lewis vertical diffusivity profile in the tropics.
When use bryan_lewis_lat_depend=.true. , these are the values used in the tropics.
When use bryan_lewis_lat_depend=.false., these are the values used globally.
[real, units: dimensionless]
-
use_diff_cbt_table
If .true., then read in a table that specifies (i,j,ktop-->kbottom)
and the diffusivity. This method is useful when aiming to mix vertically
at points where do cross-land insertion or where may wish to enhance
mixing at river mouths.
[logical]
-
linear_taper_diff_cbt_table
If .true., then linear taper the diff_cbt_table value from
so that it gets smaller with depth.
[logical]
-
vmix_rescale_nonbouss
To rescale the vertical mixing coefficients by rho0/rho
in order to bring the effects from vertical diffusion
in a non-Boussinesq model more in line with that from a
Boussinesq model.
Default vmix_rescale_nonbouss=.false.
[logical]
-
vmix_set_min_dissipation
To set a minimum dissipation rate. This scheme will compute the
dissipation from the full diffusivity. If the resulting dissipation
is smaller than a specified dissipation, then the diffusivity will
be locally increased so that the min dissipation is maintained.
Default vmix_set_min_dissipation=.false.
[logical]
-
vmix_min_diss_const
Minimum dissipation rate as a constant.
Default vmix_min_diss_const=1e-7.
[real, units: W/m^3]
-
vmix_min_diss_bvfreq_scale
Scaling use to set the minimum dissipation rate as determined by the
local stratification.
Default vmix_min_diss_bvfreq_scale=6e-4.
[real, units: J/m^3]
-
vmix_min_diss_flux_ri_max
Maximum flux Richardson number for computation of diffusivity from dissipation.
Default vmix_min_diss_flux_ri_max=0.2.
[real, units: dimensionless]
REFERENCES
-
Kirk Bryan and L.J. Lewis
A water mass model of the world ocean
Journal of Geophysical Research (1979) vol 84, pages 2503--2517
-
Elements of MOM (2012)
S.M. Griffies
-
Henyey, F.S., J. Wright, and S.M. Flatte, 1986: Energy and
action flow through the internal wave field: an eikonal approach.
Journal of Geophysical Research, {\bf 91}, Issue C7, 8487--8496.
NOTES
The Bryan-Lewis vertical diffusivity is small in the upper ocean and
increases with depth according to an inverse tangent profile. The default
values are from roughly 0.05e-5 m^2/sec to roughly 1.0e-4 m^2/sec.
Latitudinally dependent Bryan-Lewis values are available.