00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "cddefines.h"
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 #include "elementnames.h"
00063 #include "taulines.h"
00064 #include "phycon.h"
00065 #include "thermal.h"
00066 #include "dense.h"
00067 #include "iso.h"
00068 #include "helike.h"
00069 #include "helike_recom.h"
00070 #include "helike_cs.h"
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 double EionEV[29] =
00099
00100 {24.59077,75.630824,153.881326,259.368529,392.052444,552.033006,739.210311,
00101 953.784316,1195.854925,1464.822296,1761.786269,2085.746968,2437.704271,
00102 2816.658298,3223.608929,3658.556163,4120.500123,4610.440686,5128.377852,
00103 5674.311623,6248.241996,6851.168852,7481.092433,8140.012497,8827.929042,
00104 9543.842191,10288.751823,11058.658422,11868.560169};
00105
00106
00107
00108 void putError(long int nelem,
00109 long int ipHi,
00110 long int ipLo,
00111 long int whichData,
00112 float errorToPut)
00113 {
00114 if( helike.lgRandErrGen )
00115 {
00116
00117 ASSERT( whichData <= 2 );
00118 ASSERT( nelem < LIMELM );
00119 ASSERT( ipHi <= iso.numLevels_max[ipHE_LIKE][nelem] );
00120 ASSERT( ipLo <= iso.numLevels_max[ipHE_LIKE][nelem] );
00121
00122 helike.Error[nelem][ipHi][ipLo][whichData] = errorToPut;
00123 }
00124
00125 return;
00126 }
00127
00128
00129
00130 void HeLike(void)
00131 {
00132 int lowsav , ihisav;
00133
00134 long int ipLo, ipHi, nelem,
00135 ipISO=ipHE_LIKE;
00136 static bool lgFinitePop[LIMELM];
00137 static bool lgMustInit=true;
00138
00139 DEBUG_ENTRY( "HeLike()" );
00140
00141 if( lgMustInit )
00142 {
00143 for( nelem=ipHELIUM; nelem<LIMELM; ++nelem )
00144 lgFinitePop[nelem] = true;
00145 lgMustInit = false;
00146 }
00147
00148
00149
00151 lowsav = dense.IonLow[ipHELIUM];
00152 ihisav = dense.IonHigh[ipHELIUM];
00153 for( nelem=ipHELIUM; nelem < LIMELM; nelem++ )
00154 {
00155
00156 if( dense.lgElmtOn[nelem] )
00157 {
00158
00159
00160 if( (dense.IonHigh[nelem] >= nelem)
00161
00162
00163
00164
00165 && dense.IonLow[nelem] <= nelem )
00166 {
00167
00168
00169 iso_continuum_lower( ipHE_LIKE, nelem );
00170
00171
00172 if( helike.lgRandErrGen && nzone==0 )
00173 {
00174 HeLikeError(nelem);
00175 }
00176
00177
00178
00179 HeRecom(nelem);
00180
00181
00182 HeCollid(nelem);
00183
00184
00185
00186 iso_photo(ipHE_LIKE , nelem );
00187
00188
00189
00190 iso_ionize_recombine( ipHE_LIKE , nelem );
00191
00192
00193 HeLikeLevel(nelem);
00194
00195
00196 lgFinitePop[nelem] = true;
00197 }
00198 else if( lgFinitePop[nelem] )
00199 {
00200
00201
00202 lgFinitePop[nelem] = false;
00203
00204 iso.pop_ion_ov_neut[ipHE_LIKE][nelem] = 0.;
00205 iso.xIonSimple[ipHE_LIKE][nelem] = 0.;
00206
00207
00208 iso.Pop2Ion[ipHE_LIKE][nelem][0] = 0.;
00209 for( ipHi=ipHe2s3S; ipHi < iso.numLevels_max[ipHE_LIKE][nelem]; ipHi++ )
00210 {
00211 iso.Pop2Ion[ipHE_LIKE][nelem][ipHi] = 0.;
00212 for( ipLo=ipHe1s1S; ipLo < ipHi; ipLo++ )
00213 {
00214
00215 EmisLines[ipHE_LIKE][nelem][ipHi][ipLo].PopLo = 0.;
00216 EmisLines[ipHE_LIKE][nelem][ipHi][ipLo].PopHi = 0.;
00217
00218
00219 EmisLines[ipHE_LIKE][nelem][ipHi][ipLo].PopOpc = 0.;
00220 }
00221 }
00222 }
00223
00224 if( dense.lgSetIoniz[nelem] )
00225 {
00226 dense.xIonDense[nelem][nelem+1-ipISO] = dense.SetIoniz[nelem][nelem+1-ipISO]*dense.gas_phase[nelem];
00227 dense.xIonDense[nelem][nelem-ipISO] = dense.SetIoniz[nelem][nelem-ipISO]*dense.gas_phase[nelem];
00228 if( dense.SetIoniz[nelem][nelem+1-ipISO] > SMALLFLOAT )
00229 {
00230 iso.Pop2Ion[ipISO][nelem][ipH1s] = dense.SetIoniz[nelem][nelem-ipISO] / dense.SetIoniz[nelem][nelem+1-ipISO];
00231 EmisLines[ipISO][nelem][iso.nLyaLevel[ipISO]][0].PopLo = dense.SetIoniz[nelem][nelem-ipISO] / dense.SetIoniz[nelem][nelem+1-ipISO];
00232 }
00233 else
00234 {
00235 iso.Pop2Ion[ipISO][nelem][ipH1s] = 0.;
00236 EmisLines[ipISO][nelem][iso.nLyaLevel[ipISO]][0].PopLo = 0.;
00237 }
00238 }
00239 }
00240 }
00241 dense.IonLow[ipHELIUM] = lowsav;
00242 dense.IonHigh[ipHELIUM] = ihisav;
00243
00244 return;
00245 }
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423 void He1Autoionize(void)
00424 {
00425
00426
00427 const int ipHe2s2p1P = 0;
00428
00429
00430 const int ipHe2p2_3P = 3;
00431
00432 double a[4] = {75827., 72116., 74853., 74010.};
00433 double b[4] = {1.8956, 1.9084, 1.9, 1.9021};
00434
00435 long int nelem, ipHi;
00436
00437 for( nelem = ipHELIUM; nelem < LIMELM; nelem++ )
00438 {
00439
00440 if( nelem == ipHELIUM || dense.lgElmtOn[nelem] )
00441 {
00442 for( ipHi = ipHe2s2p1P; ipHi <= ipHe2p2_3P; ipHi++ )
00443 {
00444 He1AutoLines[nelem][ipHi].EnergyWN = (float)(a[ipHi]*pow((double)(nelem+1),b[ipHi]));
00445 }
00446 }
00447 }
00448
00449 return;
00451
00452
00453 }
00454
00455
00456 void AGN_He1_CS( FILE *ioPun )
00457 {
00458
00459 long int i;
00460
00461
00462 const int NTE = 5;
00463 double TeList[NTE] = {6000.,10000.,15000.,20000.,25000.};
00464 double TempSave;
00465
00466 DEBUG_ENTRY( "AGN_He1_CS()" );
00467
00468
00469 fprintf(ioPun, "Te\t2 3s 33s\n");
00470
00471
00472 TempSave = phycon.te;
00473
00474 for( i=0; i<NTE; ++i )
00475 {
00476 phycon.te = TeList[i];
00477 tfidle(false);
00478
00479 fprintf(ioPun , "%.0f\t",
00480 TeList[i] );
00481 fprintf(ioPun , "%.2f\t",
00482 HeCSInterp( 1 , ipHe3s3S , ipHe2s3S, ipELECTRON ) );
00483 fprintf(ioPun , "%.2f\t",
00484 HeCSInterp( 1 , ipHe3p3P , ipHe2s3S, ipELECTRON ) );
00485 fprintf(ioPun , "%.2f\t",
00486 HeCSInterp( 1 , ipHe3d3D , ipHe2s3S, ipELECTRON ) );
00487 fprintf(ioPun , "%.3f\t",
00488 HeCSInterp( 1 , ipHe3d1D , ipHe2s3S, ipELECTRON ) );
00489
00490 fprintf(ioPun , "%.1f\n",
00491 HeCSInterp( 1 , ipHe2p3P0 , ipHe2s3S, ipELECTRON ) +
00492 HeCSInterp( 1 , ipHe2p3P1 , ipHe2s3S, ipELECTRON ) +
00493 HeCSInterp( 1 , ipHe2p3P2 , ipHe2s3S, ipELECTRON ));
00494 }
00495
00496 phycon.te = TempSave;
00497
00498 tfidle(false);
00499
00500 DEBUG_EXIT( "AGN_He1_CS()" );
00501 return;
00502 }
00503
00504
00505
00506 void prt_He_like_DeparCoef(long int nelem )
00507 {
00508 long int in, il, is, i, ipLo, nResolved, ipFirstCollapsed=LONG_MIN;
00509
00510 for( is = 0; is<=1; ++is)
00511 {
00512 char chSpin[2][9]={"singlets","triplets"};
00513
00514 ipFirstCollapsed= iso.numLevels_local[ipHE_LIKE][nelem]-iso.nCollapsed_local[ipHE_LIKE][nelem];
00515 nResolved = iso.quant_desig[ipHE_LIKE][nelem][ipFirstCollapsed-1].n;
00516 ASSERT( nResolved == iso.n_HighestResolved_local[ipHE_LIKE][nelem] );
00517 ASSERT(nResolved > 0 );
00518
00519
00520 fprintf(ioQQQ," He-like %s %s departure\n",
00521 elementnames.chElementSym[nelem],
00522 chSpin[is]);
00523
00524
00525 fprintf(ioQQQ," n\\l=> ");
00526 for( i =0; i < nResolved; ++i)
00527 {
00528 fprintf(ioQQQ,"%2ld ",i);
00529 }
00530 fprintf(ioQQQ,"\n");
00531
00532
00533 for( in = is+1; in <= nResolved; ++in)
00534 {
00535 fprintf(ioQQQ," %2ld ",in);
00536 for( il = 0; il < in; ++il)
00537 {
00538 if( (in==2) && (il==1) && (is==1) )
00539 {
00540 fprintf( ioQQQ,PrintEfmt("%9.2e", iso.DepartCoef[ipHE_LIKE][nelem][ipHe2p3P0]));
00541 fprintf( ioQQQ,PrintEfmt("%9.2e", iso.DepartCoef[ipHE_LIKE][nelem][ipHe2p3P1]));
00542 fprintf( ioQQQ,PrintEfmt("%9.2e", iso.DepartCoef[ipHE_LIKE][nelem][ipHe2p3P2]));
00543 }
00544 else
00545 {
00546 ipLo = QuantumNumbers2Index[nelem][in][il][is];
00547 fprintf( ioQQQ,PrintEfmt("%9.2e", iso.DepartCoef[ipHE_LIKE][nelem][ipLo]));
00548 }
00549 }
00550 fprintf(ioQQQ,"\n");
00551 }
00552 }
00553
00554 for( il = ipFirstCollapsed; il < iso.numLevels_local[ipHE_LIKE][nelem]; ++il)
00555 {
00556 in = iso.quant_desig[ipHE_LIKE][nelem][il].n;
00557
00558
00559 fprintf(ioQQQ," %2ld ",in);
00560 fprintf( ioQQQ,PrintEfmt("%9.2e", iso.DepartCoef[ipHE_LIKE][nelem][il]));
00561 fprintf(ioQQQ,"\n");
00562 }
00563
00564 return;
00565 }
00566
00567
00568 void prt_He_like_Pops(long int nelem )
00569 {
00570 long int in, il, is, i, ipLo, nResolved, ipFirstCollapsed=LONG_MIN;
00571
00572 for( is = 0; is<=1; ++is)
00573 {
00574 char chSpin[2][9]={"singlets","triplets"};
00575
00576 ipFirstCollapsed= iso.numLevels_local[ipHE_LIKE][nelem]-iso.nCollapsed_local[ipHE_LIKE][nelem];
00577 nResolved = iso.quant_desig[ipHE_LIKE][nelem][ipFirstCollapsed-1].n;
00578 ASSERT( nResolved == iso.n_HighestResolved_local[ipHE_LIKE][nelem] );
00579 ASSERT(nResolved > 0 );
00580
00581
00582 fprintf(ioQQQ," He-like %s %s populations\n",
00583 elementnames.chElementSym[nelem],
00584 chSpin[is]);
00585
00586
00587 fprintf(ioQQQ," n\\l=> ");
00588 for( i =0; i < nResolved; ++i)
00589 {
00590 fprintf(ioQQQ,"%2ld ",i);
00591 }
00592 fprintf(ioQQQ,"\n");
00593
00594
00595 for( in = is+1; in <= nResolved; ++in)
00596 {
00597 fprintf(ioQQQ," %2ld ",in);
00598
00599 for( il = 0; il < in; ++il)
00600 {
00601 if( (in==2) && (il==1) && (is==1) )
00602 {
00603 fprintf( ioQQQ,PrintEfmt("%9.2e", iso.Pop2Ion[ipHE_LIKE][nelem][ipHe2p3P0]));
00604 fprintf( ioQQQ,PrintEfmt("%9.2e", iso.Pop2Ion[ipHE_LIKE][nelem][ipHe2p3P1]));
00605 fprintf( ioQQQ,PrintEfmt("%9.2e", iso.Pop2Ion[ipHE_LIKE][nelem][ipHe2p3P2]));
00606 }
00607 else
00608 {
00609 ipLo = QuantumNumbers2Index[nelem][in][il][is];
00610 fprintf( ioQQQ,PrintEfmt("%9.2e", iso.Pop2Ion[ipHE_LIKE][nelem][ipLo]));
00611 }
00612 }
00613 fprintf(ioQQQ,"\n");
00614 }
00615 }
00616
00617 for( il = ipFirstCollapsed; il < iso.numLevels_local[ipHE_LIKE][nelem]; ++il)
00618 {
00619 in = iso.quant_desig[ipHE_LIKE][nelem][il].n;
00620
00621 fprintf(ioQQQ," %2ld ",in);
00622 fprintf( ioQQQ,PrintEfmt("%9.2e", iso.Pop2Ion[ipHE_LIKE][nelem][il]));
00623 fprintf(ioQQQ,"\n");
00624 }
00625
00626 return;
00627 }
00628
00629
00630
00631
00632