From 0d03550c902287a4c2c1bfef60b0e702aa3e9d4b Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Thu, 13 May 2021 22:01:38 -0700 Subject: [PATCH 01/57] changed temperature parameter into T0 --- configs/params_system.cfg | 4 ++-- mpet/io_utils.py | 6 +++--- mpet/mod_cell.py | 4 ++-- mpet/mod_electrodes.py | 12 ++++++------ 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/configs/params_system.cfg b/configs/params_system.cfg index 4f6cd20c..a45203da 100644 --- a/configs/params_system.cfg +++ b/configs/params_system.cfg @@ -47,8 +47,8 @@ tsteps = 200 relTol = 1e-6 # Absolute Tolerance absTol = 1e-6 -# Temperature, K -T = 298 +# Initial Temperature throughout electrode, K +T0 = 298 # Random seed. Set to true to give a random seed in the simulation # (affects noise, particle size distribution). Set to true exactly # reproducible results -- useful for testing. diff --git a/mpet/io_utils.py b/mpet/io_utils.py index 706db4f7..d545c232 100644 --- a/mpet/io_utils.py +++ b/mpet/io_utils.py @@ -91,7 +91,7 @@ def get_dicts_from_configs(P_s, P_e, paramfile): ndD_s["prevDir"] = os.path.normpath(os.path.join(dir,ndD_s["prevDir"])) ndD_s["tsteps"] = P_s.getint('Sim Params', 'tsteps') - Tabs = dD_s["Tabs"] = P_s.getfloat('Sim Params', 'T') + T0abs = dD_s["T0abs"] = P_s.getfloat('Sim Params', 'T0') dD_s["Rser"] = P_s.getfloat('Sim Params', 'Rser') ndD_s["dataReporter"] = P_s.get('Sim Params', 'dataReporter', fallback='mat') ndD_s["Nvol"] = {"a": P_s.getint('Sim Params', 'Nvol_a'), @@ -256,7 +256,7 @@ def get_dicts_from_configs(P_s, P_e, paramfile): Rser_ref = dD_s["Rser_ref"] = (k*T_ref/e) / (curr_ref*dD_s["CrateCurr"]) # Some nondimensional parameters - ndD_s["T"] = Tabs / T_ref + ndD_s["T0"] = T0abs / T_ref ndD_s["Rser"] = dD_s["Rser"] / Rser_ref ndD_s["Dp"] = Dp / D_ref ndD_s["Dm"] = Dm / D_ref @@ -326,7 +326,7 @@ def get_dicts_from_configs(P_s, P_e, paramfile): ndD_e[trode]["B"] = dD_e[trode]['B']/(k*T_ref*N_A*dD_e[trode]['cs_ref']) if dD_e[trode]["EvdW"] is not None: ndD_e[trode]["EvdW"] = dD_e[trode]["EvdW"] / (k*T_ref) - muRfunc = props_am.muRfuncs(ndD_s["T"], ndD_e[trode]).muRfunc + muRfunc = props_am.muRfuncs(ndD_s["T0"], ndD_e[trode]).muRfunc cs0bar = ndD_s["cs0"][trode] cs0 = np.array([cs0bar]) Type = ndD_e[trode]['type'] diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index fb0a63f3..438169f6 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -329,7 +329,7 @@ def DeclareEquations(self): # phiWall = -eta + phi_cell [- T*ln(c)] phiWall = -eta + self.phi_cell() if ndD["elyteModelType"] == "dilute": - phiWall -= ndD["T"]*np.log(cWall) + phiWall -= ndD["T0"]*np.log(cWall) # phiWall = 0.5 * (phitmp[0] + phitmp[1]) eqP.Residual = phiWall - .5*(phitmp[0] + phitmp[1]) # We have a porous anode -- no flux of charge or anions through current collector @@ -465,7 +465,7 @@ def DeclareEquations(self): def get_lyte_internal_fluxes(c_lyte, phi_lyte, disc, ndD): zp, zm, nup, num = ndD["zp"], ndD["zm"], ndD["nup"], ndD["num"] nu = nup + num - T = ndD["T"] + T = ndD["T0"] dxd1 = disc["dxd1"] eps_o_tau = disc["eps_o_tau"] diff --git a/mpet/mod_electrodes.py b/mpet/mod_electrodes.py index 57b86c5e..6796b95f 100644 --- a/mpet/mod_electrodes.py +++ b/mpet/mod_electrodes.py @@ -78,7 +78,7 @@ def DeclareEquations(self): dae.daeModel.DeclareEquations(self) ndD = self.ndD N = ndD["N"] # number of grid points in particle - T = self.ndD_s["T"] # nondimensional temperature + T = self.ndD_s["T0"] # nondimensional temperature r_vec, volfrac_vec = geo.get_unit_solid_discr(ndD['shape'], N) # Prepare the Ideal Solution log ratio terms @@ -151,7 +151,7 @@ def DeclareEquations(self): def sld_dynamics_0D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises): ndD = self.ndD - T = self.ndD_s["T"] + T = self.ndD_s["T0"] c1_surf = c1 c2_surf = c2 (mu1R_surf, mu2R_surf), (act1R_surf, act2R_surf) = (calc_muR( @@ -183,7 +183,7 @@ def sld_dynamics_0D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises): def sld_dynamics_1D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises): ndD = self.ndD N = ndD["N"] - T = self.ndD_s["T"] + T = self.ndD_s["T0"] # Equations for concentration evolution # Mass matrix, M, where M*dcdt = RHS, where c and RHS are vectors Mmat = get_Mmat(ndD['shape'], N) @@ -314,7 +314,7 @@ def DeclareEquations(self): dae.daeModel.DeclareEquations(self) ndD = self.ndD N = ndD["N"] # number of grid points in particle - T = self.ndD_s["T"] # nondimensional temperature + T = self.ndD_s["T0"] # nondimensional temperature r_vec, volfrac_vec = geo.get_unit_solid_discr(ndD['shape'], N) # Prepare the Ideal Solution log ratio terms @@ -369,7 +369,7 @@ def DeclareEquations(self): def sld_dynamics_0D1var(self, c, muO, act_lyte, ISfuncs, noise): ndD = self.ndD - T = self.ndD_s["T"] + T = self.ndD_s["T0"] c_surf = c muR_surf, actR_surf = calc_muR(c_surf, self.cbar(), T, ndD, ISfuncs) eta = calc_eta(muR_surf, muO) @@ -388,7 +388,7 @@ def sld_dynamics_0D1var(self, c, muO, act_lyte, ISfuncs, noise): def sld_dynamics_1D1var(self, c, muO, act_lyte, ISfuncs, noise): ndD = self.ndD N = ndD["N"] - T = self.ndD_s["T"] + T = self.ndD_s["T0"] # Equations for concentration evolution # Mass matrix, M, where M*dcdt = RHS, where c and RHS are vectors Mmat = get_Mmat(ndD['shape'], N) From 11d380efdfe7b983f42bc8e68ee66b25b36d5b2e Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Sun, 16 May 2021 14:13:41 -0700 Subject: [PATCH 02/57] added temperature as a cell level variable --- mpet/daeVariableTypes.py | 3 +++ mpet/mod_cell.py | 50 +++++++++++++++++++++++++++++----------- mpet/sim.py | 10 ++++++++ 3 files changed, 50 insertions(+), 13 deletions(-) diff --git a/mpet/daeVariableTypes.py b/mpet/daeVariableTypes.py index be994d10..86eefd9c 100644 --- a/mpet/daeVariableTypes.py +++ b/mpet/daeVariableTypes.py @@ -10,3 +10,6 @@ elec_pot_t = dae.daeVariableType( name="elec_pot_t", units=dae.unit(), lowerBound=-1e20, upperBound=1e20, initialGuess=0, absTolerance=1.e-6) +temp_t = dae.daeVariableType( + name="temp_t", units=dae.unit(), lowerBound=0, + upperBound=1e20, initialGuess=1, absTolerance=1.e-6) diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index 438169f6..78361f85 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -18,7 +18,7 @@ import mpet.ports as ports import mpet.props_elyte as props_elyte import mpet.utils as utils -from mpet.daeVariableTypes import mole_frac_t, elec_pot_t, conc_t +from mpet.daeVariableTypes import mole_frac_t, elec_pot_t, conc_t, temp_t # Dictionary of end conditions endConditions = { @@ -62,6 +62,7 @@ def __init__(self, Name, Parent=None, Description="", ndD_s=None, self.phi_part = {} self.R_Vp = {} self.ffrac = {} + self.T_lyte = {} for trode in trodes: # Concentration/potential in electrode regions of elyte self.c_lyte[trode] = dae.daeVariable( @@ -87,6 +88,10 @@ def __init__(self, Name, Parent=None, Description="", ndD_s=None, self.ffrac[trode] = dae.daeVariable( "ffrac_{trode}".format(trode=trode), mole_frac_t, self, "Overall filling fraction of solids in electrodes") + self.T_lyte[trode] = dae.daeVariable( + "T_lyte_{trode}".format(trode=trode), temp_t, self, + "Temperature in the elyte in electrode {trode}".format(trode=trode), + [self.DmnCell[trode]]) if Nvol["s"] >= 1: # If we have a separator self.c_lyte["s"] = dae.daeVariable( "c_lyte_s", conc_t, self, @@ -96,6 +101,10 @@ def __init__(self, Name, Parent=None, Description="", ndD_s=None, "phi_lyte_s", elec_pot_t, self, "Electrostatic potential in electrolyte in separator", [self.DmnCell["s"]]) + self.T_lyte["s"] = dae.daeVariable( + "T_lyte_s", temp_t, self, + "Temperature in electrolyte in separator", + [self.DmnCell["s"]]) # Note if we're doing a single electrode volume simulation # It will be in a perfect bath of electrolyte at the applied # potential. @@ -288,18 +297,24 @@ def DeclareEquations(self): eq.Residual = self.c_lyte["c"].dt(0) - 0 eq = self.CreateEquation("phi_lyte") eq.Residual = self.phi_lyte["c"](0) - self.phi_cell() + eq = self.CreateEquation("T_lyte") + eq.Residual = self.T_lyte["c"].dt(0) - 0 else: disc = geom.get_elyte_disc(Nvol, ndD["L"], ndD["poros"], ndD["BruggExp"]) cvec = utils.get_asc_vec(self.c_lyte, Nvol) dcdtvec = utils.get_asc_vec(self.c_lyte, Nvol, dt=True) phivec = utils.get_asc_vec(self.phi_lyte, Nvol) + Tvec = utils.get_asc_vec(self.T_lyte, Nvol) + dTdtvec = utils.get_asc_vec(self.T_lyte, Nvol, dt=True) Rvvec = utils.get_asc_vec(self.R_Vp, Nvol) # Apply concentration and potential boundary conditions # Ghost points on the left and no-gradients on the right ctmp = np.hstack((self.c_lyteGP_L(), cvec, cvec[-1])) + # temperature uses a constant boundary condition + Ttmp = np.hstack((Tvec[0], Tvec, Tvec[-1])) phitmp = np.hstack((self.phi_lyteGP_L(), phivec, phivec[-1])) - Nm_edges, i_edges = get_lyte_internal_fluxes(ctmp, phitmp, disc, ndD) + Nm_edges, i_edges, q_edges = get_lyte_internal_fluxes(ctmp, phitmp, Ttmp, disc, ndD) # If we don't have a porous anode: # 1) the total current flowing into the electrolyte is set @@ -313,6 +328,7 @@ def DeclareEquations(self): # We assume BV kinetics with alpha = 0.5, # exchange current density, ecd = k0_foil * c_lyte**(0.5) cWall = .5*(ctmp[0] + ctmp[1]) + TWall = .5*(Ttmp[0] + Ttmp[1]) ecd = ndD["k0_foil"]*cWall**0.5 # -current = ecd*(exp(-eta/2) - exp(eta/2)) # note negative current because positive current is @@ -329,7 +345,7 @@ def DeclareEquations(self): # phiWall = -eta + phi_cell [- T*ln(c)] phiWall = -eta + self.phi_cell() if ndD["elyteModelType"] == "dilute": - phiWall -= ndD["T0"]*np.log(cWall) + phiWall -= TWall*np.log(cWall) # phiWall = 0.5 * (phitmp[0] + phitmp[1]) eqP.Residual = phiWall - .5*(phitmp[0] + phitmp[1]) # We have a porous anode -- no flux of charge or anions through current collector @@ -339,6 +355,7 @@ def DeclareEquations(self): dvgNm = np.diff(Nm_edges)/disc["dxvec"] dvgi = np.diff(i_edges)/disc["dxvec"] + dvgq = np.diff(q_edges)/disc["dxvec"] for vInd in range(Nlyte): # Mass Conservation (done with the anion, although "c" is neutral salt conc) eq = self.CreateEquation("lyte_mass_cons_vol{vInd}".format(vInd=vInd)) @@ -346,6 +363,10 @@ def DeclareEquations(self): # Charge Conservation eq = self.CreateEquation("lyte_charge_cons_vol{vInd}".format(vInd=vInd)) eq.Residual = -dvgi[vInd] + ndD["zp"]*Rvvec[vInd] + # Energy Conservation + eq = self.CreateEquation("lyte_energy_cons_vol{vInd}".format(vInd=vInd)) + eq.Residual = disc["porosvec"][vInd]*dTdtvec[vInd] - dvgq[vInd] # do we add heat generation from current blah? + # Define the total current. This must be done at the capacity # limiting electrode because currents are specified in @@ -462,45 +483,48 @@ def DeclareEquations(self): setVariableValues=[(self.endCondition, 2)]) -def get_lyte_internal_fluxes(c_lyte, phi_lyte, disc, ndD): +def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, ndD): zp, zm, nup, num = ndD["zp"], ndD["zm"], ndD["nup"], ndD["num"] nu = nup + num - T = ndD["T0"] dxd1 = disc["dxd1"] eps_o_tau = disc["eps_o_tau"] # Get concentration at cell edges using weighted mean wt = utils.pad_vec(disc["dxvec"]) c_edges_int = utils.weighted_linear_mean(c_lyte, wt) + T_edges_int = utils.weighted_linear_mean(T_lyte, wt) if ndD["elyteModelType"] == "dilute": # Get porosity at cell edges using weighted harmonic mean eps_o_tau_edges = utils.weighted_linear_mean(eps_o_tau, wt) Dp = eps_o_tau_edges * ndD["Dp"] Dm = eps_o_tau_edges * ndD["Dm"] + #neglecting soret diffusion # Np_edges_int = nup*(-Dp*np.diff(c_lyte)/dxd1 # - Dp*zp*c_edges_int*np.diff(phi_lyte)/dxd1) Nm_edges_int = num*(-Dm*np.diff(c_lyte)/dxd1 - - Dm/T*zm*c_edges_int*np.diff(phi_lyte)/dxd1) + - Dm/T_edges_int*zm*c_edges_int*np.diff(phi_lyte)/dxd1) i_edges_int = (-((nup*zp*Dp + num*zm*Dm)*np.diff(c_lyte)/dxd1) - - (nup*zp**2*Dp + num*zm**2*Dm)/T*c_edges_int*np.diff(phi_lyte)/dxd1) + - (nup*zp**2*Dp + num*zm**2*Dm)/T_edges_int*c_edges_int*np.diff(phi_lyte)/dxd1) # i_edges_int = zp*Np_edges_int + zm*Nm_edges_int + q_edges_int = 0*np.diff(c_lyte) elif ndD["elyteModelType"] == "SM": D_fs, sigma_fs, thermFac, tp0 = getattr(props_elyte,ndD["SMset"])()[:-1] # Get diffusivity and conductivity at cell edges using weighted harmonic mean - D_edges = utils.weighted_harmonic_mean(eps_o_tau*D_fs(c_lyte, T), wt) - sigma_edges = utils.weighted_harmonic_mean(eps_o_tau*sigma_fs(c_lyte, T), wt) + D_edges = utils.weighted_harmonic_mean(eps_o_tau*D_fs(c_lyte, T_lyte), wt) + sigma_edges = utils.weighted_harmonic_mean(eps_o_tau*sigma_fs(c_lyte, T_lyte), wt) sp, n = ndD["sp"], ndD["n_refTrode"] # there is an error in the MPET paper, temperature dependence should be # in sigma and not outside of sigma i_edges_int = -sigma_edges * ( np.diff(phi_lyte)/dxd1 - + nu*T*(sp/(n*nup)+tp0(c_edges_int, T)/(zp*nup)) - * thermFac(c_edges_int, T) + + nu*T_edges_int*(sp/(n*nup)+tp0(c_edges_int, T_edges_int)/(zp*nup)) + * thermFac(c_edges_int, T_edges_int) * np.diff(np.log(c_lyte))/dxd1 ) Nm_edges_int = num*(-D_edges*np.diff(c_lyte)/dxd1 - + (1./(num*zm)*(1-tp0(c_edges_int, T))*i_edges_int)) - return Nm_edges_int, i_edges_int + + (1./(num*zm)*(1-tp0(c_edges_int, T_edges_int))*i_edges_int)) + q_edges_int = 0*np.diff(c_lyte) + return Nm_edges_int, i_edges_int, q_edges_int diff --git a/mpet/sim.py b/mpet/sim.py index d5e25bc5..cd4900c6 100644 --- a/mpet/sim.py +++ b/mpet/sim.py @@ -63,6 +63,7 @@ def SetUpVariables(self): Npart = ndD_s["Npart"] phi_cathode = ndD_s["phi_cathode"] if ndD_s["prevDir"] == "false": + # Set initial temperature # Solids for tr in ndD_s["trodes"]: cs0 = self.ndD_s['cs0'][tr] @@ -71,6 +72,8 @@ def SetUpVariables(self): for i in range(Nvol[tr]): # Guess initial volumetric reaction rates self.m.R_Vp[tr].SetInitialGuess(i, 0.0) + # set initial temperature condition + self.m.T_lyte[tr].SetInitialCondition(i, ndD_s["T0"]) # Guess initial value for the potential of the # electrodes if tr == "a": # anode @@ -121,12 +124,14 @@ def SetUpVariables(self): # Separator electrolyte initialization for i in range(Nvol["s"]): self.m.c_lyte["s"].SetInitialCondition(i, ndD_s['c0']) + self.m.T_lyte["s"].SetInitialCondition(i, ndD_s['T0']) self.m.phi_lyte["s"].SetInitialGuess(i, 0) # Anode and cathode electrolyte initialization for tr in ndD_s["trodes"]: for i in range(Nvol[tr]): self.m.c_lyte[tr].SetInitialCondition(i, ndD_s['c0']) + self.m.T_lyte[tr].SetInitialCondition(i, ndD_s['T0']) self.m.phi_lyte[tr].SetInitialGuess(i, 0) # Set electrolyte concentration in each particle @@ -153,6 +158,7 @@ def SetUpVariables(self): # Set the inlet port variables for each particle part.c_lyte.SetInitialGuess(data["c_lyte_" + tr][-1,i]) + # part.T_lyte.SetInitialGuess(data["T_lyte_" + tr][-1,i]) part.phi_lyte.SetInitialGuess(data["phi_lyte_" + tr][-1,i]) part.phi_m.SetInitialGuess(data["phi_bulk_" + tr][-1,i]) @@ -177,12 +183,16 @@ def SetUpVariables(self): for i in range(Nvol["s"]): self.m.c_lyte["s"].SetInitialCondition( i, data["c_lyte_s"][-1,i]) + self.m.T_lyte["s"].SetInitialCondition( + i, data["T_lyte_s"][-1,i]) self.m.phi_lyte["s"].SetInitialGuess( i, data["phi_lyte_s"][-1,i]) for tr in ndD_s["trodes"]: for i in range(Nvol[tr]): self.m.c_lyte[tr].SetInitialCondition( i, data["c_lyte_" + tr][-1,i]) + self.m.T_lyte[tr].SetInitialCondition( + i, data["T_lyte_" + tr][-1,i]) self.m.phi_lyte[tr].SetInitialGuess( i, data["phi_lyte_" + tr][-1,i]) From ad13f08f9391e941db6f304af629ea2da2543e0d Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Sun, 16 May 2021 16:38:39 -0700 Subject: [PATCH 03/57] added temperature port variable into particle scale model --- mpet/mod_cell.py | 4 ++++ mpet/mod_electrodes.py | 2 ++ mpet/ports.py | 3 +++ mpet/sim.py | 2 +- 4 files changed, 10 insertions(+), 1 deletion(-) diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index 78361f85..fc710169 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -214,6 +214,10 @@ def DeclareEquations(self): "portout_c_trode{trode}vol{vInd}".format(vInd=vInd, trode=trode)) eq.Residual = (self.c_lyte[trode](vInd) - self.portsOutLyte[trode][vInd].c_lyte()) + eq = self.CreateEquation( + "portout_T_trode{trode}vol{vInd}".format(vInd=vInd, trode=trode)) + eq.Residual = (self.T_lyte[trode](vInd) + - self.portsOutLyte[trode][vInd].T_lyte()) eq = self.CreateEquation( "portout_p_trode{trode}vol{vInd}".format(vInd=vInd, trode=trode)) phi_lyte = self.phi_lyte[trode](vInd) diff --git a/mpet/mod_electrodes.py b/mpet/mod_electrodes.py index 6796b95f..793b312f 100644 --- a/mpet/mod_electrodes.py +++ b/mpet/mod_electrodes.py @@ -71,6 +71,7 @@ def __init__(self, Name, Parent=None, Description="", ndD=None, "portInBulk", dae.eInletPort, self, "Inlet port from e- conducting phase") self.phi_lyte = self.portInLyte.phi_lyte + self.T_lyte = self.portInLyte.T_lyte self.c_lyte = self.portInLyte.c_lyte self.phi_m = self.portInBulk.phi_m @@ -307,6 +308,7 @@ def __init__(self, Name, Parent=None, Description="", ndD=None, "portInBulk", dae.eInletPort, self, "Inlet port from e- conducting phase") self.phi_lyte = self.portInLyte.phi_lyte + self.T_lyte = self.portInLyte.T_lyte self.c_lyte = self.portInLyte.c_lyte self.phi_m = self.portInBulk.phi_m diff --git a/mpet/ports.py b/mpet/ports.py index 6689fd1b..0c1686c6 100644 --- a/mpet/ports.py +++ b/mpet/ports.py @@ -10,6 +10,9 @@ def __init__(self, Name, PortType, Model, Description=""): self.c_lyte = dae.daeVariable( "c_lyte", mole_frac_t, self, "Concentration in the electrolyte") + self.T_lyte = dae.daeVariable( + "T_lyte", mole_frac_t, self, + "Temperature in the electrolyte") self.phi_lyte = dae.daeVariable( "phi_lyte", elec_pot_t, self, "Electric potential in the electrolyte") diff --git a/mpet/sim.py b/mpet/sim.py index cd4900c6..c549a568 100644 --- a/mpet/sim.py +++ b/mpet/sim.py @@ -158,7 +158,7 @@ def SetUpVariables(self): # Set the inlet port variables for each particle part.c_lyte.SetInitialGuess(data["c_lyte_" + tr][-1,i]) - # part.T_lyte.SetInitialGuess(data["T_lyte_" + tr][-1,i]) + part.T_lyte.SetInitialGuess(data["T_lyte_" + tr][-1,i]) part.phi_lyte.SetInitialGuess(data["phi_lyte_" + tr][-1,i]) part.phi_m.SetInitialGuess(data["phi_bulk_" + tr][-1,i]) From 427b3a6e8278efddbe4e8c8d487ced07a7711e7f Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Sun, 16 May 2021 22:12:43 -0700 Subject: [PATCH 04/57] moved temperature variable in props_am --- mpet/io_utils.py | 6 +-- mpet/mod_electrodes.py | 4 +- mpet/props_am.py | 118 ++++++++++++++++++++--------------------- 3 files changed, 62 insertions(+), 66 deletions(-) diff --git a/mpet/io_utils.py b/mpet/io_utils.py index d545c232..87b027e3 100644 --- a/mpet/io_utils.py +++ b/mpet/io_utils.py @@ -326,7 +326,7 @@ def get_dicts_from_configs(P_s, P_e, paramfile): ndD_e[trode]["B"] = dD_e[trode]['B']/(k*T_ref*N_A*dD_e[trode]['cs_ref']) if dD_e[trode]["EvdW"] is not None: ndD_e[trode]["EvdW"] = dD_e[trode]["EvdW"] / (k*T_ref) - muRfunc = props_am.muRfuncs(ndD_s["T0"], ndD_e[trode]).muRfunc + muRfunc = props_am.muRfuncs(ndD_e[trode]).muRfunc cs0bar = ndD_s["cs0"][trode] cs0 = np.array([cs0bar]) Type = ndD_e[trode]['type'] @@ -334,9 +334,9 @@ def get_dicts_from_configs(P_s, P_e, paramfile): cs0 = (cs0, cs0) cs0bar = (cs0bar, cs0bar) if Type in ndD_s["2varTypes"]: - ndD_e[trode]["muR_ref"] = -muRfunc(cs0, cs0bar, 0.)[0][0] + ndD_e[trode]["muR_ref"] = -muRfunc(cs0, cs0bar, ndD_s["T0"], 0.)[0][0] elif Type in ndD_s["1varTypes"]: - ndD_e[trode]["muR_ref"] = -muRfunc(cs0, cs0bar, 0.)[0] + ndD_e[trode]["muR_ref"] = -muRfunc(cs0, cs0bar, ndD_s["T0"], 0.)[0] ndD_s["phiRef"][trode] = -ndD_e[trode]["muR_ref"][0] Nvol, Npart = psd_raw[trode].shape # Electrode parameters which depend on the individual diff --git a/mpet/mod_electrodes.py b/mpet/mod_electrodes.py index 793b312f..8c2b9ec3 100644 --- a/mpet/mod_electrodes.py +++ b/mpet/mod_electrodes.py @@ -525,9 +525,9 @@ def calc_mu_O(c_lyte, phi_lyte, phi_sld, T, elyteModelType): def calc_muR(c, cbar, T, ndD, ISfuncs=None): - muRfunc = props_am.muRfuncs(T, ndD).muRfunc + muRfunc = props_am.muRfuncs(ndD).muRfunc muR_ref = ndD["muR_ref"] - muR, actR = muRfunc(c, cbar, muR_ref, ISfuncs) + muR, actR = muRfunc(c, cbar, T, muR_ref, ISfuncs) return muR, actR diff --git a/mpet/props_am.py b/mpet/props_am.py index 8f3f55a5..ee91c3fe 100644 --- a/mpet/props_am.py +++ b/mpet/props_am.py @@ -43,7 +43,7 @@ class muRfuncs(): actR -- activity (if applicable, else None) """ - def __init__(self, T, ndD=None, **kwargs): + def __init__(self, ndD=None, **kwargs): """ ndD can be the full dictionary of nondimensional parameters for the electrode particles, as made for the simulations. Otherwise, parameters can be passed directly in @@ -51,18 +51,17 @@ def __init__(self, T, ndD=None, **kwargs): parameters for the material of interest. E.g. For a regular solution material: - muRfuncs(T, ndD) + muRfuncs(ndD) or - muRfuncs(T, muRfunc="LiFePO4", Omga=3.4) + muRfuncs(muRfunc="LiFePO4", Omga=3.4) For solid solution function based on fit OCV: - muRfuncs(T, ndD) + muRfuncs(ndD) or - muRfuncs(T, muRfunc="LiMn2O4_ss") + muRfuncs(muRfunc="LiMn2O4_ss") """ if ndD is None: ndD = kwargs self.ndD = ndD - self.T = T # nondimensional k = 1.381e-23 Tabs = 298 e = 1.602e-19 @@ -83,7 +82,7 @@ def get_muR_from_OCV(self, OCV, muR_ref): # They can all only return values at 298 K ###### - def LiMn2O4_ss(self, y, ybar, muR_ref, ISfuncs=None): + def LiMn2O4_ss(self, y, ybar, T, muR_ref, ISfuncs=None): """ Doyle, Newman, 1996 """ # OCV in V vs Li/Li+ OCV = (4.19829 + 0.0565661*np.tanh(-14.5546*y + 8.60942) @@ -94,7 +93,7 @@ def LiMn2O4_ss(self, y, ybar, muR_ref, ISfuncs=None): actR = None return muR, actR - def LiMn2O4_ss2(self, y, ybar, muR_ref, ISfuncs=None): + def LiMn2O4_ss2(self, y, ybar, T, muR_ref, ISfuncs=None): """ Fuller, Doyle, Newman, 1994 """ # OCV in V vs Li/Li+ OCV = (4.06279 + 0.0677504*np.tanh(-21.8502*y + 12.8268) @@ -105,14 +104,14 @@ def LiMn2O4_ss2(self, y, ybar, muR_ref, ISfuncs=None): actR = None return muR, actR - def LiC6_coke_ss(self, y, ybar, muR_ref, ISfuncs=None): + def LiC6_coke_ss(self, y, ybar, T, muR_ref, ISfuncs=None): """ Doyle, Newman, 1996 """ OCV = (-0.16 + 1.32*np.exp(-3.0*y) + 10.*np.exp(-2000.*y)) muR = self.get_muR_from_OCV(OCV, muR_ref) actR = None return muR, actR - def LiC6_coke_ss2(self, y, ybar, muR_ref, ISfuncs=None): + def LiC6_coke_ss2(self, y, ybar, T, muR_ref, ISfuncs=None): """ Fuller, Doyle, Newman, 1994 """ c1 = -0.132056 c2 = 1.40854 @@ -122,7 +121,7 @@ def LiC6_coke_ss2(self, y, ybar, muR_ref, ISfuncs=None): actR = None return muR, actR - def LiC6_ss(self, y, ybar, muR_ref, ISfuncs=None): + def LiC6_ss(self, y, ybar, T, muR_ref, ISfuncs=None): """ Safari, Delacourt 2011 """ OCV = (0.6379 + 0.5416*np.exp(-305.5309*y) + 0.044*np.tanh(-(y - 0.1958)/0.1088) @@ -133,7 +132,7 @@ def LiC6_ss(self, y, ybar, muR_ref, ISfuncs=None): actR = None return muR, actR - def LiC6_ss2(self, y, ybar, muR_ref, ISfuncs=None): + def LiC6_ss2(self, y, ybar, T, muR_ref, ISfuncs=None): """ Bernardi and Go 2011 """ p1, p2, p3, p4 = (0.085, 0.120, 0.210, 3.5) sfac = 0.3 @@ -145,7 +144,7 @@ def LiC6_ss2(self, y, ybar, muR_ref, ISfuncs=None): actR = None return muR, actR - def LiC6_2step_ss(self, y, ybar, muR_ref, ISfuncs=None): + def LiC6_2step_ss(self, y, ybar, T, muR_ref, ISfuncs=None): """ Fit function to the OCV predicted by the phase separating 2-variable graphite model (LiC6 function in this class). @@ -168,12 +167,12 @@ def LiC6_2step_ss(self, y, ybar, muR_ref, ISfuncs=None): actR = None return muR, actR - def Li_ss(self, y, ybar, muR_ref, ISfuncs=None): + def Li_ss(self, y, ybar, T, muR_ref, ISfuncs=None): muR = 0.*y + muR_ref actR = 0.*y + 1. return muR, actR - def NCA_ss1(self, y, ybar, muR_ref, ISfuncs=None): + def NCA_ss1(self, y, ybar, T, muR_ref, ISfuncs=None): """ This function was obtained from Dan Cogswell's fit of Samsung data. @@ -184,7 +183,7 @@ def NCA_ss1(self, y, ybar, muR_ref, ISfuncs=None): actR = None return muR, actR - def NCA_ss2(self, y, ybar, muR_ref, ISfuncs=None): + def NCA_ss2(self, y, ybar, T, muR_ref, ISfuncs=None): """ Li_q Ni(0.8)Co(0.15)Al(0.05)O2 as a function of y. Here, y actually represents a practical @@ -200,14 +199,14 @@ def NCA_ss2(self, y, ybar, muR_ref, ISfuncs=None): actR = None return muR, actR - def testIS_ss(self, y, ybar, muR_ref, ISfuncs=None): + def testIS_ss(self, y, ybar, T, muR_ref, ISfuncs=None): """Ideal solution material for testing.""" - OCV = -self.kToe*np.log(y/(1-y)) + OCV = -T*self.kToe*np.log(y/(1-y)) muR = self.get_muR_from_OCV(OCV, muR_ref) actR = None return muR, actR - def testRS_ss(self, y, ybar, muR_ref, ISfuncs=None): + def testRS_ss(self, y, ybar, T, muR_ref, ISfuncs=None): """ Regular solution material which phase separates at binodal points, for modeling as a solid solution. For testing. @@ -215,7 +214,7 @@ def testRS_ss(self, y, ybar, muR_ref, ISfuncs=None): # Based Omg = 3*k*T_ref yL = 0.07072018 yR = 0.92927982 - OCV_rs = -self.kToe*self.reg_sln(y, self.ndD["Omga"], ISfuncs) + OCV_rs = -self.kToe*self.reg_sln(y, T, self.ndD["Omga"], ISfuncs) width = 0.005 OCV = OCV_rs*step_down(y, yL, width) + OCV_rs*step_up(y, yR, width) + 2 muR = self.get_muR_from_OCV(OCV, muR_ref) @@ -226,10 +225,9 @@ def testRS_ss(self, y, ybar, muR_ref, ISfuncs=None): # Functions based on thermodynamic models ###### - def ideal_sln(self, y, ISfuncs=None): + def ideal_sln(self, y, T, ISfuncs=None): """ Helper function: Should not be called directly from simulation. Call a specific material instead. """ - T = self.T if ISfuncs is not None: # Input must be a vector when using ISfuncs muR = T*np.array([ISfuncs[i]() for i in range(len(y))]) @@ -237,26 +235,26 @@ def ideal_sln(self, y, ISfuncs=None): muR = T*np.log(y/(1-y)) return muR - def reg_sln(self, y, Omga, ISfuncs=None): + def reg_sln(self, y, T, Omga, ISfuncs=None): """ Helper function """ - muR_IS = self.ideal_sln(y, ISfuncs=ISfuncs) + muR_IS = self.ideal_sln(y, T, ISfuncs=ISfuncs) enthalpyTerm = Omga*(1-2*y) muR = muR_IS + enthalpyTerm return muR - def graphite_2param_homog(self, y, Omga, Omgb, Omgc, EvdW, ISfuncs=None): + def graphite_2param_homog(self, y, T, Omga, Omgb, Omgc, EvdW, ISfuncs=None): """ Helper function """ y1, y2 = y ISfuncs1, ISfuncs2 = ISfuncs - muR1 = self.reg_sln(y1, Omga, ISfuncs1) - muR2 = self.reg_sln(y2, Omga, ISfuncs2) + muR1 = self.reg_sln(y1, T, Omga, ISfuncs1) + muR2 = self.reg_sln(y2, T, Omga, ISfuncs2) muR1 += Omgb*y2 + Omgc*y2*(1-y2)*(1-2*y1) muR2 += Omgb*y1 + Omgc*y1*(1-y1)*(1-2*y2) muR1 += EvdW * (30 * y1**2 * (1-y1)**2) muR2 += EvdW * (30 * y2**2 * (1-y2)**2) return (muR1, muR2) - def graphite_1param_homog(self, y, Omga, Omgb, ISfuncs=None): + def graphite_1param_homog(self, y, T, Omga, Omgb, ISfuncs=None): """ Helper function """ width = 5e-2 tailScl = 5e-2 @@ -268,7 +266,7 @@ def graphite_1param_homog(self, y, Omga, Omgb, ISfuncs=None): muR = muLtail + muRtail + muLlin + muRlin return muR - def graphite_1param_homog_2(self, y, Omga, Omgb, ISfuncs=None): + def graphite_1param_homog_2(self, y, T, Omga, Omgb, ISfuncs=None): """ Helper function """ width = 5e-2 tailScl = 5e-2 @@ -286,7 +284,7 @@ def graphite_1param_homog_2(self, y, Omga, Omgb, ISfuncs=None): muR = muLMod + muLtail + muRtail + muLlin + muRlin return muR - def graphite_1param_homog_3(self, y, Omga, Omgb, ISfuncs=None): + def graphite_1param_homog_3(self, y, T, Omga, Omgb, ISfuncs=None): """ Helper function with low hysteresis and soft tail """ width = 5e-2 tailScl = 5e-2 @@ -304,7 +302,7 @@ def graphite_1param_homog_3(self, y, Omga, Omgb, ISfuncs=None): muR = 0.18 + muLMod + muLtail + muRtail + muLlin + muRlin return muR - def non_homog_rect_fixed_csurf(self, y, ybar, B, kappa, ywet): + def non_homog_rect_fixed_csurf(self, y, T, ybar, B, kappa, ywet): """ Helper function """ N = len(y) ytmp = np.empty(N+2, dtype=object) @@ -316,7 +314,7 @@ def non_homog_rect_fixed_csurf(self, y, ybar, B, kappa, ywet): muR_nh = -kappa*curv + B*(y - ybar) return muR_nh - def non_homog_round_wetting(self, y, ybar, B, kappa, beta_s, shape, r_vec): + def non_homog_round_wetting(self, y, ybar, T, B, kappa, beta_s, shape, r_vec): """ Helper function """ dr = r_vec[1] - r_vec[0] Rs = 1. @@ -324,7 +322,7 @@ def non_homog_round_wetting(self, y, ybar, B, kappa, beta_s, shape, r_vec): muR_nh = B*(y - ybar) - kappa*curv return muR_nh - def general_non_homog(self, y, ybar): + def general_non_homog(self, y, T, ybar): """ Helper function """ ptype = self.ndD["type"] mod1var, mod2var = False, False @@ -345,7 +343,7 @@ def general_non_homog(self, y, ybar): if mod1var: cwet = self.ndD["cwet"] muR_nh = self.non_homog_rect_fixed_csurf( - y, ybar, B, kappa, cwet) + y, ybar, T, B, kappa, cwet) elif mod2var: raise NotImplementedError("no 2param C3 model known") elif shape in ["cylinder", "sphere"]: @@ -353,12 +351,12 @@ def general_non_homog(self, y, ybar): r_vec = geo.get_unit_solid_discr(shape, N)[0] if mod1var: muR_nh = self.non_homog_round_wetting( - y, ybar, B, kappa, beta_s, shape, r_vec) + y, ybar, T, B, kappa, beta_s, shape, r_vec) elif mod2var: muR1_nh = self.non_homog_round_wetting( - y[0], ybar[0], B, kappa, beta_s, shape, r_vec) + y[0], ybar[0], T, B, kappa, beta_s, shape, r_vec) muR2_nh = self.non_homog_round_wetting( - y[1], ybar[1], B, kappa, beta_s, shape, r_vec) + y[1], ybar[1], T, B, kappa, beta_s, shape, r_vec) muR_nh = (muR1_nh, muR2_nh) else: # homogeneous particle if mod1var: @@ -367,61 +365,60 @@ def general_non_homog(self, y, ybar): muR_nh = (0*y[0], 0*y[1]) return muR_nh - def LiFePO4(self, y, ybar, muR_ref, ISfuncs=None): + def LiFePO4(self, y, ybar, T, muR_ref, ISfuncs=None): """ Bai, Cogswell, Bazant 2011 """ muRtheta = -self.eokT*3.422 - muRhomog = self.reg_sln(y, self.ndD["Omga"], ISfuncs) - muRnonHomog = self.general_non_homog(y, ybar) + muRhomog = self.reg_sln(y, T, self.ndD["Omga"], ISfuncs) + muRnonHomog = self.general_non_homog(y, ybar, T) muR = muRhomog + muRnonHomog - actR = np.exp(muR/self.T) + actR = np.exp(muR/T) muR += muRtheta + muR_ref return muR, actR - def LiC6(self, y, ybar, muR_ref, ISfuncs=(None, None)): + def LiC6(self, y, ybar, T, muR_ref, ISfuncs=(None, None)): """ Ferguson and Bazant 2014 """ muRtheta = -self.eokT*0.12 ndD = self.ndD muR1homog, muR2homog = self.graphite_2param_homog( - y, ndD["Omga"], ndD["Omgb"], ndD["Omgc"], ndD["EvdW"], ISfuncs) - muR1nonHomog, muR2nonHomog = self.general_non_homog(y, ybar) + y, T, ndD["Omga"], ndD["Omgb"], ndD["Omgc"], ndD["EvdW"], ISfuncs) + muR1nonHomog, muR2nonHomog = self.general_non_homog(y, ybar, T) muR1 = muR1homog + muR1nonHomog muR2 = muR2homog + muR2nonHomog - actR1 = np.exp(muR1/self.T) - actR2 = np.exp(muR2/self.T) + actR1 = np.exp(muR1/T) + actR2 = np.exp(muR2/T) muR1 += muRtheta + muR_ref muR2 += muRtheta + muR_ref return (muR1, muR2), (actR1, actR2) - def LiC6_1param(self, y, ybar, muR_ref, ISfuncs=None): + def LiC6_1param(self, y, ybar, T, muR_ref, ISfuncs=None): muRtheta = -self.eokT*0.12 ndD = self.ndD muRhomog = self.graphite_1param_homog_3( - y, ndD["Omga"], ndD["Omgb"], ISfuncs) - muRnonHomog = self.general_non_homog(y, ybar) + y, T, ndD["Omga"], ndD["Omgb"], ISfuncs) + muRnonHomog = self.general_non_homog(y, ybar, T) muR = muRhomog + muRnonHomog - actR = np.exp(muR/self.T) + actR = np.exp(muR/T) muR += muRtheta + muR_ref return muR, actR - def testRS(self, y, ybar, muR_ref, ISfuncs=None): + def testRS(self, y, ybar, T, muR_ref, ISfuncs=None): muRtheta = 0. - muR = self.reg_sln(y, self.ndD["Omga"], ISfuncs) - actR = np.exp(muR/self.T) + muR = self.reg_sln(y, T, self.ndD["Omga"], ISfuncs) + actR = np.exp(muR/T) muR += muRtheta + muR_ref return muR, actR - def testRS_ps(self, y, ybar, muR_ref, ISfuncs=None): + def testRS_ps(self, y, ybar, T, muR_ref, ISfuncs=None): muRtheta = -self.eokT*2. - muRhomog = self.reg_sln(y, self.ndD["Omga"], ISfuncs) - muRnonHomog = self.general_non_homog(y, ybar) + muRhomog = self.reg_sln(y, T, self.ndD["Omga"], ISfuncs) + muRnonHomog = self.general_non_homog(y, ybar, T) muR = muRhomog + muRnonHomog - actR = np.exp(muR/self.T) + actR = np.exp(muR/T) muR += muRtheta + muR_ref return muR, actR - def LiCoO2_LIONSIMBA(self, y, ybar, muR_ref, ISfuncs=None): + def LiCoO2_LIONSIMBA(self, y, ybar, T, muR_ref, ISfuncs=None): """ Torchio et al, 2016. """ - T = self.T Tref = 298 r1 = 4.656 r2 = 88.669 @@ -453,9 +450,8 @@ def LiCoO2_LIONSIMBA(self, y, ybar, muR_ref, ISfuncs=None): actR = None return muR, actR - def LiC6_LIONSIMBA(self, y, ybar, muR_ref, ISfuncs=None): + def LiC6_LIONSIMBA(self, y, ybar, T, muR_ref, ISfuncs=None): """ Torchio et al, 2016. """ - T = self.T Tref = 298 r1 = 0.7222 r2 = 0.1387 From d33b3354d5e050cf533948a97c865536f2ff317b Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Mon, 17 May 2021 19:18:46 -0700 Subject: [PATCH 05/57] implemented temperature changes in particle --- mpet/daeVariableTypes.py | 2 +- mpet/mod_electrodes.py | 38 ++++++++++++++++---------------------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/mpet/daeVariableTypes.py b/mpet/daeVariableTypes.py index 86eefd9c..e7a253b8 100644 --- a/mpet/daeVariableTypes.py +++ b/mpet/daeVariableTypes.py @@ -11,5 +11,5 @@ name="elec_pot_t", units=dae.unit(), lowerBound=-1e20, upperBound=1e20, initialGuess=0, absTolerance=1.e-6) temp_t = dae.daeVariableType( - name="temp_t", units=dae.unit(), lowerBound=0, + name="temp_t", units=dae.unit(), lowerBound=0.01, upperBound=1e20, initialGuess=1, absTolerance=1.e-6) diff --git a/mpet/mod_electrodes.py b/mpet/mod_electrodes.py index 8c2b9ec3..5b46664c 100644 --- a/mpet/mod_electrodes.py +++ b/mpet/mod_electrodes.py @@ -79,7 +79,6 @@ def DeclareEquations(self): dae.daeModel.DeclareEquations(self) ndD = self.ndD N = ndD["N"] # number of grid points in particle - T = self.ndD_s["T0"] # nondimensional temperature r_vec, volfrac_vec = geo.get_unit_solid_discr(ndD['shape'], N) # Prepare the Ideal Solution log ratio terms @@ -116,7 +115,7 @@ def DeclareEquations(self): # Figure out mu_O, mu of the oxidized state mu_O, act_lyte = calc_mu_O( - self.c_lyte(), self.phi_lyte(), self.phi_m(), T, + self.c_lyte(), self.phi_lyte(), self.phi_m(), self.T_lyte(), self.ndD_s["elyteModelType"]) # Define average filling fractions in particle @@ -152,20 +151,19 @@ def DeclareEquations(self): def sld_dynamics_0D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises): ndD = self.ndD - T = self.ndD_s["T0"] c1_surf = c1 c2_surf = c2 (mu1R_surf, mu2R_surf), (act1R_surf, act2R_surf) = (calc_muR( - (c1_surf, c2_surf), (self.c1bar(), self.c2bar()), T, ndD, ISfuncs)) + (c1_surf, c2_surf), (self.c1bar(), self.c2bar()), self.T_lyte(), ndD, ISfuncs)) eta1 = calc_eta(mu1R_surf, muO) eta2 = calc_eta(mu2R_surf, muO) eta1_eff = eta1 + self.Rxn1()*ndD["Rfilm"] eta2_eff = eta2 + self.Rxn2()*ndD["Rfilm"] Rxn1 = self.calc_rxn_rate( - eta1_eff, c1_surf, self.c_lyte(), ndD["k0"], ndD["E_A"], T, + eta1_eff, c1_surf, self.c_lyte(), ndD["k0"], ndD["E_A"], self.T_lyte(), act1R_surf, act_lyte, ndD["lambda"], ndD["alpha"]) Rxn2 = self.calc_rxn_rate( - eta2_eff, c2_surf, self.c_lyte(), ndD["k0"], ndD["E_A"], T, + eta2_eff, c2_surf, self.c_lyte(), ndD["k0"], ndD["E_A"], self.T_lyte(), act2R_surf, act_lyte, ndD["lambda"], ndD["alpha"]) eq1 = self.CreateEquation("Rxn1") eq2 = self.CreateEquation("Rxn2") @@ -184,7 +182,6 @@ def sld_dynamics_0D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises): def sld_dynamics_1D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises): ndD = self.ndD N = ndD["N"] - T = self.ndD_s["T0"] # Equations for concentration evolution # Mass matrix, M, where M*dcdt = RHS, where c and RHS are vectors Mmat = get_Mmat(ndD['shape'], N) @@ -193,7 +190,7 @@ def sld_dynamics_1D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises): # Get solid particle chemical potential, overpotential, reaction rate if ndD["type"] in ["diffn2", "CHR2"]: (mu1R, mu2R), (act1R, act2R) = calc_muR( - (c1, c2), (self.c1bar(), self.c2bar()), T, ndD, ISfuncs) + (c1, c2), (self.c1bar(), self.c2bar()), self.T_lyte(), ndD, ISfuncs) c1_surf = c1[-1] c2_surf = c2[-1] mu1R_surf, act1R_surf = mu1R[-1], act1R[-1] @@ -207,10 +204,10 @@ def sld_dynamics_1D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises): eta1_eff = eta1 + self.Rxn1()*ndD["Rfilm"] eta2_eff = eta2 + self.Rxn2()*ndD["Rfilm"] Rxn1 = self.calc_rxn_rate( - eta1_eff, c1_surf, self.c_lyte(), ndD["k0"], ndD["E_A"], T, + eta1_eff, c1_surf, self.c_lyte(), ndD["k0"], ndD["E_A"], self.T_lyte(), act1R_surf, act_lyte, ndD["lambda"], ndD["alpha"]) Rxn2 = self.calc_rxn_rate( - eta2_eff, c2_surf, self.c_lyte(), ndD["k0"], ndD["E_A"], T, + eta2_eff, c2_surf, self.c_lyte(), ndD["k0"], ndD["E_A"], self.T_lyte(), act2R_surf, act_lyte, ndD["lambda"], ndD["alpha"]) if ndD["type"] in ["ACR2"]: for i in range(N): @@ -237,7 +234,7 @@ def sld_dynamics_1D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises): # c1, c2, ndD["D"], Flux1_bc, Flux2_bc, dr, T) elif ndD["type"] == "CHR2": Flux1_vec, Flux2_vec = calc_flux_CHR2( - c1, c2, mu1R, mu2R, ndD["D"], Dfunc, ndD["E_D"], Flux1_bc, Flux2_bc, dr, T) + c1, c2, mu1R, mu2R, ndD["D"], Dfunc, ndD["E_D"], Flux1_bc, Flux2_bc, dr, self.T_lyte()) if ndD["shape"] == "sphere": area_vec = 4*np.pi*edges**2 elif ndD["shape"] == "cylinder": @@ -316,7 +313,6 @@ def DeclareEquations(self): dae.daeModel.DeclareEquations(self) ndD = self.ndD N = ndD["N"] # number of grid points in particle - T = self.ndD_s["T0"] # nondimensional temperature r_vec, volfrac_vec = geo.get_unit_solid_discr(ndD['shape'], N) # Prepare the Ideal Solution log ratio terms @@ -342,7 +338,7 @@ def DeclareEquations(self): for _position_ in range(N)] # Figure out mu_O, mu of the oxidized state - mu_O, act_lyte = calc_mu_O(self.c_lyte(), self.phi_lyte(), self.phi_m(), T, + mu_O, act_lyte = calc_mu_O(self.c_lyte(), self.phi_lyte(), self.phi_m(), self.T_lyte(), self.ndD_s["elyteModelType"]) # Define average filling fraction in particle @@ -371,13 +367,12 @@ def DeclareEquations(self): def sld_dynamics_0D1var(self, c, muO, act_lyte, ISfuncs, noise): ndD = self.ndD - T = self.ndD_s["T0"] c_surf = c - muR_surf, actR_surf = calc_muR(c_surf, self.cbar(), T, ndD, ISfuncs) + muR_surf, actR_surf = calc_muR(c_surf, self.cbar(), self.T_lyte(), ndD, ISfuncs) eta = calc_eta(muR_surf, muO) eta_eff = eta + self.Rxn()*ndD["Rfilm"] Rxn = self.calc_rxn_rate( - eta_eff, c_surf, self.c_lyte(), ndD["k0"], ndD["E_A"], T, + eta_eff, c_surf, self.c_lyte(), ndD["k0"], ndD["E_A"], self.T_lyte(), actR_surf, act_lyte, ndD["lambda"], ndD["alpha"]) eq = self.CreateEquation("Rxn") eq.Residual = self.Rxn() - Rxn[0] @@ -390,7 +385,6 @@ def sld_dynamics_0D1var(self, c, muO, act_lyte, ISfuncs, noise): def sld_dynamics_1D1var(self, c, muO, act_lyte, ISfuncs, noise): ndD = self.ndD N = ndD["N"] - T = self.ndD_s["T0"] # Equations for concentration evolution # Mass matrix, M, where M*dcdt = RHS, where c and RHS are vectors Mmat = get_Mmat(ndD['shape'], N) @@ -400,9 +394,9 @@ def sld_dynamics_1D1var(self, c, muO, act_lyte, ISfuncs, noise): if ndD["type"] in ["ACR"]: c_surf = c muR_surf, actR_surf = calc_muR( - c_surf, self.cbar(), T, ndD, ISfuncs) + c_surf, self.cbar(), self.T_lyte(), ndD, ISfuncs) elif ndD["type"] in ["diffn", "CHR"]: - muR, actR = calc_muR(c, self.cbar(), T, ndD, ISfuncs) + muR, actR = calc_muR(c, self.cbar(), self.T_lyte(), ndD, ISfuncs) c_surf = c[-1] muR_surf = muR[-1] if actR is None: @@ -415,7 +409,7 @@ def sld_dynamics_1D1var(self, c, muO, act_lyte, ISfuncs, noise): else: eta_eff = eta + self.Rxn()*ndD["Rfilm"] Rxn = self.calc_rxn_rate( - eta_eff, c_surf, self.c_lyte(), ndD["k0"], ndD["E_A"], T, + eta_eff, c_surf, self.c_lyte(), ndD["k0"], ndD["E_A"], self.T_lyte(), actR_surf, act_lyte, ndD["lambda"], ndD["alpha"]) if ndD["type"] in ["ACR"]: for i in range(N): @@ -434,9 +428,9 @@ def sld_dynamics_1D1var(self, c, muO, act_lyte, ISfuncs, noise): Flux_bc = -self.Rxn() Dfunc = props_am.Dfuncs(ndD["Dfunc"]).Dfunc if ndD["type"] == "diffn": - Flux_vec = calc_flux_diffn(c, ndD["D"], Dfunc, ndD["E_D"], Flux_bc, dr, T) + Flux_vec = calc_flux_diffn(c, ndD["D"], Dfunc, ndD["E_D"], Flux_bc, dr, self.T_lyte()) elif ndD["type"] == "CHR": - Flux_vec = calc_flux_CHR(c, muR, ndD["D"], Dfunc, ndD["E_D"], Flux_bc, dr, T) + Flux_vec = calc_flux_CHR(c, muR, ndD["D"], Dfunc, ndD["E_D"], Flux_bc, dr, self.T_lyte()) if ndD["shape"] == "sphere": area_vec = 4*np.pi*edges**2 elif ndD["shape"] == "cylinder": From 484633914b6140c525beff3a0f8880e678fd2549 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Mon, 17 May 2021 20:51:38 -0700 Subject: [PATCH 06/57] conformed to pep8 format --- mpet/mod_cell.py | 10 +++++----- mpet/mod_electrodes.py | 9 ++++++--- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index fc710169..bfea594f 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -369,8 +369,8 @@ def DeclareEquations(self): eq.Residual = -dvgi[vInd] + ndD["zp"]*Rvvec[vInd] # Energy Conservation eq = self.CreateEquation("lyte_energy_cons_vol{vInd}".format(vInd=vInd)) - eq.Residual = disc["porosvec"][vInd]*dTdtvec[vInd] - dvgq[vInd] # do we add heat generation from current blah? - + eq.Residual = disc["porosvec"][vInd]*dTdtvec[vInd] - \ + dvgq[vInd] # do we add heat generation from current blah? # Define the total current. This must be done at the capacity # limiting electrode because currents are specified in @@ -503,13 +503,13 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, ndD): eps_o_tau_edges = utils.weighted_linear_mean(eps_o_tau, wt) Dp = eps_o_tau_edges * ndD["Dp"] Dm = eps_o_tau_edges * ndD["Dm"] - #neglecting soret diffusion + # neglecting soret diffusion # Np_edges_int = nup*(-Dp*np.diff(c_lyte)/dxd1 # - Dp*zp*c_edges_int*np.diff(phi_lyte)/dxd1) Nm_edges_int = num*(-Dm*np.diff(c_lyte)/dxd1 - Dm/T_edges_int*zm*c_edges_int*np.diff(phi_lyte)/dxd1) - i_edges_int = (-((nup*zp*Dp + num*zm*Dm)*np.diff(c_lyte)/dxd1) - - (nup*zp**2*Dp + num*zm**2*Dm)/T_edges_int*c_edges_int*np.diff(phi_lyte)/dxd1) + i_edges_int = (-((nup*zp*Dp + num*zm*Dm)*np.diff(c_lyte)/dxd1) - (nup*zp + ** 2*Dp + num*zm**2*Dm)/T_edges_int*c_edges_int*np.diff(phi_lyte)/dxd1) # i_edges_int = zp*Np_edges_int + zm*Nm_edges_int q_edges_int = 0*np.diff(c_lyte) elif ndD["elyteModelType"] == "SM": diff --git a/mpet/mod_electrodes.py b/mpet/mod_electrodes.py index 5b46664c..671af75c 100644 --- a/mpet/mod_electrodes.py +++ b/mpet/mod_electrodes.py @@ -234,7 +234,8 @@ def sld_dynamics_1D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises): # c1, c2, ndD["D"], Flux1_bc, Flux2_bc, dr, T) elif ndD["type"] == "CHR2": Flux1_vec, Flux2_vec = calc_flux_CHR2( - c1, c2, mu1R, mu2R, ndD["D"], Dfunc, ndD["E_D"], Flux1_bc, Flux2_bc, dr, self.T_lyte()) + c1, c2, mu1R, mu2R, ndD["D"], Dfunc, ndD["E_D"], Flux1_bc, + Flux2_bc, dr, self.T_lyte()) if ndD["shape"] == "sphere": area_vec = 4*np.pi*edges**2 elif ndD["shape"] == "cylinder": @@ -428,9 +429,11 @@ def sld_dynamics_1D1var(self, c, muO, act_lyte, ISfuncs, noise): Flux_bc = -self.Rxn() Dfunc = props_am.Dfuncs(ndD["Dfunc"]).Dfunc if ndD["type"] == "diffn": - Flux_vec = calc_flux_diffn(c, ndD["D"], Dfunc, ndD["E_D"], Flux_bc, dr, self.T_lyte()) + Flux_vec = calc_flux_diffn( + c, ndD["D"], Dfunc, ndD["E_D"], Flux_bc, dr, self.T_lyte()) elif ndD["type"] == "CHR": - Flux_vec = calc_flux_CHR(c, muR, ndD["D"], Dfunc, ndD["E_D"], Flux_bc, dr, self.T_lyte()) + Flux_vec = calc_flux_CHR( + c, muR, ndD["D"], Dfunc, ndD["E_D"], Flux_bc, dr, self.T_lyte()) if ndD["shape"] == "sphere": area_vec = 4*np.pi*edges**2 elif ndD["shape"] == "cylinder": From d7fbe70c6d6c29fa32e3c0f500c6f1609d40ff89 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Wed, 19 May 2021 16:00:12 -0400 Subject: [PATCH 07/57] fixed error in reading in temperatures --- mpet/io_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mpet/io_utils.py b/mpet/io_utils.py index 87b027e3..4b28c5d3 100644 --- a/mpet/io_utils.py +++ b/mpet/io_utils.py @@ -91,7 +91,7 @@ def get_dicts_from_configs(P_s, P_e, paramfile): ndD_s["prevDir"] = os.path.normpath(os.path.join(dir,ndD_s["prevDir"])) ndD_s["tsteps"] = P_s.getint('Sim Params', 'tsteps') - T0abs = dD_s["T0abs"] = P_s.getfloat('Sim Params', 'T0') + T0abs = dD_s["T0abs"] = P_s.getfloat('Sim Params', 'T0', fallback=298) dD_s["Rser"] = P_s.getfloat('Sim Params', 'Rser') ndD_s["dataReporter"] = P_s.get('Sim Params', 'dataReporter', fallback='mat') ndD_s["Nvol"] = {"a": P_s.getint('Sim Params', 'Nvol_a'), From 6d9c8b658b5bd6e63adfafc49367d12acf3ecd91 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Thu, 20 May 2021 03:54:55 -0400 Subject: [PATCH 08/57] fixed an initialization error with temperature --- mpet/sim.py | 1 + 1 file changed, 1 insertion(+) diff --git a/mpet/sim.py b/mpet/sim.py index c549a568..9acc44e2 100644 --- a/mpet/sim.py +++ b/mpet/sim.py @@ -137,6 +137,7 @@ def SetUpVariables(self): # Set electrolyte concentration in each particle for j in range(Npart[tr]): self.m.particles[tr][i,j].c_lyte.SetInitialGuess(ndD_s["c0"]) + self.m.particles[tr][i,j].T_lyte.SetInitialGuess(ndD_s["T0"]) else: dPrev = self.dataPrev From 3e67ee29a56e3f836b2356e7567dc641a923ccbd Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Thu, 20 May 2021 04:05:35 -0400 Subject: [PATCH 09/57] fixed typo in props_amy function name --- mpet/props_am.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/mpet/props_am.py b/mpet/props_am.py index ee91c3fe..e5bfcc24 100644 --- a/mpet/props_am.py +++ b/mpet/props_am.py @@ -302,7 +302,7 @@ def graphite_1param_homog_3(self, y, T, Omga, Omgb, ISfuncs=None): muR = 0.18 + muLMod + muLtail + muRtail + muLlin + muRlin return muR - def non_homog_rect_fixed_csurf(self, y, T, ybar, B, kappa, ywet): + def non_homog_rect_fixed_csurf(self, y, ybar, B, kappa, ywet): """ Helper function """ N = len(y) ytmp = np.empty(N+2, dtype=object) @@ -314,7 +314,7 @@ def non_homog_rect_fixed_csurf(self, y, T, ybar, B, kappa, ywet): muR_nh = -kappa*curv + B*(y - ybar) return muR_nh - def non_homog_round_wetting(self, y, ybar, T, B, kappa, beta_s, shape, r_vec): + def non_homog_round_wetting(self, y, ybar, B, kappa, beta_s, shape, r_vec): """ Helper function """ dr = r_vec[1] - r_vec[0] Rs = 1. @@ -322,7 +322,7 @@ def non_homog_round_wetting(self, y, ybar, T, B, kappa, beta_s, shape, r_vec): muR_nh = B*(y - ybar) - kappa*curv return muR_nh - def general_non_homog(self, y, T, ybar): + def general_non_homog(self, y, ybar): """ Helper function """ ptype = self.ndD["type"] mod1var, mod2var = False, False @@ -343,7 +343,7 @@ def general_non_homog(self, y, T, ybar): if mod1var: cwet = self.ndD["cwet"] muR_nh = self.non_homog_rect_fixed_csurf( - y, ybar, T, B, kappa, cwet) + y, ybar, B, kappa, cwet) elif mod2var: raise NotImplementedError("no 2param C3 model known") elif shape in ["cylinder", "sphere"]: @@ -351,12 +351,12 @@ def general_non_homog(self, y, T, ybar): r_vec = geo.get_unit_solid_discr(shape, N)[0] if mod1var: muR_nh = self.non_homog_round_wetting( - y, ybar, T, B, kappa, beta_s, shape, r_vec) + y, ybar, B, kappa, beta_s, shape, r_vec) elif mod2var: muR1_nh = self.non_homog_round_wetting( - y[0], ybar[0], T, B, kappa, beta_s, shape, r_vec) + y[0], ybar[0], B, kappa, beta_s, shape, r_vec) muR2_nh = self.non_homog_round_wetting( - y[1], ybar[1], T, B, kappa, beta_s, shape, r_vec) + y[1], ybar[1], B, kappa, beta_s, shape, r_vec) muR_nh = (muR1_nh, muR2_nh) else: # homogeneous particle if mod1var: @@ -369,7 +369,7 @@ def LiFePO4(self, y, ybar, T, muR_ref, ISfuncs=None): """ Bai, Cogswell, Bazant 2011 """ muRtheta = -self.eokT*3.422 muRhomog = self.reg_sln(y, T, self.ndD["Omga"], ISfuncs) - muRnonHomog = self.general_non_homog(y, ybar, T) + muRnonHomog = self.general_non_homog(y, ybar) muR = muRhomog + muRnonHomog actR = np.exp(muR/T) muR += muRtheta + muR_ref @@ -381,7 +381,7 @@ def LiC6(self, y, ybar, T, muR_ref, ISfuncs=(None, None)): ndD = self.ndD muR1homog, muR2homog = self.graphite_2param_homog( y, T, ndD["Omga"], ndD["Omgb"], ndD["Omgc"], ndD["EvdW"], ISfuncs) - muR1nonHomog, muR2nonHomog = self.general_non_homog(y, ybar, T) + muR1nonHomog, muR2nonHomog = self.general_non_homog(y, ybar) muR1 = muR1homog + muR1nonHomog muR2 = muR2homog + muR2nonHomog actR1 = np.exp(muR1/T) @@ -395,7 +395,7 @@ def LiC6_1param(self, y, ybar, T, muR_ref, ISfuncs=None): ndD = self.ndD muRhomog = self.graphite_1param_homog_3( y, T, ndD["Omga"], ndD["Omgb"], ISfuncs) - muRnonHomog = self.general_non_homog(y, ybar, T) + muRnonHomog = self.general_non_homog(y, ybar) muR = muRhomog + muRnonHomog actR = np.exp(muR/T) muR += muRtheta + muR_ref @@ -411,7 +411,7 @@ def testRS(self, y, ybar, T, muR_ref, ISfuncs=None): def testRS_ps(self, y, ybar, T, muR_ref, ISfuncs=None): muRtheta = -self.eokT*2. muRhomog = self.reg_sln(y, T, self.ndD["Omga"], ISfuncs) - muRnonHomog = self.general_non_homog(y, ybar, T) + muRnonHomog = self.general_non_homog(y, ybar) muR = muRhomog + muRnonHomog actR = np.exp(muR/T) muR += muRtheta + muR_ref From ebc9653d6f1f0e3ae2853f46735eb8400511dded Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Thu, 20 May 2021 12:42:49 -0400 Subject: [PATCH 10/57] changed test cases to T0 instead of T --- tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg | 2 +- .../benchmark_LIONSIMBA_nonisothermal/params_system.cfg | 2 +- tests/ref_outputs/test001/params_system.cfg | 2 +- tests/ref_outputs/test002/params_system.cfg | 2 +- tests/ref_outputs/test003/params_system.cfg | 2 +- tests/ref_outputs/test004/params_system.cfg | 2 +- tests/ref_outputs/test005/params_system.cfg | 2 +- tests/ref_outputs/test006/params_system.cfg | 2 +- tests/ref_outputs/test007/params_system.cfg | 2 +- tests/ref_outputs/test008/params_system.cfg | 2 +- tests/ref_outputs/test009/params_system.cfg | 2 +- tests/ref_outputs/test010/params_system.cfg | 2 +- tests/ref_outputs/test011/params_system.cfg | 2 +- tests/ref_outputs/test012/params_system.cfg | 2 +- tests/ref_outputs/test013/params_system.cfg | 2 +- tests/ref_outputs/test014/params_system.cfg | 2 +- tests/ref_outputs/test015/params_system.cfg | 2 +- tests/ref_outputs/test016/params_system.cfg | 2 +- tests/ref_outputs/test017/params_system.cfg | 2 +- tests/ref_outputs/test018/params_system.cfg | 2 +- tests/ref_outputs/test019/params_system.cfg | 2 +- tests/ref_outputs/test020/params_system.cfg | 2 +- tests/ref_outputs/test021/params_system.cfg | 2 +- tests/ref_outputs/test022/params_system.cfg | 2 +- tests/ref_outputs/test023/params_system.cfg | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg index f1dd10b2..935cfb75 100644 --- a/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg +++ b/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg @@ -14,7 +14,7 @@ tend = 1.2e3 tsteps = 25 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = false seed = 0 Rser = 0. diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg index a7c6ee3b..c9027305 100644 --- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg +++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg @@ -14,7 +14,7 @@ tend = 1.2e3 tsteps = 25 relTol = 1e-6 absTol = 1e-6 -T = 323 +T0 = 323 randomSeed = false seed = 0 Rser = 0. diff --git a/tests/ref_outputs/test001/params_system.cfg b/tests/ref_outputs/test001/params_system.cfg index d1058292..7f43e75d 100644 --- a/tests/ref_outputs/test001/params_system.cfg +++ b/tests/ref_outputs/test001/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test002/params_system.cfg b/tests/ref_outputs/test002/params_system.cfg index d1058292..7f43e75d 100644 --- a/tests/ref_outputs/test002/params_system.cfg +++ b/tests/ref_outputs/test002/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test003/params_system.cfg b/tests/ref_outputs/test003/params_system.cfg index d1058292..7f43e75d 100644 --- a/tests/ref_outputs/test003/params_system.cfg +++ b/tests/ref_outputs/test003/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test004/params_system.cfg b/tests/ref_outputs/test004/params_system.cfg index d1058292..7f43e75d 100644 --- a/tests/ref_outputs/test004/params_system.cfg +++ b/tests/ref_outputs/test004/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test005/params_system.cfg b/tests/ref_outputs/test005/params_system.cfg index b921f950..d793fd46 100644 --- a/tests/ref_outputs/test005/params_system.cfg +++ b/tests/ref_outputs/test005/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test006/params_system.cfg b/tests/ref_outputs/test006/params_system.cfg index dbaff3d8..93632301 100644 --- a/tests/ref_outputs/test006/params_system.cfg +++ b/tests/ref_outputs/test006/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test007/params_system.cfg b/tests/ref_outputs/test007/params_system.cfg index 81d0f53f..69e7f049 100644 --- a/tests/ref_outputs/test007/params_system.cfg +++ b/tests/ref_outputs/test007/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test008/params_system.cfg b/tests/ref_outputs/test008/params_system.cfg index 1136ede5..6f145009 100644 --- a/tests/ref_outputs/test008/params_system.cfg +++ b/tests/ref_outputs/test008/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test009/params_system.cfg b/tests/ref_outputs/test009/params_system.cfg index d1058292..7f43e75d 100644 --- a/tests/ref_outputs/test009/params_system.cfg +++ b/tests/ref_outputs/test009/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test010/params_system.cfg b/tests/ref_outputs/test010/params_system.cfg index 93c143d5..894f130d 100644 --- a/tests/ref_outputs/test010/params_system.cfg +++ b/tests/ref_outputs/test010/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-7 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test011/params_system.cfg b/tests/ref_outputs/test011/params_system.cfg index 5f64e868..5193c14e 100644 --- a/tests/ref_outputs/test011/params_system.cfg +++ b/tests/ref_outputs/test011/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-7 absTol = 1e-7 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test012/params_system.cfg b/tests/ref_outputs/test012/params_system.cfg index 1b761005..3e400001 100644 --- a/tests/ref_outputs/test012/params_system.cfg +++ b/tests/ref_outputs/test012/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 25 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test013/params_system.cfg b/tests/ref_outputs/test013/params_system.cfg index eb0fbca5..a99eb667 100644 --- a/tests/ref_outputs/test013/params_system.cfg +++ b/tests/ref_outputs/test013/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 25 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test014/params_system.cfg b/tests/ref_outputs/test014/params_system.cfg index c95e2be5..b9e9827c 100644 --- a/tests/ref_outputs/test014/params_system.cfg +++ b/tests/ref_outputs/test014/params_system.cfg @@ -12,7 +12,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 1e-3 diff --git a/tests/ref_outputs/test015/params_system.cfg b/tests/ref_outputs/test015/params_system.cfg index 331548f2..de859b21 100644 --- a/tests/ref_outputs/test015/params_system.cfg +++ b/tests/ref_outputs/test015/params_system.cfg @@ -12,7 +12,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-5 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test016/params_system.cfg b/tests/ref_outputs/test016/params_system.cfg index 39f87aa9..55b3f681 100644 --- a/tests/ref_outputs/test016/params_system.cfg +++ b/tests/ref_outputs/test016/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test017/params_system.cfg b/tests/ref_outputs/test017/params_system.cfg index 4f864190..ed800513 100644 --- a/tests/ref_outputs/test017/params_system.cfg +++ b/tests/ref_outputs/test017/params_system.cfg @@ -15,7 +15,7 @@ tend = 3e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test018/params_system.cfg b/tests/ref_outputs/test018/params_system.cfg index 789c71ce..7be3f05f 100644 --- a/tests/ref_outputs/test018/params_system.cfg +++ b/tests/ref_outputs/test018/params_system.cfg @@ -12,7 +12,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test019/params_system.cfg b/tests/ref_outputs/test019/params_system.cfg index 7b91784c..f2ac1db6 100644 --- a/tests/ref_outputs/test019/params_system.cfg +++ b/tests/ref_outputs/test019/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test020/params_system.cfg b/tests/ref_outputs/test020/params_system.cfg index 8c7b8307..cea407a1 100644 --- a/tests/ref_outputs/test020/params_system.cfg +++ b/tests/ref_outputs/test020/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true dataReporter = hdf5 seed = 10 diff --git a/tests/ref_outputs/test021/params_system.cfg b/tests/ref_outputs/test021/params_system.cfg index df0cb486..1eb6b8e7 100644 --- a/tests/ref_outputs/test021/params_system.cfg +++ b/tests/ref_outputs/test021/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true dataReporter = hdf5Fast saveAllData = False diff --git a/tests/ref_outputs/test022/params_system.cfg b/tests/ref_outputs/test022/params_system.cfg index 4fe811c3..5fdd3238 100644 --- a/tests/ref_outputs/test022/params_system.cfg +++ b/tests/ref_outputs/test022/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test023/params_system.cfg b/tests/ref_outputs/test023/params_system.cfg index eb0fbca5..a99eb667 100644 --- a/tests/ref_outputs/test023/params_system.cfg +++ b/tests/ref_outputs/test023/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 25 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. From c9ea2a516279e72369c77281f861f33b062b31f0 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Mon, 24 May 2021 00:42:43 -0400 Subject: [PATCH 11/57] added heat transport properties and energy balance --- mpet/io_utils.py | 9 +++++++- mpet/mod_cell.py | 21 +++++++++++++----- mpet/props_elyte.py | 54 +++++++++++++++++++++++++++++++++++++++------ 3 files changed, 70 insertions(+), 14 deletions(-) diff --git a/mpet/io_utils.py b/mpet/io_utils.py index 4b28c5d3..2f798f99 100644 --- a/mpet/io_utils.py +++ b/mpet/io_utils.py @@ -94,6 +94,7 @@ def get_dicts_from_configs(P_s, P_e, paramfile): T0abs = dD_s["T0abs"] = P_s.getfloat('Sim Params', 'T0', fallback=298) dD_s["Rser"] = P_s.getfloat('Sim Params', 'Rser') ndD_s["dataReporter"] = P_s.get('Sim Params', 'dataReporter', fallback='mat') + ndD_s["nonisothermal"] = P_s.getboolean('Sim Params', 'nonisothermal', fallback='false') ndD_s["Nvol"] = {"a": P_s.getint('Sim Params', 'Nvol_a'), "c": P_s.getint('Sim Params', 'Nvol_c'), "s": P_s.getint('Sim Params', 'Nvol_s')} @@ -152,11 +153,14 @@ def get_dicts_from_configs(P_s, P_e, paramfile): ndD_s["num"] = P_s.getfloat('Electrolyte', 'num') ndD_s["elyteModelType"] = P_s.get('Electrolyte', 'elyteModelType') SMset = ndD_s["SMset"] = P_s.get('Electrolyte', 'SMset') - D_ref = dD_s["D_ref"] = dD_s["Dref"] = getattr(props_elyte,SMset)()[-1] + D_ref = dD_s["D_ref"] = dD_s["Dref"] = getattr(props_elyte,SMset)()[-2] + k_h_ref = dD_s["k_h_ref"] = dD_s["k_h_ref"] = getattr(props_elyte,SMset)()[-1] ndD_s["n_refTrode"] = P_s.getfloat('Electrolyte', 'n') ndD_s["sp"] = P_s.getfloat('Electrolyte', 'sp') Dp = dD_s["Dp"] = P_s.getfloat('Electrolyte', 'Dp') Dm = dD_s["Dm"] = P_s.getfloat('Electrolyte', 'Dm') + k_h = dD_s["k_h"] = P_s.getfloat('Electrolyte', 'k_h') + cp = dD_s["cp"] = P_s.getfloat('Electrolyte', 'cp') # Constants k = dD_s["k"] = 1.381e-23 # J/(K particle) @@ -226,6 +230,7 @@ def get_dicts_from_configs(P_s, P_e, paramfile): # Diffusive time scale if ndD_s["elyteModelType"] == "dilute": D_ref = dD_s["D_ref"] = Damb + k_h_ref = dD_s["k_h_ref"] = dD_s["k_h"] t_ref = dD_s["t_ref"] = dD_s["td"] = L_ref**2 / D_ref curr_ref = dD_s["curr_ref"] = 3600. / t_ref dD_s["sigma_s_ref"] = (L_ref**2 * F**2 * c_ref) / (t_ref * k * N_A * T_ref) @@ -260,6 +265,8 @@ def get_dicts_from_configs(P_s, P_e, paramfile): ndD_s["Rser"] = dD_s["Rser"] / Rser_ref ndD_s["Dp"] = Dp / D_ref ndD_s["Dm"] = Dm / D_ref + ndD_s["k_h"] = k_h / k_h_ref + ndD_s["cp"] = cp/(k_h_ref*t_ref / L_ref**3) ndD_s["c0"] = c0 / c_ref ndD_s["phi_cathode"] = 0. ndD_s["currset"] = dD_s["currset"] / theoretical_1C_current / curr_ref diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index bfea594f..7224c78b 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -368,9 +368,16 @@ def DeclareEquations(self): eq = self.CreateEquation("lyte_charge_cons_vol{vInd}".format(vInd=vInd)) eq.Residual = -dvgi[vInd] + ndD["zp"]*Rvvec[vInd] # Energy Conservation - eq = self.CreateEquation("lyte_energy_cons_vol{vInd}".format(vInd=vInd)) - eq.Residual = disc["porosvec"][vInd]*dTdtvec[vInd] - \ - dvgq[vInd] # do we add heat generation from current blah? + if ndD['nonisothermal']: + # if heat generation is turned on + eq = self.CreateEquation("lyte_energy_cons_vol{vInd}".format(vInd=vInd)) + eq.Residual = disc["dxvec"][vInd]*disc["porosvec"][vInd] * \ + ndD["cp"]*dTdtvec[vInd] - dvgq[vInd] + else: + # if heat generation is turned off + eq = self.CreateEquation("lyte_energy_cons_vol{vInd}".format(vInd=vInd)) + eq.Residual = dTdtvec[vInd] - 0 + # add heat generation from reaction later # Define the total current. This must be done at the capacity # limiting electrode because currents are specified in @@ -502,6 +509,7 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, ndD): # Get porosity at cell edges using weighted harmonic mean eps_o_tau_edges = utils.weighted_linear_mean(eps_o_tau, wt) Dp = eps_o_tau_edges * ndD["Dp"] + k_h = eps_o_tau_edges * ndD["k_h"] Dm = eps_o_tau_edges * ndD["Dm"] # neglecting soret diffusion # Np_edges_int = nup*(-Dp*np.diff(c_lyte)/dxd1 @@ -511,12 +519,13 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, ndD): i_edges_int = (-((nup*zp*Dp + num*zm*Dm)*np.diff(c_lyte)/dxd1) - (nup*zp ** 2*Dp + num*zm**2*Dm)/T_edges_int*c_edges_int*np.diff(phi_lyte)/dxd1) # i_edges_int = zp*Np_edges_int + zm*Nm_edges_int - q_edges_int = 0*np.diff(c_lyte) + q_edges_int = -k_h*np.diff(T_lyte)/dxd1 elif ndD["elyteModelType"] == "SM": - D_fs, sigma_fs, thermFac, tp0 = getattr(props_elyte,ndD["SMset"])()[:-1] + D_fs, sigma_fs, k_h_fs, thermFac, tp0 = getattr(props_elyte,ndD["SMset"])()[:-2] # Get diffusivity and conductivity at cell edges using weighted harmonic mean D_edges = utils.weighted_harmonic_mean(eps_o_tau*D_fs(c_lyte, T_lyte), wt) + k_h_edges = utils.weighted_harmonic_mean(eps_o_tau*k_h_fs(c_lyte, T_lyte), wt) sigma_edges = utils.weighted_harmonic_mean(eps_o_tau*sigma_fs(c_lyte, T_lyte), wt) sp, n = ndD["sp"], ndD["n_refTrode"] @@ -530,5 +539,5 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, ndD): ) Nm_edges_int = num*(-D_edges*np.diff(c_lyte)/dxd1 + (1./(num*zm)*(1-tp0(c_edges_int, T_edges_int))*i_edges_int)) - q_edges_int = 0*np.diff(c_lyte) + q_edges_int = -k_h_edges*np.diff(T_lyte)/dxd1 return Nm_edges_int, i_edges_int, q_edges_int diff --git a/mpet/props_elyte.py b/mpet/props_elyte.py index 09d6ada6..fa8089d8 100644 --- a/mpet/props_elyte.py +++ b/mpet/props_elyte.py @@ -35,6 +35,9 @@ def D(c, T): def therm_fac(c, T): return 1. + def k_h(c, T): + return 1e-10 # W/(m*K) + def sigma(cin, T): c = cin * 1000 # mol/m^3 p_max = 0.542 @@ -48,6 +51,7 @@ def sigma(cin, T): - (a/p_u)*(c/rho - p_u))) # S/m return out Dref = D(cref, 1) + khref = k_h(cref, 1) def D_ndim(c, T): return D(c, T) / Dref @@ -55,7 +59,11 @@ def D_ndim(c, T): def sigma_ndim(c, T): return sigma(c, T) * ( k*Tref/(e**2*Dref*N_A*(1000*cref))) - return D_ndim, sigma_ndim, therm_fac, tp0, Dref + + def k_h_ndim(c, T): + return k_h(c,T) / khref + + return D_ndim, sigma_ndim, k_h_ndim, therm_fac, tp0, Dref, khref def valoen_reimers(): @@ -71,6 +79,9 @@ def therm_fac(c, T): tmp = 0.601 - 0.24*c**(0.5) + 0.982*(1 - 0.0052*((T*Tref) - 294))*c**(1.5) return tmp/(1-tp0(c, T)) + def k_h(c, T): + return 1e-10 # W/(m*K) + def sigma(c, T): (k00, k01, k02, k10, k11, k12, @@ -84,6 +95,7 @@ def sigma(c, T): out *= 0.1 # S/m return out Dref = D(cref, 1) + khref = k_h(cref, 1) def D_ndim(c, T): return D(c, T) / Dref @@ -91,7 +103,11 @@ def D_ndim(c, T): def sigma_ndim(c, T): return sigma(c, T) * ( k*Tref/(e**2*Dref*N_A*(1000*cref))) - return D_ndim, sigma_ndim, therm_fac, tp0, Dref + + def k_h_ndim(c, T): + return k_h(c,T) / khref + + return D_ndim, sigma_ndim, k_h_ndim, therm_fac, tp0, Dref, khref def valoen_bernardi(): @@ -99,7 +115,7 @@ def valoen_bernardi(): Valoen and Reimers 2005. The only change from Valoen and Reimers is the conductivity. """ - D_ndim, Ign, therm_fac, tp0, Dref = valoen_reimers() + D_ndim, Ign, k_h_ndim, therm_fac, tp0, Dref, khref = valoen_reimers() def sigma(c, T): (k00, k01, k02, @@ -117,7 +133,7 @@ def sigma(c, T): def sigma_ndim(c, T): return sigma(c, T) * ( k*Tref/(e**2*Dref*N_A*(1000*cref))) - return D_ndim, sigma_ndim, therm_fac, tp0, Dref + return D_ndim, sigma_ndim, k_h_ndim, therm_fac, tp0, Dref, khref def test1(): @@ -134,12 +150,16 @@ def D(c, T): def therm_fac(c, T): return 1. + def k_h(c, T): + return 1e-10 # W/(m*K) + def tp0(c, T): return Dp/(Dp+Dm) def sigma(c, T): return Dm*(1000*c)*N_A*e**2/(k*T*Tref*(1-tp0(c))) # S/m Dref = D(cref, 1) + khref = k_h(cref, 1) def D_ndim(c, T): return D(c, T) / Dref @@ -147,7 +167,11 @@ def D_ndim(c, T): def sigma_ndim(c, T): return sigma(c, T) * ( k*Tref/(e**2*Dref*N_A*(1000*cref))) - return D_ndim, sigma_ndim, therm_fac, tp0, Dref + + def k_h_ndim(c, T): + return k_h(c,T) / khref + + return D_ndim, sigma_ndim, k_h_ndim, therm_fac, tp0, Dref, khref def LIONSIMBA_nonisothermal(): @@ -187,7 +211,11 @@ def D(c, T): def therm_fac(c, T): return 1. + def k_h(c, T): + return 1e-10 # W/(m*K) + Dref = D(cref, 1) + khref = k_h(cref, 1) def D_ndim(c, T): return D(c, T) / Dref @@ -195,7 +223,11 @@ def D_ndim(c, T): def sigma_ndim(c, T): return sigma(c, T) * ( k*Tref/(e**2*Dref*N_A*(1000*cref))) - return D_ndim, sigma_ndim, therm_fac, tp0, Dref + + def k_h_ndim(c, T): + return k_h(c,T) / khref + + return D_ndim, sigma_ndim, k_h_ndim, therm_fac, tp0, Dref, khref def LIONSIMBA_isothermal(): @@ -216,7 +248,11 @@ def D(c, T): def therm_fac(c, T): return 1. + def k_h(c, T): + return 1e-10 # W/(m*K) + Dref = D(cref, 1) + khref = k_h(cref, 1) def D_ndim(c, T): return D(c, T) / Dref @@ -224,4 +260,8 @@ def D_ndim(c, T): def sigma_ndim(c, T): return sigma(c, T) * ( k*Tref/(e**2*Dref*N_A*(1000*cref))) - return D_ndim, sigma_ndim, therm_fac, tp0, Dref + + def k_h_ndim(c, T): + return k_h(c,T) / khref + + return D_ndim, sigma_ndim, k_h_ndim, therm_fac, tp0, Dref, khref From 55f475909c1ea9c05556e0ecf552ae82af382561 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Mon, 24 May 2021 01:58:24 -0400 Subject: [PATCH 12/57] added heat conductivity and heat capacity to param files --- tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg | 3 ++- .../benchmark_LIONSIMBA_nonisothermal/params_system.cfg | 3 ++- tests/ref_outputs/test001/params_system.cfg | 3 ++- tests/ref_outputs/test002/params_system.cfg | 3 ++- tests/ref_outputs/test003/params_system.cfg | 3 ++- tests/ref_outputs/test004/params_system.cfg | 3 ++- tests/ref_outputs/test005/params_system.cfg | 3 ++- tests/ref_outputs/test006/params_system.cfg | 3 ++- tests/ref_outputs/test007/params_system.cfg | 3 ++- tests/ref_outputs/test008/params_system.cfg | 3 ++- tests/ref_outputs/test009/params_system.cfg | 3 ++- tests/ref_outputs/test010/params_system.cfg | 3 ++- tests/ref_outputs/test011/params_system.cfg | 3 ++- tests/ref_outputs/test012/params_system.cfg | 3 ++- tests/ref_outputs/test013/params_system.cfg | 3 ++- tests/ref_outputs/test014/params_system.cfg | 3 ++- tests/ref_outputs/test015/params_system.cfg | 3 ++- tests/ref_outputs/test016/params_system.cfg | 3 ++- tests/ref_outputs/test017/params_system.cfg | 3 ++- tests/ref_outputs/test018/params_system.cfg | 3 ++- tests/ref_outputs/test019/params_system.cfg | 3 ++- tests/ref_outputs/test020/params_system.cfg | 2 ++ tests/ref_outputs/test021/params_system.cfg | 2 ++ tests/ref_outputs/test022/params_system.cfg | 3 ++- tests/ref_outputs/test023/params_system.cfg | 3 ++- 25 files changed, 50 insertions(+), 23 deletions(-) diff --git a/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg index 935cfb75..8684ef5f 100644 --- a/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg +++ b/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg @@ -75,4 +75,5 @@ n = 1 sp = -1 Dp = 7.5e-10 Dm = 7.5e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg index c9027305..76651ed6 100644 --- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg +++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg @@ -75,4 +75,5 @@ n = 1 sp = -1 Dp = 7.5e-10 Dm = 7.5e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test001/params_system.cfg b/tests/ref_outputs/test001/params_system.cfg index 7f43e75d..07cf71b0 100644 --- a/tests/ref_outputs/test001/params_system.cfg +++ b/tests/ref_outputs/test001/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test002/params_system.cfg b/tests/ref_outputs/test002/params_system.cfg index 7f43e75d..07cf71b0 100644 --- a/tests/ref_outputs/test002/params_system.cfg +++ b/tests/ref_outputs/test002/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test003/params_system.cfg b/tests/ref_outputs/test003/params_system.cfg index 7f43e75d..07cf71b0 100644 --- a/tests/ref_outputs/test003/params_system.cfg +++ b/tests/ref_outputs/test003/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test004/params_system.cfg b/tests/ref_outputs/test004/params_system.cfg index 7f43e75d..07cf71b0 100644 --- a/tests/ref_outputs/test004/params_system.cfg +++ b/tests/ref_outputs/test004/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test005/params_system.cfg b/tests/ref_outputs/test005/params_system.cfg index d793fd46..958ddf1c 100644 --- a/tests/ref_outputs/test005/params_system.cfg +++ b/tests/ref_outputs/test005/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test006/params_system.cfg b/tests/ref_outputs/test006/params_system.cfg index 93632301..c4cacd71 100644 --- a/tests/ref_outputs/test006/params_system.cfg +++ b/tests/ref_outputs/test006/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test007/params_system.cfg b/tests/ref_outputs/test007/params_system.cfg index 69e7f049..0e10e056 100644 --- a/tests/ref_outputs/test007/params_system.cfg +++ b/tests/ref_outputs/test007/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test008/params_system.cfg b/tests/ref_outputs/test008/params_system.cfg index 6f145009..ec8ee847 100644 --- a/tests/ref_outputs/test008/params_system.cfg +++ b/tests/ref_outputs/test008/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test009/params_system.cfg b/tests/ref_outputs/test009/params_system.cfg index 7f43e75d..07cf71b0 100644 --- a/tests/ref_outputs/test009/params_system.cfg +++ b/tests/ref_outputs/test009/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test010/params_system.cfg b/tests/ref_outputs/test010/params_system.cfg index 894f130d..a151988e 100644 --- a/tests/ref_outputs/test010/params_system.cfg +++ b/tests/ref_outputs/test010/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test011/params_system.cfg b/tests/ref_outputs/test011/params_system.cfg index 5193c14e..de7dc3a2 100644 --- a/tests/ref_outputs/test011/params_system.cfg +++ b/tests/ref_outputs/test011/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test012/params_system.cfg b/tests/ref_outputs/test012/params_system.cfg index 3e400001..9f34c385 100644 --- a/tests/ref_outputs/test012/params_system.cfg +++ b/tests/ref_outputs/test012/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test013/params_system.cfg b/tests/ref_outputs/test013/params_system.cfg index a99eb667..0fe12bff 100644 --- a/tests/ref_outputs/test013/params_system.cfg +++ b/tests/ref_outputs/test013/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test014/params_system.cfg b/tests/ref_outputs/test014/params_system.cfg index b9e9827c..7a01acb5 100644 --- a/tests/ref_outputs/test014/params_system.cfg +++ b/tests/ref_outputs/test014/params_system.cfg @@ -73,4 +73,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test015/params_system.cfg b/tests/ref_outputs/test015/params_system.cfg index de859b21..356531ea 100644 --- a/tests/ref_outputs/test015/params_system.cfg +++ b/tests/ref_outputs/test015/params_system.cfg @@ -73,4 +73,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test016/params_system.cfg b/tests/ref_outputs/test016/params_system.cfg index 55b3f681..2873bb15 100644 --- a/tests/ref_outputs/test016/params_system.cfg +++ b/tests/ref_outputs/test016/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test017/params_system.cfg b/tests/ref_outputs/test017/params_system.cfg index ed800513..5d3844b1 100644 --- a/tests/ref_outputs/test017/params_system.cfg +++ b/tests/ref_outputs/test017/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test018/params_system.cfg b/tests/ref_outputs/test018/params_system.cfg index 7be3f05f..70bd1834 100644 --- a/tests/ref_outputs/test018/params_system.cfg +++ b/tests/ref_outputs/test018/params_system.cfg @@ -73,4 +73,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test019/params_system.cfg b/tests/ref_outputs/test019/params_system.cfg index f2ac1db6..bdf8f355 100644 --- a/tests/ref_outputs/test019/params_system.cfg +++ b/tests/ref_outputs/test019/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test020/params_system.cfg b/tests/ref_outputs/test020/params_system.cfg index cea407a1..efb0b6eb 100644 --- a/tests/ref_outputs/test020/params_system.cfg +++ b/tests/ref_outputs/test020/params_system.cfg @@ -77,3 +77,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test021/params_system.cfg b/tests/ref_outputs/test021/params_system.cfg index 1eb6b8e7..784de2c3 100644 --- a/tests/ref_outputs/test021/params_system.cfg +++ b/tests/ref_outputs/test021/params_system.cfg @@ -78,3 +78,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test022/params_system.cfg b/tests/ref_outputs/test022/params_system.cfg index 5fdd3238..ca37a96f 100644 --- a/tests/ref_outputs/test022/params_system.cfg +++ b/tests/ref_outputs/test022/params_system.cfg @@ -78,4 +78,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 diff --git a/tests/ref_outputs/test023/params_system.cfg b/tests/ref_outputs/test023/params_system.cfg index a99eb667..0fe12bff 100644 --- a/tests/ref_outputs/test023/params_system.cfg +++ b/tests/ref_outputs/test023/params_system.cfg @@ -76,4 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 - +k_h = 1000 +cp = 10 From c41d10eefa322d0e6dc44e46b538a509fc75c596 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Mon, 24 May 2021 16:36:18 -0400 Subject: [PATCH 13/57] fixed error with switching between isothermal/nonisothermal --- mpet/mod_cell.py | 2 +- mpet/plot/plot_data.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index 7224c78b..b0c68189 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -368,7 +368,7 @@ def DeclareEquations(self): eq = self.CreateEquation("lyte_charge_cons_vol{vInd}".format(vInd=vInd)) eq.Residual = -dvgi[vInd] + ndD["zp"]*Rvvec[vInd] # Energy Conservation - if ndD['nonisothermal']: + if ndD['nonisothermal'] == True: # if heat generation is turned on eq = self.CreateEquation("lyte_energy_cons_vol{vInd}".format(vInd=vInd)) eq.Residual = disc["dxvec"][vInd]*disc["porosvec"][vInd] * \ diff --git a/mpet/plot/plot_data.py b/mpet/plot/plot_data.py index 5ebc7201..711f4566 100644 --- a/mpet/plot/plot_data.py +++ b/mpet/plot/plot_data.py @@ -348,8 +348,9 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu Nvol, ndD_s["L"], ndD_s["poros"], ndD_s["BruggExp"]) i_edges = np.zeros((numtimes, len(facesvec))) for tInd in range(numtimes): + # no heat flux at boundary i_edges[tInd, :] = mod_cell.get_lyte_internal_fluxes( - cmat[tInd, :], pmat[tInd, :], disc, ndD_s)[1] + cmat[tInd, :], pmat[tInd, :], np.zeros(pmat[tInd, :].shape), disc, ndD_s)[1] if plot_type in ["elytei", "elyteif"]: ylbl = r'Current density of electrolyte [A/m$^2$]' datax = facesvec From 55eca128ea568e3e206aa8208f263551e6805c0d Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Tue, 25 May 2021 16:23:41 -0400 Subject: [PATCH 14/57] added missing variables to base configs for analytical tests --- tests/baseConfigs/params_system.cfg | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/baseConfigs/params_system.cfg b/tests/baseConfigs/params_system.cfg index 1e4d99fb..09f9ab75 100644 --- a/tests/baseConfigs/params_system.cfg +++ b/tests/baseConfigs/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 10 Rser = 0. @@ -76,3 +76,5 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 +k_h = 10000 +cp = 10 From 4e8577deb26d1471cf7867eea27f3b71f2d57dec Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Wed, 26 May 2021 17:49:42 -0400 Subject: [PATCH 15/57] set default for plotting boundary flux --- mpet/plot/plot_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mpet/plot/plot_data.py b/mpet/plot/plot_data.py index 711f4566..68568f5b 100644 --- a/mpet/plot/plot_data.py +++ b/mpet/plot/plot_data.py @@ -350,7 +350,7 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu for tInd in range(numtimes): # no heat flux at boundary i_edges[tInd, :] = mod_cell.get_lyte_internal_fluxes( - cmat[tInd, :], pmat[tInd, :], np.zeros(pmat[tInd, :].shape), disc, ndD_s)[1] + cmat[tInd, :], pmat[tInd, :], np.ones(pmat[tInd, :].shape), disc, ndD_s)[1] if plot_type in ["elytei", "elyteif"]: ylbl = r'Current density of electrolyte [A/m$^2$]' datax = facesvec From b20fc6761fe6cc2743907cc2e11231b259962361 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Thu, 10 Jun 2021 21:54:51 -0400 Subject: [PATCH 16/57] added ohmic heat generation --- mpet/io_utils.py | 2 ++ mpet/mod_cell.py | 22 +++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/mpet/io_utils.py b/mpet/io_utils.py index 2f798f99..7ba84567 100644 --- a/mpet/io_utils.py +++ b/mpet/io_utils.py @@ -161,6 +161,7 @@ def get_dicts_from_configs(P_s, P_e, paramfile): Dm = dD_s["Dm"] = P_s.getfloat('Electrolyte', 'Dm') k_h = dD_s["k_h"] = P_s.getfloat('Electrolyte', 'k_h') cp = dD_s["cp"] = P_s.getfloat('Electrolyte', 'cp') + sigma_lyte = dD_s["sigma_lyte"] = P_s.getfloat('Electrolyte', 'sigma_lyte', fallback = 0.1) # Constants k = dD_s["k"] = 1.381e-23 # J/(K particle) @@ -267,6 +268,7 @@ def get_dicts_from_configs(P_s, P_e, paramfile): ndD_s["Dm"] = Dm / D_ref ndD_s["k_h"] = k_h / k_h_ref ndD_s["cp"] = cp/(k_h_ref*t_ref / L_ref**3) + ndD_s["sigma_lyte"] = sigma_lyte*k*T_ref/(e**2*D_ref*N_A*c_ref) ndD_s["c0"] = c0 / c_ref ndD_s["phi_cathode"] = 0. ndD_s["currset"] = dD_s["currset"] / theoretical_1C_current / curr_ref diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index b0c68189..5a57e39e 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -360,6 +360,7 @@ def DeclareEquations(self): dvgNm = np.diff(Nm_edges)/disc["dxvec"] dvgi = np.diff(i_edges)/disc["dxvec"] dvgq = np.diff(q_edges)/disc["dxvec"] + q_ohm = get_ohmic_heat(cvec, Tvec, i_edges, disc, ndD) for vInd in range(Nlyte): # Mass Conservation (done with the anion, although "c" is neutral salt conc) eq = self.CreateEquation("lyte_mass_cons_vol{vInd}".format(vInd=vInd)) @@ -372,7 +373,7 @@ def DeclareEquations(self): # if heat generation is turned on eq = self.CreateEquation("lyte_energy_cons_vol{vInd}".format(vInd=vInd)) eq.Residual = disc["dxvec"][vInd]*disc["porosvec"][vInd] * \ - ndD["cp"]*dTdtvec[vInd] - dvgq[vInd] + ndD["cp"]*dTdtvec[vInd] - dvgq[vInd] - q_ohm[vInd] else: # if heat generation is turned off eq = self.CreateEquation("lyte_energy_cons_vol{vInd}".format(vInd=vInd)) @@ -541,3 +542,22 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, ndD): + (1./(num*zm)*(1-tp0(c_edges_int, T_edges_int))*i_edges_int)) q_edges_int = -k_h_edges*np.diff(T_lyte)/dxd1 return Nm_edges_int, i_edges_int, q_edges_int + + +def get_ohmic_heat(c_lyte, T_lyte, i_edges_int, disc, ndD): + eps_o_tau = disc["eps_o_tau"][1:-1] + + #get average current + i_cent = utils.mean_linear(i_edges_int) + + #initialize sigma + sigma = 0 + + if ndD["elyteModelType"] == "dilute": + sigma = eps_o_tau * ndD["sigma_lyte"] + elif ndD["elyteModelType"] == "SM": + sigma_fs = getattr(props_elyte,ndD["SMset"])()[1] + # Get diffusivity and conductivity at cell edges using weighted harmonic mean + sigma = eps_o_tau*sigma_fs(c_lyte, T_lyte) + q_ohmic = i_cent**2/sigma + return q_ohmic From 5a59660ea759891a5885a2e62eb02837f15a50ee Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Thu, 10 Jun 2021 21:55:53 -0400 Subject: [PATCH 17/57] modified input file --- configs/params_system.cfg | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/configs/params_system.cfg b/configs/params_system.cfg index a45203da..85a85454 100644 --- a/configs/params_system.cfg +++ b/configs/params_system.cfg @@ -49,6 +49,9 @@ relTol = 1e-6 absTol = 1e-6 # Initial Temperature throughout electrode, K T0 = 298 +# Nonisothermal: true for heat generation throughout electrode, false +# for no heat generation +nonisothermal = true # Random seed. Set to true to give a random seed in the simulation # (affects noise, particle size distribution). Set to true exactly # reproducible results -- useful for testing. @@ -181,3 +184,9 @@ sp = -1 # e.g. for LiPF6 in EC/DMC, Dp = 2.2e-10, Dm = 2.94e-10 Dp = 2.2e-10 Dm = 2.94e-10 +# Heat conductivity of electrolyte. add physical values later +k_h = 1 +# Heat capacity of electrolyte. add physical values later +cp = 1e15 +# Electrolyte Conductivity (S/m) only used for heat generation +sigma_lyte = 0.1 From 651764f7e4f1324afc4e00abb152c834eec6b3b3 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Fri, 11 Jun 2021 02:52:18 -0400 Subject: [PATCH 18/57] added thermal boundary conditions with the environment --- mpet/io_utils.py | 2 ++ mpet/mod_cell.py | 16 ++++++++++++---- mpet/sim.py | 2 ++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/mpet/io_utils.py b/mpet/io_utils.py index 7ba84567..3884d735 100644 --- a/mpet/io_utils.py +++ b/mpet/io_utils.py @@ -161,6 +161,7 @@ def get_dicts_from_configs(P_s, P_e, paramfile): Dm = dD_s["Dm"] = P_s.getfloat('Electrolyte', 'Dm') k_h = dD_s["k_h"] = P_s.getfloat('Electrolyte', 'k_h') cp = dD_s["cp"] = P_s.getfloat('Electrolyte', 'cp') + h_h = dD_s["h_h"] = P_s.getfloat('Electrolyte', 'h_h') sigma_lyte = dD_s["sigma_lyte"] = P_s.getfloat('Electrolyte', 'sigma_lyte', fallback = 0.1) # Constants @@ -268,6 +269,7 @@ def get_dicts_from_configs(P_s, P_e, paramfile): ndD_s["Dm"] = Dm / D_ref ndD_s["k_h"] = k_h / k_h_ref ndD_s["cp"] = cp/(k_h_ref*t_ref / L_ref**3) + ndD_s["h_h"] = h_h*L_ref/k_h_ref ndD_s["sigma_lyte"] = sigma_lyte*k*T_ref/(e**2*D_ref*N_A*c_ref) ndD_s["c0"] = c0 / c_ref ndD_s["phi_cathode"] = 0. diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index 5a57e39e..2c5fd1ee 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -117,6 +117,10 @@ def __init__(self, Name, Parent=None, Description="", ndD_s=None, self.c_lyteGP_L = dae.daeVariable("c_lyteGP_L", conc_t, self, "c_lyte left BC GP") self.phi_lyteGP_L = dae.daeVariable( "phi_lyteGP_L", elec_pot_t, self, "phi_lyte left BC GP") + self.T_lyteGP_L = dae.daeVariable( + "T_lyteGP_L", temp_t, self, "T_lyte left BC GP") + self.T_lyteGP_R = dae.daeVariable( + "T_lyteGP_R", temp_t, self, "T_lyte left BC GP") self.phi_applied = dae.daeVariable( "phi_applied", elec_pot_t, self, "Overall battery voltage (at anode current collector)") @@ -315,7 +319,7 @@ def DeclareEquations(self): # Ghost points on the left and no-gradients on the right ctmp = np.hstack((self.c_lyteGP_L(), cvec, cvec[-1])) # temperature uses a constant boundary condition - Ttmp = np.hstack((Tvec[0], Tvec, Tvec[-1])) + Ttmp = np.hstack((self.T_lyteGP_L(), Tvec, self.T_lyteGP_R())) phitmp = np.hstack((self.phi_lyteGP_L(), phivec, phivec[-1])) Nm_edges, i_edges, q_edges = get_lyte_internal_fluxes(ctmp, phitmp, Ttmp, disc, ndD) @@ -325,6 +329,8 @@ def DeclareEquations(self): # 2) assume we have a Li foil with BV kinetics and the specified rate constant eqC = self.CreateEquation("GhostPointC_L") eqP = self.CreateEquation("GhostPointP_L") + eqTL = self.CreateEquation("GhostPointT_L") + eqTR = self.CreateEquation("GhostPointT_R") if Nvol["a"] == 0: # Concentration BC from mass flux eqC.Residual = Nm_edges[0] @@ -356,6 +362,9 @@ def DeclareEquations(self): else: eqC.Residual = ctmp[0] - ctmp[1] eqP.Residual = phitmp[0] - phitmp[1] + #boundary equation for temperature variables. per volume + eqTL.Residual = q_edges[0] + ndD["h_h"]*(Ttmp[0]-ndD["T0"])/disc["dxvec"][0] + eqTR.Residual = q_edges[-1] + ndD["h_h"]*(Ttmp[-1]-ndD["T0"])/disc["dxvec"][0] dvgNm = np.diff(Nm_edges)/disc["dxvec"] dvgi = np.diff(i_edges)/disc["dxvec"] @@ -370,10 +379,9 @@ def DeclareEquations(self): eq.Residual = -dvgi[vInd] + ndD["zp"]*Rvvec[vInd] # Energy Conservation if ndD['nonisothermal'] == True: - # if heat generation is turned on + # if heat generation is turned on. per volume. eq = self.CreateEquation("lyte_energy_cons_vol{vInd}".format(vInd=vInd)) - eq.Residual = disc["dxvec"][vInd]*disc["porosvec"][vInd] * \ - ndD["cp"]*dTdtvec[vInd] - dvgq[vInd] - q_ohm[vInd] + eq.Residual = disc["porosvec"][vInd]*ndD["cp"]*dTdtvec[vInd] - dvgq[vInd] - q_ohm[vInd] else: # if heat generation is turned off eq = self.CreateEquation("lyte_energy_cons_vol{vInd}".format(vInd=vInd)) diff --git a/mpet/sim.py b/mpet/sim.py index 9acc44e2..092b33ef 100644 --- a/mpet/sim.py +++ b/mpet/sim.py @@ -120,6 +120,8 @@ def SetUpVariables(self): if not self.m.SVsim: self.m.c_lyteGP_L.SetInitialGuess(ndD_s["c0"]) self.m.phi_lyteGP_L.SetInitialGuess(0) + self.m.T_lyteGP_L.SetInitialGuess(ndD_s["T0"]) + self.m.T_lyteGP_R.SetInitialGuess(ndD_s["T0"]) # Separator electrolyte initialization for i in range(Nvol["s"]): From 0316beb2886f1cb1ff3a1f1fdd64cc017348e287 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Fri, 11 Jun 2021 03:03:30 -0400 Subject: [PATCH 19/57] updated parameters --- configs/params_system.cfg | 11 +++++++---- mpet/io_utils.py | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/configs/params_system.cfg b/configs/params_system.cfg index 85a85454..c166c556 100644 --- a/configs/params_system.cfg +++ b/configs/params_system.cfg @@ -184,9 +184,12 @@ sp = -1 # e.g. for LiPF6 in EC/DMC, Dp = 2.2e-10, Dm = 2.94e-10 Dp = 2.2e-10 Dm = 2.94e-10 -# Heat conductivity of electrolyte. add physical values later -k_h = 1 -# Heat capacity of electrolyte. add physical values later -cp = 1e15 +# Thermal conductivity of electrolyte (W/m*K). add physical values later +k_h = 0.2 +# Heat capacity of electrolyte (J/(mol(K)). add physical values later +#cp = 1000 +cp = 1e8 # Electrolyte Conductivity (S/m) only used for heat generation sigma_lyte = 0.1 +# Heat transfer coefficient (W/(m^2*K)) with the external temperature, always taken to be T0 = 298K +h_h = 500 diff --git a/mpet/io_utils.py b/mpet/io_utils.py index 3884d735..7ad14a44 100644 --- a/mpet/io_utils.py +++ b/mpet/io_utils.py @@ -161,7 +161,7 @@ def get_dicts_from_configs(P_s, P_e, paramfile): Dm = dD_s["Dm"] = P_s.getfloat('Electrolyte', 'Dm') k_h = dD_s["k_h"] = P_s.getfloat('Electrolyte', 'k_h') cp = dD_s["cp"] = P_s.getfloat('Electrolyte', 'cp') - h_h = dD_s["h_h"] = P_s.getfloat('Electrolyte', 'h_h') + h_h = dD_s["h_h"] = P_s.getfloat('Electrolyte', 'h_h', fallback = 500) sigma_lyte = dD_s["sigma_lyte"] = P_s.getfloat('Electrolyte', 'sigma_lyte', fallback = 0.1) # Constants From f011f2cdfd0c012fd77bed8bb3c62b07a11ef7bb Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Wed, 16 Jun 2021 12:37:02 -0400 Subject: [PATCH 20/57] added relation between particle level temperatures and added option between boundary conditions --- mpet/mod_cell.py | 29 ++++++++++++++++++++++++++--- mpet/sim.py | 1 + 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index 2c5fd1ee..ca0ce37f 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -63,6 +63,7 @@ def __init__(self, Name, Parent=None, Description="", ndD_s=None, self.R_Vp = {} self.ffrac = {} self.T_lyte = {} + self.T_sol = {} for trode in trodes: # Concentration/potential in electrode regions of elyte self.c_lyte[trode] = dae.daeVariable( @@ -92,6 +93,10 @@ def __init__(self, Name, Parent=None, Description="", ndD_s=None, "T_lyte_{trode}".format(trode=trode), temp_t, self, "Temperature in the elyte in electrode {trode}".format(trode=trode), [self.DmnCell[trode]]) + self.T_sol[trode] = dae.daeVariable( + "T_sol_{trode}".format(trode=trode), temp_t, self, + "Temperature in the solid in electrode {trode}".format(trode=trode), + [self.DmnCell[trode]]) if Nvol["s"] >= 1: # If we have a separator self.c_lyte["s"] = dae.daeVariable( "c_lyte_s", conc_t, self, @@ -211,6 +216,20 @@ def DeclareEquations(self): * self.particles[trode][vInd,pInd].dcbardt()) eq.Residual = self.R_Vp[trode](vInd) - RHS + # Define average temperature in electrode volume + for trode in trodes: + for vInd in range(Nvol[trode]): + eq = self.CreateEquation( + "T_sol_trode{trode}vol{vInd}".format(vInd=vInd, trode=trode)) + RHS = 0 + # sum over particle volumes in given electrode volume + for pInd in range(Npart[trode]): + # The volume of this particular particle + Vj = ndD["psd_vol_FracVol"][trode][vInd,pInd] + RHS += self.particles[trode][vInd,pInd].T_lyte()*Vj + eq.Residual = self.T_sol[trode](vInd) - RHS + + # Define output port variables for trode in trodes: for vInd in range(Nvol[trode]): @@ -362,9 +381,13 @@ def DeclareEquations(self): else: eqC.Residual = ctmp[0] - ctmp[1] eqP.Residual = phitmp[0] - phitmp[1] - #boundary equation for temperature variables. per volume - eqTL.Residual = q_edges[0] + ndD["h_h"]*(Ttmp[0]-ndD["T0"])/disc["dxvec"][0] - eqTR.Residual = q_edges[-1] + ndD["h_h"]*(Ttmp[-1]-ndD["T0"])/disc["dxvec"][0] + if ndD['nonisothermal'] == True: + #boundary equation for temperature variables. per volume + eqTL.Residual = q_edges[0] + ndD["h_h"]*(Ttmp[0]-ndD["T0"])/disc["dxvec"][0] + eqTR.Residual = q_edges[-1] + ndD["h_h"]*(Ttmp[-1]-ndD["T0"])/disc["dxvec"][0] + else: + eqTL.Residual = Ttmp[0] - Ttmp[1] + eqTR.Residual = Ttmp[-1] - Ttmp[-2] dvgNm = np.diff(Nm_edges)/disc["dxvec"] dvgi = np.diff(i_edges)/disc["dxvec"] diff --git a/mpet/sim.py b/mpet/sim.py index 092b33ef..8b8c7f52 100644 --- a/mpet/sim.py +++ b/mpet/sim.py @@ -74,6 +74,7 @@ def SetUpVariables(self): self.m.R_Vp[tr].SetInitialGuess(i, 0.0) # set initial temperature condition self.m.T_lyte[tr].SetInitialCondition(i, ndD_s["T0"]) + self.m.T_sol[tr].SetInitialGuess(i, ndD_s["T0"]) # Guess initial value for the potential of the # electrodes if tr == "a": # anode From ed0bbc72f76aefe344f672e40827c69ede8ba1a6 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Fri, 6 Aug 2021 14:45:06 -0400 Subject: [PATCH 21/57] fixed error in reference values for temperature dependent chemical potential --- mpet/config/derived_values.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mpet/config/derived_values.py b/mpet/config/derived_values.py index cf9d371a..4bf88db9 100644 --- a/mpet/config/derived_values.py +++ b/mpet/config/derived_values.py @@ -236,9 +236,9 @@ def muR_ref(self, trode): solidType = self.config[trode, 'type'] if solidType in constants.two_var_types: - muR_ref = -muRfunc((cs0, cs0), (cs0bar, cs0bar), 1, 0.)[0][0] + muR_ref = -muRfunc((cs0, cs0), (cs0bar, cs0bar), self.config['T0'], 0.)[0][0] elif solidType in constants.one_var_types: - muR_ref = -muRfunc(cs0, cs0bar, 1, 0.)[0] + muR_ref = -muRfunc(cs0, cs0bar, self.config['T0'], 0.)[0] else: raise ValueError(f'Unknown solid type: {solidType}') return muR_ref From 99656c418c3fedc2cf0f7d01d0740da7b25b7d06 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Mon, 16 Aug 2021 21:56:46 -0700 Subject: [PATCH 22/57] removed solid temperature dependence (will add in the future) --- mpet/mod_cell.py | 18 ------------------ mpet/sim.py | 1 - 2 files changed, 19 deletions(-) diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index bc79d301..2a437ada 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -61,7 +61,6 @@ def __init__(self, config, Name, Parent=None, Description=""): self.R_Vp = {} self.ffrac = {} self.T_lyte = {} - self.T_sol = {} for trode in trodes: # Concentration/potential in electrode regions of elyte self.c_lyte[trode] = dae.daeVariable( @@ -91,10 +90,6 @@ def __init__(self, config, Name, Parent=None, Description=""): "T_lyte_{trode}".format(trode=trode), temp_t, self, "Temperature in the elyte in electrode {trode}".format(trode=trode), [self.DmnCell[trode]]) - self.T_sol[trode] = dae.daeVariable( - "T_sol_{trode}".format(trode=trode), temp_t, self, - "Temperature in the solid in electrode {trode}".format(trode=trode), - [self.DmnCell[trode]]) if config['have_separator']: # If we have a separator self.c_lyte["s"] = dae.daeVariable( "c_lyte_s", conc_t, self, @@ -215,19 +210,6 @@ def DeclareEquations(self): * self.particles[trode][vInd,pInd].dcbardt()) eq.Residual = self.R_Vp[trode](vInd) - RHS - # Define average temperature in electrode volume - for trode in trodes: - for vInd in range(Nvol[trode]): - eq = self.CreateEquation( - "T_sol_trode{trode}vol{vInd}".format(vInd=vInd, trode=trode)) - RHS = 0 - # sum over particle volumes in given electrode volume - for pInd in range(Npart[trode]): - # The volume of this particular particle - Vj = config["psd_vol_FracVol"][trode][vInd,pInd] - RHS += self.particles[trode][vInd,pInd].T_lyte()*Vj - eq.Residual = self.T_sol[trode](vInd) - RHS - # Define output port variables for trode in trodes: for vInd in range(Nvol[trode]): diff --git a/mpet/sim.py b/mpet/sim.py index 739af6cc..1b5e62f7 100644 --- a/mpet/sim.py +++ b/mpet/sim.py @@ -71,7 +71,6 @@ def SetUpVariables(self): self.m.R_Vp[tr].SetInitialGuess(i, 0.0) # set initial temperature condition self.m.T_lyte[tr].SetInitialCondition(i, config["T0"]) - self.m.T_sol[tr].SetInitialGuess(i, config["T0"]) # Guess initial value for the potential of the # electrodes if tr == "a": # anode From bfb693fbe59b0ff291664169247907e331721030 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Tue, 30 Nov 2021 14:41:18 -0500 Subject: [PATCH 23/57] added nonisothermal heat generation --- mpet/config/configuration.py | 21 ++++++++++-- mpet/config/constants.py | 4 ++- mpet/config/derived_values.py | 12 ++++--- mpet/config/parameterset.py | 4 ++- mpet/config/schemas.py | 15 ++++++--- mpet/geometry.py | 1 + mpet/mod_cell.py | 62 ++++++++++++++++++++++++++++------- mpet/mod_electrodes.py | 52 ++++++++++++++++++++++++++--- mpet/utils.py | 20 +++++++++++ 9 files changed, 162 insertions(+), 29 deletions(-) diff --git a/mpet/config/configuration.py b/mpet/config/configuration.py index 649c8ffa..73c1e8e2 100644 --- a/mpet/config/configuration.py +++ b/mpet/config/configuration.py @@ -111,9 +111,14 @@ def _init_from_dicts(self): self.D_s = ParameterSet(None, 'system', self.path) # set which electrodes there are based on which dict files exist trodes = ['c'] + # set up types of materials (cathode, anode electrolyte) for thermal parameters + materials = ['c', 'l'] if os.path.isfile(os.path.join(self.path, 'input_dict_anode.p')): trodes.append('a') + materials.append('a') self['trodes'] = trodes + self['materials'] = materials + # create empty electrode parametersets self.D_c = ParameterSet(None, 'electrode', self.path) if 'a' in self['trodes']: @@ -137,9 +142,13 @@ def _init_from_cfg(self, paramfile): self.D_s = ParameterSet(paramfile, 'system', self.path) # the anode and separator are optional: only if there are volumes to simulate trodes = ['c'] + # set up types of materials (cathode, anode electrolyte) for thermal parameters + materials = ['c', 'l'] if self.D_s['Nvol_a'] > 0: trodes.append('a') + materials.append('a') self['trodes'] = trodes + self['materials'] = materials # to check for separator, directly access underlying dict of system config; # self['Nvol']['s'] would not work because that requires have_separator to # be defined already @@ -471,10 +480,11 @@ def _scale_system_parameters(self, theoretical_1C_current): self['Dp'] = self['Dp'] / self['D_ref'] self['Dm'] = self['Dm'] / self['D_ref'] self['k_h'] = self['k_h'] / self['k_h_ref'] - self['cp'] = self['cp'] / (self['k_h_ref'] * self['t_ref'] / self['L_ref']**3) + self['cp_l'] = self['cp_l'] / \ + (self['k_h_ref'] * self['t_ref'] / (self['rho_ref']*self['L_ref']**2)) + self['rhom_l'] = self['rhom_l'] / self['rho_ref'] self['h_h'] = self['h_h'] * self['L_ref'] / self['k_h_ref'] - self['sigma_lyte'] = self['sigma_lyte'] * self['k_h_ref'] * constants.T_ref / \ - (constants.e**2 * self['D_ref'] * constants.N_A * constants.c_ref) + self['sigma_l'] = self['sigma_l'] / self['sigma_s_ref'] self['c0'] = self['c0'] / constants.c_ref self['phi_cathode'] = 0. # TODO: why is this defined if always 0? self['currset'] = self['currset'] / (theoretical_1C_current * self['curr_ref']) @@ -504,6 +514,11 @@ def _scale_electrode_parameters(self): if value is not None: self[trode, param] = value / kT + for mat in self['materials']: + self['cp'][mat] = self['cp'][mat] / \ + (self['k_h_ref'] * self['t_ref'] / (self['rho_ref']*self['L_ref']**2)) + self['rhom'][mat] = self['rhom'][mat] / self['rho_ref'] + # scalings on separator if self['have_separator']: self['L']['s'] /= self['L_ref'] diff --git a/mpet/config/constants.py b/mpet/config/constants.py index 63a26c5b..b3a4f689 100644 --- a/mpet/config/constants.py +++ b/mpet/config/constants.py @@ -20,9 +20,11 @@ #: parameter that are defined per electrode with a ``_{electrode}`` suffix PARAMS_PER_TRODE = ['Nvol', 'Npart', 'mean', 'stddev', 'cs0', 'simBulkCond', 'sigma_s', 'simPartCond', 'G_mean', 'G_stddev', 'L', 'P_L', 'poros', 'BruggExp', - 'specified_psd'] + 'specified_psd', 'rhom', 'cp'] #: subset of ``PARAMS_PER_TRODE``` that is defined for the separator as well PARAMS_SEPARATOR = ['Nvol', 'L', 'poros', 'BruggExp'] +# PARAMETERS THAT ARE NEEDED IN A THERMAL MODEL FOR ELECTROLYTE PROPERTIES +PARAMS_ELYTE = ['cp', 'sigma', 'rhom'] #: parameters that are defined for each particle, and their type PARAMS_PARTICLE = {'N': int, 'kappa': float, 'beta_s': float, 'D': float, 'k0': float, 'Rfilm': float, 'delta_L': float, 'Omega_a': float, 'E_D': float, diff --git a/mpet/config/derived_values.py b/mpet/config/derived_values.py index 4bf88db9..5032c71c 100644 --- a/mpet/config/derived_values.py +++ b/mpet/config/derived_values.py @@ -147,6 +147,12 @@ def curr_ref(self): """ return 3600. / self.config['t_ref'] + def rho_ref(self): + """Reference mass density used for energy balances + """ + m_ref = 1000 # reference is 1000 kg + return m_ref / self.config['L_ref']**3 + def sigma_s_ref(self): """Reference conductivity """ @@ -196,10 +202,8 @@ def D_ref(self): def k_h_ref(self): """Reference heat transfer coefficient """ - if self.config['elyteModelType'] == 'dilute': - return self.config['k_h'] - else: - return getattr(props_elyte, self.config['SMset'])()[-1] + return constants.c_ref * constants.k * \ + self.config['L_ref']**2 / (self.config['t_ref'] * constants.N_A) def z(self): """Electrode capacity ratio diff --git a/mpet/config/parameterset.py b/mpet/config/parameterset.py index d14fa346..95e7e401 100644 --- a/mpet/config/parameterset.py +++ b/mpet/config/parameterset.py @@ -2,7 +2,7 @@ import configparser from mpet.config import schemas -from mpet.config.constants import PARAMS_PER_TRODE, PARAMS_SEPARATOR +from mpet.config.constants import PARAMS_PER_TRODE, PARAMS_SEPARATOR, PARAMS_ELYTE from mpet.exceptions import UnknownParameterError @@ -84,6 +84,8 @@ def __getitem__(self, item): trodes = self['trodes'][:] # make a copy here to avoid adding values to the original if item in PARAMS_SEPARATOR and self['have_separator']: trodes.append('s') + if item in PARAMS_ELYTE: + trodes.append('l') for trode in trodes: # get the value for this electrode/separator and store it key = f'{item}_{trode}' diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py index 5c581bce..c305281b 100644 --- a/mpet/config/schemas.py +++ b/mpet/config/schemas.py @@ -114,6 +114,15 @@ def tobool(value): 'BruggExp_c': Use(float), 'BruggExp_a': Use(float), 'BruggExp_s': Use(float)}, + 'Thermal Parameters': {Optional('cp_c', default=1e8): Use(float), + Optional('cp_a', default=1e8): Use(float), + Optional('cp_l', default=1e8): Use(float), + Optional('rhom_c', default=0.2): Use(float), + Optional('rhom_a', default=0.2): Use(float), + Optional('rhom_l', default=0.2): Use(float), + Optional('k_h', default=0.2): Use(float), + Optional('h_h', default=500): Use(float), + Optional('sigma_l', default=500): Use(float)}, 'Electrolyte': {'c0': Use(float), 'zp': Use(int), 'zm': And(Use(int), lambda x: x < 0), @@ -124,11 +133,7 @@ def tobool(value): 'n': Use(int), 'sp': Use(int), 'Dp': Use(float), - 'Dm': Use(float), - Optional('cp', default=1e8): Use(float), - Optional('sigma_lyte', default=0.2): Use(float), - Optional('k_h', default=0.2): Use(float), - Optional('h_h', default=500): Use(float)}} + 'Dm': Use(float)}} #: Electrode parameters, per section electrode = {'Particles': {'type': lambda x: check_allowed_values(x, diff --git a/mpet/geometry.py b/mpet/geometry.py index 2b3fc98d..75020e45 100644 --- a/mpet/geometry.py +++ b/mpet/geometry.py @@ -85,6 +85,7 @@ def get_elyte_disc(Nvol, L, poros, BruggExp): # Distance between cell centers dxtmp = np.hstack((out["dxvec"][0], out["dxvec"], out["dxvec"][-1])) + out["dx"] = dxtmp out["dxd1"] = utils.mean_linear(dxtmp) # The porosity vector diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index 2a437ada..446bb6b8 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -59,6 +59,7 @@ def __init__(self, config, Name, Parent=None, Description=""): self.phi_bulk = {} self.phi_part = {} self.R_Vp = {} + self.Q_Vp = {} self.ffrac = {} self.T_lyte = {} for trode in trodes: @@ -83,6 +84,10 @@ def __init__(self, config, Name, Parent=None, Description=""): "R_Vp_{trode}".format(trode=trode), dae.no_t, self, "Rate of reaction of positives per electrode volume", [self.DmnCell[trode]]) + self.Q_Vp[trode] = dae.daeVariable( + "Q_Vp_{trode}".format(trode=trode), dae.no_t, self, + "Rate of heat generation of positives per electrode volume", + [self.DmnCell[trode]]) self.ffrac[trode] = dae.daeVariable( "ffrac_{trode}".format(trode=trode), mole_frac_t, self, "Overall filling fraction of solids in electrodes") @@ -210,6 +215,23 @@ def DeclareEquations(self): * self.particles[trode][vInd,pInd].dcbardt()) eq.Residual = self.R_Vp[trode](vInd) - RHS + # Define dimensionless R_Vp for each electrode volume + for trode in trodes: + for vInd in range(Nvol[trode]): + eq = self.CreateEquation( + "Q_Vp_trode{trode}vol{vInd}".format(vInd=vInd, trode=trode)) + # Start with no reaction, then add reactions for each + # particle in the volume. + RHS = 0 + # sum over particle volumes in given electrode volume + for pInd in range(Npart[trode]): + # The volume of this particular particle + Vj = config["psd_vol_FracVol"][trode][vInd,pInd] + RHS += -(config["beta"][trode] * (1-config["poros"][trode]) + * config["P_L"][trode] * Vj + * self.particles[trode][vInd,pInd].q_rxn_bar()) + eq.Residual = self.Q_Vp[trode](vInd) - RHS + # Define output port variables for trode in trodes: for vInd in range(Nvol[trode]): @@ -312,15 +334,19 @@ def DeclareEquations(self): cvec = utils.get_asc_vec(self.c_lyte, Nvol) dcdtvec = utils.get_asc_vec(self.c_lyte, Nvol, dt=True) phivec = utils.get_asc_vec(self.phi_lyte, Nvol) + phibulkvec = utils.get_asc_vec(self.phi_bulk, Nvol) Tvec = utils.get_asc_vec(self.T_lyte, Nvol) dTdtvec = utils.get_asc_vec(self.T_lyte, Nvol, dt=True) Rvvec = utils.get_asc_vec(self.R_Vp, Nvol) + Qvvec = utils.get_asc_vec(self.Q_Vp, Nvol) + rhocp_vec = utils.get_thermal_vec(Nvol, config) # Apply concentration and potential boundary conditions # Ghost points on the left and no-gradients on the right ctmp = np.hstack((self.c_lyteGP_L(), cvec, cvec[-1])) # temperature uses a constant boundary condition Ttmp = np.hstack((self.T_lyteGP_L(), Tvec, self.T_lyteGP_R())) phitmp = np.hstack((self.phi_lyteGP_L(), phivec, phivec[-1])) + phibulktmp = np.hstack((self.phi_cell(), phibulkvec, config["phi_cathode"])) Nm_edges, i_edges, q_edges = get_lyte_internal_fluxes(ctmp, phitmp, Ttmp, disc, config) @@ -374,7 +400,7 @@ def DeclareEquations(self): dvgNm = np.diff(Nm_edges)/disc["dxvec"] dvgi = np.diff(i_edges)/disc["dxvec"] dvgq = np.diff(q_edges)/disc["dxvec"] - q_ohm = get_ohmic_heat(cvec, Tvec, i_edges, disc, config) + q_ohm = get_ohmic_heat(ctmp, Ttmp, phibulktmp, phitmp, disc, config, Nvol) for vInd in range(Nlyte): # Mass Conservation (done with the anion, although "c" is neutral salt conc) eq = self.CreateEquation("lyte_mass_cons_vol{vInd}".format(vInd=vInd)) @@ -386,8 +412,8 @@ def DeclareEquations(self): if config['nonisothermal']: # if heat generation is turned on. per volume. eq = self.CreateEquation("lyte_energy_cons_vol{vInd}".format(vInd=vInd)) - eq.Residual = disc["porosvec"][vInd]*config["cp"] * \ - dTdtvec[vInd] - dvgq[vInd] - q_ohm[vInd] + eq.Residual = rhocp_vec[vInd] * dTdtvec[vInd] - \ + dvgq[vInd] - q_ohm[vInd] - Qvvec[vInd] else: # if heat generation is turned off eq = self.CreateEquation("lyte_energy_cons_vol{vInd}".format(vInd=vInd)) @@ -575,20 +601,34 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, config): return Nm_edges_int, i_edges_int, q_edges_int -def get_ohmic_heat(c_lyte, T_lyte, i_edges_int, disc, config): - eps_o_tau = disc["eps_o_tau"][1:-1] +def get_ohmic_heat(c_lyte, T_lyte, phi_lyte, phi_bulk, disc, config, Nvol): + eps_o_tau = disc["eps_o_tau"] + dx = disc["dx"][1:-1] - # get average current - i_cent = utils.mean_linear(i_edges_int) + wt = utils.pad_vec(disc["dxvec"]) + sigma_s = utils.get_asc_vec(config["sigma_s"], Nvol) + c_edges_int = utils.weighted_linear_mean(c_lyte, wt) + phi_lyte_int = utils.weighted_linear_mean(phi_lyte, wt) + phi_bulk_int = utils.weighted_linear_mean(phi_bulk, wt) + c_mid = c_lyte[1:-1] + T_mid = T_lyte[1:-1] # initialize sigma - sigma = 0 + q_ohmic = 0 if config["elyteModelType"] == "dilute": - sigma = eps_o_tau * config["sigma_lyte"] + sigma_l = eps_o_tau * config["sigma_l"] elif config["elyteModelType"] == "SM": + tp0 = getattr(props_elyte,config["SMset"])()[-3] + sigma_fs = getattr(props_elyte,config["SMset"])()[1] # Get diffusivity and conductivity at cell edges using weighted harmonic mean - sigma = eps_o_tau*sigma_fs(c_lyte, T_lyte) - q_ohmic = i_cent**2/sigma + sigma_l = eps_o_tau[1:-1]*sigma_fs(c_mid, T_mid) + q_ohmic = q_ohmic + 2*sigma_l*(1-tp0(c_mid, T_mid)) * \ + np.diff(np.log(c_edges_int))/dx*np.diff(phi_lyte_int)/dx + # this is going to be dra + sigma_s = (1-eps_o_tau[1:-1]) * sigma_s + q_ohmic = q_ohmic + sigma_s*(np.diff(phi_bulk_int)/dx)**2 + \ + sigma_l*(np.diff(phi_lyte_int)/dx)**2 + # do we have to extrapolate these return q_ohmic diff --git a/mpet/mod_electrodes.py b/mpet/mod_electrodes.py index f17718b9..74ee3f9f 100644 --- a/mpet/mod_electrodes.py +++ b/mpet/mod_electrodes.py @@ -55,6 +55,10 @@ def __init__(self, config, trode, vInd, pInd, "c2bar", mole_frac_t, self, "Average concentration in 'layer' 2 of active particle") self.dcbardt = dae.daeVariable("dcbardt", dae.no_t, self, "Rate of particle filling") + self.dcbar1dt = dae.daeVariable("dcbar1dt", dae.no_t, self, "Rate of particle 1 filling") + self.dcbar2dt = dae.daeVariable("dcbar2dt", dae.no_t, self, "Rate of particle 2 filling") + self.q_rxn_bar = dae.daeVariable( + "q_rxn_bar", dae.no_t, self, "Rate of heat generation in particle") if self.get_trode_param("type") not in ["ACR2"]: self.Rxn1 = dae.daeVariable("Rxn1", dae.no_t, self, "Rate of reaction 1") self.Rxn2 = dae.daeVariable("Rxn2", dae.no_t, self, "Rate of reaction 2") @@ -138,16 +142,36 @@ def DeclareEquations(self): for k in range(N): eq.Residual -= .5*(self.c1.dt(k) + self.c2.dt(k)) * volfrac_vec[k] + # Define average rate of filling of particle for cbar1 + eq = self.CreateEquation("dcbar1dt") + eq.Residual = self.dcbar1dt() + for k in range(N): + eq.Residual -= self.c1.dt(k) * volfrac_vec[k] + + # Define average rate of filling of particle for cbar1 + eq = self.CreateEquation("dcbar2dt") + eq.Residual = self.dcbar2dt() + for k in range(N): + eq.Residual -= self.c2.dt(k) * volfrac_vec[k] + c1 = np.empty(N, dtype=object) c2 = np.empty(N, dtype=object) c1[:] = [self.c1(k) for k in range(N)] c2[:] = [self.c2(k) for k in range(N)] if self.get_trode_param("type") in ["diffn2", "CHR2"]: # Equations for 1D particles of 1 field varible - self.sld_dynamics_1D2var(c1, c2, mu_O, act_lyte, ISfuncs, noises) + eta1, eta2, c_surf1, c_surf2 = self.sld_dynamics_1D2var(c1, c2, mu_O, act_lyte, + ISfuncs, noises) elif self.get_trode_param("type") in ["homog2", "homog2_sdn"]: # Equations for 0D particles of 1 field variables - self.sld_dynamics_0D2var(c1, c2, mu_O, act_lyte, ISfuncs, noises) + eta1, eta2, c_surf1, c_surf2 = self.sld_dynamics_0D2var(c1, c2, mu_O, act_lyte, + ISfuncs, noises) + + # Define average rate of heat generation + eq = self.CreateEquation("q_rxn_bar") + eq.Residual = self.q_rxn_bar() - 0.5 * self.dcbar1dt() * \ + (-eta1 - (np.log(c_surf1/(1-c_surf1))+1/self.c_lyte())) \ + - 0.5 * self.dcbar2dt() * (-eta2 - (np.log(c_surf2/(1-c_surf2))+1/self.c_lyte())) for eq in self.Equations: eq.CheckUnitsConsistency = False @@ -183,6 +207,7 @@ def sld_dynamics_0D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises): eq2 = self.CreateEquation("dc2sdt") eq1.Residual = self.c1.dt(0) - self.get_trode_param("delta_L")*Rxn1[0] eq2.Residual = self.c2.dt(0) - self.get_trode_param("delta_L")*Rxn2[0] + return eta1, eta2, c1_surf[-1], c2_surf[-1] def sld_dynamics_1D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises): N = self.get_trode_param("N") @@ -274,6 +299,11 @@ def sld_dynamics_1D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises): eq1.Residual = LHS1_vec[k] - RHS1[k] eq2.Residual = LHS2_vec[k] - RHS2[k] + if self.get_trode_param("type") in ["ACR"]: + return eta1[-1], eta2[-1], c1_surf[-1], c2_surf[-1] + else: + return eta1, eta2, c1_surf, c2_surf + class Mod1var(dae.daeModel): def __init__(self, config, trode, vInd, pInd, @@ -296,6 +326,8 @@ def __init__(self, config, trode, vInd, pInd, "cbar", mole_frac_t, self, "Average concentration in active particle") self.dcbardt = dae.daeVariable("dcbardt", dae.no_t, self, "Rate of particle filling") + self.q_rxn_bar = dae.daeVariable( + "q_rxn_bar", dae.no_t, self, "Rate of heat generation in particle") if config[trode, "type"] not in ["ACR"]: self.Rxn = dae.daeVariable("Rxn", dae.no_t, self, "Rate of reaction") else: @@ -368,10 +400,15 @@ def DeclareEquations(self): c[:] = [self.c(k) for k in range(N)] if self.get_trode_param("type") in ["ACR", "diffn", "CHR"]: # Equations for 1D particles of 1 field varible - self.sld_dynamics_1D1var(c, mu_O, act_lyte, self.ISfuncs, self.noise) + eta, c_surf = self.sld_dynamics_1D1var(c, mu_O, act_lyte, self.ISfuncs, self.noise) elif self.get_trode_param("type") in ["homog", "homog_sdn"]: # Equations for 0D particles of 1 field variables - self.sld_dynamics_0D1var(c, mu_O, act_lyte, self.ISfuncs, self.noise) + eta, c_surf = self.sld_dynamics_0D1var(c, mu_O, act_lyte, self.ISfuncs, self.noise) + + # Define average rate of heat generation + eq = self.CreateEquation("q_rxn_bar") + eq.Residual = self.q_rxn_bar() - self.dcbardt() * \ + (-eta - (np.log(c_surf/(1-c_surf))+1/self.c_lyte())) for eq in self.Equations: eq.CheckUnitsConsistency = False @@ -394,6 +431,8 @@ def sld_dynamics_0D1var(self, c, muO, act_lyte, ISfuncs, noise): eq = self.CreateEquation("dcsdt") eq.Residual = self.c.dt(0) - self.get_trode_param("delta_L")*self.Rxn() + return eta, c_surf[-1] + def sld_dynamics_1D1var(self, c, muO, act_lyte, ISfuncs, noise): N = self.get_trode_param("N") # Equations for concentration evolution @@ -462,6 +501,11 @@ def sld_dynamics_1D1var(self, c, muO, act_lyte, ISfuncs, noise): eq = self.CreateEquation("dcsdt_discr{k}".format(k=k)) eq.Residual = LHS_vec[k] - RHS[k] + if self.get_trode_param("type") in ["ACR"]: + return eta[-1], c_surf[-1] + else: + return eta, c_surf + def calc_eta(muR, muO): return muR - muO diff --git a/mpet/utils.py b/mpet/utils.py index 311344a6..192d9d48 100644 --- a/mpet/utils.py +++ b/mpet/utils.py @@ -85,6 +85,26 @@ def get_asc_vec(var, Nvol, dt=False): return out +def get_thermal_vec(Nvol, config): + """Get a numpy array for a variable spanning the anode, separator, and cathode.""" + varout = {} + for sectn in ["a", "s", "c"]: + # If we have information within this battery section + if sectn in ["a", "c"]: + # If it's an array of dae variable objects + out = config['rhom'][sectn]*(1-config["poros"][sectn])**(1-config["BruggExp"][sectn]) \ + * config['cp'][sectn] + config['rhom']['l'] * \ + config["poros"][sectn]**config["BruggExp"][sectn]*config['cp']['l'] + varout[sectn] = get_const_vec(out, Nvol[sectn]) + else: + out = config['rhom']['l'] * \ + config["poros"][sectn]**config["BruggExp"][sectn]*config['cp']['l'] + varout[sectn] = get_const_vec(out, Nvol[sectn]) + # sum solid + elyte poroisty + out = np.hstack((varout["a"], varout["s"], varout["c"])) + return out + + def get_dxvec(L, Nvol): """Get a vector of cell widths spanning the full cell.""" if "a" in Nvol: From 24f0096715b5214997ed7baffa9da23c731afc93 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Tue, 30 Nov 2021 16:50:47 -0500 Subject: [PATCH 24/57] added config file for new nonisothermal system --- configs/params_system.cfg | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/configs/params_system.cfg b/configs/params_system.cfg index 5918a756..da0f4103 100644 --- a/configs/params_system.cfg +++ b/configs/params_system.cfg @@ -130,6 +130,24 @@ G_stddev_c = 0 G_mean_a = 1e-14 G_stddev_a = 0 +[Thermal Parameters] +# Heat capacity of anode, cathode, electrolyte material in J/(kg*K). +cp_c = 1000 +cp_a = 1000 +cp_l = 1000 +# Mass density of anode, cathode, and electrolyte materialin kg/m^3. +rhom_c = 1000 +rhom_a = 1000 +rhom_l = 1000 +# Heat transfer coefficient with the cell separator (W/(m^2*K)) +h_h = 500 +# Thermal conductivity in battery cell (only used for dilute electrolyte model), (W/(m*K)). +# For Stefan-Maxwell concentrated electrolyte, input from props_elyte.py +k_h = 0.2 +# Conductivity in electrolyte solution (only used for dilute electrolyte model), (S/m) +# For Stefan-Maxwell concentrated electrolyte, input from props_elyte.py +sigma_l = 500 + [Geometry] # Thicknesses, m L_c = 50e-6 @@ -186,12 +204,3 @@ sp = -1 # e.g. for LiPF6 in EC/DMC, Dp = 2.2e-10, Dm = 2.94e-10 Dp = 2.2e-10 Dm = 2.94e-10 -# Thermal conductivity of electrolyte (W/m*K). add physical values later -k_h = 0.2 -# Heat capacity of electrolyte (J/(mol(K)). add physical values later -#cp = 1000 -cp = 1e8 -# Electrolyte Conductivity (S/m) only used for heat generation -sigma_lyte = 0.1 -# Heat transfer coefficient (W/(m^2*K)) with the external temperature, always taken to be T0 = 298K -h_h = 500 From f8eaf51943f6423b9e09e50b5e65d9137f96cfa6 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Sun, 5 Dec 2021 02:17:37 -0500 Subject: [PATCH 25/57] fixed dimensionalization issues --- mpet/config/configuration.py | 3 --- mpet/config/derived_values.py | 6 +++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/mpet/config/configuration.py b/mpet/config/configuration.py index 73c1e8e2..bc23566d 100644 --- a/mpet/config/configuration.py +++ b/mpet/config/configuration.py @@ -480,9 +480,6 @@ def _scale_system_parameters(self, theoretical_1C_current): self['Dp'] = self['Dp'] / self['D_ref'] self['Dm'] = self['Dm'] / self['D_ref'] self['k_h'] = self['k_h'] / self['k_h_ref'] - self['cp_l'] = self['cp_l'] / \ - (self['k_h_ref'] * self['t_ref'] / (self['rho_ref']*self['L_ref']**2)) - self['rhom_l'] = self['rhom_l'] / self['rho_ref'] self['h_h'] = self['h_h'] * self['L_ref'] / self['k_h_ref'] self['sigma_l'] = self['sigma_l'] / self['sigma_s_ref'] self['c0'] = self['c0'] / constants.c_ref diff --git a/mpet/config/derived_values.py b/mpet/config/derived_values.py index 02be13eb..18b2d290 100644 --- a/mpet/config/derived_values.py +++ b/mpet/config/derived_values.py @@ -151,7 +151,7 @@ def rho_ref(self): """Reference mass density used for energy balances """ m_ref = 1000 # reference is 1000 kg - return m_ref / self.config['L_ref']**3 + return m_ref def sigma_s_ref(self): """Reference conductivity @@ -202,8 +202,8 @@ def D_ref(self): def k_h_ref(self): """Reference heat transfer coefficient """ - return constants.c_ref * constants.k * \ - self.config['L_ref']**2 / (self.config['t_ref'] * constants.N_A) + return constants.c_ref * constants.k * constants.N_A * \ + self.config['L_ref']**2 / (self.config['t_ref']) def z(self): """Electrode capacity ratio From 39ee10f1d77f3857c12ef4ce4174f183a1623c81 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Sun, 5 Dec 2021 19:52:56 -0500 Subject: [PATCH 26/57] added thermal conductivity for different electrodes --- mpet/config/configuration.py | 3 ++- mpet/config/constants.py | 4 ++-- mpet/config/schemas.py | 4 +++- mpet/geometry.py | 6 +++++- mpet/mod_cell.py | 13 ++++++++----- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/mpet/config/configuration.py b/mpet/config/configuration.py index bc23566d..ab89054c 100644 --- a/mpet/config/configuration.py +++ b/mpet/config/configuration.py @@ -479,7 +479,6 @@ def _scale_system_parameters(self, theoretical_1C_current): self['Rser'] = self['Rser'] / self['Rser_ref'] self['Dp'] = self['Dp'] / self['D_ref'] self['Dm'] = self['Dm'] / self['D_ref'] - self['k_h'] = self['k_h'] / self['k_h_ref'] self['h_h'] = self['h_h'] * self['L_ref'] / self['k_h_ref'] self['sigma_l'] = self['sigma_l'] / self['sigma_s_ref'] self['c0'] = self['c0'] / constants.c_ref @@ -503,6 +502,7 @@ def _scale_electrode_parameters(self): self['L'][trode] = self['L'][trode] / self['L_ref'] self['beta'][trode] = self[trode, 'csmax'] / constants.c_ref self['sigma_s'][trode] = self['sigma_s'][trode] / self['sigma_s_ref'] + self['k_h'][trode] = self['k_h'][trode] / self['k_h_ref'] self[trode, 'lambda'] = self[trode, 'lambda'] / kT self[trode, 'B'] = self[trode, 'B'] / (kT * constants.N_A * self[trode, 'cs_ref']) @@ -519,6 +519,7 @@ def _scale_electrode_parameters(self): # scalings on separator if self['have_separator']: self['L']['s'] /= self['L_ref'] + self['k_h']['s'] = self['k_h']['s'] / self['k_h_ref'] def _scale_macroscopic_parameters(self, Vref): """ diff --git a/mpet/config/constants.py b/mpet/config/constants.py index b3a4f689..458d92e9 100644 --- a/mpet/config/constants.py +++ b/mpet/config/constants.py @@ -20,9 +20,9 @@ #: parameter that are defined per electrode with a ``_{electrode}`` suffix PARAMS_PER_TRODE = ['Nvol', 'Npart', 'mean', 'stddev', 'cs0', 'simBulkCond', 'sigma_s', 'simPartCond', 'G_mean', 'G_stddev', 'L', 'P_L', 'poros', 'BruggExp', - 'specified_psd', 'rhom', 'cp'] + 'specified_psd', 'rhom', 'cp', 'k_h'] #: subset of ``PARAMS_PER_TRODE``` that is defined for the separator as well -PARAMS_SEPARATOR = ['Nvol', 'L', 'poros', 'BruggExp'] +PARAMS_SEPARATOR = ['Nvol', 'L', 'poros', 'BruggExp', 'k_h'] # PARAMETERS THAT ARE NEEDED IN A THERMAL MODEL FOR ELECTROLYTE PROPERTIES PARAMS_ELYTE = ['cp', 'sigma', 'rhom'] #: parameters that are defined for each particle, and their type diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py index c305281b..5d70a0fd 100644 --- a/mpet/config/schemas.py +++ b/mpet/config/schemas.py @@ -120,7 +120,9 @@ def tobool(value): Optional('rhom_c', default=0.2): Use(float), Optional('rhom_a', default=0.2): Use(float), Optional('rhom_l', default=0.2): Use(float), - Optional('k_h', default=0.2): Use(float), + Optional('k_h_c', default=0.2): Use(float), + Optional('k_h_a', default=0.2): Use(float), + Optional('k_h_s', default=0.2): Use(float), Optional('h_h', default=500): Use(float), Optional('sigma_l', default=500): Use(float)}, 'Electrolyte': {'c0': Use(float), diff --git a/mpet/geometry.py b/mpet/geometry.py index 75020e45..33d7d56b 100644 --- a/mpet/geometry.py +++ b/mpet/geometry.py @@ -78,7 +78,7 @@ def calc_curv(c, dr, r_vec, Rs, beta_s, particleShape): return curv -def get_elyte_disc(Nvol, L, poros, BruggExp): +def get_elyte_disc(Nvol, L, poros, BruggExp, k_h): out = {} # Width of each cell out["dxvec"] = utils.get_dxvec(L, Nvol) @@ -95,6 +95,10 @@ def get_elyte_disc(Nvol, L, poros, BruggExp): # Vector of Bruggeman exponents Brugg_pad = utils.pad_vec(utils.get_asc_vec(BruggExp, Nvol)) + # The porosity vector + khvec = utils.get_asc_vec(k_h, Nvol) + out["khvec"] = utils.pad_vec(khvec) + # Vector of posority/tortuosity (assuming Bruggeman) out["eps_o_tau"] = porosvec_pad/porosvec_pad**(Brugg_pad) diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index 69a0023c..94b5d348 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -330,7 +330,8 @@ def DeclareEquations(self): eq = self.CreateEquation("T_lyte") eq.Residual = self.T_lyte["c"].dt(0) - 0 else: - disc = geom.get_elyte_disc(Nvol, config["L"], config["poros"], config["BruggExp"]) + disc = geom.get_elyte_disc(Nvol, config["L"], config["poros"], config["BruggExp"], + config["k_h"]) cvec = utils.get_asc_vec(self.c_lyte, Nvol) dcdtvec = utils.get_asc_vec(self.c_lyte, Nvol, dt=True) phivec = utils.get_asc_vec(self.phi_lyte, Nvol) @@ -348,7 +349,8 @@ def DeclareEquations(self): phitmp = np.hstack((self.phi_lyteGP_L(), phivec, phivec[-1])) phibulktmp = np.hstack((self.phi_cell(), phibulkvec, config["phi_cathode"])) - Nm_edges, i_edges, q_edges = get_lyte_internal_fluxes(ctmp, phitmp, Ttmp, disc, config) + Nm_edges, i_edges, q_edges = get_lyte_internal_fluxes(ctmp, phitmp, Ttmp, disc, + config, Nvol) # If we don't have a porous anode: # 1) the total current flowing into the electrolyte is set @@ -552,7 +554,7 @@ def DeclareEquations(self): setVariableValues=[(self.endCondition, 2)]) -def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, config): +def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, config, Nvol): zp, zm, nup, num = config["zp"], config["zm"], config["nup"], config["num"] nu = nup + num dxd1 = disc["dxd1"] @@ -563,11 +565,12 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, config): c_edges_int = utils.weighted_linear_mean(c_lyte, wt) T_edges_int = utils.weighted_linear_mean(T_lyte, wt) + k_h = utils.weighted_linear_mean(disc["khvec"], wt) if config["elyteModelType"] == "dilute": # Get porosity at cell edges using weighted harmonic mean eps_o_tau_edges = utils.weighted_linear_mean(eps_o_tau, wt) Dp = eps_o_tau_edges * config["Dp"] - k_h = eps_o_tau_edges * config["k_h"] + k_h = eps_o_tau_edges * k_h Dm = eps_o_tau_edges * config["Dm"] # neglecting soret diffusion # Np_edges_int = nup*(-Dp*np.diff(c_lyte)/dxd1 @@ -581,7 +584,7 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, config): elif config["elyteModelType"] == "SM": D_fs, sigma_fs, thermFac, tp0 = getattr(props_elyte,config["SMset"])()[:-1] eps_o_tau_edges = utils.weighted_linear_mean(eps_o_tau, wt) - k_h_edges = eps_o_tau_edges * config["k_h"] + k_h_edges = eps_o_tau_edges * k_h # Get diffusivity and conductivity at cell edges using weighted harmonic mean D_edges = utils.weighted_harmonic_mean(eps_o_tau*D_fs(c_lyte, T_lyte), wt) From a26c161879bac61b199f8b00525398e71e76e4bc Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Sun, 19 Dec 2021 20:40:02 -0500 Subject: [PATCH 27/57] fixed errors in implementation of heat generation --- mpet/geometry.py | 1 + mpet/mod_cell.py | 30 +++++++++++++----------------- mpet/mod_electrodes.py | 2 +- mpet/utils.py | 23 +++++++++++++++++++++-- 4 files changed, 36 insertions(+), 20 deletions(-) diff --git a/mpet/geometry.py b/mpet/geometry.py index 33d7d56b..34c35c2b 100644 --- a/mpet/geometry.py +++ b/mpet/geometry.py @@ -101,5 +101,6 @@ def get_elyte_disc(Nvol, L, poros, BruggExp, k_h): # Vector of posority/tortuosity (assuming Bruggeman) out["eps_o_tau"] = porosvec_pad/porosvec_pad**(Brugg_pad) + out["min_eps_o_tau"] = (1-porosvec_pad)/(1-porosvec_pad)**(Brugg_pad) return out diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index 94b5d348..0115a5c5 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -335,7 +335,6 @@ def DeclareEquations(self): cvec = utils.get_asc_vec(self.c_lyte, Nvol) dcdtvec = utils.get_asc_vec(self.c_lyte, Nvol, dt=True) phivec = utils.get_asc_vec(self.phi_lyte, Nvol) - phibulkvec = utils.get_asc_vec(self.phi_bulk, Nvol) Tvec = utils.get_asc_vec(self.T_lyte, Nvol) dTdtvec = utils.get_asc_vec(self.T_lyte, Nvol, dt=True) Rvvec = utils.get_asc_vec(self.R_Vp, Nvol) @@ -347,7 +346,6 @@ def DeclareEquations(self): # temperature uses a constant boundary condition Ttmp = np.hstack((self.T_lyteGP_L(), Tvec, self.T_lyteGP_R())) phitmp = np.hstack((self.phi_lyteGP_L(), phivec, phivec[-1])) - phibulktmp = np.hstack((self.phi_cell(), phibulkvec, config["phi_cathode"])) Nm_edges, i_edges, q_edges = get_lyte_internal_fluxes(ctmp, phitmp, Ttmp, disc, config, Nvol) @@ -402,7 +400,7 @@ def DeclareEquations(self): dvgNm = np.diff(Nm_edges)/disc["dxvec"] dvgi = np.diff(i_edges)/disc["dxvec"] dvgq = np.diff(q_edges)/disc["dxvec"] - q_ohm = get_ohmic_heat(ctmp, Ttmp, phibulktmp, phitmp, disc, config, Nvol) + q_ohm = get_ohmic_heat(ctmp, Ttmp, self.phi_lyte, self.phi_bulk, disc, config, Nvol) for vInd in range(Nlyte): # Mass Conservation (done with the anion, although "c" is neutral salt conc) eq = self.CreateEquation("lyte_mass_cons_vol{vInd}".format(vInd=vInd)) @@ -415,7 +413,7 @@ def DeclareEquations(self): # if heat generation is turned on. per volume. eq = self.CreateEquation("lyte_energy_cons_vol{vInd}".format(vInd=vInd)) eq.Residual = rhocp_vec[vInd] * dTdtvec[vInd] - \ - dvgq[vInd] - q_ohm[vInd] - Qvvec[vInd] + q_ohm[vInd] - Qvvec[vInd] + dvgq[vInd] else: # if heat generation is turned off eq = self.CreateEquation("lyte_energy_cons_vol{vInd}".format(vInd=vInd)) @@ -570,7 +568,6 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, config, Nvol): # Get porosity at cell edges using weighted harmonic mean eps_o_tau_edges = utils.weighted_linear_mean(eps_o_tau, wt) Dp = eps_o_tau_edges * config["Dp"] - k_h = eps_o_tau_edges * k_h Dm = eps_o_tau_edges * config["Dm"] # neglecting soret diffusion # Np_edges_int = nup*(-Dp*np.diff(c_lyte)/dxd1 @@ -580,11 +577,8 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, config, Nvol): i_edges_int = (-((nup*zp*Dp + num*zm*Dm)*np.diff(c_lyte)/dxd1) - (nup*zp ** 2*Dp + num*zm**2*Dm)/T_edges_int*c_edges_int*np.diff(phi_lyte)/dxd1) # i_edges_int = zp*Np_edges_int + zm*Nm_edges_int - q_edges_int = -k_h*np.diff(T_lyte)/dxd1 elif config["elyteModelType"] == "SM": D_fs, sigma_fs, thermFac, tp0 = getattr(props_elyte,config["SMset"])()[:-1] - eps_o_tau_edges = utils.weighted_linear_mean(eps_o_tau, wt) - k_h_edges = eps_o_tau_edges * k_h # Get diffusivity and conductivity at cell edges using weighted harmonic mean D_edges = utils.weighted_harmonic_mean(eps_o_tau*D_fs(c_lyte, T_lyte), wt) @@ -601,19 +595,20 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, config, Nvol): ) Nm_edges_int = num*(-D_edges*np.diff(c_lyte)/dxd1 + (1./(num*zm)*(1-tp0(c_edges_int, T_edges_int))*i_edges_int)) - q_edges_int = -k_h_edges*np.diff(T_lyte)/dxd1 + q_edges_int = -k_h*np.diff(T_lyte)/dxd1 return Nm_edges_int, i_edges_int, q_edges_int def get_ohmic_heat(c_lyte, T_lyte, phi_lyte, phi_bulk, disc, config, Nvol): eps_o_tau = disc["eps_o_tau"] - dx = disc["dx"][1:-1] + min_eps_o_tau = disc["min_eps_o_tau"] + dx = disc["dxvec"] wt = utils.pad_vec(disc["dxvec"]) sigma_s = utils.get_asc_vec(config["sigma_s"], Nvol) c_edges_int = utils.weighted_linear_mean(c_lyte, wt) - phi_lyte_int = utils.weighted_linear_mean(phi_lyte, wt) - phi_bulk_int = utils.weighted_linear_mean(phi_bulk, wt) + dphilytedx = utils.central_diff(phi_lyte, Nvol, dx) + dphibulkdx = utils.central_diff(phi_bulk, Nvol, dx) c_mid = c_lyte[1:-1] T_mid = T_lyte[1:-1] @@ -621,7 +616,7 @@ def get_ohmic_heat(c_lyte, T_lyte, phi_lyte, phi_bulk, disc, config, Nvol): q_ohmic = 0 if config["elyteModelType"] == "dilute": - sigma_l = eps_o_tau * config["sigma_l"] + sigma_l = eps_o_tau[1:-1] * config["sigma_l"] elif config["elyteModelType"] == "SM": tp0 = getattr(props_elyte,config["SMset"])()[-2] @@ -629,10 +624,11 @@ def get_ohmic_heat(c_lyte, T_lyte, phi_lyte, phi_bulk, disc, config, Nvol): # Get diffusivity and conductivity at cell edges using weighted harmonic mean sigma_l = eps_o_tau[1:-1]*sigma_fs(c_mid, T_mid) q_ohmic = q_ohmic + 2*sigma_l*(1-tp0(c_mid, T_mid)) * \ - np.diff(np.log(c_edges_int))/dx*np.diff(phi_lyte_int)/dx + np.diff(np.log(c_edges_int))/dx*dphilytedx # this is going to be dra - sigma_s = (1-eps_o_tau[1:-1]) * sigma_s - q_ohmic = q_ohmic + sigma_s*(np.diff(phi_bulk_int)/dx)**2 + \ - sigma_l*(np.diff(phi_lyte_int)/dx)**2 + sigma_s = min_eps_o_tau[1:-1] * sigma_s + + q_ohmic = q_ohmic + sigma_s*dphibulkdx**2 + \ + sigma_l*dphilytedx**2 # do we have to extrapolate these return q_ohmic diff --git a/mpet/mod_electrodes.py b/mpet/mod_electrodes.py index 74ee3f9f..d1de9f57 100644 --- a/mpet/mod_electrodes.py +++ b/mpet/mod_electrodes.py @@ -408,7 +408,7 @@ def DeclareEquations(self): # Define average rate of heat generation eq = self.CreateEquation("q_rxn_bar") eq.Residual = self.q_rxn_bar() - self.dcbardt() * \ - (-eta - (np.log(c_surf/(1-c_surf))+1/self.c_lyte())) + (-eta - self.T_lyte()*(np.log(c_surf/(1-c_surf))+1/self.c_lyte())) for eq in self.Equations: eq.CheckUnitsConsistency = False diff --git a/mpet/utils.py b/mpet/utils.py index 192d9d48..738da736 100644 --- a/mpet/utils.py +++ b/mpet/utils.py @@ -85,6 +85,25 @@ def get_asc_vec(var, Nvol, dt=False): return out +def central_diff(array, Nvol, dx): + """Gets central diff for derivatives for use in thermal derivatives (which are split between + the individual electrodes)""" + varout = {} + for sectn in ["a", "s", "c"]: + # If we have information within this battery section + # If it's an array of dae variable objects + if sectn in array: + out = get_var_vec(array[sectn], Nvol[sectn]) + out = np.hstack((2*out[0]-out[1], out, 2*out[-1]-out[-2])) + varout[sectn] = (out[2:]-out[:-2]) + + else: + varout[sectn] = np.zeros(Nvol[sectn]) + # sum solid + elyte poroisty + output = np.hstack((varout["a"], varout["s"], varout["c"]))/(2*dx) + return output + + def get_thermal_vec(Nvol, config): """Get a numpy array for a variable spanning the anode, separator, and cathode.""" varout = {} @@ -95,10 +114,10 @@ def get_thermal_vec(Nvol, config): out = config['rhom'][sectn]*(1-config["poros"][sectn])**(1-config["BruggExp"][sectn]) \ * config['cp'][sectn] + config['rhom']['l'] * \ config["poros"][sectn]**config["BruggExp"][sectn]*config['cp']['l'] +# out = config['rhom'][sectn] * config['cp'][sectn] varout[sectn] = get_const_vec(out, Nvol[sectn]) else: - out = config['rhom']['l'] * \ - config["poros"][sectn]**config["BruggExp"][sectn]*config['cp']['l'] + out = config['rhom']['l'] * config['cp']['l'] varout[sectn] = get_const_vec(out, Nvol[sectn]) # sum solid + elyte poroisty out = np.hstack((varout["a"], varout["s"], varout["c"])) From d9f5d858ab970522a5ea525f546ae2a3afb25dcf Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Mon, 20 Dec 2021 02:48:05 -0500 Subject: [PATCH 28/57] added option for not generating entropic heat generation --- mpet/config/schemas.py | 3 ++- mpet/mod_electrodes.py | 18 +++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py index 5d70a0fd..93717a37 100644 --- a/mpet/config/schemas.py +++ b/mpet/config/schemas.py @@ -124,7 +124,8 @@ def tobool(value): Optional('k_h_a', default=0.2): Use(float), Optional('k_h_s', default=0.2): Use(float), Optional('h_h', default=500): Use(float), - Optional('sigma_l', default=500): Use(float)}, + Optional('sigma_l', default=500): Use(float), + Optional('ent_heat_gen', default=True): Use(tobool)}, 'Electrolyte': {'c0': Use(float), 'zp': Use(int), 'zm': And(Use(int), lambda x: x < 0), diff --git a/mpet/mod_electrodes.py b/mpet/mod_electrodes.py index d1de9f57..80b75618 100644 --- a/mpet/mod_electrodes.py +++ b/mpet/mod_electrodes.py @@ -169,9 +169,14 @@ def DeclareEquations(self): # Define average rate of heat generation eq = self.CreateEquation("q_rxn_bar") - eq.Residual = self.q_rxn_bar() - 0.5 * self.dcbar1dt() * \ - (-eta1 - (np.log(c_surf1/(1-c_surf1))+1/self.c_lyte())) \ - - 0.5 * self.dcbar2dt() * (-eta2 - (np.log(c_surf2/(1-c_surf2))+1/self.c_lyte())) + if self.config["ent_heat_gen"]: + eq.Residual = self.q_rxn_bar() - 0.5 * self.dcbar1dt() * \ + (eta1 + self.T_lyte()*(np.log(c_surf1/(1-c_surf1))+1/self.c_lyte())) \ + - 0.5 * self.dcbar2dt() * (eta2 + self.T_lyte() + * (np.log(c_surf2/(1-c_surf2))+1/self.c_lyte())) + else: + eq.Residual = self.q_rxn_bar() - 0.5 * self.dcbar1dt() * eta1 \ + - 0.5 * self.dcbar2dt() * eta2 for eq in self.Equations: eq.CheckUnitsConsistency = False @@ -407,8 +412,11 @@ def DeclareEquations(self): # Define average rate of heat generation eq = self.CreateEquation("q_rxn_bar") - eq.Residual = self.q_rxn_bar() - self.dcbardt() * \ - (-eta - self.T_lyte()*(np.log(c_surf/(1-c_surf))+1/self.c_lyte())) + if self.config["ent_heat_gen"]: + eq.Residual = self.q_rxn_bar() - self.dcbardt() * \ + (eta + self.T_lyte()*(np.log(c_surf/(1-c_surf))+1/self.c_lyte())) + else: + eq.Residual = self.q_rxn_bar() - self.dcbardt() * eta for eq in self.Equations: eq.CheckUnitsConsistency = False From 59b8d2308273c14d44c9340bdb2342ce1d1e5099 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Mon, 20 Dec 2021 12:29:53 -0500 Subject: [PATCH 29/57] fixed error in text outputs --- mpet/plot/plot_data.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/mpet/plot/plot_data.py b/mpet/plot/plot_data.py index 5c223ea7..ebb71a26 100644 --- a/mpet/plot/plot_data.py +++ b/mpet/plot/plot_data.py @@ -325,18 +325,21 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu fplot = (True if plot_type[-1] == "f" else False) t0ind = (0 if not fplot else -1) datax = cellsvec - c_sep, p_sep = pfx + 'c_lyte_s', pfx + 'phi_lyte_s' - c_anode, p_anode = pfx + 'c_lyte_a', pfx + 'phi_lyte_a' - c_cath, p_cath = pfx + 'c_lyte_c', pfx + 'phi_lyte_c' + c_sep, p_sep, T_sep = pfx + 'c_lyte_s', pfx + 'phi_lyte_s', pfx + 'T_lyte_s' + c_anode, p_anode, T_anode = pfx + 'c_lyte_a', pfx + 'phi_lyte_a', pfx + 'T_lyte_a' + c_cath, p_cath, T_cath = pfx + 'c_lyte_c', pfx + 'phi_lyte_c', pfx + 'T_lyte_c' datay_c = utils.get_dict_key(data, c_cath, squeeze=False) datay_p = utils.get_dict_key(data, p_cath, squeeze=False) + datay_T = utils.get_dict_key(data, T_cath, squeeze=False) L_c = config['L']["c"] * config['L_ref'] * Lfac Ltot = L_c if config["have_separator"]: datay_s_c = utils.get_dict_key(data, c_sep, squeeze=False) datay_s_p = utils.get_dict_key(data, p_sep, squeeze=False) + datay_s_T = utils.get_dict_key(data, T_sep, squeeze=False) datay_c = np.hstack((datay_s_c, datay_c)) datay_p = np.hstack((datay_s_p, datay_p)) + datay_T = np.hstack((datay_s_T, datay_T)) L_s = config['L']["s"] * config['L_ref'] * Lfac Ltot += L_s else: @@ -344,8 +347,10 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu if "a" in trodes: datay_a_c = utils.get_dict_key(data, c_anode, squeeze=False) datay_a_p = utils.get_dict_key(data, p_anode, squeeze=False) + datay_a_T = utils.get_dict_key(data, T_anode, squeeze=False) datay_c = np.hstack((datay_a_c, datay_c)) datay_p = np.hstack((datay_a_p, datay_p)) + datay_T = np.hstack((datay_a_T, datay_T)) L_a = config['L']["a"] * config['L_ref'] * Lfac Ltot += L_a else: @@ -361,15 +366,17 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu elif plot_type in ["elytei", "elyteif", "elytedivi", "elytedivif"]: cGP_L = utils.get_dict_key(data, "c_lyteGP_L") pGP_L = utils.get_dict_key(data, "phi_lyteGP_L") + TGP_L = utils.get_dict_key(data, "T_lyteGP_L") cmat = np.hstack((cGP_L.reshape((-1,1)), datay_c, datay_c[:,-1].reshape((-1,1)))) pmat = np.hstack((pGP_L.reshape((-1,1)), datay_p, datay_p[:,-1].reshape((-1,1)))) + Tmat = np.hstack((TGP_L.reshape((-1,1)), datay_T, datay_T[:,-1].reshape((-1,1)))) disc = geom.get_elyte_disc( - Nvol, config["L"], config["poros"], config["BruggExp"]) + Nvol, config["L"], config["poros"], config["BruggExp"], config["k_h"]) i_edges = np.zeros((numtimes, len(facesvec))) for tInd in range(numtimes): # no heat flux at boundary i_edges[tInd, :] = mod_cell.get_lyte_internal_fluxes( - cmat[tInd, :], pmat[tInd, :], disc, config)[1] + cmat[tInd, :], pmat[tInd, :], Tmat[tInd, :], disc, config, Nvol)[1] if plot_type in ["elytei", "elyteif"]: ylbl = r'Current density of electrolyte [A/m$^2$]' datax = facesvec From 849dc476e632cfd1312f36b72dcb618733963016 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Mon, 20 Dec 2021 12:57:47 -0500 Subject: [PATCH 30/57] added text output of temperature data --- bin/mpetplot.py | 1 + configs/params_system.cfg | 21 +++++++++++++-------- mpet/mod_cell.py | 2 +- mpet/mod_electrodes.py | 6 +++--- mpet/plot/outmat2txt.py | 10 +++++++++- mpet/plot/plot_data.py | 9 ++++++--- 6 files changed, 33 insertions(+), 16 deletions(-) diff --git a/bin/mpetplot.py b/bin/mpetplot.py index a010fd37..9c416eb3 100755 --- a/bin/mpetplot.py +++ b/bin/mpetplot.py @@ -36,6 +36,7 @@ ('cbar_a','average anode solid concentrations (movie)'), ('bulkp_c','macroscopic cathode solid phase potential(movie)'), ('bulkp_a','macroscopic anode solid phase potential (movie)'), + ('temp','temperature of full cell (movie)'), ('text','convert the output to plain text (csv)') ]) diff --git a/configs/params_system.cfg b/configs/params_system.cfg index da0f4103..26e6f6d5 100644 --- a/configs/params_system.cfg +++ b/configs/params_system.cfg @@ -132,21 +132,26 @@ G_stddev_a = 0 [Thermal Parameters] # Heat capacity of anode, cathode, electrolyte material in J/(kg*K). -cp_c = 1000 -cp_a = 1000 -cp_l = 1000 +cp_c = 700 +cp_l = 700 +cp_a = 700 # Mass density of anode, cathode, and electrolyte materialin kg/m^3. -rhom_c = 1000 -rhom_a = 1000 -rhom_l = 1000 +rhom_c = 2500 +rhom_l = 1100 +rhom_a = 2500 # Heat transfer coefficient with the cell separator (W/(m^2*K)) -h_h = 500 +h_h = 2e4 # Thermal conductivity in battery cell (only used for dilute electrolyte model), (W/(m*K)). # For Stefan-Maxwell concentrated electrolyte, input from props_elyte.py -k_h = 0.2 +k_h_c = 2.1 +k_h_a = 1.7 +k_h_s = 0.16 # Conductivity in electrolyte solution (only used for dilute electrolyte model), (S/m) # For Stefan-Maxwell concentrated electrolyte, input from props_elyte.py sigma_l = 500 +# Includes temperature dependence of entropic heat generation if true, does not include +# if false +ent_heat_gen = False [Geometry] # Thicknesses, m diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index 0115a5c5..0381d17b 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -392,7 +392,7 @@ def DeclareEquations(self): # boundary equation for temperature variables. per volume eqTL.Residual = q_edges[0] + config["h_h"]*(Ttmp[0]-config["T0"])/disc["dxvec"][0] eqTR.Residual = q_edges[-1] + config["h_h"] * \ - (Ttmp[-1]-config["T0"])/disc["dxvec"][0] + (Ttmp[-1]-config["T0"])/disc["dxvec"][-1] else: eqTL.Residual = Ttmp[0] - Ttmp[1] eqTR.Residual = Ttmp[-1] - Ttmp[-2] diff --git a/mpet/mod_electrodes.py b/mpet/mod_electrodes.py index 80b75618..5faf9470 100644 --- a/mpet/mod_electrodes.py +++ b/mpet/mod_electrodes.py @@ -171,9 +171,9 @@ def DeclareEquations(self): eq = self.CreateEquation("q_rxn_bar") if self.config["ent_heat_gen"]: eq.Residual = self.q_rxn_bar() - 0.5 * self.dcbar1dt() * \ - (eta1 + self.T_lyte()*(np.log(c_surf1/(1-c_surf1))+1/self.c_lyte())) \ + (eta1 + self.T_lyte()*(-np.log(c_surf1/(1-c_surf1))+1/self.c_lyte())) \ - 0.5 * self.dcbar2dt() * (eta2 + self.T_lyte() - * (np.log(c_surf2/(1-c_surf2))+1/self.c_lyte())) + * (-np.log(c_surf2/(1-c_surf2))+1/self.c_lyte())) else: eq.Residual = self.q_rxn_bar() - 0.5 * self.dcbar1dt() * eta1 \ - 0.5 * self.dcbar2dt() * eta2 @@ -414,7 +414,7 @@ def DeclareEquations(self): eq = self.CreateEquation("q_rxn_bar") if self.config["ent_heat_gen"]: eq.Residual = self.q_rxn_bar() - self.dcbardt() * \ - (eta + self.T_lyte()*(np.log(c_surf/(1-c_surf))+1/self.c_lyte())) + (eta + self.T_lyte()*(-np.log(c_surf/(1-c_surf))+1/self.c_lyte())) else: eq.Residual = self.q_rxn_bar() - self.dcbardt() * eta diff --git a/mpet/plot/outmat2txt.py b/mpet/plot/outmat2txt.py index d802466b..f5f9ce77 100644 --- a/mpet/plot/outmat2txt.py +++ b/mpet/plot/outmat2txt.py @@ -47,6 +47,7 @@ elyteiHdr = ("Electrolyte Current Density [A/m^2]\n" + RowsStr + FCStr) elytediviHdr = ("Electrolyte Divergence of Current Density [A/m^3]\n" + RowsStr + CCStr) +tempHdr = ("Temperature [K]\n" + RowsStr + CCStr) seeDiscStr = "See discData.txt for particle indexing information." partStr = "partTrode{l}vol{j}part{i}_" @@ -76,7 +77,7 @@ def main(indir, genData=True, discData=True, elyteData=True, - csldData=True, cbarData=True, bulkpData=True): + csldData=True, cbarData=True, bulkpData=True, tempData=True): config = plot_data.show_data( indir, plot_type="params", print_flag=False, save_flag=False, data_only=True) @@ -261,4 +262,11 @@ def get_trode_str(tr): np.savetxt(os.path.join(indir, fname), bulkp_cData, delimiter=dlm, header=bulkpHdr) + if tempData: + tempMat = plot_data.show_data( + indir, plot_type="temp", print_flag=False, + save_flag=False, data_only=True)[1] + np.savetxt(os.path.join(indir, "tempData.txt"), + tempMat, delimiter=dlm, header=tempHdr) + return diff --git a/mpet/plot/plot_data.py b/mpet/plot/plot_data.py index ebb71a26..a95981c6 100644 --- a/mpet/plot/plot_data.py +++ b/mpet/plot/plot_data.py @@ -320,8 +320,8 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu return fig, ax # Plot electrolyte concentration or potential - elif plot_type in ["elytec", "elytep", "elytecf", "elytepf", - "elytei", "elyteif", "elytedivi", "elytedivif"]: + elif plot_type in ["elytec", "elytep", "elytecf", "elytepf", "elytei", + "elyteif", "elytedivi", "elytedivif", "temp"]: fplot = (True if plot_type[-1] == "f" else False) t0ind = (0 if not fplot else -1) datax = cellsvec @@ -363,6 +363,9 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu elif plot_type in ["elytep", "elytepf"]: ylbl = 'Potential of electrolyte [V]' datay = datay_p*(k*Tref/e) - Vstd + elif plot_type in ["temp"]: + ylbl = 'Temperature [K]' + datay = datay_T * constants.T_ref elif plot_type in ["elytei", "elyteif", "elytedivi", "elytedivif"]: cGP_L = utils.get_dict_key(data, "c_lyteGP_L") pGP_L = utils.get_dict_key(data, "phi_lyteGP_L") @@ -376,7 +379,7 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu for tInd in range(numtimes): # no heat flux at boundary i_edges[tInd, :] = mod_cell.get_lyte_internal_fluxes( - cmat[tInd, :], pmat[tInd, :], Tmat[tInd, :], disc, config, Nvol)[1] + cmat[tInd, :], pmat[tInd, :], Tmat[tInd, :], disc, config, Nvol)[1] if plot_type in ["elytei", "elyteif"]: ylbl = r'Current density of electrolyte [A/m$^2$]' datax = facesvec From 4c5efc6d8a63053d43a63c00847b6705deb4127f Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Tue, 21 Dec 2021 14:48:22 -0500 Subject: [PATCH 31/57] fixed errors in implementation of nonisothermal --- mpet/geometry.py | 2 +- mpet/mod_electrodes.py | 4 ++-- mpet/utils.py | 37 +++++++++++++++++++++++-------------- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/mpet/geometry.py b/mpet/geometry.py index 34c35c2b..b46d65ca 100644 --- a/mpet/geometry.py +++ b/mpet/geometry.py @@ -101,6 +101,6 @@ def get_elyte_disc(Nvol, L, poros, BruggExp, k_h): # Vector of posority/tortuosity (assuming Bruggeman) out["eps_o_tau"] = porosvec_pad/porosvec_pad**(Brugg_pad) - out["min_eps_o_tau"] = (1-porosvec_pad)/(1-porosvec_pad)**(Brugg_pad) + out["min_eps_o_tau"] = (1-porosvec_pad)**(1-Brugg_pad) return out diff --git a/mpet/mod_electrodes.py b/mpet/mod_electrodes.py index 5faf9470..02e9d345 100644 --- a/mpet/mod_electrodes.py +++ b/mpet/mod_electrodes.py @@ -212,7 +212,7 @@ def sld_dynamics_0D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises): eq2 = self.CreateEquation("dc2sdt") eq1.Residual = self.c1.dt(0) - self.get_trode_param("delta_L")*Rxn1[0] eq2.Residual = self.c2.dt(0) - self.get_trode_param("delta_L")*Rxn2[0] - return eta1, eta2, c1_surf[-1], c2_surf[-1] + return eta1[-1], eta2[-1], c1_surf[-1], c2_surf[-1] def sld_dynamics_1D2var(self, c1, c2, muO, act_lyte, ISfuncs, noises): N = self.get_trode_param("N") @@ -439,7 +439,7 @@ def sld_dynamics_0D1var(self, c, muO, act_lyte, ISfuncs, noise): eq = self.CreateEquation("dcsdt") eq.Residual = self.c.dt(0) - self.get_trode_param("delta_L")*self.Rxn() - return eta, c_surf[-1] + return eta[-1], c_surf[-1] def sld_dynamics_1D1var(self, c, muO, act_lyte, ISfuncs, noise): N = self.get_trode_param("N") diff --git a/mpet/utils.py b/mpet/utils.py index 738da736..8a876667 100644 --- a/mpet/utils.py +++ b/mpet/utils.py @@ -91,14 +91,17 @@ def central_diff(array, Nvol, dx): varout = {} for sectn in ["a", "s", "c"]: # If we have information within this battery section - # If it's an array of dae variable objects - if sectn in array: - out = get_var_vec(array[sectn], Nvol[sectn]) - out = np.hstack((2*out[0]-out[1], out, 2*out[-1]-out[-2])) - varout[sectn] = (out[2:]-out[:-2]) - + if sectn in ["a", "c"]: + if sectn in array.keys(): + # if it is one of the electrode sections + out = get_var_vec(array[sectn], Nvol[sectn]) + out = np.hstack((2*out[0]-out[1], out, 2*out[-1]-out[-2])) + varout[sectn] = (out[2:]-out[:-2]) + else: + varout[sectn] = np.zeros(0) else: - varout[sectn] = np.zeros(Nvol[sectn]) + # if anode does not exist + varout[sectn] = np.zeros(Nvol[sectn] if sectn in Nvol else 0) # sum solid + elyte poroisty output = np.hstack((varout["a"], varout["s"], varout["c"]))/(2*dx) return output @@ -110,15 +113,21 @@ def get_thermal_vec(Nvol, config): for sectn in ["a", "s", "c"]: # If we have information within this battery section if sectn in ["a", "c"]: - # If it's an array of dae variable objects - out = config['rhom'][sectn]*(1-config["poros"][sectn])**(1-config["BruggExp"][sectn]) \ - * config['cp'][sectn] + config['rhom']['l'] * \ - config["poros"][sectn]**config["BruggExp"][sectn]*config['cp']['l'] -# out = config['rhom'][sectn] * config['cp'][sectn] - varout[sectn] = get_const_vec(out, Nvol[sectn]) + if sectn in config["poros"].keys(): + # If it's an array of dae variable objects + out = config['rhom'][sectn]*(1-config["poros"][sectn])**(1-config["BruggExp"][sectn]) \ + * config['cp'][sectn] + config['rhom']['l'] * \ + config["poros"][sectn]**config["BruggExp"][sectn]*config['cp']['l'] +# out = config['rhom'][sectn] * config['cp'][sectn] + varout[sectn] = get_const_vec(out, Nvol[sectn]) + else: + # if anode does not exist + varout[sectn] = np.zeros(0) else: + # if electrolyte section out = config['rhom']['l'] * config['cp']['l'] - varout[sectn] = get_const_vec(out, Nvol[sectn]) + varout[sectn] = get_const_vec(out, Nvol[sectn] if sectn in Nvol else 0) + # sum solid + elyte poroisty out = np.hstack((varout["a"], varout["s"], varout["c"])) return out From 29b89d26062f0cf46d7741b9e90c5a81a7048154 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Tue, 21 Dec 2021 14:51:58 -0500 Subject: [PATCH 32/57] changed T into T0 in test cases and in default configs --- configs/params_system_Doyle96-cell1.cfg | 2 +- configs/params_system_Doyle96-cell2.cfg | 2 +- configs/params_system_Doyle96-cell3.cfg | 2 +- configs/params_system_Fuller94.cfg | 4 ++-- configs/params_system_LIONSIMBA.cfg | 2 +- mpet/utils.py | 3 ++- tests/ref_outputs/benchmark_Doyle96-cell1/params_system.cfg | 2 +- tests/ref_outputs/benchmark_Doyle96-cell2/params_system.cfg | 2 +- tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg | 2 -- .../benchmark_LIONSIMBA_nonisothermal/params_system.cfg | 2 -- tests/ref_outputs/test001/params_system.cfg | 2 -- tests/ref_outputs/test002/params_system.cfg | 2 -- tests/ref_outputs/test003/params_system.cfg | 2 -- tests/ref_outputs/test004/params_system.cfg | 2 -- tests/ref_outputs/test005/params_system.cfg | 2 -- tests/ref_outputs/test006/params_system.cfg | 2 -- tests/ref_outputs/test007/params_system.cfg | 2 -- tests/ref_outputs/test008/params_system.cfg | 2 -- tests/ref_outputs/test009/params_system.cfg | 2 -- tests/ref_outputs/test010/params_system.cfg | 2 -- tests/ref_outputs/test011/params_system.cfg | 2 -- tests/ref_outputs/test012/params_system.cfg | 2 -- tests/ref_outputs/test013/params_system.cfg | 2 -- tests/ref_outputs/test014/params_system.cfg | 2 -- tests/ref_outputs/test015/params_system.cfg | 2 -- tests/ref_outputs/test016/params_system.cfg | 2 -- tests/ref_outputs/test017/params_system.cfg | 2 -- tests/ref_outputs/test018/params_system.cfg | 2 -- tests/ref_outputs/test019/params_system.cfg | 2 -- tests/ref_outputs/test020/params_system.cfg | 2 -- tests/ref_outputs/test021/params_system.cfg | 2 -- tests/ref_outputs/test022/params_system.cfg | 2 -- tests/ref_outputs/test023/params_system.cfg | 2 -- 33 files changed, 10 insertions(+), 59 deletions(-) diff --git a/configs/params_system_Doyle96-cell1.cfg b/configs/params_system_Doyle96-cell1.cfg index e71b0fdb..9da0d5c0 100644 --- a/configs/params_system_Doyle96-cell1.cfg +++ b/configs/params_system_Doyle96-cell1.cfg @@ -20,7 +20,7 @@ tend = 1.2e3 tsteps = 200 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 0 Rser = 0 diff --git a/configs/params_system_Doyle96-cell2.cfg b/configs/params_system_Doyle96-cell2.cfg index 0a3663a6..c3ca0dc5 100644 --- a/configs/params_system_Doyle96-cell2.cfg +++ b/configs/params_system_Doyle96-cell2.cfg @@ -20,7 +20,7 @@ tend = 1.2e3 tsteps = 200 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 0 Rser = 0 diff --git a/configs/params_system_Doyle96-cell3.cfg b/configs/params_system_Doyle96-cell3.cfg index 87ddf684..0662fd84 100644 --- a/configs/params_system_Doyle96-cell3.cfg +++ b/configs/params_system_Doyle96-cell3.cfg @@ -20,7 +20,7 @@ tend = 1.2e3 tsteps = 200 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 0 Rser = 0 diff --git a/configs/params_system_Fuller94.cfg b/configs/params_system_Fuller94.cfg index 6ba4af50..c886f6ab 100644 --- a/configs/params_system_Fuller94.cfg +++ b/configs/params_system_Fuller94.cfg @@ -20,7 +20,7 @@ tend = 1.2e3 tsteps = 200 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 0 Rser = 0. @@ -95,4 +95,4 @@ SMset = LiClO4_PC n = 1 sp = -1 Dp = 2.2e-10 -Dm = 2.94e-10 \ No newline at end of file +Dm = 2.94e-10 diff --git a/configs/params_system_LIONSIMBA.cfg b/configs/params_system_LIONSIMBA.cfg index fa081403..829d9eea 100644 --- a/configs/params_system_LIONSIMBA.cfg +++ b/configs/params_system_LIONSIMBA.cfg @@ -31,7 +31,7 @@ tsteps = 200 relTol = 1e-6 absTol = 1e-6 # Temperature, K -T = 298 +T0 = 298 # Random seed. Set to true to give a random seed in the simulation randomSeed = false # Value of the random seed, must be an integer diff --git a/mpet/utils.py b/mpet/utils.py index 8a876667..d25ca54b 100644 --- a/mpet/utils.py +++ b/mpet/utils.py @@ -115,7 +115,8 @@ def get_thermal_vec(Nvol, config): if sectn in ["a", "c"]: if sectn in config["poros"].keys(): # If it's an array of dae variable objects - out = config['rhom'][sectn]*(1-config["poros"][sectn])**(1-config["BruggExp"][sectn]) \ + out = config['rhom'][sectn] * \ + (1-config["poros"][sectn])**(1-config["BruggExp"][sectn]) \ * config['cp'][sectn] + config['rhom']['l'] * \ config["poros"][sectn]**config["BruggExp"][sectn]*config['cp']['l'] # out = config['rhom'][sectn] * config['cp'][sectn] diff --git a/tests/ref_outputs/benchmark_Doyle96-cell1/params_system.cfg b/tests/ref_outputs/benchmark_Doyle96-cell1/params_system.cfg index 4a892c46..6a01c11b 100644 --- a/tests/ref_outputs/benchmark_Doyle96-cell1/params_system.cfg +++ b/tests/ref_outputs/benchmark_Doyle96-cell1/params_system.cfg @@ -13,7 +13,7 @@ tend = 1.2e3 tsteps = 25 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 0 Rser = 0 diff --git a/tests/ref_outputs/benchmark_Doyle96-cell2/params_system.cfg b/tests/ref_outputs/benchmark_Doyle96-cell2/params_system.cfg index 0341e490..d8aaa788 100644 --- a/tests/ref_outputs/benchmark_Doyle96-cell2/params_system.cfg +++ b/tests/ref_outputs/benchmark_Doyle96-cell2/params_system.cfg @@ -13,7 +13,7 @@ tend = 1.2e3 tsteps = 25 relTol = 1e-6 absTol = 1e-6 -T = 298 +T0 = 298 randomSeed = true seed = 0 Rser = 0 diff --git a/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg index 8684ef5f..729a9767 100644 --- a/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg +++ b/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg @@ -75,5 +75,3 @@ n = 1 sp = -1 Dp = 7.5e-10 Dm = 7.5e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg index 76651ed6..2f50b6ad 100644 --- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg +++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg @@ -75,5 +75,3 @@ n = 1 sp = -1 Dp = 7.5e-10 Dm = 7.5e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test001/params_system.cfg b/tests/ref_outputs/test001/params_system.cfg index 07cf71b0..952cfab0 100644 --- a/tests/ref_outputs/test001/params_system.cfg +++ b/tests/ref_outputs/test001/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test002/params_system.cfg b/tests/ref_outputs/test002/params_system.cfg index 07cf71b0..952cfab0 100644 --- a/tests/ref_outputs/test002/params_system.cfg +++ b/tests/ref_outputs/test002/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test003/params_system.cfg b/tests/ref_outputs/test003/params_system.cfg index 07cf71b0..952cfab0 100644 --- a/tests/ref_outputs/test003/params_system.cfg +++ b/tests/ref_outputs/test003/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test004/params_system.cfg b/tests/ref_outputs/test004/params_system.cfg index 07cf71b0..952cfab0 100644 --- a/tests/ref_outputs/test004/params_system.cfg +++ b/tests/ref_outputs/test004/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test005/params_system.cfg b/tests/ref_outputs/test005/params_system.cfg index 958ddf1c..841aa882 100644 --- a/tests/ref_outputs/test005/params_system.cfg +++ b/tests/ref_outputs/test005/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test006/params_system.cfg b/tests/ref_outputs/test006/params_system.cfg index c4cacd71..4959ca13 100644 --- a/tests/ref_outputs/test006/params_system.cfg +++ b/tests/ref_outputs/test006/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test007/params_system.cfg b/tests/ref_outputs/test007/params_system.cfg index 0e10e056..b99b0c53 100644 --- a/tests/ref_outputs/test007/params_system.cfg +++ b/tests/ref_outputs/test007/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test008/params_system.cfg b/tests/ref_outputs/test008/params_system.cfg index ec8ee847..2174e9c8 100644 --- a/tests/ref_outputs/test008/params_system.cfg +++ b/tests/ref_outputs/test008/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test009/params_system.cfg b/tests/ref_outputs/test009/params_system.cfg index 07cf71b0..952cfab0 100644 --- a/tests/ref_outputs/test009/params_system.cfg +++ b/tests/ref_outputs/test009/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test010/params_system.cfg b/tests/ref_outputs/test010/params_system.cfg index a151988e..93c7430a 100644 --- a/tests/ref_outputs/test010/params_system.cfg +++ b/tests/ref_outputs/test010/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test011/params_system.cfg b/tests/ref_outputs/test011/params_system.cfg index de7dc3a2..02a7be97 100644 --- a/tests/ref_outputs/test011/params_system.cfg +++ b/tests/ref_outputs/test011/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test012/params_system.cfg b/tests/ref_outputs/test012/params_system.cfg index 9f34c385..0a6f92f3 100644 --- a/tests/ref_outputs/test012/params_system.cfg +++ b/tests/ref_outputs/test012/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test013/params_system.cfg b/tests/ref_outputs/test013/params_system.cfg index 0fe12bff..a031e3f5 100644 --- a/tests/ref_outputs/test013/params_system.cfg +++ b/tests/ref_outputs/test013/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test014/params_system.cfg b/tests/ref_outputs/test014/params_system.cfg index 7a01acb5..5d9e24e5 100644 --- a/tests/ref_outputs/test014/params_system.cfg +++ b/tests/ref_outputs/test014/params_system.cfg @@ -73,5 +73,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test015/params_system.cfg b/tests/ref_outputs/test015/params_system.cfg index 356531ea..45c2f8d2 100644 --- a/tests/ref_outputs/test015/params_system.cfg +++ b/tests/ref_outputs/test015/params_system.cfg @@ -73,5 +73,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test016/params_system.cfg b/tests/ref_outputs/test016/params_system.cfg index 2873bb15..23511592 100644 --- a/tests/ref_outputs/test016/params_system.cfg +++ b/tests/ref_outputs/test016/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test017/params_system.cfg b/tests/ref_outputs/test017/params_system.cfg index 5d3844b1..22ddb1ec 100644 --- a/tests/ref_outputs/test017/params_system.cfg +++ b/tests/ref_outputs/test017/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test018/params_system.cfg b/tests/ref_outputs/test018/params_system.cfg index 70bd1834..7c54f9a9 100644 --- a/tests/ref_outputs/test018/params_system.cfg +++ b/tests/ref_outputs/test018/params_system.cfg @@ -73,5 +73,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test019/params_system.cfg b/tests/ref_outputs/test019/params_system.cfg index bdf8f355..7befd117 100644 --- a/tests/ref_outputs/test019/params_system.cfg +++ b/tests/ref_outputs/test019/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test020/params_system.cfg b/tests/ref_outputs/test020/params_system.cfg index efb0b6eb..cea407a1 100644 --- a/tests/ref_outputs/test020/params_system.cfg +++ b/tests/ref_outputs/test020/params_system.cfg @@ -77,5 +77,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test021/params_system.cfg b/tests/ref_outputs/test021/params_system.cfg index 162de138..6626de71 100644 --- a/tests/ref_outputs/test021/params_system.cfg +++ b/tests/ref_outputs/test021/params_system.cfg @@ -77,5 +77,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test022/params_system.cfg b/tests/ref_outputs/test022/params_system.cfg index ca37a96f..cd17644c 100644 --- a/tests/ref_outputs/test022/params_system.cfg +++ b/tests/ref_outputs/test022/params_system.cfg @@ -78,5 +78,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 diff --git a/tests/ref_outputs/test023/params_system.cfg b/tests/ref_outputs/test023/params_system.cfg index 0fe12bff..a031e3f5 100644 --- a/tests/ref_outputs/test023/params_system.cfg +++ b/tests/ref_outputs/test023/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 1000 -cp = 10 From e5e0ad62bcba02f971d957ff4982928f7434259a Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Fri, 31 Dec 2021 15:29:34 -0500 Subject: [PATCH 33/57] fixed error in analytical test case configuration --- tests/baseConfigs/params_system.cfg | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/baseConfigs/params_system.cfg b/tests/baseConfigs/params_system.cfg index 09f9ab75..f4c69db8 100644 --- a/tests/baseConfigs/params_system.cfg +++ b/tests/baseConfigs/params_system.cfg @@ -76,5 +76,3 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 -k_h = 10000 -cp = 10 From 8d1e4e7859fe296a34dd5bf4e921ba2869118cfa Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Sat, 1 Jan 2022 03:51:39 -0500 Subject: [PATCH 34/57] added temperature dependence to MHC function --- mpet/electrode/reactions.py | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/mpet/electrode/reactions.py b/mpet/electrode/reactions.py index 04e73d2c..0871293f 100644 --- a/mpet/electrode/reactions.py +++ b/mpet/electrode/reactions.py @@ -1,6 +1,5 @@ import daetools.pyDAE as dae import numpy as np -import scipy.special as spcl eps = -1e-12 @@ -72,23 +71,19 @@ def Marcus(eta, c_sld, c_lyte, k0, E_A, T, act_R=None, return Rate -def MHC_kfunc(eta, lmbda): - a = 1. + np.sqrt(lmbda) - if isinstance(eta, dae.pyCore.adouble): - ERF = dae.Erf - else: - ERF = spcl.erf +def MHC_kfunc(eta, lmbda, T): + a = 1. + np.sqrt(lmbda/T) # evaluate with eta for oxidation, -eta for reduction - return (np.sqrt(np.pi*lmbda) / (1 + np.exp(-eta)) - * (1. - ERF((lmbda - np.sqrt(a + eta**2)) - / (2*np.sqrt(lmbda))))) + return (np.sqrt(np.pi*lmbda/T) / (1 + np.exp(-eta/T)) + * (1. - dae.Erf((lmbda/T - np.sqrt(a + (eta/T)**2)) + / (2*np.sqrt(lmbda/T))))) def MHC(eta, c_sld, c_lyte, k0, E_A, T, act_R=None, act_lyte=None, lmbda=None, alpha=None): # See Zeng, Smith, Bai, Bazant 2014 # Convert to "MHC overpotential" - k0 = k0/MHC_kfunc(0., lmbda) + k0 = k0/MHC_kfunc(0., lmbda, T) eta_f = eta + T*np.log(c_lyte/c_sld) gamma_ts = 1./(1. - c_sld) alpha = 0.5 @@ -96,12 +91,12 @@ def MHC(eta, c_sld, c_lyte, k0, E_A, T, act_R=None, if isinstance(eta, np.ndarray): Rate = np.empty(len(eta), dtype=object) for i, etaval in enumerate(eta): - krd = k0*MHC_kfunc(-eta_f[i], lmbda) - kox = k0*MHC_kfunc(eta_f[i], lmbda) + krd = k0*MHC_kfunc(-eta_f[i], lmbda, T) + kox = k0*MHC_kfunc(eta_f[i], lmbda, T) Rate[i] = ecd_extras[i]*(krd*c_lyte - kox*c_sld[i]) else: - krd = k0*MHC_kfunc(-eta_f, lmbda) - kox = k0*MHC_kfunc(eta_f, lmbda) + krd = k0*MHC_kfunc(-eta_f, lmbda, T) + kox = k0*MHC_kfunc(eta_f, lmbda, T) Rate = np.exp(-E_A/T + E_A/1) * ecd_extras*(krd*c_lyte - kox*c_sld) return Rate @@ -114,11 +109,11 @@ def CIET(eta, c_sld, c_lyte, k0, E_A, T, act_R=None, if isinstance(eta, np.ndarray): Rate = np.empty(len(eta), dtype=object) for i, etaval in enumerate(eta): - krd = k0*MHC_kfunc(-eta_f[i], lmbda) - kox = k0*MHC_kfunc(eta_f[i], lmbda) + krd = k0*MHC_kfunc(-eta_f[i], lmbda, T) + kox = k0*MHC_kfunc(eta_f[i], lmbda, T) Rate[i] = ecd_extras[i]*(krd*c_lyte - kox*c_sld[i]) else: - krd = k0*MHC_kfunc(-eta_f, lmbda) - kox = k0*MHC_kfunc(eta_f, lmbda) + krd = k0*MHC_kfunc(-eta_f, lmbda, T) + kox = k0*MHC_kfunc(eta_f, lmbda, T) Rate = np.exp(-E_A/T + E_A/1) * ecd_extras*(krd*c_lyte - kox*c_sld) return Rate From 6a50f96fb943b4b428eaee70da7b3d97415ce1be Mon Sep 17 00:00:00 2001 From: lightningclaw001 Date: Sat, 5 Mar 2022 16:10:22 -0500 Subject: [PATCH 35/57] Update mod_electrodes.py --- mpet/mod_electrodes.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mpet/mod_electrodes.py b/mpet/mod_electrodes.py index 4d9735c3..2f00b7ad 100644 --- a/mpet/mod_electrodes.py +++ b/mpet/mod_electrodes.py @@ -172,9 +172,9 @@ def DeclareEquations(self): eq = self.CreateEquation("q_rxn_bar") if self.config["ent_heat_gen"]: eq.Residual = self.q_rxn_bar() - 0.5 * self.dcbar1dt() * \ - (eta1 + self.T_lyte()*(-np.log(c_surf1/(1-c_surf1))+1/self.c_lyte())) \ + (eta1 + self.T_lyte()*(np.log(c_surf1/(1-c_surf1))-1/self.c_lyte())) \ - 0.5 * self.dcbar2dt() * (eta2 + self.T_lyte() - * (-np.log(c_surf2/(1-c_surf2))+1/self.c_lyte())) + * (np.log(c_surf2/(1-c_surf2))-1/self.c_lyte())) else: eq.Residual = self.q_rxn_bar() - 0.5 * self.dcbar1dt() * eta1 \ - 0.5 * self.dcbar2dt() * eta2 @@ -418,7 +418,7 @@ def DeclareEquations(self): eq = self.CreateEquation("q_rxn_bar") if self.config["ent_heat_gen"]: eq.Residual = self.q_rxn_bar() - self.dcbardt() * \ - (eta + self.T_lyte()*(-np.log(c_surf/(1-c_surf))+1/self.c_lyte())) + (eta + self.T_lyte()*(np.log(c_surf/(1-c_surf))-1/self.c_lyte())) else: eq.Residual = self.q_rxn_bar() - self.dcbardt() * eta From 9cd2a5c2662fed259a284010952facf3508eca56 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Tue, 8 Mar 2022 23:22:56 -0500 Subject: [PATCH 36/57] fixed errors in implementing nonisothermal effects --- mpet/mod_cell.py | 10 +++++----- mpet/mod_electrodes.py | 6 +++--- mpet/utils.py | 12 ++++++++++-- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index a26f8c06..87d08882 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -389,9 +389,9 @@ def DeclareEquations(self): eqP.Residual = phitmp[0] - phitmp[1] if config['nonisothermal']: # boundary equation for temperature variables. per volume - eqTL.Residual = q_edges[0] + config["h_h"]*(Ttmp[0]-config["T0"])/disc["dxvec"][0] + eqTL.Residual = q_edges[0] + config["h_h"]*(Ttmp[0]-config["T0"]) eqTR.Residual = q_edges[-1] + config["h_h"] * \ - (Ttmp[-1]-config["T0"])/disc["dxvec"][-1] + (Ttmp[-1]-config["T0"]) else: eqTL.Residual = Ttmp[0] - Ttmp[1] eqTR.Residual = Ttmp[-1] - Ttmp[-2] @@ -609,7 +609,7 @@ def get_ohmic_heat(c_lyte, T_lyte, phi_lyte, phi_bulk, disc, config, Nvol): sigma_s = utils.get_asc_vec(config["sigma_s"], Nvol) c_edges_int = utils.weighted_linear_mean(c_lyte, wt) dphilytedx = utils.central_diff(phi_lyte, Nvol, dx) - dphibulkdx = utils.central_diff(phi_bulk, Nvol, dx) + dphibulkdx = utils.central_diff(phi_bulk, Nvol, dx, False) c_mid = c_lyte[1:-1] T_mid = T_lyte[1:-1] @@ -624,8 +624,8 @@ def get_ohmic_heat(c_lyte, T_lyte, phi_lyte, phi_bulk, disc, config, Nvol): sigma_fs, thermFac, tp0 = elyte_function()[1:-1] # Get diffusivity and conductivity at cell edges using weighted harmonic mean sigma_l = eps_o_tau[1:-1]*sigma_fs(c_mid, T_mid) - q_ohmic = q_ohmic + 2*sigma_l*(1-tp0(c_mid, T_mid)) * \ - np.diff(np.log(c_edges_int))/dx*dphilytedx + q_ohmic = q_ohmic + 2*sigma_l*(1-tp0(c_mid, T_mid))*T_mid \ + *np.diff(np.log(c_edges_int))/dx*dphilytedx # this is going to be dra sigma_s = min_eps_o_tau[1:-1] * sigma_s diff --git a/mpet/mod_electrodes.py b/mpet/mod_electrodes.py index 2f00b7ad..aaf44e6b 100644 --- a/mpet/mod_electrodes.py +++ b/mpet/mod_electrodes.py @@ -172,8 +172,8 @@ def DeclareEquations(self): eq = self.CreateEquation("q_rxn_bar") if self.config["ent_heat_gen"]: eq.Residual = self.q_rxn_bar() - 0.5 * self.dcbar1dt() * \ - (eta1 + self.T_lyte()*(np.log(c_surf1/(1-c_surf1))-1/self.c_lyte())) \ - - 0.5 * self.dcbar2dt() * (eta2 + self.T_lyte() + (eta1 - self.T_lyte()*(np.log(c_surf1/(1-c_surf1))-1/self.c_lyte())) \ + - 0.5 * self.dcbar2dt() * (eta2 - self.T_lyte() * (np.log(c_surf2/(1-c_surf2))-1/self.c_lyte())) else: eq.Residual = self.q_rxn_bar() - 0.5 * self.dcbar1dt() * eta1 \ @@ -418,7 +418,7 @@ def DeclareEquations(self): eq = self.CreateEquation("q_rxn_bar") if self.config["ent_heat_gen"]: eq.Residual = self.q_rxn_bar() - self.dcbardt() * \ - (eta + self.T_lyte()*(np.log(c_surf/(1-c_surf))-1/self.c_lyte())) + (eta - self.T_lyte()*(np.log(c_surf/(1-c_surf))-1/self.c_lyte())) else: eq.Residual = self.q_rxn_bar() - self.dcbardt() * eta diff --git a/mpet/utils.py b/mpet/utils.py index 6c4e9d40..595ed3a9 100644 --- a/mpet/utils.py +++ b/mpet/utils.py @@ -87,7 +87,7 @@ def get_asc_vec(var, Nvol, dt=False): return out -def central_diff(array, Nvol, dx): +def central_diff(array, Nvol, dx, with_separator = True): """Gets central diff for derivatives for use in thermal derivatives (which are split between the individual electrodes)""" varout = {} @@ -103,7 +103,15 @@ def central_diff(array, Nvol, dx): varout[sectn] = np.zeros(0) else: # if anode does not exist - varout[sectn] = np.zeros(Nvol[sectn] if sectn in Nvol else 0) + if sectn in Nvol: + if with_separator: + out = get_var_vec(array[sectn], Nvol[sectn]) + out = np.hstack((2*out[0]-out[1], out, 2*out[-1]-out[-2])) + varout[sectn] = (out[2:]-out[:-2]) + else: + varout[sectn] = np.zeros(Nvol[sectn]) + else: + varout[sectn] = np.zeros(0) # sum solid + elyte poroisty output = np.hstack((varout["a"], varout["s"], varout["c"]))/(2*dx) return output From e18da4c15f8125e5f2101e2362b9b43381e36376 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Wed, 9 Mar 2022 12:20:13 -0500 Subject: [PATCH 37/57] fixed discretization of electrodes between meshes --- mpet/geometry.py | 1 + mpet/mod_cell.py | 6 +++--- mpet/utils.py | 30 +++++++++++++++++++++--------- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/mpet/geometry.py b/mpet/geometry.py index b46d65ca..8483a162 100644 --- a/mpet/geometry.py +++ b/mpet/geometry.py @@ -87,6 +87,7 @@ def get_elyte_disc(Nvol, L, poros, BruggExp, k_h): dxtmp = np.hstack((out["dxvec"][0], out["dxvec"], out["dxvec"][-1])) out["dx"] = dxtmp out["dxd1"] = utils.mean_linear(dxtmp) + out["dxd2"] = utils.mean_linear(out["dxd1"]) # for thermal finite differences # The porosity vector out["porosvec"] = utils.get_asc_vec(poros, Nvol) diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index 87d08882..3fc86dfa 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -603,13 +603,13 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, config, Nvol): def get_ohmic_heat(c_lyte, T_lyte, phi_lyte, phi_bulk, disc, config, Nvol): eps_o_tau = disc["eps_o_tau"] min_eps_o_tau = disc["min_eps_o_tau"] - dx = disc["dxvec"] + dx = disc["dxd2"] wt = utils.pad_vec(disc["dxvec"]) sigma_s = utils.get_asc_vec(config["sigma_s"], Nvol) c_edges_int = utils.weighted_linear_mean(c_lyte, wt) - dphilytedx = utils.central_diff(phi_lyte, Nvol, dx) - dphibulkdx = utils.central_diff(phi_bulk, Nvol, dx, False) + dphilytedx = utils.central_diff_lyte(phi_lyte, Nvol, dx) + dphibulkdx = utils.central_diff_bulk(phi_bulk, Nvol, dx) c_mid = c_lyte[1:-1] T_mid = T_lyte[1:-1] diff --git a/mpet/utils.py b/mpet/utils.py index 595ed3a9..17f19655 100644 --- a/mpet/utils.py +++ b/mpet/utils.py @@ -87,11 +87,11 @@ def get_asc_vec(var, Nvol, dt=False): return out -def central_diff(array, Nvol, dx, with_separator = True): +def central_diff_bulk(array, Nvol, dx): """Gets central diff for derivatives for use in thermal derivatives (which are split between - the individual electrodes)""" + the individual electrodes) for bulk""" varout = {} - for sectn in ["a", "s", "c"]: + for sectn in ["a", "c", "s"]: # If we have information within this battery section if sectn in ["a", "c"]: if sectn in array.keys(): @@ -104,12 +104,7 @@ def central_diff(array, Nvol, dx, with_separator = True): else: # if anode does not exist if sectn in Nvol: - if with_separator: - out = get_var_vec(array[sectn], Nvol[sectn]) - out = np.hstack((2*out[0]-out[1], out, 2*out[-1]-out[-2])) - varout[sectn] = (out[2:]-out[:-2]) - else: - varout[sectn] = np.zeros(Nvol[sectn]) + varout[sectn] = np.zeros(Nvol[sectn]) else: varout[sectn] = np.zeros(0) # sum solid + elyte poroisty @@ -117,6 +112,23 @@ def central_diff(array, Nvol, dx, with_separator = True): return output +def central_diff_lyte(array, Nvol, dx): + """Gets central diff for derivatives for use in thermal derivatives (which are split between + the individual electrodes) for electrolyte""" + out = np.zeros(0) + for sectn in ["a", "s", "c"]: + # If we have information within this battery section + if sectn in array.keys(): + # if it is one of the electrode sections + out = np.append(out, get_var_vec(array[sectn], Nvol[sectn])) + else: + out = np.append(out, np.zeros(0)) + # now we have stacked everything + out = np.hstack((2*out[0]-out[1], out, 2*out[-1]-out[-2])) + output = (out[2:]-out[:-2])/(2*dx) + return output + + def get_thermal_vec(Nvol, config): """Get a numpy array for a variable spanning the anode, separator, and cathode.""" varout = {} From 61956aca49e8ac2468a5e4bcdd8121817db10352 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Thu, 10 Mar 2022 17:49:00 -0500 Subject: [PATCH 38/57] modified boundary conditions --- mpet/geometry.py | 2 +- mpet/mod_cell.py | 16 +++++++--------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/mpet/geometry.py b/mpet/geometry.py index 8483a162..91d91603 100644 --- a/mpet/geometry.py +++ b/mpet/geometry.py @@ -87,7 +87,7 @@ def get_elyte_disc(Nvol, L, poros, BruggExp, k_h): dxtmp = np.hstack((out["dxvec"][0], out["dxvec"], out["dxvec"][-1])) out["dx"] = dxtmp out["dxd1"] = utils.mean_linear(dxtmp) - out["dxd2"] = utils.mean_linear(out["dxd1"]) # for thermal finite differences + out["dxd2"] = utils.mean_linear(out["dxd1"]) # for thermal finite differences # The porosity vector out["porosvec"] = utils.get_asc_vec(poros, Nvol) diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index 3fc86dfa..e42ecfbf 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -387,14 +387,9 @@ def DeclareEquations(self): else: eqC.Residual = ctmp[0] - ctmp[1] eqP.Residual = phitmp[0] - phitmp[1] - if config['nonisothermal']: - # boundary equation for temperature variables. per volume - eqTL.Residual = q_edges[0] + config["h_h"]*(Ttmp[0]-config["T0"]) - eqTR.Residual = q_edges[-1] + config["h_h"] * \ - (Ttmp[-1]-config["T0"]) - else: - eqTL.Residual = Ttmp[0] - Ttmp[1] - eqTR.Residual = Ttmp[-1] - Ttmp[-2] + # boundary equation for temperature variables. per volume + eqTL.Residual = Ttmp[0] - config["T0"] + eqTR.Residual = Ttmp[-1] - config["T0"] dvgNm = np.diff(Nm_edges)/disc["dxvec"] dvgi = np.diff(i_edges)/disc["dxvec"] @@ -597,6 +592,9 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, config, Nvol): Nm_edges_int = num*(-D_edges*np.diff(c_lyte)/dxd1 + (1./(num*zm)*(1-tp0(c_edges_int, T_edges_int))*i_edges_int)) q_edges_int = -k_h*np.diff(T_lyte)/dxd1 + # replace boundary conditions since they are ghost points with convective BCs + q_edges_int[0] = config["h_h"]*(1 - T_lyte[1]) + q_edges_int[-1] = config["h_h"]*(T_lyte[-2] - 1) return Nm_edges_int, i_edges_int, q_edges_int @@ -625,7 +623,7 @@ def get_ohmic_heat(c_lyte, T_lyte, phi_lyte, phi_bulk, disc, config, Nvol): # Get diffusivity and conductivity at cell edges using weighted harmonic mean sigma_l = eps_o_tau[1:-1]*sigma_fs(c_mid, T_mid) q_ohmic = q_ohmic + 2*sigma_l*(1-tp0(c_mid, T_mid))*T_mid \ - *np.diff(np.log(c_edges_int))/dx*dphilytedx + * np.diff(np.log(c_edges_int))/dx*dphilytedx # this is going to be dra sigma_s = min_eps_o_tau[1:-1] * sigma_s From ad7fe99585ec925fcde593c70b949b0b9f5ebd28 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Tue, 15 Mar 2022 14:26:27 -0400 Subject: [PATCH 39/57] changed cp and rho properties to electrode instead of material properties --- mpet/config/configuration.py | 11 ++++++----- mpet/config/constants.py | 4 ++-- mpet/config/schemas.py | 4 ++-- mpet/utils.py | 21 ++++++--------------- 4 files changed, 16 insertions(+), 24 deletions(-) diff --git a/mpet/config/configuration.py b/mpet/config/configuration.py index 933ee151..50b0c451 100644 --- a/mpet/config/configuration.py +++ b/mpet/config/configuration.py @@ -506,6 +506,9 @@ def _scale_electrode_parameters(self): self['beta'][trode] = self[trode, 'csmax'] / constants.c_ref self['sigma_s'][trode] = self['sigma_s'][trode] / self['sigma_s_ref'] self['k_h'][trode] = self['k_h'][trode] / self['k_h_ref'] + self['cp'][trode] = self['cp'][trode] / \ + (self['k_h_ref'] * self['t_ref'] / (self['rho_ref']*self['L_ref']**2)) + self['rhom'][trode] = self['rhom'][trode] / self['rho_ref'] self[trode, 'lambda'] = self[trode, 'lambda'] / kT self[trode, 'B'] = self[trode, 'B'] / (kT * constants.N_A * self[trode, 'cs_ref']) @@ -514,15 +517,13 @@ def _scale_electrode_parameters(self): if value is not None: self[trode, param] = value / kT - for mat in self['materials']: - self['cp'][mat] = self['cp'][mat] / \ - (self['k_h_ref'] * self['t_ref'] / (self['rho_ref']*self['L_ref']**2)) - self['rhom'][mat] = self['rhom'][mat] / self['rho_ref'] - # scalings on separator if self['have_separator']: self['L']['s'] /= self['L_ref'] self['k_h']['s'] = self['k_h']['s'] / self['k_h_ref'] + self['cp']['s'] = self['cp']['s'] / \ + (self['k_h_ref'] * self['t_ref'] / (self['rho_ref']*self['L_ref']**2)) + self['rhom']['s'] = self['rhom']['s'] / self['rho_ref'] def _scale_macroscopic_parameters(self, Vref): """ diff --git a/mpet/config/constants.py b/mpet/config/constants.py index 458d92e9..d89c6ee6 100644 --- a/mpet/config/constants.py +++ b/mpet/config/constants.py @@ -22,9 +22,9 @@ 'simPartCond', 'G_mean', 'G_stddev', 'L', 'P_L', 'poros', 'BruggExp', 'specified_psd', 'rhom', 'cp', 'k_h'] #: subset of ``PARAMS_PER_TRODE``` that is defined for the separator as well -PARAMS_SEPARATOR = ['Nvol', 'L', 'poros', 'BruggExp', 'k_h'] +PARAMS_SEPARATOR = ['Nvol', 'L', 'poros', 'BruggExp', 'k_h', 'cp', 'rhom'] # PARAMETERS THAT ARE NEEDED IN A THERMAL MODEL FOR ELECTROLYTE PROPERTIES -PARAMS_ELYTE = ['cp', 'sigma', 'rhom'] +PARAMS_ELYTE = ['sigma'] #: parameters that are defined for each particle, and their type PARAMS_PARTICLE = {'N': int, 'kappa': float, 'beta_s': float, 'D': float, 'k0': float, 'Rfilm': float, 'delta_L': float, 'Omega_a': float, 'E_D': float, diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py index 07dae437..e003d28b 100644 --- a/mpet/config/schemas.py +++ b/mpet/config/schemas.py @@ -116,10 +116,10 @@ def tobool(value): 'BruggExp_s': Use(float)}, 'Thermal Parameters': {Optional('cp_c', default=1e8): Use(float), Optional('cp_a', default=1e8): Use(float), - Optional('cp_l', default=1e8): Use(float), + Optional('cp_s', default=1e8): Use(float), Optional('rhom_c', default=0.2): Use(float), Optional('rhom_a', default=0.2): Use(float), - Optional('rhom_l', default=0.2): Use(float), + Optional('rhom_s', default=0.2): Use(float), Optional('k_h_c', default=0.2): Use(float), Optional('k_h_a', default=0.2): Use(float), Optional('k_h_s', default=0.2): Use(float), diff --git a/mpet/utils.py b/mpet/utils.py index 17f19655..a5af1b8a 100644 --- a/mpet/utils.py +++ b/mpet/utils.py @@ -134,22 +134,13 @@ def get_thermal_vec(Nvol, config): varout = {} for sectn in ["a", "s", "c"]: # If we have information within this battery section - if sectn in ["a", "c"]: - if sectn in config["poros"].keys(): - # If it's an array of dae variable objects - out = config['rhom'][sectn] * \ - (1-config["poros"][sectn])**(1-config["BruggExp"][sectn]) \ - * config['cp'][sectn] + config['rhom']['l'] * \ - config["poros"][sectn]**config["BruggExp"][sectn]*config['cp']['l'] -# out = config['rhom'][sectn] * config['cp'][sectn] - varout[sectn] = get_const_vec(out, Nvol[sectn]) - else: - # if anode does not exist - varout[sectn] = np.zeros(0) + if sectn in Nvol: + # If it's an array of dae variable objects + out = config['rhom'][sectn] * config['cp'][sectn] + varout[sectn] = get_const_vec(out, Nvol[sectn]) else: - # if electrolyte section - out = config['rhom']['l'] * config['cp']['l'] - varout[sectn] = get_const_vec(out, Nvol[sectn] if sectn in Nvol else 0) + # if anode does not exist + varout[sectn] = np.zeros(0) # sum solid + elyte poroisty out = np.hstack((varout["a"], varout["s"], varout["c"])) From 80c506948514c6579926147950595264ec3bb181 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Tue, 15 Mar 2022 14:35:55 -0400 Subject: [PATCH 40/57] added test case for heat generation --- mpet/mod_electrodes.py | 4 +- .../params_a.cfg | 29 ++++ .../params_c.cfg | 29 ++++ .../params_system.cfg | 91 ++++++++++++ .../sim_output/commit.diff | 1 + .../sim_output/daetools_config_options.txt | 137 ++++++++++++++++++ .../sim_output/input_dict_anode.p | Bin 0 -> 2086 bytes .../sim_output/input_dict_cathode.p | Bin 0 -> 2088 bytes .../sim_output/input_dict_derived_values.p | Bin 0 -> 691 bytes .../sim_output/input_dict_system.p | Bin 0 -> 3798 bytes .../sim_output/output_data | 0 .../sim_output/output_data.mat | Bin 0 -> 106304 bytes .../sim_output/run_info.txt | 17 +++ 13 files changed, 306 insertions(+), 2 deletions(-) create mode 100644 tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_a.cfg create mode 100644 tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_c.cfg create mode 100644 tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg create mode 100644 tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff create mode 100644 tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt create mode 100644 tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p create mode 100644 tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p create mode 100644 tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p create mode 100644 tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p create mode 100644 tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data create mode 100644 tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat create mode 100644 tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt diff --git a/mpet/mod_electrodes.py b/mpet/mod_electrodes.py index aaf44e6b..4efac8c6 100644 --- a/mpet/mod_electrodes.py +++ b/mpet/mod_electrodes.py @@ -552,9 +552,9 @@ def calc_flux_diffn(c, D, Dfunc, E_D, Flux_bc, dr, T, noise): Flux_vec[-1] = Flux_bc c_edges = utils.mean_linear(c) if noise is None: - Flux_vec[1:N] = -D * Dfunc(c_edges) * np.exp(-E_D/T + E_D/1) * np.diff(c)/dr + Flux_vec[1:N] = -D/T * Dfunc(c_edges) * np.exp(-E_D/T + E_D/1) * np.diff(c)/dr else: - Flux_vec[1:N] = -D * Dfunc(c_edges) * np.exp(-E_D/T + E_D/1) * \ + Flux_vec[1:N] = -D/T * Dfunc(c_edges) * np.exp(-E_D/T + E_D/1) * \ np.diff(c + noise(dae.Time().Value))/dr return Flux_vec diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_a.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_a.cfg new file mode 100644 index 00000000..5abf4b51 --- /dev/null +++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_a.cfg @@ -0,0 +1,29 @@ +[Particles] +type = CHR +discretization = 2.e-7 +shape = sphere +thickness = 20e-9 + +[Material] +muRfunc = LiC6_LIONSIMBA +logPad = false +noise = false +noise_prefac = 1e-6 +numnoise = 200 +kappa = 4.0e-7 +B = 0.0 +rho_s = 1.839e28 +D = 3.9e-14 +Dfunc = constant +E_D = 5000 +dgammadc = 0e-30 +cwet = 0.98 + +[Reactions] +rxnType = BV_mod01 +k0 = 4.690 +E_A = 5000 +alpha = 0.5 +lambda = 6.26e-20 +Rfilm = 0e-0 + diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_c.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_c.cfg new file mode 100644 index 00000000..23515551 --- /dev/null +++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_c.cfg @@ -0,0 +1,29 @@ +[Particles] +type = CHR +discretization = 2.e-7 +shape = sphere +thickness = 20e-9 + +[Material] +muRfunc = LiCoO2_LIONSIMBA +logPad = false +noise = false +noise_prefac = 1e-6 +numnoise = 200 +kappa = 5.0148e-10 +B = 0.1916e9 +rho_s = 3.1036e28 +D = 1e-14 +Dfunc = constant +E_D = 5000 +dgammadc = 0e-30 +cwet = 0.98 + +[Reactions] +rxnType = BV_mod01 +k0 = 3.671 +E_A = 5000 +alpha = 0.5 +lambda = 6.26e-20 +Rfilm = 0e-0 + diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg new file mode 100644 index 00000000..34d0c5bc --- /dev/null +++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg @@ -0,0 +1,91 @@ +[Sim Params] +profileType = CC +Crate = 1 +1C_current_density = 30 +Vmax = 5 +Vmin = 2.5 +Vset = 0.12 +segments = [ + (0.3, 0.4), + (-0.5, 0.1), + ] +prevDir = false +tend = 1.2e3 +tsteps = 25 +relTol = 1e-6 +absTol = 1e-6 +T0 = 323 +randomSeed = false +seed = 0 +Rser = 0. +Nvol_c = 10 +Nvol_s = 10 +Nvol_a = 10 +Npart_c = 1 +Npart_a = 1 + +[Electrodes] +cathode = params_c.cfg +anode = params_a.cfg +k0_foil = 1e0 +Rfilm_foil = 0e-0 + +[Particles] +mean_c = 2e-6 +stddev_c = 0 +mean_a = 2e-6 +stddev_a = 0 +cs0_c = 0.4995 +cs0_a = 0.8551 + +[Conductivity] +simBulkCond_c = true +simBulkCond_a = true +sigma_s_c = 412.43 +sigma_s_a = 685.77 +simPartCond_c = false +simPartCond_a = false +G_mean_c = 1e-14 +G_stddev_c = 0 +G_mean_a = 1e-14 +G_stddev_a = 0 + +[Geometry] +L_c = 8e-5 +L_a = 8.8e-5 +L_s = 2.5e-5 +P_L_c = 0.9593 +P_L_a = 0.9367 +poros_c = 0.385 +poros_a = 0.485 +poros_s = 0.724 +BruggExp_c = -3 +BruggExp_a = -3 +BruggExp_s = -3 + +[Thermal Parameters] +cp_c = 700 +cp_s = 700 +cp_a = 700 +rhom_c = 2500 +rhom_s = 1100 +rhom_a = 2500 +h_h = 10 +k_h_c = 2.1 +k_h_a = 1.7 +k_h_s = 0.16 +sigma_l = 500 +ent_heat_gen = False + +[Electrolyte] +c0 = 1000 +zp = 1 +zm = -1 +nup = 1 +num = 1 +elyteModelType = SM +SMset = LIONSIMBA_nonisothermal +n = 1 +sp = -1 +Dp = 7.5e-10 +Dm = 7.5e-10 diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff @@ -0,0 +1 @@ + diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt new file mode 100644 index 00000000..5b8dc25f --- /dev/null +++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt @@ -0,0 +1,137 @@ +{ + "daetools": { + "core": { + "checkForInfiniteNumbers": "false", + "eventTolerance": "1E-7", + "logIndent": " ", + "pythonIndent": " ", + "checkUnitsConsistency": "true", + "resetLAMatrixAfterDiscontinuity": "true", + "printInfo": "false", + "nodes": { + "useNodeMemoryPools": "false", + "deleteNodesThreshold": "1000000" + }, + "equations": { + "info": [ + "If simplifyExpressions is true equation expressions will be simplified.", + "evaluationMode specifies the mode of evaluation: evaluationTree_OpenMP or computeStack_OpenMP.", + "computeStack_External is set by specifying the adComputeStackEvaluator_t object to the simulation.", + "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system)." + ], + "simplifyExpressions": "false", + "evaluationMode": "computeStack_OpenMP", + "evaluationTree_OpenMP": { + "numThreads": "0" + }, + "computeStack_OpenMP": { + "numThreads": "0" + } + } + }, + "activity": { + "printHeader": "false", + "printStats": "false", + "timeHorizon": "100.0", + "reportingInterval": "1.0", + "reportTimeDerivatives": "false", + "reportSensitivities": "false", + "stopAtModelDiscontinuity": "true", + "reportDataAroundDiscontinuities": "true", + "objFunctionAbsoluteTolerance": "1E-8", + "constraintsAbsoluteTolerance": "1E-8", + "measuredVariableAbsoluteTolerance": "1E-8" + }, + "datareporting": { + "tcpipDataReceiverAddress": "127.0.0.1", + "tcpipDataReceiverPort": "50000", + "tcpipNumberOfRetries": "10", + "tcpipRetryAfterMilliSecs": "1000" + }, + "logging": { + "tcpipLogAddress": "127.0.0.1", + "tcpipLogPort": "51000" + }, + "minlpsolver": { + "printInfo": "false" + }, + "IDAS": { + "relativeTolerance": "1E-5", + "integrationMode": "Normal", + "reportDataInOneStepMode": "false", + "nextTimeAfterReinitialization": "1E-7", + "printInfo": "false", + "numberOfSTNRebuildsDuringInitialization": "1000", + "SensitivitySolutionMethod": "Staggered", + "SensErrCon": "false", + "sensRelativeTolerance": "1E-5", + "sensAbsoluteTolerance": "1E-5", + "MaxOrd": "5", + "MaxNumSteps": "1000", + "InitStep": "0.0", + "MaxStep": "0.0", + "MaxErrTestFails": "10", + "MaxNonlinIters": "4", + "MaxConvFails": "10", + "NonlinConvCoef": "0.33", + "SuppressAlg": "false", + "NoInactiveRootWarn": "false", + "NonlinConvCoefIC": "0.0033", + "MaxNumStepsIC": "5", + "MaxNumJacsIC": "4", + "MaxNumItersIC": "10", + "LineSearchOffIC": "false", + "gmres": { + "kspace": "30", + "EpsLin": "0.05", + "JacTimesVecFn": "DifferenceQuotient", + "DQIncrementFactor": "1.0", + "MaxRestarts": "5", + "GSType": "MODIFIED_GS" + } + }, + "superlu": { + "factorizationMethod": "SamePattern_SameRowPerm", + "useUserSuppliedWorkSpace": "false", + "workspaceSizeMultiplier": "3.0", + "workspaceMemoryIncrement": "1.5" + }, + "superlu_mt": { + "numThreads": "0" + }, + "intel_pardiso": { + "numThreads": "0" + }, + "BONMIN": { + "IPOPT": { + "print_level": "0", + "tol": "1E-5", + "linear_solver": "mumps", + "hessianApproximation": "limited-memory", + "mu_strategy": "adaptive" + } + }, + "NLOPT": { + "printInfo": "false", + "xtol_rel": "1E-6", + "xtol_abs": "1E-6", + "ftol_rel": "1E-6", + "ftol_abs": "1E-6", + "constr_tol": "1E-6" + }, + "deal_II": { + "printInfo": "false", + "assembly": { + "info": [ + "parallelAssembly can be: Sequential or OpenMP.", + "If numThreads is 0 the default number of threads will be used (typically the number of cores in the system).", + "queueSize specifies the size of the internal queue; when this size is reached the local data are copied to the global matrices." + ], + "parallelAssembly": "OpenMP", + "numThreads": "0", + "queueSize": "32" + } + } + } +} + diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p new file mode 100644 index 0000000000000000000000000000000000000000..4bd86ab75da3df3692dc34f3ac04a5d45d7af154 GIT binary patch literal 2086 zcmcJQPiz!b9LHxVg?2%xNKsT&tiUR=7E!E7celH()3Rk+2MPlghBtq*i#c2E!iN=_~dvA7TH{r-KhyBgV{N8*% zzu#|W_U*1SkTTjzNs{Pd-9}35VyC5X6)UuL?96gQGq9<9nozgqqf5@c^TS`uUw$^O zb+fCXL)e~`+A4ltckIAMx7N!R)N##u-ws2pl5;bQmwq0+xKCTnE_e;K((p~J7I&X? zOMCUni7DmK#KGbSdc=*YwYh0xp?66j{F)ouNH1w?*>17W>w#S%Cf3Ng&%gQSqbt9? ztM%|}4KK=FTfQcC&Xanb;2t@*+%!(HtRmLQEQmv71x`&5v0fhg?#i$KfBWNy8qXR< zpFF(n?>Bot{o@yrH7ca<6(F`QQ=!`0|4@_^yx||_^L<#9P&}f0HEVD;wrDFDbbb(z$b}6|DRbj$v#1d~+A50A znpEo!!DDj%C$?ZmG%Mm67Qt4zkgaZC-t%X_=$6XtJv`njo>$g1XqgQt!o~Hig=rE{ zJaGowGNSzowwr96^~J1N3+$}ds8W{%0a;Azfi2n}G)$VtjwmbbThUcy%FO6L;csf%~mDAAUC@V}3X@8>%eafsq@^pHd^ z)l6(~gc}@Hp(O^#?oQ*6Q@m=3?~Y|x+3+VZ8#|of4kuOUiNmQjhn_+-{X35!6o%n! zj=3i1S}N>>TWRC|`&Pug^N2YL$4I{NZp?p;^XFAm6TT<-CyE<4T_2DNor++8GPRgL Xf_lsc=Lagngir4dzd^BJG#c4k8=o$t literal 0 HcmV?d00001 diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p new file mode 100644 index 0000000000000000000000000000000000000000..73014a3124bceb89ed809d1c5e94bc987df135b6 GIT binary patch literal 2088 zcmcJQPjC}e9LG15mJKKR}tZ5^9%n`))$8Ca*K*l5xz z`cwPMlM_?Q@rh%F5%h~&)%@x-F|ocSAfE3uEF@dnMz%r>%Jsmi5Ca?J?A7o7x$^bO z`&vJrYr0|X#?lXB%6(OU{3Fp50xNM21-< zu1ib9NdTdwKdFZVGs|<`Azc& zbEj7>wl_6`2Uj=6yG?3!o8Tci_Zu6qBkUD%b(7#>IiIQRx^&==ZK7H#vv={x>gIX3 z+Xky(7*w$@UFs3+ zBiOGf%F%z>A%02{#R0uloZcXIElJ&qc$(s%-tnY9WAC=b2A;K<{g8_1V*5jOC|nuB zVJ>_`#V`}L|F4?msuw<)nf-q0YPMSuIf}e48m?QEu=iyoaxHMzqKeVjb<7@S3hiQb zE#P?yS+`RWcbs!4R2+@DCBgmc<1bG4wm!>sD`Jx3m>#_)N`#-{_-Pd{#CTQUXZ&yG zm-f7o>sG{ZiWA{O624S3k-;oCIH^L54PLxGg@1|SWnFxCOsmG4KZ&`>;S_h6S5b}~ zUg>b?&xhT=^$0?t>-LU_YjCcq!iu?-4(`o2L+-6dR4Hsd{>nQM|5eUkP*IEduHc_4 mY#q3OU#iHJ9X8r@}O)!!G literal 0 HcmV?d00001 diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p new file mode 100644 index 0000000000000000000000000000000000000000..9ccd6efba706071e54568b11fa8db70fc0c1b2ce GIT binary patch literal 691 zcmZo*t}SHHh+t%3U`Q@xtSw~Hh+qb>6AKEN-5q(Bx*p~=*%rYH5-QG3tSDr0cX+8~ zW|#i7GJ*{(7+;i{R>+DFWe1ApmIi@^*^={0a|RydN-`6RiV`cifRf4i zdBr6~rO72+h3pVjTzM%F*+LF)hSow(XU3#LuJ%Iiph6xEZ$@v%)f?T zz6d6uU1=7D{GA=`g#tl^f*Rh;V4v6&3iCBO&{eU-Rc8Wux zNJ*h+64(a?8JR&qABf>_YH@O6PGS*Pp?HQMT>F7SiMB$?phBrqux*Kj(zS&$8X3&) z4*xp3F8t2@n*j`^yO$dG8CG{@0D}g`WXoXB0Q*fg1L!fiph9`5#}qOIfsW%Uy2_9o z$L3I|SW>8zlp&S@wi7CPpisH3P$j5P6=G*qp_;q>Kh~D02wSxX4q!0kWagF><)@?; zs%J=pqss>z0~+r3B0sivJkIzC7IXm%YP#Eg<34t3%lyM&!4j~bmb-)TXCBXt&*?DK~ zq)l<4&^FDY<;$YdiY=7-fu+`B{6IdULZu=o7K8$&`ojnMK(&fK6@IAa-pOvZ`t)CN zpC^0oocrGMo_X)N_e|DK4iJfDPm4q%j$7&}6xq@NhoLSzi7crUCS~izz|}d!WF>Ko z9;ju{qMw;5&G229*<8yr+bi$^oT4P-5)jFrLj5vJUyXVtdG-mmf{iIkQp{5eaUSD1 z)v$fb8E7_2E^D^@A}{E!s}DpyLoe!X6b<2gG|wr(D5lB?duAb89@>c0R5ZrYle2Z? zat=<x*Nr5c*9+S(SSJ9U?jB4?B<$f{9COIfnbcm3Yp1*;u$I8zxB=|Jto86BTK$&81~ z$7Y1Ore@+ZO45Do-dAq?M^V0|SLn5Lt%%Pm$$?|>x86AXn$$xa8I$Q;>t!~sD9cPX zTJX8C%@8TE#=)#~co5fE_`J+zxsA5(;7Xbiq;zI5o5p9*m=y;&>mb>S@(jN?74(o)V?^=)!s3Go_6AnC*%RLksRgq9Lx)OML?|%<}1lb55Kzp`9s~( zd8>ugm_@`OSu}Bv*t*5gnh6hvOHp}P(2a#LNnt>dy^c1Pol5H{HJMwW!-n>5Top6J z=_1l50fb{y?`N9FM5ghQi$z0n{UUS($Pm0Lo!Lgm=pNZ5!oy-E@d7!Z=8v8dx8$KS zz!JIc}V$k$$0tE>E~Z;_%+GmVR?Y8 z1o~{j+iO`|0B_#E+q&${kuaP-O0+KoxJH2H#p>JNdFb7#1e$jd{(a=d_f}B&$)jxx zclLB2@x#<|aBYAU(&yFDf6ksUZ&a7T|h;PaHn}+`)4;HW5DY){6Ib9egwH%M@_Tf<-sK9$ufVE!%buwo>qL8_TJf%#@m++Gj%p}(irwhkbaZ(8 z@qHul@#=9G$5(13*erPOR`Jy;@7E@V_v;+@kOZQP2?=zU>DUrrYmElq5V72=;+xf2 zw#itAFI;kH&i&8K9j_kSIqs{`;C{ioL&XDC-klS}`z?-d*Q7x|eQ13rz;|mTcu<7$ zJr%pEp*$o*$vwU@mRz!K&Up3M&GG#j3HAuyAE?+{<$ZW!cz?(-OcIEDNu&Wupovet zWhBLq0{pl}il2y(eyZY;YDhnmA&Cni5;>L_uO5$bJXRyc~Kdd$mGYUNgme)v0JRM*^ z0m^1uIrM2U-Nvs2JVRC`J`#T8Q{k%&!@}qBe4h2=Hvyg%xKLF3o@uKNefgoH;JE<5 zB}nD&{GE{Lc@@8}%5*@=)b#Y9kFQ#HeSExnyuk5d&G!63@V=zt_IVqYH^R)nngh+Fztlv6#U(;3+sWJ>NHboni^Ys9SPbR0|{9n9r B_*4J@ literal 0 HcmV?d00001 diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data new file mode 100644 index 00000000..e69de29b diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat new file mode 100644 index 0000000000000000000000000000000000000000..368934536e801acf66a8c43e3008adf5ed1bc0d2 GIT binary patch literal 106304 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 Date: Wed, 16 Mar 2022 16:44:25 -0400 Subject: [PATCH 41/57] added temperature dependence of material properties in the new formatting structure --- mpet/electrode/materials/LiC6.py | 8 ++++---- mpet/electrode/materials/LiC6_1param.py | 6 +++--- mpet/electrode/materials/LiC6_2step_ss.py | 6 +++--- mpet/electrode/materials/LiC6_LIONSIMBA.py | 3 +-- mpet/electrode/materials/LiC6_coke_ss.py | 2 +- mpet/electrode/materials/LiC6_coke_ss2.py | 2 +- mpet/electrode/materials/LiC6_ss.py | 2 +- mpet/electrode/materials/LiC6_ss2.py | 2 +- mpet/electrode/materials/LiCoO2_LIONSIMBA.py | 3 +-- mpet/electrode/materials/LiFePO4.py | 6 +++--- mpet/electrode/materials/LiMn2O4_ss.py | 2 +- mpet/electrode/materials/LiMn2O4_ss2.py | 2 +- mpet/electrode/materials/Li_ss.py | 2 +- mpet/electrode/materials/NCA_ss1.py | 4 ++-- mpet/electrode/materials/NCA_ss2.py | 4 ++-- mpet/electrode/materials/testIS_ss.py | 4 ++-- mpet/electrode/materials/testRS.py | 6 +++--- mpet/electrode/materials/testRS_ps.py | 6 +++--- mpet/electrode/materials/testRS_ss.py | 4 ++-- 19 files changed, 36 insertions(+), 38 deletions(-) diff --git a/mpet/electrode/materials/LiC6.py b/mpet/electrode/materials/LiC6.py index 67744fd2..9933069d 100644 --- a/mpet/electrode/materials/LiC6.py +++ b/mpet/electrode/materials/LiC6.py @@ -1,17 +1,17 @@ import numpy as np -def LiC6(self, y, ybar, muR_ref, ISfuncs=(None, None)): +def LiC6(self, y, ybar, T, muR_ref, ISfuncs=(None, None)): """ Ferguson and Bazant 2014 """ muRtheta = -self.eokT*0.12 muR1homog, muR2homog = self.graphite_2param_homog( - y, self.get_trode_param("Omega_a"), self.get_trode_param("Omega_b"), + y, T, self.get_trode_param("Omega_a"), self.get_trode_param("Omega_b"), self.get_trode_param("Omega_c"), self.get_trode_param("EvdW"), ISfuncs) muR1nonHomog, muR2nonHomog = self.general_non_homog(y, ybar) muR1 = muR1homog + muR1nonHomog muR2 = muR2homog + muR2nonHomog - actR1 = np.exp(muR1/self.T) - actR2 = np.exp(muR2/self.T) + actR1 = np.exp(muR1/T) + actR2 = np.exp(muR2/T) muR1 += muRtheta + muR_ref muR2 += muRtheta + muR_ref return (muR1, muR2), (actR1, actR2) diff --git a/mpet/electrode/materials/LiC6_1param.py b/mpet/electrode/materials/LiC6_1param.py index e9aad2d6..83cdfa00 100644 --- a/mpet/electrode/materials/LiC6_1param.py +++ b/mpet/electrode/materials/LiC6_1param.py @@ -1,12 +1,12 @@ import numpy as np -def LiC6_1param(self, y, ybar, muR_ref, ISfuncs=None): +def LiC6_1param(self, y, ybar, T, muR_ref, ISfuncs=None): muRtheta = -self.eokT*0.12 muRhomog = self.graphite_1param_homog_3( - y, self.get_trode_param("Omega_a"), self.get_trode_param("Omega_b"), ISfuncs) + y, T, self.get_trode_param("Omega_a"), self.get_trode_param("Omega_b"), ISfuncs) muRnonHomog = self.general_non_homog(y, ybar) muR = muRhomog + muRnonHomog - actR = np.exp(muR/self.T) + actR = np.exp(muR/T) muR += muRtheta + muR_ref return muR, actR diff --git a/mpet/electrode/materials/LiC6_2step_ss.py b/mpet/electrode/materials/LiC6_2step_ss.py index 1e11ac8e..987d5d48 100644 --- a/mpet/electrode/materials/LiC6_2step_ss.py +++ b/mpet/electrode/materials/LiC6_2step_ss.py @@ -2,7 +2,7 @@ from mpet.props_am import step_up, step_down -def LiC6_2step_ss(self, y, ybar, muR_ref, ISfuncs=None): +def LiC6_2step_ss(self, y, ybar, T, muR_ref, ISfuncs=None): """ Fit function to the OCV predicted by the phase separating 2-variable graphite model (LiC6 function in this class). @@ -14,8 +14,8 @@ def LiC6_2step_ss(self, y, ybar, muR_ref, ISfuncs=None): rEdge = 1 - edgeLen width = 1e-4 vshift = 1e-2 - lSide = -((np.log(y/(1-y)) - np.log(lEdge/(1-lEdge)) - vshift)*step_down(y, lEdge, width)) - rSide = -((np.log(y/(1-y)) - np.log(rEdge/(1-rEdge)) + vshift)*step_up(y, rEdge, width)) + lSide = -((np.log(y/(1-y))*T - np.log(lEdge/(1-lEdge)) - vshift)*step_down(y, lEdge, width)) + rSide = -((np.log(y/(1-y))*T - np.log(rEdge/(1-rEdge)) + vshift)*step_up(y, rEdge, width)) OCV = ( Vstd + Vstep*(step_down(y, 0.5, 0.013) - 1) diff --git a/mpet/electrode/materials/LiC6_LIONSIMBA.py b/mpet/electrode/materials/LiC6_LIONSIMBA.py index 0c366951..920903e1 100644 --- a/mpet/electrode/materials/LiC6_LIONSIMBA.py +++ b/mpet/electrode/materials/LiC6_LIONSIMBA.py @@ -1,9 +1,8 @@ import numpy as np -def LiC6_LIONSIMBA(self, y, ybar, muR_ref, ISfuncs=None): +def LiC6_LIONSIMBA(self, y, ybar, T, muR_ref, ISfuncs=None): """ Torchio et al, 2016. """ - T = self.T Tref = 298 r1 = 0.7222 r2 = 0.1387 diff --git a/mpet/electrode/materials/LiC6_coke_ss.py b/mpet/electrode/materials/LiC6_coke_ss.py index 75a63344..ad1e3184 100644 --- a/mpet/electrode/materials/LiC6_coke_ss.py +++ b/mpet/electrode/materials/LiC6_coke_ss.py @@ -1,7 +1,7 @@ import numpy as np -def LiC6_coke_ss(self, y, ybar, muR_ref, ISfuncs=None): +def LiC6_coke_ss(self, y, ybar, T, muR_ref, ISfuncs=None): """ Doyle, Newman, 1996 """ OCV = (-0.16 + 1.32*np.exp(-3.0*y) + 10.*np.exp(-2000.*y)) muR = self.get_muR_from_OCV(OCV, muR_ref) diff --git a/mpet/electrode/materials/LiC6_coke_ss2.py b/mpet/electrode/materials/LiC6_coke_ss2.py index 4f44a822..1ddc2a9b 100644 --- a/mpet/electrode/materials/LiC6_coke_ss2.py +++ b/mpet/electrode/materials/LiC6_coke_ss2.py @@ -1,7 +1,7 @@ import numpy as np -def LiC6_coke_ss2(self, y, ybar, muR_ref, ISfuncs=None): +def LiC6_coke_ss2(self, y, ybar, T, muR_ref, ISfuncs=None): """ Fuller, Doyle, Newman, 1994 """ c1 = -0.132056 c2 = 1.40854 diff --git a/mpet/electrode/materials/LiC6_ss.py b/mpet/electrode/materials/LiC6_ss.py index fa715907..e962ed99 100644 --- a/mpet/electrode/materials/LiC6_ss.py +++ b/mpet/electrode/materials/LiC6_ss.py @@ -1,7 +1,7 @@ import numpy as np -def LiC6_ss(self, y, ybar, muR_ref, ISfuncs=None): +def LiC6_ss(self, y, ybar, T, muR_ref, ISfuncs=None): """ Safari, Delacourt 2011 """ OCV = (0.6379 + 0.5416*np.exp(-305.5309*y) + 0.044*np.tanh(-(y - 0.1958)/0.1088) diff --git a/mpet/electrode/materials/LiC6_ss2.py b/mpet/electrode/materials/LiC6_ss2.py index a802346d..7a9d7bfe 100644 --- a/mpet/electrode/materials/LiC6_ss2.py +++ b/mpet/electrode/materials/LiC6_ss2.py @@ -1,7 +1,7 @@ from mpet.props_am import step_down -def LiC6_ss2(self, y, ybar, muR_ref, ISfuncs=None): +def LiC6_ss2(self, y, ybar, T, muR_ref, ISfuncs=None): """ Bernardi and Go 2011 """ p1, p2, p3, p4 = (0.085, 0.120, 0.210, 3.5) sfac = 0.3 diff --git a/mpet/electrode/materials/LiCoO2_LIONSIMBA.py b/mpet/electrode/materials/LiCoO2_LIONSIMBA.py index 15a4294d..59e4b93b 100644 --- a/mpet/electrode/materials/LiCoO2_LIONSIMBA.py +++ b/mpet/electrode/materials/LiCoO2_LIONSIMBA.py @@ -1,6 +1,5 @@ -def LiCoO2_LIONSIMBA(self, y, ybar, muR_ref, ISfuncs=None): +def LiCoO2_LIONSIMBA(self, y, ybar, T, muR_ref, ISfuncs=None): """ Torchio et al, 2016. """ - T = self.T Tref = 298 r1 = 4.656 r2 = 88.669 diff --git a/mpet/electrode/materials/LiFePO4.py b/mpet/electrode/materials/LiFePO4.py index e4ded26d..8c13f8ac 100644 --- a/mpet/electrode/materials/LiFePO4.py +++ b/mpet/electrode/materials/LiFePO4.py @@ -1,12 +1,12 @@ import numpy as np -def LiFePO4(self, y, ybar, muR_ref, ISfuncs=None): +def LiFePO4(self, y, ybar, T, muR_ref, ISfuncs=None): """ Bai, Cogswell, Bazant 2011 """ muRtheta = -self.eokT*3.422 - muRhomog = self.reg_sln(y, self.get_trode_param("Omega_a"), ISfuncs) + muRhomog = self.reg_sln(y, T, self.get_trode_param("Omega_a"), ISfuncs) muRnonHomog = self.general_non_homog(y, ybar) muR = muRhomog + muRnonHomog - actR = np.exp(muR/self.T) + actR = np.exp(muR/T) muR += muRtheta + muR_ref return muR, actR diff --git a/mpet/electrode/materials/LiMn2O4_ss.py b/mpet/electrode/materials/LiMn2O4_ss.py index c38893cd..e69a22f7 100644 --- a/mpet/electrode/materials/LiMn2O4_ss.py +++ b/mpet/electrode/materials/LiMn2O4_ss.py @@ -1,7 +1,7 @@ import numpy as np -def LiMn2O4_ss(self, y, ybar, muR_ref, ISfuncs=None): +def LiMn2O4_ss(self, y, ybar, T, muR_ref, ISfuncs=None): """ Doyle, Newman, 1996 """ # OCV in V vs Li/Li+ OCV = (4.19829 + 0.0565661*np.tanh(-14.5546*y + 8.60942) diff --git a/mpet/electrode/materials/LiMn2O4_ss2.py b/mpet/electrode/materials/LiMn2O4_ss2.py index fc598731..e7a0ab7b 100644 --- a/mpet/electrode/materials/LiMn2O4_ss2.py +++ b/mpet/electrode/materials/LiMn2O4_ss2.py @@ -1,7 +1,7 @@ import numpy as np -def LiMn2O4_ss2(self, y, ybar, muR_ref, ISfuncs=None): +def LiMn2O4_ss2(self, y, ybar, T, muR_ref, ISfuncs=None): """ Fuller, Doyle, Newman, 1994 """ # OCV in V vs Li/Li+ OCV = (4.06279 + 0.0677504*np.tanh(-21.8502*y + 12.8268) diff --git a/mpet/electrode/materials/Li_ss.py b/mpet/electrode/materials/Li_ss.py index 25a3464b..3d90b07e 100644 --- a/mpet/electrode/materials/Li_ss.py +++ b/mpet/electrode/materials/Li_ss.py @@ -1,4 +1,4 @@ -def Li_ss(self, y, ybar, muR_ref, ISfuncs=None): +def Li_ss(self, y, ybar, T, muR_ref, ISfuncs=None): muR = 0.*y + muR_ref actR = 0.*y + 1. return muR, actR diff --git a/mpet/electrode/materials/NCA_ss1.py b/mpet/electrode/materials/NCA_ss1.py index e7260aaa..26a1e48d 100644 --- a/mpet/electrode/materials/NCA_ss1.py +++ b/mpet/electrode/materials/NCA_ss1.py @@ -1,13 +1,13 @@ import numpy as np -def NCA_ss1(self, y, ybar, muR_ref, ISfuncs=None): +def NCA_ss1(self, y, ybar, T, muR_ref, ISfuncs=None): """ This function was obtained from Dan Cogswell's fit of Samsung data. """ OCV = (3.86 + 1.67*y - 9.52*y**2 + 15.04*y**3 - 7.95*y**4 - - 0.06*np.log(y/(1-y))) + - 0.06*T*np.log(y/(1-y))) muR = self.get_muR_from_OCV(OCV, muR_ref) actR = None return muR, actR diff --git a/mpet/electrode/materials/NCA_ss2.py b/mpet/electrode/materials/NCA_ss2.py index f63db023..3cb4ce68 100644 --- a/mpet/electrode/materials/NCA_ss2.py +++ b/mpet/electrode/materials/NCA_ss2.py @@ -1,7 +1,7 @@ import numpy as np -def NCA_ss2(self, y, ybar, muR_ref, ISfuncs=None): +def NCA_ss2(self, y, ybar, T, muR_ref, ISfuncs=None): """ Li_q Ni(0.8)Co(0.15)Al(0.05)O2 as a function of y. Here, y actually represents a practical @@ -10,7 +10,7 @@ def NCA_ss2(self, y, ybar, muR_ref, ISfuncs=None): This function was obtained from a fit by Raymond B. Smith of Samsung data of a LiC6-NCA cell discharged at C/100. """ - OCV = (-self.kToe*np.log(y/(1-y)) + OCV = (-self.kToe*np.log(y/(1-y))*T + 4.12178 - 0.2338*y - 1.24566*y**2 + 1.16769*y**3 - 0.20745*y**4) muR = self.get_muR_from_OCV(OCV, muR_ref) diff --git a/mpet/electrode/materials/testIS_ss.py b/mpet/electrode/materials/testIS_ss.py index 30a9d85e..77eceb08 100644 --- a/mpet/electrode/materials/testIS_ss.py +++ b/mpet/electrode/materials/testIS_ss.py @@ -1,9 +1,9 @@ import numpy as np -def testIS_ss(self, y, ybar, muR_ref, ISfuncs=None): +def testIS_ss(self, y, ybar, T, muR_ref, ISfuncs=None): """Ideal solution material for testing.""" - OCV = -self.kToe*np.log(y/(1-y)) + OCV = -self.kToe*np.log(y/(1-y))*T muR = self.get_muR_from_OCV(OCV, muR_ref) actR = None return muR, actR diff --git a/mpet/electrode/materials/testRS.py b/mpet/electrode/materials/testRS.py index 5e20b0e6..89fe7dcf 100644 --- a/mpet/electrode/materials/testRS.py +++ b/mpet/electrode/materials/testRS.py @@ -1,9 +1,9 @@ import numpy as np -def testRS(self, y, ybar, muR_ref, ISfuncs=None): +def testRS(self, y, ybar, T, muR_ref, ISfuncs=None): muRtheta = 0. - muR = self.reg_sln(y, self.get_trode_param("Omega_a"), ISfuncs) - actR = np.exp(muR/self.T) + muR = self.reg_sln(y, T, self.get_trode_param("Omega_a"), ISfuncs) + actR = np.exp(muR/T) muR += muRtheta + muR_ref return muR, actR diff --git a/mpet/electrode/materials/testRS_ps.py b/mpet/electrode/materials/testRS_ps.py index d638fb99..a3d3c7d4 100644 --- a/mpet/electrode/materials/testRS_ps.py +++ b/mpet/electrode/materials/testRS_ps.py @@ -1,11 +1,11 @@ import numpy as np -def testRS_ps(self, y, ybar, muR_ref, ISfuncs=None): +def testRS_ps(self, y, ybar, T, muR_ref, ISfuncs=None): muRtheta = -self.eokT*2. - muRhomog = self.reg_sln(y, self.get_trode_param("Omega_a"), ISfuncs) + muRhomog = self.reg_sln(y, T, self.get_trode_param("Omega_a"), ISfuncs) muRnonHomog = self.general_non_homog(y, ybar) muR = muRhomog + muRnonHomog - actR = np.exp(muR/self.T) + actR = np.exp(muR/T) muR += muRtheta + muR_ref return muR, actR diff --git a/mpet/electrode/materials/testRS_ss.py b/mpet/electrode/materials/testRS_ss.py index 1b250198..a8d4b40e 100644 --- a/mpet/electrode/materials/testRS_ss.py +++ b/mpet/electrode/materials/testRS_ss.py @@ -1,7 +1,7 @@ from mpet.props_am import step_down, step_up -def testRS_ss(self, y, ybar, muR_ref, ISfuncs=None): +def testRS_ss(self, y, ybar, T, muR_ref, ISfuncs=None): """ Regular solution material which phase separates at binodal points, for modeling as a solid solution. For testing. @@ -9,7 +9,7 @@ def testRS_ss(self, y, ybar, muR_ref, ISfuncs=None): # Based Omg = 3*k*T_ref yL = 0.07072018 yR = 0.92927982 - OCV_rs = -self.kToe*self.reg_sln(y, self.get_trode_param("Omega_a"), ISfuncs) + OCV_rs = -self.kToe*self.reg_sln(y, T, self.get_trode_param("Omega_a"), ISfuncs) width = 0.005 OCV = OCV_rs*step_down(y, yL, width) + OCV_rs*step_up(y, yR, width) + 2 muR = self.get_muR_from_OCV(OCV, muR_ref) From c42a7a6c5dcd92a12d7e5ff0466805bdd55c1b7c Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Tue, 28 Jun 2022 13:31:10 -0400 Subject: [PATCH 42/57] removed T0 and reverted back to T --- configs/params_system.cfg | 2 +- configs/params_system_Doyle96-cell1.cfg | 2 +- configs/params_system_Doyle96-cell2.cfg | 2 +- configs/params_system_Doyle96-cell3.cfg | 2 +- configs/params_system_Fuller94.cfg | 2 +- configs/params_system_LIONSIMBA.cfg | 2 +- mpet/config/configuration.py | 2 +- mpet/config/derived_values.py | 4 ++-- mpet/config/schemas.py | 2 +- mpet/mod_cell.py | 4 ++-- mpet/sim.py | 12 ++++++------ .../benchmark_Doyle96-cell1/params_system.cfg | 2 +- .../benchmark_Doyle96-cell2/params_system.cfg | 2 +- .../ref_outputs/benchmark_Fuller94/params_system.cfg | 2 +- .../benchmark_LIONSIMBA/params_system.cfg | 2 +- .../params_system.cfg | 2 +- .../params_system.cfg | 2 +- tests/ref_outputs/test001/params_system.cfg | 2 +- tests/ref_outputs/test002/params_system.cfg | 2 +- tests/ref_outputs/test003/params_system.cfg | 2 +- tests/ref_outputs/test004/params_system.cfg | 2 +- tests/ref_outputs/test005/params_system.cfg | 2 +- tests/ref_outputs/test006/params_system.cfg | 2 +- tests/ref_outputs/test007/params_system.cfg | 2 +- tests/ref_outputs/test008/params_system.cfg | 2 +- tests/ref_outputs/test009/params_system.cfg | 2 +- tests/ref_outputs/test010/params_system.cfg | 2 +- tests/ref_outputs/test011/params_system.cfg | 2 +- tests/ref_outputs/test012/params_system.cfg | 2 +- tests/ref_outputs/test013/params_system.cfg | 2 +- tests/ref_outputs/test014/params_system.cfg | 2 +- tests/ref_outputs/test015/params_system.cfg | 2 +- tests/ref_outputs/test016/params_system.cfg | 2 +- tests/ref_outputs/test017/params_system.cfg | 2 +- tests/ref_outputs/test018/params_system.cfg | 2 +- tests/ref_outputs/test019/params_system.cfg | 2 +- tests/ref_outputs/test020/params_system.cfg | 2 +- tests/ref_outputs/test021/params_system.cfg | 2 +- tests/ref_outputs/test022/params_system.cfg | 2 +- tests/ref_outputs/test023/params_system.cfg | 2 +- tests/ref_outputs/test024/params_system.cfg | 2 +- 41 files changed, 48 insertions(+), 48 deletions(-) diff --git a/configs/params_system.cfg b/configs/params_system.cfg index 54e03dba..d70336b3 100644 --- a/configs/params_system.cfg +++ b/configs/params_system.cfg @@ -50,7 +50,7 @@ relTol = 1e-6 # Absolute Tolerance absTol = 1e-6 # Initial Temperature throughout electrode, K -T0 = 298 +T = 298 # Nonisothermal: true for heat generation throughout electrode, false # for no heat generation nonisothermal = true diff --git a/configs/params_system_Doyle96-cell1.cfg b/configs/params_system_Doyle96-cell1.cfg index 51fd0139..afa9ce7a 100644 --- a/configs/params_system_Doyle96-cell1.cfg +++ b/configs/params_system_Doyle96-cell1.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 200 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 0 Rser = 0 diff --git a/configs/params_system_Doyle96-cell2.cfg b/configs/params_system_Doyle96-cell2.cfg index ca0897aa..be3ca97c 100644 --- a/configs/params_system_Doyle96-cell2.cfg +++ b/configs/params_system_Doyle96-cell2.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 200 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 0 Rser = 0 diff --git a/configs/params_system_Doyle96-cell3.cfg b/configs/params_system_Doyle96-cell3.cfg index 14927aff..cb0bb98e 100644 --- a/configs/params_system_Doyle96-cell3.cfg +++ b/configs/params_system_Doyle96-cell3.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 200 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 0 Rser = 0 diff --git a/configs/params_system_Fuller94.cfg b/configs/params_system_Fuller94.cfg index 9d0d738d..a9295151 100644 --- a/configs/params_system_Fuller94.cfg +++ b/configs/params_system_Fuller94.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 200 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 0 Rser = 0. diff --git a/configs/params_system_LIONSIMBA.cfg b/configs/params_system_LIONSIMBA.cfg index f2348041..baa598b5 100644 --- a/configs/params_system_LIONSIMBA.cfg +++ b/configs/params_system_LIONSIMBA.cfg @@ -21,7 +21,7 @@ tsteps = 200 relTol = 1e-6 absTol = 1e-6 # Temperature, K -T0 = 298 +T = 298 # Random seed. Set to true to give a random seed in the simulation randomSeed = false # Value of the random seed, must be an integer diff --git a/mpet/config/configuration.py b/mpet/config/configuration.py index 8db4454e..b5cebed2 100644 --- a/mpet/config/configuration.py +++ b/mpet/config/configuration.py @@ -478,7 +478,7 @@ def _scale_system_parameters(self, theoretical_1C_current): from :meth:`_process_config`. """ # non-dimensional scalings - self['T0'] = self['T0'] / constants.T_ref + self['T'] = self['T'] / constants.T_ref self['Rser'] = self['Rser'] / self['Rser_ref'] self['h_h'] = self['h_h'] * self['L_ref'] / self['k_h_ref'] self['sigma_l'] = self['sigma_l'] / self['sigma_s_ref'] diff --git a/mpet/config/derived_values.py b/mpet/config/derived_values.py index 767417cd..b111922b 100644 --- a/mpet/config/derived_values.py +++ b/mpet/config/derived_values.py @@ -244,9 +244,9 @@ def muR_ref(self, trode): solidType = self.config[trode, 'type'] if solidType in constants.two_var_types: - muR_ref = -muRfunc((cs0, cs0), (cs0bar, cs0bar), self.config['T0'], 0.)[0][0] + muR_ref = -muRfunc((cs0, cs0), (cs0bar, cs0bar), self.config['T'], 0.)[0][0] elif solidType in constants.one_var_types: - muR_ref = -muRfunc(cs0, cs0bar, self.config['T0'], 0.)[0] + muR_ref = -muRfunc(cs0, cs0bar, self.config['T'], 0.)[0] else: raise ValueError(f'Unknown solid type: {solidType}') return muR_ref diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py index 4a529475..e7b9f678 100644 --- a/mpet/config/schemas.py +++ b/mpet/config/schemas.py @@ -68,7 +68,7 @@ def tobool(value): 'tsteps': And(Use(int), lambda x: x > 0), 'relTol': And(Use(float), lambda x: x > 0), 'absTol': And(Use(float), lambda x: x > 0), - 'T0': Use(float), + 'T': Use(float), Optional('nonisothermal', default=False): Use(tobool), 'randomSeed': Use(tobool), Optional('seed'): And(Use(int), lambda x: x >= 0), diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index 51167324..9a6b9d44 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -388,8 +388,8 @@ def DeclareEquations(self): eqC.Residual = ctmp[0] - ctmp[1] eqP.Residual = phitmp[0] - phitmp[1] # boundary equation for temperature variables. per volume - eqTL.Residual = Ttmp[0] - config["T0"] - eqTR.Residual = Ttmp[-1] - config["T0"] + eqTL.Residual = Ttmp[0] - config["T"] + eqTR.Residual = Ttmp[-1] - config["T"] dvgNm = np.diff(Nm_edges)/disc["dxvec"] dvgi = np.diff(i_edges)/disc["dxvec"] diff --git a/mpet/sim.py b/mpet/sim.py index 01a4a9c2..9fc31eed 100644 --- a/mpet/sim.py +++ b/mpet/sim.py @@ -71,7 +71,7 @@ def SetUpVariables(self): # Guess initial volumetric reaction rates self.m.R_Vp[tr].SetInitialGuess(i, 0.0) # set initial temperature condition - self.m.T_lyte[tr].SetInitialCondition(i, config["T0"]) + self.m.T_lyte[tr].SetInitialCondition(i, config["T"]) # Guess initial value for the potential of the # electrodes if tr == "a": # anode @@ -118,27 +118,27 @@ def SetUpVariables(self): if not self.m.SVsim: self.m.c_lyteGP_L.SetInitialGuess(config["c0"]) self.m.phi_lyteGP_L.SetInitialGuess(0) - self.m.T_lyteGP_L.SetInitialGuess(config["T0"]) - self.m.T_lyteGP_R.SetInitialGuess(config["T0"]) + self.m.T_lyteGP_L.SetInitialGuess(config["T"]) + self.m.T_lyteGP_R.SetInitialGuess(config["T"]) # Separator electrolyte initialization if config["have_separator"]: for i in range(Nvol["s"]): self.m.c_lyte["s"].SetInitialCondition(i, config['c0']) - self.m.T_lyte["s"].SetInitialCondition(i, config['T0']) + self.m.T_lyte["s"].SetInitialCondition(i, config['T']) self.m.phi_lyte["s"].SetInitialGuess(i, 0) # Anode and cathode electrolyte initialization for tr in config["trodes"]: for i in range(Nvol[tr]): self.m.c_lyte[tr].SetInitialCondition(i, config['c0']) - self.m.T_lyte[tr].SetInitialCondition(i, config['T0']) + self.m.T_lyte[tr].SetInitialCondition(i, config['T']) self.m.phi_lyte[tr].SetInitialGuess(i, 0) # Set electrolyte concentration in each particle for j in range(Npart[tr]): self.m.particles[tr][i,j].c_lyte.SetInitialGuess(config["c0"]) - self.m.particles[tr][i,j].T_lyte.SetInitialGuess(config["T0"]) + self.m.particles[tr][i,j].T_lyte.SetInitialGuess(config["T"]) else: dPrev = self.dataPrev diff --git a/tests/ref_outputs/benchmark_Doyle96-cell1/params_system.cfg b/tests/ref_outputs/benchmark_Doyle96-cell1/params_system.cfg index 6a01c11b..4a892c46 100644 --- a/tests/ref_outputs/benchmark_Doyle96-cell1/params_system.cfg +++ b/tests/ref_outputs/benchmark_Doyle96-cell1/params_system.cfg @@ -13,7 +13,7 @@ tend = 1.2e3 tsteps = 25 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 0 Rser = 0 diff --git a/tests/ref_outputs/benchmark_Doyle96-cell2/params_system.cfg b/tests/ref_outputs/benchmark_Doyle96-cell2/params_system.cfg index d8aaa788..0341e490 100644 --- a/tests/ref_outputs/benchmark_Doyle96-cell2/params_system.cfg +++ b/tests/ref_outputs/benchmark_Doyle96-cell2/params_system.cfg @@ -13,7 +13,7 @@ tend = 1.2e3 tsteps = 25 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 0 Rser = 0 diff --git a/tests/ref_outputs/benchmark_Fuller94/params_system.cfg b/tests/ref_outputs/benchmark_Fuller94/params_system.cfg index 199c08d8..cd7acfa5 100644 --- a/tests/ref_outputs/benchmark_Fuller94/params_system.cfg +++ b/tests/ref_outputs/benchmark_Fuller94/params_system.cfg @@ -20,7 +20,7 @@ tend = 1.2e3 tsteps = 25 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 0 Rser = 0. diff --git a/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg index 729a9767..ae142ac6 100644 --- a/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg +++ b/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg @@ -14,7 +14,7 @@ tend = 1.2e3 tsteps = 25 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = false seed = 0 Rser = 0. diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg index 2f50b6ad..5663f59a 100644 --- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg +++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg @@ -14,7 +14,7 @@ tend = 1.2e3 tsteps = 25 relTol = 1e-6 absTol = 1e-6 -T0 = 323 +T = 323 randomSeed = false seed = 0 Rser = 0. diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg index 34d0c5bc..9fa7ed5b 100644 --- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg +++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg @@ -14,7 +14,7 @@ tend = 1.2e3 tsteps = 25 relTol = 1e-6 absTol = 1e-6 -T0 = 323 +T = 323 randomSeed = false seed = 0 Rser = 0. diff --git a/tests/ref_outputs/test001/params_system.cfg b/tests/ref_outputs/test001/params_system.cfg index 952cfab0..526fb7b1 100644 --- a/tests/ref_outputs/test001/params_system.cfg +++ b/tests/ref_outputs/test001/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test002/params_system.cfg b/tests/ref_outputs/test002/params_system.cfg index 952cfab0..526fb7b1 100644 --- a/tests/ref_outputs/test002/params_system.cfg +++ b/tests/ref_outputs/test002/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test003/params_system.cfg b/tests/ref_outputs/test003/params_system.cfg index 952cfab0..526fb7b1 100644 --- a/tests/ref_outputs/test003/params_system.cfg +++ b/tests/ref_outputs/test003/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test004/params_system.cfg b/tests/ref_outputs/test004/params_system.cfg index 952cfab0..526fb7b1 100644 --- a/tests/ref_outputs/test004/params_system.cfg +++ b/tests/ref_outputs/test004/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test005/params_system.cfg b/tests/ref_outputs/test005/params_system.cfg index 841aa882..adfcf40e 100644 --- a/tests/ref_outputs/test005/params_system.cfg +++ b/tests/ref_outputs/test005/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test006/params_system.cfg b/tests/ref_outputs/test006/params_system.cfg index 4959ca13..fff90dce 100644 --- a/tests/ref_outputs/test006/params_system.cfg +++ b/tests/ref_outputs/test006/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test007/params_system.cfg b/tests/ref_outputs/test007/params_system.cfg index b99b0c53..d7e4e4a7 100644 --- a/tests/ref_outputs/test007/params_system.cfg +++ b/tests/ref_outputs/test007/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test008/params_system.cfg b/tests/ref_outputs/test008/params_system.cfg index 2174e9c8..f7b9953b 100644 --- a/tests/ref_outputs/test008/params_system.cfg +++ b/tests/ref_outputs/test008/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test009/params_system.cfg b/tests/ref_outputs/test009/params_system.cfg index 952cfab0..526fb7b1 100644 --- a/tests/ref_outputs/test009/params_system.cfg +++ b/tests/ref_outputs/test009/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test010/params_system.cfg b/tests/ref_outputs/test010/params_system.cfg index 93c7430a..379ffc11 100644 --- a/tests/ref_outputs/test010/params_system.cfg +++ b/tests/ref_outputs/test010/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-7 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test011/params_system.cfg b/tests/ref_outputs/test011/params_system.cfg index 02a7be97..15684d81 100644 --- a/tests/ref_outputs/test011/params_system.cfg +++ b/tests/ref_outputs/test011/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-7 absTol = 1e-7 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test012/params_system.cfg b/tests/ref_outputs/test012/params_system.cfg index 0a6f92f3..6e31902b 100644 --- a/tests/ref_outputs/test012/params_system.cfg +++ b/tests/ref_outputs/test012/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 25 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test013/params_system.cfg b/tests/ref_outputs/test013/params_system.cfg index a031e3f5..32d77dcd 100644 --- a/tests/ref_outputs/test013/params_system.cfg +++ b/tests/ref_outputs/test013/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 25 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test014/params_system.cfg b/tests/ref_outputs/test014/params_system.cfg index 5d9e24e5..d000fbbb 100644 --- a/tests/ref_outputs/test014/params_system.cfg +++ b/tests/ref_outputs/test014/params_system.cfg @@ -12,7 +12,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 1e-3 diff --git a/tests/ref_outputs/test015/params_system.cfg b/tests/ref_outputs/test015/params_system.cfg index 45c2f8d2..97171e8d 100644 --- a/tests/ref_outputs/test015/params_system.cfg +++ b/tests/ref_outputs/test015/params_system.cfg @@ -12,7 +12,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-5 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test016/params_system.cfg b/tests/ref_outputs/test016/params_system.cfg index 23511592..6c4d00b0 100644 --- a/tests/ref_outputs/test016/params_system.cfg +++ b/tests/ref_outputs/test016/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test017/params_system.cfg b/tests/ref_outputs/test017/params_system.cfg index 22ddb1ec..20b382d1 100644 --- a/tests/ref_outputs/test017/params_system.cfg +++ b/tests/ref_outputs/test017/params_system.cfg @@ -15,7 +15,7 @@ tend = 3e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test018/params_system.cfg b/tests/ref_outputs/test018/params_system.cfg index 7c54f9a9..36811c58 100644 --- a/tests/ref_outputs/test018/params_system.cfg +++ b/tests/ref_outputs/test018/params_system.cfg @@ -12,7 +12,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test019/params_system.cfg b/tests/ref_outputs/test019/params_system.cfg index 7befd117..1a5a6d8a 100644 --- a/tests/ref_outputs/test019/params_system.cfg +++ b/tests/ref_outputs/test019/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test020/params_system.cfg b/tests/ref_outputs/test020/params_system.cfg index cea407a1..8c7b8307 100644 --- a/tests/ref_outputs/test020/params_system.cfg +++ b/tests/ref_outputs/test020/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true dataReporter = hdf5 seed = 10 diff --git a/tests/ref_outputs/test021/params_system.cfg b/tests/ref_outputs/test021/params_system.cfg index 6626de71..9f066869 100644 --- a/tests/ref_outputs/test021/params_system.cfg +++ b/tests/ref_outputs/test021/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true dataReporter = hdf5Fast seed = 10 diff --git a/tests/ref_outputs/test022/params_system.cfg b/tests/ref_outputs/test022/params_system.cfg index cd17644c..c3b5c9ad 100644 --- a/tests/ref_outputs/test022/params_system.cfg +++ b/tests/ref_outputs/test022/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test023/params_system.cfg b/tests/ref_outputs/test023/params_system.cfg index a031e3f5..32d77dcd 100644 --- a/tests/ref_outputs/test023/params_system.cfg +++ b/tests/ref_outputs/test023/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 25 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/test024/params_system.cfg b/tests/ref_outputs/test024/params_system.cfg index f0124668..461d0aae 100644 --- a/tests/ref_outputs/test024/params_system.cfg +++ b/tests/ref_outputs/test024/params_system.cfg @@ -16,7 +16,7 @@ tend = 100 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. From c8b613dbe85b89aaf3c153d2cbc85f863de9fdac Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Tue, 28 Jun 2022 13:32:00 -0400 Subject: [PATCH 43/57] removed props_elyte from commit files --- mpet/mod_cell.py | 5 +- mpet/props_elyte.py | 293 -------------------------------------------- 2 files changed, 3 insertions(+), 295 deletions(-) delete mode 100644 mpet/props_elyte.py diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index 9a6b9d44..f9b79d45 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -618,8 +618,9 @@ def get_ohmic_heat(c_lyte, T_lyte, phi_lyte, phi_bulk, disc, config, Nvol): if config["elyteModelType"] == "dilute": sigma_l = eps_o_tau[1:-1] * config["sigma_l"] elif config["elyteModelType"] == "SM": - elyte_function = utils.import_function(config["SMset_filename"], config["SMset"], - mpet_module="mpet.props_elyte") + SMset = config["SMset"] + elyte_function = utils.import_function(config["SMset_filename"], SMset, + mpet_module=f"mpet.electrolyte.{SMset}") sigma_fs, thermFac, tp0 = elyte_function()[1:-1] # Get diffusivity and conductivity at cell edges using weighted harmonic mean sigma_l = eps_o_tau[1:-1]*sigma_fs(c_mid, T_mid) diff --git a/mpet/props_elyte.py b/mpet/props_elyte.py deleted file mode 100644 index 4b178e51..00000000 --- a/mpet/props_elyte.py +++ /dev/null @@ -1,293 +0,0 @@ -r""" -This module provides functions defining properties of the ion-conducting -phase -- the electrolyte Manage functions for the parameters involved in -Stefan-Maxwell based concentrated electrolyte transport theory for -binary electrolytes. - -Each electrolyte set must output functions for the following as a -function of c (electrolyte concentration, M) - - Dchem [m^2/s] = the prefactor for grad(c) in species conservation - - sigma [S/m] = the conductivity - - (1 + dln(f_\pm)/dln(c)) = the "thermodynamic factor" - - t_+^0 = the transference number of the cations -T in these equations is nondimensionalized wrt 298K -""" - -import numpy as np -from mpet.config import constants - - -def LiClO4_PC(): - """ Set of parameters from Fuller, Doyle, Newman 1994, with - conductivity directly from dualfoil5.2.f - """ - def tp0(c, T): - return 0.2 - - def D(c, T): - return 2.58e-10 # m^2/s - - def therm_fac(c, T): - # therm_fac adjusted to account for missing a factor of 2 in Eq A-2 - return 0.5 - - def sigma(cin, T): - c = cin * 1000 # mol/m^3 - p_max = 0.542 - p_u = 0.6616 - a = 0.855 - b = -0.08 - rho = 1.2041e3 - out = 0.0001 + c**a * ( - p_max*(1./(rho*p_u))**a - * np.exp(b*(c/rho - p_u)**2 - - (a/p_u)*(c/rho - p_u))) # S/m - return out - Dref = D(constants.c_ref/1000, 1) - - def D_ndim(c, T): - return D(c, T) / Dref - - def sigma_ndim(c, T): - return sigma(c, T) * ( - constants.k*constants.T_ref/(constants.e**2*Dref*constants.N_A*(constants.c_ref))) - - return D_ndim, sigma_ndim, therm_fac, tp0, Dref - - -def Doyle96_EC_DMC_2_1(): - """ Set of parameters from Doyle, Newman, et al. 1996. - """ - def tp0(c, T): - return 0.363 - - def D(c, T): - return 7.5e-11 # m^2/s - - def therm_fac(c, T): - return 1. - - def sigma(c, T): - r1 = 4.1253e-4 - r2 = 5.007e-3 - r3 = 4.7212e-3 - r4 = 1.5094e-3 - r5 = 1.6018e-4 - k0 = r1 + r2*c - r3*c**2 + r4*c**3 - r5*c**4 # S/cm - return(100*k0) - - Dref = D(constants.c_ref, 1) - - def D_ndim(c, T): - return D(c, T) / Dref - - def sigma_ndim(c, T): - return sigma(c, T) * ( - constants.k*constants.T_ref/(constants.e**2*Dref*constants.N_A*constants.c_ref)) - return D_ndim, sigma_ndim, therm_fac, tp0, Dref - - -def Doyle96_EC_DMC_1_2(): - """ Set of parameters from Doyle, Newman, et al. 1996. - """ - def tp0(c, T): - return 0.363 - - def D(c, T): - return 7.5e-11 # m^2/s - - def therm_fac(c, T): - return 1. - - def sigma(c, T): - r1 = 1.0793e-4 - r2 = 6.7461e-3 - r3 = 5.2245e-3 - r4 = 1.3605e-3 - r5 = 1.1724e-4 - k0 = r1 + r2*c - r3*c**2 + r4*c**3 - r5*c**4 # S/cm - return(100*k0) - - Dref = D(constants.c_ref, 1) - - def D_ndim(c, T): - return D(c, T) / Dref - - def sigma_ndim(c, T): - return sigma(c, T) * ( - constants.k*constants.T_ref/(constants.e**2*Dref*constants.N_A*constants.c_ref)) - return D_ndim, sigma_ndim, therm_fac, tp0, Dref - - -def valoen_reimers(): - """ Set of parameters from Valoen and Reimers 2005 """ - def tp0(c, T): - return 0.38 - - def D(c, T): - return ( - 10**(-4) * 10**(-4.43 - 54/((T*constants.T_ref) - (229 + 5*c)) - 0.22*c)) # m^2/s - - def therm_fac(c, T): - tmp = 0.601 - 0.24*c**(0.5) + 0.982*(1 - 0.0052*((T*constants.T_ref) - 294))*c**(1.5) - return tmp/(1-tp0(c, T)) - - def sigma(c, T): - (k00, k01, k02, - k10, k11, k12, - k20, k21) = ( - -10.5, 0.0740, -6.96e-5, - 0.668, -0.0178, 2.80e-5, - 0.494, -8.86e-4) - out = c * (k00 + k01*(T*constants.T_ref) + k02*(T*constants.T_ref)**2 - + k10*c + k11*c*(T*constants.T_ref) + k12*c*(T*constants.T_ref)**2 - + k20*c**2 + k21*c**2*(T*constants.T_ref))**2 # mS/cm - out *= 0.1 # S/m - return out - Dref = D(constants.c_ref/1000, 1) - - def D_ndim(c, T): - return D(c, T) / Dref - - def sigma_ndim(c, T): - return sigma(c, T) * ( - constants.k*constants.T_ref/(constants.e**2*Dref*constants.N_A*(constants.c_ref))) - - return D_ndim, sigma_ndim, therm_fac, tp0, Dref - - -def valoen_bernardi(): - """ Set of parameters from Bernardi and Go 2011, indirectly from - Valoen and Reimers 2005. The only change from Valoen and Reimers - is the conductivity. - """ - D_ndim, Ign, therm_fac, tp0, Dref = valoen_reimers() - - def sigma(c, T): - (k00, k01, k02, - k10, k11, k12, - k20, k21) = ( - -8.2488, 0.053248, -0.000029871, - 0.26235, -0.0093063, 0.000008069, - 0.22002, -0.0001765) - out = c * (k00 + k01*(T*constants.T_ref) + k02*(T*constants.T_ref)**2 - + k10*c + k11*c*(T*constants.T_ref) + k12*c*(T*constants.T_ref)**2 - + k20*c**2 + k21*c**2*(T*constants.T_ref))**2 # mS/cm - out *= 0.1 # S/m - return out - - def sigma_ndim(c, T): - return sigma(c, T) * ( - constants.k*constants.T_ref/(constants.e**2*Dref*constants.N_A*(constants.c_ref))) - return D_ndim, sigma_ndim, therm_fac, tp0, Dref - - -def test1(): - """Set of dilute solution parameters with zp=|zm|=nup=num=1, - Dp = 2.2e-10 m^2/s - Dm = 2.94e-10 m^2/s - """ - Dp = 2.2e-10 - Dm = 2.94e-10 - - def D(c, T): - return (2*Dp*Dm/(Dp+Dm)) # m^2/s - - def therm_fac(c, T): - return 1. - - def tp0(c, T): - return Dp/(Dp+Dm) - - def sigma(c, T): - return Dm*(1000*c)*constants.N_A*constants.e**2 \ - / (constants.k*T*constants.T_ref*(1-tp0(c))) # S/m - Dref = D(constants.c_ref/1000, 1) - - def D_ndim(c, T): - return D(c, T) / Dref - - def sigma_ndim(c, T): - return sigma(c, T) * ( - constants.k*constants.T_ref/(constants.e**2*Dref*constants.N_A*(constants.c_ref))) - - return D_ndim, sigma_ndim, therm_fac, tp0, Dref - - -def LIONSIMBA_nonisothermal(): - """ Set of parameters from LIONSIMBA validation. Torchio et al, 2016. - """ - - def tp0(c, T): - return 0.364 - - def sigma(c, T): - c_dim = c*1000 # dimensionalized c - T_dim = T*constants.T_ref - r1 = -10.5 - r2 = 0.668e-3 - r3 = 0.494e-6 - r4 = 0.074 - r5 = -1.78e-5 - r6 = -8.86e-10 - r7 = -6.96e-5 - r8 = 2.8e-8 - sig_out = 1e-4 * c_dim * (r1 + r2*c_dim + r3*c_dim**2 + T_dim - * (r4 + r5*c_dim + r6*c_dim**2) - + T_dim**2 * (r7 + r8*c_dim))**2 - return sig_out # m^2/s - - def D(c, T): - c_dim = c*1000 - T_dim = T*constants.T_ref - r1 = 4.43 - r2 = 54 - r3 = 229 - r4 = 5e-3 - r5 = 0.22e-3 - D_out = 1e-4 * 10**(-r1-r2/(T_dim-r3-r4*c_dim)-r5*c_dim) - return D_out - - def therm_fac(c, T): - return 1. - - Dref = D(constants.c_ref/1000, 1) - - def D_ndim(c, T): - return D(c, T) / Dref - - def sigma_ndim(c, T): - return sigma(c, T) * ( - constants.k*constants.T_ref/(constants.e**2*Dref*constants.N_A*(constants.c_ref))) - - return D_ndim, sigma_ndim, therm_fac, tp0, Dref - - -def LIONSIMBA_isothermal(): - """ Set of parameters from LIONSIMBA validation. Torchio et al, 2016. - """ - def tp0(c, T): - return 0.364 - - def sigma(c, T): - ce = c*1000 # dimensionalized c - return (4.1253e-2 + 5.007e-4*ce - 4.7212e-7*ce**2 - + 1.5094e-10*ce**3 - 1.6018*1e-14*ce**4) # S/m - - def D(c, T): - return 7.5e-10 # m^2/s - # isothermal at 298 K - - def therm_fac(c, T): - return 1. - - Dref = D(constants.c_ref/1000, 1) - - def D_ndim(c, T): - return D(c, T) / Dref - - def sigma_ndim(c, T): - return sigma(c, T) * ( - constants.k*constants.T_ref/(constants.e**2*Dref*constants.N_A*(constants.c_ref))) - - return D_ndim, sigma_ndim, therm_fac, tp0, Dref From 987323984763aaf3cb513d20604bfe6ee69c2f7d Mon Sep 17 00:00:00 2001 From: Dan Cogswell Date: Tue, 28 Jun 2022 15:38:14 -0400 Subject: [PATCH 44/57] Reverses formatting changes to regression test configs. --- tests/baseConfigs/params_system.cfg | 2 +- tests/ref_outputs/benchmark_Fuller94/params_system.cfg | 2 +- tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg | 1 + .../benchmark_LIONSIMBA_nonisothermal/params_system.cfg | 1 + tests/ref_outputs/test001/params_system.cfg | 1 + tests/ref_outputs/test002/params_system.cfg | 1 + tests/ref_outputs/test003/params_system.cfg | 1 + tests/ref_outputs/test004/params_system.cfg | 1 + tests/ref_outputs/test005/params_system.cfg | 1 + tests/ref_outputs/test006/params_system.cfg | 1 + tests/ref_outputs/test007/params_system.cfg | 1 + tests/ref_outputs/test008/params_system.cfg | 1 + tests/ref_outputs/test009/params_system.cfg | 1 + tests/ref_outputs/test010/params_system.cfg | 1 + tests/ref_outputs/test011/params_system.cfg | 1 + tests/ref_outputs/test012/params_system.cfg | 1 + tests/ref_outputs/test013/params_system.cfg | 1 + tests/ref_outputs/test014/params_system.cfg | 1 + tests/ref_outputs/test015/params_system.cfg | 1 + tests/ref_outputs/test016/params_system.cfg | 1 + tests/ref_outputs/test017/params_system.cfg | 1 + tests/ref_outputs/test018/params_system.cfg | 1 + tests/ref_outputs/test019/params_system.cfg | 1 + tests/ref_outputs/test022/params_system.cfg | 1 + tests/ref_outputs/test023/params_system.cfg | 1 + 25 files changed, 25 insertions(+), 2 deletions(-) diff --git a/tests/baseConfigs/params_system.cfg b/tests/baseConfigs/params_system.cfg index f4c69db8..1e4d99fb 100644 --- a/tests/baseConfigs/params_system.cfg +++ b/tests/baseConfigs/params_system.cfg @@ -15,7 +15,7 @@ tend = 1.2e3 tsteps = 35 relTol = 1e-6 absTol = 1e-6 -T0 = 298 +T = 298 randomSeed = true seed = 10 Rser = 0. diff --git a/tests/ref_outputs/benchmark_Fuller94/params_system.cfg b/tests/ref_outputs/benchmark_Fuller94/params_system.cfg index cd7acfa5..a19ecd84 100644 --- a/tests/ref_outputs/benchmark_Fuller94/params_system.cfg +++ b/tests/ref_outputs/benchmark_Fuller94/params_system.cfg @@ -95,4 +95,4 @@ SMset = LiClO4_PC n = 1 sp = -1 Dp = 2.2e-10 -Dm = 2.94e-10 +Dm = 2.94e-10 \ No newline at end of file diff --git a/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg index ae142ac6..f1dd10b2 100644 --- a/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg +++ b/tests/ref_outputs/benchmark_LIONSIMBA/params_system.cfg @@ -75,3 +75,4 @@ n = 1 sp = -1 Dp = 7.5e-10 Dm = 7.5e-10 + diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg index 5663f59a..a7c6ee3b 100644 --- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg +++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal/params_system.cfg @@ -75,3 +75,4 @@ n = 1 sp = -1 Dp = 7.5e-10 Dm = 7.5e-10 + diff --git a/tests/ref_outputs/test001/params_system.cfg b/tests/ref_outputs/test001/params_system.cfg index 526fb7b1..d1058292 100644 --- a/tests/ref_outputs/test001/params_system.cfg +++ b/tests/ref_outputs/test001/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test002/params_system.cfg b/tests/ref_outputs/test002/params_system.cfg index 526fb7b1..d1058292 100644 --- a/tests/ref_outputs/test002/params_system.cfg +++ b/tests/ref_outputs/test002/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test003/params_system.cfg b/tests/ref_outputs/test003/params_system.cfg index 526fb7b1..d1058292 100644 --- a/tests/ref_outputs/test003/params_system.cfg +++ b/tests/ref_outputs/test003/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test004/params_system.cfg b/tests/ref_outputs/test004/params_system.cfg index 526fb7b1..d1058292 100644 --- a/tests/ref_outputs/test004/params_system.cfg +++ b/tests/ref_outputs/test004/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test005/params_system.cfg b/tests/ref_outputs/test005/params_system.cfg index adfcf40e..b921f950 100644 --- a/tests/ref_outputs/test005/params_system.cfg +++ b/tests/ref_outputs/test005/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test006/params_system.cfg b/tests/ref_outputs/test006/params_system.cfg index fff90dce..dbaff3d8 100644 --- a/tests/ref_outputs/test006/params_system.cfg +++ b/tests/ref_outputs/test006/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test007/params_system.cfg b/tests/ref_outputs/test007/params_system.cfg index d7e4e4a7..81d0f53f 100644 --- a/tests/ref_outputs/test007/params_system.cfg +++ b/tests/ref_outputs/test007/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test008/params_system.cfg b/tests/ref_outputs/test008/params_system.cfg index f7b9953b..1136ede5 100644 --- a/tests/ref_outputs/test008/params_system.cfg +++ b/tests/ref_outputs/test008/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test009/params_system.cfg b/tests/ref_outputs/test009/params_system.cfg index 526fb7b1..d1058292 100644 --- a/tests/ref_outputs/test009/params_system.cfg +++ b/tests/ref_outputs/test009/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test010/params_system.cfg b/tests/ref_outputs/test010/params_system.cfg index 379ffc11..93c143d5 100644 --- a/tests/ref_outputs/test010/params_system.cfg +++ b/tests/ref_outputs/test010/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test011/params_system.cfg b/tests/ref_outputs/test011/params_system.cfg index 15684d81..5f64e868 100644 --- a/tests/ref_outputs/test011/params_system.cfg +++ b/tests/ref_outputs/test011/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test012/params_system.cfg b/tests/ref_outputs/test012/params_system.cfg index 6e31902b..1b761005 100644 --- a/tests/ref_outputs/test012/params_system.cfg +++ b/tests/ref_outputs/test012/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test013/params_system.cfg b/tests/ref_outputs/test013/params_system.cfg index 32d77dcd..eb0fbca5 100644 --- a/tests/ref_outputs/test013/params_system.cfg +++ b/tests/ref_outputs/test013/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test014/params_system.cfg b/tests/ref_outputs/test014/params_system.cfg index d000fbbb..c95e2be5 100644 --- a/tests/ref_outputs/test014/params_system.cfg +++ b/tests/ref_outputs/test014/params_system.cfg @@ -73,3 +73,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test015/params_system.cfg b/tests/ref_outputs/test015/params_system.cfg index 97171e8d..331548f2 100644 --- a/tests/ref_outputs/test015/params_system.cfg +++ b/tests/ref_outputs/test015/params_system.cfg @@ -73,3 +73,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test016/params_system.cfg b/tests/ref_outputs/test016/params_system.cfg index 6c4d00b0..39f87aa9 100644 --- a/tests/ref_outputs/test016/params_system.cfg +++ b/tests/ref_outputs/test016/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test017/params_system.cfg b/tests/ref_outputs/test017/params_system.cfg index 20b382d1..4f864190 100644 --- a/tests/ref_outputs/test017/params_system.cfg +++ b/tests/ref_outputs/test017/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test018/params_system.cfg b/tests/ref_outputs/test018/params_system.cfg index 36811c58..789c71ce 100644 --- a/tests/ref_outputs/test018/params_system.cfg +++ b/tests/ref_outputs/test018/params_system.cfg @@ -73,3 +73,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test019/params_system.cfg b/tests/ref_outputs/test019/params_system.cfg index 1a5a6d8a..7b91784c 100644 --- a/tests/ref_outputs/test019/params_system.cfg +++ b/tests/ref_outputs/test019/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test022/params_system.cfg b/tests/ref_outputs/test022/params_system.cfg index c3b5c9ad..4fe811c3 100644 --- a/tests/ref_outputs/test022/params_system.cfg +++ b/tests/ref_outputs/test022/params_system.cfg @@ -78,3 +78,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + diff --git a/tests/ref_outputs/test023/params_system.cfg b/tests/ref_outputs/test023/params_system.cfg index 32d77dcd..eb0fbca5 100644 --- a/tests/ref_outputs/test023/params_system.cfg +++ b/tests/ref_outputs/test023/params_system.cfg @@ -76,3 +76,4 @@ n = 1 sp = -1 Dp = 2.2e-10 Dm = 2.94e-10 + From f46c126478c42c24815f2bd4acc9d579bb574111 Mon Sep 17 00:00:00 2001 From: Dan Cogswell Date: Fri, 1 Jul 2022 18:52:55 -0400 Subject: [PATCH 45/57] Entropy heat generation set to false by default. --- mpet/config/schemas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py index e7b9f678..8d35ca68 100644 --- a/mpet/config/schemas.py +++ b/mpet/config/schemas.py @@ -125,7 +125,7 @@ def tobool(value): Optional('k_h_s', default=0.2): Use(float), Optional('h_h', default=500): Use(float), Optional('sigma_l', default=500): Use(float), - Optional('ent_heat_gen', default=True): Use(tobool)}, + Optional('ent_heat_gen', default=False): Use(tobool)}, 'Electrolyte': {'c0': Use(float), 'zp': Use(int), 'zm': And(Use(int), lambda x: x < 0), From 14de592faa5baee08d128ae214fab9db99a93590 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Wed, 6 Jul 2022 12:27:39 -0400 Subject: [PATCH 46/57] changed name of ent_heat_gen to entropy_heat_gen --- configs/params_system.cfg | 2 +- mpet/config/schemas.py | 2 +- mpet/mod_electrodes.py | 4 ++-- .../params_system.cfg | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/configs/params_system.cfg b/configs/params_system.cfg index d70336b3..28003a04 100644 --- a/configs/params_system.cfg +++ b/configs/params_system.cfg @@ -151,7 +151,7 @@ k_h_s = 0.16 sigma_l = 500 # Includes temperature dependence of entropic heat generation if true, does not include # if false -ent_heat_gen = False +entropy_heat_gen = False [Geometry] # Thicknesses, m diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py index 8d35ca68..856749a8 100644 --- a/mpet/config/schemas.py +++ b/mpet/config/schemas.py @@ -125,7 +125,7 @@ def tobool(value): Optional('k_h_s', default=0.2): Use(float), Optional('h_h', default=500): Use(float), Optional('sigma_l', default=500): Use(float), - Optional('ent_heat_gen', default=False): Use(tobool)}, + Optional('entropy_heat_gen', default=False): Use(tobool)}, 'Electrolyte': {'c0': Use(float), 'zp': Use(int), 'zm': And(Use(int), lambda x: x < 0), diff --git a/mpet/mod_electrodes.py b/mpet/mod_electrodes.py index d3871ebc..46060a23 100644 --- a/mpet/mod_electrodes.py +++ b/mpet/mod_electrodes.py @@ -171,7 +171,7 @@ def DeclareEquations(self): # Define average rate of heat generation eq = self.CreateEquation("q_rxn_bar") - if self.config["ent_heat_gen"]: + if self.config["entropy_heat_gen"]: eq.Residual = self.q_rxn_bar() - 0.5 * self.dcbar1dt() * \ (eta1 - self.T_lyte()*(np.log(c_surf1/(1-c_surf1))-1/self.c_lyte())) \ - 0.5 * self.dcbar2dt() * (eta2 - self.T_lyte() @@ -420,7 +420,7 @@ def DeclareEquations(self): # Define average rate of heat generation eq = self.CreateEquation("q_rxn_bar") - if self.config["ent_heat_gen"]: + if self.config["entropy_heat_gen"]: eq.Residual = self.q_rxn_bar() - self.dcbardt() * \ (eta - self.T_lyte()*(np.log(c_surf/(1-c_surf))-1/self.c_lyte())) else: diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg index 9fa7ed5b..f72bdc09 100644 --- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg +++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg @@ -75,7 +75,7 @@ k_h_c = 2.1 k_h_a = 1.7 k_h_s = 0.16 sigma_l = 500 -ent_heat_gen = False +entropy_heat_gen = False [Electrolyte] c0 = 1000 From b4feee45fa777ed407f812dfc4861fa7a6867a3e Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Wed, 13 Jul 2022 16:05:15 -0400 Subject: [PATCH 47/57] removed temperature boundary condition variables and replaced with initial temperature --- mpet/mod_cell.py | 11 +---------- mpet/sim.py | 2 -- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index f9b79d45..baf81b27 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -119,10 +119,6 @@ def __init__(self, config, Name, Parent=None, Description=""): self.c_lyteGP_L = dae.daeVariable("c_lyteGP_L", conc_t, self, "c_lyte left BC GP") self.phi_lyteGP_L = dae.daeVariable( "phi_lyteGP_L", elec_pot_t, self, "phi_lyte left BC GP") - self.T_lyteGP_L = dae.daeVariable( - "T_lyteGP_L", temp_t, self, "T_lyte left BC GP") - self.T_lyteGP_R = dae.daeVariable( - "T_lyteGP_R", temp_t, self, "T_lyte left BC GP") self.phi_applied = dae.daeVariable( "phi_applied", elec_pot_t, self, "Overall battery voltage (at anode current collector)") @@ -343,7 +339,7 @@ def DeclareEquations(self): # Ghost points on the left and no-gradients on the right ctmp = np.hstack((self.c_lyteGP_L(), cvec, cvec[-1])) # temperature uses a constant boundary condition - Ttmp = np.hstack((self.T_lyteGP_L(), Tvec, self.T_lyteGP_R())) + Ttmp = np.hstack((config["T"], Tvec, config["T"])) phitmp = np.hstack((self.phi_lyteGP_L(), phivec, phivec[-1])) Nm_edges, i_edges, q_edges = get_lyte_internal_fluxes(ctmp, phitmp, Ttmp, disc, @@ -354,8 +350,6 @@ def DeclareEquations(self): # 2) assume we have a Li foil with BV kinetics and the specified rate constant eqC = self.CreateEquation("GhostPointC_L") eqP = self.CreateEquation("GhostPointP_L") - eqTL = self.CreateEquation("GhostPointT_L") - eqTR = self.CreateEquation("GhostPointT_R") if 'a' not in config["trodes"]: # Concentration BC from mass flux eqC.Residual = Nm_edges[0] @@ -387,9 +381,6 @@ def DeclareEquations(self): else: eqC.Residual = ctmp[0] - ctmp[1] eqP.Residual = phitmp[0] - phitmp[1] - # boundary equation for temperature variables. per volume - eqTL.Residual = Ttmp[0] - config["T"] - eqTR.Residual = Ttmp[-1] - config["T"] dvgNm = np.diff(Nm_edges)/disc["dxvec"] dvgi = np.diff(i_edges)/disc["dxvec"] diff --git a/mpet/sim.py b/mpet/sim.py index 9fc31eed..bdc3b075 100644 --- a/mpet/sim.py +++ b/mpet/sim.py @@ -118,8 +118,6 @@ def SetUpVariables(self): if not self.m.SVsim: self.m.c_lyteGP_L.SetInitialGuess(config["c0"]) self.m.phi_lyteGP_L.SetInitialGuess(0) - self.m.T_lyteGP_L.SetInitialGuess(config["T"]) - self.m.T_lyteGP_R.SetInitialGuess(config["T"]) # Separator electrolyte initialization if config["have_separator"]: From 96435ac655efc70ee985865094f207adbffe8104 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Mon, 18 Jul 2022 13:05:05 -0400 Subject: [PATCH 48/57] removed sigma_l from input parameters (already known for dilute solution model) --- configs/params_system.cfg | 3 - mpet/config/configuration.py | 1 - mpet/config/schemas.py | 1 - mpet/mod_cell.py | 8 +- .../params_system.cfg | 2 +- .../sim_output/commit.diff | 539 ++++++++++++++++++ .../sim_output/daetools_config_options.txt | 3 +- .../sim_output/input_dict_anode.p | Bin 2086 -> 1841 bytes .../sim_output/input_dict_cathode.p | Bin 2088 -> 1843 bytes .../sim_output/input_dict_derived_values.p | Bin 691 -> 575 bytes .../sim_output/input_dict_system.p | Bin 3798 -> 3282 bytes .../sim_output/output_data.mat | Bin 106304 -> 105760 bytes .../sim_output/run_info.txt | 6 +- 13 files changed, 552 insertions(+), 11 deletions(-) diff --git a/configs/params_system.cfg b/configs/params_system.cfg index 28003a04..b5498128 100644 --- a/configs/params_system.cfg +++ b/configs/params_system.cfg @@ -146,9 +146,6 @@ h_h = 2e4 k_h_c = 2.1 k_h_a = 1.7 k_h_s = 0.16 -# Conductivity in electrolyte solution (only used for dilute electrolyte model), (S/m) -# For Stefan-Maxwell concentrated electrolyte, input from props_elyte.py -sigma_l = 500 # Includes temperature dependence of entropic heat generation if true, does not include # if false entropy_heat_gen = False diff --git a/mpet/config/configuration.py b/mpet/config/configuration.py index b5cebed2..794cc70a 100644 --- a/mpet/config/configuration.py +++ b/mpet/config/configuration.py @@ -481,7 +481,6 @@ def _scale_system_parameters(self, theoretical_1C_current): self['T'] = self['T'] / constants.T_ref self['Rser'] = self['Rser'] / self['Rser_ref'] self['h_h'] = self['h_h'] * self['L_ref'] / self['k_h_ref'] - self['sigma_l'] = self['sigma_l'] / self['sigma_s_ref'] if self['Dp'] is not None: self['Dp'] = self['Dp'] / self['D_ref'] if self['Dm'] is not None: diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py index 856749a8..fa7b6cd8 100644 --- a/mpet/config/schemas.py +++ b/mpet/config/schemas.py @@ -124,7 +124,6 @@ def tobool(value): Optional('k_h_a', default=0.2): Use(float), Optional('k_h_s', default=0.2): Use(float), Optional('h_h', default=500): Use(float), - Optional('sigma_l', default=500): Use(float), Optional('entropy_heat_gen', default=False): Use(tobool)}, 'Electrolyte': {'c0': Use(float), 'zp': Use(int), diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index baf81b27..6b7d22ba 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -607,7 +607,13 @@ def get_ohmic_heat(c_lyte, T_lyte, phi_lyte, phi_bulk, disc, config, Nvol): q_ohmic = 0 if config["elyteModelType"] == "dilute": - sigma_l = eps_o_tau[1:-1] * config["sigma_l"] + zp, zm, nup, num = config["zp"], config["zm"], config["nup"], config["num"] + + # Get porosity at cell edges using weighted harmonic mean + Dp = eps_o_tau[1:-1] * config["Dp"] + Dm = eps_o_tau[1:-1] * config["Dm"] + sigma_l = ((nup*zp*Dp + num*zm*Dm)*np.diff(c_edges_int)/dx) - \ + (nup*zp ** 2*Dp + num*zm**2*Dm)/T_mid*c_mid elif config["elyteModelType"] == "SM": SMset = config["SMset"] elyte_function = utils.import_function(config["SMset_filename"], SMset, diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg index f72bdc09..5c291691 100644 --- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg +++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg @@ -16,6 +16,7 @@ relTol = 1e-6 absTol = 1e-6 T = 323 randomSeed = false +nonisothermal = true seed = 0 Rser = 0. Nvol_c = 10 @@ -74,7 +75,6 @@ h_h = 10 k_h_c = 2.1 k_h_a = 1.7 k_h_s = 0.16 -sigma_l = 500 entropy_heat_gen = False [Electrolyte] diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff index 8b137891..d77809ba 100644 --- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff +++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff @@ -1 +1,540 @@ +diff --git a/mpet/config/configuration.py b/mpet/config/configuration.py +index b5cebed..794cc70 100644 +--- a/mpet/config/configuration.py ++++ b/mpet/config/configuration.py +@@ -481,7 +481,6 @@ class Config: + self['T'] = self['T'] / constants.T_ref + self['Rser'] = self['Rser'] / self['Rser_ref'] + self['h_h'] = self['h_h'] * self['L_ref'] / self['k_h_ref'] +- self['sigma_l'] = self['sigma_l'] / self['sigma_s_ref'] + if self['Dp'] is not None: + self['Dp'] = self['Dp'] / self['D_ref'] + if self['Dm'] is not None: +diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py +index 856749a..fa7b6cd 100644 +--- a/mpet/config/schemas.py ++++ b/mpet/config/schemas.py +@@ -124,7 +124,6 @@ system = {'Sim Params': {'profileType': lambda x: + Optional('k_h_a', default=0.2): Use(float), + Optional('k_h_s', default=0.2): Use(float), + Optional('h_h', default=500): Use(float), +- Optional('sigma_l', default=500): Use(float), + Optional('entropy_heat_gen', default=False): Use(tobool)}, + 'Electrolyte': {'c0': Use(float), + 'zp': Use(int), +diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py +index baf81b2..c85979a 100644 +--- a/mpet/mod_cell.py ++++ b/mpet/mod_cell.py +@@ -607,7 +607,13 @@ def get_ohmic_heat(c_lyte, T_lyte, phi_lyte, phi_bulk, disc, config, Nvol): + q_ohmic = 0 + + if config["elyteModelType"] == "dilute": +- sigma_l = eps_o_tau[1:-1] * config["sigma_l"] ++ zp, zm, nup, num = config["zp"], config["zm"], config["nup"], config["num"] ++ ++ # Get porosity at cell edges using weighted harmonic mean ++ Dp = eps_o_tau[1:-1] * config["Dp"] ++ Dm = eps_o_tau[1:-1] * config["Dm"] ++ sigma_l = ((nup*zp*Dp + num*zm*Dm)*np.diff(c_edges_int)/dx) - (nup*zp ++ ** 2*Dp + num*zm**2*Dm)/T_mid*c_mid + elif config["elyteModelType"] == "SM": + SMset = config["SMset"] + elyte_function = utils.import_function(config["SMset_filename"], SMset, +diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg +index f72bdc0..5c29169 100644 +--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg ++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg +@@ -16,6 +16,7 @@ relTol = 1e-6 + absTol = 1e-6 + T = 323 + randomSeed = false ++nonisothermal = true + seed = 0 + Rser = 0. + Nvol_c = 10 +@@ -74,7 +75,6 @@ h_h = 10 + k_h_c = 2.1 + k_h_a = 1.7 + k_h_s = 0.16 +-sigma_l = 500 + entropy_heat_gen = False + + [Electrolyte] +diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff +index 8b13789..d8e49fc 100644 +--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff ++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff +@@ -1 +1,418 @@ ++diff --git a/mpet/config/configuration.py b/mpet/config/configuration.py ++index b5cebed..794cc70 100644 ++--- a/mpet/config/configuration.py +++++ b/mpet/config/configuration.py ++@@ -481,7 +481,6 @@ class Config: ++ self['T'] = self['T'] / constants.T_ref ++ self['Rser'] = self['Rser'] / self['Rser_ref'] ++ self['h_h'] = self['h_h'] * self['L_ref'] / self['k_h_ref'] ++- self['sigma_l'] = self['sigma_l'] / self['sigma_s_ref'] ++ if self['Dp'] is not None: ++ self['Dp'] = self['Dp'] / self['D_ref'] ++ if self['Dm'] is not None: ++diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py ++index 856749a..994875f 100644 ++--- a/mpet/config/schemas.py +++++ b/mpet/config/schemas.py ++@@ -114,17 +114,16 @@ system = {'Sim Params': {'profileType': lambda x: ++ 'BruggExp_c': Use(float), ++ 'BruggExp_a': Use(float), ++ 'BruggExp_s': Use(float)}, ++- 'Thermal Parameters': {Optional('cp_c', default=1e8): Use(float), ++- Optional('cp_a', default=1e8): Use(float), ++- Optional('cp_s', default=1e8): Use(float), ++- Optional('rhom_c', default=0.2): Use(float), ++- Optional('rhom_a', default=0.2): Use(float), ++- Optional('rhom_s', default=0.2): Use(float), ++- Optional('k_h_c', default=0.2): Use(float), ++- Optional('k_h_a', default=0.2): Use(float), ++- Optional('k_h_s', default=0.2): Use(float), ++- Optional('h_h', default=500): Use(float), ++- Optional('sigma_l', default=500): Use(float), +++ 'Thermal Parameters': {Optional('cp_c', default=0): Use(float), +++ Optional('cp_a', default=0): Use(float), +++ Optional('cp_s', default=0): Use(float), +++ Optional('rhom_c', default=0): Use(float), +++ Optional('rhom_a', default=0): Use(float), +++ Optional('rhom_s', default=0): Use(float), +++ Optional('k_h_c', default=0): Use(float), +++ Optional('k_h_a', default=0): Use(float), +++ Optional('k_h_s', default=0): Use(float), +++ Optional('h_h', default=0): Use(float), ++ Optional('entropy_heat_gen', default=False): Use(tobool)}, ++ 'Electrolyte': {'c0': Use(float), ++ 'zp': Use(int), ++diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py ++index baf81b2..8644a95 100644 ++--- a/mpet/mod_cell.py +++++ b/mpet/mod_cell.py ++@@ -607,7 +607,21 @@ def get_ohmic_heat(c_lyte, T_lyte, phi_lyte, phi_bulk, disc, config, Nvol): ++ q_ohmic = 0 ++ ++ if config["elyteModelType"] == "dilute": ++- sigma_l = eps_o_tau[1:-1] * config["sigma_l"] +++ zp, zm, nup, num = config["zp"], config["zm"], config["nup"], config["num"] +++ dxd1 = disc["dxd1"] +++ eps_o_tau = disc["eps_o_tau"] +++ +++ # Get concentration at cell edges using weighted mean +++ wt = utils.pad_vec(disc["dxvec"]) +++ c_edges_int = utils.weighted_linear_mean(c_lyte, wt) +++ T_edges_int = utils.weighted_linear_mean(T_lyte, wt) +++ +++ # Get porosity at cell edges using weighted harmonic mean +++ eps_o_tau_edges = utils.weighted_linear_mean(eps_o_tau, wt) +++ Dp = eps_o_tau_edges * config["Dp"] +++ Dm = eps_o_tau_edges * config["Dm"] +++ sigma_l = ((nup*zp*Dp + num*zm*Dm)*np.diff(c_lyte)/dxd1) - (nup*zp +++ ** 2*Dp + num*zm**2*Dm)/T_edges_int*c_edges_int ++ elif config["elyteModelType"] == "SM": ++ SMset = config["SMset"] ++ elyte_function = utils.import_function(config["SMset_filename"], SMset, ++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg ++index f72bdc0..5c29169 100644 ++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg +++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg ++@@ -16,6 +16,7 @@ relTol = 1e-6 ++ absTol = 1e-6 ++ T = 323 ++ randomSeed = false +++nonisothermal = true ++ seed = 0 ++ Rser = 0. ++ Nvol_c = 10 ++@@ -74,7 +75,6 @@ h_h = 10 ++ k_h_c = 2.1 ++ k_h_a = 1.7 ++ k_h_s = 0.16 ++-sigma_l = 500 ++ entropy_heat_gen = False ++ ++ [Electrolyte] ++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff ++index 8b13789..706c81d 100644 ++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff +++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff ++@@ -1 +1,268 @@ +++diff --git a/mpet/config/configuration.py b/mpet/config/configuration.py +++index b5cebed..cda04bf 100644 +++--- a/mpet/config/configuration.py ++++++ b/mpet/config/configuration.py +++@@ -481,7 +481,10 @@ class Config: +++ self['T'] = self['T'] / constants.T_ref +++ self['Rser'] = self['Rser'] / self['Rser_ref'] +++ self['h_h'] = self['h_h'] * self['L_ref'] / self['k_h_ref'] +++- self['sigma_l'] = self['sigma_l'] / self['sigma_s_ref'] ++++ #if self['nonisothermal']: ++++ # if self['h_h'] == 0: ++++ # raise Exception("Please provide all nonisothermal parameters for " + trode + " and ensure they are nonzero") ++++ +++ if self['Dp'] is not None: +++ self['Dp'] = self['Dp'] / self['D_ref'] +++ if self['Dm'] is not None: +++@@ -511,6 +514,10 @@ class Config: +++ self['cp'][trode] = self['cp'][trode] / \ +++ (self['k_h_ref'] * self['t_ref'] / (self['rho_ref']*self['L_ref']**2)) +++ self['rhom'][trode] = self['rhom'][trode] / self['rho_ref'] ++++ #if self['nonisothermal']: ++++ # if self['k_h'][trode] == 0 or self['cp'][trode] == 0 or self['rhom'][trode] == 0: ++++ # raise Exception("Please provide all nonisothermal parameters for " + trode + " and ensure they are nonzero") ++++ +++ +++ if self[trode, 'lambda'] is not None: +++ self[trode, 'lambda'] = self[trode, 'lambda'] / kT +++@@ -528,6 +535,10 @@ class Config: +++ self['cp']['s'] = self['cp']['s'] / \ +++ (self['k_h_ref'] * self['t_ref'] / (self['rho_ref']*self['L_ref']**2)) +++ self['rhom']['s'] = self['rhom']['s'] / self['rho_ref'] ++++ #if self['nonisothermal']: ++++ # if self['rhom']['s'] == 0 or self['cp']['s'] == 0 or self['rhom']['s'] == 0: ++++ # raise Exception("Please provide all nonisothermal parameters for the separator and ensure they are nonzero") ++++ +++ +++ def _scale_macroscopic_parameters(self, Vref): +++ """ +++diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py +++index 856749a..994875f 100644 +++--- a/mpet/config/schemas.py ++++++ b/mpet/config/schemas.py +++@@ -114,17 +114,16 @@ system = {'Sim Params': {'profileType': lambda x: +++ 'BruggExp_c': Use(float), +++ 'BruggExp_a': Use(float), +++ 'BruggExp_s': Use(float)}, +++- 'Thermal Parameters': {Optional('cp_c', default=1e8): Use(float), +++- Optional('cp_a', default=1e8): Use(float), +++- Optional('cp_s', default=1e8): Use(float), +++- Optional('rhom_c', default=0.2): Use(float), +++- Optional('rhom_a', default=0.2): Use(float), +++- Optional('rhom_s', default=0.2): Use(float), +++- Optional('k_h_c', default=0.2): Use(float), +++- Optional('k_h_a', default=0.2): Use(float), +++- Optional('k_h_s', default=0.2): Use(float), +++- Optional('h_h', default=500): Use(float), +++- Optional('sigma_l', default=500): Use(float), ++++ 'Thermal Parameters': {Optional('cp_c', default=0): Use(float), ++++ Optional('cp_a', default=0): Use(float), ++++ Optional('cp_s', default=0): Use(float), ++++ Optional('rhom_c', default=0): Use(float), ++++ Optional('rhom_a', default=0): Use(float), ++++ Optional('rhom_s', default=0): Use(float), ++++ Optional('k_h_c', default=0): Use(float), ++++ Optional('k_h_a', default=0): Use(float), ++++ Optional('k_h_s', default=0): Use(float), ++++ Optional('h_h', default=0): Use(float), +++ Optional('entropy_heat_gen', default=False): Use(tobool)}, +++ 'Electrolyte': {'c0': Use(float), +++ 'zp': Use(int), +++diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py +++index baf81b2..8644a95 100644 +++--- a/mpet/mod_cell.py ++++++ b/mpet/mod_cell.py +++@@ -607,7 +607,21 @@ def get_ohmic_heat(c_lyte, T_lyte, phi_lyte, phi_bulk, disc, config, Nvol): +++ q_ohmic = 0 +++ +++ if config["elyteModelType"] == "dilute": +++- sigma_l = eps_o_tau[1:-1] * config["sigma_l"] ++++ zp, zm, nup, num = config["zp"], config["zm"], config["nup"], config["num"] ++++ dxd1 = disc["dxd1"] ++++ eps_o_tau = disc["eps_o_tau"] ++++ ++++ # Get concentration at cell edges using weighted mean ++++ wt = utils.pad_vec(disc["dxvec"]) ++++ c_edges_int = utils.weighted_linear_mean(c_lyte, wt) ++++ T_edges_int = utils.weighted_linear_mean(T_lyte, wt) ++++ ++++ # Get porosity at cell edges using weighted harmonic mean ++++ eps_o_tau_edges = utils.weighted_linear_mean(eps_o_tau, wt) ++++ Dp = eps_o_tau_edges * config["Dp"] ++++ Dm = eps_o_tau_edges * config["Dm"] ++++ sigma_l = ((nup*zp*Dp + num*zm*Dm)*np.diff(c_lyte)/dxd1) - (nup*zp ++++ ** 2*Dp + num*zm**2*Dm)/T_edges_int*c_edges_int +++ elif config["elyteModelType"] == "SM": +++ SMset = config["SMset"] +++ elyte_function = utils.import_function(config["SMset_filename"], SMset, +++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg +++index f72bdc0..5c29169 100644 +++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg ++++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg +++@@ -16,6 +16,7 @@ relTol = 1e-6 +++ absTol = 1e-6 +++ T = 323 +++ randomSeed = false ++++nonisothermal = true +++ seed = 0 +++ Rser = 0. +++ Nvol_c = 10 +++@@ -74,7 +75,6 @@ h_h = 10 +++ k_h_c = 2.1 +++ k_h_a = 1.7 +++ k_h_s = 0.16 +++-sigma_l = 500 +++ entropy_heat_gen = False +++ +++ [Electrolyte] +++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff +++index 8b13789..c406ea3 100644 +++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff ++++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff +++@@ -1 +1,92 @@ ++++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg ++++index f72bdc0..5c29169 100644 ++++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg +++++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg ++++@@ -16,6 +16,7 @@ relTol = 1e-6 ++++ absTol = 1e-6 ++++ T = 323 ++++ randomSeed = false +++++nonisothermal = true ++++ seed = 0 ++++ Rser = 0. ++++ Nvol_c = 10 ++++@@ -74,7 +75,6 @@ h_h = 10 ++++ k_h_c = 2.1 ++++ k_h_a = 1.7 ++++ k_h_s = 0.16 ++++-sigma_l = 500 ++++ entropy_heat_gen = False ++++ ++++ [Electrolyte] ++++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff ++++index 8b13789..76248ff 100644 ++++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff +++++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff ++++@@ -1 +1,13 @@ +++++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg +++++index f72bdc0..dfb8777 100644 +++++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg ++++++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg +++++@@ -16,6 +16,7 @@ relTol = 1e-6 +++++ absTol = 1e-6 +++++ T = 323 +++++ randomSeed = false ++++++nonisothermal = true +++++ seed = 0 +++++ Rser = 0. +++++ Nvol_c = 10 ++++ ++++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt ++++index 5b8dc25..7320f92 100644 ++++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt +++++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt ++++@@ -10,7 +10,8 @@ ++++ "printInfo": "false", ++++ "nodes": { ++++ "useNodeMemoryPools": "false", ++++- "deleteNodesThreshold": "1000000" +++++ "deleteNodesThreshold": "1000000", +++++ "significantDecimalsForConstantsHash": "10" ++++ }, ++++ "equations": { ++++ "info": [ ++++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p ++++index 4bd86ab..1af2113 100644 ++++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p differ ++++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p ++++index 73014a3..da9df05 100644 ++++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p differ ++++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p ++++index 9ccd6ef..4b126b3 100644 ++++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p differ ++++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p ++++index df48508..fcb64ff 100644 ++++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p differ ++++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat ++++index 3689345..9a21ede 100644 ++++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat differ ++++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt ++++index ad28d23..73fa61f 100644 ++++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt +++++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt ++++@@ -1,11 +1,11 @@ ++++ mpet version: ++++-0.1.7 +++++0.1.8 ++++ ++++ branch name: ++++ feature/temperature_effects ++++ ++++ commit hash: ++++-ad7fe99 +++++b4feee4 ++++ ++++ to run, from the root repo directory, copy relevant files there, ++++ edit input_params_system.cfg to point to correct material ++++@@ -14,4 +14,4 @@ $ git checkout [commit hash] ++++ $ patch -p1 < commit.diff: ++++ $ python[3] mpetrun.py input_params_system.cfg ++++ ++++-Total run time: 0.6181278228759766 s +++++Total run time: 0.6214299201965332 s +++ +++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt +++index 5b8dc25..7320f92 100644 +++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt ++++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt +++@@ -10,7 +10,8 @@ +++ "printInfo": "false", +++ "nodes": { +++ "useNodeMemoryPools": "false", +++- "deleteNodesThreshold": "1000000" ++++ "deleteNodesThreshold": "1000000", ++++ "significantDecimalsForConstantsHash": "10" +++ }, +++ "equations": { +++ "info": [ +++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p +++index 4bd86ab..8516ece 100644 +++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p differ +++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p +++index 73014a3..fdd7046 100644 +++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p differ +++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p +++index 9ccd6ef..4b126b3 100644 +++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p differ +++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p +++index df48508..b042b1d 100644 +++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p differ +++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat +++index 3689345..6c6ae31 100644 +++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat differ +++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt +++index ad28d23..5675ed3 100644 +++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt ++++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt +++@@ -1,11 +1,11 @@ +++ mpet version: +++-0.1.7 ++++0.1.8 +++ +++ branch name: +++ feature/temperature_effects +++ +++ commit hash: +++-ad7fe99 ++++b4feee4 +++ +++ to run, from the root repo directory, copy relevant files there, +++ edit input_params_system.cfg to point to correct material +++@@ -14,4 +14,4 @@ $ git checkout [commit hash] +++ $ patch -p1 < commit.diff: +++ $ python[3] mpetrun.py input_params_system.cfg +++ +++-Total run time: 0.6181278228759766 s ++++Total run time: 0.6859793663024902 s ++ ++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt ++index 5b8dc25..7320f92 100644 ++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt +++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt ++@@ -10,7 +10,8 @@ ++ "printInfo": "false", ++ "nodes": { ++ "useNodeMemoryPools": "false", ++- "deleteNodesThreshold": "1000000" +++ "deleteNodesThreshold": "1000000", +++ "significantDecimalsForConstantsHash": "10" ++ }, ++ "equations": { ++ "info": [ ++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p ++index 4bd86ab..a075d48 100644 ++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p differ ++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p ++index 73014a3..e831718 100644 ++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p differ ++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p ++index 9ccd6ef..0ba05e8 100644 ++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p differ ++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p ++index df48508..2fe54a4 100644 ++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p differ ++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat ++index 3689345..f858082 100644 ++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat differ ++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt ++index ad28d23..09df22b 100644 ++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt +++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt ++@@ -1,11 +1,11 @@ ++ mpet version: ++-0.1.7 +++0.1.8 ++ ++ branch name: ++ feature/temperature_effects ++ ++ commit hash: ++-ad7fe99 +++b4feee4 ++ ++ to run, from the root repo directory, copy relevant files there, ++ edit input_params_system.cfg to point to correct material ++@@ -14,4 +14,4 @@ $ git checkout [commit hash] ++ $ patch -p1 < commit.diff: ++ $ python[3] mpetrun.py input_params_system.cfg ++ ++-Total run time: 0.6181278228759766 s +++Total run time: 0.6945881843566895 s + +diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt +index 5b8dc25..7320f92 100644 +--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt ++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt +@@ -10,7 +10,8 @@ + "printInfo": "false", + "nodes": { + "useNodeMemoryPools": "false", +- "deleteNodesThreshold": "1000000" ++ "deleteNodesThreshold": "1000000", ++ "significantDecimalsForConstantsHash": "10" + }, + "equations": { + "info": [ +diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p +index 4bd86ab..fd6b7e2 100644 +Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p differ +diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p +index 73014a3..c2013e4 100644 +Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p differ +diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p +index 9ccd6ef..0ba05e8 100644 +Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p differ +diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p +index df48508..81ca781 100644 +Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p differ +diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat +index 3689345..3e26338 100644 +Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat differ +diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt +index ad28d23..80c55f3 100644 +--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt ++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt +@@ -1,11 +1,11 @@ + mpet version: +-0.1.7 ++0.1.8 + + branch name: + feature/temperature_effects + + commit hash: +-ad7fe99 ++b4feee4 + + to run, from the root repo directory, copy relevant files there, + edit input_params_system.cfg to point to correct material +@@ -14,4 +14,4 @@ $ git checkout [commit hash] + $ patch -p1 < commit.diff: + $ python[3] mpetrun.py input_params_system.cfg + +-Total run time: 0.6181278228759766 s ++Total run time: 0.6275632381439209 s diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt index 5b8dc25f..7320f92e 100644 --- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt +++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt @@ -10,7 +10,8 @@ "printInfo": "false", "nodes": { "useNodeMemoryPools": "false", - "deleteNodesThreshold": "1000000" + "deleteNodesThreshold": "1000000", + "significantDecimalsForConstantsHash": "10" }, "equations": { "info": [ diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p index 4bd86ab75da3df3692dc34f3ac04a5d45d7af154..aeadb8593b024d27482c93e2176805a4eb8fee9d 100644 GIT binary patch literal 1841 zcmb_cOK1~O6wS05lWHkNtl+v>;)hTvsEC?$(vsHHv_z|$%J4Gt(ixihFf*w}@Uu}{ zd48Z*l)4cYf-42-&W#qN3k7$AD-pU8#Sa!m1ikYn(G)Z;oLS7d%-na+x#!-Qv(alk zu?W9TL4rlSs!f5lW`+vDI#k_N9O~&OiKkm8WcOcu@oE0yy&)#L8u9bixVAG;TYDSgg)Prp5 z{X}Br@s$Y{8#U-8k&BRL(ZOl;C}IaMESK~$HHks-NiB)|4iyYLYksWCbWWIux#w}| zh-_GD?+#!sQ@yBaJ<=ss7JZTZ4I)KSwl%aM^(xSaUJ|3I;*)f;+%w$mjD1e&EG#xrhhF z+059wn(<*FVA=ZCXj`=HzD_N*i#c2E!iN=_~dvA7TH{r-KhyBgV{N8*% zzu#|W_U*1SkTTjzNs{Pd-9}35VyC5X6)UuL?96gQGq9<9nozgqqf5@c^TS`uUw$^O zb+fCXL)e~`+A4ltckIAMx7N!R)N##u-ws2pl5;bQmwq0+xKCTnE_e;K((p~J7I&X? zOMCUni7DmK#KGbSdc=*YwYh0xp?66j{F)ouNH1w?*>17W>w#S%Cf3Ng&%gQSqbt9? ztM%|}4KK=FTfQcC&Xanb;2t@*+%!(HtRmLQEQmv71x`&5v0fhg?#i$KfBWNy8qXR< zpFF(n?>Bot{o@yrH7ca<6(F`QQ=!`0|4@_^yx||_^L<#9P&}f0HEVD;wrDFDbbb(z$b}6|DRbj$v#1d~+A50A znpEo!!DDj%C$?ZmG%Mm67Qt4zkgaZC-t%X_=$6XtJv`njo>$g1XqgQt!o~Hig=rE{ zJaGowGNSzowwr96^~J1N3+$}ds8W{%0a;Azfi2n}G)$VtjwmbbThUcy%FO6L;csf%~mDAAUC@V}3X@8>%eafsq@^pHd^ z)l6(~gc}@Hp(O^#?oQ*6Q@m=3?~Y|x+3+VZ8#|of4kuOUiNmQjhn_+-{X35!6o%n! zj=3i1S}N>>TWRC|`&Pug^N2YL$4I{NZp?p;^XFAm6TT<-CyE<4T_2DNor++8GPRgL Xf_lsc=Lagngir4dzd^BJG#c4k8=o$t diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p index 73014a3124bceb89ed809d1c5e94bc987df135b6..13a6ee29957f77b566f0aca843d09ef67f371070 100644 GIT binary patch literal 1843 zcmb_cOK1~O6rE`^P1GtuY|*tKu}Y{GQT#M%($dz{v_xAswZqHIOJ->1!+csJ^|R30 z$n)DLLc6I;5wsw#bk&85D>owUL~vO|QS46dyh$(xjSFWMb1pOY-E;1_cji*)ZY<2P z>pYE-kW)4>CC%x993@+1)s`&msOONQ8anOozV`0x!t=)iM6ea)<+a$Rf-ML(IEpGw z>e#j+YqWghV<$OG!kU{axVl71bVyAb!~4ad!Qt%5!4s(-I9f7_BS@wdBIt%{V+dMV zAet5~APMR$zxc8AboDxk=&t7HWL^rtFM=cU@3+O z8v5RE-5z`Mww>_3wEtMk<;B_idlre%>&uBqhHg7Zcc9Zg5i*ib=9mQ}A{UXSAsOg> zQ#g)=tgu*6OISx5h9}h|^gEOwj8+|4 zmua2VPchdcsWDMAT!b2OIWGaEDfELA#)AhVrdPC665hEBiNTDX^rrib0`AtVA0zew%+ZBUBzFfwNQx*HT*t&Yd)y76B^=`_Xw literal 2088 zcmcJQPjC}e9LG15mJKKR}tZ5^9%n`))$8Ca*K*l5xz z`cwPMlM_?Q@rh%F5%h~&)%@x-F|ocSAfE3uEF@dnMz%r>%Jsmi5Ca?J?A7o7x$^bO z`&vJrYr0|X#?lXB%6(OU{3Fp50xNM21-< zu1ib9NdTdwKdFZVGs|<`Azc& zbEj7>wl_6`2Uj=6yG?3!o8Tci_Zu6qBkUD%b(7#>IiIQRx^&==ZK7H#vv={x>gIX3 z+Xky(7*w$@UFs3+ zBiOGf%F%z>A%02{#R0uloZcXIElJ&qc$(s%-tnY9WAC=b2A;K<{g8_1V*5jOC|nuB zVJ>_`#V`}L|F4?msuw<)nf-q0YPMSuIf}e48m?QEu=iyoaxHMzqKeVjb<7@S3hiQb zE#P?yS+`RWcbs!4R2+@DCBgmc<1bG4wm!>sD`Jx3m>#_)N`#-{_-Pd{#CTQUXZ&yG zm-f7o>sG{ZiWA{O624S3k-;oCIH^L54PLxGg@1|SWnFxCOsmG4KZ&`>;S_h6S5b}~ zUg>b?&xhT=^$0?t>-LU_YjCcq!iu?-4(`o2L+-6dR4Hsd{>nQM|5eUkP*IEduHc_4 mY#q3OU#iHJ9X8r@}O)!!G diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p index 9ccd6efba706071e54568b11fa8db70fc0c1b2ce..0ba05e8e23b8253c87270e3a6a3e9c5d233b356c 100644 GIT binary patch literal 575 zcmZo*nQFqs00y;FG3G_N$bpi(b6zbI8Nw=}0DGqI>Bv2sce4^TQeKd-o?s5H4` z%H%0MtYC#xdf4+)AW9}r@n&e9;>?&drF}}!6b)}iZ^qUs8C*TADJ7K!sUR&(X%`F19yESNUOwUb>heoXZXSahF?zgx0uoq?IgEjlUVD8}tMpNpr literal 691 zcmZo*t}SHHh+t%3U`Q@xtSw~Hh+qb>6AKEN-5q(Bx*p~=*%rYH5-QG3tSDr0cX+8~ zW|#i7GJ*{(7+;i{R>+DFWe1ApmIi@^*^={0a|RydN-`6RiV`cifRf4i zdBr6~rO72+h3pVjTzM%F*+LF)hSow(XU3#LuJ%Iiph6xEZ$@v%)f?T zz6d6uU1=7D{GA=`g#tl^f*Rh;V4v6&3iCBO&{eU-Rc8Wux zNJ*h+64(a?8JR&qABf>_YH@O6PGS*Pp?HQMT>F7SiMB$?phBrqux*Kj(zS&$8X3&) z4*xp3F8t2@n*j`^yO$dG8CG{@0D}g`WXoXB0Q*fg1L!fiph9`5#}qOIfsW%Uy2_9o z$L3I|SW>8zlp&S@wi7CPpisH3P$j5P6=G*qp_;q>Kh~D02wSxX4q!0kWagF><)@?; zs%J=pqss>z0~+r3B0sivJkIzC7IXm%YP#Eg<34t3%lyM&!4j~bmb-)TXCBXtDmts5#<&n|X@OHmOlk%Xrm@i8+hra-22hD6%onXD<3;?8XH-Np>j3 zx-BVKw^VzC=dSWTQT88q|h4YtRrt)@W0tnKj}~GBTG@ zB-i8yST->fh^*N}AZ|%=yIdNC%}AfbMn1b~s6#3lD#VsaJ=n@$`0zfK?1KW(0&dl{ z7E9GSo$^r5&=pCBASN+T!01KP4kRFM*ivO603z8*ox#EGjV36_k0pYFxXMNU$+c>@ z4MZYPOZ44WzIo=4GHZpzQo|gP2u8Lvh;=X$l{;$ih;A~uD6r@zje9l18g$3w0M*=; zIk-Gx;~v1K9MpV&51`fG<5lUcD+-Sk`wKmtOQp$4WP_HW;VyuCb{QIM;eCw#=&g`yEU0&g3OtKIA*gT%b2QAm@c0zXF{115wkf24P(i| zZbEH?0@T6^4u_R2ubxRFLh-%qeM|trGGF-MI&Mi(!wSW}KJ-;`iTS!KeijBWBYpYI zPi@iW!rMI}lY0E9`37#s;vB0u$N72d5Ui z)Kh?c*>vTdd3W3+JFLl42Q?&xZe$(YePIhuyE4z6JgVJ)ZVYS>L2CV|mZlmDm)^WQ z3)Yw3{nX#*zr3;*+{}(YyzFpk-FXL6Y=+hzP5!xP{x0fj3Wp#W3>_Au#Lz<7paZ$G z;ShrNVcQ1|$W})nnmIf1+38z$wt;Bo=e1XkoIaO!SR8`apq2T}qO0S;;n6~N%d#<+|EgBC6@}1Vo2BQd;0M=GM6$Ty|Cr6-}&6XG90=fn_D#sb?lkdiRo%4bSk|M zc;Bf^NPRoszaLUhZ$l6!Q#Op$ApCPiTfCoL?h)^uue!?k_7lIxuvL{cy6I!MH+ zeA;=PEJAg=n84AV9ur7m@9y!@gA*sl()FU#M|{03IxOKvj3^Ec{Zx><4vgNl^33Ab zK3P&PI&;YNvJ~oZEe1&*hDX4(h3`f@@ZS1VcIDQ^^`bLJTrW$Z9zWu_ZjvEl$$et1 z{y&lX=lNo$UUcTj>t!j_<3}DVRue5Ii3qe^xh!wbcG>n3lkWY{K??$*!!XexzmaQmw*xysVOhLqVCK7R&ke|8S+CKhqV#C%a w)Agb=gZ^y#-a}iz8%o!U`k=@2QVn8D;@kG`c(rXmz!46i?c}8yF>~7g1(*52PXGV_ literal 3798 zcmcInZFn4272dR@q)VWP2&gE^hg}V%sVG+3?rytjCt;gyIw|c64a4m0O=g>&*?DK~ zq)l<4&^FDY<;$YdiY=7-fu+`B{6IdULZu=o7K8$&`ojnMK(&fK6@IAa-pOvZ`t)CN zpC^0oocrGMo_X)N_e|DK4iJfDPm4q%j$7&}6xq@NhoLSzi7crUCS~izz|}d!WF>Ko z9;ju{qMw;5&G229*<8yr+bi$^oT4P-5)jFrLj5vJUyXVtdG-mmf{iIkQp{5eaUSD1 z)v$fb8E7_2E^D^@A}{E!s}DpyLoe!X6b<2gG|wr(D5lB?duAb89@>c0R5ZrYle2Z? zat=<x*Nr5c*9+S(SSJ9U?jB4?B<$f{9COIfnbcm3Yp1*;u$I8zxB=|Jto86BTK$&81~ z$7Y1Ore@+ZO45Do-dAq?M^V0|SLn5Lt%%Pm$$?|>x86AXn$$xa8I$Q;>t!~sD9cPX zTJX8C%@8TE#=)#~co5fE_`J+zxsA5(;7Xbiq;zI5o5p9*m=y;&>mb>S@(jN?74(o)V?^=)!s3Go_6AnC*%RLksRgq9Lx)OML?|%<}1lb55Kzp`9s~( zd8>ugm_@`OSu}Bv*t*5gnh6hvOHp}P(2a#LNnt>dy^c1Pol5H{HJMwW!-n>5Top6J z=_1l50fb{y?`N9FM5ghQi$z0n{UUS($Pm0Lo!Lgm=pNZ5!oy-E@d7!Z=8v8dx8$KS zz!JIc}V$k$$0tE>E~Z;_%+GmVR?Y8 z1o~{j+iO`|0B_#E+q&${kuaP-O0+KoxJH2H#p>JNdFb7#1e$jd{(a=d_f}B&$)jxx zclLB2@x#<|aBYAU(&yFDf6ksUZ&a7T|h;PaHn}+`)4;HW5DY){6Ib9egwH%M@_Tf<-sK9$ufVE!%buwo>qL8_TJf%#@m++Gj%p}(irwhkbaZ(8 z@qHul@#=9G$5(13*erPOR`Jy;@7E@V_v;+@kOZQP2?=zU>DUrrYmElq5V72=;+xf2 zw#itAFI;kH&i&8K9j_kSIqs{`;C{ioL&XDC-klS}`z?-d*Q7x|eQ13rz;|mTcu<7$ zJr%pEp*$o*$vwU@mRz!K&Up3M&GG#j3HAuyAE?+{<$ZW!cz?(-OcIEDNu&Wupovet zWhBLq0{pl}il2y(eyZY;YDhnmA&Cni5;>L_uO5$bJXRyc~Kdd$mGYUNgme)v0JRM*^ z0m^1uIrM2U-Nvs2JVRC`J`#T8Q{k%&!@}qBe4h2=Hvyg%xKLF3o@uKNefgoH;JE<5 zB}nD&{GE{Lc@@8}%5*@=)b#Y9kFQ#HeSExnyuk5d&G!63@V=zt_IVqYH^R)nngh+Fztlv6#U(;3+sWJ>NHboni^Ys9SPbR0|{9n9r B_*4J@ diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat index 368934536e801acf66a8c43e3008adf5ed1bc0d2..eab925d5f9871dd2717dd34e9cdb405dfb567ce7 100644 GIT binary patch literal 105760 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≶bO9o)ciF$^X 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
{P4gz0q3U%p6NX;f2~8V#50{<$E-)L-YGiw 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 z
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 Date: Mon, 18 Jul 2022 14:57:18 -0400 Subject: [PATCH 49/57] added checking to see if nonisothermal parameters are input --- configs/params_system.cfg | 4 ++-- mpet/config/configuration.py | 11 +++++++++++ mpet/config/schemas.py | 20 ++++++++++---------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/configs/params_system.cfg b/configs/params_system.cfg index b5498128..d0b49ea6 100644 --- a/configs/params_system.cfg +++ b/configs/params_system.cfg @@ -133,11 +133,11 @@ G_stddev_a = 0 [Thermal Parameters] # Heat capacity of anode, cathode, electrolyte material in J/(kg*K). cp_c = 700 -cp_l = 700 +cp_s = 700 cp_a = 700 # Mass density of anode, cathode, and electrolyte materialin kg/m^3. rhom_c = 2500 -rhom_l = 1100 +rhom_s = 1100 rhom_a = 2500 # Heat transfer coefficient with the cell separator (W/(m^2*K)) h_h = 2e4 diff --git a/mpet/config/configuration.py b/mpet/config/configuration.py index 794cc70a..da8b9dc6 100644 --- a/mpet/config/configuration.py +++ b/mpet/config/configuration.py @@ -510,6 +510,12 @@ def _scale_electrode_parameters(self): self['cp'][trode] = self['cp'][trode] / \ (self['k_h_ref'] * self['t_ref'] / (self['rho_ref']*self['L_ref']**2)) self['rhom'][trode] = self['rhom'][trode] / self['rho_ref'] + if self['nonisothermal']: + if self['rhom'][trode] == 0 or self['cp'][trode] == 0 or self['k_h'][trode] == 0: + raise Exception( + "Please provide all nonisothermal parameters for the " + + trode + + " electrode and ensure they are nonzero") if self[trode, 'lambda'] is not None: self[trode, 'lambda'] = self[trode, 'lambda'] / kT @@ -527,6 +533,11 @@ def _scale_electrode_parameters(self): self['cp']['s'] = self['cp']['s'] / \ (self['k_h_ref'] * self['t_ref'] / (self['rho_ref']*self['L_ref']**2)) self['rhom']['s'] = self['rhom']['s'] / self['rho_ref'] + if self['nonisothermal']: + if self['rhom']['s'] == 0 or self['cp']['s'] == 0 or self['k_h']['s'] == 0: + raise Exception( + "Please provide all nonisothermal parameters for the " + + " separator and ensure they are nonzero") def _scale_macroscopic_parameters(self, Vref): """ diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py index fa7b6cd8..994875f0 100644 --- a/mpet/config/schemas.py +++ b/mpet/config/schemas.py @@ -114,16 +114,16 @@ def tobool(value): 'BruggExp_c': Use(float), 'BruggExp_a': Use(float), 'BruggExp_s': Use(float)}, - 'Thermal Parameters': {Optional('cp_c', default=1e8): Use(float), - Optional('cp_a', default=1e8): Use(float), - Optional('cp_s', default=1e8): Use(float), - Optional('rhom_c', default=0.2): Use(float), - Optional('rhom_a', default=0.2): Use(float), - Optional('rhom_s', default=0.2): Use(float), - Optional('k_h_c', default=0.2): Use(float), - Optional('k_h_a', default=0.2): Use(float), - Optional('k_h_s', default=0.2): Use(float), - Optional('h_h', default=500): Use(float), + 'Thermal Parameters': {Optional('cp_c', default=0): Use(float), + Optional('cp_a', default=0): Use(float), + Optional('cp_s', default=0): Use(float), + Optional('rhom_c', default=0): Use(float), + Optional('rhom_a', default=0): Use(float), + Optional('rhom_s', default=0): Use(float), + Optional('k_h_c', default=0): Use(float), + Optional('k_h_a', default=0): Use(float), + Optional('k_h_s', default=0): Use(float), + Optional('h_h', default=0): Use(float), Optional('entropy_heat_gen', default=False): Use(tobool)}, 'Electrolyte': {'c0': Use(float), 'zp': Use(int), From 4099edc70607ed63cb0517fb09615c2b71c3b10d Mon Sep 17 00:00:00 2001 From: Dan Cogswell Date: Mon, 18 Jul 2022 16:38:59 -0400 Subject: [PATCH 50/57] Adds config file for nonisothermal LIONSIMBA benchmark. --- configs/params_system_LIONSIMBA.cfg | 2 +- .../params_system_LIONSIMBA_nonisothermal.cfg | 127 ++++++++++++++++++ 2 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 configs/params_system_LIONSIMBA_nonisothermal.cfg diff --git a/configs/params_system_LIONSIMBA.cfg b/configs/params_system_LIONSIMBA.cfg index baa598b5..a0c4811c 100644 --- a/configs/params_system_LIONSIMBA.cfg +++ b/configs/params_system_LIONSIMBA.cfg @@ -102,7 +102,7 @@ num = 1 # Options: dilute, SM elyteModelType = SM # Stefan-Maxwell property set, see props_elyte.py file -SMset = LIONSIMBA_nonisothermal +SMset = LIONSIMBA_isothermal # Reference electrode (defining the electrolyte potential) information: # number of electrons transfered in the reaction, 1 for Li/Li+ n = 1 diff --git a/configs/params_system_LIONSIMBA_nonisothermal.cfg b/configs/params_system_LIONSIMBA_nonisothermal.cfg new file mode 100644 index 00000000..f5b4eed1 --- /dev/null +++ b/configs/params_system_LIONSIMBA_nonisothermal.cfg @@ -0,0 +1,127 @@ +#Cell parameters for nonisothermal benchmark from M. Torchio et al., J. Electrochem. Soc. 163, A1192 (2016). +# See params_system.cfg for parameter explanations. + +[Sim Params] +# Constant voltage or current or segments of one of them +# Options: CV, CC, CCsegments, CVsegments +profileType = CC +# Battery (dis)charge c-rate (only used for CC), number of capacities / hr +# (positive for discharge, negative for charge) +Crate = 1 +#Optional nominal 1C current density for the cell, A/m^2 +1C_current_density = 30 +# Voltage cutoffs, V +Vmax = 5 +Vmin = 2.5 +# Final time (only used for CV), [s] +tend = 1.2e3 +# Number disc. in time +tsteps = 200 +# Numerical Tolerances +relTol = 1e-6 +absTol = 1e-6 +# Temperature, K +T = 298 +nonisothermal = true +# Random seed. Set to true to give a random seed in the simulation +randomSeed = false +# Value of the random seed, must be an integer +seed = 0 +# Series resistance, [Ohm m^2] +Rser = 0. +# Cathode, anode, and separator numer disc. in x direction (volumes in electrodes) +Nvol_c = 10 +Nvol_s = 10 +Nvol_a = 10 +# Number of particles per volume for cathode and anode +Npart_c = 1 +Npart_a = 1 + +[Electrodes] +cathode = params_LiCoO2_LIONSIMBA.cfg +anode = params_LiC6_LIONSIMBA.cfg +# Rate constant of the Li foil electrode, A/m^2 +# Used only if Nvol_a = 0 +k0_foil = 1e0 +# Film resistance on the Li foil, Ohm m^2 +Rfilm_foil = 0e-0 + +[Particles] +# electrode particle size distribution info, m +mean_c = 2e-6 +stddev_c = 0 +mean_a = 2e-6 +stddev_a = 0 +# Initial electrode filling fractions +cs0_c = 0.4995 +cs0_a = 0.8551 + +[Conductivity] +# Simulate bulk cathode conductivity (Ohm's Law)? +simBulkCond_c = true +simBulkCond_a = true +# Dimensional conductivity (used if simBulkCond = true), S/m +sigma_s_c = 412.43 +sigma_s_a = 685.77 +# Simulate particle connectivity losses (Ohm's Law)? +simPartCond_c = false +simPartCond_a = false +# Conductance between particles, S = 1/Ohm +G_mean_c = 1e-14 +G_stddev_c = 0 +G_mean_a = 1e-14 +G_stddev_a = 0 + +[Geometry] +# Thicknesses, m +L_c = 8e-5 +L_a = 8.8e-5 +L_s = 2.5e-5 +# Volume loading percents of active material (volume fraction of solid +# that is active material) +P_L_c = 0.9593 +P_L_a = 0.9367 +# Porosities (liquid volume fraction in each region) +poros_c = 0.385 +poros_a = 0.485 +poros_s = 0.724 +# Bruggeman exponent (tortuosity = porosity^bruggExp) +BruggExp_c = -3 +BruggExp_a = -3 +BruggExp_s = -3 + +[Thermal Parameters] +# Heat capacity of anode, cathode, electrolyte material in J/(kg*K). +cp_c = 700 +cp_s = 700 +cp_a = 700 +# Mass density of anode, cathode, and electrolyte materialin kg/m^3. +rhom_c = 2500 +rhom_s = 1100 +rhom_a = 2500 +# Heat transfer coefficient with the cell separator (W/(m^2*K)) +h_h = 1 +k_h_c = 2.1 +k_h_a = 1.7 +k_h_s = 0.16 +entropy_heat_gen = False + +[Electrolyte] +# Initial electrolyte conc., mol/m^3 +c0 = 1000 +# Cation/anion charge number (e.g. 2, -1 for CaCl_2) +zp = 1 +zm = -1 +# Cation/anion dissociation number (e.g. 1, 2 for CaCl_2) +nup = 1 +num = 1 +# Electrolyte model, +# Options: dilute, SM +elyteModelType = SM +# Stefan-Maxwell property set, see props_elyte.py file +SMset = LIONSIMBA_nonisothermal +# Reference electrode (defining the electrolyte potential) information: +# number of electrons transfered in the reaction, 1 for Li/Li+ +n = 1 +# Stoichiometric coefficient of cation, -1 for Li/Li+ +sp = -1 From e16980b7bd278984f3922d5e3474502f1cfdd0c9 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Mon, 18 Jul 2022 16:51:45 -0400 Subject: [PATCH 51/57] added maximum temperature plot --- bin/mpetplot.py | 1 + mpet/plot/plot_data.py | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/bin/mpetplot.py b/bin/mpetplot.py index 9c416eb3..7f10e3b0 100755 --- a/bin/mpetplot.py +++ b/bin/mpetplot.py @@ -37,6 +37,7 @@ ('bulkp_c','macroscopic cathode solid phase potential(movie)'), ('bulkp_a','macroscopic anode solid phase potential (movie)'), ('temp','temperature of full cell (movie)'), + ('max_temp','maximum temperature of the full cell'), ('text','convert the output to plain text (csv)') ]) diff --git a/mpet/plot/plot_data.py b/mpet/plot/plot_data.py index d36596b4..65cc3b77 100644 --- a/mpet/plot/plot_data.py +++ b/mpet/plot/plot_data.py @@ -300,6 +300,27 @@ def show_data(indir, plot_type, print_flag, save_flag, data_only, vOut=None, pOu fig.savefig("mpet_current.png", bbox_inches="tight") return fig, ax + # Plot maximum temperature profile + if plot_type == "max_temp": + T_sep, T_anode, T_cath = pfx + 'T_lyte_s', pfx + 'T_lyte_a', pfx + 'T_lyte_c' + datay_T = utils.get_dict_key(data, T_cath, squeeze=False) + if config["have_separator"]: + datay_s_T = utils.get_dict_key(data, T_sep, squeeze=False) + datay_T = np.hstack((datay_s_T, datay_T)) + if "a" in trodes: + datay_a_T = utils.get_dict_key(data, T_anode, squeeze=False) + datay_T = np.hstack((datay_a_T, datay_T)) + Tmax = np.max(datay_T * Tref, axis=1) + if data_only: + return times*td, Tmax + fig, ax = plt.subplots(figsize=figsize) + ax.plot(times*td, Tmax) + ax.set_xlabel("Time [s]") + ax.set_ylabel("Maximum Temperature [K]") + if save_flag: + fig.savefig("mpet_max_temp.png", bbox_inches="tight") + return fig, ax + if plot_type == "power": current = utils.get_dict_key(data, pfx + 'current') * (3600/td) * (cap/3600) # in A/m^2 voltage = (Vstd - (k*Tref/e)*utils.get_dict_key(data, pfx + 'phi_applied')) # in V From c6ff344934e5954aef9609536d011f8e2861fe6d Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Mon, 18 Jul 2022 17:00:13 -0400 Subject: [PATCH 52/57] removed sigma_l loading properties --- mpet/config/constants.py | 2 -- mpet/config/parameterset.py | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/mpet/config/constants.py b/mpet/config/constants.py index 2b2f5f97..b89f122b 100644 --- a/mpet/config/constants.py +++ b/mpet/config/constants.py @@ -25,8 +25,6 @@ 'specified_psd', 'rhom', 'cp', 'k_h'] #: subset of ``PARAMS_PER_TRODE``` that is defined for the separator as well PARAMS_SEPARATOR = ['Nvol', 'L', 'poros', 'BruggExp', 'k_h', 'cp', 'rhom'] -# PARAMETERS THAT ARE NEEDED IN A THERMAL MODEL FOR ELECTROLYTE PROPERTIES -PARAMS_ELYTE = ['sigma'] #: parameters that are defined for each particle, and their type PARAMS_PARTICLE = {'N': int, 'kappa': float, 'beta_s': float, 'D': float, 'k0': float, 'Rfilm': float, 'delta_L': float, 'Omega_a': float, 'E_D': float, diff --git a/mpet/config/parameterset.py b/mpet/config/parameterset.py index aa844e21..a4d1556b 100644 --- a/mpet/config/parameterset.py +++ b/mpet/config/parameterset.py @@ -2,7 +2,7 @@ import configparser from mpet.config import schemas -from mpet.config.constants import PARAMS_PER_TRODE, PARAMS_SEPARATOR, PARAMS_ELYTE +from mpet.config.constants import PARAMS_PER_TRODE, PARAMS_SEPARATOR from mpet.exceptions import UnknownParameterError @@ -89,8 +89,6 @@ def __getitem__(self, item): trodes = self['trodes'][:] # make a copy here to avoid adding values to the original if item in PARAMS_SEPARATOR and self['have_separator']: trodes.append('s') - if item in PARAMS_ELYTE: - trodes.append('l') for trode in trodes: # get the value for this electrode/separator and store it key = f'{item}_{trode}' From 0222cc406c01a78be260a8ebe4e8aa3f193424b3 Mon Sep 17 00:00:00 2001 From: Dan Cogswell Date: Mon, 18 Jul 2022 17:14:02 -0400 Subject: [PATCH 53/57] Consistent file name for electrolyte temperature text data. --- mpet/plot/outmat2txt.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mpet/plot/outmat2txt.py b/mpet/plot/outmat2txt.py index f5f9ce77..579d52e8 100644 --- a/mpet/plot/outmat2txt.py +++ b/mpet/plot/outmat2txt.py @@ -47,7 +47,7 @@ elyteiHdr = ("Electrolyte Current Density [A/m^2]\n" + RowsStr + FCStr) elytediviHdr = ("Electrolyte Divergence of Current Density [A/m^3]\n" + RowsStr + CCStr) -tempHdr = ("Temperature [K]\n" + RowsStr + CCStr) +tempHdr = ("Electrolyte Temperature [K]\n" + RowsStr + CCStr) seeDiscStr = "See discData.txt for particle indexing information." partStr = "partTrode{l}vol{j}part{i}_" @@ -266,7 +266,7 @@ def get_trode_str(tr): tempMat = plot_data.show_data( indir, plot_type="temp", print_flag=False, save_flag=False, data_only=True)[1] - np.savetxt(os.path.join(indir, "tempData.txt"), + np.savetxt(os.path.join(indir, "elyteTempData.txt"), tempMat, delimiter=dlm, header=tempHdr) return From f76687a41ae790addbf2d952e1bcfc5a9b83274b Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Tue, 23 Aug 2022 13:21:43 -0400 Subject: [PATCH 54/57] fixed error in discretization --- bin/run_tests.py | 5 ++--- mpet/electrolyte/Doyle96_EC_DMC_1_2.py | 2 +- mpet/electrolyte/Doyle96_EC_DMC_2_1.py | 2 +- mpet/geometry.py | 2 +- mpet/utils.py | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/bin/run_tests.py b/bin/run_tests.py index 0672d932..91d55627 100644 --- a/bin/run_tests.py +++ b/bin/run_tests.py @@ -23,8 +23,7 @@ def run(test_outputs, testDir, tests=None): # Generate a list of tests from the directories in ref_outputs ref_outputs = osp.join(dirDict["suite"],"ref_outputs") _, directories, _ = next(walk(osp.join(ref_outputs))) - tests = directories - tests.sort() + tests = sorted(directories) runInfoAnalyt = { "testAnalytCylDifn": (defs.testAnalytCylDifn, defs.analytCylDifn), @@ -57,7 +56,7 @@ def main(): run(args.output_dir,args.test_dir, args.tests) - return(args) + return (args) if __name__ == "__main__": diff --git a/mpet/electrolyte/Doyle96_EC_DMC_1_2.py b/mpet/electrolyte/Doyle96_EC_DMC_1_2.py index 7254c16c..3be686ae 100644 --- a/mpet/electrolyte/Doyle96_EC_DMC_1_2.py +++ b/mpet/electrolyte/Doyle96_EC_DMC_1_2.py @@ -20,7 +20,7 @@ def sigma(c, T): r4 = 1.3605e-3 r5 = 1.1724e-4 k0 = r1 + r2*c - r3*c**2 + r4*c**3 - r5*c**4 # S/cm - return(100*k0) + return (100*k0) Dref = D(constants.c_ref, 1) diff --git a/mpet/electrolyte/Doyle96_EC_DMC_2_1.py b/mpet/electrolyte/Doyle96_EC_DMC_2_1.py index 44a829a1..ac9cf608 100644 --- a/mpet/electrolyte/Doyle96_EC_DMC_2_1.py +++ b/mpet/electrolyte/Doyle96_EC_DMC_2_1.py @@ -20,7 +20,7 @@ def sigma(c, T): r4 = 1.5094e-3 r5 = 1.6018e-4 k0 = r1 + r2*c - r3*c**2 + r4*c**3 - r5*c**4 # S/cm - return(100*k0) + return (100*k0) Dref = D(constants.c_ref, 1) diff --git a/mpet/geometry.py b/mpet/geometry.py index 91d91603..770b045b 100644 --- a/mpet/geometry.py +++ b/mpet/geometry.py @@ -87,7 +87,7 @@ def get_elyte_disc(Nvol, L, poros, BruggExp, k_h): dxtmp = np.hstack((out["dxvec"][0], out["dxvec"], out["dxvec"][-1])) out["dx"] = dxtmp out["dxd1"] = utils.mean_linear(dxtmp) - out["dxd2"] = utils.mean_linear(out["dxd1"]) # for thermal finite differences + out["dxd2"] = dxtmp[1:-1] # for thermal finite differences # The porosity vector out["porosvec"] = utils.get_asc_vec(poros, Nvol) diff --git a/mpet/utils.py b/mpet/utils.py index a5af1b8a..6843ddbc 100644 --- a/mpet/utils.py +++ b/mpet/utils.py @@ -25,7 +25,7 @@ def mean_harmonic(a): def weighted_harmonic_mean(a, wt): - return((wt[1:]+wt[:-1])/(wt[1:]/a[1:]+wt[:-1]/a[:-1])) + return ((wt[1:]+wt[:-1])/(wt[1:]/a[1:]+wt[:-1]/a[:-1])) def get_cell_Ntot(Nvol): From 234a36d52032d8c2611817283df077bb86ba355f Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Tue, 23 Aug 2022 13:32:16 -0400 Subject: [PATCH 55/57] changed reference solutions for nonisothermal simulations --- .../sim_output/commit.diff | 539 ------------------ .../sim_output/input_dict_anode.p | Bin 1841 -> 1841 bytes .../sim_output/input_dict_cathode.p | Bin 1843 -> 1843 bytes .../sim_output/input_dict_system.p | Bin 3282 -> 3282 bytes .../sim_output/output_data.mat | Bin 105760 -> 105760 bytes .../sim_output/run_info.txt | 4 +- 6 files changed, 2 insertions(+), 541 deletions(-) diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff index d77809ba..8b137891 100644 --- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff +++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff @@ -1,540 +1 @@ -diff --git a/mpet/config/configuration.py b/mpet/config/configuration.py -index b5cebed..794cc70 100644 ---- a/mpet/config/configuration.py -+++ b/mpet/config/configuration.py -@@ -481,7 +481,6 @@ class Config: - self['T'] = self['T'] / constants.T_ref - self['Rser'] = self['Rser'] / self['Rser_ref'] - self['h_h'] = self['h_h'] * self['L_ref'] / self['k_h_ref'] -- self['sigma_l'] = self['sigma_l'] / self['sigma_s_ref'] - if self['Dp'] is not None: - self['Dp'] = self['Dp'] / self['D_ref'] - if self['Dm'] is not None: -diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py -index 856749a..fa7b6cd 100644 ---- a/mpet/config/schemas.py -+++ b/mpet/config/schemas.py -@@ -124,7 +124,6 @@ system = {'Sim Params': {'profileType': lambda x: - Optional('k_h_a', default=0.2): Use(float), - Optional('k_h_s', default=0.2): Use(float), - Optional('h_h', default=500): Use(float), -- Optional('sigma_l', default=500): Use(float), - Optional('entropy_heat_gen', default=False): Use(tobool)}, - 'Electrolyte': {'c0': Use(float), - 'zp': Use(int), -diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py -index baf81b2..c85979a 100644 ---- a/mpet/mod_cell.py -+++ b/mpet/mod_cell.py -@@ -607,7 +607,13 @@ def get_ohmic_heat(c_lyte, T_lyte, phi_lyte, phi_bulk, disc, config, Nvol): - q_ohmic = 0 - - if config["elyteModelType"] == "dilute": -- sigma_l = eps_o_tau[1:-1] * config["sigma_l"] -+ zp, zm, nup, num = config["zp"], config["zm"], config["nup"], config["num"] -+ -+ # Get porosity at cell edges using weighted harmonic mean -+ Dp = eps_o_tau[1:-1] * config["Dp"] -+ Dm = eps_o_tau[1:-1] * config["Dm"] -+ sigma_l = ((nup*zp*Dp + num*zm*Dm)*np.diff(c_edges_int)/dx) - (nup*zp -+ ** 2*Dp + num*zm**2*Dm)/T_mid*c_mid - elif config["elyteModelType"] == "SM": - SMset = config["SMset"] - elyte_function = utils.import_function(config["SMset_filename"], SMset, -diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg -index f72bdc0..5c29169 100644 ---- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg -+++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg -@@ -16,6 +16,7 @@ relTol = 1e-6 - absTol = 1e-6 - T = 323 - randomSeed = false -+nonisothermal = true - seed = 0 - Rser = 0. - Nvol_c = 10 -@@ -74,7 +75,6 @@ h_h = 10 - k_h_c = 2.1 - k_h_a = 1.7 - k_h_s = 0.16 --sigma_l = 500 - entropy_heat_gen = False - - [Electrolyte] -diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff -index 8b13789..d8e49fc 100644 ---- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff -+++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff -@@ -1 +1,418 @@ -+diff --git a/mpet/config/configuration.py b/mpet/config/configuration.py -+index b5cebed..794cc70 100644 -+--- a/mpet/config/configuration.py -++++ b/mpet/config/configuration.py -+@@ -481,7 +481,6 @@ class Config: -+ self['T'] = self['T'] / constants.T_ref -+ self['Rser'] = self['Rser'] / self['Rser_ref'] -+ self['h_h'] = self['h_h'] * self['L_ref'] / self['k_h_ref'] -+- self['sigma_l'] = self['sigma_l'] / self['sigma_s_ref'] -+ if self['Dp'] is not None: -+ self['Dp'] = self['Dp'] / self['D_ref'] -+ if self['Dm'] is not None: -+diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py -+index 856749a..994875f 100644 -+--- a/mpet/config/schemas.py -++++ b/mpet/config/schemas.py -+@@ -114,17 +114,16 @@ system = {'Sim Params': {'profileType': lambda x: -+ 'BruggExp_c': Use(float), -+ 'BruggExp_a': Use(float), -+ 'BruggExp_s': Use(float)}, -+- 'Thermal Parameters': {Optional('cp_c', default=1e8): Use(float), -+- Optional('cp_a', default=1e8): Use(float), -+- Optional('cp_s', default=1e8): Use(float), -+- Optional('rhom_c', default=0.2): Use(float), -+- Optional('rhom_a', default=0.2): Use(float), -+- Optional('rhom_s', default=0.2): Use(float), -+- Optional('k_h_c', default=0.2): Use(float), -+- Optional('k_h_a', default=0.2): Use(float), -+- Optional('k_h_s', default=0.2): Use(float), -+- Optional('h_h', default=500): Use(float), -+- Optional('sigma_l', default=500): Use(float), -++ 'Thermal Parameters': {Optional('cp_c', default=0): Use(float), -++ Optional('cp_a', default=0): Use(float), -++ Optional('cp_s', default=0): Use(float), -++ Optional('rhom_c', default=0): Use(float), -++ Optional('rhom_a', default=0): Use(float), -++ Optional('rhom_s', default=0): Use(float), -++ Optional('k_h_c', default=0): Use(float), -++ Optional('k_h_a', default=0): Use(float), -++ Optional('k_h_s', default=0): Use(float), -++ Optional('h_h', default=0): Use(float), -+ Optional('entropy_heat_gen', default=False): Use(tobool)}, -+ 'Electrolyte': {'c0': Use(float), -+ 'zp': Use(int), -+diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py -+index baf81b2..8644a95 100644 -+--- a/mpet/mod_cell.py -++++ b/mpet/mod_cell.py -+@@ -607,7 +607,21 @@ def get_ohmic_heat(c_lyte, T_lyte, phi_lyte, phi_bulk, disc, config, Nvol): -+ q_ohmic = 0 -+ -+ if config["elyteModelType"] == "dilute": -+- sigma_l = eps_o_tau[1:-1] * config["sigma_l"] -++ zp, zm, nup, num = config["zp"], config["zm"], config["nup"], config["num"] -++ dxd1 = disc["dxd1"] -++ eps_o_tau = disc["eps_o_tau"] -++ -++ # Get concentration at cell edges using weighted mean -++ wt = utils.pad_vec(disc["dxvec"]) -++ c_edges_int = utils.weighted_linear_mean(c_lyte, wt) -++ T_edges_int = utils.weighted_linear_mean(T_lyte, wt) -++ -++ # Get porosity at cell edges using weighted harmonic mean -++ eps_o_tau_edges = utils.weighted_linear_mean(eps_o_tau, wt) -++ Dp = eps_o_tau_edges * config["Dp"] -++ Dm = eps_o_tau_edges * config["Dm"] -++ sigma_l = ((nup*zp*Dp + num*zm*Dm)*np.diff(c_lyte)/dxd1) - (nup*zp -++ ** 2*Dp + num*zm**2*Dm)/T_edges_int*c_edges_int -+ elif config["elyteModelType"] == "SM": -+ SMset = config["SMset"] -+ elyte_function = utils.import_function(config["SMset_filename"], SMset, -+diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg -+index f72bdc0..5c29169 100644 -+--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg -++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg -+@@ -16,6 +16,7 @@ relTol = 1e-6 -+ absTol = 1e-6 -+ T = 323 -+ randomSeed = false -++nonisothermal = true -+ seed = 0 -+ Rser = 0. -+ Nvol_c = 10 -+@@ -74,7 +75,6 @@ h_h = 10 -+ k_h_c = 2.1 -+ k_h_a = 1.7 -+ k_h_s = 0.16 -+-sigma_l = 500 -+ entropy_heat_gen = False -+ -+ [Electrolyte] -+diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff -+index 8b13789..706c81d 100644 -+--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff -++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff -+@@ -1 +1,268 @@ -++diff --git a/mpet/config/configuration.py b/mpet/config/configuration.py -++index b5cebed..cda04bf 100644 -++--- a/mpet/config/configuration.py -+++++ b/mpet/config/configuration.py -++@@ -481,7 +481,10 @@ class Config: -++ self['T'] = self['T'] / constants.T_ref -++ self['Rser'] = self['Rser'] / self['Rser_ref'] -++ self['h_h'] = self['h_h'] * self['L_ref'] / self['k_h_ref'] -++- self['sigma_l'] = self['sigma_l'] / self['sigma_s_ref'] -+++ #if self['nonisothermal']: -+++ # if self['h_h'] == 0: -+++ # raise Exception("Please provide all nonisothermal parameters for " + trode + " and ensure they are nonzero") -+++ -++ if self['Dp'] is not None: -++ self['Dp'] = self['Dp'] / self['D_ref'] -++ if self['Dm'] is not None: -++@@ -511,6 +514,10 @@ class Config: -++ self['cp'][trode] = self['cp'][trode] / \ -++ (self['k_h_ref'] * self['t_ref'] / (self['rho_ref']*self['L_ref']**2)) -++ self['rhom'][trode] = self['rhom'][trode] / self['rho_ref'] -+++ #if self['nonisothermal']: -+++ # if self['k_h'][trode] == 0 or self['cp'][trode] == 0 or self['rhom'][trode] == 0: -+++ # raise Exception("Please provide all nonisothermal parameters for " + trode + " and ensure they are nonzero") -+++ -++ -++ if self[trode, 'lambda'] is not None: -++ self[trode, 'lambda'] = self[trode, 'lambda'] / kT -++@@ -528,6 +535,10 @@ class Config: -++ self['cp']['s'] = self['cp']['s'] / \ -++ (self['k_h_ref'] * self['t_ref'] / (self['rho_ref']*self['L_ref']**2)) -++ self['rhom']['s'] = self['rhom']['s'] / self['rho_ref'] -+++ #if self['nonisothermal']: -+++ # if self['rhom']['s'] == 0 or self['cp']['s'] == 0 or self['rhom']['s'] == 0: -+++ # raise Exception("Please provide all nonisothermal parameters for the separator and ensure they are nonzero") -+++ -++ -++ def _scale_macroscopic_parameters(self, Vref): -++ """ -++diff --git a/mpet/config/schemas.py b/mpet/config/schemas.py -++index 856749a..994875f 100644 -++--- a/mpet/config/schemas.py -+++++ b/mpet/config/schemas.py -++@@ -114,17 +114,16 @@ system = {'Sim Params': {'profileType': lambda x: -++ 'BruggExp_c': Use(float), -++ 'BruggExp_a': Use(float), -++ 'BruggExp_s': Use(float)}, -++- 'Thermal Parameters': {Optional('cp_c', default=1e8): Use(float), -++- Optional('cp_a', default=1e8): Use(float), -++- Optional('cp_s', default=1e8): Use(float), -++- Optional('rhom_c', default=0.2): Use(float), -++- Optional('rhom_a', default=0.2): Use(float), -++- Optional('rhom_s', default=0.2): Use(float), -++- Optional('k_h_c', default=0.2): Use(float), -++- Optional('k_h_a', default=0.2): Use(float), -++- Optional('k_h_s', default=0.2): Use(float), -++- Optional('h_h', default=500): Use(float), -++- Optional('sigma_l', default=500): Use(float), -+++ 'Thermal Parameters': {Optional('cp_c', default=0): Use(float), -+++ Optional('cp_a', default=0): Use(float), -+++ Optional('cp_s', default=0): Use(float), -+++ Optional('rhom_c', default=0): Use(float), -+++ Optional('rhom_a', default=0): Use(float), -+++ Optional('rhom_s', default=0): Use(float), -+++ Optional('k_h_c', default=0): Use(float), -+++ Optional('k_h_a', default=0): Use(float), -+++ Optional('k_h_s', default=0): Use(float), -+++ Optional('h_h', default=0): Use(float), -++ Optional('entropy_heat_gen', default=False): Use(tobool)}, -++ 'Electrolyte': {'c0': Use(float), -++ 'zp': Use(int), -++diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py -++index baf81b2..8644a95 100644 -++--- a/mpet/mod_cell.py -+++++ b/mpet/mod_cell.py -++@@ -607,7 +607,21 @@ def get_ohmic_heat(c_lyte, T_lyte, phi_lyte, phi_bulk, disc, config, Nvol): -++ q_ohmic = 0 -++ -++ if config["elyteModelType"] == "dilute": -++- sigma_l = eps_o_tau[1:-1] * config["sigma_l"] -+++ zp, zm, nup, num = config["zp"], config["zm"], config["nup"], config["num"] -+++ dxd1 = disc["dxd1"] -+++ eps_o_tau = disc["eps_o_tau"] -+++ -+++ # Get concentration at cell edges using weighted mean -+++ wt = utils.pad_vec(disc["dxvec"]) -+++ c_edges_int = utils.weighted_linear_mean(c_lyte, wt) -+++ T_edges_int = utils.weighted_linear_mean(T_lyte, wt) -+++ -+++ # Get porosity at cell edges using weighted harmonic mean -+++ eps_o_tau_edges = utils.weighted_linear_mean(eps_o_tau, wt) -+++ Dp = eps_o_tau_edges * config["Dp"] -+++ Dm = eps_o_tau_edges * config["Dm"] -+++ sigma_l = ((nup*zp*Dp + num*zm*Dm)*np.diff(c_lyte)/dxd1) - (nup*zp -+++ ** 2*Dp + num*zm**2*Dm)/T_edges_int*c_edges_int -++ elif config["elyteModelType"] == "SM": -++ SMset = config["SMset"] -++ elyte_function = utils.import_function(config["SMset_filename"], SMset, -++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg -++index f72bdc0..5c29169 100644 -++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg -+++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg -++@@ -16,6 +16,7 @@ relTol = 1e-6 -++ absTol = 1e-6 -++ T = 323 -++ randomSeed = false -+++nonisothermal = true -++ seed = 0 -++ Rser = 0. -++ Nvol_c = 10 -++@@ -74,7 +75,6 @@ h_h = 10 -++ k_h_c = 2.1 -++ k_h_a = 1.7 -++ k_h_s = 0.16 -++-sigma_l = 500 -++ entropy_heat_gen = False -++ -++ [Electrolyte] -++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff -++index 8b13789..c406ea3 100644 -++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff -+++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff -++@@ -1 +1,92 @@ -+++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg -+++index f72bdc0..5c29169 100644 -+++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg -++++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg -+++@@ -16,6 +16,7 @@ relTol = 1e-6 -+++ absTol = 1e-6 -+++ T = 323 -+++ randomSeed = false -++++nonisothermal = true -+++ seed = 0 -+++ Rser = 0. -+++ Nvol_c = 10 -+++@@ -74,7 +75,6 @@ h_h = 10 -+++ k_h_c = 2.1 -+++ k_h_a = 1.7 -+++ k_h_s = 0.16 -+++-sigma_l = 500 -+++ entropy_heat_gen = False -+++ -+++ [Electrolyte] -+++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff -+++index 8b13789..76248ff 100644 -+++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff -++++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/commit.diff -+++@@ -1 +1,13 @@ -++++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg -++++index f72bdc0..dfb8777 100644 -++++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg -+++++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/params_system.cfg -++++@@ -16,6 +16,7 @@ relTol = 1e-6 -++++ absTol = 1e-6 -++++ T = 323 -++++ randomSeed = false -+++++nonisothermal = true -++++ seed = 0 -++++ Rser = 0. -++++ Nvol_c = 10 -+++ -+++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt -+++index 5b8dc25..7320f92 100644 -+++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt -++++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt -+++@@ -10,7 +10,8 @@ -+++ "printInfo": "false", -+++ "nodes": { -+++ "useNodeMemoryPools": "false", -+++- "deleteNodesThreshold": "1000000" -++++ "deleteNodesThreshold": "1000000", -++++ "significantDecimalsForConstantsHash": "10" -+++ }, -+++ "equations": { -+++ "info": [ -+++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p -+++index 4bd86ab..1af2113 100644 -+++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p differ -+++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p -+++index 73014a3..da9df05 100644 -+++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p differ -+++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p -+++index 9ccd6ef..4b126b3 100644 -+++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p differ -+++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p -+++index df48508..fcb64ff 100644 -+++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p differ -+++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat -+++index 3689345..9a21ede 100644 -+++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat differ -+++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt -+++index ad28d23..73fa61f 100644 -+++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt -++++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt -+++@@ -1,11 +1,11 @@ -+++ mpet version: -+++-0.1.7 -++++0.1.8 -+++ -+++ branch name: -+++ feature/temperature_effects -+++ -+++ commit hash: -+++-ad7fe99 -++++b4feee4 -+++ -+++ to run, from the root repo directory, copy relevant files there, -+++ edit input_params_system.cfg to point to correct material -+++@@ -14,4 +14,4 @@ $ git checkout [commit hash] -+++ $ patch -p1 < commit.diff: -+++ $ python[3] mpetrun.py input_params_system.cfg -+++ -+++-Total run time: 0.6181278228759766 s -++++Total run time: 0.6214299201965332 s -++ -++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt -++index 5b8dc25..7320f92 100644 -++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt -+++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt -++@@ -10,7 +10,8 @@ -++ "printInfo": "false", -++ "nodes": { -++ "useNodeMemoryPools": "false", -++- "deleteNodesThreshold": "1000000" -+++ "deleteNodesThreshold": "1000000", -+++ "significantDecimalsForConstantsHash": "10" -++ }, -++ "equations": { -++ "info": [ -++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p -++index 4bd86ab..8516ece 100644 -++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p differ -++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p -++index 73014a3..fdd7046 100644 -++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p differ -++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p -++index 9ccd6ef..4b126b3 100644 -++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p differ -++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p -++index df48508..b042b1d 100644 -++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p differ -++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat -++index 3689345..6c6ae31 100644 -++Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat differ -++diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt -++index ad28d23..5675ed3 100644 -++--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt -+++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt -++@@ -1,11 +1,11 @@ -++ mpet version: -++-0.1.7 -+++0.1.8 -++ -++ branch name: -++ feature/temperature_effects -++ -++ commit hash: -++-ad7fe99 -+++b4feee4 -++ -++ to run, from the root repo directory, copy relevant files there, -++ edit input_params_system.cfg to point to correct material -++@@ -14,4 +14,4 @@ $ git checkout [commit hash] -++ $ patch -p1 < commit.diff: -++ $ python[3] mpetrun.py input_params_system.cfg -++ -++-Total run time: 0.6181278228759766 s -+++Total run time: 0.6859793663024902 s -+ -+diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt -+index 5b8dc25..7320f92 100644 -+--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt -++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt -+@@ -10,7 +10,8 @@ -+ "printInfo": "false", -+ "nodes": { -+ "useNodeMemoryPools": "false", -+- "deleteNodesThreshold": "1000000" -++ "deleteNodesThreshold": "1000000", -++ "significantDecimalsForConstantsHash": "10" -+ }, -+ "equations": { -+ "info": [ -+diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p -+index 4bd86ab..a075d48 100644 -+Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p differ -+diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p -+index 73014a3..e831718 100644 -+Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p differ -+diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p -+index 9ccd6ef..0ba05e8 100644 -+Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p differ -+diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p -+index df48508..2fe54a4 100644 -+Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p differ -+diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat -+index 3689345..f858082 100644 -+Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat differ -+diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt -+index ad28d23..09df22b 100644 -+--- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt -++++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt -+@@ -1,11 +1,11 @@ -+ mpet version: -+-0.1.7 -++0.1.8 -+ -+ branch name: -+ feature/temperature_effects -+ -+ commit hash: -+-ad7fe99 -++b4feee4 -+ -+ to run, from the root repo directory, copy relevant files there, -+ edit input_params_system.cfg to point to correct material -+@@ -14,4 +14,4 @@ $ git checkout [commit hash] -+ $ patch -p1 < commit.diff: -+ $ python[3] mpetrun.py input_params_system.cfg -+ -+-Total run time: 0.6181278228759766 s -++Total run time: 0.6945881843566895 s - -diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt -index 5b8dc25..7320f92 100644 ---- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt -+++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/daetools_config_options.txt -@@ -10,7 +10,8 @@ - "printInfo": "false", - "nodes": { - "useNodeMemoryPools": "false", -- "deleteNodesThreshold": "1000000" -+ "deleteNodesThreshold": "1000000", -+ "significantDecimalsForConstantsHash": "10" - }, - "equations": { - "info": [ -diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p -index 4bd86ab..fd6b7e2 100644 -Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p differ -diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p -index 73014a3..c2013e4 100644 -Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p differ -diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p -index 9ccd6ef..0ba05e8 100644 -Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_derived_values.p differ -diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p -index df48508..81ca781 100644 -Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p differ -diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat -index 3689345..3e26338 100644 -Binary files a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat and b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat differ -diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt -index ad28d23..80c55f3 100644 ---- a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt -+++ b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/run_info.txt -@@ -1,11 +1,11 @@ - mpet version: --0.1.7 -+0.1.8 - - branch name: - feature/temperature_effects - - commit hash: --ad7fe99 -+b4feee4 - - to run, from the root repo directory, copy relevant files there, - edit input_params_system.cfg to point to correct material -@@ -14,4 +14,4 @@ $ git checkout [commit hash] - $ patch -p1 < commit.diff: - $ python[3] mpetrun.py input_params_system.cfg - --Total run time: 0.6181278228759766 s -+Total run time: 0.6275632381439209 s diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_anode.p index aeadb8593b024d27482c93e2176805a4eb8fee9d..d827e26dc7181d834401393dda7cc49f31c5c21a 100644 GIT binary patch delta 33 pcmdnUw~=py4dY}NMh#XL*RquG&6$iDEQ}J96Ihite_^#{1OTWc36TH* delta 33 pcmdnUw~=py4I?XyYgtP8WJ^Zv%{h#zER2$q6Ihite_^#{1OTU!35oy! diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_cathode.p index 13a6ee29957f77b566f0aca843d09ef67f371070..9539343bf004ad0149fb079eb1e20025f7de3597 100644 GIT binary patch delta 33 pcmdnYx0!E)9phv-Mh#XL*RquG&Do3@EQ}J93s__}e_(ZH1OTah38nx5 delta 33 pcmdnYx0!E)9V07?YgtP8WNSw4&3TNeER2$q3s__}e_(ZH1OTYt37-G} diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/input_dict_system.p index 9769ab4aa8a219c1f12eeb840ba5b09b0d9b51f1..c254b864c94b3da393f610d8f93c72c3a1b3f385 100644 GIT binary patch delta 69 zcmca4c}a4^G)4>d RG^K|*H?d^O=5vfJ+yM3L6}A8X delta 69 zcmca4c}a4^G)4=al*E$6pwxo=qLS32DLu@&i6v8dSWAi$a|@=pGeAKPdvaodTTx>2 P6nFa%5V6hY7+JUhS0xp; diff --git a/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat b/tests/ref_outputs/benchmark_LIONSIMBA_nonisothermal_with_heat_gen/sim_output/output_data.mat index eab925d5f9871dd2717dd34e9cdb405dfb567ce7..532c4c343656c42a7b1b199a87356a6e3c0c2cd9 100644 GIT binary patch literal 105760 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 R{HcHZsek;b|Nr|_{|g%|I|~2+ literal 105760 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≶bO9o)ciF$^X zNqmph?=N82(+j4Dri;7Y^}wXfBeO_Cfp^<@w``W}2Dx$1xAe^&Q0Z%?(8S#ad0aEJ z^`lLoBb;E~H2Drpbr=+yHa@y*j$d z_IdqS$RF|FJpcXCS1ml}{6k;mzB~U#AzokG{o(ZMalD;c9k$#P>ol<5U+^^6smdN+ z`}bI^;%+5C$SVx5kLZ><%>@#Yq6a^?fpX<|dxty@^9-4EO^-N8D2@0!2a zOr;yd#s=-iu}-6|HZ0TF*#?0voS#j;H-X~y(2;{b-@$C%y95W9Dk$#jb~=xBnj!wN zjSt7$^zOr9c37vX^xG~-<9KuCD1E&VukV44|8M-Am;bu2`YSL0)K}T(rE0MzA190( zMvg3rv?9`KVHM9$+LGgRC34f8j%1k@19R7TXHtGUU4P@a3wgZMWv{HFD^bg1KcK7W zO2m%W#_rtXN=A>#h_B{xB}Z4=HRZ~ykOJ(dqQj48u z-4#xdq0j5)^f>)V@w?THyBJTC+?ibu+9QKW#^-tSsb>KsF3K{KBjf~$P|=o_>hvTI zg{OY4*yKgl8*M02DeGkH3-cZ$A+e^`g? z9qUbW*`-Sc?)7yar`98D*EM=wexOfk#3BMBU5!YxnQs3sYBTcTjPsso8%t6fI(l@K z)o~(gAQ``!)ruHOkzb=NW~5-`lj`MtCggmhfpT=T5s_glru$rHM5HdhWh;GQNFIL8 zSYh?I_&YEEbzk*YUjC`Cy1DDQzQn^(7*d(*bm|-dG4W#6q|d|feD7Hz^?3-wnQmY5 z8yJM3TtS~h^#d?WTeaK$Wk1}Qv1e<(-v=raToXK(dLe$}<+G1Y^?-3>{&4DX3iyt^ zXiE0)0!98~XZxnxLH*;3&;XWJP|TV^jJud+tJ>%lbjGBcI#B*pWVik)NC2w|yFd*$cLNnbD!ROS+)5ZUDZyb4AbP^~34=Mf(iV5$lxCb_*R_0{lbP zqvI`CnZ+`6c$mISIsTGX(?fAfbyAfV(v3B3%T@QE6+o>b< zD&R_mmXQ)VXdaJ$YgnF#=K+o-m7_z8`C33MI({^awVXr8;<(_@b_mh0LkHK?{-jSG zBQWv!%FZ?Dh|O~`yNV8$omSly{ew`I8zU8ij;HgXqL0w=*uJlB>F>I7NwfxZJfz-y z@kvk*zAt5Fj<%*iOlWZ6oKF`}=Lkv0d~Am^=RZpCTGNX2phXdMiH)$@)?={Ls~%Vi z9~s2yRzSd|)47wp#X$ME6~fW6bEG@sBsy+9H_7ux$3Xwar@`o092Xpu6BY?q(J}FJ zT=g+JdY6B7Df%=FSNk_h%AjM}RrVfxbZq0uHQ$a7dy3)2espBL{?-_EuMhb6o-r54 z^#T`r?i?RFvi7qa|7=Bp21~Uq=e@gN*taUTV6q)dzY5%HSltS}TLjHiZZ^WSm(+t! z4;&w-s0EdDDxlxjzc~OMQrFbWcc7y-K51qHIx775eRa?gytO;T4;_o+f}_o7eY_Sr zvaEvB4bkDGbMxdebiBJ};avZ52uwI;Wj^%{!m6l#-iNgV&_3gL>p9*yrVpN6_wz2! z@0{AvybT?;d*5gVoa}+Pq}|y<=y(&$a4_4e3)T*{S$a*h1MSJ~%%Q z;<(@lG@bhS^ZqClo__8*-97@s_hP;dejJ9^o)g#9&_QXFJa2{$%joRo^yny%P=2)< z9rqjCm#U*<3FlK5``BLKm}MA93+#berP)35mJ|?OF+dgU(FI*`SDrr|Z3nJ~v8jX0 zTX8@7^sgk`Cm>`O1XrBv;bfG<^$g7lkmc2~l14{_WS1%zIv#P;zNAIRFR7#4U(Q6s zJHbtrmgra<7aVjG9%kX2v%rk0A$T&y>yylD7+K%(5QNX12X8 zIamS5O`c?*+*}M}CqE?DQs=>LuQ~VR$#l@Y=`7BTjzZ&584+|Wjth=wbhF*-(QzOo zds#~B2pkPs#=mEB7-%?;q^N$t_i@f&)j4p#m&ZwZn()d2@OO%h)6T+qb%w9p21$Kj zO1qX(FtQgy#jk8$=Gy~urjbscOeoMLD5q9`ybBm6-)tyuYlp}RwzBk3xSvO4>SJ0! zBU~ulzd;iBL9k6H?)Fux0FFyXL7%%ARC`$Jo0sN+)JV#qo3LmQyQ#B| z6CI1=zj^-qqpw-4C4a`6z>>7(-bL(=9Hkc^?He&XB( z?vZsFcl+C67UkJk7a+17(X3pKZcdIco^*tVh=>$GCuK@|$t zshunLrhKf^Zp!@gV7$Kil~*pPU|t*-#ou}PuluUM^72o8mB8z$rUO>C#8g|;a@_Ga zVHwsAF;cWA&(F+TXT>^^Zsn_`38^l`pNWAz=(sD{6F&FWAkmea9KF+$bIX-%+BYQg z@uVv`Vz%rC061iF*!e0Ce{FL{!$F{gD)m-&$6 z75Cojas-l_eUk;tD^HOong)wYTqnuOri36fMPG7QNaEY$aWBGW7UGqf>PdEMy;I5V z@FY$dm*d{A^dtpRA++Iti~lA+fAm#<<>#OJs&SU|FhP15BEROCd0(?6@&B5icRc3+ zF&kO7zU7K6850!PFu75lY#xiazM41$D?mNPMnQ?3+xMn1D?*LTNt+*->DD5go^{7wsu&Za z_8jBOrIy5?_oHWlyE%#Pni^d~XH44pLuy+^42VQ%#=6omW71gaO-G;PK*rpMwlkHu zV7}?;xdeS27SypTzRPm~AT>@eU`E%arlI?ZpE{a^%CH|*>T;z??B|S?%YCm7D zN8Ebj%emzBNeHdp%2OVOzCa9z$V($zE}c}zF7eux;8NAqma1HwjRoTGAgq=^wZZKi&9GR}}BY>|*W(lY`4yZ{RwuQEsbu!-?IHo3#_y+IK?w zt`uWF$2Q<^r0S;r(LhIEr&;Lu-4X#MxC-4IP2^E87LpanGYi zl@T5HgR(YJJG6mu42!9YbTcHzGzR$K{>}r%QY@MsHBjo4!_SEhvPSB;5IU3&4Y)F) zW5Q5oxfeQ8)=4+|p(Fh65BFc4cz<6M7aSs#XuBooh^c6w+KvwDTn3x&$HVa8o`0eZ zI;0H!RrjI8)6SY&5FHNjDLQoMFsA8$^=W4xB-iXJNJK|@r0RuPTyK_Hb)nTgp&RnU zvgHN%Iw6KIly=#*L1w0(2latwSfBZT2>3OC-of+neC;(bp^|(pXGa;RRF8?zd%Xtk zcl&Qq;_$mhA?*b+=%`xpCd(Eb>Z z{OBFH%#9AU6+MX`LI=TCG)SoZ_yFkg#ad*l^aE?=0LK+{_?Z2;wGSO#`LYe+=y_3%*4*eky`J3p-)H00v8k!EQ7hT;BqvOys>#=EcERG9~;ztJ@W6^PKuSw>8bVQ_3 zybhwHY?*@I>x3b=rf)xT4jtYX-zPewV{KzAtt>ihRZS&0(D7p0xFnmY7gTJ9E`P=K zW|t^yEtqb01N}GoZ}M9^A@sHIE8gR6aPsP0pZT6E*f z$Ktr)u$|bq+zlO+XVFhJ(NSo5uCq9O80>@?2U*ZD3Y{*w!GjQd`~5_a)d2Rrwc5Lt z`oUDkVB^^KJ}7c_5I0~%N6NluM{zyU_fol)l*`?Cemk#k7H21no|Y@|G;V_|m1-x0 zoy~CZ@y*jK9U9=%oR3XHbq$o!F*WdQD}y&&45N7-uOT($NKtB!3@hU+(#=!q5u|qsw!*;QGH?mQmU3E_TCam+)u} zcKqFq9*9}5-v*U)OmrW&HAA_qmH&?84bY=EZzoq?15Sri3?FPQ1I~!<-M`#l!_G$+ z{Kukm!ElvSA1gXi-Mn?R(c$QxW}kzO#c{#mOeNKCjE+60-t3@52OG;&i$>ZoK$CKT z?~Ngt)DC<4^VA@0&3dYM-vawX9ly`}6#9X4(&)uIKAg|^;LF9j8Xdp9XDV^s+&vnj zH?#bE-8t&rEd`H`GU&yTVd+ufsa^KURVb%b{kDv7!l+*y%8}^ndo-zoj zu@DqM$9aQmtQ*krwES+c_~~@uo)8?RK}U+6(t&&ESR5A|)}`jfxsjtFdv>3K>Z1|h zYluJTo;nQ7%6wgCt`C97hL!KE-Amftq(42lsQsB z*9#lNAFfjWK!I!Zoe7Q+-7r8SqOpUi69Tw5DBe?VgBN^`%CsArA#;_;iyMY`uE14M z_K|`b@V@uq_R7s=Q2cGm7~Eb%n8ke#k*HjFxp8UjzEkP2RXHUg{a7@-NH01UjgH0f z-#q{Q(N`@z=lnxorQ6cGb`6fVt0ks%-FSV+T6PV}V4Ws>&kYa7I;Dy^aCak)x3X%5 zq*koc07ur#!C0r)uBfzm?C82n|VWQe|-?+&Ay<8klq? z8+&GV-5hl#X@!|VrHXE(aYUq9Pt=`I6sVRbHF=QdoOf5Byl{f7VTqLpJmW_s`s7QO zWt=2Ck`GFXvj-BcJ+H6wYT!zKAvGqdpI$^weLCNt*Nglr&=N?q@+6`de3Or1vv!^F|D)@(gOpXX!z&ee>Vb`@Oi zNHisnPEQNEs%Vo!P=4Y^txIao@21^NrBBoY9CaIsG4WPD((y~gfv9|U6BF)pA@NlA zR?heQC;ppp^+#VN_Ge#pXmrzTR
{P4gz0q3U%p6NX;f2~8V#50{<$E-)L-YGiw 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 z
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 Date: Mon, 30 Jan 2023 14:42:26 +0100 Subject: [PATCH 56/57] Make error more verbose when tests fail on calculating difference with reference output --- tests/compare_tests.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/compare_tests.py b/tests/compare_tests.py index 6bf675cf..e80afff2 100644 --- a/tests/compare_tests.py +++ b/tests/compare_tests.py @@ -53,10 +53,10 @@ def test_compare(Dirs, tol): varDataNew = newData[varKey][...] varDataRef = refData[varKey][...] diffMat = np.abs(varDataNew - varDataRef) - except ValueError: - assert False, "Fail from ValueError" - except KeyError: - assert False, "Fail from KeyError" + except ValueError as exception: + assert False, "Fail from ValueError: %s" % exception + except KeyError as exception: + assert False, "Fail from KeyError: %s" % exception # #Check absolute and relative error against tol assert np.mean(diffMat) < tol or \ From 3880d4dc8bf5228f0ab97cf1046a7f4c7405c2a6 Mon Sep 17 00:00:00 2001 From: Debbie Zhuang Date: Fri, 3 Feb 2023 14:52:02 -0500 Subject: [PATCH 57/57] reverted to changes with the temperature ghost points --- mpet/mod_cell.py | 17 ++++++++++++++--- mpet/sim.py | 2 ++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/mpet/mod_cell.py b/mpet/mod_cell.py index bec77c84..7e7a68ec 100644 --- a/mpet/mod_cell.py +++ b/mpet/mod_cell.py @@ -118,6 +118,10 @@ def __init__(self, config, Name, Parent=None, Description=""): self.c_lyteGP_L = dae.daeVariable("c_lyteGP_L", conc_t, self, "c_lyte left BC GP") self.phi_lyteGP_L = dae.daeVariable( "phi_lyteGP_L", elec_pot_t, self, "phi_lyte left BC GP") + self.T_lyteGP_L = dae.daeVariable( + "T_lyteGP_L", temp_t, self, "T_lyte left BC GP") + self.T_lyteGP_R = dae.daeVariable( + "T_lyteGP_R", temp_t, self, "T_lyte left BC GP") self.phi_applied = dae.daeVariable( "phi_applied", elec_pot_t, self, "Overall battery voltage (at anode current collector)") @@ -338,7 +342,7 @@ def DeclareEquations(self): # Ghost points on the left and no-gradients on the right ctmp = np.hstack((self.c_lyteGP_L(), cvec, cvec[-1])) # temperature uses a constant boundary condition - Ttmp = np.hstack((config["T"], Tvec, config["T"])) + Ttmp = np.hstack((self.T_lyteGP_L(), Tvec, self.T_lyteGP_R())) phitmp = np.hstack((self.phi_lyteGP_L(), phivec, phivec[-1])) Nm_edges, i_edges, q_edges = get_lyte_internal_fluxes(ctmp, phitmp, Ttmp, disc, @@ -377,6 +381,12 @@ def DeclareEquations(self): eqC.Residual = ctmp[0] - ctmp[1] eqP.Residual = phitmp[0] - phitmp[1] + # boundary equation for temperature variables. per volume + eqTL = self.CreateEquation("GhostPointT_L") + eqTR = self.CreateEquation("GhostPointT_R") + eqTL.Residual = Ttmp[0] - config["T"] + eqTR.Residual = Ttmp[-1] - config["T"] + dvgNm = np.diff(Nm_edges)/disc["dxvec"] dvgi = np.diff(i_edges)/disc["dxvec"] dvgq = np.diff(q_edges)/disc["dxvec"] @@ -551,8 +561,9 @@ def get_lyte_internal_fluxes(c_lyte, phi_lyte, T_lyte, disc, config, Nvol): Dm = eps_o_tau_edges * config["Dm"] Nm_edges_int = num*(-Dm*np.diff(c_lyte)/dxd1 - Dm/T_edges_int*zm*c_edges_int*np.diff(phi_lyte)/dxd1) - i_edges_int = (-((nup*zp*Dp + num*zm*Dm)*np.diff(c_lyte)/dxd1) - (nup*zp - ** 2*Dp + num*zm**2*Dm)/T_edges_int*c_edges_int*np.diff(phi_lyte)/dxd1) + i_edges_int = (-((nup*zp*Dp + num*zm*Dm)*np.diff(c_lyte)/dxd1) + - (nup*zp**2*Dp + num*zm**2*Dm)/T_edges_int + * c_edges_int*np.diff(phi_lyte)/dxd1) elif config["elyteModelType"] == "SM": SMset = config["SMset"] elyte_function = utils.import_function(config["SMset_filename"], SMset, diff --git a/mpet/sim.py b/mpet/sim.py index bdc3b075..9fc31eed 100644 --- a/mpet/sim.py +++ b/mpet/sim.py @@ -118,6 +118,8 @@ def SetUpVariables(self): if not self.m.SVsim: self.m.c_lyteGP_L.SetInitialGuess(config["c0"]) self.m.phi_lyteGP_L.SetInitialGuess(0) + self.m.T_lyteGP_L.SetInitialGuess(config["T"]) + self.m.T_lyteGP_R.SetInitialGuess(config["T"]) # Separator electrolyte initialization if config["have_separator"]: