Source code for pybamm.models.submodels.interface.open_circuit_potential.msmr_ocp

#
# Open-circuit potential from the Multi-Species Multi-Reaction framework
#
import pybamm

from . import BaseOpenCircuitPotential


[docs] class MSMROpenCircuitPotential(BaseOpenCircuitPotential): """ Class for open-circuit potential within the Multi-Species Multi-Reaction framework :footcite:t:`Baker2018`. The thermodynamic model is presented in :footcite:t:`Verbrugge2017`, along with parameter values for a number of substitutional materials. """ def __init__( self, param, domain, reaction, options, phase="primary", x_average=False ): super().__init__( param, domain, reaction, options=options, phase=phase, x_average=x_average ) pybamm.citations.register("Baker2018")
[docs] 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" ] ocp_surf = variables[ f"{Domain} {phase_name}particle surface potential distribution [V]" ] # If variable was broadcast, take only the orphan if ( isinstance(sto_surf, pybamm.Broadcast) and isinstance(ocp_surf, pybamm.Broadcast) and isinstance(T, pybamm.Broadcast) ): sto_surf = sto_surf.orphans[0] ocp_surf = ocp_surf.orphans[0] T = T.orphans[0] T = pybamm.PrimaryBroadcast(T, [f"{domain} particle size"]) else: sto_surf = variables[ f"{Domain} {phase_name}particle surface stoichiometry" ] ocp_surf = variables[ f"{Domain} {phase_name}particle surface potential [V]" ] # If variable was broadcast, take only the orphan if ( isinstance(sto_surf, pybamm.Broadcast) and isinstance(ocp_surf, pybamm.Broadcast) and isinstance(T, pybamm.Broadcast) ): sto_surf = sto_surf.orphans[0] ocp_surf = ocp_surf.orphans[0] T = T.orphans[0] ocp_bulk = variables[f"Average {domain} {phase_name}particle potential [V]"] dUdT = self.phase_param.dUdT(sto_surf) variables.update(self._get_standard_ocp_variables(ocp_surf, ocp_bulk, dUdT)) self._alias_ocp_as_equilibrium(variables) return variables