Skip to content

Commit

Permalink
Merge pull request #873 from viviantran27/develop
Browse files Browse the repository at this point in the history
#872 added ambient temperature
  • Loading branch information
valentinsulzer authored Mar 9, 2020
2 parents 6ff39b9 + e6c877b commit a9b1081
Show file tree
Hide file tree
Showing 40 changed files with 424 additions and 143 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ htmlcov/
pyproject.toml

# virtual enviroment
env/
venv/
venv3.5/
PyBaMM-env/
Expand Down
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
# [Unreleased](https://github.com/pybamm-team/PyBaMM)
## Features

- Add ambient temperature as a function of time ([#872](https://github.com/pybamm-team/PyBaMM/pull/872))

## Bug fixes

Expand Down
312 changes: 248 additions & 64 deletions examples/notebooks/create-model.ipynb

Large diffs are not rendered by default.

52 changes: 52 additions & 0 deletions examples/scripts/DFN_ambient_temperature.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#
# Example showing how to load and solve the DFN
#

import pybamm
import numpy as np

pybamm.set_logging_level("DEBUG")


# load model
options = {"thermal": "x-lumped"}
model = pybamm.lithium_ion.DFN(options)

# create geometry
geometry = model.default_geometry

# load parameter values and process model and geometry


def ambient_temperature(t):
return 300 + t * 100 / 3600


param = model.default_parameter_values
param.update(
{"Ambient temperature [K]": ambient_temperature}, check_already_exists=False
)
param.process_model(model)
param.process_geometry(geometry)

# set mesh
var = pybamm.standard_spatial_vars
var_pts = {var.x_n: 30, var.x_s: 30, var.x_p: 30, var.r_n: 10, var.r_p: 10}
mesh = pybamm.Mesh(geometry, model.default_submesh_types, var_pts)

# discretise model
disc = pybamm.Discretisation(mesh, model.default_spatial_methods)
disc.process_model(model)

# solve model
t_eval = np.linspace(0, 3600 / 2, 100)
solver = pybamm.CasadiSolver(mode="fast")
solver.rtol = 1e-3
solver.atol = 1e-6
solution = solver.solve(model, t_eval)

# plot
plot = pybamm.QuickPlot(
solution, ["X-averaged cell temperature [K]", "Ambient temperature [K]"]
)
plot.dynamic_plot()
16 changes: 6 additions & 10 deletions examples/scripts/rate_capability.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,9 @@
for i, C_rate in enumerate(C_rates):
experiment = pybamm.Experiment(
["Discharge at {:.4f}C until 3.2V".format(C_rate)],
period="{:.4f} seconds".format(10 / C_rate)
)
sim = pybamm.Simulation(
model,
experiment=experiment,
solver=pybamm.CasadiSolver()
period="{:.4f} seconds".format(10 / C_rate),
)
sim = pybamm.Simulation(model, experiment=experiment, solver=pybamm.CasadiSolver())
sim.solve()

capacity = sim.solution["Discharge capacity [A.h]"]
Expand All @@ -35,12 +31,12 @@

plt.figure(1)
plt.scatter(C_rates, capacities)
plt.xlabel('C-rate')
plt.ylabel('Capacity [Ah]')
plt.xlabel("C-rate")
plt.ylabel("Capacity [Ah]")

plt.figure(2)
plt.scatter(currents * voltage_av, capacities * voltage_av)
plt.xlabel('Power [W]')
plt.ylabel('Energy [Wh]')
plt.xlabel("Power [W]")
plt.ylabel("Energy [Wh]")

plt.show()
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ Name [units],Value,Reference,Notes
# Temperature,,,
Reference temperature [K],294.85,Room temperature,
Maximum temperature [K],333.15,,
Ambient temperature [K], 298.15,,
Heat transfer coefficient [W.m-2.K-1],10,,


,,,
# Electrical
Number of electrodes connected in parallel to make a cell,8,Manufacturer,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def graphite_LGM50_electrolyte_reaction_rate_Chen2020(T, T_inf, E_r, R_g):
Reaction rate
"""

m_ref = 6.48E-7
m_ref = 6.48e-7
arrhenius = exp(E_r / R_g * (1 / T_inf - 1 / T))

return m_ref * arrhenius
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def nmc_LGM50_electrolyte_reaction_rate_Chen2020(T, T_inf, E_r, R_g):
: double
Reaction rate
"""
m_ref = 3.59E-6
m_ref = 3.59e-6
arrhenius = exp(E_r / R_g * (1 / T_inf - 1 / T))

return m_ref * arrhenius
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,7 @@ def electrolyte_conductivity_Nyman2008(c_e, T, T_inf, E_k_e, R_g):
"""

sigma_e = (
0.1297 * (c_e / 1000) ** 3
- 2.51 * (c_e / 1000) ** 1.5
+ 3.329 * (c_e / 1000)
0.1297 * (c_e / 1000) ** 3 - 2.51 * (c_e / 1000) ** 1.5 + 3.329 * (c_e / 1000)
)

arrhenius = exp(E_k_e / R_g * (1 / T_inf - 1 / T))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,7 @@ def electrolyte_diffusivity_Nyman2008(c_e, T, T_inf, E_D_e, R_g):
Solid diffusivity
"""

D_c_e = (
8.794E-11 * (c_e / 1000) ** 2
- 3.972E-10 * (c_e / 1000)
+ 4.862E-10
)
D_c_e = 8.794e-11 * (c_e / 1000) ** 2 - 3.972e-10 * (c_e / 1000) + 4.862e-10
arrhenius = exp(E_D_e / R_g * (1 / T_inf - 1 / T))

return D_c_e * arrhenius
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ Name [units],Value,Reference,Notes
# Temperature
Reference temperature [K],298.15,25C,
Heat transfer coefficient [W.m-2.K-1],10,,
Ambient temperature [K], 298.15,,

,,,
# Electrical
Number of electrodes connected in parallel to make a cell,1,,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ Name [units],Value,Reference,Notes
# Temperature
Reference temperature [K],298.15,25C,
Heat transfer coefficient [W.m-2.K-1],25,,
Ambient temperature [K], 298.15,,

,,,
# Electrical
Number of electrodes connected in parallel to make a cell,1,,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ Name [units],Value,Reference,Notes
,,,
# Temperature
Reference temperature [K],298.15,25C,
Ambient temperature [K], 298.15,,
Heat transfer coefficient [W.m-2.K-1],10,,
,,,
# Electrical
Expand Down
1 change: 1 addition & 0 deletions pybamm/models/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class EventType(Enum):
to the discontinuity and then restart just after the discontinuity.
"""

TERMINATION = 0
DISCONTINUITY = 1

Expand Down
1 change: 0 additions & 1 deletion pybamm/models/full_battery_models/lead_acid/full.py
Original file line number Diff line number Diff line change
Expand Up @@ -126,4 +126,3 @@ def set_side_reaction_submodels(self):
self.submodels["negative oxygen interface"] = pybamm.interface.NoReaction(
self.param, "Negative", "lead-acid oxygen"
)

1 change: 0 additions & 1 deletion pybamm/models/submodels/electrode/base_electrode.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,4 +190,3 @@ def _get_standard_whole_cell_variables(self, variables):
)

return variables

Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,10 @@ def _get_standard_flux_variables(self, N_e):

def set_events(self, variables):
c_e = variables["Electrolyte concentration"]
self.events.append(pybamm.Event(
"Zero electrolyte concentration cut-off",
pybamm.min(c_e) - 0.002,
pybamm.EventType.TERMINATION
))
self.events.append(
pybamm.Event(
"Zero electrolyte concentration cut-off",
pybamm.min(c_e) - 0.002,
pybamm.EventType.TERMINATION,
)
)
1 change: 0 additions & 1 deletion pybamm/models/submodels/external_circuit/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,3 @@
LeadingOrderVoltageFunctionControl,
LeadingOrderPowerFunctionControl,
)

Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,3 @@ def get_fundamental_variables(self):
Q = pybamm.Variable("Leading-order discharge capacity [A.h]")
variables = {"Discharge capacity [A.h]": Q}
return variables

Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,3 @@ class LeadingOrderCurrentControl(CurrentControl, LeadingOrderBaseModel):

def __init__(self, param):
super().__init__(param)

Original file line number Diff line number Diff line change
Expand Up @@ -91,4 +91,3 @@ class LeadingOrderPowerFunctionControl(LeadingOrderFunctionControl):

def __init__(self, param):
super().__init__(param, constant_power)

1 change: 0 additions & 1 deletion pybamm/models/submodels/particle/base_particle.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,4 +89,3 @@ def set_events(self, variables):
pybamm.EventType.TERMINATION,
)
)

52 changes: 30 additions & 22 deletions pybamm/models/submodels/porosity/base_porosity.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,25 +96,33 @@ def _get_standard_porosity_change_variables(self, deps_dt, set_leading_order=Fal
def set_events(self, variables):
eps_n = variables["Negative electrode porosity"]
eps_p = variables["Positive electrode porosity"]
self.events.append(pybamm.Event(
"Zero negative electrode porosity cut-off",
pybamm.min(eps_n),
pybamm.EventType.TERMINATION
))
self.events.append(pybamm.Event(
"Max negative electrode porosity cut-off",
pybamm.max(eps_n) - 1,
pybamm.EventType.TERMINATION
))

self.events.append(pybamm.Event(
"Zero positive electrode porosity cut-off",
pybamm.min(eps_p),
pybamm.EventType.TERMINATION
))

self.events.append(pybamm.Event(
"Max positive electrode porosity cut-off",
pybamm.max(eps_p) - 1,
pybamm.EventType.TERMINATION
))
self.events.append(
pybamm.Event(
"Zero negative electrode porosity cut-off",
pybamm.min(eps_n),
pybamm.EventType.TERMINATION,
)
)
self.events.append(
pybamm.Event(
"Max negative electrode porosity cut-off",
pybamm.max(eps_n) - 1,
pybamm.EventType.TERMINATION,
)
)

self.events.append(
pybamm.Event(
"Zero positive electrode porosity cut-off",
pybamm.min(eps_p),
pybamm.EventType.TERMINATION,
)
)

self.events.append(
pybamm.Event(
"Max positive electrode porosity cut-off",
pybamm.max(eps_p) - 1,
pybamm.EventType.TERMINATION,
)
)
5 changes: 5 additions & 0 deletions pybamm/models/submodels/thermal/base_thermal.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ def _get_standard_fundamental_variables(self, T, T_cn, T_cp):
T_x_av = self._x_average(T, T_cn, T_cp)
T_vol_av = self._yz_average(T_x_av)

T_amb_dim = param.T_amb_dim(pybamm.t * param.timescale)
T_amb = param.T_amb(pybamm.t * param.timescale)

q = self._flux_law(T)

variables = {
Expand Down Expand Up @@ -64,6 +67,8 @@ def _get_standard_fundamental_variables(self, T, T_cn, T_cp):
+ param.T_ref,
"Heat flux": q,
"Heat flux [W.m-2]": q,
"Ambient temperature [K]": T_amb_dim,
"Ambient temperature": T_amb,
}

return variables
Expand Down
5 changes: 3 additions & 2 deletions pybamm/models/submodels/thermal/isothermal/isothermal.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ def __init__(self, param):
super().__init__(param)

def get_fundamental_variables(self):

T_x_av = pybamm.PrimaryBroadcast(self.param.T_init, "current collector")
T_amb = self.param.T_amb(pybamm.t * self.param.timescale)
T_x_av = pybamm.PrimaryBroadcast(T_amb, "current collector")
T_n = pybamm.PrimaryBroadcast(T_x_av, "negative electrode")
T_s = pybamm.PrimaryBroadcast(T_x_av, "separator")
T_p = pybamm.PrimaryBroadcast(T_x_av, "positive electrode")
Expand All @@ -33,6 +33,7 @@ def get_fundamental_variables(self):
T_cp = T_x_av

variables = self._get_standard_fundamental_variables(T, T_cn, T_cp)

return variables

def get_coupled_variables(self, variables):
Expand Down
1 change: 1 addition & 0 deletions pybamm/models/submodels/thermal/x_full/base_x_full.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ def get_fundamental_variables(self):
T = pybamm.standard_variables.T
T_cn = pybamm.BoundaryValue(T, "left")
T_cp = pybamm.BoundaryValue(T, "right")

variables = self._get_standard_fundamental_variables(T, T_cn, T_cp)
return variables

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,18 @@ def set_boundary_conditions(self, variables):
T = variables["Cell temperature"]
T_n_left = pybamm.boundary_value(T, "left")
T_p_right = pybamm.boundary_value(T, "right")
T_amb = variables["Ambient temperature"]

self.boundary_conditions = {
T: {
"left": (self.param.h * T_n_left / self.param.lambda_n, "Neumann"),
"right": (-self.param.h * T_p_right / self.param.lambda_p, "Neumann"),
"left": (
self.param.h * (T_n_left - T_amb) / self.param.lambda_n,
"Neumann",
),
"right": (
-self.param.h * (T_p_right - T_amb) / self.param.lambda_p,
"Neumann",
),
}
}

Expand Down
1 change: 1 addition & 0 deletions pybamm/models/submodels/thermal/x_lumped/base_x_lumped.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ def get_fundamental_variables(self):
T_cp = T_x_av

variables = self._get_standard_fundamental_variables(T, T_cn, T_cp)

return variables

def get_coupled_variables(self, variables):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,12 @@ def __init__(self, param):
def set_rhs(self, variables):
T_av = variables["X-averaged cell temperature"]
Q_av = variables["X-averaged total heating"]
T_amb = variables["Ambient temperature"]

cooling_coeff = self._surface_cooling_coefficient()

self.rhs = {
T_av: (self.param.B * Q_av + cooling_coeff * T_av) / self.param.C_th
T_av: self.param.B * Q_av + cooling_coeff * (T_av - T_amb) / self.param.C_th
}

def _current_collector_heating(self, variables):
Expand Down
Loading

0 comments on commit a9b1081

Please sign in to comment.