Source code for festim.source
import numpy as np
import ufl
from dolfinx import fem
from festim.helpers import Value
from festim.species import Species
from festim.subdomain.volume_subdomain import VolumeSubdomain
[docs]
class SourceBase:
"""Source base class.
Args:
value: the value of the source
volume: the volume subdomains where the source is applied
Attributes:
value: the value of the source
volume: the volume subdomains where the source is applied
"""
value: (
float
| int
| fem.Constant
| np.ndarray
| fem.Expression
| ufl.core.expr.Expr
| fem.Function
)
volume: VolumeSubdomain
def __init__(
self,
value: (
float
| int
| fem.Constant
| np.ndarray
| fem.Expression
| ufl.core.expr.Expr
| fem.Function
| Value
),
volume: VolumeSubdomain,
):
self.value = value
self.volume = volume
@property
def value(self):
return self._value
@value.setter
def value(self, value):
if isinstance(value, Value):
self._value = value
else:
self._value = Value(value)
@property
def volume(self):
return self._volume
@volume.setter
def volume(self, value):
# check that volume is festim.VolumeSubdomain
if not isinstance(value, VolumeSubdomain):
raise TypeError("volume must be of type festim.VolumeSubdomain")
self._volume = value
[docs]
class ParticleSource(SourceBase):
"""Particle source class.
Args:
value: the value of the source
volume: the volume subdomains where the source is applied
species: the species to which the source is applied
Attributes:
value: the value of the source
volume: the volume subdomains where the source is applied
species: the species to which the source is applied
Examples:
.. highlight:: python
.. code-block:: python
from festim import ParticleSource
ParticleSource(volume=my_vol, value=1, species="H")
ParticleSource(volume=my_vol, value=lambda x: 1 + x[0], species="H")
ParticleSource(volume=my_vol, value=lambda t: 1 + t, species="H")
ParticleSource(volume=my_vol, value=lambda T: 1 + T, species="H")
ParticleSource(volume=my_vol, value=lambda x, t: 1 + x[0] + t, species="H")
"""
species: Species
def __init__(self, value, volume, species: Species):
self.species = species
super().__init__(value, volume)
@property
def species(self):
return self._species
@species.setter
def species(self, value):
# check that species is festim.Species or list of festim.Species
if not isinstance(value, Species):
raise TypeError("species must be of type festim.Species")
self._species = value
[docs]
class HeatSource(SourceBase):
"""Heat source class.
Args:
value: the value of the source
volume: the volume subdomains where the source is applied
Attributes:
value: the value of the source
volume: the volume subdomains where the source is applied
Examples:
.. highlight:: python
.. code-block:: python
from festim import HeatSource
HeatSource(volume=my_vol, value=1)
HeatSource(volume=my_vol, value=lambda x: 1 + x[0])
HeatSource(volume=my_vol, value=lambda t: 1 + t)
HeatSource(volume=my_vol, value=lambda x, t: 1 + x[0] + t)
"""
def __init__(self, value, volume):
super().__init__(value, volume)
if self.value.temperature_dependent:
raise ValueError("Heat source cannot be temperature dependent")