Source code for festim.concentration.traps.traps
import festim
import fenics as f
[docs]
class Traps(list):
"""
A list of festim.Trap objects
"""
def __init__(self, *args):
# checks that input is list
if len(args) == 0:
super().__init__()
else:
if not isinstance(*args, list):
raise TypeError("festim.Traps must be a list")
super().__init__(self._validate_trap(item) for item in args[0])
self.F = None
self.extrinsic_formulations = []
self.sub_expressions = []
def __setitem__(self, index, item):
super().__setitem__(index, self._validate_trap(item))
[docs]
def insert(self, index, item):
super().insert(index, self._validate_trap(item))
[docs]
def append(self, item):
super().append(self._validate_trap(item))
[docs]
def extend(self, other):
if isinstance(other, type(self)):
super().extend(other)
else:
super().extend(self._validate_trap(item) for item in other)
def _validate_trap(self, value):
if isinstance(value, festim.Trap):
return value
raise TypeError("festim.Traps must be a list of festim.Trap")
def make_traps_materials(self, materials):
for trap in self:
trap.make_materials(materials)
def assign_traps_ids(self):
for i, trap in enumerate(self, 1):
if trap.id is None:
trap.id = i
def create_forms(self, mobile, materials, T, dx, dt=None):
self.F = 0
for trap in self:
trap.create_form(mobile, materials, T, dx, dt=dt)
self.F += trap.F
self.sub_expressions += trap.sub_expressions
def get_trap(self, id):
for trap in self:
if trap.id == id:
return trap
raise ValueError("Couldn't find trap {}".format(id))
[docs]
def initialise_extrinsic_traps(self, V):
"""Add functions to ExtrinsicTrapBase objects for density form"""
for trap in self:
if isinstance(trap, festim.ExtrinsicTrapBase):
trap.density = [f.Function(V)]
trap.density_test_function = f.TestFunction(V)
trap.density_previous_solution = f.project(f.Constant(0), V)
[docs]
def define_variational_problem_extrinsic_traps(self, dx, dt, T):
"""
Creates the variational formulations for the extrinsic traps densities
Args:
dx (fenics.Measure): the dx measure of the sim
dt (festim.Stepsize): If None assuming steady state.
T (festim.Temperature): the temperature of the simulation
"""
self.extrinsic_formulations = []
expressions_extrinsic = []
for trap in self:
if isinstance(trap, festim.ExtrinsicTrapBase):
trap.create_form_density(dx, dt, T)
self.extrinsic_formulations.append(trap.form_density)
self.sub_expressions.extend(expressions_extrinsic)
def define_newton_solver_extrinsic_traps(self):
for trap in self:
if isinstance(trap, festim.ExtrinsicTrapBase):
trap.define_newton_solver()
def solve_extrinsic_traps(self):
for trap in self:
if isinstance(trap, festim.ExtrinsicTrapBase):
du_t = f.TrialFunction(trap.density[0].function_space())
J_t = f.derivative(trap.form_density, trap.density[0], du_t)
problem = festim.Problem(J_t, trap.form_density, [])
f.begin(
"Solving nonlinear variational problem."
) # Add message to fenics logs
trap.newton_solver.solve(problem, trap.density[0].vector())
f.end()
def update_extrinsic_traps_density(self):
for trap in self:
if isinstance(trap, festim.ExtrinsicTrapBase):
trap.density_previous_solution.assign(trap.density[0])