@@ -30,9 +30,19 @@ def build_model(parameter, model_, option, value):
3030
3131
3232class SolveModel :
33- solver = pybamm .CasadiSolver ()
34-
35- def solve_setup (self , parameter , model_ , option , value ):
33+ def solve_setup (self , parameter , model_ , option , value , solver_class ):
34+ import importlib
35+
36+ idaklu_spec = importlib .util .find_spec ("pybamm.solvers.idaklu" )
37+ if idaklu_spec is not None :
38+ try :
39+ idaklu = importlib .util .module_from_spec (idaklu_spec )
40+ idaklu_spec .loader .exec_module (idaklu )
41+ except ImportError as e : # pragma: no cover
42+ print ("XXXXX cannot find klu" , e )
43+ idaklu_spec = None
44+
45+ self .solver = solver_class ()
3646 self .model = model_ ({option : value })
3747 c_rate = 1
3848 tmax = 4000 / c_rate
@@ -62,7 +72,7 @@ def solve_setup(self, parameter, model_, option, value):
6272 disc .process_model (self .model )
6373
6474 def solve_model (self , model , params ):
65- SolveModel .solver .solve (self .model , t_eval = self .t_eval )
75+ self .solver .solve (self .model , t_eval = self .t_eval )
6676
6777
6878class TimeBuildModelLossActiveMaterial :
@@ -78,17 +88,20 @@ def time_setup_model(self, model, params):
7888
7989
8090class TimeSolveLossActiveMaterial :
81- param_names = ["model" , "model option" ]
91+ param_names = ["model" , "model option" , "solver class" ]
8292 params = (
8393 [pybamm .lithium_ion .SPM , pybamm .lithium_ion .DFN ],
8494 ["none" , "stress-driven" , "reaction-driven" , "stress and reaction-driven" ],
95+ [pybamm .CasadiSolver , pybamm .IDAKLUSolver ],
8596 )
8697
87- def setup (self , model , params ):
88- SolveModel .solve_setup (self , "Ai2020" , model , "loss of active material" , params )
98+ def setup (self , model , params , solver_class ):
99+ SolveModel .solve_setup (
100+ self , "Ai2020" , model , "loss of active material" , params , solver_class
101+ )
89102
90- def time_solve_model (self , model , params ):
91- SolveModel .solver .solve (self .model , t_eval = self .t_eval )
103+ def time_solve_model (self , model , params , solver_class ):
104+ self .solver .solve (self .model , t_eval = self .t_eval )
92105
93106
94107class TimeBuildModelLithiumPlating :
@@ -103,17 +116,20 @@ def time_setup_model(self, model, params):
103116
104117
105118class TimeSolveLithiumPlating :
106- param_names = ["model" , "model option" ]
119+ param_names = ["model" , "model option" , "solver class" ]
107120 params = (
108121 [pybamm .lithium_ion .SPM , pybamm .lithium_ion .DFN ],
109122 ["none" , "irreversible" , "reversible" , "partially reversible" ],
123+ [pybamm .CasadiSolver , pybamm .IDAKLUSolver ],
110124 )
111125
112- def setup (self , model , params ):
113- SolveModel .solve_setup (self , "OKane2020" , model , "lithium plating" , params )
126+ def setup (self , model , params , solver_class ):
127+ SolveModel .solve_setup (
128+ self , "OKane2020" , model , "lithium plating" , params , solver_class
129+ )
114130
115- def time_solve_model (self , model , params ):
116- SolveModel .solver .solve (self .model , t_eval = self .t_eval )
131+ def time_solve_model (self , model , params , solver_class ):
132+ self .solver .solve (self .model , t_eval = self .t_eval )
117133
118134
119135class TimeBuildModelSEI :
@@ -138,7 +154,7 @@ def time_setup_model(self, model, params):
138154
139155
140156class TimeSolveSEI :
141- param_names = ["model" , "model option" ]
157+ param_names = ["model" , "model option" , "solver class" ]
142158 params = (
143159 [pybamm .lithium_ion .SPM , pybamm .lithium_ion .DFN ],
144160 [
@@ -152,13 +168,14 @@ class TimeSolveSEI:
152168 "ec reaction limited" ,
153169 "ec reaction limited (asymmetric)" ,
154170 ],
171+ [pybamm .CasadiSolver , pybamm .IDAKLUSolver ],
155172 )
156173
157- def setup (self , model , params ):
158- SolveModel .solve_setup (self , "Marquis2019" , model , "SEI" , params )
174+ def setup (self , model , params , solver_class ):
175+ SolveModel .solve_setup (self , "Marquis2019" , model , "SEI" , params , solver_class )
159176
160- def time_solve_model (self , model , params ):
161- SolveModel .solver .solve (self .model , t_eval = self .t_eval )
177+ def time_solve_model (self , model , params , solver_class ):
178+ self .solver .solve (self .model , t_eval = self .t_eval )
162179
163180
164181class TimeBuildModelParticle :
@@ -178,7 +195,7 @@ def time_setup_model(self, model, params):
178195
179196
180197class TimeSolveParticle :
181- param_names = ["model" , "model option" ]
198+ param_names = ["model" , "model option" , "solver class" ]
182199 params = (
183200 [pybamm .lithium_ion .SPM , pybamm .lithium_ion .DFN ],
184201 [
@@ -187,13 +204,16 @@ class TimeSolveParticle:
187204 "quadratic profile" ,
188205 "quartic profile" ,
189206 ],
207+ [pybamm .CasadiSolver , pybamm .IDAKLUSolver ],
190208 )
191209
192- def setup (self , model , params ):
193- SolveModel .solve_setup (self , "Marquis2019" , model , "particle" , params )
210+ def setup (self , model , params , solver_class ):
211+ SolveModel .solve_setup (
212+ self , "Marquis2019" , model , "particle" , params , solver_class
213+ )
194214
195- def time_solve_model (self , model , params ):
196- SolveModel .solver .solve (self .model , t_eval = self .t_eval )
215+ def time_solve_model (self , model , params , solver_class ):
216+ self .solver .solve (self .model , t_eval = self .t_eval )
197217
198218
199219class TimeBuildModelThermal :
@@ -208,17 +228,20 @@ def time_setup_model(self, model, params):
208228
209229
210230class TimeSolveThermal :
211- param_names = ["model" , "model option" ]
231+ param_names = ["model" , "model option" , "solver class" ]
212232 params = (
213233 [pybamm .lithium_ion .SPM , pybamm .lithium_ion .DFN ],
214234 ["isothermal" , "lumped" , "x-lumped" , "x-full" ],
235+ [pybamm .CasadiSolver , pybamm .IDAKLUSolver ],
215236 )
216237
217- def setup (self , model , params ):
218- SolveModel .solve_setup (self , "Marquis2019" , model , "thermal" , params )
238+ def setup (self , model , params , solver_class ):
239+ SolveModel .solve_setup (
240+ self , "Marquis2019" , model , "thermal" , params , solver_class
241+ )
219242
220- def time_solve_model (self , model , params ):
221- SolveModel .solver .solve (self .model , t_eval = self .t_eval )
243+ def time_solve_model (self , model , params , solver_class ):
244+ self .solver .solve (self .model , t_eval = self .t_eval )
222245
223246
224247class TimeBuildModelSurfaceForm :
@@ -233,14 +256,17 @@ def time_setup_model(self, model, params):
233256
234257
235258class TimeSolveSurfaceForm :
236- param_names = ["model" , "model option" ]
259+ param_names = ["model" , "model option" , "solver class" ]
237260 params = (
238261 [pybamm .lithium_ion .SPM , pybamm .lithium_ion .DFN ],
239262 ["false" , "differential" , "algebraic" ],
263+ [pybamm .CasadiSolver , pybamm .IDAKLUSolver ],
240264 )
241265
242- def setup (self , model , params ):
243- SolveModel .solve_setup (self , "Marquis2019" , model , "surface form" , params )
266+ def setup (self , model , params , solver_class ):
267+ SolveModel .solve_setup (
268+ self , "Marquis2019" , model , "surface form" , params , solver_class
269+ )
244270
245- def time_solve_model (self , model , params ):
246- SolveModel .solver .solve (self .model , t_eval = self .t_eval )
271+ def time_solve_model (self , model , params , solver_class ):
272+ self .solver .solve (self .model , t_eval = self .t_eval )
0 commit comments