ocean_ice_config_t Derived Type

type, public :: ocean_ice_config_t

&ocean_ice_nml: sea-ice model master switch + category/layer counts (SIS2 port, PLAN_SEA_ICE.md). PR 0 scaffold — the knobs size the gated ocean_sea_ice_t slot. PR 3c adds the v1 scalar restoring atmospheric-forcing filler (air_temp/restore_lambda/ sw_down) that drives the column live in the driver. Default OFF ⇒ byte-identical.


Inherited by

type~~ocean_ice_config_t~~InheritedByGraph type~ocean_ice_config_t ocean_ice_config_t type~ocean_config_t ocean_config_t type~ocean_config_t->type~ocean_ice_config_t ice 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
logical, public :: a_face_stress = .false.

PR 62: weight the atmospheric stress AND the ice-ocean drag in the EVP momentum balance by the face ice concentration a_u = 0.5*(ci(i-1,j) + ci(i,j)) (same expression/edge convention as ice_ocean_stress_flux_impl’s a_u), giving the textbook m du/dt = grad.sigma + a*(tau_a - tau_w) (Hibler 1979 eq. 1) and an EXACTLY closing ice<->ocean momentum budget at every fractional cover, not just steady free drift. Both terms must be weighted together – weighting the wind alone converts today’s leak (zero at steady free drift) into a permanent one. Default off => byte-identical.

integer, public :: adv_substeps = 1

Advective sub-iterations per transport call (SIS2 NSTEPS_ADV, default 1). dt_adv = dt_therm / adv_substeps.

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

Prescribed slab-atmosphere air temperature (degC) for the v1 restoring atmospheric-forcing filler. SF(T) = restore_lambda*(T - air_temp).

real(kind=wp), public :: c0 = 20.0_wp

SIS2 ICE_STRENGTH_CSTAR — ice-strength exponent constant [nondim].

real(kind=wp), public :: cdw = 3.24e-3_wp

SIS2 ICE_CDRAG_WATER — ice-ocean drag coefficient [nondim].

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

SIS2 CFL_TRUNCATE (SIS2 default 0.5) — transport-CFL ceiling on the FINAL ice velocity the EVP call hands to transport: |u| <= 0.95*cfl_trunc*areaT(donor)/(dt_transport* dy_cu). 0 (Roundabout default, house bit-identity rule) disables the clip entirely => byte-identical. Recommended production value 0.5 (“instability can occur past 0.5”, SIS2).

logical, public :: cfl_trunc_dyn_its = .false.

SIS2 CFL_TRUNC_DYN_ITS (SIS2 default .false., matches). Also clip u_ice/v_ice to the EXACT (no 0.95 back-off, no count) bound at the bottom of every EVP subcycle, not just the final velocity. Requires cfl_trunc > 0.

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

SIS2 ICE_DEL_SH_MIN_SCALE — viscosity-floor scale [nondim].

logical, public :: dynamics = .false.

EVP rheology master switch (rdb_ice_evp%ice_evp_step). Default off => byte-identical (the transport sampler keeps filling u_ice/v_ice from the ocean surface layer).

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

SIS2 ICE_YIELD_ELLIPTICITY — yield-curve axis ratio [nondim]. 0 => cavitating-fluid rheology (str_t/str_s stay exactly 0).

logical, public :: enable = .false.

Master switch. Off (default) ⇒ the sea-ice slot is never initialised, mapped, or stepped ⇒ byte-identical.

integer, public :: evp_sub_steps = 432

SIS2 NSTEPS_DYN — EVP subcycles per slow (outer) step.

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

hardcoded SIS2 default table. -1.0 sentinel (all entries) = unset. Semantics when set: hlim(1..n) where n is the leading non-sentinel run, 2 <= n <= ncat+1, strictly increasing, hlim(1) > 0. Fills h_lim(1..min(ncat+1,n)); the remainder extrapolates by constant width, h_lim(k) = 2*h_lim(k-1) - h_lim(k-2). Unset => the hardcoded SIS2 default table, byte-identical (default-off house rule). See ice_hlim_count/ice_hlim_spec_is_valid.

integer, public :: ncat = 5

Number of ice thickness categories (category 0 = open water; SIS2 default 5).

integer, public :: nk_ice = 2

Vertical ice layers per category (2 = Winton two-layer, v1).

real(kind=wp), public :: p0 = 2.75e4_wp

SIS2 ICE_STRENGTH_PSTAR — ice-strength pressure constant [Pa].

logical, public :: project_ci = .false.

SIS2 PROJECT_ICE_CONCENTRATION (SIS2 default .true.). Project the ice concentration forward along the current divergence each subcycle (ci_proj = ci*exp(-t_cum*sh_dd)) and recompute pres_mice from it, stiffening the rheology under convergence (and weakening it under divergence) within the call. .false. (Roundabout default, house bit-identity rule) holds pres_mice at its pre-loop value for all subcycles => byte-identical.

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

Surface-flux restoring coefficient (W/m^2/K), i.e. dSF/dT of the linearized SEB. 0 (default) => a passive column (dsf_dt=0, sf_0=0): no thermostat, so no restoring drive. A production melt season uses ~20. NOTE: with restore_lambda=0 the seam fields are (0,0,sw_down) => the column feels only shortwave + basal flux.

real(kind=wp), public :: rho_ocean = 1030.0_wp

SIS2 RHO_OCEAN — ice-drag reference density [kg/m^3]. Deliberately independent of the ocean’s rho0 (usually 1035).

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

SIS2 SEA_ICE_ROLL_FACTOR — thin-ice rolling floor in cell_ave_state_to_ice_state. 0 disables rolling.

logical, public :: snow_ice = .false.

Archimedes freeboard snow-ice conversion (SIS2 ice_resize_SIS2 final block; diagnosed as SN2IC). When the snow load submerges the snow-ice interface, convert the submerged snow mass to ice in the top layer. Default OFF => byte-identical.

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

Uniform frozen-precipitation rate onto the ice top (kg/m^2/s) for the v1 restoring atmospheric-forcing filler (PR 26). Spread onto the atm_fprec seam exactly like sw_down -> atm_sw_dn. 0 (default) => byte-identical (has_snowfall=.false., the new kernels never fire).

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

Downwelling shortwave into the ice top (W/m^2) for the v1 filler.

real(kind=wp), public :: tdamp = -0.2_wp

SIS2 ICE_TDAMP_ELASTIC. >0 => seconds; ==0 => max(0.2*dt_slow, 3*dt); <0 => max(-tdamp*dt_slow, 3*dt).

logical, public :: transport = .false.

Enable horizontal category ice/snow transport (rdb_ice_transport%ice_transport_step) — SIS2’s default (velocity, non-merged) ice_cat_transport path. Default OFF ⇒ byte-identical for every existing nml/test (house rule).


Source Code

   type :: ocean_ice_config_t
      !! `&ocean_ice_nml`: sea-ice model master switch + category/layer
      !! counts (SIS2 port, `PLAN_SEA_ICE.md`).  PR 0 scaffold — the knobs
      !! size the gated `ocean_sea_ice_t` slot.  PR 3c adds the v1 scalar
      !! restoring atmospheric-forcing filler (`air_temp`/`restore_lambda`/
      !! `sw_down`) that drives the column live in the driver.  Default OFF
      !! ⇒ byte-identical.
      logical :: enable = .false.
         !! Master switch.  Off (default) ⇒ the sea-ice slot is never
         !! initialised, mapped, or stepped ⇒ byte-identical.
      integer :: ncat = 5
         !! Number of ice thickness categories (category 0 = open water;
         !! SIS2 default 5).
      real(wp) :: hlim(MAX_ICE_HLIM_VALS) = -1.0_wp
         !! PR-58: ITD category lower thickness edges (m), overriding the
         !! hardcoded SIS2 default table. `-1.0` sentinel (all entries) =
         !! unset.  Semantics when set: `hlim(1..n)` where `n` is the
         !! leading non-sentinel run, `2 <= n <= ncat+1`, strictly
         !! increasing, `hlim(1) > 0`.  Fills `h_lim(1..min(ncat+1,n))`;
         !! the remainder extrapolates by constant width,
         !! `h_lim(k) = 2*h_lim(k-1) - h_lim(k-2)`.  Unset => the
         !! hardcoded SIS2 default table, byte-identical (default-off
         !! house rule).  See `ice_hlim_count`/`ice_hlim_spec_is_valid`.
      integer :: nk_ice = 2
         !! Vertical ice layers per category (2 = Winton two-layer, v1).
      real(wp) :: air_temp = 0.0_wp
         !! Prescribed slab-atmosphere air temperature (degC) for the v1
         !! restoring atmospheric-forcing filler. `SF(T) = restore_lambda*(T - air_temp)`.
      real(wp) :: restore_lambda = 0.0_wp
         !! Surface-flux restoring coefficient (W/m^2/K), i.e. dSF/dT of the
         !! linearized SEB. 0 (default) => a passive column (dsf_dt=0, sf_0=0):
         !! no thermostat, so no restoring drive. A production melt season uses
         !! ~20. NOTE: with restore_lambda=0 the seam fields are (0,0,sw_down)
         !! => the column feels only shortwave + basal flux.
      real(wp) :: sw_down = 0.0_wp
         !! Downwelling shortwave into the ice top (W/m^2) for the v1 filler.
      real(wp) :: snowfall = 0.0_wp
         !! Uniform frozen-precipitation rate onto the ice top (kg/m^2/s)
         !! for the v1 restoring atmospheric-forcing filler (PR 26). Spread
         !! onto the `atm_fprec` seam exactly like `sw_down` -> `atm_sw_dn`.
         !! 0 (default) => byte-identical (`has_snowfall=.false.`, the new
         !! kernels never fire).

      ! ---- PR-27: snow-ice flooding ----
      logical :: snow_ice = .false.
         !! Archimedes freeboard snow-ice conversion (SIS2
         !! `ice_resize_SIS2` final block; diagnosed as SN2IC). When the
         !! snow load submerges the snow-ice interface, convert the
         !! submerged snow mass to ice in the top layer. Default OFF =>
         !! byte-identical.

      ! ---- PR 4b: category ice transport + compress_ice ----
      logical :: transport = .false.
         !! Enable horizontal category ice/snow transport
         !! (`rdb_ice_transport%ice_transport_step`) — SIS2's default
         !! (velocity, non-merged) `ice_cat_transport` path. Default OFF ⇒
         !! byte-identical for every existing nml/test (house rule).
      integer :: adv_substeps = 1
         !! Advective sub-iterations per transport call (SIS2 `NSTEPS_ADV`,
         !! default 1). `dt_adv = dt_therm / adv_substeps`.
      real(wp) :: roll_factor = 1.0_wp
         !! SIS2 `SEA_ICE_ROLL_FACTOR` — thin-ice rolling floor in
         !! `cell_ave_state_to_ice_state`. 0 disables rolling.

      ! ---- PR 5: C-grid EVP ice dynamics ----
      logical :: dynamics = .false.
         !! EVP rheology master switch (`rdb_ice_evp%ice_evp_step`).
         !! Default off => byte-identical (the transport sampler keeps
         !! filling `u_ice`/`v_ice` from the ocean surface layer).
      logical :: a_face_stress = .false.
         !! PR 62: weight the atmospheric stress AND the ice-ocean drag in
         !! the EVP momentum balance by the face ice concentration
         !! `a_u = 0.5*(ci(i-1,j) + ci(i,j))` (same expression/edge
         !! convention as `ice_ocean_stress_flux_impl`'s `a_u`), giving the
         !! textbook `m du/dt = grad.sigma + a*(tau_a - tau_w)` (Hibler 1979
         !! eq. 1) and an EXACTLY closing ice<->ocean momentum budget at
         !! every fractional cover, not just steady free drift. Both terms
         !! must be weighted together -- weighting the wind alone converts
         !! today's leak (zero at steady free drift) into a permanent one.
         !! Default off => byte-identical.
      real(wp) :: p0 = 2.75e4_wp
         !! SIS2 `ICE_STRENGTH_PSTAR` — ice-strength pressure constant [Pa].
      real(wp) :: c0 = 20.0_wp
         !! SIS2 `ICE_STRENGTH_CSTAR` — ice-strength exponent constant [nondim].
      real(wp) :: ec = 2.0_wp
         !! SIS2 `ICE_YIELD_ELLIPTICITY` — yield-curve axis ratio [nondim].
         !! 0 => cavitating-fluid rheology (str_t/str_s stay exactly 0).
      real(wp) :: cdw = 3.24e-3_wp
         !! SIS2 `ICE_CDRAG_WATER` — ice-ocean drag coefficient [nondim].
      real(wp) :: rho_ocean = 1030.0_wp
         !! SIS2 `RHO_OCEAN` — ice-drag reference density [kg/m^3].
         !! Deliberately independent of the ocean's `rho0` (usually 1035).
      integer :: evp_sub_steps = 432
         !! SIS2 `NSTEPS_DYN` — EVP subcycles per slow (outer) step.
      real(wp) :: del_sh_min_scale = 2.0_wp
         !! SIS2 `ICE_DEL_SH_MIN_SCALE` — viscosity-floor scale [nondim].
      real(wp) :: tdamp = -0.2_wp
         !! SIS2 `ICE_TDAMP_ELASTIC`. `>0` => seconds; `==0` =>
         !! `max(0.2*dt_slow, 3*dt)`; `<0` => `max(-tdamp*dt_slow, 3*dt)`.

      ! ---- PR 36: EVP velocity CFL truncation + PROJECT_ICE_CONCENTRATION ----
      real(wp) :: cfl_trunc = 0.0_wp
         !! SIS2 `CFL_TRUNCATE` (SIS2 default **0.5**) — transport-CFL
         !! ceiling on the FINAL ice velocity the EVP call hands to
         !! transport: `|u| <= 0.95*cfl_trunc*areaT(donor)/(dt_transport*
         !! dy_cu)`. `0` (Roundabout default, house bit-identity rule) disables
         !! the clip entirely => byte-identical. Recommended production
         !! value 0.5 ("instability can occur past 0.5", SIS2).
      logical :: cfl_trunc_dyn_its = .false.
         !! SIS2 `CFL_TRUNC_DYN_ITS` (SIS2 default `.false.`, matches).
         !! Also clip `u_ice`/`v_ice` to the EXACT (no 0.95 back-off, no
         !! count) bound at the bottom of every EVP subcycle, not just the
         !! final velocity. Requires `cfl_trunc > 0`.
      logical :: project_ci = .false.
         !! SIS2 `PROJECT_ICE_CONCENTRATION` (SIS2 default **`.true.`**).
         !! Project the ice concentration forward along the current
         !! divergence each subcycle (`ci_proj = ci*exp(-t_cum*sh_dd)`) and
         !! recompute `pres_mice` from it, stiffening the rheology under
         !! convergence (and weakening it under divergence) within the
         !! call. `.false.` (Roundabout default, house bit-identity rule) holds
         !! `pres_mice` at its pre-loop value for all subcycles => byte-identical.
   end type ocean_ice_config_t