Source code for src.spyice.statevariables

import numpy as np

from spyice.update_physical_values import calculate_melting_temperature_from_salinity

# Function to set state variables
[docs] def set_statevariables( temperature_calculated, salinity_calculated, liquid_fraction_calculated ): """Set the state variables for temperature, salinity, and liquid fraction. Args: temperature_calculated (float): The calculated temperature. salinity_calculated (float): The calculated salinity. liquid_fraction_calculated (float): The calculated liquid fraction. Returns: tuple: A tuple containing the following state variables: - temperature_initial (float): The initial temperature. - temperature_previous (float): The previous temperature. - salinity_initial (float): The initial salinity. - salinity_previous (float): The previous salinity. - phi_initial (float): The initial liquid fraction. - phi_prev (float): The previous liquid fraction. """ temperature_previous, temperature_initial = ( temperature_calculated, temperature_calculated, ) # Set previous T as current T for initialization, # Store initial T for later use salinity_previous, salinity_initial = ( salinity_calculated, salinity_calculated, ) # Set previous S as current S for initialization, # Store initial S for later use phi_prev, phi_initial = ( liquid_fraction_calculated, liquid_fraction_calculated, ) # Set previous phi as current phi for initialization, # Store initial phi for later use return ( temperature_initial, temperature_previous, salinity_initial, salinity_previous, phi_initial, phi_prev, )
# Function to overwrite state variables
[docs] def overwrite_statevariables( temperature_calculated, salinity_calculated, brine_velocity_calculated, nutrient_calculated, liquid_fraction_calculated, x_wind_temperature, x_wind_salinity, temperature_melt=None, t_k_lhs_A_matrix=None, temp_factor3=None, ): """Overwrites the state variables with the calculated values. Args: temperature_calculated (float): The calculated temperature. salinity_calculated (float): The calculated salinity. liquid_fraction_calculated (float): The calculated liquid fraction. Returns: tuple: A tuple containing the following state variables: - temperature_new (float): The current temperature for iteration. - salinity_new (float): The current salinity for iteration. - liquid_fraction_new (float): The current liquid fraction for iteration. """ temperature_new = ( temperature_calculated # Set current T as previous T for next iteration ) salinity_new = salinity_calculated # Set current S as previous S for next iteration liquid_fraction_new = ( liquid_fraction_calculated # Set current phi as previous phi for next iteration ) nutrient_cn_new = nutrient_calculated if temperature_melt is None: temperature_melt = calculate_melting_temperature_from_salinity(salinity_new) # Store the calculated T_melt for later use else: temperature_melt = temperature_melt if t_k_lhs_A_matrix is not None: t_k_lhs_A_matrix = t_k_lhs_A_matrix temp_factor3 = temp_factor3 else: t_k_lhs_A_matrix = np.zeros([101, 101], dtype=np.float64) temp_factor3 = np.ones(len(temperature_new)) return ( temperature_new, salinity_new, brine_velocity_calculated, nutrient_cn_new, liquid_fraction_new, temperature_melt, t_k_lhs_A_matrix, temp_factor3, x_wind_temperature, x_wind_salinity, )
# Function to compute errors for convergence
[docs] def compute_error_for_convergence( temperature_calculated, temperature_previous, salinity_calculated, salinity_previous, liquid_fraction_calculated, liquid_fraction_previous, voller=False, **kwargs, ): """Computes the errors for convergence between the calculated and previous values of temperature, salinity, and liquid fraction. Args: temperature_calculated (numpy.ndarray): Array of calculated temperature values. temperature_previous (numpy.ndarray): Array of previous temperature values. salinity_calculated (numpy.ndarray): Array of calculated salinity values. salinity_previous (numpy.ndarray): Array of previous salinity values. liquid_fraction_calculated (numpy.ndarray): Array of calculated liquid fraction values. liquid_fraction_previous (numpy.ndarray): Array of previous liquid fraction values. Returns: tuple: A tuple containing the following error values: - temperature_error_max (float): Maximum temperature error for convergence check. - temperature_error_all (numpy.ndarray): Full temperature error for convergence check. - salinity_error_max (float): Maximum salinity error for convergence check. - salinity_err_all (numpy.ndarray): Full salinity error for convergence check. - liquid_fraction_error_max (float): Maximum liquid fraction error for convergence check. - liquid_fraction_error_all (numpy.ndarray): Full liquid fraction error for convergence check. """ # Function implementation goes here temperature_error_max = np.max( abs(temperature_calculated[1:-1] - temperature_previous[1:-1]) ) # Compute maximum T error for convergence check temperature_error_all = abs( temperature_calculated - temperature_previous ) # Compute full T error for convergence check salinity_error_max = np.max( salinity_calculated[1:-1] - salinity_previous[1:-1] ) # Compute maximum S error for convergence check salinity_err_all = ( salinity_calculated - salinity_previous ) # Compute full S error for convergence check liquid_fraction_error_max = np.max( liquid_fraction_calculated[1:-1] - liquid_fraction_previous[1:-1] ) # Compute maximum phi error for convergence check liquid_fraction_error_all = ( liquid_fraction_calculated - liquid_fraction_previous ) # Compute full phi error for convergence check residual_sum = voller_residual_scheme( temperature_calculated, temperature_previous, liquid_fraction_calculated, liquid_fraction_previous, kwargs, ) # Compute residual sum for convergence check return ( temperature_error_max, temperature_error_all, salinity_error_max, salinity_err_all, liquid_fraction_error_max, liquid_fraction_error_all, residual_sum, )
[docs] def voller_residual_scheme( temperature_calculated, temperature_previous, liquid_fraction_calculated, liquid_fraction_previous, kwargs, ): """ Calculate the residual sum for the Voller residual scheme. This function computes the residual sum based on the calculated and previous temperature and liquid fraction values, along with additional parameters provided in the kwargs dictionary. The residual sum is used to assess the convergence of the numerical scheme. (RHS - LHS matrix) Parameters: ----------- temperature_calculated : array-like The calculated temperature values at the current iteration. temperature_previous : array-like The temperature values from the previous iteration. liquid_fraction_calculated : array-like The calculated liquid fraction values at the current iteration. liquid_fraction_previous : array-like The liquid fraction values from the previous iteration. kwargs : dict A dictionary containing additional parameters required for the computation. Expected keys are: - "A_matrix": The coefficient matrix for the temperature calculation. - "phi_initial": The initial liquid fraction values. - "t_initial": The initial temperature values. - "temp_factor3": A factor used in the residual calculation. Returns: -------- residual_sum : float The sum of the absolute values of the residuals. """ a_matrix = kwargs["A_matrix"] a_matrix[0], a_matrix[-1] = 0, 0 a_res = a_matrix @ temperature_calculated mush_cond = (liquid_fraction_calculated >= 0.05) & ( liquid_fraction_calculated <= 0.95 ) mush_indx = np.where(mush_cond) phi_diff = kwargs["phi_initial"] - liquid_fraction_calculated rhs_res = kwargs["t_initial"] + kwargs["temp_factor3"] * phi_diff residual = a_res[1:-1] - rhs_res[1:-1] residual_sum = np.sum(np.abs(residual)) return residual_sum
# Function to reset errors for while loop
[docs] def reset_error_for_while_loop( temperature_tolerance, salinity_tolerance, liquid_fraction_tolerance ): """Resets the error values for a while loop based on the given tolerances. Args: temperature_tolerance (float): The tolerance for temperature error. salinity_tolerance (float): The tolerance for salinity error. liquid_fraction_tolerance (float): The tolerance for liquid fraction error. Returns: tuple: A tuple containing the reset error values for temperature, salinity, and liquid fraction. """ temperature_error = ( 1 + temperature_tolerance ) # Set initial T error to value greater than tolerance salinity_error = ( 1 + salinity_tolerance ) # Set initial S error to value greater than tolerance liquid_fraction_error = ( 1 + liquid_fraction_tolerance ) # Set initial phi error to value greater than tolerance return temperature_error, salinity_error, liquid_fraction_error
# Function to initialize state variables
[docs] def set_initial_statevariables(temperature, salinity, liquid_fraction): """Initializes the state variables for the given temperature, salinity, and liquid fraction. Args: temperature (float): The initial temperature. salinity (float): The initial salinity. liquid_fraction (float): The initial liquid fraction. Returns: tuple: A tuple containing the initialized state variables: - temperature_initial (float): The initial temperature. - temperature_new (float): The current temperature for iteration. - temperature_previous (float): The previous temperature for initialization. - salinity_initial (float): The initial salinity. - salinity_new (float): The current salinity for iteration. - salinity_previous (float): The previous salinity for initialization. - phi_initial (float): The initial liquid fraction. - liquid_fraction_new (float): The current liquid fraction for iteration. - phi_prev (float): The previous liquid fraction for initialization. """ phi_initial = liquid_fraction # Store initial phi for later use liquid_fraction_new = ( liquid_fraction # Set previous phi as current phi for iteration ) phi_prev = liquid_fraction # Set previous phi as current phi for initialization temperature_initial = temperature # Store initial T for later use temperature_previous = temperature # Set previous T as current T for initialization temperature_new = temperature # Set current T as previous T for iteration salinity_initial = salinity # Store initial S for later use salinity_new = salinity # Set current S as previous S for initialization salinity_previous = salinity return ( temperature_initial, temperature_new, temperature_previous, salinity_initial, salinity_new, salinity_previous, phi_initial, liquid_fraction_new, phi_prev, )