00001
00002
00003
00004 #include "cddefines.h"
00005 #include "taulines.h"
00006 #include "dense.h"
00007 #include "phycon.h"
00008 #include "ligbar.h"
00009 #include "thermal.h"
00010 #include "lines_service.h"
00011 #include "embesq.h"
00012 #include "atoms.h"
00013 #include "cooling.h"
00014 #include "nitro.h"
00015
00016
00017
00018
00019
00020
00021 static const int N1_SIZE = 10;
00022
00023 static const double aNI[N1_SIZE] = {2.755e-5,4.123e-5,7.536e-6,1.486e-5,4.516e-5,
00024 -2.935e-6,4.000e-6,3.751e-6,-2.176e-6,1.024e-5};
00025 static const double bNI[N1_SIZE] = {-8.150e-8,-1.220e-7,-2.226e-8,-4.390e-8,-1.130e-7,
00026 8.000e-9,-1.1447e-8,-1.061e-8,5.610e-9,-3.227e-8};
00027 static const double cNI[N1_SIZE] = {2.140e-4,3.272e-4,-4.944e-6,3.473e-6,-8.772e-4,
00028 1.654e-3,1.675e-3,1.123e-3,3.867e-3,3.376e-4};
00029
00030 static double NI[6][6][3];
00031
00032
00033 STATIC double xNI_coll_stren(int ipLo, int ipHi)
00034 {
00035
00036
00037
00038 double CS;
00039
00040
00041
00042
00043 int ipLoTayal=-1, ipHiTayal=-1;
00044
00045
00046 if(ipLo >= ipHi)
00047 return( -1. );
00048
00049
00050 if(ipLo < 1 || ipHi > 5)
00051 return( -1. );
00052
00053 int ipTayalOrder[6]={0,1,3,2,4,5};
00054 ipLoTayal = ipTayalOrder[ipLo];
00055 ipHiTayal = ipTayalOrder[ipHi];
00056
00057 if( ipLo==2 && ipHi==3 )
00058 {
00059 ipLoTayal = 2;
00060 ipHiTayal = 3;
00061 }
00062
00063 static bool lgMustInit = true;
00064 if( lgMustInit )
00065 {
00066 lgMustInit = false;
00067
00068 for(long i=0; i<6; i++)
00069 {
00070 for(long j=0; j<6; j++)
00071 {
00072 set_NaN(NI[i][j][0]);
00073 set_NaN(NI[i][j][1]);
00074 set_NaN(NI[i][j][2]);
00075 }
00076 }
00077
00078
00079
00080 int index = 0;
00081 for(int i=1; i<6; i++)
00082 {
00083 for(int j=i+1; j<6; j++)
00084 {
00085 NI[i][j][0] = aNI[index];
00086 NI[i][j][1] = bNI[index];
00087 NI[i][j][2] = cNI[index];
00088 index++;
00089 }
00090 }
00091 }
00092
00093 # ifdef PRINT
00094
00095 for(long i=1; i<6; i++)
00096 {
00097 for(long j=i+1; j<6; j++)
00098 {
00099 printf("NI %i%i a:%e ", i, j, NI[i][j][0]);
00100 printf("%i%i b:%e\n", i, j, NI[i][j][1]);
00101
00102 }
00103 }
00104 # endif
00105
00106 double temp_max = 50e3;
00107 double temp_min = 0;
00108 double temp = phycon.te;
00109 temp = MAX2(temp, temp_min);
00110 temp = MIN2(temp, temp_max);
00111
00112 CS = NI[ipLoTayal][ipHiTayal][0]*phycon.te + NI[ipLoTayal][ipHiTayal][1]*phycon.te32 +
00113 NI[ipLoTayal][ipHiTayal][2]*phycon.sqrte;
00114
00115 return CS;
00116 }
00117
00118
00119 void CoolNitr(void)
00120 {
00121 realnum p2;
00122 double a21,
00123 a31,
00124 a32,
00125 cs,
00126 cs2s2p,
00127 cs2s3p,
00128 cs21,
00129 cs31,
00130 cs32,
00131 p3;
00132 long int i;
00133
00134 double a12,
00135 a13,
00136 a14,
00137 a15,
00138 a23,
00139 a24,
00140 a25,
00141 a34,
00142 a35,
00143 a45,
00144 cs12,
00145 cs13,
00146 cs14,
00147 cs15,
00148 cs23,
00149 cs24,
00150 cs25,
00151 cs34,
00152 cs35,
00153 cs45;
00154
00155 double pop[5];
00156
00157 DEBUG_ENTRY( "CoolNitr()" );
00158
00159 static const double gN1[5]={4.,6.,4.,2.,4.};
00160 static const double exN1[4]={19224.464,8.713,9605.74,0.386};
00161
00162
00163
00164
00165
00166
00167 cs12 = xNI_coll_stren(1, 2);
00168 a12 = 7.57e-6;
00169 double a12Tot = a12 + atoms.d5200r;
00170
00171
00172
00173 cs13 = xNI_coll_stren(1, 3);
00174 a13 = 2.03e-5;
00175 double a13Tot = a13 + atoms.d5200r;
00176
00177
00178 cs14 = xNI_coll_stren(1, 4);
00179 a14 = 2.61e-3;
00180
00181
00182 cs15 = xNI_coll_stren(1,5);
00183 a15 = 6.50e-3;
00184
00185
00186
00187
00188
00189 nitro.quench_5200 = (a12+a13) / ((a12Tot+a13Tot) + (cs12 + cs13) * dense.cdsqte);
00190
00191
00192 cs23 = xNI_coll_stren(2, 3);
00193 a23 = 1.07e-8;
00194
00195
00196 cs24 = xNI_coll_stren(2, 4);
00197 a24 = 3.45e-2;
00198
00199
00200 cs25 = xNI_coll_stren(2, 5);
00201 a25 = 6.14e-2;
00202
00203
00204 cs34 = xNI_coll_stren(3, 4);
00205 a34 = 5.27e-2;
00206
00207
00208 cs35 = xNI_coll_stren(3, 5);
00209 a35 = 2.75e-2;
00210
00211
00212 cs45 = xNI_coll_stren(4, 5);
00213 a45 = 9.50e-17;
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224 cs = exp(-11.3423 + 0.8379*min(phycon.alnte,10.82));
00225 PutCS( cs, TauLines[ipNI_pumpIndirect] );
00226 atom_level2( TauLines[ipNI_pumpIndirect] );
00227
00228 static const double csN1_a[NI_NDP] = {
00229 -12.3982, -9.4523, -12.5580, -10.8813, -13.6532, -9.9035, -11.4470, -5.4776, -6.3304
00230 };
00231 static const double csN1_b[NI_NDP] = {
00232 0.7458, 0.3865, 0.7330, 0.6853, 0.7712, 0.3919, 0.6734, 0.1789, 0.1966
00233 };
00234
00235 for( i=0; i < NI_NDP; ++i )
00236 {
00237 cs = exp(csN1_a[i] + csN1_b[i]*min(phycon.alnte,10.82));
00238 PutCS( cs, TauLines[ipNI_pumpDirect[i]] );
00239 atom_level2( TauLines[ipNI_pumpDirect[i]] );
00240 }
00241
00242 double RPI = TauLines[ipNI_pumpIndirect].Emis().pump();
00243 double RPD0 = TauLines[ipNI_pumpDirect[0]].Emis().pump();
00244 double RPD1 = TauLines[ipNI_pumpDirect[1]].Emis().pump();
00245 double RPD2 = TauLines[ipNI_pumpDirect[2]].Emis().pump();
00246 double RPD3 = TauLines[ipNI_pumpDirect[3]].Emis().pump();
00247 double RPD4 = TauLines[ipNI_pumpDirect[4]].Emis().pump();
00248 double RPD5 = TauLines[ipNI_pumpDirect[5]].Emis().pump();
00249 double RPD6 = TauLines[ipNI_pumpDirect[6]].Emis().pump();
00250 double RPD7 = TauLines[ipNI_pumpDirect[7]].Emis().pump();
00251 double RPD8 = TauLines[ipNI_pumpDirect[8]].Emis().pump();
00252
00253
00254
00255 double beta = 0.7955;
00256 double Premove = TauLines[ipNI_pumpIndirect].Emis().Pesc() +
00257 TauLines[ipNI_pumpIndirect].Emis().Pelec_esc() + TauLines[ipNI_pumpIndirect].Emis().Pdest();
00258 RPI *= (1.-beta)/(1.-beta*(1.-Premove));
00259 beta = 0.1384;
00260 Premove = TauLines[ipNI_pumpDirect[0]].Emis().Pesc() +
00261 TauLines[ipNI_pumpDirect[0]].Emis().Pelec_esc() + TauLines[ipNI_pumpDirect[0]].Emis().Pdest();
00262 RPD0 *= (1.-beta)/(1.-beta*(1.-Premove));
00263
00264
00265
00266 double pump14 = 0.0113*RPI + 0.0239*RPD0 + 0.0090*RPD1 + 0.1617*RPD2 + 0.0167*RPD3 + 0.4404*RPD4;
00267 double pump15 = 0.0112*RPI + 0.0265*RPD0 + 0.6253*RPD1 + 0.5108*RPD2 + 0.0824*RPD3 + 0.2588*RPD4;
00268 double pump13 = 0.3441*RPI + 0.8621*RPD0 + 0.0233*RPD1 + 0.0895*RPD2 + 0.1068*RPD3 + 0.1644*RPD4;
00269 double pump12 = 0.0417*RPI + 0.0468*RPD0 + 0.3408*RPD1 + 0.2328*RPD2 + 0.7937*RPD3 + 0.1338*RPD4;
00270
00271 pump14 += 0.4881*RPD5 + 0.0876*RPD6 + 0.0450*RPD7 + 0.1777*RPD8;
00272 pump15 += 0.1569*RPD5 + 0.0484*RPD6 + 0.2240*RPD7 + 0.0854*RPD8;
00273 pump13 += 0.2908*RPD5 + 0.8397*RPD6 + 0.0694*RPD7 + 0.7369*RPD8;
00274 pump12 += 0.0623*RPD5 + 0.0238*RPD6 + 0.6615*RPD7 + 0.0000*RPD8;
00275
00276
00277 nitro.pump5199 = (pump12+pump13+0.9710*pump14+0.9318*pump15) * nitro.quench_5200 *
00278 dense.xIonDense[ipNITROGEN][0] * 3.82e-12;
00279
00280
00281
00282
00283 double eff_recrate_2D = 1.108e-13 * pow(phycon.te*1e-4, -0.6085) /
00284 (1. - 0.0041 * pow(phycon.te*1e-4, -0.3975) );
00285 double eff_recrate_2P = 0.659e-13 * pow(phycon.te*1e-4, -0.6158);
00286 double fac_n1;
00287 if( dense.xIonDense[ipNITROGEN][0] > 0. )
00288 fac_n1 = dense.eden * dense.xIonDense[ipNITROGEN][1] / dense.xIonDense[ipNITROGEN][0];
00289 else
00290 fac_n1 = 0.;
00291
00292
00293 double rec14 = eff_recrate_2P * fac_n1 * 2./6.;
00294 double rec15 = eff_recrate_2P * fac_n1 * 4./6.;
00295 double rec13 = eff_recrate_2D * fac_n1 * 4./10.;
00296 double rec12 = eff_recrate_2D * fac_n1 * 6./10.;
00297
00298
00299 nitro.rec5199 = (rec12+rec13+0.9710*rec14+0.9318*rec15) * nitro.quench_5200 *
00300 dense.xIonDense[ipNITROGEN][0] * 3.82e-12;
00301
00302 pump14 += rec14;
00303 pump15 += rec15;
00304 pump13 += rec13;
00305 pump12 += rec12;
00306
00307 double Cooling , CoolingDeriv;
00308 atom_pop5(gN1,exN1,cs12,cs13,cs14,cs15,cs23,cs24,cs25,cs34,cs35,
00309 cs45,a12Tot,a13Tot,a14,a15,a23,a24,a25,a34,a35,a45,pop,
00310 dense.xIonDense[ipNITROGEN][0], &Cooling , &CoolingDeriv ,
00311 pump12 , pump13 , pump14 , pump15 );
00312
00313 nitro.xN5200 = pop[1]*a12*3.818e-12;
00314 nitro.xN5198 = pop[2]*a13*3.821e-12;
00315 nitro.xN3467 = pop[3]*a14*5.729e-12;
00316 nitro.xN3466 = pop[4]*a15*5.729e-12;
00317 nitro.xN10398 = pop[3]*a24*1.910e-12;
00318 nitro.xN10397 = pop[4]*a25*1.910e-12;
00319 nitro.xN10408 = pop[3]*a34*1.908e-12;
00320 nitro.xN10407 = pop[4]*a35*1.908e-12;
00321
00322
00323 atoms.p2nit = (realnum)(pop[1]+pop[2])/SDIV(dense.xIonDense[ipNITROGEN][0]);
00324
00325
00326 thermal.dCooldT += CoolingDeriv;
00327 CoolAdd("N 1",5199, Cooling );
00328
00329
00330 PutCS(4.1,TauLines[ipT1200]);
00331 atom_level2(TauLines[ipT1200]);
00332
00333
00334 PutCS(5.5,TauLines[ipT1085]);
00335 atom_level2(TauLines[ipT1085]);
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348 a21 = 3.889e-3;
00349 a31 = 0.03140;
00350 a32 = 1.136;
00351
00352
00357 cs21 = 2.722;
00358 cs31 = 0.3162;
00359 cs32 = 0.806;
00360
00361
00362 p3 = atom_pop3( 9.,5.,1., cs21, cs31, cs32, a21, a31, a32 ,
00363
00364 21955.,24982.,&p2,dense.xIonDense[ipNITROGEN][1],0.,0.,0.);
00365
00366 nitro.c5755 = p3*a32*3.46e-12;
00367
00368 nitro.c6584 = p2*a21*3.03e-12;
00369 thermal.dCooldT += nitro.c6584*(2.2e4*thermal.tsq1 - thermal.halfte);
00370 CoolAdd("N 2",5755,nitro.c5755);
00371 CoolAdd("N 2",6584,nitro.c6584);
00372
00373
00374
00375 nitro.xN2_A3_tot = (a31+a32) /(a31+a32 + (cs31+cs32)/1.*dense.cdsqte );
00376 ASSERT( nitro.xN2_A3_tot <= 1. );
00377
00378
00379
00380
00381
00382 cs21 = 0.431;
00383 cs32 = 1.15;
00384 cs31 = 0.273;
00385
00386 PutCS(cs21,TauLines[ipT205]);
00387 PutCS(cs32,TauLines[ipT122]);
00388 PutCS(cs31,*TauDummy);
00389 atom_level3(TauLines[ipT205],TauLines[ipT122],*TauDummy);
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399 cs21 = 1.125;
00400
00401 PutCS(cs21,TauLines[ipT2140]);
00402 atom_level2(TauLines[ipT2140]);
00403
00404
00405
00406 PutCS(7.12,TauLines[ipT990]);
00407 atom_level2(TauLines[ipT990]);
00408
00409
00410
00411
00412
00413 cs = MIN2(1.90,0.2291*phycon.te10*phycon.te10);
00414 PutCS(cs,TauLines[ipT57]);
00415
00416 static vector< pair<TransitionList::iterator,double> > N3Pump;
00417 N3Pump.reserve(32);
00418
00419
00420 if( N3Pump.empty() )
00421 {
00422
00423 pair<TransitionList::iterator,double> ppa( TauLines.begin()+ipT990, 1./6. );
00424 N3Pump.push_back( ppa );
00425 pair<TransitionList::iterator,double> ppb( TauLines.begin()+ipT374g, 1./6. );
00426 N3Pump.push_back( ppb );
00427 pair<TransitionList::iterator,double> ppc( TauLines.begin()+ipT315, 1./6. );
00428 N3Pump.push_back( ppc );
00429 pair<TransitionList::iterator,double> ppd( TauLines.begin()+ipT324, 1./2. );
00430 N3Pump.push_back( ppd );
00431 pair<TransitionList::iterator,double> ppe( TauLines.begin()+ipT333, 2./3. );
00432 N3Pump.push_back( ppe );
00433
00434 for( i=0; i < nWindLine; ++i )
00435 {
00436
00437 if( (*TauLine2[i].Hi()).nelem() == 7 && (*TauLine2[i].Hi()).IonStg() == 3 )
00438 {
00439 # if 0
00440 DumpLine( TauLine2.begin()+i );
00441 # endif
00442 double branch_ratio;
00443
00444
00445 if( fp_equal( (*TauLine2[i].Hi()).g(), realnum(2.) ) )
00446 branch_ratio = 2./3.;
00447 else if( fp_equal( (*TauLine2[i].Hi()).g(), realnum(6.) ) )
00448 branch_ratio = 1./2.;
00449 else if( fp_equal( (*TauLine2[i].Hi()).g(), realnum(10.) ) )
00450 branch_ratio = 1./6.;
00451 else
00452 TotalInsanity();
00453 pair<TransitionList::iterator,double> pp2( TauLine2.begin()+i, branch_ratio );
00454 N3Pump.push_back( pp2 );
00455 }
00456 }
00457 }
00458
00459
00460 double pump_rate = 0.;
00461 vector< pair<TransitionList::iterator,double> >::const_iterator n3p;
00462 for( n3p=N3Pump.begin(); n3p != N3Pump.end(); ++n3p )
00463 {
00464 const TransitionList::iterator t = n3p->first;
00465 double branch_ratio = n3p->second;
00466 pump_rate += (*t).Emis().pump()*branch_ratio;
00467 # if 0
00468 dprintf( ioQQQ, "N III %.3e %.3e\n",
00469 (*t).WLAng , (*t).Emis().pump()*branch_ratio );
00470 # endif
00471 }
00472
00473
00474
00475
00476 AtomSeqBoron(TauLines[ipT57],
00477 TauLines[ipN3_1749],
00478 TauLines[ipN3_1747],
00479 TauLines[ipN3_1754],
00480 TauLines[ipN3_1752],
00481 TauLines[ipN3_1751],
00482 0.201 , 1.088 , 0.668 , 2.044 , pump_rate,"N 3");
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494 if( phycon.te > 1.584e4 )
00495 {
00496 cs = 21.346/(phycon.te10*phycon.te10*phycon.te10*phycon.te02);
00497 }
00498 else
00499 {
00500 cs = 75.221/(phycon.sqrte/phycon.te03/phycon.te02);
00501 }
00502
00503 cs = MAX2(0.01,cs);
00504 PutCS(cs,TauLines[ipT1486]);
00505 AtomSeqBeryllium(.9,.9,3.0,TauLines[ipT1486],.0115);
00506 embesq.em1486 = (realnum)(atoms.PopLevels[3]*0.0115*1.34e-11);
00507
00508
00509
00510
00511
00512
00513
00514 cs = MIN2(4.0,1.864*phycon.te03*phycon.te03);
00515 PutCS(cs,TauLines[ipT765]);
00516 atom_level2(TauLines[ipT765]);
00517
00518
00519
00520 ligbar(7,TauLines[ipT1239],TauLines[ipT209],&cs2s2p,&cs2s3p);
00521 PutCS(cs2s2p,TauLines[ipT1239]);
00522 PutCS(cs2s2p*0.5,TauLines[ipT1243]);
00523 PutCS(1.0,*TauDummy);
00524 atom_level3(TauLines[ipT1243],*TauDummy,TauLines[ipT1239]);
00525
00526
00527
00528 PutCS(cs2s3p,TauLines[ipT209]);
00529 atom_level2(TauLines[ipT209]);
00530 return;
00531 }