34 #if GRINS_HAVE_ANTIOCH
38 #if GRINS_HAVE_CANTERA
43 #include "libmesh/fe.h"
44 #include "libmesh/elem.h"
45 #include "libmesh/fe_interface.h"
49 template<
typename Chemistry>
51 libMesh::Real nu_min, libMesh::Real nu_max,
52 libMesh::Real desired_nu,
const std::string & species,
53 libMesh::Real thermo_pressure)
65 if ( (nu_min>nu_max) || (desired_nu>nu_max) || (desired_nu<nu_min) )
68 ss <<
"Invalid specification of wavenumber range:" <<std::endl
69 <<
"nu_min: " <<nu_min <<std::endl
70 <<
"nu_max: " <<nu_max <<std::endl
71 <<
"desired_nu: " <<desired_nu <<std::endl;
72 libmesh_error_msg(ss.str());
76 unsigned int data_size =
_hitran->get_data_size();
78 bool min_flag =
false;
80 for (
unsigned int i=0; i<data_size; i++)
93 ss <<
"Minimum wavenumber " <<nu_min <<
" is greater than the maximum wavenumber in provided HITRAN data";
94 libmesh_error_msg(ss.str());
97 bool max_flag =
false;
99 for (
unsigned int i=data_size-1; i>=0; i--)
112 if (thermo_pressure == -1.0) {
123 template<
typename Chemistry>
126 START_LOG(
"operator()",
"AbsorptionCoeff");
127 libMesh::Real T,p,thermo_p;
128 std::vector<libMesh::Real> Y(_chemistry->n_species());
130 for (
unsigned int s=0; s<_chemistry->n_species(); s++)
131 context.point_value(_Y_var.species(s), qp_xyz, Y[s]);
133 context.point_value(_T_var.T(), qp_xyz, T);
135 if (_calc_thermo_pressure) {
136 libmesh_not_implemented();
138 thermo_p = _thermo_pressure;
141 context.point_value(_P_var.p(), qp_xyz, p);
143 libMesh::Real P = p + thermo_p;
144 libmesh_assert_greater(P,0.0);
146 libMesh::Real kv = 0.0;
148 for (
unsigned int i=_min_index; i<=_max_index; i++)
149 kv += this->kv(T,P,Y,i);
151 STOP_LOG(
"operator()",
"AbsorptionCoeff");
155 template<
typename Chemistry>
157 const libMesh::Point & ,
158 const libMesh::Real ,
159 libMesh::DenseVector<libMesh::Real> & )
161 libmesh_not_implemented();
164 template<
typename Chemistry>
166 const libMesh::Point & qp_xyz,
167 const libMesh::Real & JxW,
168 const unsigned int qoi_index,
169 const libMesh::Real )
171 START_LOG(
"derivatives()",
"AbsorptionCoeff");
173 libMesh::DenseSubVector<libMesh::Number> & dQdT = context.get_qoi_derivatives(qoi_index, _T_var.T());
174 libMesh::DenseSubVector<libMesh::Number> & dQdP = context.get_qoi_derivatives(qoi_index, _P_var.p());
175 libMesh::DenseSubVector<libMesh::Number> & dQdYs = context.get_qoi_derivatives(qoi_index, _Y_var.species(_species_idx));
178 libMesh::Elem & main_elem = context.get_elem();
179 libMesh::Point qp_ref = libMesh::FEInterface::inverse_map(main_elem.dim(),main_elem.type(),&main_elem,qp_xyz);
181 std::vector<libMesh::Point> qp(1);
184 libMesh::UniquePtr< libMesh::FEBase > T_fe = libMesh::FEGenericBase<libMesh::Real>::build(context.get_elem().dim(), context.get_element_fe(_T_var.T())->get_fe_type() );
185 const std::vector<std::vector<libMesh::Real> > & T_phi =T_fe->get_phi();
186 T_fe->reinit(&(context.get_elem()),&qp);
188 libMesh::UniquePtr< libMesh::FEBase > P_fe = libMesh::FEGenericBase<libMesh::Real>::build(context.get_elem().dim(), context.get_element_fe(_P_var.p())->get_fe_type() );
189 const std::vector<std::vector<libMesh::Real> > & P_phi = P_fe->get_phi();
190 P_fe->reinit(&(context.get_elem()),&qp);
192 libMesh::UniquePtr< libMesh::FEBase > Ys_fe = libMesh::FEGenericBase<libMesh::Real>::build(context.get_elem().dim(), context.get_element_fe(_Y_var.species(_species_idx))->get_fe_type() );
193 const std::vector<std::vector<libMesh::Real> > & Ys_phi = Ys_fe->get_phi();
194 Ys_fe->reinit(&(context.get_elem()),&qp);
196 libMesh::Real T,p,thermo_p;
197 std::vector<libMesh::Real> Y(_chemistry->n_species());
199 context.point_value(_T_var.T(), qp_xyz, T);
201 if (_calc_thermo_pressure) {
202 libmesh_not_implemented();
204 thermo_p = _thermo_pressure;
207 context.point_value(_P_var.p(), qp_xyz, p);
209 libMesh::Real P = p + thermo_p;
210 libmesh_assert_greater(P,0.0);
213 for (
unsigned int s=0; s<_chemistry->n_species(); s++)
214 context.point_value(_Y_var.species(s), qp_xyz, Y[s]);
216 for (
unsigned int i=_min_index; i<=_max_index; i++)
221 for (
unsigned int j=0; j<dQdT.size(); j++)
222 dQdT(j) += d_kv_dT(T,P,Y,i)*JxW * T_phi[j][0];
225 for (
unsigned int j=0; j<dQdP.size(); j++)
226 dQdP(j) += d_kv_dP(T,P,Y,i)*JxW * P_phi[j][0];
229 for (
unsigned int j=0; j<dQdYs.size(); j++)
230 dQdYs(j) += d_kv_dY(T,P,Y,i)*JxW * Ys_phi[j][0];
233 STOP_LOG(
"derivatives()",
"AbsorptionCoeff");
236 template<
typename Chemistry>
239 libmesh_not_implemented();
243 template<
typename Chemistry>
247 libMesh::Real S = this->Sw(T,P,i);
250 libMesh::Real phi_V = this->voigt(T,P,Y,i);
252 libMesh::Real M_mix = _chemistry->M_mix(Y);
253 libMesh::Real X = _chemistry->X(_species_idx,M_mix,Y[_species_idx]);
259 template<
typename Chemistry>
262 libMesh::Real dS = dS_dT(T,P,i);
263 libMesh::Real dV = d_voigt_dT(T,P,Y,i);
265 libMesh::Real S = this->Sw(T,P,i);
266 libMesh::Real V = this->voigt(T,P,Y,i);
267 libMesh::Real M_mix = _chemistry->M_mix(Y);
268 libMesh::Real X = _chemistry->X(_species_idx,M_mix,Y[_species_idx]);
273 template<
typename Chemistry>
276 libMesh::Real dS = dS_dP(T,P,i);
277 libMesh::Real dV = d_voigt_dP(T,P,Y,i);
279 libMesh::Real S = this->Sw(T,P,i);
280 libMesh::Real V = this->voigt(T,P,Y,i);
281 libMesh::Real M_mix = _chemistry->M_mix(Y);
282 libMesh::Real X = _chemistry->X(_species_idx,M_mix,Y[_species_idx]);
287 template<
typename Chemistry>
290 libMesh::Real dX = dX_dY(Y);
291 libMesh::Real dV = d_voigt_dY(T,P,Y,i);
293 libMesh::Real S = this->Sw(T,P,i);
294 libMesh::Real V = this->voigt(T,P,Y,i);
295 libMesh::Real M_mix = _chemistry->M_mix(Y);
296 libMesh::Real X = _chemistry->X(_species_idx,M_mix,Y[_species_idx]);
302 template<
typename Chemistry>
306 unsigned int iso = _hitran->isotopologue(i);
309 libMesh::Real nu = this->get_nu(P,i);
312 libMesh::Real sw0 = _hitran->sw(i);
315 libMesh::Real E = _hitran->elower(i);
318 libMesh::Real QT0 = _hitran->partition_function(_T0,iso);
321 libMesh::Real QT = _hitran->partition_function(T,iso);
323 libMesh::Real a = sw0;
324 libMesh::Real b = (QT0/QT);
325 libMesh::Real c = std::exp(-E*_rad_coeff*( (1.0/T) - (1.0/_T0) ));
326 libMesh::Real d = ( 1.0-std::exp(-_rad_coeff*nu/T) );
327 libMesh::Real e = std::pow(1.0-std::exp(-_rad_coeff*nu/_T0),-1.0);
329 libMesh::Real S = a*b*c*d*e;
338 template<
typename Chemistry>
341 libMesh::Real iso = _hitran->isotopologue(i);
342 libMesh::Real sw = _hitran->sw(i);
343 libMesh::Real E = _hitran->elower(i);
344 libMesh::Real QT0 = _hitran->partition_function(_T0,iso);
345 libMesh::Real QT = _hitran->partition_function(T,iso);
346 libMesh::Real dQT = this->dQ_dT(T,iso);
347 libMesh::Real nu = this->get_nu(P,i);
350 libMesh::Real A = 1.0/T;
351 libMesh::Real dA = -1.0/(T*T);
353 libMesh::Real B = 1.0/QT;
354 libMesh::Real dB = -1.0/(QT*QT) * dQT;
356 libMesh::Real C = std::exp(-_rad_coeff*E* (1.0/T - 1.0/_T0) );
357 libMesh::Real dC = std::exp(-_rad_coeff*E* (1.0/T - 1.0/_T0) ) * (_rad_coeff*E/(T*T));
359 libMesh::Real D = 1.0 - std::exp(-_rad_coeff*nu/T);
360 libMesh::Real dD = -std::exp(-_rad_coeff*nu/T) * (_rad_coeff*nu/(T*T));
362 return constants * ( A*B*C*dD + A*B*dC*D + A*dB*C*D + dA*B*C*D );
365 template<
typename Chemistry>
368 libMesh::Real iso = _hitran->isotopologue(i);
369 libMesh::Real sw = _hitran->sw(i);
370 libMesh::Real E = _hitran->elower(i);
371 libMesh::Real QT0 = _hitran->partition_function(_T0,iso);
372 libMesh::Real QT = _hitran->partition_function(T,iso);
373 libMesh::Real nu = this->get_nu(P,i);
374 libMesh::Real dnu = this->d_nu_dP(i);
378 libMesh::Real A = 1.0 - std::exp(-_rad_coeff*nu/T);
379 libMesh::Real dA = -std::exp(-_rad_coeff*nu/T) * (-_rad_coeff/T) * dnu;
381 libMesh::Real B = std::pow( (1.0-std::exp(-_rad_coeff*nu/T)), -1.0);
382 libMesh::Real dB = -std::pow( (1.0-std::exp(-_rad_coeff*nu/T)), -2.0) * -std::exp(-_rad_coeff*nu/_T0) * (-_rad_coeff/_T0) * dnu;
384 return constants * ( A*dB + dA*B );
388 template<
typename Chemistry>
394 libMesh::Real M = _chemistry->M(_species_idx);
395 libMesh::Real nu = this->get_nu(P,i);
397 return (nu/c)*std::sqrt( ( 8.0*k*T*std::log(2.0) )/( M/NA ) );
400 template<
typename Chemistry>
406 libMesh::Real M = _chemistry->M(_species_idx);
407 libMesh::Real nu = this->get_nu(P,i);
409 return (nu/c) * std::sqrt( (8.0*k*std::log(2.0))/(M/NA) ) * 0.5 * 1.0/(std::sqrt(T));
412 template<
typename Chemistry>
418 libMesh::Real M = _chemistry->M(_species_idx);
419 libMesh::Real dnu = this->d_nu_dP(i);
421 return (1.0/c)*std::sqrt( ( 8.0*k*T*std::log(2.0) )/( M/NA ) ) * dnu;
425 template<
typename Chemistry>
428 libMesh::Real g_self = _hitran->gamma_self(i);
429 libMesh::Real g_air = _hitran->gamma_air(i);
430 libMesh::Real n = _hitran->n_air(i);
432 libMesh::Real M_mix = _chemistry->M_mix(Y);
433 libMesh::Real X = _chemistry->X(_species_idx,M_mix,Y[_species_idx]);
438 template<
typename Chemistry>
441 libMesh::Real g_self = _hitran->gamma_self(i);
442 libMesh::Real g_air = _hitran->gamma_air(i);
443 libMesh::Real n = _hitran->n_air(i);
445 libMesh::Real M_mix = _chemistry->M_mix(Y);
446 libMesh::Real X = _chemistry->X(_species_idx,M_mix,Y[_species_idx]);
451 template<
typename Chemistry>
454 libMesh::Real g_self = _hitran->gamma_self(i);
455 libMesh::Real g_air = _hitran->gamma_air(i);
456 libMesh::Real n = _hitran->n_air(i);
458 libMesh::Real M_mix = _chemistry->M_mix(Y);
459 libMesh::Real X = _chemistry->X(_species_idx,M_mix,Y[_species_idx]);
464 template<
typename Chemistry>
467 libMesh::Real g_self = _hitran->gamma_self(i);
468 libMesh::Real g_air = _hitran->gamma_air(i);
469 libMesh::Real n = _hitran->n_air(i);
470 libMesh::Real dX = dX_dY(Y);
476 template<
typename Chemistry>
479 libMesh::Real nu_D = this->nu_D(T,P,i);
481 libMesh::Real a = this->voigt_a(T,P,Y,i);
482 libMesh::Real w = this->voigt_w(T,P,i);
485 libMesh::Real V = 0.0;
487 for(
int i=0; i<4; i++)
489 libMesh::Real Ai = _voigt_coeffs[0][i];
490 libMesh::Real Bi = _voigt_coeffs[1][i];
491 libMesh::Real Ci = _voigt_coeffs[2][i];
492 libMesh::Real Di = _voigt_coeffs[3][i];
494 libMesh::Real aAi = a-Ai;
495 libMesh::Real wBi = w-Bi;
496 libMesh::Real aAi2 = std::pow(a-Ai,2.0);
497 libMesh::Real wBi2 = std::pow(w-Bi,2.0);
499 V += ( Ci*aAi + Di*wBi )/( aAi2 + wBi2 );
502 libMesh::Real phi_V = (2.0*std::sqrt(std::log(2.0)))/(std::sqrt(
Constants::pi)*nu_D)*V;
507 template<
typename Chemistry>
510 libMesh::Real nu_D = this->nu_D(T,P,i);
511 libMesh::Real dnu_D = d_nuD_dT(T,P,i);
513 libMesh::Real a = this->voigt_a(T,P,Y,i);
514 libMesh::Real da = this->d_voigt_a_dT(T,P,Y,i);
516 libMesh::Real w = this->voigt_w(T,P,i);
517 libMesh::Real dw = this->d_voigt_w_dT(T,P,i);
520 libMesh::Real V = 0.0;
521 libMesh::Real dV = 0.0;
523 for(
int i=0; i<4; i++)
525 libMesh::Real Ai = _voigt_coeffs[0][i];
526 libMesh::Real Bi = _voigt_coeffs[1][i];
527 libMesh::Real Ci = _voigt_coeffs[2][i];
528 libMesh::Real Di = _voigt_coeffs[3][i];
530 libMesh::Real aAi = a-Ai;
531 libMesh::Real wBi = w-Bi;
532 libMesh::Real aAi2 = std::pow(a-Ai,2.0);
533 libMesh::Real wBi2 = std::pow(w-Bi,2.0);
535 V += ( Ci*aAi + Di*wBi )/( aAi2 + wBi2 );
537 dV += ( (aAi2+wBi2)*(Ci*da + Di*dw) - (Ci*aAi + Di*wBi)*(2.0*aAi*da + 2.0*wBi*dw) )/( std::pow(aAi2+wBi2,2.0) );
540 libMesh::Real constants = 2.0*std::sqrt(std::log(2.0))/std::sqrt(
Constants::pi);
541 libMesh::Real C = 1.0/nu_D;
542 libMesh::Real dC = -1.0/(nu_D*nu_D) * dnu_D;
544 return constants * ( C*dV + dC*V );
547 template<
typename Chemistry>
550 libMesh::Real nu_D = this->nu_D(T,P,i);
551 libMesh::Real dnu_D = d_nuD_dP(T,i);
553 libMesh::Real a = this->voigt_a(T,P,Y,i);
554 libMesh::Real da = this->d_voigt_a_dP(T,P,Y,i);
556 libMesh::Real w = this->voigt_w(T,P,i);
557 libMesh::Real dw = this->d_voigt_w_dP(T,P,i);
560 libMesh::Real V = 0.0;
561 libMesh::Real dV = 0.0;
563 for(
int i=0; i<4; i++)
565 libMesh::Real Ai = _voigt_coeffs[0][i];
566 libMesh::Real Bi = _voigt_coeffs[1][i];
567 libMesh::Real Ci = _voigt_coeffs[2][i];
568 libMesh::Real Di = _voigt_coeffs[3][i];
570 libMesh::Real aAi = a-Ai;
571 libMesh::Real wBi = w-Bi;
572 libMesh::Real aAi2 = std::pow(a-Ai,2.0);
573 libMesh::Real wBi2 = std::pow(w-Bi,2.0);
575 V += ( Ci*aAi + Di*wBi )/( aAi2 + wBi2 );
577 dV += ( (aAi2+wBi2)*(Ci*da + Di*dw) - (Ci*aAi + Di*wBi)*(2.0*aAi*da + 2.0*wBi*dw) )/( std::pow(aAi2+wBi2,2.0) );
580 libMesh::Real constants = 2.0*std::sqrt(std::log(2.0))/std::sqrt(
Constants::pi);
581 libMesh::Real C = 1.0/nu_D;
582 libMesh::Real dC = -1.0/(nu_D*nu_D) * dnu_D;
584 return constants * ( C*dV + dC*V );
587 template<
typename Chemistry>
590 libMesh::Real nu_D = this->nu_D(T,P,i);
592 libMesh::Real a = this->voigt_a(T,P,Y,i);
593 libMesh::Real da = this->d_voigt_a_dY(T,P,Y,i);
595 libMesh::Real w = this->voigt_w(T,P,i);
598 libMesh::Real dV = 0.0;
600 for(
int i=0; i<4; i++)
602 libMesh::Real Ai = _voigt_coeffs[0][i];
603 libMesh::Real Bi = _voigt_coeffs[1][i];
604 libMesh::Real Ci = _voigt_coeffs[2][i];
605 libMesh::Real Di = _voigt_coeffs[3][i];
607 libMesh::Real aAi = a-Ai;
608 libMesh::Real wBi = w-Bi;
609 libMesh::Real aAi2 = std::pow(a-Ai,2.0);
610 libMesh::Real wBi2 = std::pow(w-Bi,2.0);
612 dV += ( (aAi2+wBi2)*(Ci*da) - (Ci*aAi + Di*wBi)*(2.0*aAi*da) )/( std::pow(aAi2+wBi2,2.0) );
615 libMesh::Real constants = 2.0*std::sqrt(std::log(2.0))/(std::sqrt(
Constants::pi)*nu_D);
617 return constants * dV;
620 template<
typename Chemistry>
622 _voigt_coeffs.resize(4);
623 for (
int i=0; i<4; i++)
624 _voigt_coeffs[i].resize(4);
626 _voigt_coeffs[0][0] = -1.2150;
627 _voigt_coeffs[0][1] = -1.3509;
628 _voigt_coeffs[0][2] = -1.2150;
629 _voigt_coeffs[0][3] = -1.3509;
630 _voigt_coeffs[1][0] = 1.2359;
631 _voigt_coeffs[1][1] = 0.3786;
632 _voigt_coeffs[1][2] = -1.2359;
633 _voigt_coeffs[1][3] = -0.3786;
634 _voigt_coeffs[2][0] = -0.3085;
635 _voigt_coeffs[2][1] = 0.5906;
636 _voigt_coeffs[2][2] = -0.3085;
637 _voigt_coeffs[2][3] = 0.5906;
638 _voigt_coeffs[3][0] = 0.0210;
639 _voigt_coeffs[3][1] = -1.1858;
640 _voigt_coeffs[3][2] = -0.0210;
641 _voigt_coeffs[3][3] = 1.1858;
644 template<
typename Chemistry>
647 libMesh::Real nu_c = this->nu_C(T,P,Y,i);
648 libMesh::Real nu_D = this->nu_D(T,P,i);
650 return std::sqrt(std::log(2.0))*nu_c/nu_D;
653 template<
typename Chemistry>
656 libMesh::Real nu_c = this->nu_C(T,P,Y,i);
657 libMesh::Real nu_D = this->nu_D(T,P,i);
658 libMesh::Real dnu_c = d_nuC_dT(T,P,Y,i);
659 libMesh::Real dnu_D = d_nuD_dT(T,P,i);
661 return std::sqrt(std::log(2.0)) * (nu_D*dnu_c - nu_c*dnu_D)/(nu_D*nu_D);
664 template<
typename Chemistry>
667 libMesh::Real nu_c = this->nu_C(T,P,Y,i);
668 libMesh::Real nu_D = this->nu_D(T,P,i);
669 libMesh::Real dnu_c = d_nuC_dP(T,Y,i);
670 libMesh::Real dnu_D = d_nuD_dP(T,i);
672 return std::sqrt(std::log(2.0)) * (nu_D*dnu_c - nu_c*dnu_D)/(nu_D*nu_D);
675 template<
typename Chemistry>
678 libMesh::Real nu_D = this->nu_D(T,P,i);
679 libMesh::Real dnu_c = d_nuC_dY(T,P,Y,i);
681 return std::sqrt(std::log(2.0))/nu_D * dnu_c;
684 template<
typename Chemistry>
687 libMesh::Real nu = this->get_nu(P,i);
688 libMesh::Real nu_D = this->nu_D(T,P,i);
690 return 2.0*std::sqrt(std::log(2.0))*(_nu-nu)/nu_D;
693 template<
typename Chemistry>
696 libMesh::Real nu = this->get_nu(P,i);
697 libMesh::Real nu_D = this->nu_D(T,P,i);
698 libMesh::Real dnu_D = d_nuD_dT(T,P,i);
700 return 2.0*std::sqrt(std::log(2.0))*(_nu-nu)/(nu_D*nu_D) * -dnu_D;
703 template<
typename Chemistry>
706 libMesh::Real nu = this->get_nu(P,i);
707 libMesh::Real dnu = d_nu_dP(i);
708 libMesh::Real nu_D = this->nu_D(T,P,i);
709 libMesh::Real dnu_D = d_nuD_dP(T,i);
711 return 2.0*std::sqrt(std::log(2.0)) * ( (nu_D)*(-dnu) - (_nu-nu)*(dnu_D) )/(nu_D*nu_D);
714 template<
typename Chemistry>
717 libMesh::Real nu = _hitran->nu0(i);
718 libMesh::Real d_air = _hitran->delta_air(i);
723 template<
typename Chemistry>
726 libMesh::Real d_air = _hitran->delta_air(i);
731 template<
typename Chemistry>
734 libMesh::Real MW = _chemistry->M(_species_idx);
735 libMesh::Real MW_mix = _chemistry->M_mix(Y);
737 libMesh::Real Ys = Y[_species_idx];
739 return 1.0/MW * ( MW_mix - Ys*(MW_mix*MW_mix)/MW );
743 template<
typename Chemistry>
746 libMesh::Real deriv = _hitran->partition_function_derivative(T,iso);
750 #if GRINS_HAVE_ANTIOCH
754 #if GRINS_HAVE_CANTERA
libMesh::Real d_voigt_a_dP(libMesh::Real T, libMesh::Real P, std::vector< libMesh::Real > Y, unsigned int i)
Voigt a parameter pressure derivative.
libMesh::Real d_voigt_dY(libMesh::Real T, libMesh::Real P, std::vector< libMesh::Real > Y, unsigned int i)
Voigt profile mass fraction derivative.
libMesh::Real d_nuC_dY(libMesh::Real T, libMesh::Real P, std::vector< libMesh::Real > Y, unsigned int i)
Collisional broadening mass fraction derivative.
virtual libMesh::Real operator()(const libMesh::FEMContext &context, const libMesh::Point &qp_xyz, const libMesh::Real t)
Calculate the absorption coefficient at a quadratue point.
virtual void derivatives(libMesh::FEMContext &context, const libMesh::Point &qp_xyz, const libMesh::Real &JxW, const unsigned int qoi_index, const libMesh::Real time)
Calculate the derivative of the absorption coefficient at a QP with respect to all state variables...
libMesh::Real d_nuD_dT(libMesh::Real T, libMesh::Real P, unsigned int i)
Doppler broadening temperature derivative.
unsigned int _species_idx
Index for the species of interest.
const libMesh::Real second_rad_const
Second Radiation Constant hc/k, [m K].
libMesh::Real d_voigt_w_dP(libMesh::Real T, libMesh::Real P, unsigned int i)
Voigt w parameter pressure derivative.
libMesh::Real Sw(libMesh::Real T, libMesh::Real P, unsigned int i)
Linestrength [cm^-2 atm^-1].
libMesh::Real voigt(libMesh::Real T, libMesh::Real P, std::vector< libMesh::Real > Y, unsigned int i)
Calculate the Voigt profile [cm^-1].
libMesh::Real voigt_a(libMesh::Real T, libMesh::Real P, std::vector< libMesh::Real > Y, unsigned int i)
Voigt a parameter.
libMesh::Real _thermo_pressure
Thermodynamic Pressure [atm].
libMesh::Real get_nu(libMesh::Real P, unsigned int i)
Pressure shift of linecenter wavenumber.
libMesh::Real d_kv_dP(libMesh::Real T, libMesh::Real P, std::vector< libMesh::Real > Y, unsigned int i)
Absorption coefficient pressure derivative.
libMesh::Real d_kv_dY(libMesh::Real T, libMesh::Real P, std::vector< libMesh::Real > Y, unsigned int i)
Absorption coefficient mass fraction derivative.
libMesh::Real dS_dT(libMesh::Real T, libMesh::Real P, unsigned int i)
Linestrength temperature derivative.
libMesh::Real kv(libMesh::Real T, libMesh::Real P, std::vector< libMesh::Real > Y, unsigned int i)
Absorption coefficient [cm^-1].
libMesh::Real d_voigt_w_dT(libMesh::Real T, libMesh::Real P, unsigned int i)
Voigt w parameter temperature derivative.
libMesh::Real d_nuC_dP(libMesh::Real T, std::vector< libMesh::Real > Y, unsigned int i)
Collisional broadening pressure derivative.
libMesh::Real d_nuD_dP(libMesh::Real T, unsigned int i)
Doppler broadening pressure derivative.
libMesh::Real d_nu_dP(unsigned int i)
Derivative of pressure-shifted linecenter wavenumber.
unsigned int _max_index
Index of maximum wavenumber.
bool _calc_thermo_pressure
Flag for whether Thermodynamic Pressure is calculated or constant.
libMesh::Real dX_dY(std::vector< libMesh::Real > Y)
Mole fraction derivative with respect to mass fraction.
Evaluates the Beer-Lambert Law at a given point in space.
const libMesh::Real Avogadro
Avogadro's number, [particles/mol].
libMesh::Real d_nuC_dT(libMesh::Real T, libMesh::Real P, std::vector< libMesh::Real > Y, unsigned int i)
Collisional broadening temperature derivative.
SharedPtr< Chemistry > _chemistry
Antioch/Cantera object.
libMesh::Real nu_C(libMesh::Real T, libMesh::Real P, std::vector< libMesh::Real > Y, unsigned int i)
Collisional broadening [cm^-1].
const libMesh::Real c_vacuum
Speed of light in a vacuum, [m/s].
libMesh::Real d_voigt_dP(libMesh::Real T, libMesh::Real P, std::vector< libMesh::Real > Y, unsigned int i)
Voigt profile pressure derivative.
libMesh::Real d_voigt_dT(libMesh::Real T, libMesh::Real P, std::vector< libMesh::Real > Y, unsigned int i)
Voigt profile temperature derivative.
libMesh::Real dQ_dT(libMesh::Real T, unsigned int iso)
Partition Function derivative (finite difference)
const libMesh::Real atmosphere_Pa
1 atmosphere in Pascals, [Pa/atm]
SharedPtr< HITRAN > _hitran
HITRAN.
libMesh::Real voigt_w(libMesh::Real T, libMesh::Real P, unsigned int i)
Voigt w parameter.
libMesh::Real d_voigt_a_dY(libMesh::Real T, libMesh::Real P, std::vector< libMesh::Real > Y, unsigned int i)
Voigt a parameter mass fraction derivative.
void init_voigt()
Initialize the coeff matrix for calculating the Voigt profile.
AbsorptionCoeff()
User should not call empty constructor.
libMesh::Real d_voigt_a_dT(libMesh::Real T, libMesh::Real P, std::vector< libMesh::Real > Y, unsigned int i)
Voigt a parameter temperature derivative.
libMesh::Real dS_dP(libMesh::Real T, libMesh::Real P, unsigned int i)
Linestrength pressure derivative.
libMesh::Real d_kv_dT(libMesh::Real T, libMesh::Real P, std::vector< libMesh::Real > Y, unsigned int i)
Absorption coefficient temperature derivative.
virtual libMesh::UniquePtr< libMesh::FEMFunctionBase< libMesh::Real > > clone() const
Not used.
const libMesh::Real Boltzmann
Boltzmann Constant, [J/K].
unsigned int _min_index
Index of minimum wavenumber.
libMesh::Real nu_D(libMesh::Real T, libMesh::Real P, unsigned int i)
Doppler broadening [cm^-1].