Evolution of the 1D model implementation : with acidity
[1]:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import xarray as xr
from seapopym.configuration.acidity import (
AcidityConfiguration,
ForcingParameter,
FunctionalGroupParameter,
FunctionalGroupUnit,
FunctionalTypeParameter,
)
from seapopym.configuration.no_transport import (
ForcingUnit,
MigratoryTypeParameter,
)
from seapopym.model import AcidityModel
from seapopym.standard import coordinates
from seapopym.standard.units import StandardUnitsLabels
Generating data for the 1D simulation
Let’s generate some data for the 1D simulation. In this NoTransport model, only temperature and primary production are required. The temperature is generated as a sine wave with a period of 1 year and the primary production is randomly generated.
[2]:
time_axis = coordinates.new_time(pd.date_range("2000-01-01", "2001-01-01", freq="D"))
n = int(time_axis.size)
t = np.linspace(0, 1, n)
temperature = np.ones_like(t) * 15
acidity = 15 + 15 * np.cos(2 * np.pi * t)
temperature = xr.DataArray(
dims=["time", "latitude", "longitude", "layer"],
coords={
"time": coordinates.new_time(pd.date_range("2000-01-01", "2001-01-01", freq="D")),
"latitude": coordinates.new_latitude([0]),
"longitude": coordinates.new_longitude([0]),
"layer": coordinates.new_layer([0]),
},
attrs={"units": StandardUnitsLabels.temperature},
data=temperature[:, np.newaxis, np.newaxis, np.newaxis],
)
plt.figure(figsize=(9, 3))
temperature[:, 0, 0].cf.plot.line(x="T")
plt.title("Temperature")
plt.show()
acidity = xr.DataArray(
dims=["time", "latitude", "longitude", "layer"],
coords={
"time": coordinates.new_time(pd.date_range("2000-01-01", "2001-01-01", freq="D")),
"latitude": coordinates.new_latitude([0]),
"longitude": coordinates.new_longitude([0]),
"layer": coordinates.new_layer([0]),
},
attrs={"units": StandardUnitsLabels.acidity},
data=acidity[:, np.newaxis, np.newaxis, np.newaxis],
)
plt.figure(figsize=(9, 3))
acidity[:, 0, 0].cf.plot.line(x="T")
plt.title("Acidity")
plt.show()
primary_production = xr.DataArray(
dims=["time", "latitude", "longitude"],
coords={
"time": coordinates.new_time(pd.date_range("2000-01-01", "2001-01-01", freq="D")),
"latitude": coordinates.new_latitude([0]),
"longitude": coordinates.new_longitude([0]),
},
attrs={"units": StandardUnitsLabels.production},
data=np.random.rand(367, 1, 1),
)
plt.figure(figsize=(9, 3))
primary_production.plot()
plt.title("Primary Production")
plt.show()
dataset = xr.Dataset({"temperature": temperature, "primary_production": primary_production, "acidity": acidity})
Initialize the model
First we set up the model parameters. We will define a single functional group with the commonly used parameters for the zooplankton in Seapodym LMTL.
[4]:
day_layer = 0
night_layer = 0
tr_0 = 10.38
gamma_tr = -0.11
lambda_temperature_0 = 1 / 150
gamma_lambda_temperature = 0.15
lambda_acidity_0 = 1 / 150
gamma_lambda_acidity = 0.15
f_groups = FunctionalGroupParameter(
functional_group=[
FunctionalGroupUnit(
name=f"D{day_layer}N{night_layer}",
energy_transfert=0.1668,
migratory_type=MigratoryTypeParameter(day_layer=day_layer, night_layer=night_layer),
functional_type=FunctionalTypeParameter(
lambda_temperature_0=lambda_temperature_0,
gamma_lambda_temperature=gamma_lambda_temperature,
lambda_acidity_0=lambda_acidity_0,
gamma_lambda_acidity=gamma_lambda_acidity,
tr_0=tr_0,
gamma_tr=gamma_tr,
),
),
FunctionalGroupUnit(
name=f"D{day_layer}N{night_layer}_BIS",
energy_transfert=0.1668 / 2,
migratory_type=MigratoryTypeParameter(day_layer=day_layer, night_layer=night_layer),
functional_type=FunctionalTypeParameter(
lambda_temperature_0=lambda_temperature_0 / 2,
gamma_lambda_temperature=gamma_lambda_temperature / 2,
lambda_acidity_0=lambda_acidity_0 / 2,
gamma_lambda_acidity=gamma_lambda_acidity / 2,
tr_0=tr_0 / 2,
gamma_tr=gamma_tr / 2,
),
),
]
)
p_param = ForcingParameter(
temperature=ForcingUnit(forcing=dataset["temperature"]),
primary_production=ForcingUnit(forcing=dataset["primary_production"]),
acidity=ForcingUnit(forcing=dataset["acidity"]),
)
parameters = AcidityConfiguration(forcing=p_param, functional_group=f_groups)
no_transport_model = AcidityModel.from_configuration(configuration=parameters)
no_transport_model.state
[4]:
<xarray.Dataset> Size: 13kB
Dimensions: (time: 367, latitude: 1, longitude: 1,
layer: 1, functional_group: 2, cohort: 11)
Coordinates:
* time (time) datetime64[ns] 3kB 2000-01-01 ... 2001...
* latitude (latitude) int64 8B 0
* longitude (longitude) int64 8B 0
* layer (layer) int64 8B 0
* cohort (cohort) int64 88B 0 1 2 3 4 5 6 7 8 9 10
* functional_group (functional_group) int64 16B 0 1
Data variables: (12/21)
temperature (time, latitude, longitude, layer) float64 3kB ...
primary_production (time, latitude, longitude) float64 3kB 0.716...
acidity (time, latitude, longitude, layer) float64 3kB ...
name (functional_group) <U8 64B 'D0N0' 'D0N0_BIS'
energy_transfert (functional_group) float64 16B 0.1668 0.0834
lambda_temperature_0 (functional_group) float64 16B 0.006667 0.003333
... ...
max_timestep (functional_group, cohort) float64 176B 1.0 ....
mean_timestep (functional_group, cohort) float64 176B 1.0 ....
timestep float64 8B 1.0
angle_horizon_sun float64 8B 0.0
compute_initial_conditions bool 1B False
compute_preproduction bool 1B False[5]:
no_transport_model.expected_memory_usage
[5]:
'The expected memory usage is 0.06 MB.'
Run the model
[6]:
no_transport_model.run()
no_transport_model.state
[6]:
<xarray.Dataset> Size: 59kB
Dimensions: (time: 367, latitude: 1, longitude: 1,
functional_group: 2, cohort: 11, layer: 1)
Coordinates:
* time (time) datetime64[ns] 3kB 2000-01-01 ... 20...
* latitude (latitude) int64 8B 0
* longitude (longitude) int64 8B 0
* functional_group (functional_group) int64 16B 0 1
* cohort (cohort) int64 88B 0 1 2 3 4 5 6 7 8 9 10
* layer (layer) int64 8B 0
Data variables: (12/32)
biomass (functional_group, time, latitude, longitude) float64 6kB ...
recruited (functional_group, time, latitude, longitude) float64 6kB ...
mortality_field (functional_group, time, latitude, longitude) float64 6kB ...
mask_temperature (functional_group, time, latitude, longitude, cohort) bool 8kB ...
min_temperature (functional_group, cohort) float64 176B 21....
primary_production_by_fgroup (functional_group, time, latitude, longitude) float64 6kB ...
... ...
max_timestep (functional_group, cohort) float64 176B 1.0...
mean_timestep (functional_group, cohort) float64 176B 1.0...
timestep float64 8B 1.0
angle_horizon_sun float64 8B 0.0
compute_initial_conditions bool 1B False
compute_preproduction bool 1B FalsePlotting the results
The biomass evolution over time
[7]:
plt.figure(figsize=(9, 3))
no_transport_model.state["biomass"].mean(["latitude", "longitude"]).plot(
label="Zoo Seapopym", x="time", hue="functional_group"
)
plt.legend()
plt.title("Evolution of the biomass")
plt.show()