00001
00002
00003
00004 #ifndef ISO_H_
00005 #define ISO_H_
00006
00007 #include "two_photon.h"
00008
00010 #include "transition.h"
00011 #include "freebound.h"
00012
00013 extern long int max_num_levels;
00014
00017 #define KILL_BELOW_PLASMA(E_) ( (rfield.lgPlasNu && ((E_)<rfield.plsfrq) ) ? 0.:1. )
00018
00020 #define N_(A_) (iso_sp[ipISO][nelem].st[A_].n())
00021 #define L_(A_) (iso_sp[ipISO][nelem].st[A_].l())
00022 #define S_(A_) (iso_sp[ipISO][nelem].st[A_].S())
00023 #define J_(A_) (iso_sp[ipISO][nelem].st[A_].j())
00024
00027 const int ipH1s = 0;
00028 const int ipH2s = 1;
00029 const int ipH2p = 2;
00030 const int ipH3s = 3;
00031 const int ipH3p = 4;
00032 const int ipH3d = 5;
00033 const int ipH4s = 6;
00034 const int ipH4p = 7;
00035 const int ipH4d = 8;
00036 const int ipH4f = 9;
00037
00040
00041 const int ipHe1s1S = 0;
00042
00043
00044 const int ipHe2s3S = 1;
00045 const int ipHe2s1S = 2;
00046 const int ipHe2p3P0 = 3;
00047 const int ipHe2p3P1 = 4;
00048 const int ipHe2p3P2 = 5;
00049 const int ipHe2p1P = 6;
00050
00051
00052 const int ipHe3s3S = 7;
00053 const int ipHe3s1S = 8;
00054 const int ipHe3p3P = 9;
00055 const int ipHe3d3D = 10;
00056 const int ipHe3d1D = 11;
00057 const int ipHe3p1P = 12;
00058
00062 const int ipH_LIKE = 0;
00063 const int ipHE_LIKE = 1;
00064 const int ipLI_LIKE = 2;
00065 const int ipBE_LIKE = 3;
00066 const int ipB_LIKE = 4;
00067 const int ipC_LIKE = 5;
00068 const int ipN_LIKE = 6;
00069 const int ipO_LIKE = 7;
00070 const int ipF_LIKE = 8;
00071 const int ipNE_LIKE = 9;
00072 const int ipNA_LIKE = 10;
00073 const int ipMG_LIKE = 11;
00074 const int ipAL_LIKE = 12;
00075 const int ipSI_LIKE = 13;
00076 const int ipP_LIKE = 14;
00077 const int ipS_LIKE = 15;
00078 const int ipCL_LIKE = 16;
00079 const int ipAR_LIKE = 17;
00080
00081 enum {
00082 ipSINGLET = 1, ipDOUBLET = 2, ipTRIPLET = 3,
00083 ipMULTIPLET_END, ipMULTIPLET_BEGIN=ipSINGLET
00084 };
00085
00086 #define IPRAD 0
00087 #define IPCOLLIS 1
00088
00089
00090
00091
00094
00095 #define RREC_MAXN 40
00096
00098 #define LIKE_RREC_MAXN( A_ ) ( A_ == ipHELIUM ? 40 : 20 )
00099
00100 #define N_ISO_TE_RECOMB 41
00101
00104 #define SumUpToThisN 1000
00105
00106 #define RECOMBMAGIC (110807)
00107
00112 void iso_cascade( long ipISO, long nelem );
00113
00116 void iso_charge_transfer_update( long nelem );
00117
00122 void iso_collapsed_bnl_print( long ipISO, long nelem );
00123
00128 void iso_collapsed_bnl_set( long ipISO, long nelem );
00129
00134 void iso_collapsed_Aul_update( long ipISO, long nelem );
00135
00140 void iso_collapsed_lifetimes_update( long ipISO, long nelem );
00141
00146 void iso_collide( long ipISO, long nelem );
00147
00152 void iso_collisional_ionization( long ipISO, long nelem );
00153
00158 void iso_continuum_lower( long ipISO , long nelem );
00159
00164 void iso_cool( long ipISO , long nelem );
00165
00168 void iso_create( void );
00169
00179 double iso_cross_section( double ERyd , double EthRyd, long n, long l, long S, long globalZ, long globalISO );
00180
00185 void iso_departure_coefficients( long ipISO, long nelem );
00186
00192 double iso_dielec_recomb_rate( long ipISO, long nelem, long ipLo );
00193
00198 void iso_error_generation( long ipISO, long nelem );
00199
00205 long iso_get_total_num_levels( long ipISO, long nmaxResolved, long numCollapsed );
00206
00209 void IonHydro( );
00210
00215 void iso_ionize_recombine( long ipISO , long nelem );
00216
00221 void iso_level( const long ipISO, const long nelem, double& renorm);
00222
00227 void iso_photo( long ipISO , long nelem );
00228
00234 void iso_prt_pops( long ipISO, long nelem, bool lgPrtDeparCoef );
00235
00245 void iso_put_error( long ipISO, long nelem, long ipHi, long ipLo, long whichData, realnum errorOpt, realnum errorPess);
00246
00251 void iso_radiative_recomb( long ipISO, long nelem );
00252
00257 void iso_radiative_recomb_effective( long ipISO, long nelem );
00258
00266 double iso_recomb_check( long ipISO, long nelem, long level, double temperature );
00267
00270 void iso_recomb_auxiliary_free( void );
00271
00274 void iso_recomb_malloc( void );
00275
00279 void iso_recomb_setup( long ipISO );
00280
00286 double iso_RRCoef_Te( long ipISO, long nelem , long n );
00287
00290 void iso_satellite_update( long nelem );
00291
00292
00293
00294
00295
00296
00297
00298 double iso_state_lifetime( long ipISO, long nelem, long n, long l );
00299
00303 void iso_solve( long ipISO, long nelem, double &maxerr );
00304
00309 void iso_suprathermal( long ipISO, long nelem );
00310
00315 void iso_update_num_levels( long ipISO, long nelem );
00316
00319 void iso_update_rates( void );
00320
00321 void iso_collapsed_update( void );
00322
00323 void iso_set_ion_rates( long ipISO, long nelem);
00324
00325 class t_isoCTRL
00326 {
00327 public:
00328 bool lgPrintNumberOfLevels;
00329
00330 const char *chISO[NISO];
00331
00334 long int nLyman[NISO],
00336 nLyman_malloc[NISO];
00337
00339 bool lgColl_l_mixing[NISO];
00340
00342 bool lgColl_excite[NISO];
00343
00345 bool lgColl_ionize[NISO];
00346
00347 bool lgLTE_levels[NISO];
00348
00351 bool lgCollStrenThermAver;
00352
00355 bool lgInd2nu_On;
00356
00357
00358 bool lgContinuumLoweringEnabled[NISO];
00359
00362 realnum stat_ion[NISO];
00363
00365 bool lgDielRecom[NISO];
00366
00371 realnum SmallA;
00372
00374 int ipLyaRedist[NISO] , ipResoRedist[NISO] , ipSubRedist[NISO];
00375
00377 int nLyaLevel[NISO];
00378
00380 bool lgCompileRecomb[NISO];
00381
00385 bool lgNoRecombInterp[NISO];
00386
00388 bool lgCS_Vriens[NISO] ,
00389 lgCS_None[NISO] ,
00390 lgCS_Vrinceanu[NISO],
00391 lgCS_therm_ave[NISO];
00392 int nCS_new[NISO];
00393
00395 bool lgCritDensLMix[NISO];
00396
00399 bool lgFSM[NISO];
00400
00403 bool lgRandErrGen[NISO];
00404
00405
00406 bool lgPessimisticErrors;
00407
00408 bool lgTopoff[NISO];
00409
00411 int modelRank[NISO];
00412 };
00413
00414 extern t_isoCTRL iso_ctrl;
00415
00416 class extra_tr
00417 {
00418 public:
00420 double pestrk;
00421 double pestrk_up;
00422
00423
00424
00425
00427
00428
00429
00430
00431 realnum Error[3];
00432
00435 realnum ErrorFactor[3];
00436
00438 double SigmaCascadeProb;
00439 };
00440
00441 class t_iso_sp
00442 {
00443 public:
00444 TransitionProxy trans( const long ipHi, const long ipLo )
00445 {
00446 return (*tr)[ ipTrans[ipHi][ipLo] ];
00447 }
00448 multi_arr<long,2> ipTrans;
00449 multi_arr<extra_tr,2> ex;
00450 multi_arr<double,2> CascadeProb;
00451 multi_arr<double,2> BranchRatio;
00452 vector<freeBound> fb;
00453 qList st;
00454 TransitionList* tr;
00455
00461 multi_arr<long,3> QuantumNumbers2Index;
00462
00465 double xIonSimple;
00466
00468 bool lgPrtDepartCoef;
00469
00471 bool lgPrtLevelPops;
00472
00474 bool lgLevelsLowered;
00475
00478 bool lgLevelsEverLowered;
00479
00480
00481 bool lgMustReeval;
00482
00483
00484 bool lgPopsRescaled;
00485
00487 long int nCollapsed_max;
00488 long int nCollapsed_local;
00489
00493 long int numLevels_max;
00494
00498 long int numLevels_local;
00499
00502 long int numLevels_malloc;
00503
00505 long int n_HighestResolved_max;
00507 long int n_HighestResolved_local;
00508
00510 realnum CaseBCheck;
00511
00513 double RadRec_caseB;
00514
00517 double RadRec_effec;
00518
00520 double RecomCollisFrac;
00521
00523 bool lgPopLTE_OK;
00524
00526 double FreeBnd_net_Cool_Rate;
00527
00529 double coll_ion;
00530
00532 double cRest_cool;
00533
00535 double xLineTotCool;
00536
00538 double dLTot;
00539
00541 double RadRecCool;
00542
00544 double cBal_cool;
00545
00547 double cLyrest_cool;
00548
00550 double cLya_cool;
00551
00553 double RecomInducCool_Rate;
00554
00556 char chTypeAtomUsed[10];
00557
00560 bool lgErrGenDone;
00561
00563 double qTot2S;
00564
00565
00566 multi_arr<double,3> bnl_effective;
00567 multi_arr<realnum,3> CachedAs;
00568 void Reset()
00569 {
00570
00571 strcpy( chTypeAtomUsed , "none" );
00572 CaseBCheck = 0.;
00573
00574 RadRec_caseB = 1e-13;
00575 lgLevelsLowered = false;
00576 lgLevelsEverLowered = false;
00577 lgMustReeval = false;
00578 lgPopsRescaled = false;
00579
00580 lgErrGenDone = false;
00581 for( vector<two_photon>::iterator it = TwoNu.begin(); it != TwoNu.end(); ++it )
00582 (*it).Reset();
00583 for( vector<freeBound>::iterator it = fb.begin(); it != fb.end(); ++it )
00584 (*it).Reset();
00585 }
00586 vector<two_photon> TwoNu;
00587
00588 vector<double> HighestLevelOpacStack;
00589 };
00590
00591 extern t_iso_sp iso_sp[NISO][LIMELM];
00592
00594 void iso_renorm( long nelem, long ipISO, double& renorm );
00595
00596 #endif