Nektar++
Classes | Functions | Variables
CellMLToNektar.pycml Namespace Reference

Classes

class  cellml_component
 
class  cellml_model
 
class  cellml_unit
 
class  cellml_units
 
class  cellml_variable
 
class  comment_base
 
class  element_base
 
class  EvaluationError
 
class  mathml
 
class  mathml_abs
 
class  mathml_and
 
class  mathml_apply
 
class  mathml_arccos
 
class  mathml_arcsin
 
class  mathml_arctan
 
class  mathml_ci
 
class  mathml_cn
 
class  mathml_constructor
 
class  mathml_cos
 
class  mathml_degree
 
class  mathml_diff
 
class  mathml_divide
 
class  mathml_eq
 
class  mathml_exp
 
class  mathml_geq
 
class  mathml_gt
 
class  mathml_lambda
 
class  mathml_leq
 
class  mathml_ln
 
class  mathml_log
 
class  mathml_logbase
 
class  mathml_lt
 
class  mathml_math
 
class  mathml_minus
 
class  mathml_neq
 
class  mathml_operator
 
class  mathml_or
 
class  mathml_otherwise
 
class  mathml_piece
 
class  mathml_piecewise
 
class  mathml_plus
 
class  mathml_power
 
class  mathml_rem
 
class  mathml_root
 
class  mathml_sin
 
class  mathml_tan
 
class  mathml_times
 
class  mathml_units_mixin
 MathML elements #. More...
 
class  mathml_units_mixin_choose_nearest
 
class  mathml_units_mixin_container
 
class  mathml_units_mixin_equalise_operands
 
class  mathml_units_mixin_set_operands
 
class  mathml_units_mixin_tokens
 
class  MathsError
 
class  reduce_commutative_nary
 
class  UnitsError
 
class  UnitsSet
 

Functions

def import_processors ()
 
def make_xml_binder ()
 Helpful utility functions #. More...
 
def amara_parse_cellml (source, uri=None, prefixes=None)
 
def check_append_safety (elt)
 
def add_methods_to_amara ()
 
def _rel_error_ok (self, value1, value2, tol)
 def eq(self, other): """Compare 2 units elements for equality. More...
 
def equals (self, other)
 
def model (self)
 
def extract (self, check_equality=False)
 
def copy (self)
 
def description (self, force=False, cellml=False)
 
def get_units_by_name (self, uname)
 
def expand (self)
 
def is_base_unit (self)
 
def is_simple (self)
 
def get_multiplicative_factor (self)
 
def get_multiplier (self)
 
def get_offset (self)
 
def create_new (parent, name, bases, add_to_parent=False, standard=False)
 
def _based_on (self, units=None, prefix=None, exponent=None, multiplier=None, offset=None)
 
def simplify (self, other_units=None, other_exponent=1)
 
def _best_parent (self, other_units)
 
def quotient (self, other_units)
 
def dimensionally_equivalent (self, other_units)
 
def child_i (elt, i)
 
def _child1 (elt)
 
def varobj (self, ci_elt)
 
def vars_in (self, expr)
 
def same_tree (self, other, this=None)
 
def _xfer_complexity (self, new_elt)
 
def _adjust_complexity (self, old_elt, new_elt)
 
def classify_child_variables (self, elt, kwargs)
 

Variables

 processors = None
 
list __version__ = "$Revision: 25949 $"[11:-2]
 
 level
 
 format
 
 stream
 
 WARNING_TRANSLATE_ERROR
 
dictionary NSS
 
 VarTypes
 
 CELLML_SUBSET_ELTS
 
 BINDING_TIMES = Enum('static', 'dynamic')
 
list units_name_counter = [0]
 
 new_units = dimensionless
 print "Keeping d'less ref with m =",m,"from", print self.description(), if other_units: print "and",other_units.description() else: print More...
 
 unit_elements = set(d.values())
 
string uname = u'___units_' + str(self.units_name_counter[0])
 
 _cml_generated
 
 xml_parent
 
def units = self.model._get_units_obj(units)
 _u = units More...
 
string msg = "Adding units " + units.name + " as "
 
 name
 
 cellml
 
dictionary attrs = {(u'cml:units', NSS[u'cml']): units.name}
 
 _cml_expanded
 
 base_units
 

Function Documentation

◆ _adjust_complexity()

def CellMLToNektar.pycml._adjust_complexity (   self,
  old_elt,
  new_elt 
)
private
Adjust ancestor complexity because old_elt changed to new_elt.

The purpose of this method is to allow us to keep track of
what the complexity of each expression node *was* prior to PE
being performed.  Thus we cannot just re-compute complexities,
but must update values using the original complexities.  If a
variable definition is instantiated, then the complexity of
the expression containing the lookup must be adjusted to
reflect the additional expense of evaluating the defining
expression.

When this method is called, only new_elt is a child of self.

Definition at line 3923 of file pycml.py.

References CellMLToNektar.pycml.child_i().

3923  def _adjust_complexity(self, old_elt, new_elt):
3924  """Adjust ancestor complexity because old_elt changed to new_elt.
3925 
3926  The purpose of this method is to allow us to keep track of
3927  what the complexity of each expression node *was* prior to PE
3928  being performed. Thus we cannot just re-compute complexities,
3929  but must update values using the original complexities. If a
3930  variable definition is instantiated, then the complexity of
3931  the expression containing the lookup must be adjusted to
3932  reflect the additional expense of evaluating the defining
3933  expression.
3934 
3935  When this method is called, only new_elt is a child of self.
3936  """
3937  #print "Adjusting", element_xpath(self), "due to", element_xpath(old_elt),
3938  #if isinstance(old_elt, mathml_ci):
3939  # print unicode(old_elt)
3940  #else:
3941  # print
3942  try:
3943  new = new_elt._cml_complexity
3944  old = old_elt._cml_complexity
3945  except AttributeError:
3946  return
3947  #print " by", new-old
3948  elt = self
3949  while elt:
3950  if isinstance(elt, mathml_piecewise):
3951  # Piecewise is tricky to adjust! So we 're-compute' instead.
3952  ac, piece_ac = 0, []
3953  for piece in getattr(elt, u'piece', []):
3954  ac += child_i(piece, 2)._cml_complexity
3955  piece_ac.append(child_i(piece, 1)._cml_complexity)
3956  if hasattr(elt, u'otherwise'):
3957  piece_ac.append(child_i(elt.otherwise, 1)._cml_complexity)
3958  ac += max(piece_ac)
3959  elt._cml_complexity = ac
3960  elif hasattr(elt, '_cml_complexity'):
3961  elt._cml_complexity += (new - old)
3962  elt = getattr(elt, 'xml_parent', None)
3963  return
3964 
def _adjust_complexity(self, old_elt, new_elt)
Definition: pycml.py:3923
def child_i(elt, i)
Definition: pycml.py:3449

◆ _based_on()

def CellMLToNektar.pycml._based_on (   self,
  units = None,
  prefix = None,
  exponent = None,
  multiplier = None,
  offset = None 
)
private
Convenience function for defining new units.

Definition at line 2941 of file pycml.py.

Referenced by CellMLToNektar.pycml.create_new().

2941  multiplier=None, offset=None):
2942  """Convenience function for defining new units."""
2943  for v in ['units', 'prefix', 'exponent', 'multiplier', 'offset']:
2944  # Coerce from str to unicode
2945  exec "if type(%s) == str: %s = unicode(%s)" % (v,v,v)
2946  # Check type
2947  exec "assert(%s is None or type(%s) == unicode)" % (v,v)
2948  assert(not hasattr(self, 'base_units') or self.base_units == u'no')
2949  attrs = {u'units': units}
2950  if offset:
2951  # Simple units definition
2952  assert(not hasattr(self, 'unit'))
2953  attrs[u'offset'] = offset
2954  if not prefix is None: attrs[u'prefix'] = prefix
2955  if not exponent is None: attrs[u'exponent'] = exponent
2956  else:
2957  # Complex units definition
2958  if not prefix is None: attrs[u'prefix'] = prefix
2959  if not exponent is None: attrs[u'exponent'] = exponent
2960  if not multiplier is None: attrs[u'multiplier'] = multiplier
2961  self.xml_append(self.xml_create_element(u'unit', NSS[u'cml'],
2962  attributes=attrs))
2963  return
2964 

◆ _best_parent()

def CellMLToNektar.pycml._best_parent (   self,
  other_units 
)
private
Return a suitable parent for units formed from self and other_units.

If either constituent is in a component, that component should be the
parent, otherwise the model should be.

Definition at line 3143 of file pycml.py.

3143  def _best_parent(self, other_units):
3144  """Return a suitable parent for units formed from self and other_units.
3145 
3146  If either constituent is in a component, that component should be the
3147  parent, otherwise the model should be.
3148  """
3149  p1, p2 = self.xml_parent, other_units and other_units.xml_parent
3150  if p2 and p1 != p2 and isinstance(p1, cellml_model):
3151  p1 = p2
3152  return p1
3153 
def _best_parent(self, other_units)
Definition: pycml.py:3143

◆ _child1()

def CellMLToNektar.pycml._child1 (   elt)
private

◆ _rel_error_ok()

def CellMLToNektar.pycml._rel_error_ok (   self,
  value1,
  value2,
  tol 
)
private

def eq(self, other): """Compare 2 units elements for equality.

return self.equals(other) def ne(self, other): """Inverse of self.__eq__(other).""" return not self.__eq__(other)

Test if the relative difference of 2 values is within tol.

Definition at line 2627 of file pycml.py.

2627  def _rel_error_ok(self, value1, value2, tol):
2628  """Test if the relative difference of 2 values is within tol."""
2629  if abs(value1) == 0.0:
2630  return abs(value2) < tol
2631  else:
2632  return (abs(value1-value2)/abs(value1)) < tol
2633 
def _rel_error_ok(self, value1, value2, tol)
def eq(self, other): """Compare 2 units elements for equality.
Definition: pycml.py:2627

◆ _xfer_complexity()

def CellMLToNektar.pycml._xfer_complexity (   self,
  new_elt 
)
private
Transfer our complexity to the new element.

PE is replacing us by a new element.  If we are annotated with
a complexity - the complexity of this expression prior to PE -
then transfer the annotation to the new element.

Definition at line 3911 of file pycml.py.

3911  def _xfer_complexity(self, new_elt):
3912  """Transfer our complexity to the new element.
3913 
3914  PE is replacing us by a new element. If we are annotated with
3915  a complexity - the complexity of this expression prior to PE -
3916  then transfer the annotation to the new element.
3917  """
3918  try:
3919  new_elt._cml_complexity = self._cml_complexity
3920  except AttributeError:
3921  pass
3922  return
def _xfer_complexity(self, new_elt)
Definition: pycml.py:3911

◆ add_methods_to_amara()

def CellMLToNektar.pycml.add_methods_to_amara ( )

Definition at line 323 of file pycml.py.

324  def getAttributeNS(self, ns, local, default=u""):
325  """
326  Get the value of an attribute specified by namespace and localname.
327 
328  Optionally can also pass a default value if the attribute
329  doesn't exist (defaults to the empty string).
330  """
331  attrs = getattr(self, 'xml_attributes', {})
332  keys = [ (ns_, SplitQName(qname)[1])
333  for _, (qname, ns_) in attrs.items() ]
334  values = [ unicode(getattr(self, attr))
335  for attr, (qname, ns_) in attrs.items() ]
336  attr_dict = dict(zip(keys, values))
337  return attr_dict.get((ns, local), default)
338 
339  def xml_element_children(self, elt=None):
340  """Return an iterable over child elements of this element."""
341  if elt is None:
342  elt = self
343  for child in elt.xml_children:
344  if getattr(child, 'nodeType', None) == Node.ELEMENT_NODE:
345  yield child
346 
347  def safe_remove_child(self, child, parent=None):
348  """Remove a child element from parent in such a way that it can safely be added elsewhere."""
349  if parent is None: parent = self
350  parent.xml_remove_child(child)
351  child.next_elem = None
352 
353  def replace_child(self, old, new, parent=None):
354  """Replace child old of parent with new."""
355  if parent is None: parent = self
356  parent.xml_insert_after(old, new)
357  self.safe_remove_child(old, parent)
358 
359  import new
360  for method in ['getAttributeNS', 'xml_element_children', 'safe_remove_child', 'replace_child']:
361  meth = new.instancemethod(locals()[method], None, amara.bindery.element_base)
362  setattr(amara.bindery.element_base, method, meth)
363 
365 
def add_methods_to_amara()
Definition: pycml.py:323

◆ amara_parse_cellml()

def CellMLToNektar.pycml.amara_parse_cellml (   source,
  uri = None,
  prefixes = None 
)
Parse a CellML source with default rules and bindings.

Definition at line 191 of file pycml.py.

References CellMLToNektar.utilities.amara_parse(), and CellMLToNektar.pycml.make_xml_binder().

Referenced by CellMLToNektar.processors.ModelModifier._get_units_object(), CellMLToNektar.translators.SolverInfo.add_jacobian_matrix(), and CellMLToNektar.validator.CellMLValidator.validate().

191 def amara_parse_cellml(source, uri=None, prefixes=None):
192  """Parse a CellML source with default rules and bindings."""
193  binder = make_xml_binder()
194  rules = [bt.ws_strip_element_rule(u'*')]
195  return amara_parse(source, rules=rules, binderobj=binder)
196 
def amara_parse_cellml(source, uri=None, prefixes=None)
Definition: pycml.py:191
def amara_parse(source, uri=None, rules=None, binderobj=None, prefixes=None)
Definition: utilities.py:192
def make_xml_binder()
Helpful utility functions #.
Definition: pycml.py:168

◆ check_append_safety()

def CellMLToNektar.pycml.check_append_safety (   elt)
Check whether elt is safe to make a child, i.e. that it isn't
already a child elsewhere.

Definition at line 197 of file pycml.py.

Referenced by CellMLToNektar.pycml.mathml_apply.create_new(), CellMLToNektar.pycml.mathml_piecewise.create_new(), and CellMLToNektar.pycml.mathml_lambda.create_new().

197 def check_append_safety(elt):
198  """
199  Check whether elt is safe to make a child, i.e. that it isn't
200  already a child elsewhere.
201  """
202  assert getattr(elt, 'next_elem', None) is None
203  parent = getattr(elt, 'xml_parent', None)
204  if parent:
205  assert elt not in parent.xml_children
206 
def check_append_safety(elt)
Definition: pycml.py:197

◆ child_i()

def CellMLToNektar.pycml.child_i (   elt,
  i 
)

◆ classify_child_variables()

def CellMLToNektar.pycml.classify_child_variables (   self,
  elt,
  kwargs 
)
Classify variables in the given expression according to how they are used.

In the process, compute and return a set of variables on which that expression depends.

If dependencies_only then the variable classification will not be
done, only dependencies will be analysed.  This is useful for doing
a 'light' re-analysis if the dependency set has been reduced; if the
set has increased then the topological sort of equations may need to
be redone.

The function needs_special_treatment may be supplied to override the
default recursion into sub-trees.  It takes a single sub-tree as
argument, and should either return the dependency set for that
sub-tree, or None to use the default recursion.  This is used when
re-analysing dependencies after applying lookup tables, since table
lookups only depend on the keying variable.

Definition at line 3965 of file pycml.py.

3965  def classify_child_variables(self, elt, **kwargs):
3966  """Classify variables in the given expression according to how they are used.
3967 
3968  In the process, compute and return a set of variables on which that expression depends.
3969 
3970  If dependencies_only then the variable classification will not be
3971  done, only dependencies will be analysed. This is useful for doing
3972  a 'light' re-analysis if the dependency set has been reduced; if the
3973  set has increased then the topological sort of equations may need to
3974  be redone.
3975 
3976  The function needs_special_treatment may be supplied to override the
3977  default recursion into sub-trees. It takes a single sub-tree as
3978  argument, and should either return the dependency set for that
3979  sub-tree, or None to use the default recursion. This is used when
3980  re-analysing dependencies after applying lookup tables, since table
3981  lookups only depend on the keying variable.
3982  """
3983  if hasattr(elt, 'classify_variables'):
3984  dependencies = elt.classify_variables(**kwargs)
3985  else:
3986  dependencies = set()
3987  needs_special_treatment = kwargs.get('needs_special_treatment', lambda e: None)
3988  for e in elt.xml_element_children():
3989  child_deps = needs_special_treatment(e)
3990  if child_deps is None:
3991  child_deps = self.classify_child_variables(e, **kwargs)
3992  dependencies.update(child_deps)
3993  return dependencies
3994 
def classify_child_variables(self, elt, kwargs)
Definition: pycml.py:3965

◆ copy()

def CellMLToNektar.pycml.copy (   self)
Return a new UnitsSet containing this cellml_units object.

Used for interface compatibility with UnitsSet, where the method performs a shallow copy.

Definition at line 2663 of file pycml.py.

Referenced by Nektar::LibUtilities::GaussPoints.CalculateDerivMatrix(), Nektar.CopyArray(), Nektar.CopyArrayN(), Nektar::LinearSystem.FactorMatrix(), CellMLToNektar.pycml.mathml_apply.get_units(), CellMLToNektar.pycml.mathml_piecewise.get_units(), Nektar::NekMeshUtils::Tetrahedron.GetCurvedNodes(), Nektar::NekMeshUtils::Prism.GetCurvedNodes(), Nektar::NekMeshUtils::Triangle.GetCurvedNodes(), Nektar::ArrayInitializationPolicy< ObjectType, typename std::enable_if< std::is_fundamental< ObjectType >::value >::type >.Initialize(), Nektar::LibUtilities::SessionReader.LoadDoc(), Nektar::NekMatrix< DataType, StandardMatrixTag >.NekMatrix(), Nektar.NekMultiplyLowerTriangularMatrix(), Nektar.NekMultiplyUpperTriangularMatrix(), Nektar::NekVector< NekDouble >.NekVector(), Nektar::NekVector< NekDouble >.operator=(), Nektar::NekMatrix< DataType, StandardMatrixTag >.operator=(), Nektar::FieldUtils::InputSemtex.Process(), Nektar::StorageSmvBsr< T >.processBcoInput(), Nektar::Utilities.quadTensorNodeOrdering(), Nektar::NekMatrix< DataType, StandardMatrixTag >.ResizeDataArrayIfNeeded(), SessionReader_CreateInstance(), Nektar::Utilities.triTensorNodeOrdering(), Nektar::LibUtilities::FieldIOHdf5.v_Write(), and Nektar::FieldUtils::OutputTecplotBinary.WriteDoubleOrFloat().

2663  def copy(self):
2664  """Return a new UnitsSet containing this cellml_units object.
2665 
2666  Used for interface compatibility with UnitsSet, where the method performs a shallow copy.
2667  """
2668  return UnitsSet([self])
2669 
def copy(self)
Definition: pycml.py:2663

◆ create_new()

def CellMLToNektar.pycml.create_new (   parent,
  name,
  bases,
  add_to_parent = False,
  standard = False 
)
static
Create a new units definition element.

It requires either a cellml_model or cellml_component element
to be passed as the parent for the definition.  If
add_to_parent is set to true the new units element will be
appended to parent's children.

The bases parameter should be a list of dictionaries suitable
for use as the keyword arguments of cellml_units._based_on.
If the list is empty it will be defined as a base unit.

Definition at line 2912 of file pycml.py.

References CellMLToNektar.pycml._based_on().

2912  def create_new(parent, name, bases, add_to_parent=False, standard=False):
2913  """Create a new units definition element.
2914 
2915  It requires either a cellml_model or cellml_component element
2916  to be passed as the parent for the definition. If
2917  add_to_parent is set to true the new units element will be
2918  appended to parent's children.
2919 
2920  The bases parameter should be a list of dictionaries suitable
2921  for use as the keyword arguments of cellml_units._based_on.
2922  If the list is empty it will be defined as a base unit.
2923  """
2924  # Create the units element
2925  attrs = {u'name': unicode(name)}
2926  if not bases:
2927  attrs[u'base_units'] = u'yes'
2928  if standard:
2929  attrs[u'standard'] = u'yes'
2930  u = parent.xml_create_element(u'units', NSS[u'cml'], attributes=attrs)
2931  if add_to_parent:
2932  parent.xml_append(u)
2933  else:
2934  u.xml_parent = parent # Hack so units lookups work
2935  # Add references to units we're based on
2936  for basis in bases:
2937  u._based_on(**basis)
2938  return u
2939 
def create_new(parent, name, bases, add_to_parent=False, standard=False)
Definition: pycml.py:2912

◆ description()

def CellMLToNektar.pycml.description (   self,
  force = False,
  cellml = False 
)
Return a human-readable name for these units.

The name will be descriptive and based on the consituent <unit> elements, e.g. 'volt per second^2'

By default, if these are user-defined units, then return self.name.  Set force to True to override this behaviour.

Set cellml to True to get a description that is also a valid CellML identifier.

Definition at line 2670 of file pycml.py.

Referenced by CellMLToNektar.translators.CellMLTranslator.output_assignment().

2670  def description(self, force=False, cellml=False):
2671  """Return a human-readable name for these units.
2672 
2673  The name will be descriptive and based on the consituent <unit> elements, e.g. 'volt per second^2'
2674 
2675  By default, if these are user-defined units, then return self.name. Set force to True to override this behaviour.
2676 
2677  Set cellml to True to get a description that is also a valid CellML identifier.
2678  """
2679  if self.is_base_unit():
2680  desc = self.name
2681  elif not force and not self._cml_generated:
2682  desc = self.name
2683  else:
2684  descs, per_descs = [], []
2685  # Multiplier
2686  m = self.get_multiplier()
2687  if m != 1:
2688  descs.append(unicode(m))
2689  # Constituent units
2690  dimensionless = self.get_units_by_name('dimensionless')
2691  for unit in self.unit:
2692  if unit.get_units_element() is dimensionless:
2693  continue
2694  desc = [getattr(unit, u'prefix_', u''), unit.get_units_element().name]
2695  e = unit.get_exponent()
2696  if int(e) == e:
2697  # Cast to integer so name looks nicer.
2698  e = int(e)
2699  if abs(e) != 1:
2700  desc.extend(['^', str(abs(e))])
2701  desc = u''.join(desc)
2702  if e < 0:
2703  per_descs.append(desc)
2704  else:
2705  descs.append(desc)
2706  # Sort unit descriptions for readability
2707  descs.sort()
2708  descs = u' '.join(descs)
2709  per_descs.sort()
2710  desc = u' per '.join([descs] + per_descs)
2711  if not desc:
2712  desc = u'dimensionless'
2713  elif descs:
2714  desc = u"'" + desc + u"'"
2715  else:
2716  # Remove unwanted space from the start
2717  desc = u"'" + desc[1:] + u"'"
2718  # Convert to CellML identifier?
2719  if cellml:
2720  desc = desc.replace(u"'", u"").replace(u"^", u"")
2721  desc = desc.replace(u"*", u"").replace(u".", u"_")
2722  desc = desc.replace(u" ", u"_")
2723  return desc
2724 
def description(self, force=False, cellml=False)
Definition: pycml.py:2670

◆ dimensionally_equivalent()

def CellMLToNektar.pycml.dimensionally_equivalent (   self,
  other_units 
)
Return True iff other_units is dimensionally equivalent to self.

As per appendix C.2.2, two units definitions have dimensional
equivalence if, when each is recursively expanded and
simplified into a product of base units, each has the same set
of base units with the same exponent on corresponding base units.

Definition at line 3185 of file pycml.py.

References CellMLToNektar.pycml.simplify().

Referenced by CellMLToNektar.CellMLToNektarTranslator.CellMLToNektarTranslator.generate_interface().

3185  def dimensionally_equivalent(self, other_units):
3186  """Return True iff other_units is dimensionally equivalent to self.
3187 
3188  As per appendix C.2.2, two units definitions have dimensional
3189  equivalence if, when each is recursively expanded and
3190  simplified into a product of base units, each has the same set
3191  of base units with the same exponent on corresponding base units.
3192  """
3193  u1 = self.expand().simplify()
3194  if isinstance(other_units, UnitsSet):
3195  other_units = other_units.extract()
3196  u2 = other_units.expand().simplify()
3197  # Build dictionaries mapping base_unit_obj to exponent.
3198  d1, d2 = {}, {}
3199  if u1.is_base_unit():
3200  d1[u1] = 1
3201  else:
3202  for u in u1.unit:
3203  d1[u.get_units_element()] = u.get_exponent()
3204  if u2.is_base_unit():
3205  d2[u2] = 1
3206  else:
3207  for u in u2.unit:
3208  d2[u.get_units_element()] = u.get_exponent()
3209  # Compare keys: do u1 & u2 have the same set of base units?
3210  sym_diff = set(d1.keys()) ^ set(d2.keys())
3211  if sym_diff:
3212  dimensionless = self.get_units_by_name(u'dimensionless')
3213  if not sym_diff == set([dimensionless]):
3214  # Symmetric difference is non-empty, but not an ignorable
3215  # instance of dimensionless
3216  return False
3217  # Compare corresponding exponents
3218  for k in d1:
3219  try:
3220  if d1[k] != d2[k]: return False
3221  except KeyError:
3222  # One may have dimensionless as a key
3223  pass
3224  # We have a match!
3225  return True
3226 
3227 
def dimensionally_equivalent(self, other_units)
Definition: pycml.py:3185
def simplify(self, other_units=None, other_exponent=1)
Definition: pycml.py:2967

◆ equals()

def CellMLToNektar.pycml.equals (   self,
  other 
)
Compare 2 units elements for equality.

Two units are deemed equal if they are both dimensionally equivalent and have the same
multiplicative factor (to within a relative tolerance of 10^-6).

If both are simple units, they must also have the same offset.

Definition at line 2634 of file pycml.py.

References CellMLToNektar.pycml.get_multiplicative_factor(), and CellMLToNektar.pycml.get_offset().

Referenced by CellMLToNektar.processors.ModelModifier._convert_initial_value().

2634  def equals(self, other):
2635  """Compare 2 units elements for equality.
2636 
2637  Two units are deemed equal if they are both dimensionally equivalent and have the same
2638  multiplicative factor (to within a relative tolerance of 10^-6).
2639 
2640  If both are simple units, they must also have the same offset.
2641  """
2642  equal = isinstance(other, cellml_units) and \
2643  self.dimensionally_equivalent(other) and \
2644  self._rel_error_ok(self.expand().get_multiplicative_factor(),
2645  other.expand().get_multiplicative_factor(),
2646  1e-6)
2647  if equal and self.is_simple():
2648  equal = self._rel_error_ok(self.unit.get_offset(),
2649  other.unit.get_offset(),
2650  1e-6)
2651  return equal
2652 
def get_offset(self)
Definition: pycml.py:2899
def get_multiplicative_factor(self)
Definition: pycml.py:2876
def equals(self, other)
Definition: pycml.py:2634

◆ expand()

def CellMLToNektar.pycml.expand (   self)
Expand to a product of powers of base units.

Expand this units definition according to the algorithm given in appendix C.3.4 of the CellML spec.

Caches and returns the resulting <units> object, which will be
newly created if there are any changes made, or this object if not.

Definition at line 2730 of file pycml.py.

2730  def expand(self):
2731  """Expand to a product of powers of base units.
2732 
2733  Expand this units definition according to the algorithm given in appendix C.3.4 of the CellML spec.
2734 
2735  Caches and returns the resulting <units> object, which will be
2736  newly created if there are any changes made, or this object if not.
2737  """
2738  if self._cml_expanded is None:
2739  # Do the expansion
2740  if self.is_base_unit():
2741  # We are a base unit, so stop the recursion; the result is us
2742  self._cml_expanded = self
2743  elif self.is_simple():
2744  # Simple units definition, i.e. only one <unit> element,
2745  # exponent=1, and referenced units are simple or base.
2746  # Expand the units referenced by our <unit> element
2747  expanded_child = self.unit.get_units_element().expand()
2748  # Get our multiplicative factor & offset as numbers
2749  m1p1 = self.unit.get_multiplicative_factor()
2750  o1 = self.unit.get_offset()
2751  if expanded_child.is_base_unit():
2752  # New multiplier, etc. are just ours
2753  m_new = m1p1
2754  o_new = o1
2755  # Referenced units are expanded_child
2756  ref_obj_new = expanded_child
2757  else:
2758  # Get the multiplier & offset of our expanded child
2759  m2p2 = expanded_child.unit.get_multiplicative_factor()
2760  o2 = expanded_child.unit.get_offset()
2761  # Calculate new multiplier, etc. per Equation (11)
2762  m_new = m1p1*m2p2
2763  o_new = o1 + o2/m1p1
2764  # Referenced units are those referenced by expanded_child
2765  # These will be base units
2766  ref_obj_new = expanded_child.unit.get_units_element()
2767  # Create the new units & unit elements
2768  attrs = {u'name': self.name}
2769  self._cml_expanded = self.xml_create_element(u'units',
2770  NSS[u'cml'],
2771  attributes=attrs)
2772  self._cml_expanded._cml_generated = True
2773  attrs = {u'units': ref_obj_new.name,
2774  u'multiplier': unicode(m_new),
2775  u'offset': unicode(o_new)}
2776  unit = self.xml_create_element(u'unit', NSS[u'cml'],
2777  attributes=attrs)
2778  # Manually set the reference object for unit, since we have
2779  # it handy
2780  unit._set_units_element(ref_obj_new)
2781  self._cml_expanded.xml_append(unit)
2782  else:
2783  # Complex units definition, i.e. multiple <unit> elements,
2784  # or non-unitary exponent, at some point within this defn.
2785  # Create the new units element so we can add children to it
2786  attrs = {u'name': self.name}
2787  exp_units = self.xml_create_element(u'units', NSS[u'cml'],
2788  attributes=attrs)
2789  exp_units._cml_generated = True
2790  # Compute m_t (Equation (18)) expanding referenced
2791  # units as we go
2792  m_t = 1
2793  for unit in self.unit:
2794  m_t *= unit.get_multiplicative_factor() # * is assoc. :)
2795  # We'll need the exponent to modify units referenced
2796  # by this reference
2797  e = unit.get_exponent()
2798  # Expand referenced units
2799  exp_u = unit.get_units_element().expand()
2800  if exp_u.is_base_unit():
2801  # Create reference to exp_u
2802  attrs = {u'units': exp_u.name,
2803  u'exponent': unicode(e)}
2804  u = self.xml_create_element(u'unit', NSS[u'cml'],
2805  attributes=attrs)
2806  exp_units.xml_append(u)
2807  else:
2808  # Process units referenced by exp_u, which will be
2809  # base units.
2810  for u in exp_u.unit:
2811  m_t *= u.get_multiplicative_factor() ** e
2812  attrs = {u'units': u.units,
2813  u'exponent': unicode(
2814  u.get_exponent() * e)}
2815  u_new = u.xml_create_element(u'unit',
2816  NSS[u'cml'],
2817  attributes=attrs)
2818  exp_units.xml_append(u_new)
2819  # Set the multiplier for the expanded units to m_t.
2820  # Since a <units> elements doesn't have a multiplier
2821  # attribute, we set it on the first <unit> element.
2822  # Note that all the <unit> elements have been newly created,
2823  # so have an implicit multiplier of 1 currently.
2824  # Note also that the fact that each <unit> has an exponent
2825  # doesn't matter, since the exponent doesn't affect the
2826  # multiplier.
2827  # Alan pointed out a bug: if the <unit> elements are
2828  # in non-canonical order then we can get identical
2829  # units (according to the intended canonical form)
2830  # comparing as non-equal, because expansion put the
2831  # multiplicative factor on different <unit> elements
2832  # in each case. Hence we have to put the factor on
2833  # the first <unit> element according to a canonical
2834  # sorting order.
2835  # TODO: Be a bit cleverer about this? In the base unit case
2836  # above we could do exp_units.xml_append(unit.clone()) and
2837  # not have its multiplicative factor contributing to m_t.
2838  # Would then need to multiply here, since first unit may
2839  # already have multiplier != 1.
2840  # Alternative idea from Alan: I have just noticed that
2841  # when expanding a complex units definition based on a
2842  # complex units definition, we can get away with not
2843  # sorting the unit elements. All that is required is
2844  # to create a new unit element which type is
2845  # dimensionless and value of its multiplier attribute
2846  # m*10^(p*e). This avoids having to sort things and
2847  # propagating the multiplier attribute...
2848  first_unit = sorted(exp_units.unit, key=lambda u: u.units)[0]
2849  first_unit.multiplier = unicode(m_t)
2850  # Cache result
2851  self._cml_expanded = exp_units
2852  # Set parent of the expanded units to be our parent
2853  self._cml_expanded.xml_parent = self.xml_parent
2854  # Returned the cached result
2855  return self._cml_expanded
2856 
def expand(self)
Definition: pycml.py:2730
def get_offset(self)
Definition: pycml.py:2899
def get_multiplicative_factor(self)
Definition: pycml.py:2876

◆ extract()

def CellMLToNektar.pycml.extract (   self,
  check_equality = False 
)
Return these units.

Used for interface compatibility with UnitsSet.

Definition at line 2657 of file pycml.py.

Referenced by CellMLToNektar.pycml.mathml_units_mixin._add_units_conversion(), CellMLToNektar.pycml.mathml._ensure_units_exist(), CellMLToNektar.pycml.mathml_eq._set_in_units(), CellMLToNektar.processors.InterfaceGenerator._split_ode(), Geometry_Init(), CellMLToNektar.pycml.mathml_ci.get_units(), Nektar::Utilities::ProcessOptiExtract.Process(), and Nektar::Utilities::ProcessJac.Process().

2657  def extract(self, check_equality=False):
2658  """Return these units.
2659 
2660  Used for interface compatibility with UnitsSet."""
2661  return self
2662 
def extract(self, check_equality=False)
Definition: pycml.py:2657

◆ get_multiplicative_factor()

def CellMLToNektar.pycml.get_multiplicative_factor (   self)
Return the multiplicative factor of this units definition.

The multiplicative factor of a units definition can be defined as
the product of the multiplicative factors of its unit children.

Definition at line 2876 of file pycml.py.

Referenced by CellMLToNektar.pycml.mathml_units_mixin_equalise_operands._set_in_units(), CellMLToNektar.pycml.mathml_units_mixin_choose_nearest._set_in_units(), CellMLToNektar.pycml.equals(), and CellMLToNektar.pycml.UnitsSet.extract().

2876  def get_multiplicative_factor(self):
2877  """Return the multiplicative factor of this units definition.
2878 
2879  The multiplicative factor of a units definition can be defined as
2880  the product of the multiplicative factors of its unit children.
2881  """
2882  m = reduce(operator.mul,
2883  map(lambda unit: unit.get_multiplicative_factor(),
2884  getattr(self, u'unit', [])),
2885  1)
2886  return m
2887 
def get_multiplicative_factor(self)
Definition: pycml.py:2876

◆ get_multiplier()

def CellMLToNektar.pycml.get_multiplier (   self)
Return the multiplier of this units definition.

The multiplier of a units definition can be defined as the product
of the multipliers of its unit children.

Definition at line 2888 of file pycml.py.

2888  def get_multiplier(self):
2889  """Return the multiplier of this units definition.
2890 
2891  The multiplier of a units definition can be defined as the product
2892  of the multipliers of its unit children.
2893  """
2894  return reduce(operator.mul,
2895  map(lambda unit: unit.get_multiplier(),
2896  getattr(self, u'unit', [])),
2897  1)
2898 
def get_multiplier(self)
Definition: pycml.py:2888

◆ get_offset()

def CellMLToNektar.pycml.get_offset (   self)
Return the offset associated with this units definition.

If these are simple units, return the offset on our unit child.
Otherwise, return 0.

Definition at line 2899 of file pycml.py.

Referenced by CellMLToNektar.pycml.equals(), CellMLToNektar.pycml.UnitsSet.extract(), and CellMLToNektar.pycml.cellml_units.uniquify_tuple().

2899  def get_offset(self):
2900  """Return the offset associated with this units definition.
2901 
2902  If these are simple units, return the offset on our unit child.
2903  Otherwise, return 0.
2904  """
2905  if self.is_simple():
2906  o = self.unit.get_offset()
2907  else:
2908  o = 0
2909  return o
2910 
def get_offset(self)
Definition: pycml.py:2899

◆ get_units_by_name()

def CellMLToNektar.pycml.get_units_by_name (   self,
  uname 
)

◆ import_processors()

def CellMLToNektar.pycml.import_processors ( )
Lazy import.

Definition at line 84 of file pycml.py.

Referenced by CellMLToNektar.pycml.cellml_model.add_units_conversions().

84 def import_processors():
85  """Lazy import."""
86  global processors
87  if processors is None:
88  import processors
89 
90 
def import_processors()
Definition: pycml.py:84

◆ is_base_unit()

def CellMLToNektar.pycml.is_base_unit (   self)
Return True iff this is a base units definition.

Definition at line 2857 of file pycml.py.

2857  def is_base_unit(self):
2858  """Return True iff this is a base units definition."""
2859  return getattr(self, u'base_units', u'no') == u'yes'
def is_base_unit(self)
Definition: pycml.py:2857

◆ is_simple()

def CellMLToNektar.pycml.is_simple (   self)
Return True iff this is a simple units definition.

Units are simple if:
  there is 1 <unit> element
  the exponent is omitted or has value 1.0
  the referenced units are simple or base units

Definition at line 2860 of file pycml.py.

2860  def is_simple(self):
2861  """Return True iff this is a simple units definition.
2862 
2863  Units are simple if:
2864  there is 1 <unit> element
2865  the exponent is omitted or has value 1.0
2866  the referenced units are simple or base units
2867  """
2868  simple = False
2869  if not self.is_base_unit() and len(self.unit) == 1:
2870  if self.unit.get_exponent() == 1.0:
2871  u = self.unit.get_units_element()
2872  if u.is_base_unit() or u.is_simple():
2873  simple = True
2874  return simple
2875 
def is_simple(self)
Definition: pycml.py:2860

◆ make_xml_binder()

def CellMLToNektar.pycml.make_xml_binder ( )

Helpful utility functions #.

Create a specialised binder, given some mappings from element names
to python classes, and setting namespace prefixes.

Definition at line 168 of file pycml.py.

Referenced by CellMLToNektar.pycml.amara_parse_cellml().

168 def make_xml_binder():
169  """
170  Create a specialised binder, given some mappings from element names
171  to python classes, and setting namespace prefixes.
172  """
173  binder = amara.bindery.binder(prefixes=NSS)
174  binder.set_binding_class(NSS[u'cml'], "model", cellml_model)
175  binder.set_binding_class(NSS[u'cml'], "component", cellml_component)
176  binder.set_binding_class(NSS[u'cml'], "variable", cellml_variable)
177  binder.set_binding_class(NSS[u'cml'], "units", cellml_units)
178  binder.set_binding_class(NSS[u'cml'], "unit", cellml_unit)
179  for mathml_elt in ['math', 'degree', 'logbase', 'otherwise',
180  'diff', 'plus', 'minus', 'times', 'divide',
181  'exp', 'ln', 'log', 'abs', 'power', 'root',
182  'leq', 'geq', 'lt', 'gt', 'eq', 'neq',
183  'rem',
184  'ci', 'cn', 'apply', 'piecewise', 'piece',
185  'sin', 'cos', 'tan', 'arcsin', 'arccos', 'arctan']:
186  exec "binder.set_binding_class(NSS[u'm'], '%s', mathml_%s)" % (mathml_elt, mathml_elt)
187  binder.set_binding_class(NSS[u'm'], "and_", mathml_and)
188  binder.set_binding_class(NSS[u'm'], "or_", mathml_or)
189  return binder
190 
def make_xml_binder()
Helpful utility functions #.
Definition: pycml.py:168

◆ model()

def CellMLToNektar.pycml.model (   self)

Definition at line 2654 of file pycml.py.

Referenced by Nektar::NekMeshUtils::CADSystemCFI.GetBoundingBox(), and Nektar::NekMeshUtils::CADSystemCFI.LoadCAD().

2654  def model(self):
2655  return self.rootNode.model
2656 
def model(self)
Definition: pycml.py:2654

◆ quotient()

def CellMLToNektar.pycml.quotient (   self,
  other_units 
)
Form the quotient of two units definitions.

This method does not simplify the resulting units.
Quotient units will be cached.

Definition at line 3154 of file pycml.py.

Referenced by CellMLToNektar.processors.InterfaceGenerator._split_ode().

3154  def quotient(self, other_units):
3155  """Form the quotient of two units definitions.
3156 
3157  This method does not simplify the resulting units.
3158  Quotient units will be cached.
3159  """
3160  if not other_units in self._cml_quotients:
3161  # Create new <units> element
3162  self.units_name_counter[0] += 1
3163  uname = u'___units_' + str(self.units_name_counter[0])
3164  quotient_units = self.xml_create_element(
3165  u'units', NSS[u'cml'], attributes={u'name': uname})
3166  quotient_units._cml_generated = True
3167  quotient_units.xml_parent = self._best_parent(other_units)
3168  # Invent references to the constituent units
3169  u = self.xml_create_element(u'unit', NSS[u'cml'],
3170  attributes={u'units': self.name})
3171  u._set_units_element(self)
3172  quotient_units.xml_append(u)
3173  u = self.xml_create_element(u'unit', NSS[u'cml'],
3174  attributes={u'units': self.name,
3175  u'exponent': u'-1'})
3176  u._set_units_element(other_units)
3177  quotient_units.xml_append(u)
3178  # Cache
3179  if self.model._is_new_units_obj(quotient_units):
3180  quotient_units.xml_parent.add_units(uname, quotient_units)
3181  quotient_units = self.model._get_units_obj(quotient_units)
3182  self._cml_quotients[other_units] = quotient_units
3183  return self._cml_quotients[other_units]
3184 
def quotient(self, other_units)
Definition: pycml.py:3154

◆ same_tree()

def CellMLToNektar.pycml.same_tree (   self,
  other,
  this = None 
)
Check whether this element represents the same tree as a given element.

Definition at line 3897 of file pycml.py.

3897  def same_tree(self, other, this=None):
3898  """Check whether this element represents the same tree as a given element."""
3899  if this is None: this = self
3900  equal = (this.localName == other.localName
3901  and len(getattr(this, 'xml_children', [])) == len(getattr(other, 'xml_children', [])))
3902  if equal and this.localName in [u'cn', u'ci']:
3903  equal = unicode(this) == unicode(other)
3904  if equal and hasattr(this, 'xml_children'):
3905  for tc, oc in zip(self.xml_element_children(this), self.xml_element_children(other)):
3906  if not self.same_tree(oc, tc):
3907  equal = False
3908  break
3909  return equal
3910 
def same_tree(self, other, this=None)
Definition: pycml.py:3897

◆ simplify()

def CellMLToNektar.pycml.simplify (   self,
  other_units = None,
  other_exponent = 1 
)
Simplify these units.

Create a new <units> element representing a simplified version of
this element.  This implements the algorithm of appendix C.3.1.  It
is however slightly different, in order to allow for units
conversions rather than just preserving dimensional equivalence.

If other_units is not None, then produce a simplified version of
the product of these units and other_units.  other_units are
considered to be raised to the power of other_exponent (so a
quotient can be performed by passing other_exponent=-1).  Note that
other_exponent should have numeric type.

If other_units is a UnitsSet, then we construct a UnitsSet
containing self, and call the simplify method on that, thus
returning a UnitsSet instance.

Multiplicative factors on the original <unit> objects are
maintained on the generated references, by taking the product of
all factors from <unit> objects that contribute to the new <unit>
object.  Note that this means that we may need to retain a
reference to dimensionless with a multiplier, for example if the
quotient of centimetres by metres is taken.

Offsets are only permitted on simple units, so may not appear where
there are multiple <unit> elements.  Hence when a product of units
is taken, any offsets are discarded.

Definition at line 2967 of file pycml.py.

Referenced by CellMLToNektar.pycml.mathml_units_mixin._add_units_conversion(), CellMLToNektar.pycml.dimensionally_equivalent(), and CellMLToNektar.CellMLToNektarTranslator.CellMLToNektarTranslator.generate_interface().

2967  def simplify(self, other_units=None, other_exponent=1):
2968  """Simplify these units.
2969 
2970  Create a new <units> element representing a simplified version of
2971  this element. This implements the algorithm of appendix C.3.1. It
2972  is however slightly different, in order to allow for units
2973  conversions rather than just preserving dimensional equivalence.
2974 
2975  If other_units is not None, then produce a simplified version of
2976  the product of these units and other_units. other_units are
2977  considered to be raised to the power of other_exponent (so a
2978  quotient can be performed by passing other_exponent=-1). Note that
2979  other_exponent should have numeric type.
2980 
2981  If other_units is a UnitsSet, then we construct a UnitsSet
2982  containing self, and call the simplify method on that, thus
2983  returning a UnitsSet instance.
2984 
2985  Multiplicative factors on the original <unit> objects are
2986  maintained on the generated references, by taking the product of
2987  all factors from <unit> objects that contribute to the new <unit>
2988  object. Note that this means that we may need to retain a
2989  reference to dimensionless with a multiplier, for example if the
2990  quotient of centimetres by metres is taken.
2991 
2992  Offsets are only permitted on simple units, so may not appear where
2993  there are multiple <unit> elements. Hence when a product of units
2994  is taken, any offsets are discarded.
2995  """
2996  if isinstance(other_units, UnitsSet):
2997  # Use the set version of simplify
2998  return UnitsSet([self]).simplify(other_units, other_exponent)
2999 
3000  # Check for result in cache (see #1714)
3001  if (other_units, other_exponent) in self._cml_simplified:
3002  return self._cml_simplified[(other_units, other_exponent)]
3003 
3004  # Make a list of all <unit> elements to be included
3005  units = []
3006  if self.is_base_unit():
3007  # We are a base unit, so invent a reference to ourselves
3008  u = self.xml_create_element(u'unit', NSS[u'cml'],
3009  attributes={u'units': self.name})
3010  u.xml_parent = self # Hack, but it might need a parent...
3011  u._set_units_element(self)
3012  units.append(u)
3013  else:
3014  units = list(self.unit)
3015  our_unit_elements = frozenset(units)
3016  other_unit_elements = None
3017  if not other_units is None:
3018  if other_units.is_base_unit():
3019  # other_units are base units, so invent a reference
3020  attrs = {u'units': other_units.name,
3021  u'exponent': unicode(other_exponent)}
3022  u = self.xml_create_element(u'unit', NSS[u'cml'],
3023  attributes=attrs)
3024  u.xml_parent = other_units
3025  u._set_units_element(other_units)
3026  units.append(u)
3027  if other_exponent == 1:
3028  other_unit_elements = frozenset([u])
3029  else:
3030  if other_exponent == 1:
3031  units.extend(list(other_units.unit))
3032  other_unit_elements = frozenset(other_units.unit)
3033  else:
3034  for unit in other_units.unit:
3035  # Need to create a new <unit> element with different
3036  # exponent and multiplier
3037  u = unit.clone()
3038  u.exponent = unicode(other_exponent *
3039  u.get_exponent())
3040  u.multiplier = unicode(u.get_multiplier() **
3041  other_exponent)
3042  units.append(u)
3043  # Sort <unit> elements according to the <units> objects they
3044  # reference
3045  dimensionless = self.get_units_by_name(u'dimensionless')
3046  d = {dimensionless: []}
3047  for unit in units:
3048  obj = unit.get_units_element()
3049  if obj in d:
3050  d[obj].append(unit)
3051  else:
3052  d[obj] = [unit]
3053  # Collapse equivalent units references into a single reference.
3054  # That is, all references to the same object get collapsed into a new
3055  # reference to that object with different exponent, etc.
3056  for obj in d.keys():
3057  if obj != dimensionless and len(d[obj]) > 1:
3058  # Sum the exponents
3059  expt = sum(map(lambda u: u.get_exponent(), d[obj]))
3060  # If exponents cancel, replace with ref to dimensionless
3061  if expt == 0:
3062  attrs = {u'units': u'dimensionless'}
3063  else:
3064  attrs = {u'units': d[obj][0].units,
3065  u'exponent': unicode(expt)}
3066  # Compute the multiplier for the new unit reference, as
3067  # the product of multiplicative factors on the originals
3068  m = reduce(operator.mul,
3069  map(lambda u: u.get_multiplicative_factor(),
3070  d[obj]))
3071  attrs[u'multiplier'] = unicode(m)
3072  # Create a new reference
3073  new = self.xml_create_element(u'unit', NSS[u'cml'],
3074  attributes=attrs)
3075  new.xml_parent = self
3076  if expt == 0:
3077  # Note an extra reference to dimensionless...
3078  d[dimensionless].append(new)
3079  # ...and remove the references to obj from d
3080  del d[obj]
3081  else:
3082  d[obj] = new
3083  elif obj != dimensionless and d[obj]:
3084  # d[obj] is a singleton list. Create a new reference and
3085  # store it instead (a new reference is needed to avoid
3086  # altering the linked list from self.unit).
3087  d[obj] = d[obj][0].clone()
3088  # Note d must have at least one key, namely dimensionless
3089  # If dimensionless is referenced in addition to other units,
3090  # remove the references to dimensionless.
3091  # But remember the multipliers!
3092  m = reduce(operator.mul,
3093  map(lambda u: u.get_multiplicative_factor(),
3094  d[dimensionless]),
3095  1)
3096  if m == 1:
3097  del d[dimensionless]
3098  else:
3099  # Retain a single reference to dimensionless, with the
3100  # combined multiplier.
3101  d[dimensionless] = d[dimensionless][0].clone()
3102  d[dimensionless].multiplier = unicode(m)
def simplify(self, other_units=None, other_exponent=1)
Definition: pycml.py:2967

◆ varobj()

def CellMLToNektar.pycml.varobj (   self,
  ci_elt 
)
Return the variable object for the given ci element.

This method is more general than ci_elt.variable, working even
for ci elements outside of a component.  Such elements *must*
contain a fully qualified variable name, i.e. including the
name of the component the variable occurs in.  This method
handles a variety of encodings of variable names that contain
the component name.

Definition at line 3853 of file pycml.py.

3853  def varobj(self, ci_elt):
3854  """Return the variable object for the given ci element.
3855 
3856  This method is more general than ci_elt.variable, working even
3857  for ci elements outside of a component. Such elements *must*
3858  contain a fully qualified variable name, i.e. including the
3859  name of the component the variable occurs in. This method
3860  handles a variety of encodings of variable names that contain
3861  the component name.
3862  """
3863  try:
3864  var = ci_elt.variable
3865  except:
3866  varname = unicode(ci_elt).strip()
3867  var = cellml_variable.get_variable_object(self.model, varname)
3868  return var
3869 
def varobj(self, ci_elt)
Definition: pycml.py:3853

◆ vars_in()

def CellMLToNektar.pycml.vars_in (   self,
  expr 
)
Return a list of 'variable' objects used in the given expression.

This method doesn't make use of the dependency information
generated when validating the model, but parses the
mathematics afresh.  It is used to refresh the dependency
lists after partial evaluation, and to determine dependencies
in mathematics added outside the normal model structure
(e.g. Jacobian calculation).

If an ODE appears, includes the mathml_apply instance defining
the ODE.  Otherwise all returned objects will be
cellml_variable instances.

Definition at line 3870 of file pycml.py.

3870  def vars_in(self, expr):
3871  """Return a list of 'variable' objects used in the given expression.
3872 
3873  This method doesn't make use of the dependency information
3874  generated when validating the model, but parses the
3875  mathematics afresh. It is used to refresh the dependency
3876  lists after partial evaluation, and to determine dependencies
3877  in mathematics added outside the normal model structure
3878  (e.g. Jacobian calculation).
3879 
3880  If an ODE appears, includes the mathml_apply instance defining
3881  the ODE. Otherwise all returned objects will be
3882  cellml_variable instances.
3883  """
3884  res = set()
3885  if isinstance(expr, mathml_ci):
3886  res.add(self.varobj(expr))
3887  elif isinstance(expr, mathml_apply) and \
3888  expr.operator().localName == u'diff':
3889  dep_var = self.varobj(expr.ci)
3890  indep_var = self.varobj(expr.bvar.ci)
3891  res.add(dep_var.get_ode_dependency(indep_var))
3892  elif hasattr(expr, 'xml_children'):
3893  for child in expr.xml_children:
3894  res.update(self.vars_in(child))
3895  return res
3896 
def vars_in(self, expr)
Definition: pycml.py:3870

Variable Documentation

◆ __version__

list CellMLToNektar.pycml.__version__ = "$Revision: 25949 $"[11:-2]
private

Definition at line 91 of file pycml.py.

◆ _cml_expanded

CellMLToNektar.pycml._cml_expanded
private

Definition at line 2742 of file pycml.py.

◆ _cml_generated

CellMLToNektar.pycml._cml_generated
private

Definition at line 3128 of file pycml.py.

◆ attrs

dictionary CellMLToNektar.pycml.attrs = {(u'cml:units', NSS[u'cml']): units.name}

Definition at line 3847 of file pycml.py.

◆ base_units

CellMLToNektar.pycml.base_units

Definition at line 2948 of file pycml.py.

◆ BINDING_TIMES

CellMLToNektar.pycml.BINDING_TIMES = Enum('static', 'dynamic')

Definition at line 161 of file pycml.py.

◆ cellml

CellMLToNektar.pycml.cellml

Definition at line 3835 of file pycml.py.

◆ CELLML_SUBSET_ELTS

CellMLToNektar.pycml.CELLML_SUBSET_ELTS
Initial value:
1 = frozenset(
2  ['math', 'cn', 'sep', 'ci', 'apply', 'piecewise', 'piece', 'otherwise',
3  'eq', 'neq', 'gt', 'lt', 'geq', 'leq',
4  'plus', 'minus', 'times', 'divide', 'power', 'root', 'abs',
5  'exp', 'ln', 'log', 'floor', 'ceiling', 'factorial',
6  'and', 'or', 'not', 'xor',
7  'diff', 'degree', 'bvar', 'logbase',
8  'sin', 'cos', 'tan', 'sec', 'csc', 'cot',
9  'sinh', 'cosh', 'tanh', 'sech', 'csch', 'coth',
10  'arcsin', 'arccos', 'arctan', 'arcsec', 'arccsc', 'arccot',
11  'arcsinh', 'arccosh', 'arctanh', 'arcsech', 'arccsch', 'arccoth',
12  'true', 'false', 'notanumber', 'pi', 'infinity', 'exponentiale',
13  'semantics', 'annotation', 'annotation-xml'])

Definition at line 146 of file pycml.py.

◆ format

CellMLToNektar.pycml.format

◆ level

CellMLToNektar.pycml.level

◆ msg

string CellMLToNektar.pycml.msg = "Adding units " + units.name + " as "

◆ name

CellMLToNektar.pycml.name

Definition at line 3835 of file pycml.py.

Referenced by Nektar::LibUtilities::Interpreter::ExpressionEvaluator.AddConstant(), Nektar::LibUtilities::SessionReader.CreateInstance(), export_DisContField_Helper(), export_Geom(), Nektar::LibUtilities::H5::Group.GetElementNames(), Nektar::SolverUtils::EquationSystem.GetFunction(), Nektar::LibUtilities::H5::CanHaveGroupsDataSets::LinkIterator.GetName(), Nektar::LibUtilities::Interpreter::ExpressionEvaluator.GetParameter(), Nektar::SolverUtils::EquationSystem.GetSession(), Nektar::LibUtilities::H5::CanHaveGroupsDataSets::LinkIterator.helper(), Nektar::LibUtilities::H5::CanHaveAttributes::AttrIterator.helper(), Nektar::NekMeshUtils::CADSystemOCE.LoadCAD(), main(), Nektar::SolverUtils::FilterFieldConvert.OutputField(), Nektar::Utilities::InputMCF.Process(), Nektar::FieldUtils::OutputFileBase.Process(), Nektar::NekMeshUtils::ProcessLoadCAD.Process(), Nektar::FieldUtils::ProcessMean.Process(), Nektar::Utilities::ProcessVarOpti.Process(), Nektar::Utilities::InputStar.ReadBoundaryFaces(), Nektar::SolverUtils::RiemannSolver.SetAuxScal(), Nektar::SolverUtils::RiemannSolver.SetAuxVec(), Nektar::SolverUtils::RiemannSolver.SetParam(), Nektar::LibUtilities::Interpreter::ExpressionEvaluator.SetParameter(), Nektar::SolverUtils::RiemannSolver.SetScalar(), Nektar::SolverUtils::RiemannSolver.SetVector(), Nektar::SolverUtils::DriverArpack.v_Execute(), Nektar::Poisson.v_GenerateSummary(), Nektar::Projection.v_GenerateSummary(), and Nektar::SolverUtils::RiemannSolver.~RiemannSolver().

◆ new_units

def CellMLToNektar.pycml.new_units = dimensionless

print "Keeping d'less ref with m =",m,"from", print self.description(), if other_units: print "and",other_units.description() else: print

print "Adding",uname,hash(new_units),new_units.description()

print ".simplify", uname

Definition at line 3113 of file pycml.py.

◆ NSS

dictionary CellMLToNektar.pycml.NSS
Initial value:
1 = {u'm' : u'http://www.w3.org/1998/Math/MathML',
2  u'cml': u'http://www.cellml.org/cellml/1.0#',
3  # Our extensions; URIs will probably change?
4  u'pe': u'https://chaste.comlab.ox.ac.uk/cellml/ns/partial-evaluation#',
5  u'lut': u'https://chaste.comlab.ox.ac.uk/cellml/ns/lookup-tables',
6  u'solver': u'https://chaste.comlab.ox.ac.uk/cellml/ns/solver-info',
7  u'oxmeta': u'https://chaste.comlab.ox.ac.uk/cellml/ns/oxford-metadata#',
8  u'pycml': u'https://chaste.comlab.ox.ac.uk/cellml/ns/pycml#',
9  u'proto': u'https://chaste.cs.ox.ac.uk/nss/protocol/0.1#',
10  # Metadata-related
11  u'cmeta' : u"http://www.cellml.org/metadata/1.0#",
12  u'rdf' : u"http://www.w3.org/1999/02/22-rdf-syntax-ns#",
13  u'dc' : u"http://purl.org/dc/elements/1.1/",
14  u'dcterms': u"http://purl.org/dc/terms/",
15  u'bqs' : u"http://www.cellml.org/bqs/1.0#",
16  u'vCard' : u"http://www.w3.org/2001/vcard-rdf/3.0#",
17  u'cg' : u"http://www.cellml.org/metadata/graphs/1.0#",
18  u'cs' : u"http://www.cellml.org/metadata/simulation/1.0#",
19  u'csub' : u"http://www.cellml.org/metadata/custom_subset/1.0#",
20  u'bqbiol' : u"http://biomodels.net/biology-qualifiers/",
21  # Temporary documentation namespace
22  u'doc' : u"http://cellml.org/tmp-documentation"
23  }

Definition at line 116 of file pycml.py.

◆ processors

CellMLToNektar.pycml.processors = None

Definition at line 83 of file pycml.py.

◆ stream

CellMLToNektar.pycml.stream

Definition at line 102 of file pycml.py.

◆ uname

string CellMLToNektar.pycml.uname = u'___units_' + str(self.units_name_counter[0])

Definition at line 3124 of file pycml.py.

◆ unit_elements

CellMLToNektar.pycml.unit_elements = set(d.values())

Definition at line 3116 of file pycml.py.

◆ units

CellMLToNektar.pycml.units = self.model._get_units_obj(units)

_u = units

print "Adding",units.name, hash(units), units.description(), print "(was",id(_u),"now",id(units),")" Ensure referenced units exist

Definition at line 3825 of file pycml.py.

◆ units_name_counter

list CellMLToNektar.pycml.units_name_counter = [0]

Definition at line 2966 of file pycml.py.

◆ VarTypes

CellMLToNektar.pycml.VarTypes
Initial value:
1 = Enum('Unknown', 'Free', 'State', 'MaybeConstant', 'Constant',
2  'Computed', 'Mapped')
def Enum(names)
Definition: enum.py:8

Definition at line 142 of file pycml.py.

◆ WARNING_TRANSLATE_ERROR

CellMLToNektar.pycml.WARNING_TRANSLATE_ERROR

Definition at line 108 of file pycml.py.

◆ xml_parent

CellMLToNektar.pycml.xml_parent

Definition at line 3130 of file pycml.py.