src.spyice.models.advection_diffusion#
This module implements a 1D implicit finite-difference solver for the advection–diffusion equation:
The model supports both temperature and salinity evolution and includes optional boundary-condition treatments (Stefan, Buffo, Voller).
—
Class: AdvectionDiffusion#
- class AdvectionDiffusion(argument, X, source, X_initial, W, W_initial, thickness_index, w, dt, dz, nz, t_passed, S_IC, Stefan=False, Buffo=False, Voller=False, bc_neumann=None)#
Class representing a 1D advection–diffusion model.
- Parameters:
argument (str) – Either
"temperature"or"salinity".X (ndarray) – Current field values.
source (float) – Source term.
X_initial (ndarray) – Field values from previous timestep.
W (ndarray) – Current liquid fraction.
W_initial (ndarray) – Previous liquid fraction.
thickness_index (int) – Index of ice thickness boundary.
w (ndarray) – Convective brine velocity.
dt (float) – Time step.
dz (float) – Spatial step.
nz (int) – Number of spatial grid cells.
t_passed (float) – Simulation time.
S_IC (float) – Initial salinity condition.
Stefan (bool) – Enable Stefan boundary formulation.
Buffo (bool) – Enable Buffo boundary formulation.
Voller (bool) – Enable Voller enthalpy formulation.
bc_neumann (float) – Optional Neumann boundary gradient.
- Raises:
AssertionError – If invalid argument is provided.
AssertionError – If both Stefan and Buffo are enabled.
—
Methods#
TDMAsolver#
- TDMAsolver(a, b, c, d)#
Solve a tridiagonal system using the Thomas algorithm.
- Parameters:
a (array) – Sub-diagonal.
b (array) – Main diagonal.
c (array) – Super-diagonal.
d (array) – RHS vector.
- Returns:
Solution vector.
Buffosolver#
- Buffosolver(a, b, c, f)#
Modified tridiagonal solver enforcing diagonal dominance.
- Parameters:
a (ndarray) – Lower diagonal.
b (ndarray) – Upper diagonal.
c (ndarray) – Main diagonal.
f (ndarray) – RHS vector.
- Returns:
Solution vector.
- Raises:
AssertionError – If matrix is not diagonally dominant.
set_up_tridiagonal#
- set_up_tridiagonal()#
Construct diagonal vectors for the implicit scheme matrix. Handles separate logic for temperature and salinity, including upwinding and boundary adjustments.
assemble_tridiagonal#
- assemble_tridiagonal()#
Assemble full matrix from diagonal vectors.
- Returns:
Assembled system matrix.
modify_tridiagonal_voller_scheme#
- modify_tridiagonal_voller_scheme()#
Modify diagonal dominance for mushy-layer cells when using the Voller enthalpy scheme.
voller_X_array_set_zero_to_melt#
- voller_X_array_set_zero_to_melt(X, X_boundary)#
Force solution values above melting threshold to boundary value.
set_source_term#
- set_source_term()#
Compute discretized source term depending on field type.
- Returns:
Source contribution.
unknowns_matrix#
- unknowns_matrix(temperature_melt, non_constant_physical_properties=False)#
Solve the implicit linear system for the updated field.
- Parameters:
temperature_melt (float) – Melting temperature.
- Returns:
X_new (ndarray) — Updated solution
X_wind (ndarray) — Wind-corrected solution
A_before_correction (ndarray) — System matrix
factor_1#
- factor_1(argument, a, c, dt, dz, nz)#
Compute diffusion discretization factor.
- Returns:
ndarray for temperature
tuple of ndarrays for salinity (central, plus, minus)
factor_2#
- factor_2(a, b, dt, dz, nz)#
Compute advection discretization factor.
- Returns:
ndarray
factor_3#
- factor_3(a, d, nz)#
Compute phase-coupling factor.
- Returns:
ndarray
—
Numerical Characteristics#
Implicit time discretization
Finite difference spatial scheme
Tridiagonal linear system
Upwind advection (salinity)
Optional enthalpy formulation (Voller)
Stefan and Buffo boundary options
—
Dependencies#
spyice.parameters.user_inputspyice.coefficients.update_coefficientsspyice.rhs.apply_boundary_conditionspyice.rhs.correct_for_brine_movement
—
Notes#
Only one of Stefan or Buffo may be active at a time.
Diagonal dominance is required for the Buffo solver.
Zero-division protection is implemented in factor calculations.