In [ ]:
import os
import glob
from ipywidgets import Dropdown, Label, FloatText, VBox, HBox

In [ ]:
# Show available test cases
testcases = [(os.path.basename(path)[:-5], path) for path in glob.glob('../*.yaml')]
dropdown = Dropdown(options=testcases, description='Test case:')
display(dropdown)

In [ ]:
# Initialize the test case (this reads fabm.yaml)
import pyfabm
model = pyfabm.Model(dropdown.value)

In [ ]:
# Present configurable environmental conditions
default_environment = {
    'temperature': 15,
    'practical_salinity': 35,
    'surface_downwelling_photosynthetic_radiative_flux': 50,
    'downwelling_photosynthetic_radiative_flux': 10,
    'bottom_depth': 10,
    'density': 1020
}
labels, inputs = [], []
for variable in model.dependencies:
    labels.append(Label('%s:' % variable.long_name))
    inputs.append(FloatText(value=default_environment.get(variable.name, 0.), layout={'width': '7em'}))
display(HBox((VBox(labels), VBox(inputs))))

In [ ]:
# Transfer environmental conditions to model
for variable, widget in zip(model.dependencies, inputs):
    variable.value = widget.value
assert model.start(), 'Model failed to start: %s' % pyfabm.getError()

In [ ]:
# Time integrate
import numpy
import scipy.integrate

# Time derivative
def dy(y, t0):
    model.state[:] = y
    return model.getRates(t0)

# Time-integrate over 200 days (note: FABM's internal time unit is seconds!)
t = numpy.arange(0, 200., 1)
y = scipy.integrate.odeint(dy, model.state, t*86400)

In [ ]:
# Plot results
%matplotlib notebook
from matplotlib import pyplot
pyplot.plot(t, y)
pyplot.legend([variable.long_path for variable in model.state_variables])
pyplot.show()

In [ ]:
model.state

In [ ]: