Guide to model building and running with SPyice for heat-salt transport with radiation#

Demonstrates a simple example for a freezing sea ice model with gravity drainage and radiation along with other default settings of initial conditions of 265K at the top boundary and Salinity of 34ppt choosing constant fixed Dirichlet boundary conditions. For the one phase distinct interface system where sea water is at melt temperature of 271.25K.

0364b5e0306e4626b805a671378f9d9c

Import Packages#

[1]:
import os
from pathlib import Path
import matplotlib.pyplot as plt
from datetime import datetime

%matplotlib inline
from omegaconf import OmegaConf

from spyice.utils import create_output_directory
from spyice.postprocess import Analysis, VisualiseModel
from spyice.utils import ConfigSort
from spyice.models import SeaIceModel
from spyice.preprocess import PreProcess

Define Inputs and Project Output paths#

[2]:
# creates a OmegaConf object from a dictionary for fast testing only for parameters: constants, dt, S_IC, iter_max, dz
constants_dict = {
    "constants": {"constants": "real"},
    "dt": {"dt": 47},
    "iter_max": {"iter_max": 1500},
    "dz": {"dz": 0.01},
    "model": {"is_diffusiononly_equation": False, "is_salinity_equation": True, "is_radiation_equation": True, "is_algae_equation": False, "algae_model_BAL_type": "all"},
    "ICBC": {"S_IC": 'S_34', "T_BC": 265.0}
}
config_raw = OmegaConf.create(constants_dict)
config = ConfigSort.getconfig_dataclass(config_raw, config_type="jupyter")

# choose your output directory
base_dir = Path.cwd()
output_base_dir = Path(base_dir, "../output")
# Current date-time string
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
output_base_dir = Path(output_base_dir, timestamp)
wo_hydra_dir = Path(output_base_dir, "without_hydra")
out_dir_final = create_output_directory(wo_hydra_dir, "S", "2", "0.01", "47", "1500", "example")

Preprocessing#

[3]:
# preprocess the data
preprocess_data, userinput_data = PreProcess.get_variables(config_raw, out_dir_final)
Preprocessing...
User Configuration Data Setup Complete...
Geometry Data Setup Complete...
Results Data Setup Complete...
Time step set to: 47s
Applied Initial & Boundary Conditions...
Preprocessing done.

Model settings#

for more info on all the model parameters have a look at the documentation: userinput

[4]:
# choose the diffusion only equation for heat diffusion without the influence of salinity and radiation due to sunlight
userinput_data.is_diffusiononly_equation = False
userinput_data.is_salinity_equation = True
userinput_data.is_radiation_equation = True
[5]:
# change dz, dt and time iterations
# simulation time = dt * (time iterations)
userinput_data.grid_resolution_dz = 0.01
userinput_data.grid_timestep_dt = 47
userinput_data.max_iterations = 1500
[6]:
# update preprocess data class with new userinput data
preprocess_data = PreProcess.update_preprocess_dataclass(preprocess_data, userinput_data)
Time step set to: 47s
Updated Initial & Boundary Conditions...

Run model#

[7]:
# run the model
results_data = SeaIceModel.get_results(preprocess_data, userinput_data)
analysis_data = Analysis.get_error_results(
            t_k_diff=results_data.t_k_diff,
            t_stefan_diff=results_data.t_stefan_diff,
            residual=results_data.residual_voller_all,
            temperature_mushy=results_data.t_k_iter_all,
            phi_mushy=results_data.all_phi_iter_all,
            salinity_mushy=results_data.s_k_iter_all,
            output_dir=out_dir_final,
        )
Running model...
Model run complete and Ready for Analysis.
Running error analysis...
Calculating errors...
Residuals exported successfully.
../../_images/quick_start_example_jupyter_run_radiation_13_1.png

Visualization of Model:#

for more info on other visualization options look at: visualize model

[8]:
model_visualization_object = VisualiseModel(
    user_input_dataclass=userinput_data,
    results_dataclass=results_data,
    error_analysis_dataclass=analysis_data,
)
Visualisation object created...
[9]:
fig, axes = plt.subplots(1, 3, figsize=(11, 5), sharey=True)

model_visualization_object.plot_temperature_heatmap(
    ax=axes[0],
    savefig=False,
    export_csv=False,
    show=False,
    fig=fig
)

model_visualization_object.plot_salinity_heatmap(
    ax=axes[1],
    savefig=False,
    show=False,
    fig=fig
)

model_visualization_object.plot_radiation_all(
    ax=axes[2],
    savefig=False,
    show=False,
    fig=fig
)

axes[0].set_title("Temperature")
axes[1].set_title("Salinity")
axes[2].set_title("Radiation")

plt.tight_layout()
plt.show()
Plotting Temperature heatmap...
Plotting Salinity heatmap...
Plotting radiation ice and algae heatmap...
../../_images/quick_start_example_jupyter_run_radiation_16_1.png
[10]:
fig, axes = plt.subplots(1, 3, figsize=(11, 5), sharey=True)

model_visualization_object.plot_radiation_profile(
    ax=axes[0],
    savefig=False,
    show=False,
    fig=fig
)

model_visualization_object.plot_brinevelocity_profile(
    ax=axes[1],
    savefig=False,
    show=False,
    fig=fig
)

model_visualization_object.plot_salinity_sourceterm_profile(
    ax=axes[2],
    savefig=False,
    show=False,
    fig=fig
)

axes[0].set_title("Radiation")
axes[1].set_title("Brine velocity")
axes[2].set_title("Salinity source")

plt.tight_layout()
plt.show()
../../_images/quick_start_example_jupyter_run_radiation_17_0.png