MOM6
|
Provides functions for some diabatic processes such as fraxil, brine rejection, tendency due to surface flux divergence.
This module contains the subroutines that, along with the subroutines that it calls, implements diapycnal mass and momentum fluxes and a bulk mixed layer. The diapycnal diffusion can be used without the bulk mixed layer.
diabatic first determines the (diffusive) diapycnal mass fluxes based on the convergence of the buoyancy fluxes within each layer. The dual-stream entrainment scheme of MacDougall and Dewar (JPO, 1997) is used for combined diapycnal advection and diffusion, calculated implicitly and potentially with the Richardson number dependent mixing, as described by Hallberg (MWR, 2000). Diapycnal advection is fundamentally the residual of diapycnal diffusion, so the fully implicit upwind differencing scheme that is used is entirely appropriate. The downward buoyancy flux in each layer is determined from an implicit calculation based on the previously calculated flux of the layer above and an estimated flux in the layer below. This flux is subject to the following conditions: (1) the flux in the top and bottom layers are set by the boundary conditions, and (2) no layer may be driven below an Angstrom thick- ness. If there is a bulk mixed layer, the buffer layer is treat- ed as a fixed density layer with vanishingly small diffusivity.
diabatic takes 5 arguments: the two velocities (u and v), the thicknesses (h), a structure containing the forcing fields, and the length of time over which to act (dt). The velocities and thickness are taken as inputs and modified within the subroutine. There is no limit on the time step.
Data Types | |
type | diabatic_aux_cs |
Control structure for diabatic_aux. More... | |
integer | id_clock_uv_at_h |
CPU time clock IDs. More... | |
integer | id_clock_frazil |
CPU time clock IDs. More... | |
subroutine, public | make_frazil (h, tv, G, GV, CS, p_surf, halo) |
Frazil formation keeps the temperature above the freezing point. This subroutine warms any water that is colder than the (currently surface) freezing point up to the freezing point and accumulates the required heat (in J m-2) in tvfrazil. More... | |
subroutine, public | differential_diffuse_t_s (h, tv, visc, dt, G, GV) |
This subroutine applies double diffusion to T & S, assuming no diapycal mass fluxes, using a simple triadiagonal solver. More... | |
subroutine, public | adjust_salt (h, tv, G, GV, CS, halo) |
This subroutine keeps salinity from falling below a small but positive threshold. This usually occurs when the ice model attempts to extract more salt then is actually available to it from the ocean. More... | |
subroutine, public | insert_brine (h, tv, G, GV, US, fluxes, nkmb, CS, dt, id_brine_lay) |
Insert salt from brine rejection into the first layer below the mixed layer which both contains mass and in which the change in layer density remains stable after the addition of salt via brine rejection. More... | |
subroutine, public | tridiagts (G, GV, is, ie, js, je, hold, ea, eb, T, S) |
This is a simple tri-diagonal solver for T and S. "Simple" means it only uses arrays hold, ea and eb. More... | |
subroutine, public | find_uv_at_h (u, v, h, u_h, v_h, G, GV, US, ea, eb) |
This subroutine calculates u_h and v_h (velocities at thickness points), optionally using the entrainment amounts passed in as arguments. More... | |
subroutine, public | set_pen_shortwave (optics, fluxes, G, GV, CS, opacity_CSp, tracer_flow_CSp) |
subroutine, public | diagnosemldbydensitydifference (id_MLD, h, tv, densityDiff, G, GV, US, diagPtr, id_N2subML, id_MLDsq, dz_subML) |
Diagnose a mixed layer depth (MLD) determined by a given density difference with the surface. This routine is appropriate in MOM_diabatic_driver due to its position within the time stepping. More... | |
subroutine, public | applyboundaryfluxesinout (CS, G, GV, US, dt, fluxes, optics, nsw, h, tv, aggregate_FW_forcing, evap_CFL_limit, minimum_forcing_depth, cTKE, dSV_dT, dSV_dS, SkinBuoyFlux) |
Update the thickness, temperature, and salinity due to thermodynamic boundary forcing (contained in fluxes type) applied to h, tvT and tvS, and calculate the TKE implications of this heating. More... | |
subroutine, public | diabatic_aux_init (Time, G, GV, US, param_file, diag, CS, useALEalgorithm, use_ePBL) |
This subroutine initializes the parameters and control structure of the diabatic_aux module. More... | |
subroutine, public | diabatic_aux_end (CS) |
This subroutine initializes the control structure and any related memory for the diabatic_aux module. More... | |
subroutine, public mom_diabatic_aux::adjust_salt | ( | real, dimension( g %isd: g %ied, g %jsd: g %jed, g %ke), intent(in) | h, |
type(thermo_var_ptrs), intent(inout) | tv, | ||
type(ocean_grid_type), intent(in) | G, | ||
type(verticalgrid_type), intent(in) | GV, | ||
type(diabatic_aux_cs), intent(in) | CS, | ||
integer, intent(in), optional | halo | ||
) |
This subroutine keeps salinity from falling below a small but positive threshold. This usually occurs when the ice model attempts to extract more salt then is actually available to it from the ocean.
[in] | g | The ocean's grid structure |
[in] | gv | The ocean's vertical grid structure |
[in] | h | Layer thicknesses [H ~> m or kg m-2] |
[in,out] | tv | Structure containing pointers to any available thermodynamic fields. |
[in] | cs | The control structure returned by a previous call to diabatic_aux_init. |
[in] | halo | Halo width over which to work |
Definition at line 326 of file MOM_diabatic_aux.F90.
subroutine, public mom_diabatic_aux::applyboundaryfluxesinout | ( | type(diabatic_aux_cs), pointer | CS, |
type(ocean_grid_type), intent(in) | G, | ||
type(verticalgrid_type), intent(in) | GV, | ||
type(unit_scale_type), intent(in) | US, | ||
real, intent(in) | dt, | ||
type(forcing), intent(inout) | fluxes, | ||
type(optics_type), pointer | optics, | ||
integer, intent(in) | nsw, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(inout) | h, | ||
type(thermo_var_ptrs), intent(inout) | tv, | ||
logical, intent(in) | aggregate_FW_forcing, | ||
real, intent(in) | evap_CFL_limit, | ||
real, intent(in) | minimum_forcing_depth, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(out), optional | cTKE, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(out), optional | dSV_dT, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(out), optional | dSV_dS, | ||
real, dimension(szi_(g),szj_(g)), intent(out), optional | SkinBuoyFlux | ||
) |
Update the thickness, temperature, and salinity due to thermodynamic boundary forcing (contained in fluxes type) applied to h, tvT and tvS, and calculate the TKE implications of this heating.
cs | Control structure for diabatic_aux | |
[in] | g | Grid structure |
[in] | gv | ocean vertical grid structure |
[in] | us | A dimensional unit scaling type |
[in] | dt | Time-step over which forcing is applied [T ~> s] |
[in,out] | fluxes | Surface fluxes container |
optics | Optical properties container | |
[in] | nsw | The number of frequency bands of penetrating shortwave radiation |
[in,out] | h | Layer thickness [H ~> m or kg m-2] |
[in,out] | tv | Structure containing pointers to any available thermodynamic fields. |
[in] | aggregate_fw_forcing | If False, treat in/out fluxes separately. |
[in] | evap_cfl_limit | The largest fraction of a layer that can be evaporated in one time-step [nondim]. |
[in] | minimum_forcing_depth | The smallest depth over which heat and freshwater fluxes is applied [H ~> m or kg m-2]. |
[out] | ctke | Turbulent kinetic energy requirement to mix |
[out] | dsv_dt | Partial derivative of specific volume with |
[out] | dsv_ds | Partial derivative of specific volume with |
[out] | skinbuoyflux | Buoyancy flux at surface [Z2 T-3 ~> m2 s-3]. |
Definition at line 853 of file MOM_diabatic_aux.F90.
References mom_opacity::absorbremainingsw(), mom_eos::calculate_specific_vol_derivs(), mom_forcing_type::extractfluxes1d(), and mom_forcing_type::forcing_singlepointprint().
subroutine, public mom_diabatic_aux::diabatic_aux_end | ( | type(diabatic_aux_cs), pointer | CS | ) |
This subroutine initializes the control structure and any related memory for the diabatic_aux module.
cs | The control structure returned by a previous call to diabatic_aux_init; it is deallocated here. |
Definition at line 1560 of file MOM_diabatic_aux.F90.
subroutine, public mom_diabatic_aux::diabatic_aux_init | ( | type(time_type), intent(in), target | 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(diabatic_aux_cs), pointer | CS, | ||
logical, intent(in) | useALEalgorithm, | ||
logical, intent(in) | use_ePBL | ||
) |
This subroutine initializes the parameters and control structure of the diabatic_aux module.
[in] | time | The current model time. |
[in] | g | The ocean's grid structure |
[in] | gv | The ocean's vertical grid structure |
[in] | us | A dimensional unit scaling type |
[in] | param_file | A structure to parse for run-time parameters |
[in,out] | diag | A structure used to regulate diagnostic output |
cs | A pointer to the control structure for the diabatic_aux module, which is initialized here. | |
[in] | usealealgorithm | If true, use the ALE algorithm rather than layered mode. |
[in] | use_epbl | If true, use the implicit energetics planetary boundary layer scheme to determine the diffusivity in the surface boundary layer. |
Definition at line 1395 of file MOM_diabatic_aux.F90.
References id_clock_frazil, and id_clock_uv_at_h.
subroutine, public mom_diabatic_aux::diagnosemldbydensitydifference | ( | integer, intent(in) | id_MLD, |
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in) | h, | ||
type(thermo_var_ptrs), intent(in) | tv, | ||
real, intent(in) | densityDiff, | ||
type(ocean_grid_type), intent(in) | G, | ||
type(verticalgrid_type), intent(in) | GV, | ||
type(unit_scale_type), intent(in) | US, | ||
type(diag_ctrl), pointer | diagPtr, | ||
integer, intent(in), optional | id_N2subML, | ||
integer, intent(in), optional | id_MLDsq, | ||
real, intent(in), optional | dz_subML | ||
) |
Diagnose a mixed layer depth (MLD) determined by a given density difference with the surface. This routine is appropriate in MOM_diabatic_driver due to its position within the time stepping.
[in] | g | Grid type |
[in] | gv | ocean vertical grid structure |
[in] | us | A dimensional unit scaling type |
[in] | id_mld | Handle (ID) of MLD diagnostic |
[in] | h | Layer thickness [H ~> m or kg m-2] |
[in] | tv | Structure containing pointers to any available thermodynamic fields. |
[in] | densitydiff | Density difference to determine MLD [R ~> kg m-3] |
diagptr | Diagnostics structure | |
[in] | id_n2subml | Optional handle (ID) of subML stratification |
[in] | id_mldsq | Optional handle (ID) of squared MLD |
[in] | dz_subml | The distance over which to calculate N2subML or 50 m if missing [Z ~> m] |
Definition at line 717 of file MOM_diabatic_aux.F90.
subroutine, public mom_diabatic_aux::differential_diffuse_t_s | ( | real, dimension( g %isd: g %ied, g %jsd: g %jed, g %ke), intent(in) | h, |
type(thermo_var_ptrs), intent(inout) | tv, | ||
type(vertvisc_type), intent(in) | visc, | ||
real, intent(in) | dt, | ||
type(ocean_grid_type), intent(in) | G, | ||
type(verticalgrid_type), intent(in) | GV | ||
) |
This subroutine applies double diffusion to T & S, assuming no diapycal mass fluxes, using a simple triadiagonal solver.
[in] | g | The ocean's grid structure |
[in] | gv | The ocean's vertical grid structure |
[in] | h | Layer thicknesses [H ~> m or kg m-2] |
[in,out] | tv | Structure containing pointers to any available thermodynamic fields. |
[in] | visc | Structure containing vertical viscosities, bottom boundary layer properies, and related fields. |
[in] | dt | Time increment [T ~> s]. |
Definition at line 223 of file MOM_diabatic_aux.F90.
subroutine, public mom_diabatic_aux::find_uv_at_h | ( | real, dimension(szib_(g),szj_(g),szk_(g)), intent(in) | u, |
real, dimension(szi_(g),szjb_(g),szk_(g)), intent(in) | v, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in) | h, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(out) | u_h, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(out) | v_h, | ||
type(ocean_grid_type), intent(in) | G, | ||
type(verticalgrid_type), intent(in) | GV, | ||
type(unit_scale_type), intent(in) | US, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in), optional | ea, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in), optional | eb | ||
) |
This subroutine calculates u_h and v_h (velocities at thickness points), optionally using the entrainment amounts passed in as arguments.
[in] | g | The ocean's grid structure |
[in] | gv | The ocean's vertical grid structure |
[in] | us | A dimensional unit scaling type |
[in] | u | The zonal velocity [L T-1 ~> m s-1] |
[in] | v | The meridional velocity [L T-1 ~> m s-1] |
[in] | h | Layer thicknesses [H ~> m or kg m-2] |
[out] | u_h | Zonal velocity interpolated to h points [L T-1 ~> m s-1]. |
[out] | v_h | Meridional velocity interpolated to h points [L T-1 ~> m s-1]. |
[in] | ea | The amount of fluid entrained from the layer |
[in] | eb | The amount of fluid entrained from the layer |
Definition at line 557 of file MOM_diabatic_aux.F90.
References id_clock_uv_at_h.
subroutine, public mom_diabatic_aux::insert_brine | ( | real, dimension(szi_(g),szj_(g),szk_(g)), intent(in) | h, |
type(thermo_var_ptrs), intent(inout) | tv, | ||
type(ocean_grid_type), intent(in) | G, | ||
type(verticalgrid_type), intent(in) | GV, | ||
type(unit_scale_type), intent(in) | US, | ||
type(forcing), intent(in) | fluxes, | ||
integer, intent(in) | nkmb, | ||
type(diabatic_aux_cs), intent(in) | CS, | ||
real, intent(in) | dt, | ||
integer, intent(in) | id_brine_lay | ||
) |
Insert salt from brine rejection into the first layer below the mixed layer which both contains mass and in which the change in layer density remains stable after the addition of salt via brine rejection.
[in] | g | The ocean's grid structure |
[in] | gv | The ocean's vertical grid structure |
[in] | h | Layer thicknesses [H ~> m or kg m-2] |
[in,out] | tv | Structure containing pointers to any available thermodynamic fields |
[in] | us | A dimensional unit scaling type |
[in] | fluxes | A structure of thermodynamic surface fluxes |
[in] | nkmb | The number of layers in the mixed and buffer layers |
[in] | cs | The control structure returned by a previous call to diabatic_aux_init |
[in] | dt | The thermodynamic time step [T ~> s]. |
[in] | id_brine_lay | The handle for a diagnostic of which layer receivees the brine. |
Definition at line 386 of file MOM_diabatic_aux.F90.
subroutine, public mom_diabatic_aux::make_frazil | ( | real, dimension(szi_(g),szj_(g),szk_(g)), intent(in) | h, |
type(thermo_var_ptrs), intent(inout) | tv, | ||
type(ocean_grid_type), intent(in) | G, | ||
type(verticalgrid_type), intent(in) | GV, | ||
type(diabatic_aux_cs), intent(in) | CS, | ||
real, dimension(szi_(g),szj_(g)), intent(in), optional | p_surf, | ||
integer, intent(in), optional | halo | ||
) |
Frazil formation keeps the temperature above the freezing point. This subroutine warms any water that is colder than the (currently surface) freezing point up to the freezing point and accumulates the required heat (in J m-2) in tvfrazil.
[in] | g | The ocean's grid structure |
[in] | gv | The ocean's vertical grid structure |
[in] | h | Layer thicknesses [H ~> m or kg m-2] |
[in,out] | tv | Structure containing pointers to any available thermodynamic fields. |
[in] | cs | The control structure returned by a previous call to diabatic_aux_init. |
[in] | p_surf | The pressure at the ocean surface [Pa]. |
[in] | halo | Halo width over which to calculate frazil |
Definition at line 103 of file MOM_diabatic_aux.F90.
References id_clock_frazil.
subroutine, public mom_diabatic_aux::set_pen_shortwave | ( | type(optics_type), pointer | optics, |
type(forcing), intent(inout) | fluxes, | ||
type(ocean_grid_type), intent(in) | G, | ||
type(verticalgrid_type), intent(in) | GV, | ||
type(diabatic_aux_cs), pointer | CS, | ||
type(opacity_cs), pointer | opacity_CSp, | ||
type(tracer_flow_control_cs), pointer | tracer_flow_CSp | ||
) |
optics | An optics structure that has will contain information about shortwave fluxes and absorption. | |
[in,out] | fluxes | points to forcing fields unused fields have NULL ptrs |
[in] | g | The ocean's grid structure. |
[in] | gv | The ocean's vertical grid structure. |
cs | Control structure for diabatic_aux | |
opacity_csp | The control structure for the opacity module. | |
tracer_flow_csp | A pointer to the control structure of the tracer modules. |
Definition at line 657 of file MOM_diabatic_aux.F90.
References mom_tracer_flow_control::get_chl_from_model().
Referenced by mom_diabatic_driver::diabatic_ale(), mom_diabatic_driver::diabatic_ale_legacy(), and mom_diabatic_driver::layered_diabatic().
subroutine, public mom_diabatic_aux::tridiagts | ( | type(ocean_grid_type), intent(in) | G, |
type(verticalgrid_type), intent(in) | GV, | ||
integer, intent(in) | is, | ||
integer, intent(in) | ie, | ||
integer, intent(in) | js, | ||
integer, intent(in) | je, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in) | hold, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in) | ea, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(in) | eb, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(inout) | T, | ||
real, dimension(szi_(g),szj_(g),szk_(g)), intent(inout) | S | ||
) |
This is a simple tri-diagonal solver for T and S. "Simple" means it only uses arrays hold, ea and eb.
[in] | g | The ocean's grid structure |
[in] | gv | The ocean's vertical grid structure |
[in] | is | The start i-index to work on. |
[in] | ie | The end i-index to work on. |
[in] | js | The start j-index to work on. |
[in] | je | The end j-index to work on. |
[in] | hold | The layer thicknesses before entrainment, [H ~> m or kg m-2]. |
[in] | ea | The amount of fluid entrained from the layer above within this time step [H ~> m or kg m-2]. |
[in] | eb | The amount of fluid entrained from the layer below within this time step [H ~> m or kg m-2]. |
[in,out] | t | Layer potential temperatures [degC]. |
[in,out] | s | Layer salinities [ppt]. |
Definition at line 508 of file MOM_diabatic_aux.F90.
|
private |
CPU time clock IDs.
Definition at line 93 of file MOM_diabatic_aux.F90.
Referenced by diabatic_aux_init(), and make_frazil().
integer mom_diabatic_aux::id_clock_uv_at_h |
CPU time clock IDs.
Definition at line 93 of file MOM_diabatic_aux.F90.
Referenced by diabatic_aux_init(), and find_uv_at_h().