-
-
Notifications
You must be signed in to change notification settings - Fork 606
/
Copy pathfickian_single_particle.py
92 lines (68 loc) · 2.88 KB
/
fickian_single_particle.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#
# Class for a single particle with Fickian diffusion
#
import pybamm
from .base_fickian_particle import BaseModel
class SingleParticle(BaseModel):
"""Base class for molar conservation in a single x-averaged particle which employs
Fick's law.
Parameters
----------
param : parameter class
The parameters to use for this submodel
domain : str
The domain of the model either 'Negative' or 'Positive'
**Extends:** :class:`pybamm.particle.fickian.BaseModel`
"""
def __init__(self, param, domain):
super().__init__(param, domain)
def get_fundamental_variables(self):
if self.domain == "Negative":
c_s_xav = pybamm.standard_variables.c_s_n_xav
c_s = pybamm.SecondaryBroadcast(c_s_xav, ["negative electrode"])
elif self.domain == "Positive":
c_s_xav = pybamm.standard_variables.c_s_p_xav
c_s = pybamm.SecondaryBroadcast(c_s_xav, ["positive electrode"])
variables = self._get_standard_concentration_variables(c_s, c_s_xav)
return variables
def get_coupled_variables(self, variables):
c_s_xav = variables[
"X-averaged " + self.domain.lower() + " particle concentration"
]
T_k_xav = pybamm.PrimaryBroadcast(
variables["X-averaged " + self.domain.lower() + " electrode temperature"],
[self.domain.lower() + " particle"],
)
N_s_xav = self._flux_law(c_s_xav, T_k_xav)
N_s = pybamm.SecondaryBroadcast(N_s_xav, [self._domain.lower() + " electrode"])
variables.update(self._get_standard_flux_variables(N_s, N_s_xav))
return variables
def set_rhs(self, variables):
c, N, _ = self._unpack(variables)
if self.domain == "Negative":
self.rhs = {c: -(1 / self.param.C_n) * pybamm.div(N)}
elif self.domain == "Positive":
self.rhs = {c: -(1 / self.param.C_p) * pybamm.div(N)}
def _unpack(self, variables):
c_s_xav = variables[
"X-averaged " + self.domain.lower() + " particle concentration"
]
N_s_xav = variables["X-averaged " + self.domain.lower() + " particle flux"]
j_av = variables[
"X-averaged "
+ self.domain.lower()
+ " electrode interfacial current density"
]
return c_s_xav, N_s_xav, j_av
def set_initial_conditions(self, variables):
"""
For single particle models, initial conditions can't depend on x so we
arbitrarily evaluate them at x=0 in the negative electrode and x=1 in the
positive electrode (they will usually be constant)
"""
c, _, _ = self._unpack(variables)
if self.domain == "Negative":
c_init = self.param.c_n_init(0)
elif self.domain == "Positive":
c_init = self.param.c_p_init(1)
self.initial_conditions = {c: c_init}