add_model#
- MultiPhase.add_model(propname, model, domain='all', regen_mode='normal', **kwargs)#
Add a pore-scale model to the object, along with the desired arguments
- Parameters:
propname (str) – The name of the property being computed. E.g. if
propname='pore.diameter'
then the computed results will be stored inobj['pore.diameter']
.model (function handle) – The function that produces the values
domain (str) – The label indicating the locations in which results generated by
model
should be stored. See Notes for more details.regen_mode (str) –
How the model should be regenerated. Options are:
regen_mode
description
normal
(default) The model is run immediately upon being added, and is also run each time
regenerate_models
is called.deferred
The model is NOT run when added, but is run each time
regenerate_models
is called. This is useful for models that depend on other data that may not exist yet.constant
The model is run immediately upon being added, but is is not run when
regenerate_models
is called, effectively turning the property into a constant.kwargs (keyword arguments) – All additional keyword arguments are passed on to the model
Notes
The
domain
argument dictates where the results ofmodel
should be stored. For instance, givenpropname='pore.diameter'
anddomain='left'
then when model is run, the results are stored in in the pores labelled left. Note that ifmodel
returnsNp
values, then values not belonging to'pore.left'
are discarded. The following steps outline the process:Find the pore indices:
Ps = obj.pores('left')
Run the model:
vals = model(**kwargs)
3. If the model returns a full Np-length array, then extract the correct values and apply them to the corresponding locations:
if len(vals) == obj.Np: obj['pore.diameter'][Ps] = vals[Ps]
If the model was designed to return only the subset of values then:
if len(vals) == obj.num_pores('left'): obj['pore.diameter'][Ps] = vals