49 double Edust = DissocEnergy *
Xdust[
ipH2] *
50 ( 1. - ( (Ev - Evm) / (DissocEnergy+energy_off-Evm)) *
51 ( (1.-
Xdust[ipH2])/2.) );
56 EH2_here = DissocEnergy +energy_off - Edust;
65 double G1[
H2_TOP] = { 0.3 , 0.4 , 0.9 };
66 double G2[
H2_TOP] = { 0.6 , 0.6 , 0.4 };
69 if( (energy_wn+energy_off) <= Evm )
72 Fv =
sexp(
POW2( (energy_wn+energy_off - Evm)/(G1[ipH2]* Evm ) ) );
77 Fv =
sexp(
POW2( (energy_wn+energy_off - Evm)/(G2[ipH2]*(EH2 - Evm ) ) ) );
87 if( (*Lo).n()==0 && (*tr).Emis().Aul() > 1.01e-30 )
123 fprintf(
ioQQQ,
" H2_Create called in DEBUG mode.\n");
152 for(
long iVibHi = 0; iVibHi <=
nVib_hi[iElecHi]; ++iVibHi )
163 for(
unsigned nEner = 0; nEner <
states.
size(); ++nEner )
165 long iElec =
states[nEner].n();
166 long iVib =
states[nEner].v();
167 long iRot =
states[nEner].J();
190 H2_lgOrtho[(*st).n()][(*st).v()][(*st).J()] =
true;
191 H2_stat[(*st).n()][(*st).v()][(*st).J()] = 3.f*(2.f*(*st).J()+1.f);
196 H2_lgOrtho[(*st).n()][(*st).v()][(*st).J()] =
false;
197 H2_stat[(*st).n()][(*st).v()][(*st).J()] = (2.f*(*st).J()+1.f);
199 (*st).g() =
H2_stat[(*st).n()][(*st).v()][(*st).J()];
210 " H2_Create: there are %li electronic levels, in each level there are",
213 " for a total of %li levels.\n", (
long int)
states.
size() );
238 " The total number of levels used in the matrix solver was set to %li but there are only %li levels in X.\n Sorry.\n",
240 nLevels_per_elec[0]);
254 fprintf(
ioQQQ,
"%li\t%li\t%li\t%.5e\n", (*st).n(), (*st).v(), (*st).J(), (*st).energy().WN() );
273 fprintf(
ioQQQ,
"elec %li highest vib= %li\n", iElec ,
nVib_hi[iElec] );
285 for(
long iVib = 0; iVib <=
nVib_hi[iElec]; ++iVib )
311 for(
long iVib = 0; iVib <=
nVib_hi[0]; ++iVib )
330 for(
long iVib = 0; iVib <=
nVib_hi[0]; ++iVib )
356 for(
long iVib = 0; iVib <=
nVib_hi[0]; ++iVib )
377 for(
long iVib = 0; iVib <=
nVib_hi[0]; ++iVib )
397 long iElec = (*st).n();
398 if( iElec > 0 )
continue;
399 long iVib = (*st).v();
400 long iRot = (*st).J();
421 for(
long j = 1; j < nLevels_per_elec[0]; ++j )
424 for(
long k = 0; k < j; ++k )
447 for(
long ipHi = 1; ipHi < nLevels_per_elec[0]; ++ipHi )
449 for(
long ipLo = 0; ipLo < ipHi; ++ipLo )
467 for(
long i=1; i<nLevels_per_elec[0]; ++i )
474 for(
unsigned nEner = 1; nEner <
states.
size(); ++nEner )
485 vector<TransitionList::iterator> initptrs;
493 for(
unsigned ipHi=1; ipHi<
states.
size(); ++ipHi )
495 for(
unsigned ipLo=0; ipLo<ipHi; ++ipLo )
501 initptrs[lineIndex] = tr;
514 for(
long iVibHi=0; iVibHi<=
nVib_hi[iElecHi]; ++iVibHi )
517 for(
long iRotHi=
Jlowest[iElecHi]; iRotHi<=
nRot_hi[iElecHi][iVibHi]; ++iRotHi )
523 long int lim_elec_lo = 0;
525 for(
long iElecLo=0; iElecLo<=lim_elec_lo; ++iElecLo )
528 for(
long iVibLo=0; iVibLo<=
nVib_hi[iElecLo]; ++iVibLo )
550 stable_sort( initptrs.begin(), initptrs.end(),
compareEmis );
555 vector<TransitionList::iterator>::iterator ptr = initptrs.begin();
556 for (
size_t i=0; i < initptrs.size(); ++i, ++tr, ++ptr)
568 for(
unsigned i = 0; i <
trans.
size(); ++i )
573 trans[i].ipHi() = ipEnergySort[(*Hi).n()][(*Hi).v()][(*Hi).J()];
574 trans[i].ipLo() = ipEnergySort[(*Lo).n()][(*Lo).v()][(*Lo).J()];
582 for(
unsigned i = 0; i <
trans.
size(); ++i )
594 (*tr).EnergyWN() = (
realnum)((*(*tr).Hi()).energy().WN() - (*(*tr).Lo()).energy().WN());
597 (*tr).WLAng() = (
realnum)(1.e8f/(*tr).EnergyWN() /
RefIndex( (*tr).EnergyWN() ) );
599 (*tr).Coll().col_str() = 0.;
609 (*tr).Emis().iRedisFun() =
ipCRDW;
614 (*tr).Emis().TauTot() = 1e20f;
616 (*tr).Emis().dampXvel() = (
realnum)( (*tr).Emis().Aul()/(*tr).EnergyWN()/
PI4);
617 (*tr).Emis().gf() = (
realnum)(
GetGF( (*tr).Emis().Aul(),(*tr).EnergyWN(), (*(*tr).Hi()).
g() ) );
620 (*tr).Emis().opacity() = (
realnum)(
abscf( (*tr).Emis().gf(), (*tr).EnergyWN(), (*(*tr).Lo()).
g()) );
628 (*tr).Emis().ColOvTot() = 1.;
634 (*tr).Emis().ColOvTot() = 0.;
650 (*tr).Coll().col_str() = (
realnum)(
651 pow3( (*tr).WLAng()*1e-8 ) *
652 ( (*(*tr).Hi()).
g()/(*(*tr).Lo()).
g()) *
655 ASSERT( (*tr).Coll().col_str()>0.);
672 realnum sum = 0., sumj = 0., sumv = 0., sumo = 0., sump = 0.;
681 double T_H2_FORM = 50000.;
682 for(
long iVib = 0; iVib <=
nVib_hi[0]; ++iVib )
689 (1.f+2.f*
H2_lgOrtho[iElec][iVib][iRot]) * (1.f+iVib) *
693 sumv += iVib * H2_X_grain_formation_distribution[
ipH2][iVib][iRot];
696 sumo += H2_X_grain_formation_distribution[
ipH2][iVib][iRot];
701 sump += H2_X_grain_formation_distribution[
ipH2][iVib][iRot];
709 double Xrot[
H2_TOP] = { 0.14 , 0.15 , 0.15 };
710 double Xtrans[
H2_TOP] = { 0.12 , 0.15 , 0.25 };
716 for(
long iVib = 0; iVib <=
nVib_hi[0]; ++iVib )
725 for(
long iVib = 0; iVib <=
nVib_hi[0]; ++iVib )
737 Erot = (EH2 - Ev) * Xrot[
ipH2] / (Xrot[
ipH2] + Xtrans[
ipH2]);
773 double gaussian =
sexp(
POW2( (deltaE - Erot) / (0.5 * Erot) ) );
775 double thermal_dist =
sexp( deltaE / Erot );
778 double aver = ( gaussian + thermal_dist ) / 2.;
789 (1.f+2.f*
H2_lgOrtho[iElec][iVib][iRot]) * Fv * (2.*iRot+1.) * aver );
793 sumv += iVib * H2_X_grain_formation_distribution[
ipH2][iVib][iRot];
796 sumo += H2_X_grain_formation_distribution[
ipH2][iVib][iRot];
800 sump += H2_X_grain_formation_distribution[
ipH2][iVib][iRot];
822 double T_H2_FORM = 17329.;
824 for(
long iVib = 0; iVib <=
nVib_hi[0]; ++iVib )
835 sumv += iVib * H2_X_grain_formation_distribution[
ipH2][iVib][iRot];
838 sumo += H2_X_grain_formation_distribution[
ipH2][iVib][iRot];
843 sump += H2_X_grain_formation_distribution[
ipH2][iVib][iRot];
852 fprintf(
ioQQQ,
"H2 form grains mean J= %.3f mean v = %.3f ortho/para= %.3f\n",
853 sumj/sum , sumv/sum , sumo/sump );
857 for(
long iVib = 0; iVib <=
nVib_hi[0]; ++iVib )
multi_arr< double, 2 > H2_rad_rate_in
multi_arr< double, 2 > H2_col_rate_out
t_mole_global mole_global
multi_arr< realnum, 3 > H2_dissprob
const double ENERGY_H2_STAR
double H2_DissocEnergies[N_ELEC]
NORETURN void TotalInsanity(void)
STATIC bool compareEmis(const TransitionList::iterator &tr1, const TransitionList::iterator &tr2)
double abscf(double gf, double enercm, double gl)
bool lgLeiden_Keep_ipMH2s
multi_arr< double, 2 > pops_per_vib
multi_arr< realnum, 2 > H2_coll_dissoc_rate_coef_H2
valarray< long > ipVib_H2_energy_sort
void H2_CollidRateRead(long int nColl)
vector< CollRateCoeffArray > RateCoefTable
sys_float sexp(sys_float x)
double RefIndex(double EnergyWN)
int H2_nRot_add_ortho_para[N_ELEC]
multi_arr< realnum, 2 > H2_coll_dissoc_rate_coef
static double Xdust[H2_TOP]
void H2_Read_hminus_distribution(void)
static double XVIB[H2_TOP]
multi_arr< realnum, 3 > CollRateErrFac
multi_arr< realnum, 2 > H2_X_formation
multi_arr< realnum, 3 > CollRateCoeff
multi_arr< realnum, 3 > H2_stat
valarray< realnum > H2_X_sink
static const double energy_off
multi_arr< long int, 3 > ipEnergySort
multi_arr< double, 3 > H2_old_populations
const multi_geom< d, ALLOC > & clone() const
multi_arr< realnum, 3 > H2_disske
void resize(size_t newsize)
long ipoint(double energy_ryd)
multi_arr< realnum, 3 > H2_X_hminus_formation_distribution
long int nLevels_per_elec[N_ELEC]
multi_arr< double, 3 > H2_populations_LTE
STATIC double EH2_eval(int ipH2, double DissocEnergy, double energy_wn)
molecule * findspecies(const char buf[])
valarray< class molezone > species
multi_arr< realnum, 2 > H2_X_colden_LTE
multi_arr< bool, 2 > lgH2_radiative
multi_arr< realnum, 2 > H2_X_Hmin_back
multi_arr< realnum, 6 > H2_SaveLine
multi_arr< double, 3 > H2_rad_rate_out
valarray< long > ipElec_H2_energy_sort
double RandGauss(double xMean, double s)
void Read_Mol_Diss_cross_sections(void)
multi_arr< realnum, 3 > H2_X_grain_formation_distribution
void H2_ReadTransprob(long int nelec, TransitionList &trans)
multi_arr< double, 2 > H2_X_rate_to_elec_excited
void reserve(size_type i1)
double GetGF(double trans_prob, double enercm, double gup)
multi_arr< double, 2 > H2_X_rate_from_elec_excited
#define DEBUG_ENTRY(funcname)
multi_arr< long int, 2 > ipTransitionSort
bool compareEnergies(qStateProxy st1, qStateProxy st2)
TransitionList::iterator rad_end
void H2_ReadDissocEnergies(void)
valarray< long > nRot_hi[N_ELEC]
vector< TransitionList > AllTransitions
valarray< long > ipRot_H2_energy_sort
valarray< realnum > H2_X_source
multi_arr< double, 3 > H2_Boltzmann
void H2_ReadDissprob(long int nelec)
STATIC double H2_vib_dist(int ipH2, double EH2, double DissocEnergy, double energy_wn)
const double ATOMIC_MASS_UNIT
multi_arr< realnum, 2 > H2_X_coll_rate
STATIC bool lgRadiative(const TransitionList::iterator &tr)
multi_arr< double, 2 > H2_col_rate_in
multi_arr< realnum, 2 > H2_X_colden
multi_arr< int, 2 > H2_ipPhoto
multi_arr< bool, 3 > H2_lgOrtho