00001
00002
00003
00004 #ifndef H2_PRIV_H_
00005 #define H2_PRIV_H_
00006
00007 #include "transition.h"
00008 #include "parser.h"
00009 #include "mole.h"
00010
00013 const int N_X_COLLIDER = 5;
00015 const int chN_X_COLLIDER = 10;
00016
00018 const int nTE_HMINUS = 7;
00019
00021 const int N_ELEC = 7;
00022
00024 const realnum H2_logte_hminus[nTE_HMINUS] = {1.,1.47712,2.,2.47712,3.,3.47712,4.};
00025
00026 struct diss_level
00027 {
00028 long n, v, j;
00029 };
00030
00031 class diss_tran
00032 {
00033 public:
00034 explicit diss_tran( diss_level a, diss_level b )
00035 {
00036 initial = a;
00037 final = b;
00038 energies.clear();
00039 xsections.clear();
00040 rate_coeff = 0.;
00041 };
00042 diss_level initial, final;
00043 vector<double> energies;
00044 vector<double> xsections;
00045 double rate_coeff;
00046 };
00047
00048 struct t_coll_source
00049 {
00050 t_coll_source()
00051 {
00052 magic = 0;
00053 filename = "";
00054 };
00055 long magic;
00056 string filename;
00057 };
00058
00059 class diatomics
00060 {
00061 public:
00062 double Abund() const
00063 {
00064 return *dense_total;
00065 }
00066 void GetIndices( long& ipHi, long& ipLo, const char* chLine, long& i ) const;
00067 void CalcPhotoionizationRate(void);
00068 double (*photoion_opacity_fun)( double energy );
00069 long OpacityCreate( double *stack );
00070 double GetHeatRate( const diss_tran& tran );
00071 double GetDissociationRate( const diss_tran& tran );
00072 double MolDissocOpacity( const diss_tran& tran, const double& Mol_Ene );
00073 double Cont_Diss_Heat_Rate( void );
00074 void Mol_Photo_Diss_Rates( void );
00075 void Read_Mol_Diss_cross_sections(void);
00076 void SolveExcitedElectronicLevels(void);
00077 void SolveSomeGroundElectronicLevels(void);
00078 double GetExcitedElecDensity(void);
00079 realnum GetXColden( long iVib, long iRot );
00080
00081 long int getLine( long iElecHi, long iVibHi, long iRotHi, long iElecLo, long iVibLo, long iRotLo, double *relint, double *absint );
00082
00083
00084 realnum H2_CollidRateEvalOne( long iVibHi, long iRotHi, long iVibLo, long iRotLo, long ipHi, long ipLo, long nColl, double temp_K );
00085
00086 void H2_Calc_Average_Rates( void );
00087
00088 void H2_X_sink_and_source( void );
00089
00090
00091 void H2_X_coll_rate_evaluate( void );
00092
00093
00094
00095 void H2_Level_low_matrix(realnum abundance );
00096
00097
00098
00099
00100
00101 void H2_ReadEnergies();
00102 void H2_ReadEnergies( long int nelec, vector<int>& n, vector<int>& v, vector<int>&J, vector<double>& eWN );
00103
00107 void H2_ReadDissprob( long int nelec );
00108
00110 void H2_CollidRateEvalAll( void );
00111
00115 void H2_CollidRateRead( long int nColl );
00116
00120 void H2_ReadTransprob( long int nelec, TransitionList &trans );
00121
00123 void H2_Read_hminus_distribution(void);
00124
00126 void mole_H2_form( void );
00127
00129 void mole_H2_LTE( void );
00130
00133 void H2_Solomon_rate( void );
00134
00136 double gs_rate( void );
00137
00140 void H2_zero_pops_too_low( void );
00141
00143 void init(void);
00144
00146 void H2_ContPoint( void );
00147
00149 double H2_DR(void);
00150
00152 double H2_Accel(void);
00153
00155 void H2_RT_OTS( void );
00156
00158 double H2_RadPress(void);
00159
00161 void H2_LinesAdd(void);
00162
00164 void H2_Reset( void );
00165
00167 double H2_InterEnergy(void);
00168
00172 void H2_Colden( const char *chLabel );
00173
00178 void H2_Cooling(const char *chString);
00179
00184 void H2_Punch_line_data(
00185 FILE* ioPUN ,
00186 bool lgDoAll );
00187
00193 void H2_PunchLineStuff( FILE * io , realnum xLimit , long index);
00194
00196 void H2_RT_diffuse(void);
00197
00200 void H2_RTMake( void );
00201
00203 void H2_RT_tau_inc(void);
00204
00206 void H2_Prt_Zone(void);
00207
00208
00209 void H2_PrtDepartCoef(void);
00210
00212 void H2_LineZero( void );
00213
00215 void H2_RT_tau_reset( void );
00216
00218 void H2_LevelPops( bool &lgPopsConverged, double &old_value, double &new_value );
00219
00226 void H2_PunchDo( FILE* io , char chJOB[] , const char chTime[] , long int ipPun );
00227
00229 void H2_Prt_line_tau(void);
00230
00232 void H2_ParseSave( Parser &p ,
00233 char *chHeader);
00234
00236 double H2_itrzn( void );
00237
00242 void H2_Prt_column_density( FILE *ioMEAN );
00243
00244 void set_numLevelsMatrix( long numLevels );
00245
00246 void H2_ReadDissocEnergies( void );
00247
00249 bool lgREAD_DATA;
00250
00251 double photoionize_rate;
00252 double photo_heat_soft;
00253 double photo_heat_hard;
00254 double photodissoc_BigH2_H2s;
00255 double photodissoc_BigH2_H2g;
00256
00257
00258
00259 double spon_diss_tot;
00260
00261 double Solomon_dissoc_rate_g;
00262 double Solomon_dissoc_rate_s;
00263
00265 double Solomon_elec_decay_g;
00266 double Solomon_elec_decay_s;
00267
00270 double rate_grain_op_conserve;
00271 double rate_grain_J1_to_J0;
00272
00274 double Cont_Dissoc_Rate_H2s;
00275 double Cont_Dissoc_Rate_H2g;
00276 multi_arr<double,3> Cont_Dissoc_Rate;
00277
00279 double rel_pop_LTE_g;
00280 double rel_pop_LTE_s;
00281
00283 double average_energy_g;
00284 double average_energy_s;
00285
00286 double HeatDiss;
00287 double HeatDexc;
00288 double HeatDexc_old;
00289 double HeatDexc_deriv;
00290 double HeatChangeOld, HeatChange;
00291
00293 double Average_A;
00295 double Average_collH2_deexcit;
00296 double Average_collH_deexcit;
00297 double Average_collH2_excit;
00298 double Average_collH_excit;
00300 double Average_collH_dissoc_g;
00301 double Average_collH_dissoc_s;
00302 double Average_collH2_dissoc_g;
00303 double Average_collH2_dissoc_s;
00304
00307 bool lgEvaluated;
00308
00310 long ip_photo_opac_thresh;
00311 long ip_photo_opac_offset;
00312
00313 t_coll_source coll_source[N_X_COLLIDER];
00314
00316 double ortho_density,
00318 para_density;
00319
00320
00321 realnum ortho_density_f,
00322 para_density_f;
00323
00325 double ortho_colden ,
00326 para_colden;
00327
00328
00329 double ortho_para_old, ortho_para_older, ortho_para_current;
00330
00331
00332
00333 double renorm_max ,
00334 renorm_min;
00335
00336
00337
00338 long int nCall_this_zone;
00339
00340
00341
00342 bool lgEnabled;
00343
00344
00345
00346 int nElecLevelOutput;
00347
00348
00349 bool lgH2_H_coll_07;
00350
00353 bool lgColl_gbar;
00354
00356 bool lgColl_deexec_Calc;
00357
00359 bool lgColl_dissoc_coll;
00360
00361
00362
00363 bool lgH2_grain_deexcitation;
00364
00366 bool lgLTE;
00367
00369 bool lgH2_ortho_para_coll_on;
00370
00371
00372
00373 bool lgH2_He_ORNL;
00374
00375
00376 bool lgH2_ORH2_ORNL;
00377 bool lgH2_PAH2_ORNL;
00378
00380 bool lgH2_NOISE;
00382 bool lgH2_NOISECOSMIC;
00383
00384 long int loop_h2_oscil;
00385 long int nzoneEval;
00386
00388 double xMeanNoise , xSTDNoise;
00389
00391 double H2_to_H_limit;
00392
00393 realnum mass_amu;
00394
00396 int nTRACE;
00397
00399 int n_trace_final ,
00400 n_trace_iterations ,
00401 n_trace_full,
00402 n_trace_matrix;
00403
00404
00405
00406 long int n_elec_states;
00407
00408
00409 double frac_matrix;
00410
00411
00412 double TeUsedBoltz;
00413 double TeUsedColl;
00414
00415 explicit diatomics( const string& a, const double& e_star, const double* const abund, double (*fun)(double) ) : trans(a, &states), ENERGY_H2_STAR (e_star), dense_total(abund)
00416 {
00417 fixit();
00418 path = a;
00419 label = a;
00420 {
00421 unsigned j;
00422 for( j = 0; j < a.size(); ++j )
00423 label[j] = toupper( label[j] );
00424 shortlabel = label;
00425 for( j = a.size(); j < 4; ++j )
00426 label += ' ';
00427 label += '\0';
00428 }
00429
00430
00431
00432 lgColl_gbar = true;
00433
00434
00435 lgColl_deexec_Calc = true;
00436 lgColl_dissoc_coll = true;
00437 lgEnabled = false;
00438 lgEvaluated = false;
00439
00440
00441 lgH2_grain_deexcitation = false;
00442
00443 lgH2_NOISE = false;
00444 lgH2_NOISECOSMIC = false;
00445
00446 lgH2_ortho_para_coll_on = true;
00447
00448
00449
00450
00451 lgH2_He_ORNL = true;
00452
00453 lgH2_H_coll_07 = true;
00454
00455
00456 lgH2_ORH2_ORNL = true;
00457 lgH2_PAH2_ORNL = true;
00458
00459 lgLTE = false;
00460 lgREAD_DATA = false;
00461 loop_h2_oscil = -1;
00462 HeatDiss = 0.;
00463 HeatDexc = 0.;
00464 HeatDexc_old = 0.;
00465 HeatDexc_deriv = 0.;
00466 HeatChangeOld = 0.;
00467 HeatChange = 0.;
00468 photo_heat_soft = 0.;
00469 photo_heat_hard = 0.;
00470 photodissoc_BigH2_H2s = 0.;
00471 photodissoc_BigH2_H2g = 0.;
00472 photoion_opacity_fun = fun;
00473 Solomon_dissoc_rate_s = 0.;
00474 Solomon_dissoc_rate_g = 0.;
00475 spon_diss_tot = 0.;
00476 rate_grain_op_conserve = 0.;
00477 rate_grain_J1_to_J0 = 0.;
00478 Average_A = 0.;
00479 Average_collH2_deexcit = 0.;
00480 Average_collH_deexcit = 0.;
00481 Average_collH2_excit = 0.;
00482 Average_collH_excit = 0.;
00483 Average_collH_dissoc_g = 0.;
00484 Average_collH_dissoc_s = 0.;
00485 Average_collH2_dissoc_g = 0.;
00486 Average_collH2_dissoc_s = 0.;
00487
00488
00489
00490 renorm_max = 1.;
00491 renorm_min = 1.;
00492
00493 ortho_colden = 0.;
00494 para_colden = 0.;
00495 ortho_para_old = 0.;
00496 ortho_para_older = 0.;
00497 ortho_para_current = 0.;
00498 TeUsedBoltz = -1.;
00499 TeUsedColl = -1.;
00500
00501
00502 nH2_pops = 0;
00503 nH2_zone = 0;
00505
00506
00507 n_trace_final = 1;
00508
00509 n_trace_iterations = 2;
00510
00511 n_trace_full = 3;
00512
00513 n_trace_matrix = 4;
00514
00515 nTRACE = false;
00516
00517
00518
00519 nElecLevelOutput = 1;
00520
00521
00522
00523 n_elec_states = N_ELEC;
00524 nCall_this_zone = 0;
00525
00526
00527
00528
00529 nXLevelsMatrix = 70;
00530 ndimMalloced = 0;
00531
00532 levelAsEval = -1;
00533 lgFirst = true;
00534 nzone_eval = -1;
00535 nzoneEval = -1;
00536 iteration_evaluated = -1;
00537
00538
00539 nzone_nlevel_set = -1;
00540 nzoneAsEval = -1;
00541
00542 nzone_nlevel_set = 0;
00543
00544
00545
00546
00547
00548
00549
00550 H2_to_H_limit = 1e-8;
00551 iterationAsEval = -1;
00552
00553 strcpy( chH2ColliderLabels[0] , "H0" );
00554 strcpy( chH2ColliderLabels[1] , "He" );
00555 strcpy( chH2ColliderLabels[2] , "H2 o" );
00556 strcpy( chH2ColliderLabels[3] , "H2 p" );
00557 strcpy( chH2ColliderLabels[4] , "H+" );
00558 };
00559
00560 molecule *sp;
00561 molecule *sp_star;
00562 qList states;
00563 TransitionList trans;
00564 TransitionList::iterator rad_end;
00565 vector< diss_tran > Diss_Trans;
00566
00567 private:
00568 string label;
00569 string shortlabel;
00570 string path;
00571
00574
00575
00576
00577
00578
00579
00580
00581 const double ENERGY_H2_STAR;
00582
00583
00584 const double* const dense_total;
00585
00586 char chH2ColliderLabels[N_X_COLLIDER][chN_X_COLLIDER];
00587
00588
00589
00590
00592 long int nEner_H2_ground;
00593
00595 multi_arr<double,2> pops_per_vib;
00596
00598 double H2_renorm_chemistry;
00599
00601 multi_arr<realnum,2> H2_X_coll_rate;
00602
00603
00604 double H2_DissocEnergies[N_ELEC];
00606 long int nVib_hi[N_ELEC];
00608 valarray<long> nRot_hi[N_ELEC];
00611 long int Jlowest[N_ELEC];
00613 long int nLevels_per_elec[N_ELEC];
00615 double pops_per_elec[N_ELEC];
00616 multi_arr<realnum,3> CollRateCoeff;
00617 multi_arr<realnum,3> CollRateErrFac;
00618 vector<CollRateCoeffArray> RateCoefTable;
00619
00620
00621 #if 1
00622 #endif
00623
00624
00625 #if 1
00626
00627 multi_arr<realnum,3> H2_dissprob;
00628 multi_arr<realnum,3> H2_disske;
00629 multi_arr<double,3> H2_rad_rate_out;
00630
00632 multi_arr<double,3> H2_old_populations;
00633 multi_arr<double,3> H2_Boltzmann;
00634 multi_arr<double,3> H2_populations_LTE;
00636 multi_arr<realnum,3> H2_stat;
00638 multi_arr<bool,3> H2_lgOrtho;
00639 #endif
00640
00641 long int nzoneAsEval , iterationAsEval;
00642
00643
00644 #if 1
00645 multi_arr<int,2> H2_ipPhoto;
00646 multi_arr<double,2> H2_col_rate_in;
00647 multi_arr<double,2> H2_col_rate_out;
00648 multi_arr<double,2> H2_rad_rate_in;
00651 multi_arr<realnum,2> H2_X_formation;
00653 multi_arr<realnum,2> H2_X_Hmin_back;
00655 multi_arr<realnum,2> H2_X_colden;
00657 multi_arr<realnum,2> H2_X_colden_LTE;
00659 multi_arr<double,2> H2_X_rate_from_elec_excited;
00661 multi_arr<double,2> H2_X_rate_to_elec_excited;
00663 multi_arr<realnum,2> H2_coll_dissoc_rate_coef;
00664
00666 multi_arr<realnum,2> H2_coll_dissoc_rate_coef_H2;
00667 #endif
00668
00669 valarray<realnum> H2_X_source;
00670 valarray<realnum> H2_X_sink;
00671
00674 multi_arr<realnum,3> H2_X_grain_formation_distribution;
00675
00677 double H2_den_s , H2_den_g;
00678
00680 multi_arr<realnum,3> H2_X_hminus_formation_distribution;
00681
00682 valarray<long> ipVib_H2_energy_sort;
00683 valarray<long> ipElec_H2_energy_sort;
00684 valarray<long> ipRot_H2_energy_sort;
00685 multi_arr<long int,3> ipEnergySort;
00686 multi_arr<long int,2> ipTransitionSort;
00687
00690 long int nXLevelsMatrix;
00691 long int ndimMalloced;
00692 double **AulEscp,
00693 **col_str,
00694 **AulDest,
00695 **AulPump,
00696 **CollRate_levn;
00697 vector<double> pops, create, destroy, depart, stat_levn, excit;
00698
00699 long int levelAsEval;
00700 bool lgFirst;
00701 long int nzone_eval;
00702 long int iteration_evaluated;
00703
00705 multi_arr<realnum,6> H2_SaveLine;
00706
00709 multi_arr<bool,2> lgH2_radiative;
00710
00712 long int nH2_pops;
00713 long int nH2_zone;
00714
00716 long int nzone_nlevel_set;
00717
00721 long int nCall_this_iteration;
00722
00723 };
00724
00725
00726 double MolDissocCrossSection( const diss_tran& tran, const double& Mol_Ene );
00727
00728 double Yan_H2_CS( double energy_ryd );
00729
00730
00731
00732
00733 #endif
00734