Some imports to start, including holoviews:
In [1]:
    
import os
import numpy as np
import holoviews as hv
hv.extension('bokeh', 'matplotlib')
    
    
    
    
Start by importing the BmiDiffusion class from the bmi-live package and creating an instance:
In [2]:
    
from bmi_live import BmiDiffusion
x = BmiDiffusion()
    
Locate a configuration file for this example and use it to initialize the model:
In [3]:
    
from bmi_live import data_directory
cfg_file = os.path.join(data_directory, 'visualize_diffusion.yaml')
x.initialize(cfg_file)
    
Get a reference to the temperature variable exposed by the model:
In [4]:
    
temp = x.get_value_ptr('plate_surface__temperature')
    
Add an impulse to the initial temperature field:
In [5]:
    
temp[200] = 100.0
    
Because temp is a reference, there's no need to call set_value to update its value.
Get the id of the grid on which the temperature variable is located:
In [6]:
    
grid_id = x.get_var_grid('plate_surface__temperature')
grid_id
    
    Out[6]:
Use this grid id to get the shape of the grid:
In [7]:
    
grid_shape = np.ndarray(x.get_grid_rank(grid_id), int)
x.get_grid_shape(grid_id, grid_shape)
grid_shape
    
    Out[7]:
Set the number of time steps that we'll advance the model:
In [8]:
    
n_steps = 35
    
Make a variable to hold the values of the temperature field over time:
In [9]:
    
temperature = np.zeros((*grid_shape, n_steps))
    
What is the shape of this variable?
In [10]:
    
temperature.shape
    
    Out[10]:
Load the initial perturbed temperature field into the temperature variable:
In [11]:
    
temperature[:,:,0] = temp.reshape(grid_shape)
    
Advance the model through time, adding to the temperature array at each step:
In [12]:
    
for t in range(n_steps):
    x.update()
    temperature[:,:,t] = temp.reshape(grid_shape)
    
Note that because temp is a reference, it's automatically updated on each time step.
Load the temperature array into a holoviews dataset.
In [13]:
    
ds = hv.Dataset((np.arange(n_steps), np.arange(grid_shape[1]), np.arange(grid_shape[0]),
                 temperature), ['Time','x', 'y'], 'Temperature')
    
Examine the dataset:
In [14]:
    
type(ds.data), list(ds.data.keys())
    
    Out[14]:
Visualize the dataset as an image with a slider to step through time:
In [15]:
    
%opts Image (cmap='Reds')[colorbar=True]
%output size=150
ds.to(hv.Image, ['x', 'y'], dynamic=True)
    
    Out[15]: