10
10
11
11
template <typename BurnT>
12
12
AMREX_GPU_HOST_DEVICE AMREX_INLINE
13
- void actual_integrator (BurnT& state, const Real dt, bool is_retry=false )
13
+ void actual_integrator (BurnT& state, const amrex:: Real dt, bool is_retry=false )
14
14
{
15
15
constexpr int int_neqs = integrator_neqs<BurnT>();
16
16
@@ -26,7 +26,7 @@ void actual_integrator (BurnT& state, const Real dt, bool is_retry=false)
26
26
be.tout = dt;
27
27
28
28
// set the Jacobian type
29
- if (is_retry && retry_swap_jacobian) {
29
+ if (is_retry && integrator_rp:: retry_swap_jacobian) {
30
30
be.jacobian_type = (jacobian == 1 ) ? 2 : 1 ;
31
31
} else {
32
32
be.jacobian_type = jacobian;
@@ -39,30 +39,30 @@ void actual_integrator (BurnT& state, const Real dt, bool is_retry=false)
39
39
// Save the initial composition and temperature for our later diagnostics.
40
40
41
41
#ifndef AMREX_USE_GPU
42
- Real xn_in[NumSpec];
42
+ amrex:: Real xn_in[NumSpec];
43
43
for (int n = 0 ; n < NumSpec; ++n) {
44
44
xn_in[n] = state.y [SFS+n] / state.y [SRHO];
45
45
}
46
46
// we are assuming that the temperature was valid on input
47
- Real T_in = state.T ;
47
+ amrex:: Real T_in = state.T ;
48
48
#ifdef AUX_THERMO
49
- Real aux_in[NumAux];
49
+ amrex:: Real aux_in[NumAux];
50
50
for (int n = 0 ; n < NumAux; ++n) {
51
51
aux_in[n] = state.y [SFX+n] / state.y [SRHO];
52
52
}
53
53
#endif
54
- Real rhoe_in = state.y [SEINT];
54
+ amrex:: Real rhoe_in = state.y [SEINT];
55
55
#endif
56
56
57
57
58
58
// Set the tolerances.
59
59
60
- Real sdc_tol_fac = std::pow (sdc_burn_tol_factor, state.num_sdc_iters - state.sdc_iter - 1 );
60
+ amrex:: Real sdc_tol_fac = std::pow (integrator_rp:: sdc_burn_tol_factor, state.num_sdc_iters - state.sdc_iter - 1 );
61
61
62
62
// we use 1-based indexing inside of BackwardEuler, so we need to shift the
63
63
// indices SRHO, SFS, etc by 1
64
64
65
- Real sdc_min_density = amrex::min (state.rho , state.rho_orig + state.ydot_a [SRHO] * dt);
65
+ amrex:: Real sdc_min_density = amrex::min (state.rho , state.rho_orig + state.ydot_a [SRHO] * dt);
66
66
67
67
if (!is_retry) {
68
68
@@ -115,7 +115,7 @@ void actual_integrator (BurnT& state, const Real dt, bool is_retry=false)
115
115
// we only evolved (rho e), not (rho E), so we need to update the
116
116
// total energy now to ensure we are conservative
117
117
118
- Real rho_Sdot = 0 .0_rt;
118
+ amrex:: Real rho_Sdot = 0 .0_rt;
119
119
if (state.time > 0 ) {
120
120
rho_Sdot = (state.y [SEINT] - state.rhoe_orig ) / state.time - state.ydot_a [SEINT];
121
121
}
@@ -134,10 +134,28 @@ void actual_integrator (BurnT& state, const Real dt, bool is_retry=false)
134
134
135
135
normalize_abundances_sdc_burn (state);
136
136
137
+ // BE does not always fail even though it can lead to unphysical states.
138
+ // Add some checks that indicate a burn fail even if VODE thinks the
139
+ // integration was successful.
140
+
137
141
if (istate != IERR_SUCCESS) {
138
142
state.success = false ;
139
143
}
140
144
145
+ if (state.y [SEINT] < 0 .0_rt) {
146
+ state.success = false ;
147
+ }
148
+
149
+ for (int n = 0 ; n < NumSpec; ++n) {
150
+ if (state.y [SFS+n] / state.rho < -species_failure_tolerance) {
151
+ state.success = false ;
152
+ }
153
+
154
+ if (state.y [SFS+n] / state.rho > 1 .0_rt + species_failure_tolerance) {
155
+ state.success = false ;
156
+ }
157
+ }
158
+
141
159
142
160
#ifndef AMREX_USE_GPU
143
161
if (burner_verbose) {
@@ -153,59 +171,67 @@ void actual_integrator (BurnT& state, const Real dt, bool is_retry=false)
153
171
// If we failed, print out the current state of the integration.
154
172
155
173
if (!state.success ) {
174
+ if (istate != IERR_ENTERED_NSE) {
156
175
#ifndef AMREX_USE_GPU
157
- std::cout << Font::Bold << FGColor::Red << " [ERROR] integration failed in net" << ResetDisplay << std::endl;
158
- std::cout << " istate = " << istate << std::endl;
159
- std::cout << " zone = (" << state.i << " , " << state.j << " , " << state.k << " )" << std::endl;
160
- std::cout << " time = " << state.time << std::endl;
161
- std::cout << " dt = " << std::setprecision (16 ) << dt << std::endl;
162
- std::cout << " dens start = " << std::setprecision (16 ) << state.rho_orig << std::endl;
163
- std::cout << " temp start = " << std::setprecision (16 ) << T_in << std::endl;
164
- std::cout << " rhoe start = " << std::setprecision (16 ) << rhoe_in << std::endl;
165
- std::cout << " xn start = " ;
166
- for (int n = 0 ; n < NumSpec; ++n) {
167
- std::cout << std::setprecision (16 ) << xn_in[n] << " " ;
168
- }
169
- std::cout << std::endl;
176
+ std::cout << Font::Bold << FGColor::Red << " [ERROR] integration failed in net" << ResetDisplay << std::endl;
177
+ std::cout << " istate = " << istate << std::endl;
178
+ if (istate == IERR_SUCCESS) {
179
+ std::cout << " BE exited successfully, but a check on the data values failed" << std::endl;
180
+ }
181
+ std::cout << " zone = (" << state.i << " , " << state.j << " , " << state.k << " )" << std::endl;
182
+ std::cout << " time = " << state.time << std::endl;
183
+ std::cout << " dt = " << std::setprecision (16 ) << dt << std::endl;
184
+ std::cout << " dens start = " << std::setprecision (16 ) << state.rho_orig << std::endl;
185
+ std::cout << " temp start = " << std::setprecision (16 ) << T_in << std::endl;
186
+ std::cout << " rhoe start = " << std::setprecision (16 ) << rhoe_in << std::endl;
187
+ std::cout << " xn start = " ;
188
+ for (const auto X : xn_in) {
189
+ std::cout << std::setprecision (16 ) << X << " " ;
190
+ }
191
+ std::cout << std::endl;
170
192
#ifdef AUX_THERMO
171
- std::cout << " aux start = " ;
172
- for ( int n = 0 ; n < NumAux; ++n ) {
173
- std::cout << std::setprecision (16 ) << aux_in[n] << " " ;
174
- }
175
- std::cout << std::endl;
193
+ std::cout << " aux start = " ;
194
+ for ( const auto aux : aux_in ) {
195
+ std::cout << std::setprecision (16 ) << aux << " " ;
196
+ }
197
+ std::cout << std::endl;
176
198
#endif
177
- std::cout << " dens current = " << std::setprecision (16 ) << state.rho << std::endl;
178
- std::cout << " temp current = " << std::setprecision (16 ) << state.T << std::endl;
179
- std::cout << " xn current = " ;
180
- for (int n = 0 ; n < NumSpec; ++n) {
181
- std::cout << std::setprecision (16 ) << state.xn [n] << " " ;
182
- }
183
- std::cout << std::endl;
199
+ std::cout << " dens current = " << std::setprecision (16 ) << state.rho << std::endl;
200
+ std::cout << " temp current = " << std::setprecision (16 ) << state.T << std::endl;
201
+ std::cout << " xn current = " ;
202
+ for (int n = 0 ; n < NumSpec; ++n) {
203
+ std::cout << std::setprecision (16 ) << state.xn [n] << " " ;
204
+ }
205
+ std::cout << std::endl;
184
206
#ifdef AUX_THERMO
185
- std::cout << " aux current = " ;
186
- for (int n = 0 ; n < NumAux; ++n) {
187
- std::cout << std::setprecision (16 ) << state.aux [n] << " " ;
188
- }
189
- std::cout << std::endl;
207
+ std::cout << " aux current = " ;
208
+ for (int n = 0 ; n < NumAux; ++n) {
209
+ std::cout << std::setprecision (16 ) << state.aux [n] << " " ;
210
+ }
211
+ std::cout << std::endl;
190
212
#endif
191
- std::cout << " A(rho) = " << std::setprecision (16 ) << state.ydot_a [SRHO] << std::endl;
192
- std::cout << " A(rho e) = " << std::setprecision (16 ) << state.ydot_a [SEINT] << std::endl;
193
- std::cout << " A(rho X_k) = " ;
194
- for (int n = 0 ; n < NumSpec; n++) {
195
- std::cout << std::setprecision (16 ) << state.ydot_a [SFS+n] << " " ;
196
- }
197
- std::cout << std::endl;
213
+ std::cout << " A(rho) = " << std::setprecision (16 ) << state.ydot_a [SRHO] << std::endl;
214
+ std::cout << " A(rho e) = " << std::setprecision (16 ) << state.ydot_a [SEINT] << std::endl;
215
+ std::cout << " A(rho X_k) = " ;
216
+ for (int n = 0 ; n < NumSpec; n++) {
217
+ std::cout << std::setprecision (16 ) << state.ydot_a [SFS+n] << " " ;
218
+ }
219
+ std::cout << std::endl;
198
220
#ifdef AUX_THERMO
199
- std::cout << " A(rho aux_k) = " ;
200
- for (int n = 0 ; n < NumAux; n++) {
201
- std::cout << std::setprecision (16 ) << state.ydot_a [SFX+n] << " " ;
202
- }
203
- std::cout << std::endl;
221
+ std::cout << " A(rho aux_k) = " ;
222
+ for (int n = 0 ; n < NumAux; n++) {
223
+ std::cout << std::setprecision (16 ) << state.ydot_a [SFX+n] << " " ;
224
+ }
225
+ std::cout << std::endl;
226
+ #endif
204
227
#endif
228
+ } else {
229
+ #ifndef AMREX_USE_GPU
230
+ std::cout << " burn entered NSE during integration (after " << state.n_step << " steps), zone = (" << state.i << " , " << state.j << " , " << state.k << " )" << std::endl;
205
231
#endif
232
+ }
206
233
}
207
234
208
-
209
235
}
210
236
211
237
#endif
0 commit comments