Skip to content

Commit 8df9b22

Browse files
committed
#704 fixed multiple unit tests as result of change of finite volume
1 parent 1c5c42b commit 8df9b22

File tree

12 files changed

+74
-53
lines changed

12 files changed

+74
-53
lines changed

pybamm/discretisations/discretisation.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,11 @@ def __init__(self, mesh=None, spatial_methods=None):
4343
spatial_methods["negative electrode"] = method
4444
spatial_methods["separator"] = method
4545
spatial_methods["positive electrode"] = method
46-
self._spatial_methods = {
47-
dom: method.build(mesh) for dom, method in spatial_methods.items()
48-
}
46+
47+
self._spatial_methods = spatial_methods
48+
for method in self._spatial_methods.values():
49+
method.build(mesh)
50+
4951
self.bcs = {}
5052
self.y_slices = {}
5153
self._discretised_symbols = {}

pybamm/models/submodels/current_collector/effective_resistance_current_collector.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ def default_submesh_types(self):
223223

224224
@property
225225
def default_spatial_methods(self):
226-
return {"current collector": pybamm.ScikitFiniteElement}
226+
return {"current collector": pybamm.ScikitFiniteElement()}
227227

228228
@property
229229
def default_solver(self):

pybamm/spatial_methods/scikit_finite_element.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class ScikitFiniteElement(pybamm.SpatialMethod):
2323
mesh : :class:`pybamm.Mesh`
2424
Contains all the submeshes for discretisation
2525
26+
2627
**Extends:"": :class:`pybamm.SpatialMethod`
2728
"""
2829

@@ -325,14 +326,17 @@ def integral_form(v, dv, w):
325326

326327
return pybamm.Matrix(integration_vector[np.newaxis, :])
327328

328-
def boundary_value_or_flux(self, symbol, discretised_child):
329+
def boundary_value_or_flux(self, symbol, discretised_child, bcs=None):
329330
"""
330331
Returns the average value of the symbol over the negative tab ("negative tab")
331332
or the positive tab ("positive tab") in the Finite Element Method.
332333
333334
Overwrites the default :meth:`pybamm.SpatialMethod.boundary_value`
334335
"""
335336

337+
if bcs is None:
338+
bcs = {}
339+
336340
# Return average value on the negative tab for "negative tab" and positive tab
337341
# for "positive tab"
338342
if isinstance(symbol, pybamm.BoundaryValue):

pybamm/spatial_methods/spatial_method.py

+8-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ def __init__(self, options=None):
2727
if options:
2828
self.options.update(options)
2929

30+
self._mesh = None
31+
3032
def build(self, mesh):
3133
# add npts_for_broadcast to mesh domains for this particular discretisation
3234
for dom in mesh.keys():
@@ -285,7 +287,7 @@ def internal_neumann_condition(
285287

286288
raise NotImplementedError
287289

288-
def boundary_value_or_flux(self, symbol, discretised_child):
290+
def boundary_value_or_flux(self, symbol, discretised_child, bcs=None):
289291
"""
290292
Returns the boundary value or flux using the approriate expression for the
291293
spatial method. To do this, we create a sparse vector 'bv_vector' that extracts
@@ -298,12 +300,17 @@ def boundary_value_or_flux(self, symbol, discretised_child):
298300
The boundary value or flux symbol
299301
discretised_child : :class:`pybamm.StateVector`
300302
The discretised variable from which to calculate the boundary value
303+
bcs : dict
304+
The boundary conditions
301305
302306
Returns
303307
-------
304308
:class:`pybamm.MatrixMultiplication`
305309
The variable representing the surface value.
306310
"""
311+
312+
if bcs is None:
313+
bcs = {}
307314
if any(len(self.mesh[dom]) > 1 for dom in discretised_child.domain):
308315
raise NotImplementedError("Cannot process 2D symbol in base spatial method")
309316
if isinstance(symbol, pybamm.BoundaryGradient):

tests/shared.py

+9-6
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@
88
class SpatialMethodForTesting(pybamm.SpatialMethod):
99
"""Identity operators, no boundary conditions."""
1010

11-
def __init__(self, mesh):
12-
super().__init__(mesh)
11+
def __init__(self, options=None):
12+
super().__init__(options)
13+
14+
def build(self, mesh):
15+
super().build(mesh)
1316

1417
def gradient(self, symbol, discretised_symbol, boundary_conditions):
1518
n = 0
@@ -155,10 +158,10 @@ def get_discretisation_for_testing(
155158
if mesh is None:
156159
mesh = get_mesh_for_testing(xpts=xpts, rpts=rpts)
157160
spatial_methods = {
158-
"macroscale": SpatialMethodForTesting,
159-
"negative particle": SpatialMethodForTesting,
160-
"positive particle": SpatialMethodForTesting,
161-
"current collector": cc_method,
161+
"macroscale": SpatialMethodForTesting(),
162+
"negative particle": SpatialMethodForTesting(),
163+
"positive particle": SpatialMethodForTesting(),
164+
"current collector": cc_method(),
162165
}
163166
return pybamm.Discretisation(mesh, spatial_methods)
164167

tests/unit/test_discretisations/test_discretisation.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def test_add_internal_boundary_conditions(self):
5757
model.boundary_conditions = {c_e: {"left": lbc, "right": rbc}}
5858

5959
mesh = get_mesh_for_testing()
60-
spatial_methods = {"macroscale": SpatialMethodForTesting}
60+
spatial_methods = {"macroscale": SpatialMethodForTesting()}
6161

6262
disc = pybamm.Discretisation(mesh, spatial_methods)
6363
disc.bcs = disc.process_boundary_conditions(model)
@@ -69,7 +69,7 @@ def test_add_internal_boundary_conditions(self):
6969
def test_discretise_slicing(self):
7070
# create discretisation
7171
mesh = get_mesh_for_testing()
72-
spatial_methods = {"macroscale": pybamm.FiniteVolume}
72+
spatial_methods = {"macroscale": pybamm.FiniteVolume()}
7373
disc = pybamm.Discretisation(mesh, spatial_methods)
7474

7575
whole_cell = ["negative electrode", "separator", "positive electrode"]
@@ -132,10 +132,10 @@ def test_process_symbol_base(self):
132132
# create discretisation
133133
mesh = get_mesh_for_testing()
134134
spatial_methods = {
135-
"macroscale": pybamm.SpatialMethod,
136-
"negative particle": pybamm.SpatialMethod,
137-
"positive particle": pybamm.SpatialMethod,
138-
"current collector": pybamm.SpatialMethod,
135+
"macroscale": pybamm.SpatialMethod(),
136+
"negative particle": pybamm.SpatialMethod(),
137+
"positive particle": pybamm.SpatialMethod(),
138+
"current collector": pybamm.SpatialMethod(),
139139
}
140140
disc = pybamm.Discretisation(mesh, spatial_methods)
141141

tests/unit/test_models/test_full_battery_models/test_base_battery_model.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -88,20 +88,20 @@ def test_default_submesh_types(self):
8888
def test_default_spatial_methods(self):
8989
model = pybamm.BaseBatteryModel({"dimensionality": 0})
9090
self.assertTrue(
91-
issubclass(
91+
isinstance(
9292
model.default_spatial_methods["current collector"],
9393
pybamm.ZeroDimensionalMethod,
9494
)
9595
)
9696
model = pybamm.BaseBatteryModel({"dimensionality": 1})
9797
self.assertTrue(
98-
issubclass(
98+
isinstance(
9999
model.default_spatial_methods["current collector"], pybamm.FiniteVolume
100100
)
101101
)
102102
model = pybamm.BaseBatteryModel({"dimensionality": 2})
103103
self.assertTrue(
104-
issubclass(
104+
isinstance(
105105
model.default_spatial_methods["current collector"],
106106
pybamm.ScikitFiniteElement,
107107
)

tests/unit/test_models/test_full_battery_models/test_lead_acid/test_loqs.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def test_defaults_dimensions(self):
5252
self.assertTrue(
5353
issubclass(
5454
model.default_spatial_methods["current collector"],
55-
pybamm.ZeroDimensionalMethod,
55+
pybamm.ZeroDimensionalMethod(),
5656
)
5757
)
5858
self.assertTrue(

tests/unit/test_solvers/test_casadi_solver.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def test_integrate_failure(self):
6464

6565
# create discretisation
6666
mesh = get_mesh_for_testing()
67-
spatial_methods = {"macroscale": pybamm.FiniteVolume}
67+
spatial_methods = {"macroscale": pybamm.FiniteVolume()}
6868
disc = pybamm.Discretisation(mesh, spatial_methods)
6969
disc.process_model(model)
7070
# Solve with failure at t=2
@@ -98,7 +98,7 @@ def test_model_solver(self):
9898

9999
# create discretisation
100100
mesh = get_mesh_for_testing()
101-
spatial_methods = {"macroscale": pybamm.FiniteVolume}
101+
spatial_methods = {"macroscale": pybamm.FiniteVolume()}
102102
disc = pybamm.Discretisation(mesh, spatial_methods)
103103
disc.process_model(model)
104104
# Solve
@@ -157,7 +157,7 @@ def test_model_step(self):
157157

158158
# create discretisation
159159
mesh = get_mesh_for_testing()
160-
spatial_methods = {"macroscale": pybamm.FiniteVolume}
160+
spatial_methods = {"macroscale": pybamm.FiniteVolume()}
161161
disc = pybamm.Discretisation(mesh, spatial_methods)
162162
disc.process_model(model)
163163

tests/unit/test_solvers/test_scipy_solver.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ def test_model_solver(self):
143143

144144
# create discretisation
145145
mesh = get_mesh_for_testing()
146-
spatial_methods = {"macroscale": pybamm.FiniteVolume}
146+
spatial_methods = {"macroscale": pybamm.FiniteVolume()}
147147
disc = pybamm.Discretisation(mesh, spatial_methods)
148148
disc.process_model(model)
149149
# Solve
@@ -170,7 +170,7 @@ def test_model_solver_with_event(self):
170170

171171
# create discretisation
172172
mesh = get_mesh_for_testing()
173-
spatial_methods = {"macroscale": pybamm.FiniteVolume}
173+
spatial_methods = {"macroscale": pybamm.FiniteVolume()}
174174
disc = pybamm.Discretisation(mesh, spatial_methods)
175175
disc.process_model(model)
176176
# Solve
@@ -193,7 +193,7 @@ def test_model_solver_ode_with_jacobian(self):
193193

194194
# create discretisation
195195
mesh = get_mesh_for_testing()
196-
spatial_methods = {"macroscale": pybamm.FiniteVolume}
196+
spatial_methods = {"macroscale": pybamm.FiniteVolume()}
197197
disc = pybamm.Discretisation(mesh, spatial_methods)
198198
disc.process_model(model)
199199

@@ -243,7 +243,7 @@ def test_model_step(self):
243243

244244
# create discretisation
245245
mesh = get_mesh_for_testing()
246-
spatial_methods = {"macroscale": pybamm.FiniteVolume}
246+
spatial_methods = {"macroscale": pybamm.FiniteVolume()}
247247
disc = pybamm.Discretisation(mesh, spatial_methods)
248248
disc.process_model(model)
249249

@@ -284,7 +284,7 @@ def test_model_solver_with_event_with_casadi(self):
284284

285285
# create discretisation
286286
mesh = get_mesh_for_testing()
287-
spatial_methods = {"macroscale": pybamm.FiniteVolume}
287+
spatial_methods = {"macroscale": pybamm.FiniteVolume()}
288288
disc = pybamm.Discretisation(mesh, spatial_methods)
289289
disc.process_model(model)
290290
# Solve

tests/unit/test_spatial_methods/test_base_spatial_method.py

+8-4
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
class TestSpatialMethod(unittest.TestCase):
1111
def test_basics(self):
1212
mesh = get_mesh_for_testing()
13-
spatial_method = pybamm.SpatialMethod(mesh)
13+
spatial_method = pybamm.SpatialMethod()
14+
spatial_method.build(mesh)
1415
self.assertEqual(spatial_method.mesh, mesh)
1516
with self.assertRaises(NotImplementedError):
1617
spatial_method.gradient(None, None, None)
@@ -34,7 +35,8 @@ def test_basics(self):
3435
def test_discretise_spatial_variable(self):
3536
# create discretisation
3637
mesh = get_mesh_for_testing()
37-
spatial_method = pybamm.SpatialMethod(mesh)
38+
spatial_method = pybamm.SpatialMethod()
39+
spatial_method.build(mesh)
3840

3941
# centre
4042
x1 = pybamm.SpatialVariable("x", ["negative electrode"])
@@ -62,12 +64,14 @@ def test_broadcast_checks(self):
6264
child = pybamm.Symbol("sym", domain=["negative electrode"])
6365
symbol = pybamm.BoundaryGradient(child, "left")
6466
mesh = get_mesh_for_testing()
65-
spatial_method = pybamm.SpatialMethod(mesh)
67+
spatial_method = pybamm.SpatialMethod()
68+
spatial_method.build(mesh)
6669
with self.assertRaisesRegex(TypeError, "Cannot process BoundaryGradient"):
6770
spatial_method.boundary_value_or_flux(symbol, child)
6871

6972
mesh = get_1p1d_mesh_for_testing()
70-
spatial_method = pybamm.SpatialMethod(mesh)
73+
spatial_method = pybamm.SpatialMethod()
74+
spatial_method.build(mesh)
7175
with self.assertRaisesRegex(NotImplementedError, "Cannot process 2D symbol"):
7276
spatial_method.boundary_value_or_flux(symbol, child)
7377

tests/unit/test_spatial_methods/test_scikit_finite_element.py

+20-19
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
class TestScikitFiniteElement(unittest.TestCase):
1111
def test_not_implemented(self):
1212
mesh = get_2p1d_mesh_for_testing()
13-
spatial_method = pybamm.ScikitFiniteElement(mesh)
13+
spatial_method = pybamm.ScikitFiniteElement()
14+
spatial_method.build(mesh)
1415
self.assertEqual(spatial_method.mesh, mesh)
1516
with self.assertRaises(NotImplementedError):
1617
spatial_method.gradient(None, None, None)
@@ -23,8 +24,8 @@ def test_discretise_equations(self):
2324
# get mesh
2425
mesh = get_2p1d_mesh_for_testing()
2526
spatial_methods = {
26-
"macroscale": pybamm.FiniteVolume,
27-
"current collector": pybamm.ScikitFiniteElement,
27+
"macroscale": pybamm.FiniteVolume(),
28+
"current collector": pybamm.ScikitFiniteElement(),
2829
}
2930
disc = pybamm.Discretisation(mesh, spatial_methods)
3031
# discretise some equations
@@ -127,8 +128,8 @@ def test_discretise_equations(self):
127128
def test_manufactured_solution(self):
128129
mesh = get_unit_2p1D_mesh_for_testing(ypts=32, zpts=32)
129130
spatial_methods = {
130-
"macroscale": pybamm.FiniteVolume,
131-
"current collector": pybamm.ScikitFiniteElement,
131+
"macroscale": pybamm.FiniteVolume(),
132+
"current collector": pybamm.ScikitFiniteElement(),
132133
}
133134
disc = pybamm.Discretisation(mesh, spatial_methods)
134135

@@ -230,8 +231,8 @@ def test_manufactured_solution_cheb_grid(self):
230231
mesh = pybamm.Mesh(geometry, submesh_types, var_pts)
231232

232233
spatial_methods = {
233-
"macroscale": pybamm.FiniteVolume,
234-
"current collector": pybamm.ScikitFiniteElement,
234+
"macroscale": pybamm.FiniteVolume(),
235+
"current collector": pybamm.ScikitFiniteElement(),
235236
}
236237
disc = pybamm.Discretisation(mesh, spatial_methods)
237238

@@ -292,8 +293,8 @@ def test_manufactured_solution_exponential_grid(self):
292293
mesh = pybamm.Mesh(geometry, submesh_types, var_pts)
293294

294295
spatial_methods = {
295-
"macroscale": pybamm.FiniteVolume,
296-
"current collector": pybamm.ScikitFiniteElement,
296+
"macroscale": pybamm.FiniteVolume(),
297+
"current collector": pybamm.ScikitFiniteElement(),
297298
}
298299
disc = pybamm.Discretisation(mesh, spatial_methods)
299300

@@ -323,8 +324,8 @@ def test_manufactured_solution_exponential_grid(self):
323324
def test_definite_integral(self):
324325
mesh = get_2p1d_mesh_for_testing()
325326
spatial_methods = {
326-
"macroscale": pybamm.FiniteVolume,
327-
"current collector": pybamm.ScikitFiniteElement,
327+
"macroscale": pybamm.FiniteVolume(),
328+
"current collector": pybamm.ScikitFiniteElement(),
328329
}
329330
disc = pybamm.Discretisation(mesh, spatial_methods)
330331
var = pybamm.Variable("var", domain="current collector")
@@ -344,8 +345,8 @@ def test_definite_integral(self):
344345
def test_definite_integral_vector(self):
345346
mesh = get_2p1d_mesh_for_testing()
346347
spatial_methods = {
347-
"macroscale": pybamm.FiniteVolume,
348-
"current collector": pybamm.ScikitFiniteElement,
348+
"macroscale": pybamm.FiniteVolume(),
349+
"current collector": pybamm.ScikitFiniteElement(),
349350
}
350351
disc = pybamm.Discretisation(mesh, spatial_methods)
351352
var = pybamm.Variable("var", domain="current collector")
@@ -366,8 +367,8 @@ def test_definite_integral_vector(self):
366367
def test_neg_pos(self):
367368
mesh = get_2p1d_mesh_for_testing()
368369
spatial_methods = {
369-
"macroscale": pybamm.FiniteVolume,
370-
"current collector": pybamm.ScikitFiniteElement,
370+
"macroscale": pybamm.FiniteVolume(),
371+
"current collector": pybamm.ScikitFiniteElement(),
371372
}
372373
disc = pybamm.Discretisation(mesh, spatial_methods)
373374
var = pybamm.Variable("var", domain="current collector")
@@ -389,8 +390,8 @@ def test_neg_pos(self):
389390
def test_boundary_integral(self):
390391
mesh = get_2p1d_mesh_for_testing()
391392
spatial_methods = {
392-
"macroscale": pybamm.FiniteVolume,
393-
"current collector": pybamm.ScikitFiniteElement,
393+
"macroscale": pybamm.FiniteVolume(),
394+
"current collector": pybamm.ScikitFiniteElement(),
394395
}
395396
disc = pybamm.Discretisation(mesh, spatial_methods)
396397
var = pybamm.Variable("var", domain="current collector")
@@ -447,8 +448,8 @@ def test_pure_neumann_poisson(self):
447448
# create discretisation
448449
mesh = get_unit_2p1D_mesh_for_testing(ypts=32, zpts=32)
449450
spatial_methods = {
450-
"macroscale": pybamm.FiniteVolume,
451-
"current collector": pybamm.ScikitFiniteElement,
451+
"macroscale": pybamm.FiniteVolume(),
452+
"current collector": pybamm.ScikitFiniteElement(),
452453
}
453454
disc = pybamm.Discretisation(mesh, spatial_methods)
454455
disc.process_model(model)

0 commit comments

Comments
 (0)