13#ifndef CHEMISTRY_KINETICS_H
14#define CHEMISTRY_KINETICS_H
20#include <Kokkos_Core.hpp>
69template <
typename MemorySpace = Kokkos::DefaultExecutionSpace::memory_space>
72 using View1 = Kokkos::View<T *, MemorySpace>;
79 Kokkos::View<double *[3], Kokkos::LayoutRight, MemorySpace>
rate;
80 Kokkos::View<double *[3], Kokkos::LayoutRight, MemorySpace>
low;
109 Kokkos::View<double *[3], Kokkos::LayoutRight, MemorySpace>
plog_rate;
130 const double whole = Kokkos::floor(order);
131 if (
whole == order && order >= 0.0 && order <= 4.0) {
136 return Kokkos::pow(Kokkos::fmax(C, 0.0), order);
142 if (order > 0.0 && order < 1.0 && C <
C_reg) {
143 const double x = C /
C_reg;
144 return Kokkos::pow(
C_reg, order) * x * ((2.0 - order) + (order - 1.0) * Kokkos::fmax(x, 0.0));
152 if (order == 0.0)
return 0.0;
153 if (order > 0.0 && order < 1.0 && C <
C_reg) {
154 const double x = C /
C_reg;
155 return Kokkos::pow(
C_reg, order - 1.0) * ((2.0 - order) + 2.0 * (order - 1.0) * Kokkos::fmax(x, 0.0));
161 static double arrhenius(
const double A,
const double b,
const double Ea_R,
const double log_T,
const double inv_T) {
162 return A * Kokkos::exp(b * log_T - Ea_R * inv_T);
185 constexpr double LN10 = 2.302585092994045684;
222 double sum = 0.0,
dsum = 0.0;
245 k = Kokkos::pow(10.0,
log_k);
267 constexpr double SMALL = 1
e-300;
268 constexpr double LN10 = 2.302585092994045684;
272 const double L = Kokkos::log10(Kokkos::fmax(Pr,
SMALL));
276 const double e3 = Kokkos::fabs(
T3) >
SMALL ? Kokkos::exp(-T /
T3) : 0.0;
277 const double e1 = Kokkos::fabs(
T1) >
SMALL ? Kokkos::exp(-T /
T1) : 0.0;
278 const double e2 =
T2 != 0.0 ? Kokkos::exp(-
T2 / T) : 0.0;
283 const double Lc = Kokkos::log10(Kokkos::fmax(
Fcent,
SMALL));
284 const double c = -0.4 - 0.67 *
Lc;
285 const double n = 0.75 - 1.27 *
Lc;
286 const double x =
L +
c;
287 const double D = n - 0.14 * x;
288 const double f1 = x /
D;
289 const double g = 1.0 / (1.0 +
f1 *
f1);
291 F = Kokkos::pow(10.0,
logF);
294 const double df1_dLc = (-0.67 *
D - x * (-1.27 + 0.14 * 0.67)) / (
D *
D);
303 const double X = 1.0 / (1.0 +
L *
L);
304 const double ea =
a * Kokkos::exp(-b / T),
ec = Kokkos::exp(-T /
c);
305 const double Z =
ea +
ec;
306 F = d * Kokkos::pow(
Z,
X) * Kokkos::pow(T,
e);
326 template <
typename Lanes>
328 const double C_total,
const double *
g_RT,
const double * h_RT,
330 const double log_T = Kokkos::log(T), inv_T = 1.0 / T;
350 const double Pr =
kf > 0.0 ?
k0 * M /
kf : 0.0;
358 kf *= Pr / (1.0 + Pr) *
F;
395 if (b ==
a)
continue;
406 if (b ==
a)
continue;
433 template <
typename Lanes>
435 double * partial =
nullptr)
const {
436 if constexpr (Lanes::parallel) {
474 template <
typename Lanes>
478 double uniform = 0.0;
485 const double * block = d.
dq_dT;
506 template <
typename Lanes>
510 constexpr bool CM = Lanes::column_major;
511 if constexpr (Lanes::parallel) {
514 lanes.for_each(n, [&](
const uint32_t k) {
515 double uniform = 0.0;
525 const double * block = d.
dq_dT;
536 lanes.for_each(n, [&](
const uint32_t k) {
539 double uniform = 0.0;
552 }
else if (
all != 0.0) {
571template <
typename MemorySpace = Kokkos::DefaultExecutionSpace::memory_space>
580 auto u32 = [](
size_t n) {
return static_cast<uint32_t>(n); };
589 for (
size_t e = 0;
e <
r.plog.size();
e++) {
590 if (
e == 0 ||
r.plog[
e].first !=
r.plog[
e - 1].first) {
592 plog_ln_p.push_back(std::log(
r.plog[
e].first));
594 plog_rate.insert(plog_rate.end(), {r.plog[e].second.A, r.plog[e].second.b, r.plog[e].second.Ea_R});
599 cheb.insert(
cheb.end(),
r.chebyshev.begin(),
r.chebyshev.end());
609 reversible[
i] =
r.reversible;
611 for (
int a = 0;
a < 2;
a++) {
612 std::vector<double> &
dst =
a ? low : rate;
618 for (
const auto & [k, order] :
r.orders) {
620 f_ord.push_back(order);
623 for (
const auto & [k,
nu] :
r.products) {
628 std::vector<double>
net(t.n_species, 0.0);
629 for (
const auto & [k,
nu] :
r.products)
net[k] +=
nu;
630 for (
const auto & [k,
nu] :
r.reactants)
net[k] -=
nu;
632 for (
uint32_t k = 0; k < t.n_species; k++) {
633 if (
net[k] == 0.0)
continue;
641 for (
const auto & [k,
eff] :
r.efficiencies) {
647 auto copy = [](
const auto & v,
const char *
label) {
648 using T =
typename std::decay_t<
decltype(v)>::value_type;
649 Kokkos::View<T *, MemorySpace> d(
label, v.size());
650 auto h = Kokkos::create_mirror_view(d);
651 for (
size_t a = 0;
a < v.size();
a++) h(
a) = v[
a];
652 Kokkos::deep_copy(d, h);
655 auto copy2 = [&](
const std::vector<double> & v,
auto &
dst,
const char *
label) {
656 using V = std::decay_t<
decltype(
dst)>;
657 constexpr size_t W = V::static_extent(1);
659 auto h = Kokkos::create_mirror_view(
dst);
660 for (
size_t a = 0;
a < v.size() / W;
a++) {
661 for (
size_t b = 0; b < W; b++) h(
a, b) = v[
a * W + b];
663 Kokkos::deep_copy(
dst, h);
665 t.type =
copy(type,
"kinetics_type");
667 t.reversible =
copy(reversible,
"kinetics_reversible");
668 copy2(rate, t.rate,
"kinetics_rate");
669 copy2(low, t.low,
"kinetics_low");
670 copy2(
params, t.falloff_params,
"kinetics_falloff_params");
671 t.forward_offset =
copy(
f_off,
"kinetics_forward_offset");
672 t.forward_species =
copy(
f_sp,
"kinetics_forward_species");
673 t.forward_order =
copy(
f_ord,
"kinetics_forward_order");
674 t.reverse_offset =
copy(
r_off,
"kinetics_reverse_offset");
675 t.reverse_species =
copy(
r_sp,
"kinetics_reverse_species");
676 t.reverse_order =
copy(
r_ord,
"kinetics_reverse_order");
677 t.net_offset =
copy(
n_off,
"kinetics_net_offset");
678 t.net_species =
copy(
n_sp,
"kinetics_net_species");
679 t.net_nu =
copy(
n_nu,
"kinetics_net_nu");
681 std::vector<uint32_t>
s_off(t.n_species + 1, 0),
s_re(
n_sp.size());
682 std::vector<double>
s_nu(
n_sp.size());
685 std::vector<uint32_t> fill(
s_off.begin(),
s_off.end() - 1);
694 std::vector<uint32_t> offsets{0},
ends;
695 for (
uint32_t k = 0; k < t.n_species; k++) {
699 t.chunk_offset =
copy(offsets,
"kinetics_chunk_offset");
700 t.chunk_end =
copy(
ends,
"kinetics_chunk_end");
706 std::vector<std::vector<std::pair<uint32_t, double>>> terms(
static_cast<size_t>(t.n_species) * t.n_species);
707 for (
uint32_t k = 0; k < t.n_species; k++) {
725 std::vector<uint32_t>
rows, columns, offsets{0}, sources;
726 std::vector<double> coefficients;
727 for (
uint32_t k = 0; k < t.n_species; k++) {
729 const auto &
list = terms[k * t.n_species +
j];
730 if (
list.empty())
continue;
732 columns.push_back(
j);
734 sources.push_back(source);
737 offsets.push_back(
static_cast<uint32_t>(sources.size()));
740 t.entry_row =
copy(
rows,
"kinetics_entry_row");
741 t.entry_column =
copy(columns,
"kinetics_entry_column");
742 t.entry_offset =
copy(offsets,
"kinetics_entry_offset");
743 t.term_source =
copy(sources,
"kinetics_term_source");
744 t.term_coefficient =
copy(coefficients,
"kinetics_term_coefficient");
746 t.species_offset =
copy(
s_off,
"kinetics_species_offset");
747 t.species_reaction =
copy(
s_re,
"kinetics_species_reaction");
748 t.species_nu =
copy(
s_nu,
"kinetics_species_nu");
749 t.delta_nu =
copy(delta_nu,
"kinetics_delta_nu");
750 t.efficiency_offset =
copy(
e_off,
"kinetics_efficiency_offset");
751 t.efficiency_species =
copy(
e_sp,
"kinetics_efficiency_species");
752 t.efficiency_extra =
copy(
e_extra,
"kinetics_efficiency_extra");
753 t.default_efficiency =
copy(
default_eff,
"kinetics_default_efficiency");
755 t.plog_ln_p =
copy(plog_ln_p,
"kinetics_plog_ln_p");
757 copy2(plog_rate, t.plog_rate,
"kinetics_plog_rate");
758 t.chebyshev_offset =
copy(
cheb_off,
"kinetics_chebyshev_offset");
759 t.chebyshev_n_p =
copy(
cheb_n_p,
"kinetics_chebyshev_n_p");
760 t.chebyshev =
copy(
cheb,
"kinetics_chebyshev");
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,...
std::string third_body
Definition mechanism.cpp:60
bool falloff
Definition mechanism.cpp:61
Gas-phase mechanisms read from Cantera YAML files.
constexpr double ONE_ATM
Definition mechanism.h:28
constexpr double GAS_CONSTANT
Definition mechanism.h:26
KineticsTable< MemorySpace > make_kinetics_table(const Mechanism &mechanism, const double C_reg=KineticsTable< MemorySpace >::C_REG)
Copy a mechanism's reactions to MemorySpace.
Definition kinetics.h:572
Modified Arrhenius rate k = A T^b exp(-Ea / (R T)), SI units with kmol.
Definition mechanism.h:97
double A
Definition mechanism.h:98
Reactions of a mechanism as flat device tables (compressed rows per reaction), in MemorySpace....
Definition kinetics.h:70
KOKKOS_INLINE_FUNCTION void pressure_rate(const uint32_t i, const double log_T, const double inv_T, const double ln_p, double &k, double &dlnk_dT, double &dlnk_dlnp) const
Rate constant of a PLOG or Chebyshev reaction at T and ln p, with d ln k / dT at fixed p and d ln k /...
Definition kinetics.h:183
KOKKOS_INLINE_FUNCTION void production_jacobian_entries(const Lanes &lanes, const ReactionDerivatives &d, double *values, double *all_columns) const
The structural entries of the Jacobian of the production rates (d omega_k / d C_j at fixed T,...
Definition kinetics.h:475
View1< double > term_coefficient
Definition kinetics.h:100
View1< uint32_t > reverse_species
Definition kinetics.h:86
static constexpr uint32_t MAX_KEPT
Factors C^order of a reaction's products that the derivatives reuse.
Definition kinetics.h:125
View1< uint32_t > chunk_end
Definition kinetics.h:95
View1< uint32_t > chebyshev_offset
Definition kinetics.h:110
View1< double > delta_nu
Definition kinetics.h:101
View1< double > plog_ln_p
Definition kinetics.h:107
KOKKOS_INLINE_FUNCTION void plog_level(const uint32_t l, const double log_T, const double inv_T, double &k, double &dlnk_dT) const
Sum of the PLOG rates at pressure level l and its d ln k / dT.
Definition kinetics.h:167
static KOKKOS_INLINE_FUNCTION double plain_power(const double C, const double order)
C^order: repeated products for integer orders, pow of max(C, 0) otherwise.
Definition kinetics.h:129
View1< uint32_t > chunk_offset
Definition kinetics.h:94
View1< uint32_t > plog_rate_offset
Definition kinetics.h:108
View1< uint8_t > type
Definition kinetics.h:76
KOKKOS_INLINE_FUNCTION void production_rates(const double *q, double *omega) const
Definition kinetics.h:466
static KOKKOS_INLINE_FUNCTION double arrhenius(const double A, const double b, const double Ea_R, const double log_T, const double inv_T)
Definition kinetics.h:161
KOKKOS_INLINE_FUNCTION double third_body(const uint32_t i, const double *C, const double C_total) const
Third-body concentration of reaction i.
Definition kinetics.h:252
Kokkos::View< double *[5], Kokkos::LayoutRight, MemorySpace > falloff_params
Definition kinetics.h:81
Kokkos::View< T *, MemorySpace > View1
Definition kinetics.h:72
static KOKKOS_INLINE_FUNCTION double power(const double C, const double order, const double C_reg=C_REG)
Mass-action factor C^order, regularized below C_reg for 0 < order < 1.
Definition kinetics.h:141
KOKKOS_INLINE_FUNCTION void rates_of_progress(const Lanes &lanes, const double T, const double *C, const double C_total, const double *g_RT, const double *h_RT, double *q, const ReactionDerivatives *d) const
Rates of progress q_i [kmol/(m^3 s)] of every reaction (one per lane) and, with derivatives,...
Definition kinetics.h:327
View1< uint32_t > species_reaction
Definition kinetics.h:92
View1< double > species_nu
Definition kinetics.h:93
View1< double > reverse_order
Definition kinetics.h:87
View1< double > chebyshev
Definition kinetics.h:112
View1< uint32_t > net_offset
Definition kinetics.h:88
View1< uint32_t > efficiency_species
Definition kinetics.h:103
View1< uint32_t > entry_offset
Definition kinetics.h:98
KOKKOS_INLINE_FUNCTION void production_jacobian(const Lanes &lanes, const ReactionDerivatives &d, double *J, const uint32_t stride, double *all_columns=nullptr) const
Jacobian of the production rates with respect to the concentrations at fixed T, one row per lane: J[d...
Definition kinetics.h:507
uint32_t n_species
Definition kinetics.h:74
static constexpr double C_REG
Concentration [kmol/m^3] below which orders 0 < n < 1 follow C_reg^n x ((2 - n) + (n - 1) x),...
Definition kinetics.h:121
View1< uint32_t > plog_offset
Definition kinetics.h:106
View1< uint32_t > chebyshev_n_p
Definition kinetics.h:111
static KOKKOS_INLINE_FUNCTION double power_derivative(const double C, const double order, const double C_reg=C_REG)
d power(C, order) / dC.
Definition kinetics.h:151
View1< uint8_t > falloff
Definition kinetics.h:77
Kokkos::View< double *[3], Kokkos::LayoutRight, MemorySpace > low
Definition kinetics.h:80
KOKKOS_INLINE_FUNCTION void production_rates(const Lanes &lanes, const double *q, double *omega, double *partial=nullptr) const
Net production rates omega_k = sum_i nu_ki q_i [kmol/(m^3 s)], one species per lane,...
Definition kinetics.h:434
KOKKOS_INLINE_FUNCTION void falloff_function(const uint32_t i, const double T, const double Pr, double &F, double &dlnF_dlnPr, double &dlnF_dT) const
Falloff blending F(Pr, T) and its logarithmic derivatives d ln F / d ln Pr and d ln F / dT at fixed P...
Definition kinetics.h:265
View1< double > default_efficiency
Definition kinetics.h:105
View1< uint32_t > entry_column
Definition kinetics.h:97
View1< uint32_t > entry_row
Definition kinetics.h:97
Kokkos::View< double *[3], Kokkos::LayoutRight, MemorySpace > plog_rate
Definition kinetics.h:109
View1< double > efficiency_extra
Definition kinetics.h:104
KOKKOS_INLINE_FUNCTION void rates_of_progress(const double T, const double *C, const double *g_RT, double *q) const
Rates of progress of one thread, without derivatives.
Definition kinetics.h:422
View1< uint32_t > species_offset
Definition kinetics.h:91
View1< uint32_t > reverse_offset
Definition kinetics.h:85
Kokkos::View< double *[4], Kokkos::LayoutRight, MemorySpace > chebyshev_range
Definition kinetics.h:113
View1< double > net_nu
Definition kinetics.h:90
double C_reg
Definition kinetics.h:122
View1< uint32_t > efficiency_offset
Definition kinetics.h:102
View1< uint32_t > term_source
Definition kinetics.h:99
View1< uint32_t > net_species
Definition kinetics.h:89
Kokkos::View< double *[3], Kokkos::LayoutRight, MemorySpace > rate
Definition kinetics.h:79
uint32_t n_reactions
Definition kinetics.h:75
View1< uint8_t > reversible
Definition kinetics.h:78
KOKKOS_INLINE_FUNCTION uint32_t derivatives_size() const
Doubles of ReactionDerivatives storage.
Definition kinetics.h:313
View1< double > forward_order
Definition kinetics.h:84
View1< uint32_t > forward_offset
Definition kinetics.h:82
View1< uint32_t > forward_species
Definition kinetics.h:83
One ideal-gas phase of a Cantera YAML file: its elements, species and reactions.
Definition mechanism.h:145
uint32_t n_species() const
Definition mechanism.h:152
std::vector< Reaction > reactions
Definition mechanism.h:150
Per-reaction derivatives of the rates of progress, in one block of KineticsTable::derivatives_size() ...
Definition kinetics.h:35
double * dq_uniform
Definition kinetics.h:40
double * d_reverse
Definition kinetics.h:38
double * d_forward
Definition kinetics.h:37
static KOKKOS_INLINE_FUNCTION ReactionDerivatives at(double *work, const uint32_t n_reactions, const uint32_t n_forward, const uint32_t n_reverse)
Definition kinetics.h:43
double * dq_dM
Definition kinetics.h:39
double * dq_dT
Definition kinetics.h:36
A gas-phase reaction: elementary, three-body or falloff (Lindemann, Troe, SRI), reversible (reverse r...
Definition mechanism.h:122
One thread does all the work of a cell.
Definition lanes.h:38
uint32_t rows
Definition teno_setup.cpp:455
SlotArray< double, Space > X
Definition teno_setup.cpp:478
CellSetup< ExecSpace > c
Definition teno_setup.cpp:1810
uint8_t r
Definition teno_setup.cpp:687
Geometry< Space > g
Definition teno_setup.cpp:678
SlotArray< double, Space > A
Definition teno_setup.cpp:478
double factor
Definition units.cpp:31