37 char chL[21]={
'S',
'P',
'D',
'F',
'G',
'H',
'I',
'K',
'L',
'M',
'N',
'O',
'Q',
'R',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z'};
44 static int nCalled = 0;
73 (*TauDummy).AddHiState();
74 (*TauDummy).AddLoState();
75 (*TauDummy).AddLine2Stack();
83 for(
long nelem=ipISO; nelem <
LIMELM; nelem++ )
94 double EnergyRydGround = 0.;
98 double EnergyWN, EnergyRyd;
102 EnergyRyd = HIonPoten/
POW2((
double)
N_(ipHi));
117 iso_sp[ipISO][nelem].
fb[ipHi].xIsoLevNIonRyd = EnergyRyd;
119 EnergyRydGround = EnergyRyd;
120 iso_sp[ipISO][nelem].
st[ipHi].energy().set(EnergyRydGround-EnergyRyd);
123 for( ipLo=0; ipLo < ipHi; ipLo++ )
126 iso_sp[ipISO][nelem].
fb[ipHi].xIsoLevNIonRyd);
134 EnergyWN = -1.0 * EnergyWN;
139 ASSERT(
iso_sp[ipISO][nelem].trans(ipHi,ipLo).EnergyWN() >= 0.);
140 ASSERT(
iso_sp[ipISO][nelem].trans(ipHi,ipLo).EnergyErg() >= 0.);
141 ASSERT(
iso_sp[ipISO][nelem].trans(ipHi,ipLo).EnergyK() >= 0.);
153 iso_sp[ipISO][nelem].trans(ipHi,ipLo).EnergyWN()/
155 ASSERT(
iso_sp[ipISO][nelem].trans(ipHi,ipLo).WLAng() > 0.);
201 for(
long nelem=ipISO; nelem <
LIMELM; nelem++ )
233 ASSERT(
iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().Aul() > 0.);
266 iso_sp[ipISO][nelem].trans(ipHi,ipLo).EnergyWN(),
267 iso_sp[ipISO][nelem].st[ipHi].
g()));
268 ASSERT(
iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().gf() > 0.);
273 iso_sp[ipISO][nelem].trans(ipHi,ipLo).EnergyWN(),
274 iso_sp[ipISO][nelem].st[ipLo].
g()));
275 ASSERT(
iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().opacity() > 0.);
296 for( ipLo=
ipHe1s1S; ipLo<ipHi; ipLo++ )
321 for(
long nelem=ipISO; nelem <
LIMELM; nelem++ )
327 iso_sp[ipISO][nelem].
st[0].lifetime() = -FLT_MAX;
333 for( ipLo=0; ipLo < ipHi; ipLo++ )
342 iso_sp[ipISO][nelem].
st[ipHi].lifetime() = 1./
iso_sp[ipISO][nelem].
st[ipHi].lifetime();
344 for( ipLo=0; ipLo < ipHi; ipLo++ )
346 if(
iso_sp[ipISO][nelem].trans(ipHi,ipLo).EnergyWN() <= 0. )
353 (1.f/
iso_sp[ipISO][nelem].st[ipHi].lifetime())/
356 ASSERT(
iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().dampXvel()> 0.);
369 for(
long nelem = ipISO; nelem <
LIMELM; nelem++ )
390 for(
long nelem=ipISO; nelem <
LIMELM; ++nelem )
396 for(
long ipLo=0; ipLo < ipHi; ++ipLo )
398 iso_sp[ipISO][nelem].
ex[ipHi][ipLo].pestrk = 0.;
399 iso_sp[ipISO][nelem].
ex[ipHi][ipLo].pestrk_up = 0.;
421 for(
long nelem=ipISO; nelem <
LIMELM; nelem++ )
427 iso_sp[ipISO][nelem].
st[ipHi].Pop() = 0.;
428 iso_sp[ipISO][nelem].
fb[ipHi].Reset();
462 for(
long nelem=ipISO; nelem <
LIMELM; ++nelem )
499 for(
long i1 = 0; i1 < i; ++i1 )
543 for(
long nelem=ipISO; nelem <
LIMELM; ++nelem )
567 for(
long nelem=0; nelem < ipISO; ++nelem )
576 for(
long nelem=ipISO; nelem <
LIMELM; ++nelem )
597 for(
long nelem=ipISO; nelem <
LIMELM; ++nelem )
606 unsigned int nLine = 0;
626 unsigned int nTransition=0;
629 for(
long ipLo=0; ipLo < ipHi; ipLo++ )
634 Transitions[ipISO][nelem][nTransition].setHi(ipHi);
635 Transitions[ipISO][nelem][nTransition].setLo(ipLo);
646 unsigned int nExtraLyman = 0;
668 for(
long nelem=ipISO; nelem <
LIMELM; ++nelem )
672 long ion = nelem - ipISO;
673 ASSERT( ion >= 0 && ion <= nelem );
674 char chLabel[6] = {
'\0'}, chTemp[4] = {
'\0'};
676 if( chLabel[1]==
' ' )
681 sprintf( chTemp,
"+" );
683 sprintf( chTemp,
"+%li", ion );
684 strcat( chLabel, chTemp );
724 for( il = 0L; il < in; ++il )
726 iso_sp[ipISO][nelem].
st[i].n() = in;
727 iso_sp[ipISO][nelem].
st[i].S() = is;
728 iso_sp[ipISO][nelem].
st[i].l() = il;
729 iso_sp[ipISO][nelem].
st[i].j() = -1;
738 iso_sp[ipISO][nelem].
st[level].n() = in;
739 iso_sp[ipISO][nelem].
st[level].S() = -LONG_MAX;
740 iso_sp[ipISO][nelem].
st[level].l() = -LONG_MAX;
741 iso_sp[ipISO][nelem].
st[level].j() = -1;
743 for( il = 0; il < in; ++il )
755 ASSERT( (in > 0) && (in < (
iso_sp[ipISO][nelem].n_HighestResolved_max +
iso_sp[ipISO][nelem].nCollapsed_max + 1) ) );
760 for( il = 0L; il < in; ++il )
762 ASSERT(
iso_sp[ipISO][nelem].st[
iso_sp[ipISO][nelem].QuantumNumbers2Index[in][il][is] ].n() == in );
763 if( in <=
iso_sp[ipISO][nelem].n_HighestResolved_max )
767 ASSERT(
iso_sp[ipISO][nelem].st[
iso_sp[ipISO][nelem].QuantumNumbers2Index[in][il][is] ].l() == il );
768 ASSERT(
iso_sp[ipISO][nelem].st[
iso_sp[ipISO][nelem].QuantumNumbers2Index[in][il][is] ].
S() == is );
787 for( il = 0L; il < in; ++il )
789 for( is = 3L; is >= 1L; is -= 2 )
794 if( (il == 1L) && (is == 1L) )
797 if( (in == 1L) && (is == 3L) )
803 iso_sp[ipISO][nelem].
st[i].n() = in;
804 iso_sp[ipISO][nelem].
st[i].S() = is;
805 iso_sp[ipISO][nelem].
st[i].l() = il;
807 iso_sp[ipISO][nelem].
st[i].j() = il;
812 else if( (in == 2) && (il == 1) && (is == 3) )
817 iso_sp[ipISO][nelem].
st[i].n() = in;
818 iso_sp[ipISO][nelem].
st[i].S() = is;
819 iso_sp[ipISO][nelem].
st[i].l() = il;
820 iso_sp[ipISO][nelem].
st[i].j() = ij;
829 iso_sp[ipISO][nelem].
st[i].n() = in;
830 iso_sp[ipISO][nelem].
st[i].S() = is;
831 iso_sp[ipISO][nelem].
st[i].l() = il;
832 iso_sp[ipISO][nelem].
st[i].j() = -1L;
841 iso_sp[ipISO][nelem].
st[i].n() = in;
842 iso_sp[ipISO][nelem].
st[i].S() = 1L;
843 iso_sp[ipISO][nelem].
st[i].l() = 1L;
844 iso_sp[ipISO][nelem].
st[i].j() = 1L;
853 iso_sp[ipISO][nelem].
st[level].n() = in;
854 iso_sp[ipISO][nelem].
st[level].S() = -LONG_MAX;
855 iso_sp[ipISO][nelem].
st[level].l() = -LONG_MAX;
856 iso_sp[ipISO][nelem].
st[level].j() = -1;
858 for( il = 0; il < in; ++il )
860 for( is = 1; is <= 3; is += 2 )
873 ASSERT( (in > 0) && (in < (
iso_sp[ipISO][nelem].n_HighestResolved_max +
iso_sp[ipISO][nelem].nCollapsed_max + 1) ) );
878 for( il = 0L; il < in; ++il )
880 for( is = 3L; is >= 1; is -= 2 )
883 if( (in == 1L) && (is == 3L) )
886 ASSERT(
iso_sp[ipISO][nelem].st[
iso_sp[ipISO][nelem].QuantumNumbers2Index[in][il][is] ].n() == in );
887 if( in <=
iso_sp[ipISO][nelem].n_HighestResolved_max )
891 ASSERT(
iso_sp[ipISO][nelem].st[
iso_sp[ipISO][nelem].QuantumNumbers2Index[in][il][is] ].l() == il );
892 ASSERT(
iso_sp[ipISO][nelem].st[
iso_sp[ipISO][nelem].QuantumNumbers2Index[in][il][is] ].
S() == is );
902 for(
long nelem=ipISO; nelem <
LIMELM; nelem++ )
909 iso_sp[ipISO][nelem].
st[ipLo].nelem() = (int)(nelem+1);
910 iso_sp[ipISO][nelem].
st[ipLo].IonStg() = (int)(nelem+1-ipISO);
912 if(
iso_sp[ipISO][nelem].st[ipLo].j() >= 0 )
914 iso_sp[ipISO][nelem].
st[ipLo].g() = 2.f*
iso_sp[ipISO][nelem].
st[ipLo].j()+1.f;
916 else if(
iso_sp[ipISO][nelem].st[ipLo].l() >= 0 )
918 iso_sp[ipISO][nelem].
st[ipLo].g() = (2.f*
iso_sp[ipISO][nelem].
st[ipLo].l()+1.f) *
919 iso_sp[ipISO][nelem].st[ipLo].
S();
933 char chConfiguration[11] =
" ";
934 long nCharactersWritten = 0;
939 if(
iso_sp[ipISO][nelem].st[ipLo].n() >
iso_sp[ipISO][nelem].n_HighestResolved_max )
941 nCharactersWritten = sprintf( chConfiguration,
"n=%3li",
942 iso_sp[ipISO][nelem].st[ipLo].n() );
944 else if(
iso_sp[ipISO][nelem].st[ipLo].j() > 0 )
946 nCharactersWritten = sprintf( chConfiguration,
"%3li^%li%c_%li",
947 iso_sp[ipISO][nelem].st[ipLo].n(),
948 iso_sp[ipISO][nelem].st[ipLo].
S(),
950 iso_sp[ipISO][nelem].st[ipLo].j() );
954 nCharactersWritten = sprintf( chConfiguration,
"%3li^%li%c",
955 iso_sp[ipISO][nelem].st[ipLo].n(),
956 iso_sp[ipISO][nelem].st[ipLo].
S(),
960 ASSERT( nCharactersWritten <= 10 );
961 chConfiguration[10] =
'\0';
963 strncpy(
iso_sp[ipISO][nelem].st[ipLo].chConfig(), chConfiguration, 10 );
971 #if defined(__ICC) && defined(__i386)
972 #pragma optimization_level 1
981 (*(*t).Hi()).nelem() = (int)(nelem+1);
982 (*(*t).Hi()).IonStg() = (int)(nelem+1-ipISO);
984 (*(*t).Hi()).n() = nHi;
990 Enerwn =
iso_sp[ipISO][nelem].
fb[0].xIsoLevNIonRyd *
RYD_INF * ( 1. - 1./
POW2((
double)nHi) );
993 (*t).EnergyWN() = (
realnum)(Enerwn);
995 (*(*t).Hi()).energy().set( Enerwn,
"cm^-1" );
1006 Aul = (1.508e10) / pow((
double)nHi,2.975);
1014 Aul = 1.375E10 * pow((
double)nelem, 3.9) / pow((
double)nHi,3.1);
1018 (*t).Emis().Aul() = (
realnum)Aul;
1022 (*t).Emis().dampXvel() = (
realnum)( 1.f / (*(*t).Hi()).lifetime() /
PI4 / (*t).EnergyWN() );
1026 (*t).Emis().gf() = (
realnum)(
GetGF((*t).Emis().Aul(), (*t).EnergyWN(), (*(*t).Hi()).
g()));
1029 (*t).Emis().opacity() = (
realnum)(
abscf((*t).Emis().gf(), (*t).EnergyWN(), (*(*t).Lo()).
g()));
1032 (*t).ipCont() = INT_MIN;
1033 (*t).Emis().ipFine() = INT_MIN;
1039 enum {DEBUG_LOC=
false};
1042 fprintf(
ioQQQ,
"%li\t%li\t%.2e\t%.2e\n",
1046 (*t).Emis().opacity()
1058 double tau, t0, eps2;
1063 double mu = (m*M)/(M+m);
1065 long Z = nelem + 1 - ipISO;
1072 eps2 = 1. - ( l*l + l + 8./47. - (l+1.)/69./n ) /
POW2( (
double)n );
1074 t0 = 3. *
H_BAR * pow( (
double)n, 5.) /
1076 POW2( (m + M)/(Z*m + z*
M) );
1078 tau = t0 * ( 1. - eps2 ) /
1079 ( 1. + 19./88.*( (1./eps2 - 1.) * log( 1. - eps2 ) + 1. -
1080 0.5 * eps2 - 0.025 * eps2 * eps2 ) );
1087 tau *= 1.1722 * pow( (
double)nelem, 0.1 );
1104 long int i, j, ipLo, ipHi;
1109 memset( SumAPerN, 0, (
iso_sp[ipISO][nelem].n_HighestResolved_max +
iso_sp[ipISO][nelem].nCollapsed_max + 1 )*
sizeof(
double ) );
1115 iso_sp[ipISO][nelem].
fb[0].SigmaAtot = 0.;
1116 iso_sp[ipISO][nelem].
ex[0][0].SigmaCascadeProb = 0.;
1138 iso_sp[ipISO][nelem].
fb[ipHi].SigmaAtot = 0.;
1139 iso_sp[ipISO][nelem].
ex[ipHi][ipHi].SigmaCascadeProb = 0.;
1146 for( ipLo=ipLoStart; ipLo<ipHi; ipLo++ )
1151 for( ipLo=ipLoStart; ipLo<ipHi; ipLo++ )
1164 ASSERT(
iso_sp[ipISO][nelem].BranchRatio[ipHi][ipLo] <= 1.0000001 );
1171 ASSERT(
iso_sp[ipISO][nelem].trans(ipHi,ipLo).EnergyWN() > 0. ||
1178 iso_sp[ipISO][nelem].
fb[ipHi].SigmaAtot +=
1180 (
double)
iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().Aul(), 2. );
1187 iso_sp[ipISO][nelem].
fb[ipHi].SigmaAtot = sqrt(
iso_sp[ipISO][nelem].fb[ipHi].SigmaAtot );
1191 for( i=0; i<ipHi; i++ )
1193 for( ipLo=0; ipLo<=i; ipLo++ )
1201 for( ipLo=0; ipLo<ipHi; ipLo++ )
1203 double SigmaCul = 0.;
1204 for( i=ipLo; i<ipHi; i++ )
1209 double SigmaA =
iso_sp[ipISO][nelem].
ex[ipHi][i].Error[
IPRAD] *
1212 pow(SigmaA*
iso_sp[ipISO][nelem].CascadeProb[i][ipLo]*
iso_sp[ipISO][nelem].st[ipHi].lifetime(), 2.) +
1213 pow(
iso_sp[ipISO][nelem].fb[ipHi].SigmaAtot*
iso_sp[ipISO][nelem].BranchRatio[ipHi][i]*
1214 iso_sp[ipISO][nelem].CascadeProb[i][ipLo]*
iso_sp[ipISO][nelem].st[ipHi].lifetime(), 2.) +
1215 pow(
iso_sp[ipISO][nelem].
ex[i][ipLo].SigmaCascadeProb*
iso_sp[ipISO][nelem].BranchRatio[ipHi][i], 2.);
1218 SigmaCul = sqrt(SigmaCul);
1219 iso_sp[ipISO][nelem].
ex[ipHi][ipLo].SigmaCascadeProb = SigmaCul;
1228 enum {DEBUG_LOC=
false};
1252 fprintf(
ioQQQ,
"Bm(n,%ld,%ld;%ld)\n",hi_l,hi_s,ipLo);
1253 fprintf(
ioQQQ,
"m\t2\t\t3\t\t4\t\t5\t\t6\n");
1258 if( (
iso_sp[ipISO][nelem].st[ipHi].l() == 1) && (
iso_sp[ipISO][nelem].st[ipHi].
S() == 3) )
1260 fprintf(
ioQQQ,
"\n%ld\t",
iso_sp[ipISO][nelem].st[ipHi].n());
1263 for( i = ipLo; i<=ipHi; i++)
1265 if( (
iso_sp[ipISO][nelem].st[i].l() == hi_l) && (
iso_sp[ipISO][nelem].st[i].
S() == hi_s) )
1280 fprintf(
ioQQQ,
"%2.4e\t",Bm);
1286 fprintf(
ioQQQ,
"%2.4e\t",Bm);
1293 fprintf(
ioQQQ,
"\n\n");
1307 enum {DEBUG_LOC=
false};
1312 fprintf(
ioQQQ,
"n %ld\t lifetime %.4e\n", i, 1./SumAPerN[i]);
1331 for(
long nelem = ipISO; nelem <
LIMELM; nelem++ )
1347 ((
iso_sp[ipISO-1][nelem].fb[0].xIsoLevNIonRyd -
iso_sp[ipISO-1][nelem].fb[1].xIsoLevNIonRyd) -
1348 (
iso_sp[ipISO][nelem].fb[1].xIsoLevNIonRyd-
iso_sp[ipISO][nelem].fb[i].xIsoLevNIonRyd)) );
1350 (*tr).EnergyWN() = 1.e8f /
1356 (*tr).Emis().iRedisFun() =
ipCRDW;
1358 (*(*tr).Hi()).nelem() = nelem + 1;
1359 (*(*tr).Hi()).IonStg() = nelem + 1 - ipISO;
1361 (*(*tr).Hi()).
g() = 2.f;
1365 (*tr).Emis().PopOpc() =
1366 (*(*tr).Lo()).Pop();
1368 (*tr).Emis().pump() = 0.;
1380 double ConBoltz, LTE_pop=
SMALLFLOAT+FLT_EPSILON, factor1, ConvLTEPOP;
1393 (*tr).Emis().phots() =
1396 (*tr).Emis().xIntensity() =
1397 (*tr).Emis().phots() *
1398 ERG1CM * (*tr).EnergyWN();
1420 LTE_pop = (*(*tr).Hi()).
g() * ConBoltz * ConvLTEPOP;
1423 LTE_pop =
max( LTE_pop, 1e-30f );
1426 (*tr).Emis().Aul() = (
realnum)(dr_rate/LTE_pop);
1427 (*tr).Emis().Aul() =
1436 max( 1e-20f, (*tr).Emis().gf() );
1440 (*tr).Emis().PopOpc() =
1441 (*(*tr).Lo()).Pop() -
1442 (*(*tr).Hi()).Pop() *
1443 (*(*tr).Lo()).
g()/(*(*tr).Hi()).
g();
1445 (*tr).Emis().opacity() =
1448 (*(*tr).Lo()).
g()));
1451 double lifetime = 1e-10;
1453 (*tr).Emis().dampXvel() = (
realnum)(
1454 (1.f/lifetime)/
PI4/(*tr).EnergyWN());
1466 long tot_num_levels;
1473 tot_num_levels = (long)( nmaxResolved * 0.5 *( nmaxResolved + 1 ) ) + numCollapsed;
1477 tot_num_levels = nmaxResolved*nmaxResolved + nmaxResolved + 1 + numCollapsed;
1482 return tot_num_levels;
1490 ASSERT(
iso_sp[ipISO][nelem].n_HighestResolved_max >= 3 );
1495 if(
iso_sp[ipISO][nelem].numLevels_max >
iso_sp[ipISO][nelem].numLevels_malloc )
1497 fprintf(
ioQQQ,
"The number of levels for ipISO %li, nelem %li, has been increased since the initial coreload.\n",
1499 fprintf(
ioQQQ,
"This cannot be done.\n" );
1521 double bnl_array[4][3][4][10] = {
1525 {6.13E-01, 2.56E-01, 1.51E-01, 2.74E-01, 3.98E-01, 4.98E-01, 5.71E-01, 6.33E-01, 7.28E-01, 9.59E-01},
1526 {1.31E+00, 5.17E-01, 2.76E-01, 4.47E-01, 5.87E-01, 6.82E-01, 7.44E-01, 8.05E-01, 9.30E-01, 1.27E+00},
1527 {1.94E+00, 7.32E-01, 3.63E-01, 5.48E-01, 6.83E-01, 7.66E-01, 8.19E-01, 8.80E-01, 1.02E+00, 1.43E+00},
1528 {2.53E+00, 9.15E-01, 4.28E-01, 6.16E-01, 7.42E-01, 8.13E-01, 8.60E-01, 9.22E-01, 1.08E+00, 1.56E+00}
1531 {5.63E-01, 2.65E-01, 1.55E-01, 2.76E-01, 3.91E-01, 4.75E-01, 5.24E-01, 5.45E-01, 5.51E-01, 5.53E-01},
1532 {1.21E+00, 5.30E-01, 2.81E-01, 4.48E-01, 5.80E-01, 6.62E-01, 7.05E-01, 7.24E-01, 7.36E-01, 7.46E-01},
1533 {1.81E+00, 7.46E-01, 3.68E-01, 5.49E-01, 6.78E-01, 7.51E-01, 7.88E-01, 8.09E-01, 8.26E-01, 8.43E-01},
1534 {2.38E+00, 9.27E-01, 4.33E-01, 6.17E-01, 7.38E-01, 8.05E-01, 8.40E-01, 8.65E-01, 8.92E-01, 9.22E-01}
1537 {2.97E-01, 2.76E-01, 2.41E-01, 3.04E-01, 3.66E-01, 4.10E-01, 4.35E-01, 4.48E-01, 4.52E-01, 4.53E-01},
1538 {5.63E-01, 5.04E-01, 3.92E-01, 4.67E-01, 5.39E-01, 5.85E-01, 6.10E-01, 6.20E-01, 6.23E-01, 6.23E-01},
1539 {7.93E-01, 6.90E-01, 4.94E-01, 5.65E-01, 6.36E-01, 6.79E-01, 7.00E-01, 7.09E-01, 7.11E-01, 7.11E-01},
1540 {1.04E+00, 8.66E-01, 5.62E-01, 6.31E-01, 7.01E-01, 7.43E-01, 7.63E-01, 7.71E-01, 7.73E-01, 7.73E-01}
1546 {6.70E-02, 2.93E-02, 1.94E-02, 4.20E-02, 7.40E-02, 1.12E-01, 1.51E-01, 1.86E-01, 2.26E-01, 3.84E-01},
1547 {2.39E-01, 1.03E-01, 6.52E-02, 1.31E-01, 2.11E-01, 2.91E-01, 3.61E-01, 4.17E-01, 4.85E-01, 8.00E-01},
1548 {4.26E-01, 1.80E-01, 1.10E-01, 2.09E-01, 3.18E-01, 4.15E-01, 4.93E-01, 5.54E-01, 6.34E-01, 1.04E+00},
1549 {6.11E-01, 2.55E-01, 1.51E-01, 2.74E-01, 3.99E-01, 5.02E-01, 5.80E-01, 6.41E-01, 7.30E-01, 1.21E+00}
1552 {6.79E-02, 3.00E-02, 2.00E-02, 4.30E-02, 7.48E-02, 1.11E-01, 1.44E-01, 1.70E-01, 1.87E-01, 1.96E-01},
1553 {2.40E-01, 1.04E-01, 6.62E-02, 1.32E-01, 2.11E-01, 2.87E-01, 3.51E-01, 3.98E-01, 4.32E-01, 4.58E-01},
1554 {4.26E-01, 1.81E-01, 1.11E-01, 2.10E-01, 3.17E-01, 4.12E-01, 4.89E-01, 5.53E-01, 6.14E-01, 6.84E-01},
1555 {6.12E-01, 2.55E-01, 1.51E-01, 2.73E-01, 3.97E-01, 4.98E-01, 5.77E-01, 6.51E-01, 7.82E-01, 1.18E+00}
1558 {4.98E-02, 3.47E-02, 2.31E-02, 4.54E-02, 7.14E-02, 9.37E-02, 1.08E-01, 1.13E-01, 1.13E-01, 1.11E-01},
1559 {1.75E-01, 1.16E-01, 7.36E-02, 1.36E-01, 2.01E-01, 2.50E-01, 2.76E-01, 2.84E-01, 2.81E-01, 2.77E-01},
1560 {3.38E-01, 1.97E-01, 1.18E-01, 2.13E-01, 3.06E-01, 3.72E-01, 4.06E-01, 4.15E-01, 4.10E-01, 4.04E-01},
1561 {6.01E-01, 2.60E-01, 1.53E-01, 2.76E-01, 3.95E-01, 4.87E-01, 5.45E-01, 5.76E-01, 5.93E-01, 6.05E-01}
1567 {1.77E-01, 3.59E-01, 1.54E-01, 2.75E-01, 3.98E-01, 4.94E-01, 5.51E-01, 5.68E-01, 5.46E-01, 4.97E-01},
1568 {4.09E-01, 7.23E-01, 2.83E-01, 4.48E-01, 5.89E-01, 6.78E-01, 7.22E-01, 7.30E-01, 7.07E-01, 6.65E-01},
1569 {6.40E-01, 1.02E+00, 3.74E-01, 5.49E-01, 6.85E-01, 7.63E-01, 7.98E-01, 8.03E-01, 7.84E-01, 7.53E-01},
1570 {8.70E-01, 1.28E+00, 4.42E-01, 6.17E-01, 7.44E-01, 8.13E-01, 8.42E-01, 8.46E-01, 8.34E-01, 8.13E-01}
1573 {1.78E-01, 3.62E-01, 1.55E-01, 2.73E-01, 3.91E-01, 4.73E-01, 5.10E-01, 5.04E-01, 4.70E-01, 4.32E-01},
1574 {4.08E-01, 7.26E-01, 2.83E-01, 4.45E-01, 5.79E-01, 6.54E-01, 6.78E-01, 6.64E-01, 6.30E-01, 5.98E-01},
1575 {6.37E-01, 1.03E+00, 3.73E-01, 5.46E-01, 6.75E-01, 7.40E-01, 7.57E-01, 7.43E-01, 7.15E-01, 6.92E-01},
1576 {8.65E-01, 1.28E+00, 4.41E-01, 6.14E-01, 7.35E-01, 7.92E-01, 8.05E-01, 7.95E-01, 7.74E-01, 7.59E-01}
1579 {2.07E-01, 3.73E-01, 1.73E-01, 2.85E-01, 4.03E-01, 4.76E-01, 5.06E-01, 5.03E-01, 4.84E-01, 4.63E-01},
1580 {4.32E-01, 7.13E-01, 3.06E-01, 4.54E-01, 5.81E-01, 6.44E-01, 6.59E-01, 6.49E-01, 6.28E-01, 6.11E-01},
1581 {6.40E-01, 9.85E-01, 3.98E-01, 5.53E-01, 6.74E-01, 7.27E-01, 7.36E-01, 7.26E-01, 7.10E-01, 6.98E-01},
1582 {8.38E-01, 1.21E+00, 4.67E-01, 6.20E-01, 7.34E-01, 7.79E-01, 7.87E-01, 7.79E-01, 7.69E-01, 7.63E-01}
1588 {9.31E-02, 3.96E-01, 1.36E-01, 2.74E-01, 3.99E-01, 4.95E-01, 5.52E-01, 5.70E-01, 5.48E-01, 4.96E-01},
1589 {2.25E-01, 8.46E-01, 2.49E-01, 4.46E-01, 5.89E-01, 6.79E-01, 7.23E-01, 7.31E-01, 7.08E-01, 6.64E-01},
1590 {3.59E-01, 1.24E+00, 3.30E-01, 5.47E-01, 6.85E-01, 7.63E-01, 7.98E-01, 8.04E-01, 7.85E-01, 7.53E-01},
1591 {4.93E-01, 1.60E+00, 3.91E-01, 6.15E-01, 7.44E-01, 8.13E-01, 8.42E-01, 8.47E-01, 8.35E-01, 8.12E-01}
1594 {9.32E-02, 3.99E-01, 1.35E-01, 2.72E-01, 3.91E-01, 4.75E-01, 5.14E-01, 5.09E-01, 4.73E-01, 4.31E-01},
1595 {2.25E-01, 8.49E-01, 2.49E-01, 4.44E-01, 5.79E-01, 6.56E-01, 6.81E-01, 6.68E-01, 6.31E-01, 5.96E-01},
1596 {3.58E-01, 1.25E+00, 3.29E-01, 5.44E-01, 6.76E-01, 7.42E-01, 7.60E-01, 7.46E-01, 7.16E-01, 6.91E-01},
1597 {4.92E-01, 1.60E+00, 3.90E-01, 6.12E-01, 7.36E-01, 7.93E-01, 8.07E-01, 7.97E-01, 7.74E-01, 7.58E-01}
1600 {1.13E-01, 4.21E-01, 1.47E-01, 2.83E-01, 4.04E-01, 4.80E-01, 5.13E-01, 5.12E-01, 4.93E-01, 4.71E-01},
1601 {2.52E-01, 8.56E-01, 2.61E-01, 4.50E-01, 5.82E-01, 6.48E-01, 6.66E-01, 6.56E-01, 6.35E-01, 6.16E-01},
1602 {3.85E-01, 1.23E+00, 3.41E-01, 5.49E-01, 6.75E-01, 7.30E-01, 7.41E-01, 7.31E-01, 7.15E-01, 7.02E-01},
1603 {5.14E-01, 1.56E+00, 4.01E-01, 6.15E-01, 7.34E-01, 7.82E-01, 7.90E-01, 7.83E-01, 7.72E-01, 7.65E-01}
1608 double temps[4] = {5000., 10000., 15000., 20000. };
1609 double log_dens[3] = {2., 4., 6.};
1618 ASSERT( (ipTe >=0) && (ipTe < 3) );
1619 ASSERT( (ipDens >=0) && (ipDens < 2) );
1623 for(
long lHi=0; lHi<nHi; lHi++ )
1625 for(
long sHi=1; sHi<4; sHi++ )
1627 if( ipISO ==
ipH_LIKE && sHi != 2 )
1629 else if( ipISO ==
ipHE_LIKE && sHi != 1 && sHi != 3 )
1632 double bnl_at_lo_den, bnl_at_hi_den, bnl;
1633 double bnl_max, bnl_min, temp, dens;
1635 long ipL =
MIN2(9,lHi);
1660 temp =
MIN2( temps[3], temp );
1663 dens =
MIN2( log_dens[2], dens );
1669 if( temp < temps[0] && dens < log_dens[0] )
1670 bnl = bnl_array[ip1][0][0][ipL];
1671 else if( temp < temps[0] && dens >= log_dens[2] )
1672 bnl = bnl_array[ip1][2][0][ipL];
1673 else if( temp >= temps[3] && dens < log_dens[0] )
1674 bnl = bnl_array[ip1][0][3][ipL];
1675 else if( temp >= temps[3] && dens >= log_dens[2] )
1676 bnl = bnl_array[ip1][2][3][ipL];
1679 bnl_at_lo_den = ( temp - temps[ipTe]) / (temps[ipTe+1] - temps[ipTe]) *
1680 (bnl_array[ip1][ipDens][ipTe+1][ipL] - bnl_array[ip1][ipDens][ipTe][ipL]) + bnl_array[ip1][ipDens][ipTe][ipL];
1682 bnl_at_hi_den = ( temp - temps[ipTe]) / (temps[ipTe+1] - temps[ipTe]) *
1683 (bnl_array[ip1][ipDens+1][ipTe+1][ipL] - bnl_array[ip1][ipDens+1][ipTe][ipL]) + bnl_array[ip1][ipDens+1][ipTe][ipL];
1685 bnl = ( dens - log_dens[ipDens]) / (log_dens[ipDens+1] - log_dens[ipDens]) *
1686 (bnl_at_hi_den - bnl_at_lo_den) + bnl_at_lo_den;
1691 bnl_max =
MAX4( bnl_array[ip1][ipDens][ipTe+1][ipL], bnl_array[ip1][ipDens+1][ipTe+1][ipL],
1692 bnl_array[ip1][ipDens][ipTe][ipL], bnl_array[ip1][ipDens+1][ipTe][ipL] );
1693 ASSERT( bnl <= bnl_max );
1695 bnl_min =
MIN4( bnl_array[ip1][ipDens][ipTe+1][ipL], bnl_array[ip1][ipDens+1][ipTe+1][ipL],
1696 bnl_array[ip1][ipDens][ipTe][ipL], bnl_array[ip1][ipDens+1][ipTe][ipL] );
1697 ASSERT( bnl >= bnl_min );
1702 ASSERT(
iso_sp[ipISO][nelem].bnl_effective[nHi][lHi][sHi] > 0. );
1715 for(
long is = 1; is<=3; ++is)
1719 else if( ipISO ==
ipHE_LIKE && is != 1 && is != 3 )
1722 char chSpin[3][9]= {
"singlets",
"doublets",
"triplets"};
1725 fprintf(
ioQQQ,
" %s %s %s bnl\n",
1731 fprintf(
ioQQQ,
" n\\l=> ");
1734 fprintf(
ioQQQ,
"%2ld ",i);
1736 fprintf(
ioQQQ,
"\n");
1741 if( is==3 && in==1 )
1744 fprintf(
ioQQQ,
" %2ld ",in);
1746 for(
long il = 0; il < in; ++il)
1748 fprintf(
ioQQQ,
"%9.3e ",
iso_sp[ipISO][nelem].bnl_effective[in][il][is] );
1750 fprintf(
ioQQQ,
"\n");
1763 for(
long ipLo=0; ipLo<ipFirstCollapsed; ipLo++ )
1765 long spin =
iso_sp[ipISO][nelem].
st[ipLo].S();
1772 iso_sp[ipISO][nelem].CachedAs[ nHi-iso_sp[ipISO][nelem].n_HighestResolved_max-1 ][ ipLo ][1] };
1775 Auls[0]*spin*(2.f*(
L_(ipLo)+1.f)+1.f)*(
realnum)
iso_sp[ipISO][nelem].bnl_effective[nHi][
L_(ipLo)+1 ][spin];
1782 Auls[1]*spin*(2.f*(
L_(ipLo)-1.f)+1.f)*(
realnum)
iso_sp[ipISO][nelem].bnl_effective[nHi][
L_(ipLo)-1 ][spin];
1786 EffectiveAul /= (2.f*nHi*nHi);
1788 EffectiveAul /= (4.f*nHi*nHi);
1797 ASSERT(
iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().Aul() > 0. );
1812 for(
long ipLo=0; ipLo < ipHi; ipLo++ )
1821 iso_sp[ipISO][nelem].
st[ipHi].lifetime() = 1./
iso_sp[ipISO][nelem].
st[ipHi].lifetime();
1823 for(
long ipLo=0; ipLo < ipHi; ipLo++ )
1825 if(
iso_sp[ipISO][nelem].trans(ipHi,ipLo).EnergyWN() <= 0. )
1832 (1.f/
iso_sp[ipISO][nelem].st[ipHi].lifetime())/
1835 ASSERT(
iso_sp[ipISO][nelem].trans(ipHi,ipLo).Emis().dampXvel()> 0.);
1843 STATIC void Prt_AGN_table(
void )
1852 sprintf( &chLevel.front(ipLo) ,
"%li %li%c",
N_(ipLo),
S_(ipLo),
chL[
MIN2(20,
L_(ipLo))] );
1863 double te[NTEMP]={6000.,8000.,10000.,15000.,20000.,25000. };
1864 double telog[NTEMP] ,
1868 fprintf(
ioQQQ,
"trans");
1869 for(
long i=0; i < NTEMP; ++i )
1871 telog[i] = log10( te[i] );
1872 fprintf(
ioQQQ,
"\t%.3e",te[i]);
1874 for(
long i=0; i < NTEMP; ++i )
1876 fprintf(
ioQQQ,
"\t%.3e",te[i]);
1878 fprintf(
ioQQQ,
"\n");
1882 for(
long ipLo=
ipHe1s1S; ipLo < ipHi; ++ipLo )
1887 if(
N_(ipHi) ==
N_(ipLo) )
1891 fprintf(
ioQQQ,
"%s - %s",
1892 &chLevel.front(ipLo) , &chLevel.front(ipHi) );
1895 for(
long i=0; i < NTEMP; ++i )
1900 fprintf(
ioQQQ,
"\t%.2e", cs );
1904 for(
long i=0; i < NTEMP; ++i )
1913 fprintf(
ioQQQ,
"\t%.2e", ratecoef );
1915 fprintf(
ioQQQ,
"\n");
void iso_collapsed_bnl_print(long ipISO, long nelem)
long int numLevels_malloc
realnum & opacity() const
STATIC void iso_assign_quantum_numbers(void)
NORETURN void TotalInsanity(void)
multi_arr< int, 3 > ipSatelliteLines
multi_arr< realnum, 3 > CachedAs
STATIC void iso_satellite(void)
double abscf(double gf, double enercm, double gl)
realnum ph1(int i, int j, int k, int l) const
long iso_get_total_num_levels(long ipISO, long nmaxResolved, long numCollapsed)
sys_float sexp(sys_float x)
double RefIndex(double EnergyWN)
multi_arr< long, 2 > ipTrans
vector< vector< TransitionList > > Transitions
double xIonDense[LIMELM][LIMELM+1]
long hunt_bisect(const T x[], long n, T xval)
STATIC void tfidle(bool lgForceUpdate)
const double FINE_STRUCTURE
t_elementnames elementnames
t_iso_sp iso_sp[NISO][LIMELM]
void iso_collapsed_lifetimes_update(long ipISO, long nelem)
realnum HeCSInterp(long int nelem, long int ipHi, long int ipLo, long int Collider)
STATIC void FillExtraLymanLine(const TransitionList::iterator &t, long ipISO, long nelem, long nHi)
long int n_HighestResolved_local
const multi_geom< d, ALLOC > & clone() const
multi_arr< double, 2 > BranchRatio
double helike_energy(long nelem, long ipLev)
void iso_update_num_levels(long ipISO, long nelem)
long int n_HighestResolved_max
realnum & EnergyWN() const
void iso_collapsed_bnl_set(long ipISO, long nelem)
realnum & dampXvel() const
EmissionList::reference Emis() const
multi_arr< int, 3 > ipExtraLymanLines
void iso_satellite_update(long nelem)
molecule * findspecies(const char buf[])
STATIC void iso_zero(void)
valarray< class molezone > species
realnum AtomicWeight[LIMELM]
const double HION_LTE_POP
realnum helike_transprob(long nelem, long ipHi, long ipLo)
void iso_collapsed_Aul_update(long ipISO, long nelem)
vector< vector< TransitionList > > SatelliteLines
multi_arr< long, 3 > QuantumNumbers2Index
TransitionProxy trans(const long ipHi, const long ipLo)
char chElementSym[LIMELM][CHARS_ELEMENT_SYM]
STATIC void iso_allocate(void)
multi_arr< double, 2 > CascadeProb
multi_arr< extra_tr, 2 > ex
void DoFSMixing(long nelem, long ipLoSing, long ipHiSing)
void reserve(size_type i1)
double GetGF(double trans_prob, double enercm, double gup)
multi_arr< double, 3 > bnl_effective
void iso_recomb_setup(long ipISO)
void iso_recomb_malloc(void)
vector< vector< TransitionList > > ExtraLymanLines
#define DEBUG_ENTRY(funcname)
const double ELECTRON_MASS
double iso_state_lifetime(long ipISO, long nelem, long n, long l)
void iso_cascade(long ipISO, long nelem)
vector< TransitionList > AllTransitions
void HelikeTransProbSetup(void)
double H_Einstein_A(long int n, long int l, long int np, long int lp, long int iz)
const double ATOMIC_MASS_UNIT
long int nCollapsed_local
long int nLyman_malloc[NISO]
void AddLine2Stack() const
void iso_recomb_auxiliary_free(void)
realnum hydro_transprob(long nelem, long ipHi, long ipLo)