00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #define PRT_POPS false
00023
00024 #define LIM_H2_POP_LOOP 100
00025
00026
00027 #define H2_DISS_ALLISON_DALGARNO 6e-19f
00028 #include "cddefines.h"
00029 #include "cddrive.h"
00030 #include "physconst.h"
00031 #include "taulines.h"
00032 #include "atoms.h"
00033 #include "conv.h"
00034 #include "secondaries.h"
00035 #include "pressure.h"
00036 #include "trace.h"
00037 #include "hmi.h"
00038 #include "hextra.h"
00039 #include "rt.h"
00040 #include "radius.h"
00041 #include "ipoint.h"
00042 #include "phycon.h"
00043 #include "thermal.h"
00044 #include "dense.h"
00045 #include "rfield.h"
00046 #include "lines_service.h"
00047 #include "mole.h"
00048 #include "h2.h"
00049 #include "h2_priv.h"
00050
00051
00052 static long int loop_h2_pops;
00053
00054 realnum H2_te_hminus[nTE_HMINUS] = {10.,30.,100.,300.,1000.,3000.,10000.};
00055
00056
00057
00058 static realnum collider_density[N_X_COLLIDER];
00059 static realnum collider_density_total_not_H2;
00060
00061
00062
00063
00064 int H2_nRot_add_ortho_para[N_H2_ELEC] = {0 , 1 , 1 , 0, 1, 1 , 0};
00065
00066
00067
00068
00069
00070
00071
00072 double H2_DissocEnergies[N_H2_ELEC] =
00073 { 36118.11, 118375.6, 118375.6, 118375.6, 118375.6,133608.6,133608.6 };
00074
00075
00076
00077 double exp_disoc;
00078
00079
00080
00081 STATIC void H2_X_coll_rate_evaluate( void )
00082 {
00083 long int nColl,
00084 ipHi ,
00085 ipLo,
00086 ip,
00087 iVibHi,
00088 iRotHi,
00089 iVibLo,
00090 iRotLo;
00091 realnum colldown;
00092 double exph2_big,
00093 exph2_big_0,
00094 rel_pop_LTE_H2_big;
00095
00096 DEBUG_ENTRY( "H2_X_coll_rate_evaluate()" );
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 collider_density[0] = dense.xIonDense[ipHYDROGEN][0];
00107
00108
00109 collider_density[1] = dense.xIonDense[ipHELIUM][0];
00110
00111 collider_density[2] = (realnum)h2.ortho_density;
00112
00113 collider_density[3] = (realnum)h2.para_density;
00114
00115 collider_density[4] = dense.xIonDense[ipHYDROGEN][1];
00116
00117 collider_density[4] += hmi.Hmolec[ipMH3p];
00118
00119 ASSERT( fp_equal(hmi.H2_total ,collider_density[2]+collider_density[3]) );
00120
00121
00122
00123 collider_density_total_not_H2 = collider_density[0] +
00124 collider_density[1] + collider_density[4] +
00125 (realnum)dense.eden;
00126
00127 if( mole.nH2_TRACE >= mole.nH2_trace_full )
00128 {
00129 fprintf(ioQQQ," Collider densities are:");
00130 for( nColl=0; nColl<N_X_COLLIDER; ++nColl )
00131 {
00132 fprintf(ioQQQ,"\t%.3e", collider_density[nColl]);
00133 }
00134 fprintf(ioQQQ,"\n");
00135 }
00136
00137 for( ipHi=0; ipHi<nLevels_per_elec[0]; ++ipHi )
00138 {
00139 H2_X_source[ipHi] = 0.;
00140 H2_X_sink[ipHi] = 0.;
00141 }
00142 H2_X_coll_rate.zero();
00143
00144
00145 exp_disoc = sexp(H2_DissocEnergies[0]/phycon.te_wn);
00146 exph2_big_0 = exp_disoc/SDIV(H2_Boltzmann[0][0][0]);
00147
00148 rel_pop_LTE_H2_big =SAHA/SDIV((phycon.te32*exph2_big_0))*(H2_stat[0][0][0]/(2.*2.))*3.634e-5;
00149
00150
00151
00152
00153
00154
00155
00156
00157 H2_X_source[0] += H2_X_formation[0][0];
00158
00159
00160 H2_X_sink[0] += (realnum)(H2_X_Hmin_back[0][0]*hmi.rel_pop_LTE_Hmin/
00161 SDIV(rel_pop_LTE_H2_big)*dense.eden);
00162
00163
00164 H2_X_sink[0] += collider_density_total_not_H2 *
00165 H2_coll_dissoc_rate_coef[0][0] * mole.lgColl_deexec_Calc;
00166
00167 H2_X_sink[0] += hmi.H2_total*
00168 H2_coll_dissoc_rate_coef_H2[0][0] * mole.lgColl_deexec_Calc;
00169
00170
00171 H2_X_sink[0] += secondaries.csupra[ipHYDROGEN][0]*2.02f * mole.lgColl_deexec_Calc;
00172
00173
00174 H2_X_sink[0] += (realnum)(3.9e-21 * hextra.cryden_ov_background * co.lgUMISTrates);
00175
00176
00177 H2_X_sink[0] += (realnum)(2.2e-19 * hextra.cryden_ov_background * co.lgUMISTrates);
00178
00179
00180 H2_X_sink[0] += (realnum)(secondaries.csupra[ipHYDROGEN][0]*0.0478);
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191 H2_X_sink[0] += 10.f*secondaries.x12tot;
00192
00193
00194 H2_X_sink[0] += (realnum)hmi.H2_photoionize_rate;
00195
00196
00197 H2_X_sink[0] += rfield.flux_accum[H2_ipPhoto[0][0]-1]*H2_DISS_ALLISON_DALGARNO;
00198
00199
00200
00201
00202
00203 H2_X_sink[0] += (realnum)(hmi.rh2h2p*dense.xIonDense[ipHYDROGEN][1]);
00204
00205
00206 ipHi = nLevels_per_elec[0];
00207 while( (--ipHi) > 0 )
00208 {
00209
00210 ip = H2_ipX_ener_sort[ipHi];
00211 iVibHi = ipVib_H2_energy_sort[ip];
00212 iRotHi = ipRot_H2_energy_sort[ip];
00213
00214
00215 exph2_big = exp_disoc/SDIV(H2_Boltzmann[0][iVibHi][iRotHi]);
00216
00217
00218 rel_pop_LTE_H2_big = SAHA/SDIV((phycon.te32*exph2_big))*(H2_stat[0][iVibHi][iRotHi]/(2.*2.))*3.634e-5;
00219
00220
00221
00222 H2_X_source[ipHi] += H2_X_formation[iVibHi][iRotHi];
00223
00224 H2_X_sink[ipHi] += (realnum)(H2_X_Hmin_back[iVibHi][iRotHi]*hmi.rel_pop_LTE_Hmin/
00225 SDIV(rel_pop_LTE_H2_big)*dense.eden);
00226
00227
00228 H2_X_sink[ipHi] += collider_density_total_not_H2 *
00229 H2_coll_dissoc_rate_coef[iVibHi][iRotHi] * mole.lgColl_deexec_Calc;
00230
00231
00232 H2_X_sink[ipHi] += hmi.H2_total*
00233 H2_coll_dissoc_rate_coef_H2[iVibHi][iRotHi] * mole.lgColl_deexec_Calc;
00234
00235
00236 H2_X_sink[ipHi] += secondaries.csupra[ipHYDROGEN][0]*2.02f * mole.lgColl_deexec_Calc;
00237
00238
00239 H2_X_sink[ipHi] += (realnum)(3.9e-21 * hextra.cryden_ov_background * co.lgUMISTrates);
00240
00241
00242 H2_X_sink[ipHi] += (realnum)(2.2e-19 * hextra.cryden_ov_background * co.lgUMISTrates);
00243
00244
00245 H2_X_sink[ipHi] += (realnum)(secondaries.csupra[ipHYDROGEN][0]*0.0478);
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256 H2_X_sink[ipHi] += 10.f*secondaries.x12tot;
00257
00258
00259 H2_X_sink[ipHi] += (realnum)hmi.H2_photoionize_rate;
00260
00261
00262 H2_X_sink[ipHi] += rfield.flux_accum[H2_ipPhoto[iVibHi][iRotHi]-1]*H2_DISS_ALLISON_DALGARNO;
00263
00264 if( mole.lgColl_deexec_Calc )
00265 {
00266
00267 for( ipLo=0; ipLo<ipHi; ++ipLo )
00268 {
00269
00270 ip = H2_ipX_ener_sort[ipLo];
00271 iVibLo = ipVib_H2_energy_sort[ip];
00272 iRotLo = ipRot_H2_energy_sort[ip];
00273
00274
00275 colldown = 0.;
00276 mr5ci H2CollRate = H2_CollRate.begin(iVibHi,iRotHi,iVibLo,iRotLo);
00277 for( nColl=0; nColl<N_X_COLLIDER; ++nColl )
00278 {
00279
00280 colldown += H2CollRate[nColl]*collider_density[nColl];
00281 ASSERT( H2CollRate[nColl]*collider_density[nColl] >= 0. );
00282 }
00283
00284 H2_X_coll_rate[ipHi][ipLo] += colldown;
00285 }
00286 }
00287 }
00288 return;
00289 }
00290
00291
00292 double H2_itrzn( void )
00293 {
00294 if( h2.lgH2ON && nH2_zone>0 )
00295 {
00296 return( (double)nH2_pops / (double)nH2_zone );
00297 }
00298 else
00299 {
00300 return 0.;
00301 }
00302 }
00303
00304
00305 void H2_ContPoint( void )
00306 {
00307 long int iElecHi , iElecLo , iVibHi , iVibLo , iRotHi , iRotLo;
00308
00309 if( !h2.lgH2ON )
00310 return;
00311
00312 DEBUG_ENTRY( "H2_ContPoint()" );
00313
00314
00315 for( iElecHi=0; iElecHi<mole.n_h2_elec_states; ++iElecHi )
00316 {
00317 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
00318 {
00319 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
00320 {
00321
00322
00323
00324
00325 long int lim_elec_lo = 0;
00326 for( iElecLo=0; iElecLo<=lim_elec_lo; ++iElecLo )
00327 {
00328
00329
00330 long int nv = h2.nVib_hi[iElecLo];
00331 if( iElecLo==iElecHi )
00332 nv = iVibHi;
00333 for( iVibLo=0; iVibLo<=nv; ++iVibLo )
00334 {
00335 long nr = h2.nRot_hi[iElecLo][iVibLo];
00336 if( iElecLo==iElecHi && iVibHi==iVibLo )
00337 nr = iRotHi-1;
00338
00339 for( iRotLo=h2.Jlowest[iElecLo]; iRotLo<=nr; ++iRotLo )
00340 {
00341
00342 if( lgH2_line_exists[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo] )
00343 {
00344 ASSERT( H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].Emis->Aul > 0. );
00345 H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].ipCont =
00346 ipLineEnergy(
00347 H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].EnergyWN * WAVNRYD ,
00348 "H2 " , 0 );
00349 H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].Emis->ipFine =
00350 ipFineCont(
00351 H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].EnergyWN * WAVNRYD );
00352 }
00353 }
00354 }
00355 }
00356 }
00357 }
00358 }
00359 return;
00360 }
00361
00362
00363
00364 double H2_Accel(void)
00365 {
00366 long int iElecHi , iElecLo , iVibHi , iVibLo , iRotHi , iRotLo;
00367 double h2_drive;
00368
00369
00370 if( !h2.lgH2ON )
00371 return 0.;
00372
00373 DEBUG_ENTRY( "H2_Accel()" );
00374
00375
00376
00377
00378 h2_drive = 0.;
00379
00380 for( iElecHi=0; iElecHi<mole.n_h2_elec_states; ++iElecHi )
00381 {
00382 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
00383 {
00384 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
00385 {
00386
00387
00388
00389
00390 long int lim_elec_lo = 0;
00391 for( iElecLo=0; iElecLo<=lim_elec_lo; ++iElecLo )
00392 {
00393
00394
00395 long int nv = h2.nVib_hi[iElecLo];
00396 if( iElecLo==iElecHi )
00397 nv = iVibHi;
00398 for( iVibLo=0; iVibLo<=nv; ++iVibLo )
00399 {
00400 long nr = h2.nRot_hi[iElecLo][iVibLo];
00401 if( iElecLo==iElecHi && iVibHi==iVibLo )
00402 nr = iRotHi-1;
00403
00404 mb6ci lgH2le = lgH2_line_exists.ptr(iElecHi,iVibHi,iRotHi,iElecLo,iVibLo,h2.Jlowest[iElecLo]);
00405 mt6ci H2L = H2Lines.ptr(iElecHi,iVibHi,iRotHi,iElecLo,iVibLo,h2.Jlowest[iElecLo]);
00406 for( iRotLo=h2.Jlowest[iElecLo]; iRotLo<=nr; ++iRotLo )
00407 {
00408
00409
00410 if( *lgH2le++ )
00411 {
00412 ASSERT( H2L->ipCont > 0 );
00413 h2_drive += H2L->Emis->pump*H2L->EnergyErg*H2L->Emis->PopOpc;
00414 }
00415 ++H2L;
00416 }
00417 }
00418 }
00419 }
00420 }
00421 }
00422 return h2_drive;
00423 }
00424
00425
00426
00427 double H2_RadPress(void)
00428 {
00429 long int iElecHi , iElecLo , iVibHi , iVibLo , iRotHi , iRotLo;
00430 double press;
00431
00432
00433 realnum smallfloat=SMALLFLOAT*10.f;
00434
00435
00436
00437 if( !h2.lgH2ON || !h2.nCallH2_this_zone )
00438 return 0.;
00439
00440 DEBUG_ENTRY( "H2_RadPress()" );
00441
00442 press = 0.;
00443
00444 for( iElecHi=0; iElecHi<mole.n_h2_elec_states; ++iElecHi )
00445 {
00446 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
00447 {
00448 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
00449 {
00450
00451
00452
00453
00454 long int lim_elec_lo = 0;
00455 for( iElecLo=0; iElecLo<=lim_elec_lo; ++iElecLo )
00456 {
00457
00458
00459 long int nv = h2.nVib_hi[iElecLo];
00460 if( iElecLo==iElecHi )
00461 nv = iVibHi;
00462 for( iVibLo=0; iVibLo<=nv; ++iVibLo )
00463 {
00464 long nr = h2.nRot_hi[iElecLo][iVibLo];
00465 if( iElecLo==iElecHi && iVibHi==iVibLo )
00466 nr = iRotHi-1;
00467
00468 mb6ci lgH2le = lgH2_line_exists.ptr(iElecHi,iVibHi,iRotHi,iElecLo,iVibLo,h2.Jlowest[iElecLo]);
00469 mt6ci H2L = H2Lines.ptr(iElecHi,iVibHi,iRotHi,iElecLo,iVibLo,h2.Jlowest[iElecLo]);
00470 for( iRotLo=h2.Jlowest[iElecLo]; iRotLo<=nr; ++iRotLo )
00471 {
00472 if( *lgH2le++ )
00473 {
00474 ASSERT( H2L->ipCont > 0 );
00475
00476 if( H2L->Hi->Pop > smallfloat && H2L->Emis->PopOpc > smallfloat )
00477 {
00478 double RadPres1 = PressureRadiationLine( &(*H2L), 1.0 );
00479 press += RadPres1;
00480 }
00481 }
00482 ++H2L;
00483 }
00484 }
00485 }
00486 }
00487 }
00488 }
00489
00490 if(mole.nH2_TRACE >= mole.nH2_trace_full)
00491 fprintf(ioQQQ,
00492 " H2_RadPress returns, radiation pressure is %.2e\n",
00493 press );
00494 return press;
00495 }
00496
00497 #if 0
00498
00499
00500 double H2_InterEnergy(void)
00501 {
00502 long int iElecHi , iElecLo , iVibHi , iVibLo , iRotHi , iRotLo;
00503 double energy;
00504
00505
00506 if( !h2.lgH2ON )
00507 return 0.;
00508
00509 DEBUG_ENTRY( "H2_InterEnergy()" );
00510
00511 broken();
00512
00513
00514
00515
00516 energy = 0.;
00517
00518 for( iElecHi=0; iElecHi<mole.n_h2_elec_states; ++iElecHi )
00519 {
00520 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
00521 {
00522 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
00523 {
00524 double H2popHi = H2Lines[iElecHi][iVibHi][iRotHi][0][0][0].Hi->Pop;
00525
00526
00527
00528
00529
00530 long int lim_elec_lo = 0;
00531 for( iElecLo=0; iElecLo<=lim_elec_lo; ++iElecLo )
00532 {
00533
00534
00535 long int nv = h2.nVib_hi[iElecLo];
00536 if( iElecLo==iElecHi )
00537 nv = iVibHi;
00538 for( iVibLo=0; iVibLo<=nv; ++iVibLo )
00539 {
00540 long nr = h2.nRot_hi[iElecLo][iVibLo];
00541 if( iElecLo==iElecHi && iVibHi==iVibLo )
00542 nr = iRotHi-1;
00543
00544 mb6ci lgH2le = lgH2_line_exists.ptr(iElecHi,iVibHi,iRotHi,iElecLo,iVibLo,h2.Jlowest[iElecLo]);
00545 mt6ci H2L = H2Lines.ptr(iElecHi,iVibHi,iRotHi,iElecLo,iVibLo,h2.Jlowest[iElecLo]);
00546 for( iRotLo=h2.Jlowest[iElecLo]; iRotLo<=nr; ++iRotLo )
00547 {
00548
00549
00550 if( *lgH2le++ )
00551 {
00552 energy += H2popHi*H2L->EnergyErg;
00553 }
00554 ++H2L;
00555 }
00556 }
00557 }
00558 }
00559 }
00560 }
00561 return energy;
00562 }
00563 #endif
00564
00565
00566 void H2_RT_diffuse(void)
00567 {
00568 long int iElecHi , iElecLo , iVibHi , iVibLo , iRotHi , iRotLo;
00569
00570 if( !h2.lgH2ON || !h2.nCallH2_this_zone )
00571 return;
00572
00573 DEBUG_ENTRY( "H2_RT_diffuse()" );
00574
00575
00576
00577 for( iElecHi=0; iElecHi<1; ++iElecHi )
00578 {
00579 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
00580 {
00581 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
00582 {
00583
00584
00585
00586
00587 long int lim_elec_lo = 0;
00588 for( iElecLo=0; iElecLo<=lim_elec_lo; ++iElecLo )
00589 {
00590
00591
00592 long int nv = h2.nVib_hi[iElecLo];
00593 if( iElecLo==iElecHi )
00594 nv = iVibHi;
00595 for( iVibLo=0; iVibLo<=nv; ++iVibLo )
00596 {
00597 long nr = h2.nRot_hi[iElecLo][iVibLo];
00598 if( iElecLo==iElecHi && iVibHi==iVibLo )
00599 nr = iRotHi-1;
00600
00601 for( iRotLo=h2.Jlowest[iElecLo]; iRotLo<=nr; ++iRotLo )
00602 {
00603
00604
00605 if( lgH2_line_exists[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo] )
00606 {
00607 outline( &H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo] );
00608 }
00609 }
00610 }
00611 }
00612 }
00613 }
00614 }
00615 return;
00616 }
00617
00618
00619 void H2_RTMake( bool lgDoEsc , bool lgUpdateFineOpac )
00620 {
00621 long int iElecHi , iElecLo , iVibHi , iVibLo , iRotHi , iRotLo;
00622
00623 if( !h2.lgH2ON )
00624 return;
00625
00626 DEBUG_ENTRY( "H2_RTMake()" );
00627
00628
00629
00630 for( iElecHi=0; iElecHi<mole.n_h2_elec_states; ++iElecHi )
00631 {
00632 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
00633 {
00634 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
00635 {
00636
00637
00638
00639
00640 long int lim_elec_lo = 0;
00641 for( iElecLo=0; iElecLo<=lim_elec_lo; ++iElecLo )
00642 {
00643
00644
00645 long int nv = h2.nVib_hi[iElecLo];
00646 if( iElecLo==iElecHi )
00647 nv = iVibHi;
00648 for( iVibLo=0; iVibLo<=nv; ++iVibLo )
00649 {
00650 long nr = h2.nRot_hi[iElecLo][iVibLo];
00651 if( iElecLo==iElecHi && iVibHi==iVibLo )
00652 nr = iRotHi-1;
00653
00654 mb6ci lgH2le = lgH2_line_exists.ptr(iElecHi,iVibHi,iRotHi,iElecLo,iVibLo,h2.Jlowest[iElecLo]);
00655 for( iRotLo=h2.Jlowest[iElecLo]; iRotLo<=nr; ++iRotLo )
00656 {
00657
00658
00659 if( *lgH2le++ )
00660 {
00661
00662
00663
00664
00665 RT_line_one( &H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo], lgDoEsc, lgUpdateFineOpac, false );
00666 }
00667 }
00668 }
00669 }
00670 }
00671 }
00672 }
00673
00674
00675 {
00676 enum {DEBUG_LOC=false};
00677 if( DEBUG_LOC )
00678 {
00679 double sumpop = 0.;
00680 double sumpopA = 0.;
00681 for( iElecHi=1; iElecHi<mole.n_h2_elec_states; ++iElecHi )
00682 {
00683 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
00684 {
00685 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
00686 {
00687
00688
00689
00690
00691 iElecLo = 0;
00692
00693
00694 for( iVibLo=0; iVibLo<=h2.nVib_hi[iElecLo]; ++iVibLo )
00695 {
00696 long nr = h2.nRot_hi[iElecLo][iVibLo];
00697 for( iRotLo=h2.Jlowest[iElecLo]; iRotLo<=nr; ++iRotLo )
00698 {
00699
00700
00701
00702 if( lgH2_line_exists[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo] )
00703 {
00704 ASSERT( H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].Emis->Aul > 0. );
00705
00706 sumpop += H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].Lo->Pop;
00707 sumpopA += H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].Lo->Pop*
00708 H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].Emis->Aul;
00709 }
00710 }
00711 }
00712 }
00713 }
00714 }
00715 fprintf(ioQQQ,"DEBUG sumpop = %.3e sumpopA= %.3e A=%.3e\n", sumpop, sumpopA,
00716 sumpopA/SDIV(sumpop) );
00717 }
00718 }
00719 return;
00720 }
00721
00722
00723
00724 void H2_RT_tau_inc(void)
00725 {
00726 long int iElecHi , iElecLo , iVibHi , iVibLo , iRotHi , iRotLo;
00727
00728
00729
00730 if( !h2.lgH2ON )
00731 return;
00732
00733 DEBUG_ENTRY( "H2_RT_tau_inc()" );
00734
00735
00736
00737
00738 if( nzone > 0 && nCallH2_this_iteration>2 )
00739 {
00740 h2.renorm_max = MAX2( H2_renorm_chemistry , h2.renorm_max );
00741 h2.renorm_min = MIN2( H2_renorm_chemistry , h2.renorm_min );
00742 }
00743
00744
00745 for( iElecHi=0; iElecHi<mole.n_h2_elec_states; ++iElecHi )
00746 {
00747 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
00748 {
00749 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
00750 {
00751
00752
00753
00754
00755 long int lim_elec_lo = 0;
00756 for( iElecLo=0; iElecLo<=lim_elec_lo; ++iElecLo )
00757 {
00758
00759
00760 long int nv = h2.nVib_hi[iElecLo];
00761 if( iElecLo==iElecHi )
00762 nv = iVibHi;
00763 for( iVibLo=0; iVibLo<=nv; ++iVibLo )
00764 {
00765 long nr = h2.nRot_hi[iElecLo][iVibLo];
00766 if( iElecLo==iElecHi && iVibHi==iVibLo )
00767 nr = iRotHi-1;
00768
00769 mb6ci lgH2le = lgH2_line_exists.ptr(iElecHi,iVibHi,iRotHi,iElecLo,iVibLo,h2.Jlowest[iElecLo]);
00770 for( iRotLo=h2.Jlowest[iElecLo]; iRotLo<=nr; ++iRotLo )
00771 {
00772
00773
00774 if( *lgH2le++ )
00775 {
00776 ASSERT( H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].ipCont > 0 );
00777 RT_line_one_tauinc( &H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo] ,
00778 -9 , iRotHi , iVibLo , iRotLo);
00779 }
00780 }
00781 }
00782 }
00783 }
00784 }
00785 }
00786
00787 return;
00788 }
00789
00790
00791
00792 void H2_LineZero( void )
00793 {
00794 long int iElecHi , iElecLo , iVibHi , iVibLo , iRotHi , iRotLo;
00795
00796 if( !h2.lgH2ON )
00797 return;
00798
00799 DEBUG_ENTRY( "H2_LineZero()" );
00800
00801
00802 for( iElecHi=0; iElecHi<mole.n_h2_elec_states; ++iElecHi )
00803 {
00804 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
00805 {
00806 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
00807 {
00808
00809
00810
00811
00812 long int lim_elec_lo = 0;
00813 for( iElecLo=0; iElecLo<=lim_elec_lo; ++iElecLo )
00814 {
00815
00816
00817 long int nv = h2.nVib_hi[iElecLo];
00818 if( iElecLo==iElecHi )
00819 nv = iVibHi;
00820 for( iVibLo=0; iVibLo<=nv; ++iVibLo )
00821 {
00822 long nr = h2.nRot_hi[iElecLo][iVibLo];
00823 if( iElecLo==iElecHi && iVibHi==iVibLo )
00824 nr = iRotHi-1;
00825
00826 for( iRotLo=h2.Jlowest[iElecLo]; iRotLo<=nr; ++iRotLo )
00827 {
00828
00829
00830
00831
00832 if( lgH2_line_exists[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo] )
00833 {
00834
00835 TransitionZero( &H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo] );
00836 }
00837 }
00838 }
00839 }
00840 }
00841 }
00842 }
00843 return;
00844 }
00845
00846
00847 void H2_RT_tau_reset( void )
00848 {
00849 long int iElecHi , iElecLo , iVibHi , iVibLo , iRotHi , iRotLo;
00850
00851 if( !h2.lgH2ON )
00852 return;
00853
00854 DEBUG_ENTRY( "H2_RT_tau_reset()" );
00855
00856
00857 for( iElecHi=0; iElecHi<mole.n_h2_elec_states; ++iElecHi )
00858 {
00859 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
00860 {
00861 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
00862 {
00863
00864
00865
00866
00867 long int lim_elec_lo = 0;
00868 for( iElecLo=0; iElecLo<=lim_elec_lo; ++iElecLo )
00869 {
00870
00871
00872 long int nv = h2.nVib_hi[iElecLo];
00873 if( iElecLo==iElecHi )
00874 nv = iVibHi;
00875 for( iVibLo=0; iVibLo<=nv; ++iVibLo )
00876 {
00877 long nr = h2.nRot_hi[iElecLo][iVibLo];
00878 if( iElecLo==iElecHi && iVibHi==iVibLo )
00879 nr = iRotHi-1;
00880
00881 for( iRotLo=h2.Jlowest[iElecLo]; iRotLo<=nr; ++iRotLo )
00882 {
00883
00884
00885
00886 if( lgH2_line_exists[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo] )
00887 {
00888
00889 RT_line_one_tau_reset( &H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo] , 0.5);
00890 }
00891 }
00892 }
00893 }
00894 }
00895 }
00896 }
00897 return;
00898 }
00899
00900
00901 static double frac_matrix;
00902
00903
00904 STATIC void H2_Level_low_matrix(
00905
00906 realnum abundance )
00907 {
00908
00909
00910 static double **AulEscp ,
00911 **col_str ,
00912 **AulDest,
00913
00914 **AulPump,
00915 **CollRate_levn,
00916 *pops,
00917 *create,
00918 *destroy,
00919 *depart,
00920
00921 *stat_levn ,
00922
00923 *excit;
00924 bool lgDoAs;
00925 static long int levelAsEval=-1;
00926 long int ip;
00927 static bool lgFirst=true;
00928 long int i,
00929 j,
00930 ilo ,
00931 ihi,
00932 iElec,
00933 iElecHi,
00934 iVib,
00935 iRot,
00936 iVibHi,
00937 iRotHi;
00938 int nNegPop;
00939 bool lgDeBug,
00940 lgZeroPop;
00941 double rot_cooling , dCoolDT;
00942 static long int ndimMalloced = 0;
00943 double rateout , ratein;
00944
00945 DEBUG_ENTRY( "H2_Level_low_matrix()" );
00946
00947
00948 if( nXLevelsMatrix <= 1 )
00949 {
00950 return;
00951 }
00952
00953 if( lgFirst )
00954 {
00955
00956 if( nXLevelsMatrix > nLevels_per_elec[0] )
00957 {
00958
00959 fprintf( ioQQQ,
00960 " The total number of levels used in the matrix solver must be <= %li, the number of levels within X.\n Sorry.\n",
00961 nLevels_per_elec[0]);
00962 cdEXIT(EXIT_FAILURE);
00963 }
00964
00965 lgFirst = false;
00966
00967
00968
00969 ndimMalloced = nLevels_per_elec[0];
00970
00971 excit = (double *)MALLOC( sizeof(double)*(size_t)(ndimMalloced) );
00972 stat_levn = (double *)MALLOC( sizeof(double)*(size_t)(ndimMalloced) );
00973 pops = (double *)MALLOC( sizeof(double)*(size_t)(ndimMalloced) );
00974 create = (double *)MALLOC( sizeof(double)*(size_t)(ndimMalloced) );
00975 destroy = (double *)MALLOC( sizeof(double)*(size_t)(ndimMalloced) );
00976 depart = (double *)MALLOC( sizeof(double)*(size_t)(ndimMalloced) );
00977
00978 AulPump = ((double **)MALLOC((size_t)(ndimMalloced)*sizeof(double *)));
00979 CollRate_levn = ((double **)MALLOC((size_t)(ndimMalloced)*sizeof(double *)));
00980 AulDest = ((double **)MALLOC((size_t)(ndimMalloced)*sizeof(double *)));
00981 AulEscp = ((double **)MALLOC((size_t)(ndimMalloced)*sizeof(double *)));
00982 col_str = ((double **)MALLOC((size_t)(ndimMalloced)*sizeof(double *)));
00983 for( i=0; i<(ndimMalloced); ++i )
00984 {
00985 AulPump[i] = ((double *)MALLOC((size_t)(ndimMalloced)*sizeof(double )));
00986 CollRate_levn[i] = ((double *)MALLOC((size_t)(ndimMalloced)*sizeof(double )));
00987 AulDest[i] = ((double *)MALLOC((size_t)(ndimMalloced)*sizeof(double )));
00988 AulEscp[i] = ((double *)MALLOC((size_t)(ndimMalloced)*sizeof(double )));
00989 col_str[i] = ((double *)MALLOC((size_t)(ndimMalloced)*sizeof(double )));
00990 }
00991
00992 for( j=0; j < ndimMalloced; j++ )
00993 {
00994 stat_levn[j]=0;
00995 excit[j] =0;
00996 }
00997
00998
00999 for( j=0; j < ndimMalloced; j++ )
01000 {
01001
01002 ip = H2_ipX_ener_sort[j];
01003 iVib = ipVib_H2_energy_sort[ip];
01004 iRot = ipRot_H2_energy_sort[ip];
01005
01006
01007 stat_levn[j] = H2_stat[0][iVib][iRot];
01008
01009 excit[j] = energy_wn[0][iVib][iRot]*T1CM;
01010 }
01011
01012 for( j=0; j < ndimMalloced-1; j++ )
01013 {
01014
01015 ASSERT( excit[j+1] > excit[j] );
01016 }
01017 }
01018
01019
01020
01021
01022 if( nXLevelsMatrix > ndimMalloced )
01023 {
01024 fprintf(ioQQQ," H2_Level_low_matrix has been called with the number of rotor levels greater than space allocated.\n");
01025 cdEXIT(EXIT_FAILURE);
01026 }
01027
01028
01029 for( i=0; i < nXLevelsMatrix; i++ )
01030 {
01031 pops[i] = 0.;
01032 depart[i] = 0;
01033 for( j=0; j < nXLevelsMatrix; j++ )
01034 {
01035 col_str[j][i] = 0.;
01036 }
01037 }
01038
01039
01040 if( nzone!=nzoneAsEval || iteration!=iterationAsEval || nXLevelsMatrix!=levelAsEval)
01041 {
01042 lgDoAs = true;
01043 nzoneAsEval = nzone;
01044 iterationAsEval = iteration;
01045 levelAsEval = nXLevelsMatrix;
01046 ASSERT( levelAsEval <= ndimMalloced );
01047 }
01048 else
01049 {
01050 lgDoAs = false;
01051 }
01052
01053
01054 if( lgDoAs )
01055 {
01056 for( i=0; i < nXLevelsMatrix; i++ )
01057 {
01058 pops[i] = 0.;
01059 depart[i] = 0;
01060 for( j=0; j < nXLevelsMatrix; j++ )
01061 {
01062 AulEscp[j][i] = 0.;
01063 AulDest[j][i] = 0.;
01064 AulPump[j][i] = 0.;
01065 CollRate_levn[j][i] = 0.;
01066 }
01067 }
01068 }
01069
01070
01071
01072 iElec = 0;
01073 for( ilo=0; ilo < nXLevelsMatrix; ilo++ )
01074 {
01075 ip = H2_ipX_ener_sort[ilo];
01076 iRot = ipRot_H2_energy_sort[ip];
01077 iVib = ipVib_H2_energy_sort[ip];
01078
01079
01080
01081
01082
01083 destroy[ilo] = H2_X_sink[ilo];
01084
01085
01086 create[ilo] = H2_X_source[ilo];
01087
01088
01089
01090 if( lgDoAs )
01091 {
01092 for( ihi=ilo+1; ihi<nXLevelsMatrix; ++ihi )
01093 {
01094 ip = H2_ipX_ener_sort[ihi];
01095 iRotHi = ipRot_H2_energy_sort[ip];
01096 iVibHi = ipVib_H2_energy_sort[ip];
01097 ASSERT( H2_energies[ip] <= H2_energies[H2_ipX_ener_sort[nXLevelsMatrix-1]] );
01098
01099 if( (abs(iRotHi-iRot)==2 || (iRotHi-iRot)==0 ) && (iVib<=iVibHi) )
01100 {
01101
01102 if( lgH2_line_exists[0][iVibHi][iRotHi][0][iVib][iRot] )
01103 {
01104 ASSERT( H2Lines[0][iVibHi][iRotHi][0][iVib][iRot].ipCont > 0 );
01105
01106
01107
01108
01109
01110
01111 AulEscp[ihi][ilo] = H2Lines[0][iVibHi][iRotHi][0][iVib][iRot].Emis->Aul*(
01112 H2Lines[0][iVibHi][iRotHi][0][iVib][iRot].Emis->Pesc +
01113 H2Lines[0][iVibHi][iRotHi][0][iVib][iRot].Emis->Pdest +
01114 H2Lines[0][iVibHi][iRotHi][0][iVib][iRot].Emis->Pelec_esc);
01115 AulDest[ilo][ihi] = 0.;
01116 AulPump[ilo][ihi] = H2Lines[0][iVibHi][iRotHi][0][iVib][iRot].Emis->pump;
01117 }
01118 }
01119 }
01120 }
01121
01122 iElecHi = 0;
01123 iElec = 0;
01124 rateout = 0.;
01125 ratein = 0.;
01126
01127
01128 for( ihi=nXLevelsMatrix; ihi<nLevels_per_elec[0]; ++ihi )
01129 {
01130 ip = H2_ipX_ener_sort[ihi];
01131 iRotHi = ipRot_H2_energy_sort[ip];
01132 iVibHi = ipVib_H2_energy_sort[ip];
01133 if( (abs(iRotHi-iRot)==2 || (iRotHi-iRot)==0 ) && (iVib<=iVibHi) )
01134 {
01135 if( lgH2_line_exists[iElecHi][iVibHi][iRotHi][iElec][iVib][iRot] )
01136 {
01137 ASSERT( H2Lines[iElecHi][iVibHi][iRotHi][iElec][iVib][iRot].ipCont > 0 );
01138
01139
01140
01141
01142 ratein +=
01143 H2_populations[iElecHi][iVibHi][iRotHi] *
01144 (H2Lines[iElecHi][iVibHi][iRotHi][iElec][iVib][iRot].Emis->Aul*
01145 (H2Lines[iElecHi][iVibHi][iRotHi][iElec][iVib][iRot].Emis->Pesc +
01146 H2Lines[iElecHi][iVibHi][iRotHi][iElec][iVib][iRot].Emis->Pelec_esc +
01147 H2Lines[iElecHi][iVibHi][iRotHi][iElec][iVib][iRot].Emis->Pdest)+H2Lines[iElecHi][iVibHi][iRotHi][iElec][iVib][iRot].Emis->pump *
01148 H2Lines[iElecHi][iVibHi][iRotHi][iElec][iVib][iRot].Lo->g/
01149 H2Lines[iElecHi][iVibHi][iRotHi][iElec][iVib][iRot].Hi->g);
01150
01151 rateout +=
01152 H2Lines[iElecHi][iVibHi][iRotHi][iElec][iVib][iRot].Emis->pump;
01153 }
01154 }
01155 }
01156
01157
01158 create[ilo] += ratein;
01159
01160
01161 destroy[ilo] += rateout;
01162
01163
01164
01165 create[ilo] += H2_X_rate_from_elec_excited[iVib][iRot];
01166
01167
01168 destroy[ilo] += H2_X_rate_to_elec_excited[iVib][iRot];
01169 }
01170
01171
01172 if( mole.nH2_TRACE >= mole.nH2_trace_matrix )
01173 lgDeBug = true;
01174 else
01175 lgDeBug = false;
01176
01177
01178 for( ilo=0; ilo < nXLevelsMatrix; ilo++ )
01179 {
01180 ip = H2_ipX_ener_sort[ilo];
01181 iRot = ipRot_H2_energy_sort[ip];
01182 iVib = ipVib_H2_energy_sort[ip];
01183 if( lgDoAs )
01184 {
01185 if(lgDeBug)fprintf(ioQQQ,"DEBUG H2_Level_low_matrix, ilo=%li",ilo);
01186 for( ihi=ilo+1; ihi < nXLevelsMatrix; ihi++ )
01187 {
01188 ip = H2_ipX_ener_sort[ihi];
01189 iRotHi = ipRot_H2_energy_sort[ip];
01190 iVibHi = ipVib_H2_energy_sort[ip];
01191
01192 CollRate_levn[ihi][ilo] = H2_X_coll_rate[ihi][ilo];
01193
01194
01195 if(lgDeBug)fprintf(ioQQQ,"\t%.1e",CollRate_levn[ihi][ilo]);
01196
01197
01198 CollRate_levn[ilo][ihi] = CollRate_levn[ihi][ilo]*
01199 H2_Boltzmann[0][iVibHi][iRotHi]/SDIV(H2_Boltzmann[0][iVib][iRot])*
01200 H2_stat[0][iVibHi][iRotHi] /
01201 H2_stat[0][iVib][iRot];
01202 }
01203 }
01204
01205 if(lgDeBug)fprintf(ioQQQ,"\n");
01206
01207
01208
01209 iElecHi = 0;
01210
01211 for( ihi=nXLevelsMatrix; ihi<nLevels_per_elec[0]; ++ihi )
01212 {
01213 ip = H2_ipX_ener_sort[ihi];
01214 iRotHi = ipRot_H2_energy_sort[ip];
01215 iVibHi = ipVib_H2_energy_sort[ip];
01216 rateout = 0;
01217
01218
01219
01220 ratein = H2_X_coll_rate[ihi][ilo];
01221 if(lgDeBug)fprintf(ioQQQ,"\t%.1e",ratein);
01222
01223
01224 rateout = ratein *
01225 H2_Boltzmann[0][iVibHi][iRotHi]/SDIV(H2_Boltzmann[0][iVib][iRot])*
01226 H2_stat[0][iVibHi][iRotHi]/H2_stat[0][iVib][iRot];
01227
01228
01229 create[ilo] += ratein*H2_populations[iElecHi][iVibHi][iRotHi];
01230 destroy[ilo] += rateout;
01231 }
01232 }
01233
01234
01235
01236
01237 if( lgDoAs )
01238 {
01239 for( ihi=2; ihi < nXLevelsMatrix; ihi++ )
01240 {
01241
01242 ip = H2_ipX_ener_sort[ihi];
01243 iVibHi = ipVib_H2_energy_sort[ip];
01244 iRotHi = ipRot_H2_energy_sort[ip];
01245
01246
01247
01248
01249
01250 CollRate_levn[ihi][H2_lgOrtho[0][iVibHi][iRotHi]] += hmi.rate_grain_h2_op_conserve;
01251 }
01252
01253
01254
01255 CollRate_levn[1][0] +=
01256 (realnum)(hmi.rate_grain_h2_J1_to_J0);
01257 }
01258
01259
01260 for( ihi=nXLevelsMatrix; ihi<nLevels_per_elec[0]; ++ihi )
01261 {
01262 ip = H2_ipX_ener_sort[ihi];
01263 iVibHi = ipVib_H2_energy_sort[ip];
01264 iRotHi = ipRot_H2_energy_sort[ip];
01265
01266
01267
01268 create[H2_lgOrtho[0][iVibHi][iRotHi]] += H2_populations[0][iVibHi][iRotHi]*hmi.rate_grain_h2_op_conserve;
01269 }
01270
01271
01272 {
01273 enum {DEBUG_LOC=false};
01274 if( DEBUG_LOC || lgDeBug)
01275 {
01276 fprintf(ioQQQ,"DEBUG H2 matexcit");
01277 for(ilo=0; ilo<nXLevelsMatrix; ++ilo )
01278 {
01279 fprintf(ioQQQ,"\t%li",ilo );
01280 }
01281 fprintf(ioQQQ,"\n");
01282 for(ihi=0; ihi<nXLevelsMatrix;++ihi)
01283 {
01284 fprintf(ioQQQ,"\t%.2e",excit[ihi] );
01285 }
01286 fprintf(ioQQQ,"\n");
01287 for(ihi=0; ihi<nXLevelsMatrix;++ihi)
01288 {
01289 fprintf(ioQQQ,"\t%.2e",stat_levn[ihi] );
01290 }
01291 fprintf(ioQQQ,"\n");
01292
01293 fprintf(ioQQQ,"AulEscp[n][]\\[][n] = Aul*Pesc\n");
01294 for(ilo=0; ilo<nXLevelsMatrix; ++ilo )
01295 {
01296 fprintf(ioQQQ,"\t%li",ilo );
01297 }
01298 fprintf(ioQQQ,"\n");
01299 for(ihi=0; ihi<nXLevelsMatrix;++ihi)
01300 {
01301 fprintf(ioQQQ,"%li", ihi);
01302 for(ilo=0; ilo<nXLevelsMatrix; ++ilo )
01303 {
01304 fprintf(ioQQQ,"\t%.2e",AulEscp[ilo][ihi] );
01305 }
01306 fprintf(ioQQQ,"\n");
01307 }
01308
01309 fprintf(ioQQQ,"AulPump [n][]\\[][n]\n");
01310 for(ilo=0; ilo<nXLevelsMatrix; ++ilo )
01311 {
01312 fprintf(ioQQQ,"\t%li",ilo );
01313 }
01314 fprintf(ioQQQ,"\n");
01315 for(ihi=0; ihi<nXLevelsMatrix;++ihi)
01316 {
01317 fprintf(ioQQQ,"%li", ihi);
01318 for(ilo=0; ilo<nXLevelsMatrix; ++ilo )
01319 {
01320 fprintf(ioQQQ,"\t%.2e",AulPump[ihi][ilo] );
01321 }
01322 fprintf(ioQQQ,"\n");
01323 }
01324
01325 fprintf(ioQQQ,"CollRate_levn [n][]\\[][n]\n");
01326 for(ilo=0; ilo<nXLevelsMatrix; ++ilo )
01327 {
01328 fprintf(ioQQQ,"\t%li",ilo );
01329 }
01330 fprintf(ioQQQ,"\n");
01331 for(ihi=0; ihi<nXLevelsMatrix;++ihi)
01332 {
01333 fprintf(ioQQQ,"%li", ihi);
01334 for(ilo=0; ilo<nXLevelsMatrix; ++ilo )
01335 {
01336 fprintf(ioQQQ,"\t%.2e",CollRate_levn[ihi][ilo] );
01337 }
01338 fprintf(ioQQQ,"\n");
01339 }
01340 fprintf(ioQQQ,"SOURCE");
01341 for(ihi=0; ihi<nXLevelsMatrix;++ihi)
01342 {
01343 fprintf(ioQQQ,"\t%.2e",create[ihi]);
01344 }
01345 fprintf(ioQQQ,"\nSINK");
01346 for(ihi=0; ihi<nXLevelsMatrix;++ihi)
01347 {
01348 fprintf(ioQQQ,"\t%.2e",destroy[ihi]);
01349 }
01350 fprintf(ioQQQ,"\n");
01351 }
01352 }
01353
01354 atom_levelN(
01355
01356 nXLevelsMatrix,
01357 abundance,
01358 stat_levn,
01359 excit,
01360 'K',
01361 pops,
01362 depart,
01363
01364 &AulEscp,
01365
01366 &col_str,
01367 &AulDest,
01368 &AulPump,
01369 &CollRate_levn,
01370 create,
01371 destroy,
01372
01373 true,
01374 &rot_cooling,
01375 &dCoolDT,
01376 " H2 ",
01377
01378 &nNegPop,
01379 &lgZeroPop,
01380 lgDeBug );
01381
01382 for( i=0; i< nXLevelsMatrix; ++i )
01383 {
01384 ip = H2_ipX_ener_sort[i];
01385 iRot = ipRot_H2_energy_sort[ip];
01386 iVib = ipVib_H2_energy_sort[ip];
01387
01388
01389
01390
01391 H2_populations[0][iVib][iRot] = pops[i];
01392 }
01393
01394 if( 0 && mole.nH2_TRACE >= mole.nH2_trace_full)
01395 {
01396
01397
01398 fprintf(ioQQQ,"\n DEBUG H2_Level_lowJ hmi.H2_total: %.3e matrix rel pops\n",hmi.H2_total);
01399 fprintf(ioQQQ,"v\tJ\tpop\n");
01400 for( i=0; i<nXLevelsMatrix; ++i )
01401 {
01402 ip = H2_ipX_ener_sort[i];
01403 iRot = ipRot_H2_energy_sort[ip];
01404 iVib = ipVib_H2_energy_sort[ip];
01405 fprintf(ioQQQ,"%3li\t%3li\t%.3e\t%.3e\t%.3e\n",
01406 iVib , iRot , H2_populations[0][iVib][iRot]/hmi.H2_total , create[i] , destroy[i]);
01407 }
01408 }
01409
01410
01411 if( nNegPop > 0 )
01412 {
01413 fprintf(ioQQQ," H2_Level_low_matrix called atom_levelN which returned negative H2_populations.\n");
01414 ConvFail( "pops" , "H2" );
01415 }
01416 return;
01417 }
01418
01419
01420 void H2_LevelPops( void )
01421 {
01422 static double TeUsedColl=-1.f;
01423 double H2_renorm_conserve=0.,
01424 H2_renorm_conserve_init=0. ,
01425 sumold,
01426 H2_BigH2_H2s,
01427 H2_BigH2_H2g;
01428 double old_solomon_rate=-1.;
01429 long int iElecHi , iElecLo , iVibHi , iVibLo , iRotHi , iRotLo;
01430 long int i;
01431 long int n_pop_oscil = 0;
01432 int kase=0;
01433 bool lgConv_h2_soln,
01434 lgPopsConv_total,
01435 lgPopsConv_relative,
01436 lgHeatConv,
01437 lgSolomonConv,
01438 lgOrthoParaRatioConv;
01439 double quant_old=-1.,
01440 quant_new=-1.;
01441
01442 bool lgH2_pops_oscil=false,
01443 lgH2_pops_ever_oscil=false;
01444 long int nEner,
01445 ipHi, ipLo;
01446 long int iElec , iVib , iRot,ip;
01447 double sum_pops_matrix;
01448 realnum collup;
01449
01450 static double ortho_para_old=0. , ortho_para_older=0. , ortho_para_current=0.;
01451 realnum frac_new_oscil=1.f;
01452
01453
01454 double PopChgMax_relative=0. , PopChgMaxOld_relative=0., PopChgMax_total=0., PopChgMaxOld_total=0.;
01455 long int iRotMaxChng_relative , iVibMaxChng_relative,
01456 iRotMaxChng_total , iVibMaxChng_total,
01457 nXLevelsMatrix_save;
01458 double popold_relative , popnew_relative , popold_total , popnew_total;
01459
01460 char chReason[100];
01461
01462 double flux_accum_photodissoc_BigH2_H2g, flux_accum_photodissoc_BigH2_H2s;
01463 long int ip_H2_level;
01464
01465
01466 double converge_pops_relative=0.1 ,
01467 converge_pops_total=1e-3,
01468 converge_ortho_para=1e-2;
01469
01470
01471
01472 if( !h2.lgH2ON || lgAbort )
01473 return;
01474
01475 DEBUG_ENTRY( "H2_LevelPops()" );
01476
01477 if(mole.nH2_TRACE >= mole.nH2_trace_full )
01478 {
01479 fprintf(ioQQQ,
01480 "\n***************H2_LevelPops call %li this iteration, zone is %.2f, H2/H:%.e Te:%e ne:%e\n",
01481 nCallH2_this_iteration,
01482 fnzone,
01483 hmi.H2_total/dense.gas_phase[ipHYDROGEN],
01484 phycon.te,
01485 dense.eden
01486 );
01487 }
01488 else if( mole.nH2_TRACE >= mole.nH2_trace_final )
01489 {
01490 static long int nzone_prt=-1;
01491 if( nzone!=nzone_prt )
01492 {
01493 nzone_prt = nzone;
01494 fprintf(ioQQQ,"DEBUG zone %li H2/H:%.3e Te:%.3e *ne:%.3e n(H2):%.3e\n",
01495 nzone,
01496 hmi.H2_total / dense.gas_phase[ipHYDROGEN],
01497 phycon.te,
01498 dense.eden,
01499 hmi.H2_total );
01500 }
01501 }
01502
01503
01504
01505 mole_H2_LTE();
01506
01507
01508
01509
01510 if( (!hmi.lgBigH2_evaluated && hmi.H2_total/dense.gas_phase[ipHYDROGEN] < mole.H2_to_H_limit )
01511 || hmi.H2_total < 1e-20 )
01512 {
01513
01514 if( mole.nH2_TRACE >= mole.nH2_trace_full )
01515 fprintf(ioQQQ,
01516 " H2_LevelPops pops too small, not computing, set to LTE and return, H2/H is %.2e and mole.H2_to_H_limit is %.2e.",
01517 hmi.H2_total/dense.gas_phase[ipHYDROGEN] ,
01518 mole.H2_to_H_limit);
01519 H2_zero_pops_too_low();
01520
01521 return;
01522 }
01523
01524
01525
01526
01527
01528
01529
01530 hmi.lgBigH2_evaluated = true;
01531
01532
01533
01534
01535
01536 nXLevelsMatrix_save = nXLevelsMatrix;
01537 if( conv.lgSearch )
01538 {
01539 nXLevelsMatrix = nLevels_per_elec[0];
01540 }
01541
01542
01543
01544
01545
01546
01547
01548
01549 if( fabs(1. - TeUsedColl / phycon.te ) > 0.005 )
01550 {
01551 H2_CollidRateEvalAll();
01552 TeUsedColl = phycon.te;
01553 }
01554
01555
01556
01557
01558 if( nCallH2_this_iteration==0 || mole.lgH2_LTE )
01559 {
01560
01561 if(mole.nH2_TRACE >= mole.nH2_trace_full )
01562 fprintf(ioQQQ,"H2 1st call - using LTE level pops\n");
01563
01564 for( iElec=0; iElec<mole.n_h2_elec_states; ++iElec )
01565 {
01566 pops_per_elec[iElec] = 0.;
01567 for( iVib=0; iVib<=h2.nVib_hi[iElec]; ++iVib )
01568 {
01569 pops_per_vib[iElec][iVib] = 0.;
01570 for( iRot=h2.Jlowest[iElec]; iRot<=h2.nRot_hi[iElec][iVib]; ++iRot )
01571 {
01572
01573
01574 H2_old_populations[iElec][iVib][iRot] =
01575 (realnum)H2_populations_LTE[iElec][iVib][iRot]*hmi.H2_total;
01576 H2_populations[iElec][iVib][iRot] = H2_old_populations[iElec][iVib][iRot];
01577 }
01578 }
01579 }
01580
01581 h2.ortho_density = 0.75*hmi.H2_total;
01582 h2.para_density = 0.25*hmi.H2_total;
01583 ortho_para_current = h2.ortho_density / SDIV( h2.para_density );
01584 ortho_para_older = ortho_para_current;
01585 ortho_para_old = ortho_para_current;
01586
01587 frac_matrix = 1.;
01588 }
01589
01590
01591 iElec = 0;
01592 pops_per_elec[0] = 0.;
01593 for( iVib=0; iVib<=h2.nVib_hi[iElec]; ++iVib )
01594 {
01595 pops_per_vib[0][iVib] = 0.;
01596 for( iRot=h2.Jlowest[iElec]; iRot<=h2.nRot_hi[iElec][iVib]; ++iRot )
01597 {
01598 pops_per_elec[0] += H2_populations[iElec][iVib][iRot];
01599 pops_per_vib[0][iVib] += H2_populations[iElec][iVib][iRot];
01600 }
01601 }
01602 ASSERT( pops_per_elec[0]>SMALLFLOAT );
01603
01604
01605
01606
01607 H2_renorm_chemistry = hmi.H2_total/ SDIV(pops_per_elec[0]);
01608
01609
01610
01611 iElec = 0;
01612 hmi.H2_chem_BigH2_H2g = 0.;
01613 hmi.H2_chem_BigH2_H2s = 0.;
01614 for( iVib=0; iVib<=h2.nVib_hi[iElec]; ++iVib )
01615 {
01616 for( iRot=h2.Jlowest[iElec]; iRot<=h2.nRot_hi[iElec][iVib]; ++iRot )
01617 {
01618 if( energy_wn[0][iVib][iRot] > ENERGY_H2_STAR )
01619 {
01620 hmi.H2_chem_BigH2_H2s += H2_populations[iElec][iVib][iRot];
01621
01622 }
01623 else
01624 {
01625 hmi.H2_chem_BigH2_H2g += H2_populations[iElec][iVib][iRot];
01626
01627 }
01628 }
01629 }
01630
01631 hmi.H2_chem_BigH2_H2g = hmi.Hmolec[ipMH2g]/SDIV(hmi.H2_chem_BigH2_H2g);
01632 hmi.H2_chem_BigH2_H2s = hmi.Hmolec[ipMH2s]/SDIV(hmi.H2_chem_BigH2_H2s);
01633
01634
01635 if(mole.nH2_TRACE >= mole.nH2_trace_full)
01636 fprintf(ioQQQ,
01637 "H2 H2_renorm_chemistry is %.4e, hmi.H2_total is %.4e pops_per_elec[0] is %.4e\n",
01638 H2_renorm_chemistry ,
01639 hmi.H2_total,
01640 pops_per_elec[0]);
01641
01642
01643 iElec = 0;
01644 for( iVib=0; iVib<=h2.nVib_hi[iElec]; ++iVib )
01645 {
01646 for( iRot=h2.Jlowest[iElec]; iRot<=h2.nRot_hi[iElec][iVib]; ++iRot )
01647 {
01648 H2_populations[iElec][iVib][iRot] *= H2_renorm_chemistry;
01649 H2_old_populations[iElec][iVib][iRot] = H2_populations[iElec][iVib][iRot];
01650 }
01651 }
01652 ASSERT( fabs(h2.ortho_density+h2.para_density-hmi.H2_total)/hmi.H2_total < 0.001 );
01653
01654 if(mole.nH2_TRACE >= mole.nH2_trace_full )
01655 fprintf(ioQQQ,
01656 " H2 entry, old pops sumed to %.3e, renorm to htwo den of %.3e\n",
01657 pops_per_elec[0],
01658 hmi.H2_total);
01659
01660
01661 if( conv.lgSearch )
01662 {
01663 converge_pops_relative *= 2.;
01664 converge_pops_total *= 3.;
01665 converge_ortho_para *= 3.;
01666 }
01667
01668
01669 mole_H2_form();
01670
01671
01672 H2_X_coll_rate_evaluate();
01673
01674
01675
01676 lgConv_h2_soln = false;
01677
01678 loop_h2_pops = 0;
01679 {
01680 static long int nzoneEval=-1;
01681 if( nzone != nzoneEval )
01682 {
01683 nzoneEval = nzone;
01684
01685 ++nH2_zone;
01686 }
01687 }
01688
01689
01690
01691
01692
01693
01694
01695 while( loop_h2_pops < LIM_H2_POP_LOOP-n_pop_oscil && !lgConv_h2_soln && !mole.lgH2_LTE )
01696 {
01697 double rate_in , rate_out;
01698 static double old_HeatH2Dexc_BigH2=0., HeatChangeOld=0. , HeatChange=0.;
01699
01700
01701 ++loop_h2_pops;
01702
01703 ++nH2_pops;
01704
01705
01706
01707
01708 hmi.H2_H2g_to_H2s_rate_BigH2 = 0.;
01709
01710 rate_out = 0.;
01711
01712
01713 iElec = 0;
01714 for( iVib=0; iVib<=h2.nVib_hi[iElec]; ++iVib )
01715 {
01716 for( iRot=h2.Jlowest[iElec]; iRot<=h2.nRot_hi[iElec][iVib]; ++iRot )
01717 {
01718
01719 H2_X_rate_from_elec_excited[iVib][iRot] = 0.;
01720
01721 H2_X_rate_to_elec_excited[iVib][iRot] = 0.;
01722 }
01723 }
01724
01725 iElecHi = -INT32_MAX;
01726
01727 for( iElecHi=1; iElecHi<mole.n_h2_elec_states; ++iElecHi )
01728 {
01729
01730
01731 iVib = -INT32_MAX;
01732 iRot = -INT32_MAX;
01733 iVibLo = -INT32_MAX;
01734 iRotLo = -INT32_MAX;
01735 iVibHi = -INT32_MAX;
01736 iRotHi = -INT32_MAX;
01737
01738
01739 pops_per_elec[iElecHi] = 0.;
01740
01741 if(mole.nH2_TRACE >= mole.nH2_trace_full)
01742 fprintf(ioQQQ," Pop(e=%li):",iElecHi);
01743
01744 double factor = ( hmi.lgLeidenCRHack ) ? secondaries.x12tot/6.e-17 : 0.;
01745
01746
01747 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
01748 {
01749 pops_per_vib[iElecHi][iVibHi] = 0.;
01750
01751 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
01752 {
01753
01754
01755
01756 rate_in = 0.;
01757
01758
01759
01760 rate_out = H2_dissprob[iElecHi][iVibHi][iRotHi];
01761
01762 realnum H2gHi = H2Lines[iElecHi][iVibHi][iRotHi][0][0][0].Hi->g;
01763
01764
01765 iElecLo=0;
01766
01767 for( iVibLo=0; iVibLo<=h2.nVib_hi[iElecLo]; ++iVibLo )
01768 {
01769 mb6ci lgH2le = lgH2_line_exists.ptr(iElecHi,iVibHi,iRotHi,iElecLo,iVibLo,h2.Jlowest[iElecLo]);
01770 mt6ci H2L = H2Lines.ptr(iElecHi,iVibHi,iRotHi,iElecLo,iVibLo,h2.Jlowest[iElecLo]);
01771 long nr = h2.nRot_hi[iElecLo][iVibLo];
01772 for( iRotLo=h2.Jlowest[iElecLo]; iRotLo<=nr; ++iRotLo )
01773 {
01774
01775 if( *lgH2le++ )
01776 {
01777 ASSERT( H2L->ipCont > 0 );
01778
01779
01780
01781
01782
01783 double cr_cross_section = H2L->Coll.cs;
01784 # if 0
01785
01786 cr_cross_section =
01787 pow(H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].WLAng*1e-8,3)*
01788 (H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].Hi->g/
01789 H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].Lo->g)*
01790 H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].Aul*
01791 log(3.)*HPLANCK/(160.f*pow(PI,3)*0.5*1e-8*1.6e-12);
01792 ASSERT( fabs(cr_cross_section-H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].cs)/
01793 SDIV(cr_cross_section) < 1e-7 );
01794 # endif
01795
01796
01797
01798
01799 double rate_one = H2L->Emis->pump
01800
01801
01802
01803
01804
01805
01806
01807 +factor*cr_cross_section;
01808
01809
01810 ASSERT( H2_lgOrtho[iElecHi][iVibHi][iRotHi] == H2_lgOrtho[iElecLo][iVibLo][iRotLo] );
01811
01812
01813 rate_in += H2_old_populations[iElecLo][iVibLo][iRotLo]*rate_one;
01814
01815
01816
01817
01818
01819
01820 H2_X_rate_to_elec_excited[iVibLo][iRotLo] += rate_one;
01821
01822
01823
01824
01825
01826
01827 rate_one = H2L->Emis->Aul*
01828
01829 (H2L->Emis->Pesc +
01830 H2L->Emis->Pelec_esc +
01831 H2L->Emis->Pdest) +
01832
01833 H2L->Emis->pump *
01834 H2L->Lo->g/H2gHi;
01835
01836
01837
01838 rate_out += rate_one;
01839
01840 ASSERT( rate_in >= 0. && rate_out >= 0. );
01841 }
01842 ++H2L;
01843 }
01844 }
01845
01846
01847
01848
01849
01850 H2_rad_rate_out[iElecHi][iVibHi][iRotHi] = rate_out;
01851 double H2popHi = rate_in / SDIV( rate_out );
01852 H2_populations[iElecHi][iVibHi][iRotHi] = H2popHi;
01853 if( H2_old_populations[iElecHi][iVibHi][iRotHi]==0. )
01854 H2_old_populations[iElecHi][iVibHi][iRotHi] = H2popHi;
01855
01856
01857
01858 iElecLo=0;
01859 for( iVibLo=0; iVibLo<=h2.nVib_hi[iElecLo]; ++iVibLo )
01860 {
01861 mb6ci lgH2le = lgH2_line_exists.ptr(iElecHi,iVibHi,iRotHi,iElecLo,iVibLo,h2.Jlowest[iElecLo]);
01862 mt6ci H2L = H2Lines.ptr(iElecHi,iVibHi,iRotHi,iElecLo,iVibLo,h2.Jlowest[iElecLo]);
01863
01864 long nr = h2.nRot_hi[iElecLo][iVibLo];
01865 for( iRotLo=h2.Jlowest[iElecLo]; iRotLo<=nr; ++iRotLo )
01866 {
01867 if( *lgH2le++ )
01868 {
01869 ASSERT( H2L->ipCont > 0 );
01870
01871 double rate_one =
01872
01873
01874 H2popHi*
01875 (H2L->Emis->Aul*
01876
01877 (H2L->Emis->Pesc + H2L->Emis->Pelec_esc + H2L->Emis->Pdest) +
01878
01879 H2L->Emis->pump * H2L->Lo->g/H2gHi);
01880
01881
01882 H2_X_rate_from_elec_excited[iVibLo][iRotLo] += rate_one;
01883 }
01884 ++H2L;
01885 }
01886 }
01887
01888 ASSERT( H2popHi >= 0. && H2popHi <= hmi.H2_total );
01889
01890
01891 pops_per_vib[iElecHi][iVibHi] += H2popHi;
01892
01893
01894 }
01895
01896 if(mole.nH2_TRACE >= mole.nH2_trace_full)
01897 fprintf(ioQQQ,"\t%.2e",pops_per_vib[iElecHi][iVibHi]/hmi.H2_total);
01898
01899
01900 pops_per_elec[iElecHi] += pops_per_vib[iElecHi][iVibHi];
01901 }
01902
01903
01904 if(mole.nH2_TRACE >= mole.nH2_trace_full)
01905 fprintf(ioQQQ,"\n");
01906 }
01907
01908
01909
01910
01911
01912
01913 PopChgMaxOld_relative = PopChgMax_relative;
01914 PopChgMaxOld_total = PopChgMax_total;
01915 PopChgMax_relative = 0.;
01916 PopChgMax_total = 0.;
01917 iElec = 0;
01918 iElecHi = 0;
01919 iRotMaxChng_relative =-1;
01920 iVibMaxChng_relative = -1;
01921 iRotMaxChng_total =-1;
01922 iVibMaxChng_total = -1;
01923 popold_relative = 0.;
01924 popnew_relative = 0.;
01925 popold_total = 0.;
01926 popnew_total = 0.;
01927
01928
01929 for( nEner=0; nEner<nLevels_per_elec[0]; ++nEner )
01930 {
01931
01932 ip = H2_ipX_ener_sort[nEner];
01933 iVib = ipVib_H2_energy_sort[ip];
01934 iRot = ipRot_H2_energy_sort[ip];
01935
01936 realnum H2stat = H2_stat[0][iVib][iRot];
01937 double H2boltz = H2_Boltzmann[0][iVib][iRot];
01938
01939
01940 double col_rate_in = 0.;
01941 double col_rate_out = 0.;
01942 for( ipLo=0; ipLo<nEner; ++ipLo )
01943 {
01944 ip = H2_ipX_ener_sort[ipLo];
01945 iVibLo = ipVib_H2_energy_sort[ip];
01946 iRotLo = ipRot_H2_energy_sort[ip];
01947
01948
01949 col_rate_out += H2_X_coll_rate[nEner][ipLo];
01950
01951
01952
01953 collup = (realnum)(H2_old_populations[0][iVibLo][iRotLo] * H2_X_coll_rate[nEner][ipLo] *
01954 H2stat / H2_stat[0][iVibLo][iRotLo] *
01955 H2boltz / SDIV( H2_Boltzmann[0][iVibLo][iRotLo] ) );
01956
01957 col_rate_in += collup;
01958 }
01959
01960 for( ipHi=nEner+1; ipHi<nLevels_per_elec[0]; ++ipHi )
01961 {
01962 double colldn;
01963 ip = H2_ipX_ener_sort[ipHi];
01964 iVibHi = ipVib_H2_energy_sort[ip];
01965 iRotHi = ipRot_H2_energy_sort[ip];
01966
01967
01968 col_rate_out += H2_X_coll_rate[ipHi][nEner] *
01969 H2_stat[0][iVibHi][iRotHi] / H2stat *
01970 (realnum)(H2_Boltzmann[0][iVibHi][iRotHi] / SDIV( H2boltz ) );
01971
01972
01973 colldn = H2_old_populations[0][iVibHi][iRotHi] * H2_X_coll_rate[ipHi][nEner];
01974
01975
01976
01977
01978
01979 col_rate_in += colldn;
01980 }
01981
01982 H2_col_rate_in[iVib][iRot] = col_rate_in;
01983 H2_col_rate_out[iVib][iRot] = col_rate_out;
01984 }
01985
01986
01987
01988
01989
01990
01991
01992
01993 nEner = nLevels_per_elec[0];
01994 while( (--nEner) >= nXLevelsMatrix )
01995 {
01996
01997
01998
01999 ip = H2_ipX_ener_sort[nEner];
02000 iVib = ipVib_H2_energy_sort[ip];
02001 iRot = ipRot_H2_energy_sort[ip];
02002
02003 if( nEner+1 < nLevels_per_elec[0] )
02004 ASSERT( H2_energies[H2_ipX_ener_sort[nEner]] < H2_energies[H2_ipX_ener_sort[nEner+1]] );
02005
02006
02007
02008
02009 if( nEner >1 )
02010 {
02011 H2_col_rate_out[iVib][iRot] +=
02012
02013
02014 (realnum)(hmi.rate_grain_h2_op_conserve);
02015
02016
02017
02018 H2_col_rate_in[0][H2_lgOrtho[0][iVib][iRot]] +=
02019
02020
02021
02022 (realnum)(hmi.rate_grain_h2_op_conserve*H2_old_populations[0][iVib][iRot]);
02023 }
02024 else if( nEner == 1 )
02025 {
02026
02027
02028 H2_col_rate_out[0][1] +=
02029
02030
02031
02032 (realnum)(hmi.rate_grain_h2_J1_to_J0);
02033
02034 H2_col_rate_in[0][0] +=
02035
02036
02037
02038 (realnum)(hmi.rate_grain_h2_J1_to_J0 *H2_old_populations[0][0][1]);
02039 }
02040
02041
02042 H2_rad_rate_in[iVib][iRot] = 0.;
02043 H2_rad_rate_out[0][iVib][iRot] = 0.;
02044
02045
02046
02047
02048
02049 H2_rad_rate_in[iVib][iRot] += H2_X_rate_from_elec_excited[iVib][iRot];
02050
02051
02052 H2_rad_rate_out[0][iVib][iRot] += H2_X_rate_to_elec_excited[iVib][iRot];
02053
02054
02055 iElecHi = 0;
02056 for( ipHi = nEner+1; ipHi<nLevels_per_elec[0]; ++ipHi )
02057 {
02058 ip = H2_ipX_ener_sort[ipHi];
02059 iVibHi = ipVib_H2_energy_sort[ip];
02060 iRotHi = ipRot_H2_energy_sort[ip];
02061
02062
02063
02064
02065
02066 if( ( abs(iRotHi-iRot) ==2 || iRotHi==iRot ) && (iVib <= iVibHi) &&
02067 H2Lines[iElecHi][iVibHi][iRotHi][iElec][iVib][iRot].ipCont > 0 )
02068 {
02069 double rateone;
02070 rateone =
02071 H2_old_populations[iElecHi][iVibHi][iRotHi]*
02072 H2Lines[iElecHi][iVibHi][iRotHi][iElec][iVib][iRot].Emis->Aul*
02073 (H2Lines[iElecHi][iVibHi][iRotHi][iElec][iVib][iRot].Emis->Pesc +
02074 H2Lines[iElecHi][iVibHi][iRotHi][iElec][iVib][iRot].Emis->Pelec_esc +
02075 H2Lines[iElecHi][iVibHi][iRotHi][iElec][iVib][iRot].Emis->Pdest);
02076 ASSERT( rateone >=0 );
02077
02078
02079 H2_rad_rate_in[iVib][iRot] += rateone;
02080 }
02081 }
02082
02083
02084
02085
02086 iElecLo = 0;
02087 for( ipLo = 0; ipLo<nEner; ++ipLo )
02088 {
02089 ip = H2_ipX_ener_sort[ipLo];
02090 iVibLo = ipVib_H2_energy_sort[ip];
02091 iRotLo = ipRot_H2_energy_sort[ip];
02092
02093
02094
02095 if( ( abs(iRotLo-iRot) == 2 || iRotLo == iRot ) && (iVibLo <= iVib) &&
02096 H2Lines[iElec][iVib][iRot][iElecLo][iVibLo][iRotLo].ipCont > 0 )
02097 {
02098 H2_rad_rate_out[0][iVib][iRot] +=
02099 H2Lines[iElec][iVib][iRot][iElecLo][iVibLo][iRotLo].Emis->Aul*
02100 (H2Lines[iElec][iVib][iRot][iElecLo][iVibLo][iRotLo].Emis->Pesc +
02101 H2Lines[iElec][iVib][iRot][iElecLo][iVibLo][iRotLo].Emis->Pelec_esc +
02102 H2Lines[iElec][iVib][iRot][iElecLo][iVibLo][iRotLo].Emis->Pdest);
02103 }
02104 }
02105
02106
02107
02108
02109 H2_populations[iElec][iVib][iRot] =
02110 (H2_col_rate_in[iVib][iRot]+ H2_rad_rate_in[iVib][iRot]+H2_X_source[nEner]) /
02111 SDIV(H2_col_rate_out[iVib][iRot]+H2_rad_rate_out[0][iVib][iRot]+H2_X_sink[nEner]);
02112
02113 ASSERT( H2_populations[iElec][iVib][iRot] >= 0. );
02114 }
02115
02116
02117
02118
02119 if( nXLevelsMatrix )
02120 {
02121 H2_Level_low_matrix(
02122
02123
02124 hmi.H2_total * (realnum)frac_matrix );
02125 }
02126 iElecHi = 0;
02127 if(mole.nH2_TRACE >= mole.nH2_trace_full)
02128 {
02129 fprintf(ioQQQ," Rel pop(e=%li)" ,iElecHi);
02130 }
02131
02132
02133
02134 pops_per_elec[0] = 0.;
02135 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
02136 {
02137 double sumv;
02138 sumv = 0.;
02139 pops_per_vib[0][iVibHi] = 0.;
02140
02141 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
02142 {
02143 pops_per_elec[0] += H2_populations[iElecHi][iVibHi][iRotHi];
02144 sumv += H2_populations[iElecHi][iVibHi][iRotHi];
02145 pops_per_vib[0][iVibHi] += H2_populations[iElecHi][iVibHi][iRotHi];
02146 }
02147
02148 if(mole.nH2_TRACE >= mole.nH2_trace_full)
02149 fprintf(ioQQQ,"\t%.2e",sumv/hmi.H2_total);
02150 }
02151 ASSERT( pops_per_elec[0] > SMALLFLOAT );
02152
02153 if(mole.nH2_TRACE >= mole.nH2_trace_full)
02154 {
02155 fprintf(ioQQQ,"\n");
02156
02157 fprintf(ioQQQ," Rel pop(0,J)");
02158 iElecHi = 0;
02159 iVibHi = 0;
02160 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
02161 {
02162 fprintf(ioQQQ,"\t%.2e",H2_populations[iElecHi][iVibHi][iRotHi]/hmi.H2_total);
02163 }
02164 fprintf(ioQQQ,"\n");
02165 }
02166
02167
02168
02169 iElec = 0;
02170 sum_pops_matrix = 0.;
02171 ip =0;
02172 for( i=0; i<nXLevelsMatrix; ++i )
02173 {
02174 ip = H2_ipX_ener_sort[i];
02175 iVib = ipVib_H2_energy_sort[ip];
02176 iRot = ipRot_H2_energy_sort[ip];
02177 sum_pops_matrix += H2_populations[iElec][iVib][iRot];
02178 }
02179
02180
02181
02182
02183 frac_matrix = sum_pops_matrix / SDIV(pops_per_elec[0]);
02184
02185
02186
02187
02188
02189 H2_renorm_conserve = hmi.H2_total/ SDIV(pops_per_elec[0]);
02190
02191
02192
02193
02194
02195 H2_sum_excit_elec_den = 0.;
02196 for( iElecHi=0; iElecHi<mole.n_h2_elec_states; ++iElecHi )
02197 {
02198 pops_per_elec[iElecHi] *= H2_renorm_conserve;
02199 if( iElecHi > 0 )
02200 H2_sum_excit_elec_den += pops_per_elec[iElecHi];
02201
02202 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
02203 {
02204 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
02205 {
02206 H2_populations[iElecHi][iVibHi][iRotHi] *= H2_renorm_conserve;
02207
02208 }
02209 }
02210 }
02211
02212
02213
02214
02215
02216 sumold = 0.;
02217 for( iElec=0; iElec<mole.n_h2_elec_states; ++iElec )
02218 {
02219 for( iVib=0; iVib<=h2.nVib_hi[iElec]; ++iVib )
02220 {
02221 for( iRot=h2.Jlowest[iElec]; iRot<=h2.nRot_hi[iElec][iVib]; ++iRot )
02222 {
02223 double rel_change;
02224
02225
02226 if( fabs(H2_populations[iElec][iVib][iRot] -
02227 H2_old_populations[iElec][iVib][iRot])/
02228
02229
02230
02231 SDIV(H2_populations[iElec][iVib][iRot]) > fabs(PopChgMax_relative) &&
02232
02233
02234
02235
02236
02237
02238 H2_populations[iElec][iVib][iRot]/SDIV(hmi.H2_total)>1e-6 )
02239 {
02240 PopChgMax_relative =
02241 (H2_populations[iElec][iVib][iRot] -
02242 H2_old_populations[iElec][iVib][iRot])/
02243 SDIV(H2_populations[iElec][iVib][iRot]);
02244 iRotMaxChng_relative = iRot;
02245 iVibMaxChng_relative = iVib;
02246 popold_relative = H2_old_populations[iElec][iVib][iRot];
02247 popnew_relative = H2_populations[iElec][iVib][iRot];
02248 }
02249
02250
02251
02252
02253 rel_change = (H2_populations[iElec][iVib][iRot] -
02254 H2_old_populations[iElec][iVib][iRot])/SDIV(hmi.H2_total);
02255
02256 if( fabs(rel_change) > fabs(PopChgMax_total) )
02257 {
02258 PopChgMax_total = rel_change;
02259 iRotMaxChng_total = iRot;
02260 iVibMaxChng_total = iVib;
02261 popold_total = H2_old_populations[iElec][iVib][iRot];
02262 popnew_total = H2_populations[iElec][iVib][iRot];
02263 }
02264
02265 kase = -1;
02266
02267
02268
02269
02270
02271
02272 rel_change = fabs( H2_old_populations[iElec][iVib][iRot] -
02273 H2_populations[iElec][iVib][iRot] )/
02274 SDIV( H2_populations[iElec][iVib][iRot] );
02275
02276
02277 if( rel_change > 3. &&
02278 H2_old_populations[iElec][iVib][iRot]*H2_populations[iElec][iVib][iRot]>0 )
02279 {
02280
02281 H2_old_populations[iElec][iVib][iRot] = pow( 10. ,
02282 log10(H2_old_populations[iElec][iVib][iRot])/2. +
02283 log10(H2_populations[iElec][iVib][iRot])/2. );
02284 kase = 2;
02285 }
02286
02287
02288 else if( rel_change> 0.1 )
02289 {
02290 realnum frac_old=0.25f;
02291
02292 H2_old_populations[iElec][iVib][iRot] =
02293 frac_old*H2_old_populations[iElec][iVib][iRot] +
02294 (1.f-frac_old)*H2_populations[iElec][iVib][iRot];
02295 kase = 3;
02296 }
02297 else
02298 {
02299
02300 H2_old_populations[iElec][iVib][iRot] =
02301 H2_populations[iElec][iVib][iRot];
02302 kase = 4;
02303 }
02304 sumold += H2_old_populations[iElec][iVib][iRot];
02305 }
02306 }
02307 }
02308
02309 H2_renorm_conserve_init = hmi.H2_total/sumold;
02310
02311
02312
02313
02314 for( iElecHi=0; iElecHi<mole.n_h2_elec_states; ++iElecHi )
02315 {
02316 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
02317 {
02318 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
02319 {
02320 H2_old_populations[iElecHi][iVibHi][iRotHi] *= H2_renorm_conserve_init;
02321
02322 }
02323 }
02324 }
02325
02326 iElecHi = 0;
02327 h2.ortho_density = 0.;
02328 h2.para_density = 0.;
02329 H2_den_s = 0.;
02330 H2_den_g = 0.;
02331
02332 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
02333 {
02334 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
02335 {
02336
02337 if( energy_wn[0][iVibHi][iRotHi]> ENERGY_H2_STAR )
02338 {
02339 H2_den_s += H2_populations[iElecHi][iVibHi][iRotHi];
02340 }
02341 else
02342 {
02343 H2_den_g += H2_populations[iElecHi][iVibHi][iRotHi];
02344 }
02345 if( H2_lgOrtho[iElecHi][iVibHi][iRotHi] )
02346 {
02347 h2.ortho_density += H2_populations[iElecHi][iVibHi][iRotHi];
02348 }
02349 else
02350 {
02351 h2.para_density += H2_populations[iElecHi][iVibHi][iRotHi];
02352 }
02353
02354 }
02355 }
02356
02357 ortho_para_older = ortho_para_old;
02358 ortho_para_old = ortho_para_current;
02359 ortho_para_current = h2.ortho_density / SDIV( h2.para_density );
02360
02361
02362
02363 old_solomon_rate = hmi.H2_Solomon_dissoc_rate_BigH2_H2g;
02364
02365
02366
02367 H2_Solomon_rate( );
02368
02369
02370
02371
02372 HeatChangeOld = HeatChange;
02373 HeatChange = old_HeatH2Dexc_BigH2 - hmi.HeatH2Dexc_BigH2;
02374 {
02375 static long int loop_h2_oscil=-1;
02376
02377
02378 if( loop_h2_pops>2 && (
02379 (HeatChangeOld*HeatChange<0. ) ||
02380 (PopChgMax_relative*PopChgMaxOld_relative<0. ) ) )
02381 {
02382 lgH2_pops_oscil = true;
02383 if( loop_h2_pops > 6 )
02384 {
02385 loop_h2_oscil = loop_h2_pops;
02386 lgH2_pops_ever_oscil = true;
02387
02388
02389 frac_new_oscil *= 0.8f;
02390 frac_new_oscil = MAX2( frac_new_oscil , 0.1f);
02391 ++n_pop_oscil;
02392 }
02393 }
02394 else
02395 {
02396 lgH2_pops_oscil = false;
02397
02398 if( loop_h2_pops - loop_h2_oscil > 4 )
02399 {
02400 frac_new_oscil = 1.f;
02401 lgH2_pops_ever_oscil = false;
02402 }
02403 }
02404 }
02405
02406
02407
02408 old_HeatH2Dexc_BigH2 = hmi.HeatH2Dexc_BigH2;
02409 if(fabs(hmi.HeatH2Dexc_BigH2)/thermal.ctot > conv.HeatCoolRelErrorAllowed/10. ||
02410 hmi.HeatH2Dexc_BigH2==0. )
02411 H2_Cooling("H2lup");
02412
02413
02414 lgConv_h2_soln = true;
02415 lgPopsConv_total = true;
02416 lgPopsConv_relative = true;
02417 lgHeatConv = true;
02418 lgSolomonConv = true;
02419 lgOrthoParaRatioConv = true;
02420
02421
02422
02423 if( fabs(PopChgMax_relative)>converge_pops_relative )
02424 {
02425
02426 lgConv_h2_soln = false;
02427 lgPopsConv_relative = false;
02428
02429
02430 quant_old = PopChgMaxOld_relative;
02431
02432 quant_new = PopChgMax_relative;
02433
02434 strcpy( chReason , "rel pops changed" );
02435 }
02436
02437
02438
02439 else if( fabs(PopChgMax_total)>converge_pops_total)
02440 {
02441 lgConv_h2_soln = false;
02442 lgPopsConv_total = false;
02443
02444
02445 quant_old = PopChgMaxOld_total;
02446
02447 quant_new = PopChgMax_total;
02448
02449 strcpy( chReason , "tot pops changed" );
02450 }
02451
02452
02453
02454
02455
02456 else if( fabs(ortho_para_current-ortho_para_old) / SDIV(ortho_para_current)> converge_ortho_para )
02457
02458
02459 {
02460 lgConv_h2_soln = false;
02461 lgOrthoParaRatioConv = false;
02462 quant_old = ortho_para_old;
02463 quant_new = ortho_para_current;
02464 strcpy( chReason , "ortho/para ratio changed" );
02465 }
02466
02467
02468 else if( !thermal.lgTemperatureConstant &&
02469 fabs(hmi.HeatH2Dexc_BigH2-old_HeatH2Dexc_BigH2)/MAX2(thermal.ctot,thermal.htot) >
02470 conv.HeatCoolRelErrorAllowed/2.
02471
02472 )
02473 {
02474
02475
02476
02477 lgConv_h2_soln = false;
02478 lgHeatConv = false;
02479 quant_old = old_HeatH2Dexc_BigH2/MAX2(thermal.ctot,thermal.htot);
02480 quant_new = hmi.HeatH2Dexc_BigH2/MAX2(thermal.ctot,thermal.htot);
02481 strcpy( chReason , "heating changed" );
02482
02483
02484
02485 }
02486
02487
02488
02489
02490
02491 else if( rfield.lgInducProcess &&
02492
02493
02494 hmi.H2_frac_abund_set==0 &&
02495
02496
02497 fabs( hmi.H2_Solomon_dissoc_rate_BigH2_H2g - old_solomon_rate)/SDIV(hmi.H2_rate_destroy) >
02498 conv.EdenErrorAllowed/5.)
02499 {
02500 lgConv_h2_soln = false;
02501 lgSolomonConv = false;
02502 quant_old = old_solomon_rate;
02503 quant_new = hmi.H2_Solomon_dissoc_rate_BigH2_H2g;
02504 strcpy( chReason , "Solomon rate changed" );
02505 }
02506
02507
02508 if( !lgConv_h2_soln )
02509 {
02510
02511
02512
02513 if( PRT_POPS || mole.nH2_TRACE >=mole.nH2_trace_iterations )
02514 {
02515
02516
02517
02518
02519 fprintf(ioQQQ," loop %3li no conv oscl?%c why:%s ",
02520 loop_h2_pops,
02521 TorF(lgH2_pops_ever_oscil),
02522 chReason );
02523 if( !lgPopsConv_relative )
02524 fprintf(ioQQQ," PopChgMax_relative:%.4e v:%li J:%li old:%.4e new:%.4e",
02525 PopChgMax_relative,
02526 iVibMaxChng_relative,
02527 iRotMaxChng_relative ,
02528 popold_relative ,
02529 popnew_relative );
02530 else if( !lgPopsConv_total )
02531 fprintf(ioQQQ," PopChgMax_total:%.4e v:%li J:%li old:%.4e new:%.4e",
02532 PopChgMax_total,
02533 iVibMaxChng_total,
02534 iRotMaxChng_total ,
02535 popold_total ,
02536 popnew_total );
02537 else if( !lgHeatConv )
02538 fprintf(ioQQQ," heat:%.4e old:%.4e new:%.4e",
02539 (hmi.HeatH2Dexc_BigH2-old_HeatH2Dexc_BigH2)/MAX2(thermal.ctot,thermal.htot),
02540 quant_old ,
02541 quant_new);
02542
02543 else if( !lgSolomonConv )
02544 fprintf(ioQQQ," d(sol rate)/tot dest\t%2e",(old_solomon_rate - hmi.H2_Solomon_dissoc_rate_BigH2_H2g)/SDIV(hmi.H2_rate_destroy));
02545 else if( !lgOrthoParaRatioConv )
02546 fprintf(ioQQQ," current, old, older ratios are %.4e %.4e %.4e",
02547 ortho_para_current , ortho_para_old, ortho_para_older );
02548 else
02549 TotalInsanity();
02550 fprintf(ioQQQ,"\n");
02551 }
02552 }
02553
02554
02555
02556
02557
02558
02559
02560
02561
02562
02563
02564
02565
02566 if( trace.nTrConvg >= 5 )
02567 {
02568 fprintf( ioQQQ,
02569 " H2 5lev %li Conv?%c",
02570 loop_h2_pops ,
02571 TorF(lgConv_h2_soln) );
02572
02573 if( fabs(PopChgMax_relative)>0.1 )
02574 fprintf(ioQQQ," pops, rel chng %.3e",PopChgMax_relative);
02575 else
02576 fprintf(ioQQQ," rel heat %.3e rel chng %.3e H2 heat/cool %.2e",
02577 hmi.HeatH2Dexc_BigH2/thermal.ctot ,
02578 fabs(hmi.HeatH2Dexc_BigH2-old_HeatH2Dexc_BigH2)/thermal.ctot ,
02579 hmi.HeatH2Dexc_BigH2/thermal.ctot);
02580
02581 fprintf( ioQQQ,
02582 " Oscil?%c Ever Oscil?%c",
02583 TorF(lgH2_pops_oscil) ,
02584 TorF(lgH2_pops_ever_oscil) );
02585 if( lgH2_pops_ever_oscil )
02586 fprintf(ioQQQ," frac_new_oscil %.4f",frac_new_oscil);
02587 fprintf(ioQQQ,"\n");
02588 }
02589
02590 if( mole.nH2_TRACE >= mole.nH2_trace_full )
02591 {
02592 fprintf(ioQQQ,
02593 "H2 loop\t%li\tkase pop chng\t%i\tchem renorm fac\t%.4e\tortho/para ratio:\t%.3e\tfrac of pop in matrix: %.3f\n",
02594 loop_h2_pops,
02595 kase,
02596 H2_renorm_chemistry,
02597 h2.ortho_density / h2.para_density ,
02598 frac_matrix);
02599
02600
02601 if( iVibMaxChng_relative>=0 && iRotMaxChng_relative>=0 )
02602 fprintf(ioQQQ,
02603 "end loop %li H2 max rel chng=%.3e from %.3e to %.3e at v=%li J=%li\n\n",
02604 loop_h2_pops,
02605 PopChgMax_relative ,
02606 H2_old_populations[0][iVibMaxChng_relative][iRotMaxChng_relative],
02607 H2_populations[0][iVibMaxChng_relative][iRotMaxChng_relative],
02608 iVibMaxChng_relative , iRotMaxChng_relative
02609 );
02610 }
02611 }
02612
02613
02614
02615 H2_gs_rates();
02616
02617
02618 if( !lgConv_h2_soln && !conv.lgSearch )
02619 {
02620 conv.lgConvPops = false;
02621 strcpy( conv.chConvIoniz, "H2 pop cnv" );
02622 fprintf(ioQQQ,
02623 " H2_LevelPops: H2_populations not converged in %li tries; due to %s, old, new are %.4e %.4e, iteration %li zone %.2f.\n",
02624 loop_h2_pops,
02625 chReason,
02626 quant_old,
02627 quant_new ,
02628 iteration ,
02629 fnzone );
02630 ConvFail("pops","H2");
02631 }
02632
02633
02634
02635 for( iElecHi=0; iElecHi<mole.n_h2_elec_states; ++iElecHi )
02636 {
02637 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
02638 {
02639 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
02640 {
02641 long int lim_elec_lo = 0;
02642 double H2popHi = H2_populations[iElecHi][iVibHi][iRotHi];
02643
02644
02645 H2Lines[iElecHi][iVibHi][iRotHi][0][0][0].Hi->Pop = H2popHi;
02646 ASSERT( H2popHi >= 0. );
02647 realnum H2gHi = H2Lines[iElecHi][iVibHi][iRotHi][0][0][0].Hi->g;
02648
02649
02650
02651
02652 for( iElecLo=0; iElecLo<=lim_elec_lo; ++iElecLo )
02653 {
02654
02655
02656 long int nv = h2.nVib_hi[iElecLo];
02657 if( iElecLo==iElecHi )
02658 nv = iVibHi;
02659 for( iVibLo=0; iVibLo<=nv; ++iVibLo )
02660 {
02661 long nr = h2.nRot_hi[iElecLo][iVibLo];
02662 if( iElecLo==iElecHi && iVibHi==iVibLo )
02663 nr = iRotHi-1;
02664
02665 mb6ci lgH2le = lgH2_line_exists.ptr(iElecHi,iVibHi,iRotHi,iElecLo,iVibLo,h2.Jlowest[iElecLo]);
02666 mt6i H2L = H2Lines.ptr(iElecHi,iVibHi,iRotHi,iElecLo,iVibLo,h2.Jlowest[iElecLo]);
02667 for( iRotLo=h2.Jlowest[iElecLo]; iRotLo<=nr; ++iRotLo )
02668 {
02669 if( *lgH2le++ )
02670 {
02671
02672 H2L->Coll.cool = 0.;
02673 H2L->Coll.heat = 0.;
02674
02675 H2L->Emis->PopOpc =
02676 H2L->Lo->Pop - H2popHi * H2L->Lo->g / H2gHi;
02677
02678
02679 H2L->Emis->phots = H2L->Emis->Aul *
02680 (H2L->Emis->Pesc + H2L->Emis->Pelec_esc) *
02681 H2popHi;
02682
02683
02684 H2L->Emis->xIntensity =
02685 H2L->Emis->phots *
02686 H2L->EnergyErg;
02687
02688 if( iElecHi==0 )
02689 {
02691
02692
02693 H2L->Emis->ColOvTot = 1.;
02694 }
02695 else
02696 {
02697
02699 H2L->Emis->ColOvTot = 0.;
02700 }
02701 }
02702 ++H2L;
02703 }
02704 }
02705 }
02706 }
02707 }
02708 }
02709
02710
02711
02712
02713 hmi.H2_photodissoc_BigH2_H2s = 0.;
02714 hmi.H2_photodissoc_BigH2_H2g = 0.;
02715 hmi.H2_tripletdissoc_H2s =0.;
02716 hmi.H2_tripletdissoc_H2g =0.;
02717 hmi.H2_BigH2_H2g_av = 0.;
02718 hmi.H2_BigH2_H2s_av = 0.;
02719
02720 hmi.Average_collH2s_dissoc = 0.;
02721 hmi.Average_collH2g_dissoc = 0.;
02722
02723 iElec = 0;
02724 H2_BigH2_H2s = 0.;
02725 H2_BigH2_H2g = 0.;
02726 hmi.H2g_BigH2 =0;
02727 hmi.H2s_BigH2 = 0;
02728 hmi.H2_total_BigH2 =0;
02729 hmi.H2g_LTE_bigH2 =0.;
02730 hmi.H2s_LTE_bigH2 = 0.;
02731
02732
02733
02734
02735
02736
02737
02738 {
02739 static long ip_cut_off = -1;
02740 if( ip_cut_off < 0 )
02741 {
02742
02743 ip_cut_off = ipoint( 1.14 );
02744 }
02745
02746
02747
02748 flux_accum_photodissoc_BigH2_H2s = 0;
02749 ip_H2_level = ipoint( 1.07896 - 2.5 / EVRYD);
02750 for( i= ip_H2_level; i < ip_cut_off; ++i )
02751 {
02752 flux_accum_photodissoc_BigH2_H2s += ( rfield.flux[i-1] + rfield.ConInterOut[i-1]+
02753 rfield.outlin[i-1]+ rfield.outlin_noplot[i-1] );
02754 }
02755
02756
02757 for( iVib=0; iVib<=h2.nVib_hi[iElec]; ++iVib )
02758 {
02759 for( iRot=h2.Jlowest[iElec]; iRot<=h2.nRot_hi[iElec][iVib]; ++iRot )
02760 {
02761
02762
02763
02764
02765
02766
02767 if( energy_wn[0][iVib][iRot] > ENERGY_H2_STAR )
02768 {
02769 double arg_ratio;
02770 hmi.H2_photodissoc_BigH2_H2s +=
02771 H2_populations[iElec][iVib][iRot] * flux_accum_photodissoc_BigH2_H2s;
02772
02773
02774
02775
02776
02777
02778 hmi.H2_tripletdissoc_H2s +=
02779 H2_populations[iElec][iVib][iRot] * 10.f*secondaries.x12tot;
02780
02781
02782 H2_BigH2_H2s += H2_populations[iElec][iVib][iRot];
02783
02784
02785 hmi.H2_BigH2_H2s_av += (H2_populations[iElec][iVib][iRot] * energy_wn[0][iVib][iRot]);
02786
02787
02788 hmi.Average_collH2s_dissoc += H2_populations[iElec][iVib][iRot] * H2_coll_dissoc_rate_coef_H2[iVib][iRot];
02789
02790
02791 arg_ratio = exp_disoc/SDIV(H2_Boltzmann[0][iVib][iRot]);
02792 if( arg_ratio > 0. )
02793 {
02794
02795 hmi.H2s_LTE_bigH2 += H2_populations[0][iVib][iRot]*SAHA/SDIV(phycon.te32*arg_ratio)*
02796 (H2_stat[0][iVib][iRot]/(2.*2.))*3.634e-5;
02797 }
02798 }
02799 else
02800 {
02801 double arg_ratio;
02802
02803 flux_accum_photodissoc_BigH2_H2g = 0;
02804
02805 ip_H2_level = ipoint( 1.07896 - energy_wn[0][iVib][iRot] * WAVNRYD);
02806
02807 for( i= ip_H2_level; i < ip_cut_off; ++i )
02808 {
02809 flux_accum_photodissoc_BigH2_H2g += ( rfield.flux[i-1] + rfield.ConInterOut[i-1]+
02810 rfield.outlin[i-1]+ rfield.outlin_noplot[i-1] );
02811 }
02812
02813 hmi.H2_photodissoc_BigH2_H2g +=
02814 H2_populations[iElec][iVib][iRot] * flux_accum_photodissoc_BigH2_H2g;
02815
02816
02817
02818
02819
02820
02821
02822 hmi.H2_tripletdissoc_H2g +=
02823 H2_populations[iElec][iVib][iRot] * 10.f*secondaries.x12tot;
02824
02825
02826 H2_BigH2_H2g += H2_populations[iElec][iVib][iRot];
02827
02828
02829 hmi.H2_BigH2_H2g_av += (H2_populations[iElec][iVib][iRot] * energy_wn[0][iVib][iRot]);
02830
02831
02832 hmi.Average_collH2g_dissoc += H2_populations[iElec][iVib][iRot] * H2_coll_dissoc_rate_coef_H2[iVib][iRot];
02833
02834
02835 arg_ratio = exp_disoc/SDIV(H2_Boltzmann[0][iVib][iRot]);
02836 if( arg_ratio > 0. )
02837 {
02838 hmi.H2g_LTE_bigH2 += H2_populations[0][iVib][iRot]*(SAHA/SDIV(phycon.te32*arg_ratio)*
02839 (H2_stat[0][iVib][iRot]/(2.*2.))*3.634e-5);
02840 }
02841 }
02842 }
02843 }
02844 }
02845 hmi.H2g_BigH2 = (realnum)H2_BigH2_H2g;
02846 hmi.H2s_BigH2 = (realnum)H2_BigH2_H2s;
02847 hmi.H2_total_BigH2 =hmi.H2g_BigH2+hmi.H2s_BigH2;
02848
02849
02850 hmi.H2_BigH2_H2s_av = hmi.H2_BigH2_H2s_av / H2_BigH2_H2s;
02851
02852 hmi.H2_BigH2_H2g_av = hmi.H2_BigH2_H2g_av / H2_BigH2_H2g;
02853
02854
02855
02856
02857
02858
02859
02860 hmi.H2_photodissoc_BigH2_H2s = hmi.H2_photodissoc_BigH2_H2s / SDIV(H2_BigH2_H2s) * H2_DISS_ALLISON_DALGARNO;
02861 hmi.H2_photodissoc_BigH2_H2g = hmi.H2_photodissoc_BigH2_H2g / SDIV(H2_BigH2_H2g) * H2_DISS_ALLISON_DALGARNO;
02862 hmi.H2_tripletdissoc_H2g = hmi.H2_tripletdissoc_H2g/SDIV(H2_BigH2_H2g);
02863 hmi.H2_tripletdissoc_H2s = hmi.H2_tripletdissoc_H2s/SDIV(H2_BigH2_H2s);
02864 hmi.Average_collH2g_dissoc = hmi.Average_collH2g_dissoc /SDIV(H2_BigH2_H2g);
02865 hmi.Average_collH2s_dissoc = hmi.Average_collH2s_dissoc /SDIV(H2_BigH2_H2s);
02866 hmi.H2s_LTE_bigH2 = hmi.H2s_LTE_bigH2/SDIV(H2_BigH2_H2s);
02867 hmi.H2g_LTE_bigH2 = hmi.H2g_LTE_bigH2/SDIV(H2_BigH2_H2g);
02868
02869
02870
02871 double sumpop1 = 0.;
02872 double sumpopA1 = 0.;
02873 double sumpopcollH2O_deexcit = 0.;
02874 double sumpopcollH2p_deexcit = 0.;
02875 double sumpopcollH_deexcit = 0.;
02876 double popH2s = 0.;
02877 double sumpopcollH2O_excit = 0.;
02878 double sumpopcollH2p_excit = 0.;
02879 double sumpopcollH_excit = 0.;
02880 double popH2g = 0.;
02881
02882
02883 iElecLo = 0;
02884 for( iVibHi=0; iVibHi<=h2.nVib_hi[0]; ++iVibHi )
02885 {
02886 long nr1 = h2.nRot_hi[0][iVibHi];
02887 for( iRotHi=h2.Jlowest[0]; iRotHi<=nr1; ++iRotHi )
02888 {
02889 double ewnHi = energy_wn[0][iVibHi][iRotHi];
02890 for( iVibLo=0; iVibLo<=h2.nVib_hi[0]; ++iVibLo )
02891 {
02892 long nr2 = h2.nRot_hi[0][iVibLo];
02893 md3ci ewnLo = energy_wn.ptr(0,iVibLo,h2.Jlowest[0]);
02894 for( iRotLo=h2.Jlowest[0]; iRotLo<=nr2; ++iRotLo )
02895 {
02896 double ewnLo2 = energy_wn[0][iVibLo][iRotLo];
02897
02898 if( ewnHi > ENERGY_H2_STAR && ewnLo2 < ENERGY_H2_STAR )
02899 {
02900
02901
02902 if( H2_lgOrtho[0][iVibHi][iRotHi] == H2_lgOrtho[0][iVibLo][iRotLo] )
02903 {
02904
02905 popH2s += H2_populations[0][iVibHi][iRotHi];
02906 popH2g += H2_populations[0][iVibLo][iRotLo];
02907
02908
02909 sumpopcollH_deexcit += H2_populations[0][iVibHi][iRotHi]*H2_CollRate[iVibHi][iRotHi][iVibLo][iRotLo][0];
02910 sumpopcollH2O_deexcit += H2_populations[0][iVibHi][iRotHi]*H2_CollRate[iVibHi][iRotHi][iVibLo][iRotLo][2];
02911 sumpopcollH2p_deexcit += H2_populations[0][iVibHi][iRotHi]*H2_CollRate[iVibHi][iRotHi][iVibLo][iRotLo][3];
02912
02913
02914 sumpopcollH_excit += H2_populations[0][iVibLo][iRotLo]*H2_CollRate[iVibHi][iRotHi][iVibLo][iRotLo][0]*H2_stat[0][iVibHi][iRotHi] / H2_stat[0][iVibLo][iRotLo] *
02915 H2_Boltzmann[0][iVibHi][iRotHi] /SDIV( H2_Boltzmann[0][iVibLo][iRotLo] );
02916 sumpopcollH2O_excit += H2_populations[0][iVibLo][iRotLo]*H2_CollRate[iVibHi][iRotHi][iVibLo][iRotLo][2]*H2_stat[0][iVibHi][iRotHi] / H2_stat[0][iVibLo][iRotLo] *
02917 H2_Boltzmann[0][iVibHi][iRotHi] /SDIV( H2_Boltzmann[0][iVibLo][iRotLo] );
02918 sumpopcollH2p_excit += H2_populations[0][iVibLo][iRotLo]*H2_CollRate[iVibHi][iRotHi][iVibLo][iRotLo][3]*H2_stat[0][iVibHi][iRotHi] / H2_stat[0][iVibLo][iRotLo] *
02919 H2_Boltzmann[0][iVibHi][iRotHi] /SDIV( H2_Boltzmann[0][iVibLo][iRotLo] );
02920
02921
02922
02923
02924 if( lgH2_line_exists[0][iVibHi][iRotHi][0][iVibLo][iRotLo] )
02925 {
02926 sumpop1 += H2Lines[0][iVibHi][iRotHi][0][iVibLo][iRotLo].Hi->Pop;
02927 sumpopA1 += H2Lines[0][iVibHi][iRotHi][0][iVibLo][iRotLo].Hi->Pop*
02928 H2Lines[0][iVibHi][iRotHi][0][iVibLo][iRotLo].Emis->Aul;
02929 }
02930 }
02931 }
02932 }
02933 }
02934 }
02935 }
02936 hmi.Average_A = sumpopA1/SDIV(sumpop1);
02937
02938
02939 hmi.Average_collH2_deexcit = (sumpopcollH2O_deexcit+sumpopcollH2p_deexcit)/SDIV(popH2s);
02940 hmi.Average_collH2_excit = (sumpopcollH2O_excit+sumpopcollH2p_excit)/SDIV(popH2g);
02941 hmi.Average_collH_excit = sumpopcollH_excit/SDIV(popH2g);
02942 hmi.Average_collH_deexcit = sumpopcollH_deexcit/SDIV(popH2s);
02943
02944 if( conv.lgSearch )
02945 {
02946 hmi.Average_collH_excit /=10.;
02947 hmi.Average_collH_deexcit/=10.;
02948 }
02949
02950
02951
02952
02953
02954
02955
02956
02957 if( mole.nH2_TRACE >= mole.nH2_trace_full|| (trace.lgTrace && trace.lgTr_H2_Mole) )
02958 {
02959 fprintf(ioQQQ," H2_LevelPops exit2 Sol dissoc %.2e (TH85 %.2e)",
02960 hmi.H2_Solomon_dissoc_rate_BigH2_H2g +
02961 hmi.H2_Solomon_dissoc_rate_BigH2_H2s ,
02962 hmi.H2_Solomon_dissoc_rate_TH85_H2g);
02963
02964
02965
02966 fprintf(ioQQQ," H2g Sol %.2e H2s Sol %.2e",
02967 hmi.H2_Solomon_dissoc_rate_used_H2g ,
02968 hmi.H2_Solomon_dissoc_rate_BigH2_H2s );
02969
02970
02971 fprintf(ioQQQ," H2g->H2s %.2e (TH85 %.2e)",
02972 hmi.H2_H2g_to_H2s_rate_BigH2 ,
02973 hmi.H2_H2g_to_H2s_rate_TH85);
02974
02975
02976
02977 fprintf(ioQQQ," H2 con diss %.2e (TH85 %.2e)\n",
02978 hmi.H2_photodissoc_BigH2_H2s ,
02979 hmi.H2_photodissoc_TH85);
02980 }
02981 else if( mole.nH2_TRACE )
02982 {
02983 fprintf(ioQQQ," H2_LevelPops exit1 %8.2f loops:%3li H2/H:%.3e Sol dis old %.3e new %.3e",
02984 fnzone ,
02985 loop_h2_pops ,
02986 hmi.H2_total / dense.gas_phase[ipHYDROGEN],
02987 old_solomon_rate,
02988 hmi.H2_Solomon_dissoc_rate_BigH2_H2g );
02989 fprintf(ioQQQ,"\n");
02990 }
02991
02992
02993
02994
02995
02996
02997 ++nCallH2_this_iteration;
02998
02999
03000
03001 ++h2.nCallH2_this_zone;
03002
03003
03004
03005
03006 nXLevelsMatrix = nXLevelsMatrix_save;
03007
03008
03009
03010
03011 if( nCallH2_this_iteration && nzone != nzone_nlevel_set )
03012 {
03013
03014 # define FRAC 0.99999
03015
03016 double sum_pop = 0.;
03017 nEner = 0;
03018 iElec = 0;
03019 # define PRT false
03020 if( PRT ) fprintf(ioQQQ,"DEBUG pops ");
03021 while( nEner < nLevels_per_elec[0] && sum_pop/hmi.H2_total < FRAC )
03022 {
03023
03024
03025 ip = H2_ipX_ener_sort[nEner];
03026 iVib = ipVib_H2_energy_sort[ip];
03027 iRot = ipRot_H2_energy_sort[ip];
03028 sum_pop += H2_old_populations[iElec][iVib][iRot];
03029 if( PRT ) fprintf(ioQQQ,"\t%.3e ", H2_old_populations[iElec][iVib][iRot]);
03030 ++nEner;
03031 }
03032 if( PRT ) fprintf(ioQQQ,"\n ");
03033 nzone_nlevel_set = nzone;
03034
03035
03036
03037 # undef FRAC
03038 # undef PRT
03039 }
03040 return;
03041 }
03042
03043
03044
03045
03046
03047
03048 #if defined(__ICC) && defined(__i386)
03049 #pragma optimization_level 1
03050 #endif
03051 void H2_Cooling(
03052
03053
03054
03055 const char *chRoutine)
03056 {
03057 long int iElecHi , iElecLo , iVibHi , iVibLo , iRotHi , iRotLo;
03058 double heatone ,
03059 rate_dn_heat,
03060 rate_up_cool;
03061 long int nColl,
03062 ipHi, ipLo;
03063 double Big1_heat , Big1_cool,
03064 H2_X_col_cool , H2_X_col_heat;
03065 long int ipVib_big_heat_hi,ipVib_big_heat_lo ,ipRot_big_heat_hi ,
03066 ipRot_big_heat_lo ,ipVib_big_cool_hi,ipVib_big_cool_lo ,
03067 ipRot_big_cool_hi , ipRot_big_cool_lo;
03068
03069 # ifdef DEBUG_DIS_DEAT
03070 double heatbig;
03071 long int iElecBig , iVibBig , iRotBig;
03072 # endif
03073
03074
03075
03076 enum {DEBUG_H2_COLL_X_HEAT=false };
03077
03078 DEBUG_ENTRY( "H2_Cooling()" );
03079
03080
03081
03082 static long int nCount=-1;
03083 long int nCountDebug = 930,
03084 nCountStop = 940;
03085 ++nCount;
03086
03087
03088
03089
03090
03091 if( !h2.lgH2ON || !nCallH2_this_iteration )
03092 {
03093 hmi.HeatH2Dexc_BigH2 = 0.;
03094 hmi.HeatH2Dish_BigH2 = 0.;
03095 hmi.deriv_HeatH2Dexc_BigH2 = 0.;
03096 return;
03097 }
03098
03099 hmi.HeatH2Dish_BigH2 = 0.;
03100 heatone = 0.;
03101 # ifdef DEBUG_DIS_DEAT
03102 heatbig = 0.;
03103 iElecBig = -1;
03104 iVibBig = -1;
03105 iRotBig = -1;
03106 # endif
03107
03108 for( iElecHi=1; iElecHi<mole.n_h2_elec_states; ++iElecHi )
03109 {
03110 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
03111 {
03112 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
03113 {
03114
03115 heatone = H2_populations[iElecHi][iVibHi][iRotHi] *
03116 H2_dissprob[iElecHi][iVibHi][iRotHi] *
03117 H2_disske[iElecHi][iVibHi][iRotHi];
03118 hmi.HeatH2Dish_BigH2 += heatone;
03119 # ifdef DEBUG_DIS_DEAT
03120 if( heatone > heatbig )
03121 {
03122 heatbig = heatone;
03123 iElecBig = iElecHi;
03124 iVibBig = iVibHi;
03125 iRotBig = iRotHi;
03126 }
03127 # endif
03128 }
03129 }
03130 }
03131 # ifdef DEBUG_DIS_DEAT
03132 fprintf(ioQQQ,"DEBUG H2 dis heat\t%.2f\t%.3f\t%li\t\t%li\t%li\n",
03133 fnzone ,
03134 heatbig / SDIV( hmi.HeatH2Dish_BigH2 ) ,
03135 iElecBig ,
03136 iVibBig ,
03137 iRotBig );
03138 # endif
03139
03140
03141 hmi.HeatH2Dish_BigH2 *= EN1EV;
03142
03143
03144
03145
03146
03147 hmi.HeatH2Dexc_BigH2 = 0.;
03148 H2_X_col_cool = 0.;
03149 H2_X_col_heat = 0.;
03150
03151
03152
03153 long int nBug1 = 200 , nBug2 = 201;
03154 # if 0
03155
03156 if( fudge(-1) > 0 )
03157 {
03158 nBug1 = (long)fudge(0);
03159 nBug2 = (long)fudge(1);
03160 }
03161 # endif
03162 if( DEBUG_H2_COLL_X_HEAT && (nCount == nBug1 || nCount==nBug2) )
03163 {
03164 FILE *ioBAD=NULL;
03165 if( nCount==nBug1 )
03166 {
03167 ioBAD = fopen("firstpop.txt" , "w" );
03168 }
03169 else if( nCount==nBug2 )
03170 {
03171 ioBAD = fopen("secondpop.txt" , "w" );
03172 }
03173 for( ipHi=0; ipHi<nLevels_per_elec[0]; ++ipHi )
03174 {
03175 long int ip = H2_ipX_ener_sort[ipHi];
03176 iVibHi = ipVib_H2_energy_sort[ip];
03177 iRotHi = ipRot_H2_energy_sort[ip];
03178 fprintf(ioBAD , "%li\t%li\t%.2e\n",
03179 iVibHi , iRotHi ,
03180 H2_populations[0][iVibHi][iRotHi] );
03181 }
03182 fclose(ioBAD);
03183 }
03184
03185
03186 iElecHi = 0;
03187 iElecLo = 0;
03188 Big1_heat = 0.;
03189 Big1_cool = 0.;
03190 ipVib_big_heat_hi = -1;
03191 ipVib_big_heat_lo = -1;
03192 ipRot_big_heat_hi = -1;
03193 ipRot_big_heat_lo = -1;
03194 ipVib_big_cool_hi = -1;
03195 ipVib_big_cool_lo = -1;
03196 ipRot_big_cool_hi = -1;
03197 ipRot_big_cool_lo = -1;
03198
03199 hmi.deriv_HeatH2Dexc_BigH2 = 0.;
03200 for( ipHi=1; ipHi<nLevels_per_elec[iElecHi]; ++ipHi )
03201 {
03202 long int ip = H2_ipX_ener_sort[ipHi];
03203 iVibHi = ipVib_H2_energy_sort[ip];
03204 iRotHi = ipRot_H2_energy_sort[ip];
03205 if( iVibHi > VIB_COLLID )
03206 continue;
03207
03208 realnum H2statHi = H2_stat[iElecHi][iVibHi][iRotHi];
03209 double H2boltzHi = H2_Boltzmann[iElecHi][iVibHi][iRotHi];
03210 double H2popHi = H2_populations[iElecHi][iVibHi][iRotHi];
03211 double ewnHi = energy_wn[iElecHi][iVibHi][iRotHi];
03212
03213 for( ipLo=0; ipLo<ipHi; ++ipLo )
03214 {
03215 double coolone , oneline;
03216 ip = H2_ipX_ener_sort[ipLo];
03217 iVibLo = ipVib_H2_energy_sort[ip];
03218 iRotLo = ipRot_H2_energy_sort[ip];
03219 if( iVibLo > VIB_COLLID)
03220 continue;
03221
03222 rate_dn_heat = 0.;
03223
03224
03225 mr5ci H2cr = H2_CollRate.begin(iVibHi,iRotHi,iVibLo,iRotLo);
03226 for( nColl=0; nColl<N_X_COLLIDER; ++nColl )
03227
03228 rate_dn_heat += H2cr[nColl]*collider_density[nColl];
03229
03230
03231 rate_up_cool = rate_dn_heat * H2_populations[iElecLo][iVibLo][iRotLo] *
03232
03233 H2statHi / H2_stat[iElecLo][iVibLo][iRotLo] *
03234 H2boltzHi / SDIV( H2_Boltzmann[iElecLo][iVibLo][iRotLo] );
03235
03236 rate_dn_heat *= H2popHi;
03237
03238
03239
03240
03241
03242 double conversion = (ewnHi - energy_wn[iElecLo][iVibLo][iRotLo]) * ERG1CM;
03243 heatone = rate_dn_heat * conversion;
03244 coolone = rate_up_cool * conversion;
03245
03246 oneline = heatone - coolone;
03247 hmi.HeatH2Dexc_BigH2 += oneline;
03248
03249
03250 H2_X_col_cool += coolone;
03251 H2_X_col_heat += heatone;
03252
03253 if( 0 && DEBUG_H2_COLL_X_HEAT && (nCount == 692 || nCount==693) )
03254 {
03255 static FILE *ioBAD=NULL;
03256 if(ipHi == 1 && ipLo == 0)
03257 {
03258 if( nCount==692 )
03259 {
03260 ioBAD = fopen("firstheat.txt" , "w" );
03261 }
03262 else if( nCount==693 )
03263 {
03264 ioBAD = fopen("secondheat.txt" , "w" );
03265 }
03266 fprintf(ioBAD,"DEBUG start \n");
03267 }
03268 fprintf(ioBAD,"DEBUG BAD DAY %li %li %li %li %.3e %.3e\n",
03269 iVibHi , iRotHi, iVibLo , iRotLo , heatone , coolone );
03270 if( ipHi==nLevels_per_elec[iElecHi]-1 &&
03271 ipLo==ipHi-1 )
03272 fclose(ioBAD);
03273 }
03274
03275
03276
03277
03278 hmi.deriv_HeatH2Dexc_BigH2 += (realnum)(oneline * ewnHi);
03279
03280
03281
03282 if( DEBUG_H2_COLL_X_HEAT )
03283 {
03284 if( oneline < Big1_cool )
03285 {
03286 Big1_cool = oneline;
03287 ipVib_big_cool_hi = iVibHi;
03288 ipVib_big_cool_lo = iVibLo;
03289 ipRot_big_cool_hi = iRotHi;
03290 ipRot_big_cool_lo = iRotLo;
03291 }
03292 else if( oneline > Big1_heat )
03293 {
03294 Big1_heat = oneline;
03295 ipVib_big_heat_hi = iVibHi;
03296 ipVib_big_heat_lo = iVibLo;
03297 ipRot_big_heat_hi = iRotHi;
03298 ipRot_big_heat_lo = iRotLo;
03299 }
03300 }
03301
03302
03303 ASSERT(
03304 (rate_up_cool==0 && rate_dn_heat==0) ||
03305 (energy_wn[iElecHi][iVibHi][iRotHi] > energy_wn[iElecLo][iVibLo][iRotLo]) );
03306 }
03307 }
03308
03309
03310
03311 if( DEBUG_H2_COLL_X_HEAT )
03312 {
03313
03314
03315
03316 if(nCount>nCountDebug )
03317 {
03318 fprintf(ioQQQ,
03319 "DEBUG H2_Cooling A %li %15s, Te %.3e net Heat(Xcol) %.2e "
03320 "heat %.2e cool %.2e H+/0 "
03321 "%.2e n(H2)%.3e Sol rat %.3e grn J1->0%.2e frac heat 1 line "
03322 "%.2e Hi(v,j)%li %li Lo(v,J)%li %li frac cool 1 line %.2e "
03323 "Hi(v,j)%li %li Lo(v,J)%li %li POP(J=1,13)",
03324 nCount , chRoutine,
03325 phycon.te,
03326 hmi.HeatH2Dexc_BigH2 ,
03327 H2_X_col_cool ,
03328 H2_X_col_heat ,
03329 dense.xIonDense[ipHYDROGEN][1]/SDIV(dense.xIonDense[ipHYDROGEN][0]),
03330 hmi.H2_total,
03331 hmi.H2_Solomon_dissoc_rate_BigH2_H2g,
03332 hmi.rate_grain_h2_J1_to_J0 ,
03333 Big1_heat/hmi.HeatH2Dexc_BigH2 ,
03334 ipVib_big_heat_hi , ipRot_big_heat_hi , ipVib_big_heat_lo , ipRot_big_heat_lo ,
03335 Big1_cool/hmi.HeatH2Dexc_BigH2 ,
03336 ipVib_big_cool_hi , ipRot_big_cool_hi , ipVib_big_cool_lo , ipRot_big_cool_lo );
03337
03338 for( iRotLo=0; iRotLo<14; ++iRotLo )
03339 {
03340 fprintf(ioQQQ,"\t%.2e" ,
03341 H2_populations[0][0][iRotLo]/hmi.H2_total );
03342 }
03343 fprintf(ioQQQ,"\t%li\n",nCount);
03344
03345 fprintf(ioQQQ,"DEBUG H2_Cooling B heat Coll Rate (lrg col) dn,up" );
03346 double HeatNet = 0.;
03347 for( nColl=0; nColl<N_X_COLLIDER; ++nColl )
03348 {
03349 fprintf(ioQQQ,"\t%.2e" ,
03350 H2_CollRate[ipVib_big_heat_hi][ipRot_big_heat_hi][ipVib_big_heat_lo][ipRot_big_heat_lo][nColl]*
03351 collider_density[nColl] );
03352 fprintf(ioQQQ,"\t%.2e" ,
03353
03354 H2_CollRate[ipVib_big_heat_hi][ipRot_big_heat_hi][ipVib_big_heat_lo][ipRot_big_heat_lo][nColl]*
03355 collider_density[nColl]*
03356
03357 H2_stat[0][ipVib_big_heat_hi][ipRot_big_heat_hi] / H2_stat[0][ipVib_big_heat_lo][ipRot_big_heat_lo] *
03358 H2_Boltzmann[0][ipVib_big_heat_hi][ipRot_big_heat_hi] /
03359 SDIV( H2_Boltzmann[0][ipVib_big_heat_lo][ipRot_big_heat_lo] ) );
03360 HeatNet +=
03361 H2_CollRate[ipVib_big_heat_hi][ipRot_big_heat_hi][ipVib_big_heat_lo][ipRot_big_heat_lo][nColl]*
03362 collider_density[nColl]*H2_populations[iElecLo][ipRot_big_heat_hi][ipVib_big_heat_lo]
03363 -
03364 H2_CollRate[ipVib_big_heat_hi][ipRot_big_heat_hi][ipVib_big_heat_lo][ipRot_big_heat_lo][nColl]*
03365 collider_density[nColl]*
03366
03367 H2_stat[0][ipVib_big_heat_hi][ipRot_big_heat_hi] / H2_stat[0][ipVib_big_heat_lo][ipRot_big_heat_lo] *
03368 H2_Boltzmann[0][ipVib_big_heat_hi][ipRot_big_heat_hi] /
03369 SDIV( H2_Boltzmann[0][ipVib_big_heat_lo][ipRot_big_heat_lo] ) *
03370 H2_populations[iElecLo][ipVib_big_heat_lo][ipRot_big_heat_lo] ;
03371 }
03372
03373 fprintf( ioQQQ , " HeatNet %.2e",HeatNet);
03374 fprintf(ioQQQ,"\n");
03375 fprintf(ioQQQ,"DEBUG H2_Cooling C cool Coll Rate (lrg col) dn,up" );
03376 double CoolNet = 0.;
03377 for( nColl=0; nColl<N_X_COLLIDER; ++nColl )
03378 {
03379 fprintf(ioQQQ,"\t%.2e" ,
03380 H2_CollRate[ipVib_big_cool_hi][ipRot_big_cool_hi][ipVib_big_cool_lo][ipRot_big_cool_lo][nColl]*
03381 collider_density[nColl] );
03382 fprintf(ioQQQ,"\t%.2e" ,
03383
03384 H2_CollRate[ipVib_big_cool_hi][ipRot_big_cool_hi][ipVib_big_cool_lo][ipRot_big_cool_lo][nColl]*
03385 collider_density[nColl]*
03386
03387 H2_stat[0][ipVib_big_cool_hi][ipRot_big_cool_hi] / H2_stat[0][ipVib_big_cool_lo][ipRot_big_cool_lo] *
03388 H2_Boltzmann[0][ipVib_big_cool_hi][ipRot_big_cool_hi] /
03389 SDIV( H2_Boltzmann[0][ipVib_big_cool_lo][ipRot_big_cool_lo] ) );
03390 CoolNet +=
03391 H2_CollRate[ipVib_big_cool_hi][ipRot_big_cool_hi][ipVib_big_cool_lo][ipRot_big_cool_lo][nColl]*
03392 collider_density[nColl]*H2_populations[iElecLo][ipRot_big_cool_hi][ipVib_big_cool_lo]
03393 -
03394 H2_CollRate[ipVib_big_cool_hi][ipRot_big_cool_hi][ipVib_big_cool_lo][ipRot_big_cool_lo][nColl]*
03395 collider_density[nColl]*
03396
03397 H2_stat[0][ipVib_big_cool_hi][ipRot_big_cool_hi] / H2_stat[0][ipVib_big_cool_lo][ipRot_big_cool_lo] *
03398 H2_Boltzmann[0][ipVib_big_cool_hi][ipRot_big_cool_hi] /
03399 SDIV( H2_Boltzmann[0][ipVib_big_cool_lo][ipRot_big_cool_lo] ) *
03400 H2_populations[iElecLo][ipVib_big_cool_lo][ipRot_big_cool_lo] ;
03401 }
03402
03403 fprintf( ioQQQ , " CoolNet %.2e",CoolNet);
03404 fprintf(ioQQQ,"\n");
03405 }
03406 }
03407
03408
03409 if( PRT_POPS )
03410 fprintf(ioQQQ,
03411 " DEBUG H2 heat fnzone\t%.2f\trenrom\t%.3e\tte\t%.4e\tdexc\t%.3e\theat/tot\t%.3e\n",
03412 fnzone ,
03413 H2_renorm_chemistry ,
03414 phycon.te ,
03415 hmi.HeatH2Dexc_BigH2,
03416 hmi.HeatH2Dexc_BigH2/thermal.ctot);
03417
03418
03419
03420 hmi.deriv_HeatH2Dexc_BigH2 /= (realnum)POW2(phycon.te_wn);
03421
03422 {
03423 enum {DEBUG_LOC=false };
03424 if( DEBUG_H2_COLL_X_HEAT && DEBUG_LOC &&
03425 (fabs(hmi.HeatH2Dexc_BigH2) > SMALLFLOAT) )
03426 {
03427 int iVib = 0;
03428
03429
03430
03431
03432
03433
03434
03435
03436
03437 iElecHi = iElecLo = 0;
03438 iVibHi = iVibLo = 0;
03439 iRotHi = 7;
03440 iRotLo = 5;
03441 rate_dn_heat = rate_up_cool = 0.;
03442
03443 for( nColl=0; nColl<N_X_COLLIDER; ++nColl )
03444 {
03445 rate_dn_heat +=
03446 H2_populations[iElecHi][iVibHi][iRotHi] *
03447 H2_CollRate[iVibHi][iRotHi][iVibLo][iRotLo][nColl]*
03448 collider_density[nColl];
03449
03450
03451 rate_up_cool +=
03452 H2_populations[iElecLo][iVibLo][iRotLo] *
03453
03454 H2_CollRate[iVibHi][iRotHi][iVibLo][iRotLo][nColl]*
03455 collider_density[nColl]*
03456
03457 H2_stat[iElecHi][iVibHi][iRotHi] / H2_stat[iElecLo][iVibLo][iRotLo] *
03458 H2_Boltzmann[iElecHi][iVibHi][iRotHi] /
03459 SDIV( H2_Boltzmann[iElecLo][iVibLo][iRotLo] );
03460 }
03461
03462 fprintf(ioQQQ,"DEBUG H2_cooling D pop %li ov %li\t%.3e\tdn up 31\t%.3e\t%.3e\n",
03463 iRotHi , iRotLo ,
03464 H2_populations[0][iVib][iRotHi]/H2_populations[0][iVib][iRotLo],
03465 rate_dn_heat,
03466 rate_up_cool);
03467 if( nCount>= nCountStop )
03468 cdEXIT(EXIT_FAILURE);
03469 }
03470 }
03471 {
03472 enum {DEBUG_LOC=false};
03473 if( DEBUG_LOC )
03474 {
03475 static long nzdone=-1 , nzincre;
03476 if( nzone!=nzdone )
03477 {
03478 nzdone = nzone;
03479 nzincre = -1;
03480 }
03481 ++nzincre;
03482 fprintf(ioQQQ," H2 nz\t%.2f\tnzinc\t%li\tTe\t%.4e\tH2\t%.3e\tcXH\t%.2e\tdcXH/dt%.2e\tDish\t%.2e \n",
03483 fnzone,
03484 nzincre,
03485 phycon.te,
03486 hmi.H2_total ,
03487 hmi.HeatH2Dexc_BigH2,
03488 hmi.deriv_HeatH2Dexc_BigH2 ,
03489 hmi.HeatH2Dish_BigH2);
03490
03491 }
03492 }
03493
03494 # if 0
03495
03496
03497
03498 if( 1 || nzone <1 || old_HeatH2Dexc==0. || nCallH2_this_iteration <2)
03499 {
03500 old_HeatH2Dexc = hmi.HeatH2Dexc_BigH2;
03501 }
03502 else
03503 {
03504 hmi.HeatH2Dexc_BigH2 = (hmi.HeatH2Dexc_BigH2+old_HeatH2Dexc)/2.f;
03505 old_HeatH2Dexc = hmi.HeatH2Dexc_BigH2;
03506 }
03507 # endif
03508 {
03509 enum {DEBUG_LOC=false};
03510 if( DEBUG_LOC )
03511 {
03512 fprintf(ioQQQ,"DEBUG H2_cooling E %15s %c vib deex %li Te %.3e net heat %.3e cool %.3e heat %.3e\n",
03513 chRoutine ,
03514 TorF(conv.lgSearch),
03515 nCount,
03516 phycon.te, hmi.HeatH2Dexc_BigH2,
03517 H2_X_col_cool ,
03518 H2_X_col_heat
03519
03520 );
03521 if( 0 && nCount > nCountStop )
03522 {
03523 cdEXIT( EXIT_FAILURE );
03524 }
03525 }
03526 }
03527 if( mole.nH2_TRACE >= mole.nH2_trace_full )
03528 fprintf(ioQQQ,
03529 " H2_Cooling Ctot\t%.4e\t HeatH2Dish_BigH2 \t%.4e\t HeatH2Dexc_BigH2 \t%.4e\n" ,
03530 thermal.ctot ,
03531 hmi.HeatH2Dish_BigH2 ,
03532 hmi.HeatH2Dexc_BigH2 );
03533
03534
03535
03536
03537
03538
03539
03540
03541 if( conv.lgSearch )
03542 hmi.HeatH2Dexc_BigH2 = 0.;
03543 return;
03544 }
03545
03546
03547
03548
03549 double cdH2_colden( long iVib , long iRot )
03550 {
03551
03552
03553
03554
03555
03556
03557 if( iVib < 0 )
03558 {
03559 if( iRot==0 )
03560 {
03561
03562 return( h2.ortho_colden + h2.para_colden );
03563 }
03564 else if( iRot==1 )
03565 {
03566
03567 return h2.ortho_colden;
03568 }
03569 else if( iRot==2 )
03570 {
03571
03572 return h2.para_colden;
03573 }
03574 else
03575 {
03576 fprintf(ioQQQ," iRot must be 0 (total), 1 (ortho), or 2 (para), returning -1.\n");
03577 return -1.;
03578 }
03579 }
03580 else if( h2.lgH2ON )
03581 {
03582
03583
03584 int iElec = 0;
03585 if( iRot <0 || iVib >h2.nVib_hi[iElec] || iRot > h2.nRot_hi[iElec][iVib])
03586 {
03587 fprintf(ioQQQ," iVib and iRot must lie within X, returning -2.\n");
03588 fprintf(ioQQQ," iVib must be <= %li and iRot must be <= %li.\n",
03589 h2.nVib_hi[iElec],h2.nRot_hi[iElec][iVib]);
03590 return -2.;
03591 }
03592 else
03593 {
03594 return H2_X_colden[iVib][iRot];
03595 }
03596 }
03597
03598 else
03599 return -1;
03600 }
03601
03602
03603 void H2_Colden( const char *chLabel )
03604 {
03605 long int iVib , iRot;
03606
03607
03608 if( !h2.lgH2ON )
03609 return;
03610
03611 DEBUG_ENTRY( "H2_Colden()" );
03612
03613 if( strcmp(chLabel,"ZERO") == 0 )
03614 {
03615
03616 for( iVib = 0; iVib <= h2.nVib_hi[0]; ++iVib )
03617 {
03618 for( iRot=h2.Jlowest[0]; iRot<=h2.nRot_hi[0][iVib]; ++iRot )
03619 {
03620
03621 H2_X_colden[iVib][iRot] = 0.;
03622 H2_X_colden_LTE[iVib][iRot] = 0.;
03623 }
03624 }
03625 }
03626
03627 else if( strcmp(chLabel,"ADD ") == 0 )
03628 {
03629
03630 for( iVib = 0; iVib <= h2.nVib_hi[0]; ++iVib )
03631 {
03632 for( iRot=h2.Jlowest[0]; iRot<=h2.nRot_hi[0][iVib]; ++iRot )
03633 {
03634
03635 H2_X_colden[iVib][iRot] += (realnum)(H2_populations[0][iVib][iRot]*radius.drad_x_fillfac);
03636
03637
03638 H2_X_colden_LTE[iVib][iRot] += (realnum)(H2_populations_LTE[0][iVib][iRot]*
03639 hmi.H2_total*radius.drad_x_fillfac);
03640 }
03641 }
03642 }
03643
03644
03645 else if( strcmp(chLabel,"PRIN") != 0 )
03646 {
03647 fprintf( ioQQQ, " H2_Colden does not understand the label %s\n",
03648 chLabel );
03649 cdEXIT(EXIT_FAILURE);
03650 }
03651
03652 return;
03653 }
03654
03655
03656 double H2_DR(void)
03657 {
03658 return BIGFLOAT;
03659 }
03660
03661
03662 void H2_RT_OTS( void )
03663 {
03664
03665 long int iElecHi , iVibHi , iRotHi , iElecLo , iVibLo , iRotLo;
03666
03667
03668 if( !h2.lgH2ON || !h2.nCallH2_this_zone )
03669 return;
03670
03671 DEBUG_ENTRY( "H2_RT_OTS()" );
03672
03673
03674 long int lim_elec_hi = 0;
03675 for( iElecHi=0; iElecHi<=lim_elec_hi; ++iElecHi )
03676 {
03677 for( iVibHi=0; iVibHi<=h2.nVib_hi[iElecHi]; ++iVibHi )
03678 {
03679 for( iRotHi=h2.Jlowest[iElecHi]; iRotHi<=h2.nRot_hi[iElecHi][iVibHi]; ++iRotHi )
03680 {
03681 double H2popHi = H2Lines[iElecHi][iVibHi][iRotHi][0][0][0].Hi->Pop;
03682 long int lim_elec_lo = 0;
03683 for( iElecLo=0; iElecLo<=lim_elec_lo; ++iElecLo )
03684 {
03685
03686
03687 long int nv = h2.nVib_hi[iElecLo];
03688 if( iElecLo==iElecHi )
03689 nv = iVibHi;
03690 for( iVibLo=0; iVibLo<=nv; ++iVibLo )
03691 {
03692 long nr = h2.nRot_hi[iElecLo][iVibLo];
03693 if( iElecLo==iElecHi && iVibHi==iVibLo )
03694 nr = iRotHi-1;
03695
03696 for( iRotLo=h2.Jlowest[iElecLo]; iRotLo<=nr; ++iRotLo )
03697 {
03698
03699 if( iElecHi==0 && lgH2_line_exists[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo] )
03700 {
03701
03702 H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].Emis->ots =
03703 H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].Emis->Aul * H2popHi *
03704 H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].Emis->Pdest;
03705
03706
03707 RT_OTS_AddLine(
03708 H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].Emis->ots,
03709 H2Lines[iElecHi][iVibHi][iRotHi][iElecLo][iVibLo][iRotLo].ipCont );
03710 }
03711 }
03712 }
03713 }
03714 }
03715 }
03716 }
03717
03718 return;
03719 }
03720
03721