13#ifndef CHEMISTRY_ROSENBROCK_H
14#define CHEMISTRY_ROSENBROCK_H
16#include <Kokkos_Core.hpp>
32template <
typename Lanes>
34 constexpr bool CM = Lanes::column_major;
39 if (!(
largest > 0.0))
return false;
40 lanes.single([&]() { pivot[
c] = p; });
50 lanes.for_each(n -
c - 1, [&](
const uint32_t m) {
69template <
typename Lanes>
72 constexpr bool CM = Lanes::column_major;
78 const double t = b[
i];
86 const double b_j = b[
j];
133 static constexpr double gamma = 0.25;
134 static constexpr double a21 = 1.544;
135 static constexpr double a31 = 0.9466785280815826,
a32 = 0.2557011698983284;
136 static constexpr double a41 = 3.314825187068521,
a42 = 2.896124015972201,
a43 = 0.9986419139977817;
137 static constexpr double a51 = 1.221224509226641,
a52 = 6.019134481288629,
a53 = 12.53708332932087,
138 a54 = -0.6878860361058950;
139 static constexpr double c21 = -5.6688;
140 static constexpr double c31 = -2.430093356833875,
c32 = -0.2063599157091915;
141 static constexpr double c41 = -0.1073529058151375,
c42 = -9.594562251023355,
c43 = -20.47028614809616;
142 static constexpr double c51 = 7.496443313967647,
c52 = -10.24680431464352,
c53 = -33.99990352819905,
144 static constexpr double c61 = 8.083246795921522,
c62 = -7.981132988064893,
c63 = -31.52159432874371,
145 c64 = 16.31930543123136,
c65 = -6.058818238834054;
158 template <
typename Lanes>
160 constexpr bool CM = Lanes::column_major;
168 template <
typename Lanes>
184template <
typename Lanes,
typename System,
typename Solver>
186 const uint32_t n,
const double h,
const double *
y0,
const double *
f0,
187 double *
const k[6],
double * y,
double *
f_tmp) {
189 const double inv_h = 1.0 / h;
190 lanes.for_each(n, [&](
const uint32_t i) { k[0][
i] =
f0[
i]; });
192 solver.solve(lanes, k[0]);
194 lanes.for_each(n, [&](
const uint32_t i) { y[
i] =
y0[
i] + R::a21 * k[0][
i]; });
199 solver.solve(lanes, k[1]);
201 lanes.for_each(n, [&](
const uint32_t i) { y[
i] =
y0[
i] + R::a31 * k[0][
i] + R::a32 * k[1][
i]; });
204 lanes.for_each(n, [&](
const uint32_t i) { k[2][
i] =
f_tmp[
i] + (R::c31 * k[0][
i] + R::c32 * k[1][
i]) *
inv_h; });
206 solver.solve(lanes, k[2]);
208 lanes.for_each(n, [&](
const uint32_t i) {
209 y[
i] =
y0[
i] + R::a41 * k[0][
i] + R::a42 * k[1][
i] + R::a43 * k[2][
i];
213 lanes.for_each(n, [&](
const uint32_t i) {
214 k[3][
i] =
f_tmp[
i] + (R::c41 * k[0][
i] + R::c42 * k[1][
i] + R::c43 * k[2][
i]) *
inv_h;
217 solver.solve(lanes, k[3]);
219 lanes.for_each(n, [&](
const uint32_t i) {
220 y[
i] =
y0[
i] + R::a51 * k[0][
i] + R::a52 * k[1][
i] + R::a53 * k[2][
i] + R::a54 * k[3][
i];
224 lanes.for_each(n, [&](
const uint32_t i) {
225 k[4][
i] =
f_tmp[
i] + (R::c51 * k[0][
i] + R::c52 * k[1][
i] + R::c53 * k[2][
i] + R::c54 * k[3][
i]) *
inv_h;
228 solver.solve(lanes, k[4]);
230 lanes.for_each(n, [&](
const uint32_t i) { y[
i] += k[4][
i]; });
233 lanes.for_each(n, [&](
const uint32_t i) {
234 k[5][
i] =
f_tmp[
i] + (R::c61 * k[0][
i] + R::c62 * k[1][
i] + R::c63 * k[2][
i] + R::c64 * k[3][
i] +
235 R::c65 * k[4][
i]) *
inv_h;
238 solver.solve(lanes, k[5]);
239 lanes.for_each(n, [&](
const uint32_t i) { y[
i] += k[5][
i]; });
261template <
typename Lanes,
typename System,
typename Solver,
typename Observer = NoObserver>
263 const double t_start,
const double t_end,
double * y,
double & h,
277 h = Kokkos::fmin(h,
t_end - t_start);
288 if (!(
h_step > 1
e-14 * Kokkos::fmax(Kokkos::fabs(t),
t_end - t_start))) {
297 const double scale =
system.atol(
i) + options.
rtol * Kokkos::fmax(Kokkos::fabs(y[
i]),
299 const double e = k[5][
i] /
scale;
302 err = Kokkos::sqrt(
err / n);
305 if (!
ok ||
err > 1.0) {
308 h =
h_step * (
ok ? Kokkos::fmax(0.2, 0.9 * Kokkos::pow(
err, -0.25)) : 0.25);
315 double h_new =
h_step * Kokkos::fmin(6.0, Kokkos::fmax(0.2, 0.9 * Kokkos::pow(
err, -0.25)));
KOKKOS_INLINE_FUNCTION rtype dot(const rtype *a, const rtype *b)
Compute the dot product of two arrays.
Definition common_math.h:32
Execution of one cell's chemistry by one thread or by the vector lanes of a team: loops over species,...
KOKKOS_INLINE_FUNCTION void lu_solve(const Lanes &lanes, const uint32_t n, const double *LU, const uint32_t *pivot, double *b)
Solve A x = b in place with the factors of lu_factor, by columns: each column's updates go one row pe...
Definition rosenbrock.h:70
KOKKOS_INLINE_FUNCTION bool lu_factor(const Lanes &lanes, const uint32_t n, double *A, uint32_t *pivot)
Dense LU factorization with partial pivoting of the n x n matrix A (by rows, or by columns for lanes ...
Definition rosenbrock.h:33
KOKKOS_INLINE_FUNCTION void rodas_step(const Lanes &lanes, const System &system, const Solver &solver, const uint32_t n, const double h, const double *y0, const double *f0, double *const k[6], double *y, double *f_tmp)
One RODAS step of size h from y0 with f0 = f(y0), given the factored I / (gamma h) - J.
Definition rosenbrock.h:185
RosenbrockStatus
Definition rosenbrock.h:109
KOKKOS_INLINE_FUNCTION RosenbrockResult integrate(const Lanes &lanes, const System &system, const Solver &solver, const double t_start, const double t_end, double *y, double &h, const RosenbrockOptions &options, double *J, double *vectors, Observer &&observer=Observer())
Integrate dy/dt = f(y) from t_start to t_end with adaptive RODAS steps and error control sqrt(mean((e...
Definition rosenbrock.h:262
KOKKOS_INLINE_FUNCTION constexpr uint32_t rosenbrock_vectors_size(const uint32_t n)
Doubles of the vectors integrate() needs for a system of size n (besides the dense J).
Definition rosenbrock.h:176
Dense linear solver of integrate(): A = diagonal I - J factored by lu_factor in n * n doubles (LU,...
Definition rosenbrock.h:153
uint32_t * pivot
Definition rosenbrock.h:156
KOKKOS_INLINE_FUNCTION void solve(const Lanes &lanes, double *b) const
Definition rosenbrock.h:169
KOKKOS_INLINE_FUNCTION bool factor(const Lanes &lanes, const double *J, const double diagonal) const
Definition rosenbrock.h:159
uint32_t n
Definition rosenbrock.h:154
double * LU
Definition rosenbrock.h:155
An observer that ignores the trajectory.
Definition rosenbrock.h:122
KOKKOS_INLINE_FUNCTION void operator()(double, const double *, const double *) const
Definition rosenbrock.h:123
Coefficients of RODAS (Hairer & Wanner, Solving ODEs II, IV.7; rodas.f), a stiffly accurate,...
Definition rosenbrock.h:132
static constexpr double c21
Definition rosenbrock.h:139
static constexpr double gamma
Definition rosenbrock.h:133
static constexpr double c31
Definition rosenbrock.h:140
static constexpr double a21
Definition rosenbrock.h:134
static constexpr double a32
Definition rosenbrock.h:135
static constexpr double c63
Definition rosenbrock.h:144
static constexpr double a51
Definition rosenbrock.h:137
static constexpr double c65
Definition rosenbrock.h:145
static constexpr double a31
Definition rosenbrock.h:135
static constexpr double c61
Definition rosenbrock.h:144
static constexpr double c62
Definition rosenbrock.h:144
static constexpr double a43
Definition rosenbrock.h:136
static constexpr double c32
Definition rosenbrock.h:140
static constexpr double a53
Definition rosenbrock.h:137
static constexpr double a41
Definition rosenbrock.h:136
static constexpr double a42
Definition rosenbrock.h:136
static constexpr double c41
Definition rosenbrock.h:141
static constexpr double c54
Definition rosenbrock.h:143
static constexpr double c64
Definition rosenbrock.h:145
static constexpr double c42
Definition rosenbrock.h:141
static constexpr double a52
Definition rosenbrock.h:137
static constexpr double c53
Definition rosenbrock.h:142
static constexpr double c43
Definition rosenbrock.h:141
static constexpr double c52
Definition rosenbrock.h:142
static constexpr double a54
Definition rosenbrock.h:138
static constexpr double c51
Definition rosenbrock.h:142
Definition rosenbrock.h:103
double rtol
Definition rosenbrock.h:104
uint32_t max_steps
Definition rosenbrock.h:106
double h_initial
Definition rosenbrock.h:105
Definition rosenbrock.h:115
RosenbrockStatus status
Definition rosenbrock.h:116
uint32_t steps
Definition rosenbrock.h:117
uint32_t rejected
Definition rosenbrock.h:118
One thread does all the work of a cell.
Definition lanes.h:38
CellSetup< ExecSpace > c
Definition teno_setup.cpp:1810
uint8_t r
Definition teno_setup.cpp:687
SlotArray< double, Space > A
Definition teno_setup.cpp:478
Lane< rtype > scale
Definition teno_setup.cpp:531