@@ -83,7 +83,6 @@ def test_solving(self, solver=None, t_eval=None, inputs=None,
83
83
84
84
self .solution = self .solver .solve (
85
85
self .model , t_eval , inputs = inputs ,
86
- calculate_sensitivities = calculate_sensitivities
87
86
)
88
87
89
88
def test_outputs (self ):
@@ -93,40 +92,45 @@ def test_outputs(self):
93
92
)
94
93
std_out_test .test_all ()
95
94
96
- def test_sensitivities (self ):
97
- param_name = "Negative electrode conductivity [S.m-1]"
98
- neg_electrode_cond = 100.0
95
+ def test_sensitivities (self , param_name , param_value ):
99
96
self .parameter_values .update ({param_name : "[input]" })
100
- inputs = {param_name : neg_electrode_cond }
97
+ inputs = {param_name : param_value }
101
98
102
99
self .test_processing_parameters ()
103
100
self .test_processing_disc ()
104
101
105
- self .test_solving (inputs = inputs , calculate_sensitivities = True )
102
+ # Use tighter default tolerances for testing
103
+ self .solver .rtol = 1e-8
104
+ self .solver .atol = 1e-8
105
+
106
+ Crate = abs (
107
+ self .parameter_values ["Current function [A]" ]
108
+ / self .parameter_values ["Nominal cell capacity [A.h]" ]
109
+ )
110
+ t_eval = np .linspace (0 , 3600 / Crate , 100 )
111
+
112
+ self .solution = self .solver .solve (
113
+ self .model , t_eval , inputs = inputs ,
114
+ calculate_sensitivities = True
115
+ )
106
116
107
117
# check via finite differencing
108
- h = 1e-6
109
- inputs_plus = {param_name : neg_electrode_cond + 0.5 * h }
110
- inputs_neg = {param_name : neg_electrode_cond - 0.5 * h }
118
+ h = 1e-6 * param_value
119
+ inputs_plus = {param_name : ( param_value + 0.5 * h ) }
120
+ inputs_neg = {param_name : ( param_value - 0.5 * h ) }
111
121
sol_plus = self .solver .solve (
112
- self .model , self . solution . all_ts [ 0 ] , inputs = inputs_plus
122
+ self .model , t_eval , inputs = inputs_plus ,
113
123
)
114
124
sol_neg = self .solver .solve (
115
- self .model , self . solution . all_ts [ 0 ] , inputs = inputs_neg
125
+ self .model , t_eval , inputs = inputs_neg
116
126
)
117
- n = self .solution .sensitivities [param_name ].shape [0 ]
118
- np .testing .assert_array_almost_equal (
119
- self .solution .sensitivities [param_name ],
120
- ((sol_plus .y - sol_neg .y ) / h ).reshape ((n , 1 ))
127
+ fd = ((np .array (sol_plus .y ) - np .array (sol_neg .y )) / h )
128
+ fd = fd .transpose ().reshape (- 1 , 1 )
129
+ np .testing .assert_allclose (
130
+ self .solution .sensitivities [param_name ], fd ,
131
+ rtol = 1e-1 , atol = 1e-5 ,
121
132
)
122
133
123
- if (
124
- isinstance (
125
- self .model , (pybamm .lithium_ion .BaseModel , pybamm .lead_acid .BaseModel )
126
- )
127
- ):
128
- self .test_outputs ()
129
-
130
134
def test_all (
131
135
self , param = None , disc = None , solver = None , t_eval = None , skip_output_tests = False
132
136
):
0 commit comments