57 Real n_h, Y, y, g_ff, cool;
58 Real n_h0, n_hp, n_he0, n_hep, n_hepp, n_e, n_e_old;
59 Real alpha_hp, alpha_hep, alpha_d, alpha_hepp, gamma_eh0, gamma_ehe0, gamma_ehep;
60 Real le_h0, le_hep, li_h0, li_he0, li_hep, lr_hp, lr_hep, lr_hepp, ld_hep, l_ff;
61 Real gamma_lh0, gamma_lhe0, gamma_lhep, e_h0, e_he0, e_hep, H;
62 int heat_flag, n_iter;
77 alpha_hp = (8.4e-11) * (1.0 / sqrt(T)) * pow((T / 1e3), (-0.2)) * (1.0 / (1.0 + pow((T / 1e6), (0.7))));
78 alpha_hep = (1.5e-10) * (pow(T, (-0.6353)));
79 alpha_d = (1.9e-3) * (pow(T, (-1.5))) * exp(-470000.0 / T) * (1.0 + 0.3 * exp(-94000.0 / T));
80 alpha_hepp = (3.36e-10) * (1.0 / sqrt(T)) * pow((T / 1e3), (-0.2)) * (1.0 / (1.0 + pow((T / 1e6), (0.7))));
81 gamma_eh0 = (5.85e-11) * sqrt(T) * exp(-157809.1 / T) * (1.0 / (1.0 + sqrt(T / 1e5)));
82 gamma_ehe0 = (2.38e-11) * sqrt(T) * exp(-285335.4 / T) * (1.0 / (1.0 + sqrt(T / 1e5)));
83 gamma_ehep = (5.68e-12) * sqrt(T) * exp(-631515.0 / T) * (1.0 / (1.0 + sqrt(T / 1e5)));
86 gamma_lh0 = 3.19851e-13;
87 gamma_lhe0 = 3.13029e-13;
88 gamma_lhep = 2.00541e-14;
101 for (
int i = 0; i < n_iter; i++) {
103 n_h0 = n_h * alpha_hp / (alpha_hp + gamma_eh0 + gamma_lh0 / n_e);
106 (1.0 + (alpha_hep + alpha_d) / (gamma_ehe0 + gamma_lhe0 / n_e) +
107 (gamma_ehep + gamma_lhep / n_e) / alpha_hepp);
108 n_he0 = n_hep * (alpha_hep + alpha_d) / (gamma_ehe0 + gamma_lhe0 / n_e);
109 n_hepp = n_hep * (gamma_ehep + gamma_lhep / n_e) / alpha_hepp;
110 n_e = n_hp + n_hep + 2 * n_hepp;
111 diff = fabs(n_e_old - n_e);
117 n_h0 = n_h * alpha_hp / (alpha_hp + gamma_eh0);
119 n_hep = y * n_h / (1.0 + (alpha_hep + alpha_d) / (gamma_ehe0) + (gamma_ehep) / alpha_hepp);
120 n_he0 = n_hep * (alpha_hep + alpha_d) / (gamma_ehe0);
121 n_hepp = n_hep * (gamma_ehep) / alpha_hepp;
122 n_e = n_hp + n_hep + 2 * n_hepp;
127 le_h0 = (7.50e-19) * exp(-118348.0 / T) * (1.0 / (1.0 + sqrt(T / 1e5))) * n_e * n_h0;
128 le_hep = (5.54e-17) * pow(T, (-0.397)) * exp(-473638.0 / T) * (1.0 / (1.0 + sqrt(T / 1e5))) * n_e * n_hep;
129 li_h0 = (1.27e-21) * sqrt(T) * exp(-157809.1 / T) * (1.0 / (1.0 + sqrt(T / 1e5))) * n_e * n_h0;
130 li_he0 = (9.38e-22) * sqrt(T) * exp(-285335.4 / T) * (1.0 / (1.0 + sqrt(T / 1e5))) * n_e * n_he0;
131 li_hep = (4.95e-22) * sqrt(T) * exp(-631515.0 / T) * (1.0 / (1.0 + sqrt(T / 1e5))) * n_e * n_hep;
132 lr_hp = (8.70e-27) * sqrt(T) * pow((T / 1e3), (-0.2)) * (1.0 / (1.0 + pow((T / 1e6), (0.7)))) * n_e * n_hp;
133 lr_hep = (1.55e-26) * pow(T, (0.3647)) * n_e * n_hep;
134 lr_hepp = (3.48e-26) * sqrt(T) * pow((T / 1e3), (-0.2)) * (1.0 / (1.0 + pow((T / 1e6), (0.7)))) * n_e * n_hepp;
135 ld_hep = (1.24e-13) * pow(T, (-1.5)) * exp(-470000.0 / T) * (1.0 + 0.3 * exp(-94000.0 / T)) * n_e * n_hep;
136 g_ff = 1.1 + 0.34 * exp(-(5.5 - log(T)) * (5.5 - log(T)) / 3.0);
137 l_ff = (1.42e-27) * g_ff * sqrt(T) * (n_hp + n_hep + 4 * n_hepp) * n_e;
140 cool = le_h0 + le_hep + li_h0 + li_he0 + li_hep + lr_hp + lr_hep + lr_hepp + ld_hep + l_ff;
145 H = n_h0 * e_h0 + n_he0 * e_he0 + n_hep * e_hep;
283 inline static constexpr const char* use_photoelectric_parname =
"chemistry.photoelectric_heating";
284 inline static constexpr const char* photoelectric_n_av_parname =
"chemistry.photoelectric_n_av_cgs";
287 __host__
static bool is_specified_by_params(
ParameterMap& pmap)
289 return pmap.value_or(PhotoelectricHeatingModel::use_photoelectric_parname,
false);
295 if (pmap.value_or(PhotoelectricHeatingModel::use_photoelectric_parname,
false)) {
296 double n_av_cgs = pmap.value_or(PhotoelectricHeatingModel::photoelectric_n_av_parname, 100.0);
297 CHOLLA_ASSERT(n_av_cgs > 0.0,
"The \"%s\" parameter cannot specify a non-positive value",
298 PhotoelectricHeatingModel::photoelectric_n_av_parname);
299 n_av_cgs_ = n_av_cgs;
303 CHOLLA_ASSERT(!pmap.has_param(photoelectric_n_av_parname),
304 "It is an error to specify the \"%s\" parameter when the \"%s\" hasn't "
305 "explicitly been set to true.",
306 PhotoelectricHeatingModel::photoelectric_n_av_parname,
307 PhotoelectricHeatingModel::use_photoelectric_parname);
312 bool is_active()
const {
return n_av_cgs_ != 0.0; }
318 __device__ Real
operator()(Real n, Real T)
const {
return (T < 1e4) ? n * n_av_cgs_ * 1.0e-26 : 0.0; }