ocean_ic_config_t Derived Type

type, public :: ocean_ic_config_t

Initial-condition overlay + EOS reference state. Drives the analytical configurations (eady-front, geostrophic- adjustment, …) plus the linear-EOS reference values that the rest of the ocean dyn step reads.


Inherited by

type~~ocean_ic_config_t~~InheritedByGraph type~ocean_ic_config_t ocean_ic_config_t type~ocean_config_t ocean_config_t type~ocean_config_t->type~ocean_ic_config_t ic 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
real(kind=wp), public :: S_ref = 35.0_wp

Linear-EOS reference salinity (PSU) — the S at which the haline anomaly term vanishes.

real(kind=wp), public :: T_ref = 10.0_wp

Linear-EOS reference temperature (°C) — the T at which the thermal anomaly term vanishes.

real(kind=wp), public :: alpha_T = 1.7e-4_wp

Linear-EOS thermal-expansion coefficient, DIMENSIONAL (kg/m³ per °C) — see beta_S for the conversion from the fractional 1/°C coefficient most protocols quote.

real(kind=wp), public :: beta_S = 7.6e-4_wp

Linear-EOS haline contraction coefficient, DIMENSIONAL (kg/m³ per PSU).

UNITS TRAP. Roundabout’s linear EOS is written as the DENSITY-ANOMALY form

rho = rho_0 + beta_S·(S − S_ref) − alpha_T·(T − T_ref)

so alpha_T/beta_S carry kg/m³ per unit T/S. Most protocols (ISOMIP+, Asay-Davis et al. 2016 among them) quote the FRACTIONAL coefficients of the equivalent form

rho = rho_0·(1 − alpha·(T − T_ref) + beta·(S − S_ref))

with alpha in 1/°C and beta in 1/PSU. Convert by multiplying through by rho_0:

alpha_T = rho_0 · alpha beta_S = rho_0 · beta

e.g. ISOMIP+ (alpha = 3.733e-5 1/°C, beta = 7.843e-4 1/PSU, rho_0 = 1027.51) becomes alpha_T = 3.8356948e-2, beta_S = 8.0587609e-1. Feeding the fractional numbers straight in under-states the density response ~1000×, which looks like a plausible but far too weakly stratified run.

real(kind=wp), public :: eady_T_ref = 10.0_wp

Reference temperature (°C) for the Eady IC at z=0, y=y_mid.

real(kind=wp), public :: eady_dT_dy = -2.0e-5_wp

Meridional gradient of T (°C/m) for the Eady IC.

real(kind=wp), public :: eady_dT_dz = 0.01_wp

Vertical stratification (°C/m) for the Eady IC.

real(kind=wp), public :: eady_pert_amp = 1.0e-3_wp

Amplitude (°C) of the random temperature perturbation seeded into the Eady IC to break symmetry.

integer, public :: eady_pert_seed = 12345

RNG seed for the Eady IC perturbation.

real(kind=wp), public :: ga_eta_amp = 1.0_wp

Geostrophic-adjustment IC: amplitude (m) of the Gaussian SSH bump.

real(kind=wp), public :: ga_length_scale = 50000.0_wp

Geostrophic-adjustment IC: e-folding scale (m) of the Gaussian SSH bump.

real(kind=wp), public :: ga_x_center = -1.0_wp

x-coordinate (m) of the bump centre. Negative ⇒ auto (basin midpoint).

real(kind=wp), public :: ga_y_center = -1.0_wp

y-coordinate (m) of the bump centre. Negative ⇒ auto (basin midpoint).

character(len=32), public :: ic_config = ""

IC overlay tag. “” (default) keeps the analytical T(z) + zero-velocity IC. “eady” runs the Eady-front overlay; “geostrophic_adjustment” drops a Gaussian SSH bump on an f-plane; “baroclinic_jet” runs the two-layer reduced-gravity baroclinic-instability jet (SIM_DETAILS.md §5).

real(kind=wp), public :: interface_amp = 200.0_wp

Baroclinic-jet IC: interface displacement amplitude Δξ (m). Spec “tuned” default 200 m; faithful uses 100 m.

real(kind=wp), public :: jet_half_width = 40000.0_wp

Baroclinic-jet IC (ic_config="baroclinic_jet"): tanh jet half-width L (m). Spec “tuned” default 40 km; the Julia- faithful case uses 100 km. Read only for the baroclinic-jet IC.

real(kind=wp), public :: layer_rho_init(MAX_OCEAN_LAYER_RHO_INIT) = -1.0_wp

Per-layer initial density (kg/m³), k=1 bed → k=nz surface, mirroring MOM6’s COORD_CONFIG="gprime" IC. Any positive value bypasses the EOS-derived init and writes the user-specified densities straight into ms%rho_layer at the end of ocean_state_seed_from_cfg. Count of non-sentinel (>= 0) entries must equal nz_layers. Default -1.0 sentinel ⇒ existing init path (bit-identical).

real(kind=wp), public :: pert_amp_frac = 0.2_wp

Baroclinic-jet IC: front-localised meander amplitude as a fraction of Δξ (A_pert = pert_amp_frac·Δξ). Spec default 0.2.

integer, public :: pert_nx = 3

Baroclinic-jet IC: zonal perturbation wavenumber (integer number of wavelengths across the periodic domain). Integer so the analytic x-continuation wraps exactly (k_x·L_x = 2π·pert_nx). Spec default 3.

real(kind=wp), public :: rho_0 = 1035.0_wp

Reference density (kg/m³) for the linear EOS and Boussinesq PGF — the density at (T_ref, S_ref).

real(kind=wp), public :: rho_lightest = -1.0_wp

Linear density-range IC — MOM6 COORD_CONFIG="linear" analogue. When >= 0, generates nz_layers linearly-spaced layer densities spanning [rho_lightest, rho_lightest + rho_range] and writes them into ms%rho_layer (bed k=1 heaviest → surface k=nz lightest), reusing the layer_rho_init write path — so the column scales by just bumping nz_layers, no hand-listed densities. Mutually exclusive with layer_rho_init. Default -1.0 sentinel ⇒ off (bit-identical).

real(kind=wp), public :: rho_range = 2.0_wp

Linear density-range IC: total top-to-bottom density contrast (kg/m³), MOM6 DENSITY_RANGE (default 2.0). Read only when rho_lightest >= 0.

real(kind=wp), public :: upper_layer_rest = 500.0_wp

Baroclinic-jet IC: rest thickness of the upper (surface, k=2) layer H₁ (m). The lower (bed, k=1) rest thickness is max_depth − upper_layer_rest. Spec §4 default 500 m (H₂ = 1500 m over the 2000 m column).


Source Code

   type :: ocean_ic_config_t
      !! Initial-condition overlay + EOS reference state.  Drives
      !! the analytical configurations (eady-front, geostrophic-
      !! adjustment, …) plus the linear-EOS reference values that
      !! the rest of the ocean dyn step reads.
      character(len=32) :: ic_config = ""
         !! IC overlay tag.  "" (default) keeps the analytical T(z)
         !! + zero-velocity IC.  "eady" runs the Eady-front overlay;
         !! "geostrophic_adjustment" drops a Gaussian SSH bump on an
         !! f-plane; "baroclinic_jet" runs the two-layer reduced-gravity
         !! baroclinic-instability jet (SIM_DETAILS.md §5).
      real(wp) :: alpha_T = 1.7e-4_wp
         !! Linear-EOS thermal-expansion coefficient, **DIMENSIONAL**
         !! (kg/m³ per °C) — see `beta_S` for the conversion from the
         !! fractional 1/°C coefficient most protocols quote.
      real(wp) :: beta_S = 7.6e-4_wp
         !! Linear-EOS haline contraction coefficient, **DIMENSIONAL**
         !! (kg/m³ per PSU).
         !!
         !! UNITS TRAP.  Roundabout's linear EOS is written as the
         !! DENSITY-ANOMALY form
         !!
         !!   rho = rho_0 + beta_S·(S − S_ref) − alpha_T·(T − T_ref)
         !!
         !! so `alpha_T`/`beta_S` carry kg/m³ per unit T/S.  Most
         !! protocols (ISOMIP+, Asay-Davis et al. 2016 among them) quote
         !! the FRACTIONAL coefficients of the equivalent form
         !!
         !!   rho = rho_0·(1 − alpha·(T − T_ref) + beta·(S − S_ref))
         !!
         !! with alpha in 1/°C and beta in 1/PSU.  Convert by
         !! multiplying through by `rho_0`:
         !!
         !!   alpha_T = rho_0 · alpha      beta_S = rho_0 · beta
         !!
         !! e.g. ISOMIP+ (alpha = 3.733e-5 1/°C, beta = 7.843e-4 1/PSU,
         !! rho_0 = 1027.51) becomes `alpha_T = 3.8356948e-2`,
         !! `beta_S = 8.0587609e-1`.  Feeding the fractional numbers
         !! straight in under-states the density response ~1000×, which
         !! looks like a plausible but far too weakly stratified run.
      real(wp) :: T_ref = 10.0_wp
         !! Linear-EOS reference temperature (°C) — the T at which the
         !! thermal anomaly term vanishes.
      real(wp) :: S_ref = 35.0_wp
         !! Linear-EOS reference salinity (PSU) — the S at which the
         !! haline anomaly term vanishes.
      real(wp) :: rho_0 = 1035.0_wp
         !! Reference density (kg/m³) for the linear EOS and Boussinesq
         !! PGF — the density at `(T_ref, S_ref)`.
      real(wp) :: layer_rho_init(MAX_OCEAN_LAYER_RHO_INIT) = -1.0_wp
         !! Per-layer initial density (kg/m³), `k=1` bed → `k=nz`
         !! surface, mirroring MOM6's `COORD_CONFIG="gprime"` IC.  Any
         !! positive value bypasses the EOS-derived init and writes the
         !! user-specified densities straight into `ms%rho_layer` at the
         !! end of `ocean_state_seed_from_cfg`.  Count of non-sentinel
         !! (>= 0) entries must equal `nz_layers`.  Default `-1.0`
         !! sentinel ⇒ existing init path (bit-identical).
      real(wp) :: rho_lightest = -1.0_wp
         !! Linear density-range IC — MOM6 `COORD_CONFIG="linear"`
         !! analogue.  When `>= 0`, generates `nz_layers` linearly-spaced
         !! layer densities spanning `[rho_lightest, rho_lightest +
         !! rho_range]` and writes them into `ms%rho_layer` (bed `k=1`
         !! heaviest → surface `k=nz` lightest), reusing the
         !! `layer_rho_init` write path — so the column scales by just
         !! bumping `nz_layers`, no hand-listed densities.  Mutually
         !! exclusive with `layer_rho_init`.  Default `-1.0` sentinel ⇒
         !! off (bit-identical).
      real(wp) :: rho_range = 2.0_wp
         !! Linear density-range IC: total top-to-bottom density contrast
         !! (kg/m³), MOM6 `DENSITY_RANGE` (default 2.0).  Read only when
         !! `rho_lightest >= 0`.
      real(wp) :: eady_dT_dy = -2.0e-5_wp
         !! Meridional gradient of T (°C/m) for the Eady IC.
      real(wp) :: eady_dT_dz = 0.01_wp
         !! Vertical stratification (°C/m) for the Eady IC.
      real(wp) :: eady_T_ref = 10.0_wp
         !! Reference temperature (°C) for the Eady IC at z=0, y=y_mid.
      real(wp) :: eady_pert_amp = 1.0e-3_wp
         !! Amplitude (°C) of the random temperature perturbation
         !! seeded into the Eady IC to break symmetry.
      integer :: eady_pert_seed = 12345
         !! RNG seed for the Eady IC perturbation.
      real(wp) :: ga_eta_amp = 1.0_wp
         !! Geostrophic-adjustment IC: amplitude (m) of the Gaussian
         !! SSH bump.
      real(wp) :: ga_length_scale = 50000.0_wp
         !! Geostrophic-adjustment IC: e-folding scale (m) of the
         !! Gaussian SSH bump.
      real(wp) :: ga_x_center = -1.0_wp
         !! x-coordinate (m) of the bump centre.  Negative ⇒ auto
         !! (basin midpoint).
      real(wp) :: ga_y_center = -1.0_wp
         !! y-coordinate (m) of the bump centre.  Negative ⇒ auto
         !! (basin midpoint).
      real(wp) :: jet_half_width = 40000.0_wp
         !! Baroclinic-jet IC (`ic_config="baroclinic_jet"`): tanh jet
         !! half-width L (m).  Spec "tuned" default 40 km; the Julia-
         !! faithful case uses 100 km.  Read only for the baroclinic-jet IC.
      real(wp) :: interface_amp = 200.0_wp
         !! Baroclinic-jet IC: interface displacement amplitude Δξ (m).
         !! Spec "tuned" default 200 m; faithful uses 100 m.
      real(wp) :: pert_amp_frac = 0.2_wp
         !! Baroclinic-jet IC: front-localised meander amplitude as a
         !! fraction of Δξ (`A_pert = pert_amp_frac·Δξ`).  Spec default 0.2.
      integer :: pert_nx = 3
         !! Baroclinic-jet IC: zonal perturbation wavenumber (integer number
         !! of wavelengths across the periodic domain).  Integer so the
         !! analytic x-continuation wraps exactly (`k_x·L_x = 2π·pert_nx`).
         !! Spec default 3.
      real(wp) :: upper_layer_rest = 500.0_wp
         !! Baroclinic-jet IC: rest thickness of the upper (surface, k=2)
         !! layer H₁ (m).  The lower (bed, k=1) rest thickness is
         !! `max_depth − upper_layer_rest`.  Spec §4 default 500 m
         !! (H₂ = 1500 m over the 2000 m column).
   end type ocean_ic_config_t