Source code for festim.concentration.concentration

from fenics import *
import sympy as sp


[docs] class Concentration: """Class for concentrations (solute or traps) with attributed fenics.Function objects for the solution and the previous solution and a fenics.TestFunction Args: solution (fenics.Function or ufl.Indexed): Solution for "current" timestep previous_solution (fenics.Function or ufl.Indexed): Solution for "previous" timestep test_function (fenics.TestFunction or ufl.Indexed): test function """ def __init__(self, solution=None, previous_solution=None, test_function=None): self.solution = solution self.previous_solution = previous_solution self.test_function = test_function self.sub_expressions = [] self.F = None self.post_processing_solution = None # used for post treatment
[docs] def initialise(self, V, value, label=None, time_step=None): """Assign a value to self.previous_solution Args: V (fenics.FunctionSpace): the function space value (sp.Add, float, int, str): the value of the initialisation. label (str, optional): the label in the XDMF file. Defaults to None. time_step (int, optional): the time step to read in the XDMF file. Defaults to None. """ # TODO : do we need V here? can it be retrieved from self.solution? # not if indexed (several components) comp = self.get_comp(V, value, label=label, time_step=time_step) comp = interpolate(comp, V) assign(self.previous_solution, comp)
def get_comp(self, V, value, label=None, time_step=None): if type(value) == str and value.endswith(".xdmf"): comp = Function(V) with XDMFFile(value) as f: f.read_checkpoint(comp, label, time_step) else: value = sp.printing.ccode(value) comp = Expression(value, degree=3, t=0) return comp