Skip to content

Commit 3ebec30

Browse files
committed
#1477 took out sensitivity=casadi option
1 parent 840f073 commit 3ebec30

File tree

3 files changed

+18
-295
lines changed

3 files changed

+18
-295
lines changed

pybamm/solvers/casadi_solver.py

+2-18
Original file line numberDiff line numberDiff line change
@@ -159,24 +159,8 @@ def _integrate(self, model, t_eval, inputs_dict=None):
159159
solution = self._run_integrator(
160160
model, model.y0, inputs_dict, inputs, t_eval, use_grid=False,
161161
)
162-
if self.sensitivity == "casadi" and inputs_dict != {}:
163-
# If the solution has already been created, we can reuse it
164-
if model in self.y_sols:
165-
y_sol = self.y_sols[model]
166-
solution = pybamm.Solution(
167-
t_eval, y_sol, model=model, inputs=inputs_dict,
168-
sensitivities=explicit_sensitivities
169-
)
170-
else:
171-
# Create integrator without grid, which will be called repeatedly
172-
# This is necessary for casadi to compute sensitivities
173-
self.create_integrator(model, inputs)
174-
solution = self._run_integrator(
175-
model, model.y0, inputs_dict, inputs, t_eval
176-
)
177-
solution.termination = "final time"
178-
return solution
179-
elif self.mode in ["fast", "fast with events"] or not model.events:
162+
163+
if self.mode in ["fast", "fast with events"] or not model.events:
180164
if not model.events:
181165
pybamm.logger.info("No events found, running fast mode")
182166
if self.mode == "fast with events":

pybamm/solvers/processed_variable.py

-73
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ def __init__(self, base_variables, base_variables_casadi, solution, warn=True):
4949
self.symbolic_inputs = solution.has_symbolic_inputs
5050

5151
self.u_sol = solution.y
52-
self.y_sym = solution._y_sym
5352

5453
# Sensitivity starts off uninitialized, only set when called
5554
self._sensitivity = None
@@ -512,8 +511,6 @@ def sensitivity(self):
512511
if self._sensitivity is None:
513512
if self.solution_sensitivity != {}:
514513
self.initialise_sensitivity_explicit_forward()
515-
elif self.y_sym is not None:
516-
self.initialise_sensitivity_casadi()
517514
else:
518515
raise ValueError(
519516
"Cannot compute sensitivities. The 'sensitivity' argument of the "
@@ -576,76 +573,6 @@ def initialise_sensitivity_explicit_forward(self):
576573
# Save attribute
577574
self._sensitivity = sensitivity
578575

579-
def initialise_sensitivity_casadi(self):
580-
def initialise_0D_symbolic():
581-
"Create a 0D symbolic variable"
582-
# Evaluate the base_variable index-by-index
583-
for idx in range(len(self.t_sol)):
584-
t = self.t_sol[idx]
585-
u = self.y_sym[:, idx]
586-
next_entries = self.base_variable_casadi(t, u, self.symbolic_inputs)
587-
if idx == 0:
588-
entries = next_entries
589-
else:
590-
entries = casadi.horzcat(entries, next_entries)
591-
592-
return entries
593-
594-
def initialise_1D_symbolic():
595-
"Create a 1D symbolic variable"
596-
# Evaluate the base_variable index-by-index
597-
for idx in range(len(self.t_sol)):
598-
t = self.t_sol[idx]
599-
u = self.y_sym[:, idx]
600-
next_entries = self.base_variable_casadi(t, u, self.symbolic_inputs)
601-
if idx == 0:
602-
entries = next_entries
603-
else:
604-
entries = casadi.vertcat(entries, next_entries)
605-
606-
return entries
607-
608-
inputs_stacked = casadi.vertcat(*self.inputs.values())
609-
self.base_eval = self.base_variable_casadi(
610-
self.t_sol[0], self.u_sol[:, 0], inputs_stacked
611-
)
612-
if (
613-
isinstance(self.base_eval, numbers.Number)
614-
or len(self.base_eval.shape) == 0
615-
or self.base_eval.shape[0] == 1
616-
):
617-
entries_MX = initialise_0D_symbolic()
618-
else:
619-
n = self.mesh.npts
620-
base_shape = self.base_eval.shape[0]
621-
# Try shape that could make the variable a 1D variable
622-
if base_shape == n:
623-
entries_MX = initialise_1D_symbolic()
624-
else:
625-
# Raise error for 2D variable
626-
raise NotImplementedError(
627-
"Shape not recognized for {} ".format(self.base_variable)
628-
+ "(note processing of 2D and 3D variables is not yet "
629-
+ "implemented)"
630-
)
631-
632-
# Compute jacobian
633-
sens_MX = casadi.jacobian(entries_MX, self.symbolic_inputs)
634-
casadi_sens_fn = casadi.Function("variable", [self.symbolic_inputs], [sens_MX])
635-
636-
sens_eval = casadi_sens_fn(inputs_stacked)
637-
sensitivity = {"all": sens_eval}
638-
639-
# Add the individual sensitivity
640-
start = 0
641-
for name, inp in self.inputs.items():
642-
end = start + inp.shape[0]
643-
sensitivity[name] = sens_eval[:, start:end]
644-
start = end
645-
646-
self._sensitivity = sensitivity
647-
648-
649576
class Interpolant1D:
650577
def __init__(self, pts_for_interp, entries_for_interp):
651578
self.interpolant = interp.interp1d(

0 commit comments

Comments
 (0)