Model building and running with SPyice for heat-salt transport system#
Example 1: Demo to activate salt process model with heat model#
Demonstrates a simple example for a freezing sea ice model heat-salt transport setup with 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.
Import Packages#
[1]:
from pathlib import Path
from datetime import datetime
import matplotlib.pyplot as plt
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
# make sure to change userinput_data data class values if any parameters in constants_dict is changed!
constants_dict = {
"constants": {"constants": "real"},
"dt": {"dt": 47},
"iter_max": {"iter_max": 1500},
"dz": {"dz": 0.01},
"model": {"is_diffusiononly_equation": True, "is_salinity_equation": False, "is_radiation_equation": False, "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
output_base_dir = Path("../example/output/without_hydra")
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
output_base_dir = Path(output_base_dir, timestamp)
out_dir_final = create_output_directory(output_base_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 physical properties
userinput_data.is_diffusiononly_equation = False
userinput_data.is_salinity_equation = True
[5]:
preprocess_data = PreProcess.update_preprocess_dataclass(preprocess_data, userinput_data)
Time step set to: 47s
Updated Initial & Boundary Conditions...
Run model#
[6]:
# 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.
Visualization of Model:#
for more info on other visualization options look at: visualize model
[7]:
model_visualization_object = VisualiseModel(
user_input_dataclass=userinput_data,
results_dataclass=results_data,
error_analysis_dataclass=analysis_data,
)
Visualisation object created...
[8]:
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_liquidfraction_heatmap(
ax=axes[2],
savefig=False,
show=False,
fig=fig
)
axes[0].set_title("Temperature")
axes[1].set_title("Salinity")
axes[2].set_title("Liquid Fraction")
plt.tight_layout()
plt.show()
Example 2: Demo to change temperature boundary conditions and salt initial conditions in heat-solute transport simulation#
Demonstrates a simple example for a freezing sea ice model heat-salt transport setup with different boundary settings 250K at the top boundary and Salinity of 100ppt choosing constant fixed Dirichlet boundary conditions. For the one phase distinct interface system where sea water is at melt temperature of 271.25K.
Import Packages#
[9]:
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#
[10]:
# creates a OmegaConf object from a dictionary for fast testing only for parameters: constants, dt, S_IC, iter_max, dz
# make sure to change userinput_data data class values if any parameters in constants_dict is changed!
constants_dict = {
"constants": {"constants": "real"},
"dt": {"dt": 47},
"iter_max": {"iter_max": 1500},
"dz": {"dz": 0.1},
"model": {"is_diffusiononly_equation": True, "is_salinity_equation": False, "is_radiation_equation": False, "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
output_base_dir = Path("../example/output/without_hydra")
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
output_base_dir = Path(output_base_dir, timestamp)
out_dir_final = create_output_directory(output_base_dir, "S", "2", "0.01", "47", "1500","example")
Preprocessing#
[11]:
# 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
[12]:
# Choose the diffusion only equation for heat diffusion without the influence of salinity and physical properties
userinput_data.is_diffusiononly_equation = False
userinput_data.is_salinity_equation = True
[13]:
# Top surface boundary temperature of sea ice in K
userinput_data.boundary_top_temperature = 250.0
[14]:
# Salinity as SX with X being the initial value
# Initial salinity of ocean can be changed as follows:
userinput_data.initial_salinity = "S100"
[15]:
# Update preprocess data class with new data
preprocess_data = PreProcess.update_preprocess_dataclass(preprocess_data, userinput_data)
Time step set to: 47s
Updated Initial & Boundary Conditions...
Run model#
[16]:
# 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.
Visualization of Model:#
for more info on other visualization options look at: visualize model
[17]:
model_visualization_object = VisualiseModel(
user_input_dataclass=userinput_data,
results_dataclass=results_data,
error_analysis_dataclass=analysis_data,
)
Visualisation object created...
[18]:
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_liquidfraction_heatmap(
ax=axes[2],
savefig=False,
show=False,
fig=fig
)
axes[0].set_title("Temperature")
axes[1].set_title("Salinity")
axes[2].set_title("Liquid Fraction")
plt.tight_layout()
plt.show()