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].