00001
00002
00003
00004
00005 #include "cddefines.h"
00006 #include "taulines.h"
00007 #include "doppvel.h"
00008 #include "iso.h"
00009 #include "trace.h"
00010 #include "dense.h"
00011 #include "rt.h"
00012 #include "rfield.h"
00013 #include "phycon.h"
00014 #include "lines_service.h"
00015 #include "thirdparty.h"
00016 #include "atoms.h"
00017
00018
00019 STATIC void oi_level_pops(double abundoi,
00020 double *coloi);
00021
00022
00023 void atom_oi_calc(double *coloi)
00024 {
00025 long int i;
00026 double esin,
00027 eslb,
00028 esoi,
00029 flb,
00030 foi,
00031 opaclb,
00032 opacoi,
00033 tin,
00034 tout,
00035 xlb,
00036 xoi;
00037 static double esab;
00038 static double aoi = TauLines[ipTO1025].Emis->Aul;
00039 static double alb = Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Aul;
00040
00041 DEBUG_ENTRY( "atom_oi_calc()" );
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 if( dense.xIonDense[ipOXYGEN][0] <= 0. )
00053 {
00054 for( i=0; i < 6; i++ )
00055 {
00056 atoms.popoi[i] = 0.;
00057 }
00058
00059 *coloi = 0.;
00060 atoms.pmpo15 = 0.;
00061 atoms.pmpo51 = 0.;
00062 atoms.pmph31 = Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Aul*
00063 (Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pesc +
00064 Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pelec_esc);
00065
00066 atoms.esch31 = Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Aul*
00067 (Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pesc +
00068 Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pelec_esc);
00069
00070
00071 if( trace.lgTr8446 && trace.lgTrace )
00072 {
00073 fprintf( ioQQQ,
00074 " P8446 called for first time, finds A*escape prob 3-1 =%10.2e\n",
00075 atoms.esch31 );
00076 }
00077 return;
00078 }
00079
00080 if( iteration > 1 )
00081 {
00082
00083 tin = TauLines[ipTO1025].Emis->TauIn;
00084 esin = esc_CRDwing_1side(tin,1e-4);
00085 tout = (TauLines[ipTO1025].Emis->TauTot)*0.9 -
00086 TauLines[ipTO1025].Emis->TauIn;
00087
00088 if( trace.lgTr8446 && trace.lgTrace )
00089 {
00090 fprintf( ioQQQ, " P8446 tin, tout=%10.2e%10.2e\n", tin, tout );
00091 }
00092
00093 if( tout > 0. )
00094 {
00095 tout = TauLines[ipTO1025].Emis->TauTot - TauLines[ipTO1025].Emis->TauIn;
00096
00097
00098 esab = 0.5*(esin + esc_CRDwing_1side(tout,1e-4));
00099 }
00100 }
00101 else
00102 {
00103
00104 esab = esc_CRDwing_1side(TauLines[ipTO1025].Emis->TauIn,1e-4);
00105 }
00106
00107 esoi =TauLines[ipTO1025].Emis->Pelec_esc + TauLines[ipTO1025].Emis->Pesc;
00108 eslb =Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pelec_esc +
00109 Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pesc;
00110
00111
00112 if( trace.lgTr8446 && trace.lgTrace )
00113 {
00114 fprintf( ioQQQ,
00115 " P8446 finds Lbeta, OI widths=%10.2e%10.2e and esc prob=%10.2e%10.2e esAB=%10.2e\n",
00116 DoppVel.doppler[0], DoppVel.doppler[7], eslb, esoi, esab );
00117 }
00118
00119
00120 opacoi = 2.92e-9*dense.xIonDense[ipOXYGEN][0]*0.5556/DoppVel.doppler[7];
00121 opaclb = 1.22e-8*dense.xIonDense[ipHYDROGEN][1]*StatesElem[ipH_LIKE][ipHYDROGEN][ipH1s].Pop/DoppVel.doppler[0];
00122
00123
00124 xoi = opacoi/(opacoi + opaclb);
00125 xlb = opaclb/(opacoi + opaclb);
00126
00127
00128 foi = MIN2(DoppVel.doppler[ipHYDROGEN],DoppVel.doppler[ipOXYGEN])/DoppVel.doppler[ipOXYGEN];
00129 flb = MIN2(DoppVel.doppler[ipHYDROGEN],DoppVel.doppler[ipOXYGEN])/DoppVel.doppler[ipHYDROGEN]*
00130 MAX2(0.,1.- TauLines[ipTO1025].Emis->Pelec_esc - TauLines[ipTO1025].Emis->Pesc);
00131
00132 if( trace.lgTr8446 && trace.lgTrace )
00133 {
00134 fprintf( ioQQQ,
00135 " P8446 opac Lb, OI=%10.2e%10.2e X Lb, OI=%10.2e%10.2e FLb, OI=%10.2e%10.2e\n",
00136 opaclb, opacoi, xlb, xoi, flb, foi );
00137 }
00138
00139
00140
00141 if( rfield.lgInducProcess )
00142 {
00143 atoms.pmpo15 = (realnum)(flb*alb*(StatesElem[ipH_LIKE][ipHYDROGEN][ipH3p].Pop*dense.xIonDense[ipHYDROGEN][1])*xoi*(1. - esab)/
00144 dense.xIonDense[ipOXYGEN][0]);
00145
00146 atoms.pmpo51 = (realnum)(aoi*(1. - (1. - foi)*(1. - esoi) - xoi*(1. -
00147 esab)*foi));
00148 }
00149 else
00150 {
00151 atoms.pmpo15 = 0.;
00152 atoms.pmpo51 = 0.;
00153 }
00154
00155
00156 oi_level_pops(dense.xIonDense[ipOXYGEN][0],coloi);
00157
00158
00160
00161
00162
00163 atoms.pmph31 = Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Aul*
00164 (Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pelec_esc + Transitions[ipH_LIKE][ipHYDROGEN][ipH3p][ipH1s].Emis->Pesc);
00165
00166
00167 atoms.esch31 = alb*(eslb*(1. - flb) + esab*flb);
00168
00169
00170 if( trace.lgTr8446 && trace.lgTrace )
00171 {
00172 fprintf( ioQQQ, " P8446 PMPH31=%10.2e EscP3-1%10.2e ESCH31=%10.2e\n",
00173 atoms.pmph31, atoms.pmph31/alb, atoms.esch31/alb );
00174 }
00175
00176
00177
00178
00179
00180 TauLines[ipT1304].Lo->Pop = atoms.popoi[0];
00181 TauLines[ipTO1025].Lo->Pop = atoms.popoi[0];
00182 TauLines[ipT1039].Lo->Pop = atoms.popoi[0];
00183 TauLines[ipT8446].Lo->Pop = atoms.popoi[1];
00184 TauLines[ipT4368].Lo->Pop = atoms.popoi[1];
00185 TauLines[ipTOI13].Lo->Pop = atoms.popoi[2];
00186 TauLines[ipTOI11].Lo->Pop = atoms.popoi[2];
00187 TauLines[ipTOI29].Lo->Pop = atoms.popoi[3];
00188 TauLines[ipTOI46].Lo->Pop = atoms.popoi[4];
00189
00190
00191 TauLines[ipT1304].Hi->Pop = atoms.popoi[1];
00192 TauLines[ipTO1025].Hi->Pop = atoms.popoi[4];
00193 TauLines[ipT1039].Hi->Pop = atoms.popoi[3];
00194 TauLines[ipT8446].Hi->Pop = atoms.popoi[2];
00195 TauLines[ipT4368].Hi->Pop = atoms.popoi[5];
00196 TauLines[ipTOI13].Hi->Pop = atoms.popoi[3];
00197 TauLines[ipTOI11].Hi->Pop = atoms.popoi[4];
00198 TauLines[ipTOI29].Hi->Pop = atoms.popoi[5];
00199 TauLines[ipTOI46].Hi->Pop = atoms.popoi[5];
00200
00201
00202
00204 TauLines[ipT1304].Emis->PopOpc = atoms.popoi[0];
00205 TauLines[ipTO1025].Emis->PopOpc = (atoms.popoi[0] - atoms.popoi[4]*0.6);
00206 TauLines[ipT1039].Emis->PopOpc = (atoms.popoi[0] - atoms.popoi[3]*3.0);
00207
00208
00210 TauLines[ipT8446].Emis->PopOpc =
00211 (MAX2(0.,atoms.popoi[1]-atoms.popoi[2]*.33));
00212 TauLines[ipT4368].Emis->PopOpc = (atoms.popoi[1] - atoms.popoi[5]*.33);
00213 TauLines[ipTOI13].Emis->PopOpc = (atoms.popoi[2] - atoms.popoi[3]*3.0);
00214 TauLines[ipTOI11].Emis->PopOpc = (atoms.popoi[2] - atoms.popoi[4]*0.6);
00215 TauLines[ipTOI29].Emis->PopOpc = (atoms.popoi[3] - atoms.popoi[5]*.33);
00216 TauLines[ipTOI46].Emis->PopOpc = (atoms.popoi[4] - atoms.popoi[5]*1.67);
00217 return;
00218 }
00219
00220
00221 STATIC void oi_level_pops(double abundoi,
00222 double *coloi)
00223 {
00224 bool lgNegPop;
00225
00226 long int i, j;
00227
00228 int32 ipiv[6], ner;
00229
00230 double a21,
00231 a32,
00232 a41,
00233 a43,
00234 a51,
00235 a53,
00236 a62,
00237 a64,
00238 a65,
00239 c12,
00240 c13,
00241 c14,
00242 c15,
00243 c16,
00244 c21,
00245 c23,
00246 c24,
00247 c25,
00248 c26,
00249 c31,
00250 c32,
00251 c34,
00252 c35,
00253 c36,
00254 c41,
00255 c42,
00256 c43,
00257 c45,
00258 c46,
00259 c51,
00260 c52,
00261 c53,
00262 c54,
00263 c56,
00264 c61,
00265 c62,
00266 c63,
00267 c64,
00268 c65,
00269 cs,
00270 deptoi[6],
00271 e12,
00272 e23,
00273 e34,
00274 e45,
00275 e56,
00276 simple;
00277
00278 double amat[6][6],
00279 bvec[6],
00280 zz[7][7];
00281
00282 static realnum g[6]={9.,3.,9.,3.,15.,9};
00283
00284 DEBUG_ENTRY( "oilevl()" );
00285
00286
00287
00288
00289
00290
00291
00292 e12 = rfield.ContBoltz[atoms.ipoiex[0]-1];
00293 e23 = rfield.ContBoltz[atoms.ipoiex[1]-1];
00294 e34 = rfield.ContBoltz[atoms.ipoiex[2]-1];
00295 e45 = rfield.ContBoltz[atoms.ipoiex[3]-1];
00296 e56 = rfield.ContBoltz[atoms.ipoiex[4]-1];
00297
00298
00299 a21 = TauLines[ipT1304].Emis->Aul*(TauLines[ipT1304].Emis->Pdest+ TauLines[ipT1304].Emis->Pesc + TauLines[ipT1304].Emis->Pelec_esc);
00300 a41 = TauLines[ipT1039].Emis->Aul*(TauLines[ipT1039].Emis->Pdest+ TauLines[ipT1039].Emis->Pesc + TauLines[ipT1039].Emis->Pelec_esc);
00301 a51 = TauLines[ipTO1025].Emis->Aul*(TauLines[ipTO1025].Emis->Pdest+ TauLines[ipTO1025].Emis->Pesc + TauLines[ipTO1025].Emis->Pelec_esc);
00302 a51 = atoms.pmpo51;
00303 a32 = TauLines[ipT8446].Emis->Aul*(TauLines[ipT8446].Emis->Pdest+ TauLines[ipT8446].Emis->Pesc + TauLines[ipT8446].Emis->Pelec_esc);
00304 a62 = TauLines[ipT4368].Emis->Aul*(TauLines[ipT4368].Emis->Pdest+ TauLines[ipT4368].Emis->Pesc + TauLines[ipT4368].Emis->Pelec_esc);
00305 a43 = TauLines[ipTOI13].Emis->Aul*(TauLines[ipTOI13].Emis->Pdest+ TauLines[ipTOI13].Emis->Pesc + TauLines[ipTOI13].Emis->Pelec_esc);
00306 a53 = TauLines[ipTOI11].Emis->Aul*(TauLines[ipTOI11].Emis->Pdest+ TauLines[ipTOI11].Emis->Pesc + TauLines[ipTOI11].Emis->Pelec_esc);
00307 a64 = TauLines[ipTOI29].Emis->Aul*(TauLines[ipTOI29].Emis->Pdest+ TauLines[ipTOI29].Emis->Pesc + TauLines[ipTOI29].Emis->Pelec_esc);
00308 a65 = TauLines[ipTOI46].Emis->Aul*(TauLines[ipTOI46].Emis->Pdest+ TauLines[ipTOI46].Emis->Pesc + TauLines[ipTOI46].Emis->Pelec_esc);
00309
00310
00311
00312
00313
00314 cs = 2.151e-5*phycon.te/phycon.te03;
00315 PutCS(cs,&TauLines[ipT1304]);
00316
00317
00318 cs = 9.25e-7*phycon.te*phycon.te10/phycon.te01/phycon.te01;
00319 PutCS(cs,&TauLines[ipTO1025]);
00320 c21 = dense.cdsqte*TauLines[ipT1304].Coll.cs/g[1];
00321 c51 = dense.cdsqte*TauLines[ipTO1025].Coll.cs/g[4];
00322
00323
00324 c31 = dense.cdsqte*1.0/g[2];
00325 PutCS(0.27,&TauLines[ipT1039]);
00326 c41 = dense.cdsqte*TauLines[ipT1039].Coll.cs/g[3];
00327 c61 = dense.cdsqte*1./g[5];
00328
00329 c12 = c21*g[1]/g[0]*e12;
00330 c13 = c31*g[2]/g[0]*e12*e23;
00331 c14 = c41*g[3]/g[0]*e12*e23*e34;
00332 c15 = c51*g[4]/g[0]*e12*e23*e34*e45;
00333 c16 = c61*g[5]/g[0]*e12*e23*e34*e45*e56;
00334
00335 c32 = dense.cdsqte*85./g[2];
00336 c42 = dense.cdsqte*85./g[3];
00337 c52 = dense.cdsqte*85./g[4];
00338 c62 = dense.cdsqte*85./g[5];
00339
00340 c23 = c32*g[2]/g[1]*e23;
00341 c24 = c42*g[3]/g[1]*e23*e34;
00342 c25 = c52*g[4]/g[1]*e23*e34*e45;
00343 c26 = c62*g[5]/g[1]*e23*e34*e45*e56;
00344
00345 c43 = dense.cdsqte*70./g[3];
00346 c53 = dense.cdsqte*312./g[4];
00347 c63 = dense.cdsqte*1./g[5];
00348
00349 c34 = c43*g[3]/g[2]*e34;
00350 c35 = c53*g[4]/g[2]*e34*e45;
00351 c36 = c63*g[5]/g[2]*e34*e45*e56;
00352
00353 c54 = dense.cdsqte*50./g[4];
00354 c64 = dense.cdsqte*415./g[5];
00355
00356 c45 = c54*g[4]/g[3]*e45;
00357 c46 = c64*g[5]/g[3]*e45*e56;
00358
00359 c65 = dense.cdsqte*400./g[5];
00360 c56 = c65*g[5]/g[4]*e56;
00361
00364
00365 simple = (c16 + atoms.pmpo15)/(c61 + c62 + c64 + a65 + a64 + a62);
00366 if( simple < 1e-19 )
00367 {
00368 atoms.popoi[0] = (realnum)abundoi;
00369 for( i=1; i < 6; i++ )
00370 {
00371 atoms.popoi[i] = 0.;
00372 }
00373 *coloi = 0.;
00374 return;
00375 }
00376
00377
00378
00379 for( i=0; i < 6; i++ )
00380 {
00381 zz[i][0] = 1.0;
00382 zz[6][i] = 0.;
00383 }
00384
00385
00386 zz[6][0] = abundoi;
00387
00388
00389 zz[0][1] = -c12;
00390 zz[1][1] = c21 + c23 + c24 + c25 + c26 + a21;
00391 zz[2][1] = -c32 - a32;
00392 zz[3][1] = -c42;
00393 zz[4][1] = -c52;
00394 zz[5][1] = -c62 - a62;
00395
00396
00397 zz[0][2] = -c13;
00398 zz[1][2] = -c23;
00399 zz[2][2] = c31 + c32 + c34 + c35 + c36 + a32;
00400 zz[3][2] = -c43 - a43;
00401 zz[4][2] = -c53 - a53;
00402 zz[5][2] = -c63;
00403
00404
00405 zz[0][3] = -c14;
00406 zz[1][3] = -c24;
00407 zz[2][3] = -c34;
00408 zz[3][3] = c41 + c42 + c43 + c45 + c46 + a41 + a43;
00409 zz[4][3] = -c54;
00410 zz[5][3] = -c64 - a64;
00411
00412
00413 zz[0][4] = -c15 - atoms.pmpo15;
00414 zz[1][4] = -c25;
00415 zz[2][4] = -c35;
00416 zz[3][4] = -c45;
00417 zz[4][4] = c51 + c52 + c53 + c54 + c56 + a51 + a53;
00418 zz[5][4] = -c65 - a65;
00419
00420
00421 zz[0][5] = -c16;
00422 zz[1][5] = -c26;
00423 zz[2][5] = -c36;
00424 zz[3][5] = -c46;
00425 zz[4][5] = -c56;
00426 zz[5][5] = c61 + c62 + c63 + c64 + c65 + a65 + a64 + a62;
00427
00428
00429 for( j=0; j < 6; j++ )
00430 {
00431 for( i=0; i < 6; i++ )
00432 {
00433 amat[i][j] = zz[i][j];
00434 }
00435 bvec[j] = zz[6][j];
00436 }
00437
00438 ner = 0;
00439
00440 getrf_wrapper(6, 6, (double*)amat, 6, ipiv, &ner);
00441 getrs_wrapper('N', 6, 1, (double*)amat, 6, ipiv, bvec, 6, &ner);
00442
00443
00444
00445 if( ner != 0 )
00446 {
00447 fprintf( ioQQQ, " oi_level_pops: dgetrs finds singular or ill-conditioned matrix\n" );
00448 cdEXIT(EXIT_FAILURE);
00449 }
00450
00451
00452
00453 for( i=0; i < 6; i++ )
00454 {
00455 zz[6][i] = bvec[i];
00456 }
00457
00458 lgNegPop = false;
00459 for( i=0; i < 6; i++ )
00460 {
00461 atoms.popoi[i] = (realnum)zz[6][i];
00462 if( atoms.popoi[i] < 0. )
00463 lgNegPop = true;
00464 }
00465
00466
00467
00468 if( trace.lgTrace && trace.lgTr8446 )
00469 {
00470 deptoi[0] = 1.;
00471 deptoi[1] = atoms.popoi[1]/atoms.popoi[0]/(g[1]/g[0]*
00472 e12);
00473 deptoi[2] = atoms.popoi[2]/atoms.popoi[0]/(g[2]/g[0]*
00474 e12*e23);
00475 deptoi[3] = atoms.popoi[3]/atoms.popoi[0]/(g[3]/g[0]*
00476 e12*e23*e34);
00477 deptoi[4] = atoms.popoi[4]/atoms.popoi[0]/(g[4]/g[0]*
00478 e12*e23*e34*e45);
00479 deptoi[5] = atoms.popoi[5]/atoms.popoi[0]/(g[5]/g[0]*
00480 e12*e23*e34*e45*e56);
00481
00482 fprintf( ioQQQ, " oilevl finds levl pop" );
00483 for(i=0; i < 6; i++)
00484 fprintf( ioQQQ, "%11.3e", atoms.popoi[i] );
00485 fprintf( ioQQQ, "\n" );
00486
00487 fprintf( ioQQQ, " oilevl finds dep coef" );
00488 for(i=0; i < 6; i++)
00489 fprintf( ioQQQ, "%11.3e", deptoi[i] );
00490 fprintf( ioQQQ, "\n" );
00491 }
00492
00493
00494 if( lgNegPop )
00495 {
00496 atoms.nNegOI += 1;
00497
00498 fprintf( ioQQQ, " OILEVL finds negative population" );
00499 for(i=0;i < 6; i++)
00500 fprintf( ioQQQ, "%10.2e", atoms.popoi[i] );
00501 fprintf( ioQQQ, "\n" );
00502
00503 fprintf( ioQQQ, " simple 5 =%10.2e\n", simple );
00504
00505 atoms.popoi[5] = 0.;
00506 atoms.popoi[4] = (realnum)(abundoi*(c15 + atoms.pmpo15)/(a51 + a53 +
00507 c51 + c53));
00508 atoms.popoi[3] = 0.;
00509 atoms.popoi[2] = (realnum)(atoms.popoi[4]*(a53 + c53)/(a32 + c32));
00510 atoms.popoi[1] = (realnum)((atoms.popoi[2]*(a32 + c32) + abundoi*
00511 c12)/(a21 + c21));
00512
00513 atoms.popoi[0] = (realnum)abundoi;
00514
00515
00516 }
00517
00518
00519 *coloi =
00520 (atoms.popoi[0]*c12 - atoms.popoi[1]*c21)*1.53e-11 +
00521 (atoms.popoi[0]*c14 - atoms.popoi[3]*c41)*1.92e-11 +
00522 (atoms.popoi[0]*c15 - atoms.popoi[4]*c51)*1.94e-11 +
00523 (atoms.popoi[1]*c23 - atoms.popoi[2]*c32)*2.36e-12 +
00524 (atoms.popoi[1]*c26 - atoms.popoi[5]*c62)*4.55e-12 +
00525 (atoms.popoi[2]*c35 - atoms.popoi[4]*c53)*1.76e-12 +
00526 (atoms.popoi[2]*c34 - atoms.popoi[3]*c43)*1.52e-12 +
00527 (atoms.popoi[3]*c46 - atoms.popoi[5]*c64)*6.86e-13 +
00528 (atoms.popoi[4]*c56 - atoms.popoi[5]*c65)*4.32e-13;
00529
00530 return;
00531 }