Skip to content

Commit 07d6c34

Browse files
#709 deprecate param.update_model
1 parent f6b0ca9 commit 07d6c34

File tree

7 files changed

+56
-272
lines changed

7 files changed

+56
-272
lines changed

examples/scripts/compare_comsol/compare_comsol_DFN.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,8 @@ def myinterp(t):
128128
"Positive electrode potential [V]": comsol_phi_p,
129129
"Terminal voltage [V]": comsol_voltage,
130130
}
131-
comsol_solution = pybamm.CasadiSolver(mode="fast").solve(pybamm_model, time)
131+
# Make new solution with same t and y
132+
comsol_solution = pybamm.Solution(pybamm_solution.t, pybamm_solution.y)
132133
comsol_solution.model = comsol_model
133134
# plot
134135
plot = pybamm.QuickPlot(

examples/scripts/compare_comsol/discharge_curve.py

+11-5
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,16 @@
1414
model = pybamm.lithium_ion.DFN()
1515
geometry = model.default_geometry
1616

17+
1718
# load parameters and process model and geometry
19+
def current_function(t):
20+
return pybamm.InputParameter("current")
21+
22+
1823
param = model.default_parameter_values
1924
param["Electrode width [m]"] = 1
2025
param["Electrode height [m]"] = 1
26+
param["Current function [A]"] = current_function
2127
param.process_model(model)
2228
param.process_geometry(geometry)
2329

@@ -48,7 +54,7 @@
4854
plt.ylabel(r"$\vert V - V_{comsol} \vert$", fontsize=20)
4955

5056
for key, C_rate in C_rates.items():
51-
57+
current = 24 * C_rate
5258
# load the comsol results
5359
comsol_variables = pickle.load(
5460
open("input/comsol_results/comsol_{}C.pickle".format(key), "rb")
@@ -57,8 +63,6 @@
5763
comsol_voltage = comsol_variables["voltage"]
5864

5965
# update current density
60-
param["Current function [A]"] = 24 * C_rate
61-
param.update_model(model, disc)
6266

6367
# discharge timescale
6468
tau = param.process_symbol(
@@ -67,12 +71,14 @@
6771

6872
# solve model at comsol times
6973
t = comsol_time / tau
70-
solution = pybamm.CasadiSolver(mode="fast").solve(model, t)
74+
solution = pybamm.CasadiSolver(mode="fast").solve(
75+
model, t, inputs={"current": current}
76+
)
7177

7278
# discharge capacity
7379
discharge_capacity = solution["Discharge capacity [A.h]"]
7480
discharge_capacity_sol = discharge_capacity(solution.t)
75-
comsol_discharge_capacity = comsol_time * param["Current function [A]"] / 3600
81+
comsol_discharge_capacity = comsol_time * current / 3600
7682

7783
# extract the voltage
7884
voltage = solution["Terminal voltage [V]"]

pybamm/parameters/parameter_values.py

+20-82
Original file line numberDiff line numberDiff line change
@@ -294,21 +294,14 @@ def check_and_update_parameter_values(self, values):
294294

295295
return values
296296

297-
def process_model(self, unprocessed_model, processing="process", inplace=True):
297+
def process_model(self, unprocessed_model, inplace=True):
298298
"""Assign parameter values to a model.
299299
Currently inplace, could be changed to return a new model.
300300
301301
Parameters
302302
----------
303303
unprocessed_model : :class:`pybamm.BaseModel`
304304
Model to assign parameter values for
305-
processing : str, optional
306-
Flag to indicate how to process model (default 'process')
307-
308-
* 'process': Calls :meth:`process_symbol()` (walk through the symbol \
309-
and replace any Parameter with a Value)
310-
* 'update': Calls :meth:`update_scalars()` for use on already-processed \
311-
model (update the value of any Scalars in the expression tree.)
312305
inplace: bool, optional
313306
If True, replace the parameters in the model in place. Otherwise, return a
314307
new model with parameter values set. Default is True.
@@ -335,32 +328,21 @@ def process_model(self, unprocessed_model, processing="process", inplace=True):
335328
if len(unprocessed_model.rhs) == 0 and len(unprocessed_model.algebraic) == 0:
336329
raise pybamm.ModelError("Cannot process parameters for empty model")
337330

338-
if processing == "process":
339-
processing_function = self.process_symbol
340-
elif processing == "update":
341-
processing_function = self.update_scalars
342-
343331
for variable, equation in model.rhs.items():
344-
pybamm.logger.debug(
345-
"{} parameters for {!r} (rhs)".format(processing.capitalize(), variable)
346-
)
347-
model.rhs[variable] = processing_function(equation)
332+
pybamm.logger.debug("Processing parameters for {!r} (rhs)".format(variable))
333+
model.rhs[variable] = self.process_symbol(equation)
348334

349335
for variable, equation in model.algebraic.items():
350336
pybamm.logger.debug(
351-
"{} parameters for {!r} (algebraic)".format(
352-
processing.capitalize(), variable
353-
)
337+
"Processing parameters for {!r} (algebraic)".format(variable)
354338
)
355-
model.algebraic[variable] = processing_function(equation)
339+
model.algebraic[variable] = self.process_symbol(equation)
356340

357341
for variable, equation in model.initial_conditions.items():
358342
pybamm.logger.debug(
359-
"{} parameters for {!r} (initial conditions)".format(
360-
processing.capitalize(), variable
361-
)
343+
"Processing parameters for {!r} (initial conditions)".format(variable)
362344
)
363-
model.initial_conditions[variable] = processing_function(equation)
345+
model.initial_conditions[variable] = self.process_symbol(equation)
364346

365347
# Boundary conditions are dictionaries {"left": left bc, "right": right bc}
366348
# in general, but may be imposed on the tabs (or *not* on the tab) for a
@@ -369,17 +351,15 @@ def process_model(self, unprocessed_model, processing="process", inplace=True):
369351
new_boundary_conditions = {}
370352
sides = ["left", "right", "negative tab", "positive tab", "no tab"]
371353
for variable, bcs in model.boundary_conditions.items():
372-
processed_variable = processing_function(variable)
354+
processed_variable = self.process_symbol(variable)
373355
new_boundary_conditions[processed_variable] = {}
374356
for side in sides:
375357
try:
376358
bc, typ = bcs[side]
377359
pybamm.logger.debug(
378-
"{} parameters for {!r} ({} bc)".format(
379-
processing.capitalize(), variable, side
380-
)
360+
"Processing parameters for {!r} ({} bc)".format(variable, side)
381361
)
382-
processed_bc = (processing_function(bc), typ)
362+
processed_bc = (self.process_symbol(bc), typ)
383363
new_boundary_conditions[processed_variable][side] = processed_bc
384364
except KeyError as err:
385365
# don't raise error if the key error comes from the side not being
@@ -394,42 +374,24 @@ def process_model(self, unprocessed_model, processing="process", inplace=True):
394374

395375
for variable, equation in model.variables.items():
396376
pybamm.logger.debug(
397-
"{} parameters for {!r} (variables)".format(
398-
processing.capitalize(), variable
399-
)
377+
"Processing parameters for {!r} (variables)".format(variable)
400378
)
401-
model.variables[variable] = processing_function(equation)
379+
model.variables[variable] = self.process_symbol(equation)
402380
for event, equation in model.events.items():
403-
pybamm.logger.debug(
404-
"{} parameters for event '{}''".format(processing.capitalize(), event)
405-
)
406-
model.events[event] = processing_function(equation)
381+
pybamm.logger.debug("Processing parameters for event '{}''".format(event))
382+
model.events[event] = self.process_symbol(equation)
407383

408384
pybamm.logger.info("Finish setting parameters for {}".format(model.name))
409385

410386
return model
411387

412388
def update_model(self, model, disc):
413-
"""Process a discretised model.
414-
Currently inplace, could be changed to return a new model.
415-
416-
Parameters
417-
----------
418-
model : :class:`pybamm.BaseModel`
419-
Model to assign parameter values for
420-
disc : :class:`pybamm.Discretisation`
421-
The class that was used to discretise
422-
423-
"""
424-
# process parameter values for the model
425-
self.process_model(model, processing="update")
426-
427-
# update discretised quantities using disc
428-
model.concatenated_rhs = disc._concatenate_in_order(model.rhs)
429-
model.concatenated_algebraic = disc._concatenate_in_order(model.algebraic)
430-
model.concatenated_initial_conditions = disc._concatenate_in_order(
431-
model.initial_conditions
432-
).evaluate(0, None)
389+
raise NotImplementedError(
390+
"""
391+
update_model functionality has been deprecated.
392+
Use pybamm.InputParameter to quickly change a parameter value instead
393+
"""
394+
)
433395

434396
def process_geometry(self, geometry):
435397
"""
@@ -561,30 +523,6 @@ def _process_symbol(self, symbol):
561523
)
562524
)
563525

564-
def update_scalars(self, symbol):
565-
"""Update the value of any Scalars in the expression tree.
566-
567-
Parameters
568-
----------
569-
symbol : :class:`pybamm.Symbol`
570-
Symbol or Expression tree to update
571-
572-
Returns
573-
-------
574-
symbol : :class:`pybamm.Symbol`
575-
Symbol with Scalars updated
576-
577-
"""
578-
for x in symbol.pre_order():
579-
if isinstance(x, pybamm.Scalar):
580-
# update any Scalar nodes if their name is in the parameter dict
581-
if x.name in self._dict_items.keys():
582-
x.value = self._dict_items[x.name]
583-
# update id
584-
x.set_id()
585-
586-
return symbol
587-
588526
def evaluate(self, symbol):
589527
"""
590528
Process and evaluate a symbol.

tests/integration/test_models/standard_model_tests.py

-22
Original file line numberDiff line numberDiff line change
@@ -103,28 +103,6 @@ def test_all(
103103
):
104104
self.test_outputs()
105105

106-
def test_update_parameters(self, param):
107-
# check if geometry has changed, throw error if so (need to re-discretise)
108-
if any(
109-
[
110-
length in param.keys()
111-
and param[length] != self.parameter_values[length]
112-
for length in [
113-
"Negative electrode thickness [m]",
114-
"Separator thickness [m]",
115-
"Positive electrode thickness [m]",
116-
]
117-
]
118-
):
119-
raise ValueError(
120-
"geometry has changed, the orginal model needs to be re-discretised"
121-
)
122-
# otherwise update self.param and change the parameters in the discretised model
123-
self.param = param
124-
param.update_model(self.model, self.disc)
125-
# Model should still be well-posed after processing
126-
self.model.check_well_posedness(post_discretisation=True)
127-
128106

129107
class OptimisationsTest(object):
130108
""" Test that the optimised models give the same result as the original model. """

tests/integration/test_quick_plot.py

-7
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,6 @@ def test_plot_lithium_ion(self):
4141

4242
quick_plot.update(0.01)
4343

44-
# Update parameters, solve, plot again
45-
param.update({"Current function [A]": 0})
46-
param.update_model(spm, disc_spm)
47-
solution_spm = spm.default_solver.solve(spm, t_eval)
48-
quick_plot = pybamm.QuickPlot(solution_spm)
49-
quick_plot.plot(0)
50-
5144
# Test with different output variables
5245
output_vars = [
5346
"Negative particle surface concentration",

tests/unit/test_parameters/test_parameter_values.py

+23-8
Original file line numberDiff line numberDiff line change
@@ -303,18 +303,18 @@ def test_process_inline_function_parameters(self):
303303
def D(c):
304304
return c ** 2
305305

306-
parameter_values = pybamm.ParameterValues({"a": 3, "Diffusivity": D})
306+
parameter_values = pybamm.ParameterValues({"Diffusivity": D})
307307

308-
a = pybamm.Parameter("a")
308+
a = pybamm.InputParameter("a")
309309
func = pybamm.FunctionParameter("Diffusivity", a)
310310

311311
processed_func = parameter_values.process_symbol(func)
312-
self.assertEqual(processed_func.evaluate(), 9)
312+
self.assertEqual(processed_func.evaluate(u={"a": 3}), 9)
313313

314314
# process differentiated function parameter
315315
diff_func = func.diff(a)
316316
processed_diff_func = parameter_values.process_symbol(diff_func)
317-
self.assertEqual(processed_diff_func.evaluate(), 6)
317+
self.assertEqual(processed_diff_func.evaluate(u={"a": 3}), 6)
318318

319319
def test_multi_var_function_with_parameters(self):
320320
def D(a, b):
@@ -362,7 +362,7 @@ def test_process_interpolant(self):
362362
self.assertEqual(processed_diff_func.evaluate(), 2)
363363

364364
def test_interpolant_against_function(self):
365-
parameter_values = pybamm.ParameterValues({"a": 0.6})
365+
parameter_values = pybamm.ParameterValues({})
366366
parameter_values.update(
367367
{
368368
"function": "[function]lico2_ocp_Dualfoil1998",
@@ -379,14 +379,16 @@ def test_interpolant_against_function(self):
379379
check_already_exists=False,
380380
)
381381

382-
a = pybamm.Parameter("a")
382+
a = pybamm.InputParameter("a")
383383
func = pybamm.FunctionParameter("function", a)
384384
interp = pybamm.FunctionParameter("interpolation", a)
385385

386386
processed_func = parameter_values.process_symbol(func)
387387
processed_interp = parameter_values.process_symbol(interp)
388388
np.testing.assert_array_almost_equal(
389-
processed_func.evaluate(), processed_interp.evaluate(), decimal=4
389+
processed_func.evaluate(u={"a": 0.6}),
390+
processed_interp.evaluate(u={"a": 0.6}),
391+
decimal=4,
390392
)
391393

392394
# process differentiated function parameter
@@ -395,7 +397,9 @@ def test_interpolant_against_function(self):
395397
processed_diff_func = parameter_values.process_symbol(diff_func)
396398
processed_diff_interp = parameter_values.process_symbol(diff_interp)
397399
np.testing.assert_array_almost_equal(
398-
processed_diff_func.evaluate(), processed_diff_interp.evaluate(), decimal=2
400+
processed_diff_func.evaluate(u={"a": 0.6}),
401+
processed_diff_interp.evaluate(u={"a": 0.6}),
402+
decimal=2,
399403
)
400404

401405
def test_process_complex_expression(self):
@@ -500,6 +504,17 @@ def test_process_model(self):
500504
with self.assertRaises(KeyError):
501505
parameter_values.process_model(model)
502506

507+
def test_inplace(self):
508+
model = pybamm.lithium_ion.SPM()
509+
param = model.default_parameter_values
510+
new_model = param.process_model(model, inplace=False)
511+
512+
for val in list(model.rhs.values()):
513+
self.assertTrue(val.has_symbol_of_classes(pybamm.Parameter))
514+
515+
for val in list(new_model.rhs.values()):
516+
self.assertFalse(val.has_symbol_of_classes(pybamm.Parameter))
517+
503518
def test_process_empty_model(self):
504519
model = pybamm.BaseModel()
505520
parameter_values = pybamm.ParameterValues({"a": 1, "b": 2, "c": 3, "d": 42})

0 commit comments

Comments
 (0)