Source code for pybamm.models.submodels.electrolyte_diffusion.full_diffusion

#
# Class for electrolyte diffusion employing stefan-maxwell
#
import numpy as np

import pybamm

from .base_electrolyte_diffusion import BaseElectrolyteDiffusion


[docs] class Full(BaseElectrolyteDiffusion): """Class for conservation of mass in the electrolyte employing the Stefan-Maxwell constitutive equations. (Full refers to unreduced by asymptotic methods) Parameters ---------- param : parameter class The parameters to use for this submodel options : dict, optional A dictionary of options to be passed to the model. """ def __init__(self, param, options=None): super().__init__(param, options)
[docs] def get_fundamental_variables(self): eps_c_e_dict = {} for domain in self.options.whole_cell_domains: Domain = domain.capitalize() eps_c_e_k = pybamm.Variable( f"{Domain} porosity times concentration [mol.m-3]", domain=domain, auxiliary_domains={"secondary": "current collector"}, bounds=(0, np.inf), scale=self.param.c_e_init_av, ) eps_c_e_k.print_name = f"eps_c_e_{domain[0]}" eps_c_e_dict[domain] = eps_c_e_k variables = self._get_standard_porosity_times_concentration_variables( eps_c_e_dict ) return variables
[docs] def get_coupled_variables(self, variables): c_e_dict = {} for domain in self.options.whole_cell_domains: Domain = domain.capitalize() eps_k = variables[f"{Domain} porosity"] eps_c_e_k = variables[f"{Domain} porosity times concentration [mol.m-3]"] c_e_k = eps_c_e_k / eps_k c_e_dict[domain] = c_e_k variables["Electrolyte concentration concatenation [mol.m-3]"] = ( pybamm.concatenation(*c_e_dict.values()) ) variables.update(self._get_standard_domain_concentration_variables(c_e_dict)) c_e = ( variables["Porosity times concentration [mol.m-3]"] / variables["Porosity"] ) variables.update(self._get_standard_whole_cell_concentration_variables(c_e)) # Whole domain tor = variables["Electrolyte transport efficiency"] i_e = variables["Electrolyte current density [A.m-2]"] v_box = variables["Volume-averaged velocity [m.s-1]"] T = variables["Cell temperature [K]"] N_e_diffusion = -tor * self.param.D_e(c_e, T) * pybamm.grad(c_e) N_e_migration = self.param.t_plus(c_e, T) * i_e / self.param.F N_e_convection = c_e * v_box N_e = N_e_diffusion + N_e_migration + N_e_convection variables.update(self._get_standard_flux_variables(N_e)) variables.update( { "Electrolyte diffusion flux [mol.m-2.s-1]": N_e_diffusion, "Electrolyte migration flux [mol.m-2.s-1]": N_e_migration, "Electrolyte convection flux [mol.m-2.s-1]": N_e_convection, } ) return variables
[docs] def set_rhs(self, variables): eps_c_e = variables["Porosity times concentration [mol.m-3]"] c_e = variables["Electrolyte concentration [mol.m-3]"] N_e = variables["Electrolyte flux [mol.m-2.s-1]"] div_Vbox = variables["Transverse volume-averaged acceleration [m.s-2]"] sum_s_a_j = variables["Sum of electrolyte reaction source terms [A.m-3]"] sum_s_a_j.print_name = "aj" source_terms = sum_s_a_j / self.param.F self.rhs = {eps_c_e: -pybamm.div(N_e) + source_terms - c_e * div_Vbox}
[docs] def set_initial_conditions(self, variables): eps_c_e = variables["Porosity times concentration [mol.m-3]"] self.initial_conditions = { eps_c_e: self.param.epsilon_init * self.param.c_e_init }
[docs] def set_boundary_conditions(self, variables): c_e = variables["Electrolyte concentration [mol.m-3]"] c_e_conc = variables["Electrolyte concentration concatenation [mol.m-3]"] T = variables["Cell temperature [K]"] tor = variables["Electrolyte transport efficiency"] i_boundary_cc = variables["Current collector current density [A.m-2]"] def flux_bc(side): # returns the flux at a separator/electrode interface # assuming v_box = 0 for now return ( pybamm.boundary_value( -(1 - self.param.t_plus(c_e, T)) / (tor * self.param.D_e(c_e, T) * self.param.F), side, ) * i_boundary_cc ) if self.options.whole_cell_domains[0] == "negative electrode": # left bc at anode/current collector interface lbc = pybamm.Scalar(0) elif self.options.whole_cell_domains[0] == "separator": # left bc at anode/separator interface lbc = flux_bc("left") if self.options.whole_cell_domains[-1] == "positive electrode": # right bc at cathode/current collector interface rbc = pybamm.Scalar(0) # elif self.options.whole_cell_domains[-1] == "separator": # # right bc at separator/cathode interface # rbc = flux_bc("right") # add boundary conditions to both forms of the concentration self.boundary_conditions = { c_e: {"left": (lbc, "Neumann"), "right": (rbc, "Neumann")}, c_e_conc: {"left": (lbc, "Neumann"), "right": (rbc, "Neumann")}, }