00001
00002
00003
00004 #include "cddefines.h"
00005 #include "taulines.h"
00006 #include "iso.h"
00007 #include "secondaries.h"
00008 #include "lines_service.h"
00009 #include "hydrogenic.h"
00010 #include "dense.h"
00011 #include "atmdat.h"
00012 #include "rfield.h"
00013 #include "phycon.h"
00014 #include "geometry.h"
00015 #include "radius.h"
00016 #include "lines.h"
00017
00018 void lines_hydro(void)
00019 {
00020 long int i, nelem, ipHi, ipLo;
00021 double hbetab,
00022 em ,
00023 EmisFac,
00024 pump ,
00025 caseb;
00026 char chLabel[5]=" ";
00027
00028 DEBUG_ENTRY( "lines_hydro()" );
00029
00030
00031 i = StuffComment( "H-like iso-sequence" );
00032 linadd( 0., (float)i , "####", 'i');
00033
00034
00035 linadd(MAX2(0.,iso.xLineTotCool[ipH_LIKE][ipHYDROGEN]),912,"Clin",'c');
00036
00037
00038 linadd(MAX2(0.,-iso.xLineTotCool[ipH_LIKE][ipHYDROGEN]),912,"Hlin",'h');
00039
00040
00041
00042
00043
00044
00045
00046 linadd(MAX2(0.,iso.cLya_cool[ipH_LIKE][ipHYDROGEN]),1216,"Cool",'i');
00047
00048
00049 linadd(MAX2(0.,-iso.cLya_cool[ipH_LIKE][ipHYDROGEN]),1216,"Heat",'i');
00050
00051
00052 linadd(MAX2(0.,iso.cLyrest_cool[ipH_LIKE][ipHYDROGEN]),960,"Crst",'i');
00053
00054
00055 linadd(MAX2(0.,-iso.cLyrest_cool[ipH_LIKE][ipHYDROGEN]),960,"Hrst",'i');
00056
00057
00058 linadd(MAX2(0.,iso.cBal_cool[ipH_LIKE][ipHYDROGEN]),4861,"Crst",'i');
00059
00060
00061 linadd(MAX2(0.,-iso.cBal_cool[ipH_LIKE][ipHYDROGEN]),4861,"Hrst",'i');
00062
00063
00064 linadd(MAX2(0.,iso.cRest_cool[ipH_LIKE][ipHYDROGEN]),0,"Crst",'i');
00065
00066
00067 linadd(MAX2(0.,-iso.cRest_cool[ipH_LIKE][ipHYDROGEN]),0,"Hrst",'i');
00068
00069
00070 secondaries.SecHIonMax = MAX2( secondaries.SecHIonMax , secondaries.sec2total );
00071
00072
00073 atmdat.HIonFracMax = MAX2( atmdat.HIonFracMax, atmdat.HIonFrac);
00074
00075
00076 hydro.HCollIonMax =
00077 (float)MAX2( hydro.HCollIonMax , hydro.H_ion_frac_collis );
00078
00079
00080 linadd(secondaries.x12tot*dense.xIonDense[ipHYDROGEN][1]*iso.Pop2Ion[ipH_LIKE][ipHYDROGEN][ipH1s]*1.634e-11,1216,"LA X" ,'i');
00081
00082
00083
00084
00085 pump = (double)(EmisLines[ipH_LIKE][ipHYDROGEN][4][ipH1s].pump*iso.Pop2Ion[ipH_LIKE][ipHYDROGEN][ipH1s]*
00086 dense.xIonDense[ipHYDROGEN][1]*4.09e-12*0.4836);
00087 linadd(pump,4861,"Pump",'r');
00088
00089
00090
00091 linadd(MAX2(0.,iso.coll_ion[ipH_LIKE][ipHYDROGEN]),0,"CION",'c');
00092
00093
00094 linadd(MAX2(-iso.coll_ion[ipH_LIKE][ipHYDROGEN],0.),0,"3bHt",'h');
00095
00096
00097 linadd(dense.xIonDense[ipHYDROGEN][1]*iso.Pop2Ion[ipH_LIKE][ipHYDROGEN][ipH2p]*0.*hydro.pestrk[ipH2p][ipH1s]*1.634e-11,
00098 1216,"Strk",'i');
00099
00100
00101 linadd(dense.xIonDense[ipHYDROGEN][1]*iso.Pop2Ion[ipH_LIKE][ipHYDROGEN][3]*hydro.pestrk[3][2]*3.025e-12,
00102 6563,"Strk",'i');
00103
00104
00105 linadd(dense.xIonDense[ipHYDROGEN][1]*iso.Pop2Ion[ipH_LIKE][ipHYDROGEN][4]*hydro.pestrk[4][2]*4.084e-12,
00106 4861,"Strk",'i');
00107
00108
00109 linadd(dense.xIonDense[ipHYDROGEN][1]*iso.Pop2Ion[ipH_LIKE][ipHYDROGEN][4]*hydro.pestrk[4][3]*1.059e-12,
00110 18751,"Strk",'i');
00111
00112
00113
00114
00115
00116 if( iso.numLevels_max[ipH_LIKE][ipHYDROGEN] > 5 )
00117 linadd(dense.xIonDense[ipHYDROGEN][1]*iso.Pop2Ion[ipH_LIKE][ipHYDROGEN][5]*hydro.pestrk[5][4]*4.900e-13,
00118 40512,"Strk",'i');
00119
00120
00121
00122 ASSERT( LineSave.ipass <1 ||
00123 EmisLines[ipH_LIKE][ipHYDROGEN][ipH2p][ipH1s].ots>= 0.);
00124
00125 linadd(EmisLines[ipH_LIKE][ipHYDROGEN][ipH2p][ipH1s].ots*EmisLines[ipH_LIKE][ipHYDROGEN][ipH2p][ipH1s].EnergyErg, 1216,"Dest",'i');
00126
00127
00128
00129
00130 if( iso.numLevels_max[ipH_LIKE][ipHYDROGEN] > 3 )
00131 linadd(EmisLines[ipH_LIKE][ipHYDROGEN][3][ipH2s].ots*EmisLines[ipH_LIKE][ipHYDROGEN][3][ipH2s].EnergyErg, 6563,"Dest",'i');
00132
00133
00134
00135
00136 if( iso.numLevels_max[ipH_LIKE][ipHYDROGEN] > 5 )
00137 linadd(EmisLines[ipH_LIKE][ipHYDROGEN][5][4].ots*EmisLines[ipH_LIKE][ipHYDROGEN][5][4].EnergyErg,40516, "Dest",'i');
00138
00139
00140
00141
00142 if( iso.numLevels_max[ipH_LIKE][ipHYDROGEN] > 4 )
00143 linadd(EmisLines[ipH_LIKE][ipHYDROGEN][4][ipH2s].ots*EmisLines[ipH_LIKE][ipHYDROGEN][4][ipH2s].EnergyErg, 4861,"Dest",'i');
00144
00145
00146
00147
00148 if( iso.numLevels_max[ipH_LIKE][ipHYDROGEN] > 4 )
00149 linadd(EmisLines[ipH_LIKE][ipHYDROGEN][4][3].ots*EmisLines[ipH_LIKE][ipHYDROGEN][4][3].EnergyErg ,18751, "Dest",'i');
00150
00151
00152 linadd(iso.Pop2Ion[ipH_LIKE][ipHYDROGEN][ipH2p]*dense.xIonDense[ipHYDROGEN][1]*EmisLines[ipH_LIKE][ipHYDROGEN][ipH2p][ipH1s].Aul*
00153 hydro.dstfe2lya*EmisLines[ipH_LIKE][ipHYDROGEN][ipH2p][ipH1s].EnergyErg , 1216 , "Fe 2" , 'i' );
00154
00155
00156
00157 if( hydro.lgHydEmiss )
00158 {
00159
00160 EmisFac = 1.;
00161 }
00162 else
00163 {
00164 EmisFac = dense.xIonDense[ipHYDROGEN][1]*dense.eden;
00165 }
00166
00167
00168 linadd(iso.RadRec_caseB[ipH_LIKE][ipHYDROGEN]*EmisFac*1.64e-11,1216,"Ca B",'i');
00169
00170
00171 if( nzone == 1 )
00172 {
00173
00174 caseb = rfield.qhtot*
00175 atmdat_HS_caseB( 4 , 2 , 1 , phycon.te , dense.eden, 'b' ) / iso.RadRec_caseB[ipH_LIKE][ipHYDROGEN];
00176
00177
00178 if( caseb < 0 )
00179 {
00180 caseb = rfield.qhtot*4.75e-13;
00181 }
00182 LineSv[LineSave.nsum].sumlin[LineSave.lgLineEmergent] = 0.;
00183 }
00184 else
00185 {
00186 caseb = 0.;
00187 }
00188
00189
00190 linadd( caseb/radius.dVeff*geometry.covgeo , 4861 , "Q(H)" , 'i' );
00191
00192 if( nzone == 1 )
00193 {
00194 caseb = rfield.qhtot*EmisLines[ipH_LIKE][ipHYDROGEN][ipH2p][ipH1s].EnergyErg;
00195 LineSv[LineSave.nsum].sumlin[LineSave.lgLineEmergent] = 0.;
00196 }
00197 else
00198 {
00199 caseb = 0.;
00200 }
00201
00202
00203 linadd( caseb/radius.dVeff*geometry.covgeo , 1216 , "Q(H)" , 'i' );
00204
00205
00206 for( nelem=0; nelem < LIMELM; nelem++ )
00207 {
00208 if( hydro.lgHydEmiss )
00209 {
00210
00211
00212 for( nelem=0; nelem < LIMELM; nelem++ )
00213 {
00214 if( dense.lgElmtOn[nelem] )
00215 {
00216
00217
00218 for( ipHi=ipH2s; ipHi < iso.numLevels_max[ipH_LIKE][nelem]; ipHi++ )
00219 {
00220 for( ipLo=ipH1s; ipLo < ipHi; ipLo++ )
00221 {
00222
00223 EmisLines[ipH_LIKE][nelem][ipHi][ipLo].phots =
00224 EmisLines[ipH_LIKE][nelem][ipHi][ipLo].Aul*
00225 EmisLines[ipH_LIKE][nelem][ipHi][ipLo].PopHi*
00226 EmisLines[ipH_LIKE][nelem][ipHi][ipLo].Pesc*
00227 dense.xIonDense[nelem][nelem+1];
00228
00229
00230 EmisLines[ipH_LIKE][nelem][ipHi][ipLo].xIntensity =
00231 (double)EmisLines[ipH_LIKE][nelem][ipHi][ipLo].Aul*
00232 (double)EmisLines[ipH_LIKE][nelem][ipHi][ipLo].PopHi*
00233 (double)EmisLines[ipH_LIKE][nelem][ipHi][ipLo].Pesc*
00234 (double)EmisLines[ipH_LIKE][nelem][ipHi][ipLo].EnergyErg/dense.eden;
00235
00236 }
00237 }
00238 }
00239 }
00240 }
00241
00242 else
00243 {
00244
00245 for( nelem=0; nelem < LIMELM; nelem++ )
00246 {
00247 if( dense.lgElmtOn[nelem] )
00248 {
00249
00250
00251 for( ipHi=ipH2s; ipHi < iso.numLevels_max[ipH_LIKE][nelem]; ipHi++ )
00252 {
00253 for( ipLo=ipH1s; ipLo < ipHi; ipLo++ )
00254 {
00255 EmisLines[ipH_LIKE][nelem][ipHi][ipLo].phots =
00256 EmisLines[ipH_LIKE][nelem][ipHi][ipLo].Aul*
00257 EmisLines[ipH_LIKE][nelem][ipHi][ipLo].PopHi*
00258 EmisLines[ipH_LIKE][nelem][ipHi][ipLo].Pesc*
00259 dense.xIonDense[nelem][nelem+1];
00260
00261
00262
00263
00264 EmisLines[ipH_LIKE][nelem][ipHi][ipLo].xIntensity =
00265 (double)EmisLines[ipH_LIKE][nelem][ipHi][ipLo].Aul*
00266 (double)EmisLines[ipH_LIKE][nelem][ipHi][ipLo].PopHi*
00267 (double)EmisLines[ipH_LIKE][nelem][ipHi][ipLo].Pesc*
00268 (double)dense.xIonDense[nelem][nelem+1]*
00269 (double)EmisLines[ipH_LIKE][nelem][ipHi][ipLo].EnergyErg;
00270
00271 }
00272 }
00273 }
00274 }
00275 }
00276 }
00277
00278 nelem = 0;
00279 ipLo = 0;
00280 ipHi = 1;
00281 # if 0
00282 fprintf(ioQQQ,"%.2e %.2e %.2e %.2e %.2e %.2e \n",
00283 iso.Pop2Ion[ipH_LIKE][ipHYDROGEN][ipH2s] , EmisLines[ipH_LIKE][nelem][ipHi][ipLo].PopHi,
00284 8.23, EmisLines[ipH_LIKE][nelem][ipHi][ipLo].Aul*EmisLines[ipH_LIKE][nelem][ipHi][ipLo].Pesc,
00285 1.634e-11, EmisLines[ipH_LIKE][nelem][ipHi][ipLo].EnergyErg );
00286 fprintf(ioQQQ,"%.2e %.2e \n",
00287 dense.xIonDense[ipHYDROGEN][1]*iso.Pop2Ion[ipH_LIKE][ipHYDROGEN][ipH2s]*8.23*1.634e-11,
00288 EmisLines[ipH_LIKE][nelem][ipHi][ipLo].xIntensity );
00289 # endif
00290
00291
00292
00293 for( nelem=0; nelem < LIMELM; nelem++ )
00294 {
00295 if( dense.IonHigh[nelem] == nelem + 1 )
00296 {
00297
00298
00299
00300
00301 for( ipHi=3; ipHi < iso.numLevels_max[ipH_LIKE][nelem]; ipHi++ )
00302 {
00303 EmisLines[ipH_LIKE][nelem][ipHi][ipH2s].xIntensity +=
00304 EmisLines[ipH_LIKE][nelem][ipHi][ipH2p].xIntensity;
00305
00306
00307 EmisLines[ipH_LIKE][nelem][ipHi][ipH2p].xIntensity = 0.;
00308 }
00309 }
00310 }
00311
00312
00313 hbetab = (double)((pow(10.,-20.89 - 0.10612*POW2(phycon.alogte - 4.4)))/
00314 phycon.te);
00315
00316
00317
00318 ASSERT( iso.numLevels_max[ipH_LIKE][ipHYDROGEN] > 4 );
00319
00320 if( !hydro.lgHydEmiss )
00321 {
00322 hbetab *= dense.xIonDense[ipHYDROGEN][1]*dense.eden;
00323 }
00324
00325 lindst(hbetab,4861,"CaBo",EmisLines[ipH_LIKE][ipHYDROGEN][4][2].ipCont,'i',false);
00326
00327 if( dense.lgElmtOn[ipHELIUM] )
00328 {
00329
00330
00331
00332 ASSERT( iso.numLevels_max[ipHE_LIKE][ipHELIUM] > 4 );
00333
00334 em = 2.03e-20/(phycon.te70*phycon.te10*phycon.te03);
00335 if( !hydro.lgHydEmiss )
00336 {
00337 em *= dense.xIonDense[ipHELIUM][2]*dense.eden;
00338 }
00339
00340
00341 lindst(em,1640,"CaBo",EmisLines[ipH_LIKE][ipHELIUM][3][2].ipCont,'i',false);
00342
00343
00344
00345 em = 2.52e-20/(pow(phycon.te,1.05881));
00346 if( !hydro.lgHydEmiss )
00347 {
00348 em *= dense.xIonDense[ipHELIUM][2]*dense.eden;
00349 }
00350 lindst(em,4686,"CaBo",EmisLines[ipH_LIKE][ipHELIUM][4][3].ipCont,'i',false);
00351 }
00352
00353
00354
00355 if( LineSave.ipass <= 0 )
00356 {
00357 for(nelem=0; nelem<HS_NZ; ++nelem )
00358 {
00359 atmdat.lgHCaseBOK[0][nelem] = true;
00360 atmdat.lgHCaseBOK[1][nelem] = true;
00361 }
00362 }
00363
00364 for( nelem=0; nelem < LIMELM; nelem++ )
00365 {
00366 if( dense.lgElmtOn[nelem] )
00367 {
00368
00369
00370
00371 if( nelem < HS_NZ && (nelem<2 || nelem>4) )
00372 {
00373 int iCase;
00374 for( iCase=0; iCase<2; ++iCase )
00375 {
00376 char chAB[2]={'A','B'};
00377 char chLab[5]="Ca ";
00378
00379
00380
00381
00382
00383 for( ipLo=1+iCase; ipLo<MIN2(6,iso.numLevels_max[ipH_LIKE][nelem]); ++ipLo )
00384 {
00385 for( ipHi=ipLo+1; ipHi< MIN2(ipLo+5,iso.numLevels_max[ipH_LIKE][nelem]); ++ipHi )
00386 {
00387 float wl;
00388 long int ipCHi , ipCLo;
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399 hbetab = atmdat_HS_caseB( ipHi,ipLo , nelem+1, phycon.te , dense.eden, chAB[iCase] );
00400 if( hbetab<=0. )
00401 {
00402 atmdat.lgHCaseBOK[iCase][nelem] = false;
00403 hbetab = 0.;
00404 }
00405
00406
00407 if( !hydro.lgHydEmiss )
00408 {
00409 hbetab *= dense.xIonDense[nelem][nelem+1]*dense.eden;
00410 }
00411
00412
00413 if( iCase==0 && ipLo==1 )
00414 {
00415 wl = EmisLines[ipH_LIKE][nelem][ipHi][0].WLAng;
00416
00417 ipCHi = ipHi;
00418 ipCLo = 0;
00419 }
00420 else
00421 {
00422 wl = EmisLines[ipH_LIKE][nelem][ipHi][ipLo].WLAng;
00423
00424 ipCHi = ipHi;
00425 ipCLo = ipLo;
00426 }
00427
00428
00429 chLab[3] = chAB[iCase];
00430
00431
00432
00433 lindst(hbetab,wl,chLab,EmisLines[ipH_LIKE][nelem][ipCHi][ipCLo].ipCont,'i',false );
00434 }
00435 }
00436 }
00437 }
00438
00439
00440
00441
00442
00443 if( LineSave.ipass == 0 )
00444 {
00445
00446
00447
00448 chIonLbl(chLabel, &EmisLines[ipH_LIKE][nelem][ipH2s][ipH1s]);
00449 }
00450 linadd( EmisLines[ipH_LIKE][nelem][ipH2s][ipH1s].xIntensity , 0,chLabel,'r');
00451
00452
00453 linadd(
00454 iso.Pop2Ion[ipH_LIKE][nelem][ipH2s]*
00455 dense.xIonDense[nelem][nelem+1]*
00456 iso.TwoNu_induc_dn[ipH_LIKE][nelem]*
00457 EmisLines[ipH_LIKE][nelem][ipH2s][ipH1s].EnergyErg,
00458 22, chLabel ,'i');
00459
00460
00461
00462 for( ipLo=ipH1s; ipLo < MIN2(50,iso.numLevels_max[ipH_LIKE][nelem]-1); ipLo++ )
00463 {
00464
00465 if( ipLo==ipH2p )
00466 continue;
00467
00468
00469
00470
00471
00472 for( ipHi=ipLo+1; ipHi < MIN2(50,iso.numLevels_max[ipH_LIKE][nelem]-1); ipHi++ )
00473 {
00474
00475
00476 if( EmisLines[ipH_LIKE][nelem][ipHi][ipLo].ipCont < 1 )
00477 continue;
00478
00479 PutLine(&EmisLines[ipH_LIKE][nelem][ipHi][ipLo]);
00480 }
00481 }
00482 }
00483 }
00484
00485 DEBUG_EXIT( "LineSet1()" );
00486 return;
00487 }
00488