ocean_eos_config_t Derived Type

type, public :: ocean_eos_config_t


Inherited by

type~~ocean_eos_config_t~~InheritedByGraph type~ocean_eos_config_t ocean_eos_config_t type~ocean_config_t ocean_config_t type~ocean_config_t->type~ocean_eos_config_t eos type~config_t config_t type~config_t->type~ocean_config_t ocean type~ocean_handle_t ocean_handle_t type~ocean_handle_t->type~config_t cfg

Components

Type Visibility Attributes Name Initial
character(len=16), public :: eos = "linear"

Equation-of-state variant: “linear” (default, two-tracer), “wright” (Wright 1997 rational), “roquet_spv” (Roquet et al. 2015 specific-volume polynomial). “roquet_spv” is incompatible with the “fv_wright” PGF (fails loud at configure). “teos10” parses but is refused at configure (not implemented; Roquet SpV IS the 75-term TEOS-10 polynomial fit).

Per-EOS cost. One point evaluation: linear ~5 flops; Wright ~20 flops + 1 division; Roquet ~130 flops, 2 sqrt, 2 divisions (value only — roquet_spv_value; the derivatives cost as much again and are computed only where a consumer uses them). Where it shows (global 1-degree, 5 days, one V100, FV-MOM6 in-situ default): ocean_pgf 1.09 s linear, 1.88 s Wright (analytic), 2.55 s Roquet (factored Boole); time loop 54.3 / 55.1 / 55.8 s. On the CPU (gfortran) the gap is wider: rho_layer is ~7x dearer under Roquet than Wright, and benchmark_ale (Roquet, 8 steps) spends 4.9 s in ocean_pgf (33.1 s with the generic Boole rule, 6.5 s factored but unvectorised).

real(kind=wp), public :: p_ref = 0.0_wp

Reference pressure (Pa, >= 0) at which the model’s POTENTIAL density ms%rho_layer is evaluated. Default 0 (surface density, σ₀) ⇒ bit-identical to every run before this knob existed. Read by the “wright” and “roquet_spv” variants; “linear” has no pressure dependence and ignores it.

HORIZONTALLY UNIFORM BY DESIGN — it is a scalar and must stay one. rho_layer is differenced ALONG a layer (the Montgomery PGF, the FV-lite / FV-MOM6-PCM integrands) and VERTICALLY (the vmix N² builders), so a reference pressure varying with (i,j) would give two columns of identical water at the same depth densities differing by ∂ρ/∂p·Δp — a spurious along-layer gradient and hence a spurious pressure gradient force. A spatially varying surface load goes to the IN-SITU builders via &ocean_psurf_nml in_eos, never here.

What it buys: the thermobaric state at which the effective α/β are evaluated. Near the freezing point at ice-shelf-cavity pressures that matters, so a cavity or abyssal study is better referenced to a representative depth (2.0e7 Pa ≈ 2000 dbar, the usual σ₂ choice) than to the surface.

Distinct from &vcoord_nml rho_ref_pressure, which references the RHO / HYCOM target-density COORDINATE and the density-space diagnostic remap. For a density-coordinate run the two should normally be set to the SAME value so coordinate and dynamics agree on what “density” means; they are kept independent because a diagnostic remap to a different reference is a legitimate request.

character(len=16), public :: tfreeze_set = "seaice"

Named seawater freezing-point (liquidus) coefficient set for eos_freezing_point, which evaluates the linear form

T_f = λ1·S + λ2 + λ3·p

for every EOS variant (MOM6 keeps TFREEZE_FORM = "LINEAR" as its default under any density branch).

  • "seaice" (DEFAULT ⇒ bit-identical) — the SIS2/MOM6 sea-ice liquidus, λ = (−0.054 °C/PSU, 0 °C, −7.53e-8 °C/Pa). T_f(35 PSU, 0 Pa) = −1.89 °C. This is the set the shipped sea-ice column model was ported and tested against.
  • "isomip" — the ISOMIP+ protocol liquidus (Asay-Davis et al. 2016, GMD 9, Table 4 p. 2483; consumed in their eq. (25) p. 2485), λ = (−0.0573 °C/PSU, 0.0832 °C, −7.53e-8 °C/Pa). Required for an ice-shelf-cavity run claiming ISOMIP+ compliance, and the value the ice-shelf literature is unanimous on.

WHY IT MATTERS. At S = 34.5 the two sets differ by ~0.03 °C — a few percent of a typical Antarctic thermal driving, and enough to flip the SIGN of a basal melt rate over a 0.03 °C band of ocean temperature. A mistyped value is therefore a fail-loud validate_config error, never a silent fallback.

NAMED SETS ONLY, on purpose: λ1/λ2/λ3 are a fitted triple and there is no free-form coefficient knob, so a configuration cannot mix λ1 from one source with λ2 from another. A NONLINEAR liquidus (MOM6 MILLERO_78, a TEOS-10 polynomial) is a different functional form and would arrive as its own form selector at the documented seam in eos_freezing_point, not as another member of this list.

SCOPE: this is the OCEAN-side liquidus only — what eos_freezing_point returns, i.e. the sea-surface freezing temperature the frazil, frazil-uptake and basal-flux kernels work against. The SIS2 ice model’s INTERNAL brine-pocket liquidus slope (ICE_DTF_DS, rdb_ice_enthalpy) is baked into its closed-form enthalpy<->temperature map and is NOT switched here; under "isomip" the two therefore disagree by ~0.03 °C. The ISOMIP+ set is for ice-shelf-cavity work, where the sea-ice column model is normally off.


Source Code

   type :: ocean_eos_config_t
      character(len=16) :: eos = "linear"
         !! Equation-of-state variant: "linear" (default, two-tracer),
         !! "wright" (Wright 1997 rational), "roquet_spv" (Roquet et al.
         !! 2015 specific-volume polynomial).  "roquet_spv" is incompatible
         !! with the "fv_wright" PGF (fails loud at configure).  "teos10"
         !! parses but is refused at configure (not implemented; Roquet SpV
         !! IS the 75-term TEOS-10 polynomial fit).
         !!
         !! Per-EOS cost.  One point evaluation: linear ~5 flops; Wright
         !! ~20 flops + 1 division; Roquet ~130 flops, 2 sqrt, 2 divisions
         !! (value only — `roquet_spv_value`; the derivatives cost as much
         !! again and are computed only where a consumer uses them).  Where
         !! it shows (global 1-degree, 5 days, one V100, FV-MOM6 in-situ
         !! default): `ocean_pgf` 1.09 s linear, 1.88 s Wright (analytic),
         !! 2.55 s Roquet (factored Boole); time loop 54.3 / 55.1 / 55.8 s.
         !! On the CPU (gfortran) the gap is wider: `rho_layer` is ~7x
         !! dearer under Roquet than Wright, and `benchmark_ale` (Roquet,
         !! 8 steps) spends 4.9 s in `ocean_pgf` (33.1 s with the generic
         !! Boole rule, 6.5 s factored but unvectorised).
      character(len=16) :: tfreeze_set = "seaice"
         !! Named seawater freezing-point (liquidus) coefficient set for
         !! `eos_freezing_point`, which evaluates the linear form
         !!
         !!   T_f = λ1·S + λ2 + λ3·p
         !!
         !! for every EOS variant (MOM6 keeps `TFREEZE_FORM = "LINEAR"`
         !! as its default under any density branch).
         !!
         !!   * `"seaice"` (DEFAULT ⇒ bit-identical) — the SIS2/MOM6
         !!     sea-ice liquidus, λ = (−0.054 °C/PSU, 0 °C,
         !!     −7.53e-8 °C/Pa).  `T_f(35 PSU, 0 Pa) = −1.89 °C`.  This is
         !!     the set the shipped sea-ice column model was ported and
         !!     tested against.
         !!   * `"isomip"` — the ISOMIP+ protocol liquidus (Asay-Davis et
         !!     al. 2016, GMD 9, Table 4 p. 2483; consumed in their
         !!     eq. (25) p. 2485), λ = (−0.0573 °C/PSU, 0.0832 °C,
         !!     −7.53e-8 °C/Pa).  Required for an ice-shelf-cavity run
         !!     claiming ISOMIP+ compliance, and the value the ice-shelf
         !!     literature is unanimous on.
         !!
         !! WHY IT MATTERS.  At S = 34.5 the two sets differ by ~0.03 °C
         !! — a few percent of a typical Antarctic thermal driving, and
         !! enough to flip the SIGN of a basal melt rate over a 0.03 °C
         !! band of ocean temperature.  A mistyped value is therefore a
         !! fail-loud `validate_config` error, never a silent fallback.
         !!
         !! NAMED SETS ONLY, on purpose: λ1/λ2/λ3 are a fitted triple and
         !! there is no free-form coefficient knob, so a configuration
         !! cannot mix λ1 from one source with λ2 from another.  A
         !! NONLINEAR liquidus (MOM6 `MILLERO_78`, a TEOS-10 polynomial)
         !! is a different functional form and would arrive as its own
         !! `form` selector at the documented seam in
         !! `eos_freezing_point`, not as another member of this list.
         !!
         !! SCOPE: this is the OCEAN-side liquidus only — what
         !! `eos_freezing_point` returns, i.e. the sea-surface freezing
         !! temperature the frazil, frazil-uptake and basal-flux kernels
         !! work against.  The SIS2 ice model's INTERNAL brine-pocket
         !! liquidus slope (`ICE_DTF_DS`, `rdb_ice_enthalpy`) is baked
         !! into its closed-form enthalpy<->temperature map and is NOT
         !! switched here; under `"isomip"` the two therefore disagree by
         !! ~0.03 °C.  The ISOMIP+ set is for ice-shelf-cavity work, where
         !! the sea-ice column model is normally off.
      real(wp) :: p_ref = 0.0_wp
         !! Reference pressure (Pa, `>= 0`) at which the model's POTENTIAL
         !! density `ms%rho_layer` is evaluated.  Default 0 (surface
         !! density, σ₀) ⇒ bit-identical to every run before this knob
         !! existed.  Read by the "wright" and "roquet_spv" variants;
         !! "linear" has no pressure dependence and ignores it.
         !!
         !! HORIZONTALLY UNIFORM BY DESIGN — it is a scalar and must stay
         !! one.  `rho_layer` is differenced ALONG a layer (the Montgomery
         !! PGF, the FV-lite / FV-MOM6-PCM integrands) and VERTICALLY (the
         !! vmix N² builders), so a reference pressure varying with (i,j)
         !! would give two columns of identical water at the same depth
         !! densities differing by `∂ρ/∂p·Δp` — a spurious along-layer
         !! gradient and hence a spurious pressure gradient force.  A
         !! spatially varying surface load goes to the IN-SITU builders via
         !! `&ocean_psurf_nml in_eos`, never here.
         !!
         !! What it buys: the thermobaric state at which the effective
         !! α/β are evaluated.  Near the freezing point at ice-shelf-cavity
         !! pressures that matters, so a cavity or abyssal study is better
         !! referenced to a representative depth (2.0e7 Pa ≈ 2000 dbar, the
         !! usual σ₂ choice) than to the surface.
         !!
         !! Distinct from `&vcoord_nml rho_ref_pressure`, which references
         !! the RHO / HYCOM target-density COORDINATE and the density-space
         !! diagnostic remap.  For a density-coordinate run the two should
         !! normally be set to the SAME value so coordinate and dynamics
         !! agree on what "density" means; they are kept independent
         !! because a diagnostic remap to a different reference is a
         !! legitimate request.
   end type ocean_eos_config_t