Skip to content

Commit

Permalink
first implementation of decay on mobile and traps
Browse files Browse the repository at this point in the history
  • Loading branch information
RemDelaporteMathurin committed Jan 15, 2024
1 parent 621769f commit 4132ad8
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 3 deletions.
1 change: 1 addition & 0 deletions festim/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@

from .sources.source import Source
from .sources.source_implantation_flux import ImplantationFlux
from .sources.radioactive_decay import RadioactiveDecay

from .materials.material import Material
from .materials.materials import Materials
Expand Down
5 changes: 4 additions & 1 deletion festim/concentration/mobile.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from festim import Concentration, FluxBC, k_B, R
from festim import Concentration, FluxBC, k_B, R, RadioactiveDecay
from fenics import *
import sympy as sp

Expand Down Expand Up @@ -132,6 +132,9 @@ def create_source_form(self, dx):
volumes = source.volume
else:
volumes = [source.volume]
if isinstance(source, RadioactiveDecay):
source.value = -source.form(self.mobile_concentration())

for volume in volumes:
F_source += -source.value * self.test_function * dx(volume)
if isinstance(source.value, (Expression, UserExpression)):
Expand Down
4 changes: 3 additions & 1 deletion festim/concentration/traps/trap.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from festim import Concentration, k_B, Material, Theta
from festim import Concentration, k_B, Material, Theta, RadioactiveDecay
from fenics import *
import sympy as sp
import numpy as np
Expand Down Expand Up @@ -204,6 +204,8 @@ def create_source_form(self, dx):
dx (fenics.Measure): the dx measure of the sim
"""
for source in self.sources:
if isinstance(source, RadioactiveDecay):
source.value = -source.form(self.solution)
self.F_source = -source.value * self.test_function * dx(source.volume)
self.F += self.F_source
self.sub_expressions.append(source.value)
14 changes: 13 additions & 1 deletion festim/generic_simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,19 @@ def attribute_source_terms(self):

# set sources
for source in self.sources:
field_to_object[source.field].sources.append(source)
if isinstance(source, festim.RadioactiveDecay) and source.field == "all":
# this could be refactored if sources accept several fields
# (e.g. festim.Source(field=["0", "T"]))
# for field in source.field:
# field_to_object[field].sources.append(source)

# create list of all unique festim.Concentration objects in field_to_object
# and assign source to each of them
for obj in set(field_to_object.values()):
if isinstance(obj, festim.Concentration):
obj.sources.append(source)
else:
field_to_object[source.field].sources.append(source)

def attribute_boundary_conditions(self):
"""Assigns boundary_conditions to mobile and T"""
Expand Down
10 changes: 10 additions & 0 deletions festim/sources/radioactive_decay.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from festim import Source


class RadioactiveDecay(Source):
def __init__(self, decay_constant, volume, field="all") -> None:
self.decay_constant = decay_constant
super().__init__(value=None, volume=volume, field=field)

def form(self, concentration):
return self.decay_constant * concentration

0 comments on commit 4132ad8

Please sign in to comment.