Skip to content

Commit

Permalink
pybamm-team#1810 allow strings in var_pts and geometry
Browse files Browse the repository at this point in the history
  • Loading branch information
valentinsulzer committed Nov 19, 2021
1 parent 19c3090 commit cc1b429
Show file tree
Hide file tree
Showing 52 changed files with 266 additions and 384 deletions.
11 changes: 1 addition & 10 deletions benchmarks/time_solve_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,7 @@ def prepare_model(model):
param.process_geometry(geometry)

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

# discretise model
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,11 @@
"\n",
"# create our dictionary \n",
"var_pts = {\n",
" var.x_n: 10, # negative electrode\n",
" var.x_s: 10, # separator \n",
" var.x_p: 10, # positive electrode\n",
" var.r_n: 10, # negative particle\n",
" var.r_p: 10, # positive particle\n",
" "x_n": 10, # negative electrode\n",
" "x_s": 10, # separator \n",
" "x_p": 10, # positive electrode\n",
" "r_n": 10, # negative particle\n",
" "r_p": 10, # positive particle\n",
"}"
]
},
Expand Down Expand Up @@ -210,11 +210,11 @@
"solutions = []\n",
"for N in npts:\n",
" var_pts = {\n",
" var.x_n: N, # negative electrode\n",
" var.x_s: N, # separator \n",
" var.x_p: N, # positive electrode\n",
" var.r_n: N, # negative particle\n",
" var.r_p: N, # positive particle\n",
" "x_n": N, # negative electrode\n",
" "x_s": N, # separator \n",
" "x_p": N, # positive electrode\n",
" "r_n": N, # negative particle\n",
" "r_p": N, # positive particle\n",
" } \n",
" sim = pybamm.Simulation(\n",
" model, solver=solver, parameter_values=parameter_values, var_pts=var_pts\n",
Expand Down
6 changes: 3 additions & 3 deletions examples/notebooks/expression_tree/broadcasts.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,16 @@
"source": [
"var = pybamm.standard_spatial_vars\n",
"geometry = {\n",
" \"negative electrode\": {var.x_n: {\"min\": pybamm.Scalar(0), \"max\": pybamm.Scalar(1)}},\n",
" \"negative particle\": {var.r_n: {\"min\": pybamm.Scalar(0), \"max\": pybamm.Scalar(1)}},\n",
" \"negative electrode\": {"x_n": {\"min\": pybamm.Scalar(0), \"max\": pybamm.Scalar(1)}},\n",
" \"negative particle\": {"r_n": {\"min\": pybamm.Scalar(0), \"max\": pybamm.Scalar(1)}},\n",
"}\n",
"\n",
"submesh_types = {\n",
" \"negative electrode\": pybamm.Uniform1DSubMesh,\n",
" \"negative particle\": pybamm.Uniform1DSubMesh,\n",
"}\n",
"\n",
"var_pts = {var.x_n: 5, var.r_n: 3}\n",
"var_pts = {"x_n": 5, "r_n": 3}\n",
"mesh = pybamm.Mesh(geometry, submesh_types, var_pts)\n",
"\n",
"spatial_methods = {\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,11 +87,11 @@
"# update the mesh\n",
"var = pybamm.standard_spatial_vars\n",
"var_pts = {\n",
" var.x_n: 50,\n",
" var.x_s: 50,\n",
" var.x_p: 50,\n",
" var.r_n: 21,\n",
" var.r_p: 21,\n",
" "x_n": 50,\n",
" "x_s": 50,\n",
" "x_p": 50,\n",
" "r_n": 21,\n",
" "r_p": 21,\n",
"}\n",
"\n",
"# define the simulation\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@
"\n",
"# create mesh\n",
"var = pybamm.standard_spatial_vars\n",
"var_pts = {var.x_n: 31, var.x_s: 11, var.x_p: 31, var.r_n: 11, var.r_p: 11}\n",
"var_pts = {"x_n": 31, "x_s": 11, "x_p": 31, "r_n": 11, "r_p": 11}\n",
"mesh = pybamm.Mesh(geometry, model.default_submesh_types, var_pts)\n",
"\n",
"# discretise model\n",
Expand Down
10 changes: 5 additions & 5 deletions examples/notebooks/models/compare-ecker-data.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,11 @@
"source": [
"var = pybamm.standard_spatial_vars\n",
"var_pts = {\n",
" var.x_n: int(parameter_values.evaluate(model.param.L_n / 1e-6)),\n",
" var.x_s: int(parameter_values.evaluate(model.param.L_s / 1e-6)),\n",
" var.x_p: int(parameter_values.evaluate(model.param.L_p / 1e-6)),\n",
" var.r_n: int(parameter_values.evaluate(model.param.R_n_typ / 1e-7)),\n",
" var.r_p: int(parameter_values.evaluate(model.param.R_p_typ / 1e-7)),\n",
" "x_n": int(parameter_values.evaluate(model.param.L_n / 1e-6)),\n",
" "x_s": int(parameter_values.evaluate(model.param.L_s / 1e-6)),\n",
" "x_p": int(parameter_values.evaluate(model.param.L_p / 1e-6)),\n",
" "r_n": int(parameter_values.evaluate(model.param.R_n_typ / 1e-7)),\n",
" "r_p": int(parameter_values.evaluate(model.param.R_p_typ / 1e-7)),\n",
"}"
]
},
Expand Down
12 changes: 6 additions & 6 deletions examples/notebooks/models/pouch-cell-model.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -157,12 +157,12 @@
"var = pybamm.standard_spatial_vars\n",
"npts = 16\n",
"var_pts = {\n",
" var.x_n: npts,\n",
" var.x_s: npts,\n",
" var.x_p: npts,\n",
" var.r_n: npts,\n",
" var.r_p: npts,\n",
" var.z: npts,\n",
" "x_n": npts,\n",
" "x_s": npts,\n",
" "x_p": npts,\n",
" "r_n": npts,\n",
" "r_p": npts,\n",
" "z": npts,\n",
"}"
]
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@
"outputs": [],
"source": [
"var = pybamm.standard_spatial_vars\n",
"var_pts = {var.x_n: 30, var.x_s: 30, var.x_p: 30, var.r_n: 40, var.r_p: 40}\n",
"var_pts = {"x_n": 30, "x_s": 30, "x_p": 30, "r_n": 40, "r_p": 40}\n",
"\n",
"submesh_types = model.default_submesh_types\n",
"submesh_types[\"negative particle\"] = pybamm.MeshGenerator(\n",
Expand Down
2 changes: 1 addition & 1 deletion examples/notebooks/spatial_methods/finite-volumes.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@
"}\n",
"\n",
"var = pybamm.standard_spatial_vars\n",
"var_pts = {var.x_n: 15, var.x_s: 10, var.x_p: 15, var.r_n: 10, var.r_p: 10}\n",
"var_pts = {"x_n": 15, "x_s": 10, "x_p": 15, "r_n": 10, "r_p": 10}\n",
"mesh = pybamm.Mesh(geometry, submesh_types, var_pts)"
]
},
Expand Down
3 changes: 1 addition & 2 deletions examples/scripts/DFN_ambient_temperature.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,7 @@ def ambient_temperature(t):
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}
var_pts = {"x_n": 30, "x_s": 30, "x_p": 30, "r_n": 10, "r_p": 10}
mesh = pybamm.Mesh(geometry, model.default_submesh_types, var_pts)

# discretise model
Expand Down
9 changes: 1 addition & 8 deletions examples/scripts/SPMe_SOC.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,7 @@
)
param.process_model(model)
param.process_geometry(geometry)
s_var = pybamm.standard_spatial_vars
var_pts = {
s_var.x_n: 5,
s_var.x_s: 5,
s_var.x_p: 5,
s_var.r_n: 5,
s_var.r_p: 10,
}
var_pts = {"x_n": 5, "x_s": 5, "x_p": 5, "r_n": 5, "r_p": 10}
# set mesh
mesh = pybamm.Mesh(geometry, model.default_submesh_types, var_pts)
# discretise model
Expand Down
3 changes: 1 addition & 2 deletions examples/scripts/compare_comsol/compare_comsol_DFN.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,7 @@
param.process_geometry(geometry)

# create mesh
var = pybamm.standard_spatial_vars
var_pts = {var.x_n: 31, var.x_s: 11, var.x_p: 31, var.r_n: 11, var.r_p: 11}
var_pts = {"x_n": 31, "x_s": 11, "x_p": 31, "r_n": 11, "r_p": 11}
mesh = pybamm.Mesh(geometry, pybamm_model.default_submesh_types, var_pts)

# discretise model
Expand Down
3 changes: 1 addition & 2 deletions examples/scripts/compare_comsol/discharge_curve.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,7 @@
param.process_geometry(geometry)

# create mesh
var = pybamm.standard_spatial_vars
var_pts = {var.x_n: 31, var.x_s: 11, var.x_p: 31, var.r_n: 11, var.r_p: 11}
var_pts = {"x_n": 31, "x_s": 11, "x_p": 31, "r_n": 11, "r_p": 11}
mesh = pybamm.Mesh(geometry, model.default_submesh_types, var_pts)

# discretise model
Expand Down
3 changes: 1 addition & 2 deletions examples/scripts/compare_dae_solver.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@
param.process_geometry(geometry)

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

# discretise model
Expand Down
11 changes: 1 addition & 10 deletions examples/scripts/compare_lithium_ion_2D.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,7 @@
for model in models:
geometry = model.default_geometry
param.process_geometry(geometry)
var = pybamm.standard_spatial_vars
var_pts = {
var.x_n: 10,
var.x_s: 10,
var.x_p: 10,
var.r_n: 10,
var.r_p: 10,
var.y: 10,
var.z: 10,
}
var_pts = {"x_n": 10, "x_s": 10, "x_p": 10, "r_n": 10, "r_p": 10, "y": 10, "z": 10}
mesh = pybamm.Mesh(geometry, model.default_submesh_types, var_pts)
disc = pybamm.Discretisation(mesh, model.default_spatial_methods)
disc.process_model(model)
Expand Down
3 changes: 1 addition & 2 deletions examples/scripts/compare_spectral_volume.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@
p.process_geometry(g)

# set mesh
var = pybamm.standard_spatial_vars
var_pts = {var.x_n: 1, var.x_s: 1, var.x_p: 1, var.r_n: 1, var.r_p: 1}
var_pts = {"x_n": 1, "x_s": 1, "x_p": 1, "r_n": 1, "r_p": 1}
# the Finite Volume method also works on spectral meshes
meshes = [
pybamm.Mesh(
Expand Down
3 changes: 1 addition & 2 deletions examples/scripts/thermal_lithium_ion.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,7 @@
param.process_model(model)

# set mesh
var = pybamm.standard_spatial_vars
var_pts = {var.x_n: 10, var.x_s: 10, var.x_p: 10, var.r_n: 10, var.r_p: 10}
var_pts = {"x_n": 10, "x_s": 10, "x_p": 10, "r_n": 10, "r_p": 10}

# discretise models
for model in models:
Expand Down
32 changes: 12 additions & 20 deletions pybamm/geometry/battery_geometry.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ def battery_geometry(
A geometry class for the battery
"""
var = pybamm.standard_spatial_vars
geo = pybamm.geometric_parameters
l_n = geo.l_n
l_s = geo.l_s
Expand All @@ -38,52 +37,45 @@ def battery_geometry(
l_n_l_s.print_name = "l_n + l_s"

geometry = {
"negative electrode": {var.x_n: {"min": 0, "max": l_n}},
"separator": {var.x_s: {"min": l_n, "max": l_n_l_s}},
"positive electrode": {var.x_p: {"min": l_n_l_s, "max": 1}},
"negative electrode": {"x_n": {"min": 0, "max": l_n}},
"separator": {"x_s": {"min": l_n, "max": l_n_l_s}},
"positive electrode": {"x_p": {"min": l_n_l_s, "max": 1}},
}
# Add particle domains
if include_particles is True:
geometry.update(
{
"negative particle": {var.r_n: {"min": 0, "max": 1}},
"positive particle": {var.r_p: {"min": 0, "max": 1}},
"negative particle": {"r_n": {"min": 0, "max": 1}},
"positive particle": {"r_p": {"min": 0, "max": 1}},
}
)
# Add particle size domains
if (
options is not None and
options["particle size"] == "distribution"
):
if options is not None and options["particle size"] == "distribution":
R_min_n = geo.R_min_n
R_min_p = geo.R_min_p
R_max_n = geo.R_max_n
R_max_p = geo.R_max_p
geometry.update(
{
"negative particle size": {
var.R_n: {"min": R_min_n, "max": R_max_n}
},
"positive particle size": {
var.R_p: {"min": R_min_p, "max": R_max_p}
},
"negative particle size": {"R_n": {"min": R_min_n, "max": R_max_n}},
"positive particle size": {"R_p": {"min": R_min_p, "max": R_max_p}},
}
)

if current_collector_dimension == 0:
geometry["current collector"] = {var.z: {"position": 1}}
geometry["current collector"] = {"z": {"position": 1}}
elif current_collector_dimension == 1:
geometry["current collector"] = {
var.z: {"min": 0, "max": 1},
"z": {"min": 0, "max": 1},
"tabs": {
"negative": {"z_centre": geo.centre_z_tab_n},
"positive": {"z_centre": geo.centre_z_tab_p},
},
}
elif current_collector_dimension == 2:
geometry["current collector"] = {
var.y: {"min": 0, "max": geo.l_y},
var.z: {"min": 0, "max": geo.l_z},
"y": {"min": 0, "max": geo.l_y},
"z": {"min": 0, "max": geo.l_z},
"tabs": {
"negative": {
"y_centre": geo.centre_y_tab_n,
Expand Down
17 changes: 14 additions & 3 deletions pybamm/meshes/meshes.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,17 @@ class Mesh(dict):

def __init__(self, geometry, submesh_types, var_pts):
super().__init__()

# Preprocess var_pts
var_pts_input = var_pts
var_pts = {}
for key, value in var_pts_input.items():
if isinstance(key, str):
key = getattr(pybamm.standard_spatial_vars, key)
var_pts[key] = value

# convert var_pts to an id dict
var_id_pts = {var.id: pts for var, pts in var_pts.items()}
var_name_pts = {var.name: pts for var, pts in var_pts.items()}

# create submesh_pts from var_pts
submesh_pts = {}
Expand All @@ -54,11 +63,13 @@ def __init__(self, geometry, submesh_types, var_pts):
)
# skip over tabs key
if var != "tabs":
if isinstance(var, str):
var = getattr(pybamm.standard_spatial_vars, var)
# Raise error if the number of points for a particular
# variable haven't been provided, unless that variable
# doesn't appear in the geometry
if (
var.id not in var_id_pts.keys()
var.name not in var_name_pts.keys()
and var.domain[0] in geometry.keys()
):
raise KeyError(
Expand All @@ -67,7 +78,7 @@ def __init__(self, geometry, submesh_types, var_pts):
)
)
# Otherwise add to the dictionary of submesh points
submesh_pts[domain][var.id] = var_id_pts[var.id]
submesh_pts[domain][var.name] = var_name_pts[var.name]
self.submesh_pts = submesh_pts

# Input domain order manually
Expand Down
4 changes: 3 additions & 1 deletion pybamm/meshes/one_dimensional_submeshes.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,9 @@ class Uniform1DSubMesh(SubMesh1D):
def __init__(self, lims, npts):

spatial_var, spatial_lims, tabs = self.read_lims(lims)
npts = npts[spatial_var.id]
if isinstance(spatial_var, str):
spatial_var = getattr(pybamm.standard_spatial_vars, spatial_var)
npts = npts[spatial_var.name]

edges = np.linspace(spatial_lims["min"], spatial_lims["max"], npts + 1)

Expand Down
Loading

0 comments on commit cc1b429

Please sign in to comment.