From a12085c95abc4eee5c15cfa5671ac1c870a206e4 Mon Sep 17 00:00:00 2001 From: Sudhir Kushwaha Date: Wed, 14 May 2025 11:31:44 -0400 Subject: [PATCH 1/2] Added OCP model to take temperature as input --- .../rk_ocp_temp_dependent.py | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/pybamm/models/submodels/interface/open_circuit_potential/rk_ocp_temp_dependent.py diff --git a/src/pybamm/models/submodels/interface/open_circuit_potential/rk_ocp_temp_dependent.py b/src/pybamm/models/submodels/interface/open_circuit_potential/rk_ocp_temp_dependent.py new file mode 100644 index 0000000000..769bf4a527 --- /dev/null +++ b/src/pybamm/models/submodels/interface/open_circuit_potential/rk_ocp_temp_dependent.py @@ -0,0 +1,60 @@ +# +# Single open-circuit potential, same for charge and discharge +# +import pybamm +from . import BaseOpenCircuitPotential + + +class RKOpenCircuitPotential(BaseOpenCircuitPotential): + """ Class for the Open Circuit Potential for implementing RK-Polynomial method + taking stoichimetry and temperature as input""" + + def get_coupled_variables(self, variables): + domain, Domain = self.domain_Domain + phase_name = self.phase_name + + if self.reaction == "lithium-ion main": + T = variables[f"{Domain} electrode temperature [K]"] + # For "particle-size distribution" models, take distribution version + # of c_s_surf that depends on particle size. + domain_options = getattr(self.options, domain) + if domain_options["particle size"] == "distribution": + sto_surf = variables[ + f"{Domain} {phase_name}particle surface stoichiometry distribution" + ] + # If variable was broadcast, take only the orphan + if isinstance(sto_surf, pybamm.Broadcast) and isinstance( + T, pybamm.Broadcast + ): + sto_surf = sto_surf.orphans[0] + T = T.orphans[0] + T = pybamm.PrimaryBroadcast(T, [f"{domain} {phase_name}particle size"]) + else: + sto_surf = variables[ + f"{Domain} {phase_name}particle surface stoichiometry" + ] + # If variable was broadcast, take only the orphan + if isinstance(sto_surf, pybamm.Broadcast) and isinstance( + T, pybamm.Broadcast + ): + sto_surf = sto_surf.orphans[0] + T = T.orphans[0] + + inputs = { + f"{Domain} particle stoichiometry": sto_surf, + f"{Domain} electrode temperature [k]": T, + } + + OCP_surf = pybamm.FunctionParameter( + f"{Domain} electrode RK_OCP [V]", inputs + ) + + dUdT = self.phase_param.dUdT(sto_surf) + + # Bulk OCP is from the average SOC and temperature + sto_bulk = variables[f"{Domain} electrode {phase_name}stoichiometry"] + T_bulk = pybamm.xyzs_average(T) + ocp_bulk = self.phase_param.U(sto_bulk, T_bulk) + + variables.update(self._get_standard_ocp_variables(OCP_surf, ocp_bulk, dUdT)) + return variables From 6f2e46f0b96a4285b524b561f4e3168a0f8407f6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 14 May 2025 16:00:05 +0000 Subject: [PATCH 2/2] style: pre-commit fixes --- .../interface/open_circuit_potential/rk_ocp_temp_dependent.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pybamm/models/submodels/interface/open_circuit_potential/rk_ocp_temp_dependent.py b/src/pybamm/models/submodels/interface/open_circuit_potential/rk_ocp_temp_dependent.py index 769bf4a527..9acd76ee77 100644 --- a/src/pybamm/models/submodels/interface/open_circuit_potential/rk_ocp_temp_dependent.py +++ b/src/pybamm/models/submodels/interface/open_circuit_potential/rk_ocp_temp_dependent.py @@ -6,9 +6,9 @@ class RKOpenCircuitPotential(BaseOpenCircuitPotential): - """ Class for the Open Circuit Potential for implementing RK-Polynomial method + """Class for the Open Circuit Potential for implementing RK-Polynomial method taking stoichimetry and temperature as input""" - + def get_coupled_variables(self, variables): domain, Domain = self.domain_Domain phase_name = self.phase_name