56 static double gFe2[NLFE2]={1.,1.,1.,1.,1.,1.};
58 static double ex[NLFE2]={0.,3.32e4,5.68e4,6.95e4,1.15e5,1.31e5};
62 static double TUsed = 0.;
63 static double AbunUsed = 0.;
65 static long int nZUsed=-1,
115 fprintf(
ioQQQ,
" CoolIron5 calling FeIILevelPops since ");
119 "first sweep this zone." );
124 "temperature changed, old new are %g %g, nCall %li ",
127 else if(
nzone != nZUsed )
130 "new zone, nCall %li ", nCall );
135 "FeII.lgSlow set %li", nCall );
140 " in search phase %li", nCall );
145 "not second nCall %li " , nCall );
150 "temp or cooling changed, new are %g %g nCall %li ",
155 fprintf(
ioQQQ,
"????");
157 fprintf(
ioQQQ,
"\n");
169 " FeIILevelPops called zone %4li te %5f abun %10e c(fe/tot):%6f nCall %li\n",
183 enum{DEBUG_LOC=
false};
186 fprintf(
ioQQQ,
"DEBUG1\t%li\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\t%.3e\n",
201 fprintf(
ioQQQ,
" FeIILevelPops5 returned cool=%.2e heat=%.2e derivative=%.2e\n",
215 " CoolIron rescaling FeIILevelPops since small change, CFe2=%.2e CTOT=%.2e\n",
229 fprintf(
ioQQQ,
" CoolIron NOT calling FeIILevelPops\n");
250 fprintf(
ioQQQ,
" Large FeII returns te, cooling, dc=%11.3e%11.3e%11.3e\n",
268 pops = (
double *)
MALLOC(
sizeof(
double)*(NLFE2) );
269 create = (
double *)
MALLOC(
sizeof(
double)*(NLFE2) );
270 destroy = (
double *)
MALLOC(
sizeof(
double)*(NLFE2) );
279 for( i=0; i < NLFE2; ++i )
290 for( i=0; i < NLFE2; i++ )
294 for( j=0; j < NLFE2; j++ )
391 fprintf(
ioQQQ,
" PROBLEM, atom_levelN returned negative population for simple UV FeII.\n");
401 for( i=0; i < NLFE2; ++i )
478 enum{DEBUG_LOC=
false};
482 fprintf(
ioQQQ,
"DEBUG2\t%.2e\t%.2e\t%.2e\n",
526 (*(*TauDummy).Hi()).
g() = 0.;
587 const int NLFE4 = 12;
608 static const double Fe4A[NLFE4][NLFE4] = {
609 {0.,0.,0.,1.e-5,0.,1.368,.89,0.,1.3e-3,1.8e-4,.056,.028},
610 {0.,0.,2.6e-8,0.,0.,0.,0.,0.,1.7e-7,0.,0.,0.},
611 {0.,0.,0.,0.,3.5e-7,6.4e-10,0.,0.,6.315e-4,0.,6.7e-7,0.},
612 {0.,0.,0.,0.,1.1e-6,6.8e-5,8.6e-6,3.4e-10,7.6e-5,1.e-7,5.8e-4,2.8e-4},
613 {0.,0.,0.,0.,0.,1.5e-5,1.3e-9,0.,7.6e-4,0.,1.1e-6,6.0e-7},
614 {0.,0.,0.,0.,0.,0.,1.1e-5,1.2e-13,.038,9.9e-7,.022,.018},
615 {0.,0.,0.,0.,0.,0.,0.,3.7e-5,2.9e-6,.034,3.5e-3,.039},
616 {0.,0.,0.,0.,0.,0.,0.,0.,0.,.058,3.1e-6,1.4e-3},
617 {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,1.3e-4,3.1e-14},
618 {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,1.9e-19,1.0e-5},
619 {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,1.3e-7},
620 {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.}
623 static const double gfe4[NLFE4]={6.,12.,10.,6.,8.,6.,4.,2.,8.,2.,6.,4.};
630 static const double excit_wn[NLFE4]={0.,32245.5,32292.8,32301.2,32305.7,35253.8,
631 35333.3,35406.6,38779.4,38896.7,38935.1,38938.2};
646 for( i=0; i < NLFE4; ++i )
675 for( i=0; i < NLFE4; i++ )
699 for( i=0; i < NLFE4; i++ )
703 for( j=0; j < NLFE4; j++ )
713 for(
long ipHi=1; ipHi < NLFE4; ipHi++ )
715 for(
long ipLo=0; ipLo < ipHi; ipLo++ )
717 AulEscp[ipHi][ipLo] = Fe4A[ipLo][ipHi];
751 for( i=0; i < NLFE4; ++i )
759 fprintf(
ioQQQ,
" fe4levl2 found negative populations\n" );
770 fe.
fe40401 = (
pops[3]*Fe4A[0][3]*(excit_wn[3] - excit_wn[0]) +
777 fe.
fe42567 = (
pops[10]*Fe4A[0][10]*(excit_wn[10] - excit_wn[0]) +
816 static double gfe3[
NLFE3]={9.,7.,5.,3.,1.,5.,13.,11.,9.,3.,1.,9.,7.,5.};
822 static double excit_wn[
NLFE3]={
823 0.0 , 436.2, 738.9, 932.4, 1027.3,
824 19404.8, 20051.1, 20300.8, 20481.9, 20688.4,
825 21208.5, 21462.2, 21699.9, 21857.2 };
837 destroy = ((
double *)
MALLOC((
NLFE3)*
sizeof(double)));
838 create = ((
double *)
MALLOC((
NLFE3)*
sizeof(double)));
842 AulNet = ((
double **)
MALLOC((
NLFE3)*
sizeof(
double *)));
847 for( i=0; i <
NLFE3; ++i )
851 AulNet[i] = ((
double *)
MALLOC((
NLFE3)*
sizeof(double )));
859 for( i=0; i <
NLFE3; ++i )
863 for( j=0; j <
NLFE3; ++j )
876 for( ihi=1; ihi <
NLFE3; ++ihi )
878 for( ilo=0; ilo < ihi; ++ilo )
880 fe.
Fe3_wl[ihi][ilo] = 1e8/(excit_wn[ihi]-excit_wn[ilo]) /
881 RefIndex( (excit_wn[ihi]-excit_wn[ilo]) );
887 AulNet[1][0] = 2.8e-3;
888 AulNet[7][0] = 4.9e-6;
889 AulNet[8][0] = 5.7e-3;
890 AulNet[11][0] = 4.5e-1;
891 AulNet[12][0] = 4.2e-2;
893 AulNet[2][1] = 1.8e-3;
894 AulNet[5][1] = 4.2e-1;
895 AulNet[8][1] = 1.0e-3;
896 AulNet[11][1] = 8.4e-2;
897 AulNet[12][1] = 2.5e-1;
898 AulNet[13][1] = 2.7e-2;
900 AulNet[3][2] = 7.0e-4;
901 AulNet[5][2] = 5.1e-5;
902 AulNet[9][2] = 5.4e-1;
903 AulNet[12][2] = 8.5e-2;
904 AulNet[13][2] = 9.8e-2;
906 AulNet[4][3] = 1.4e-4;
907 AulNet[5][3] = 3.9e-2;
908 AulNet[9][3] = 4.1e-5;
909 AulNet[10][3] = 7.0e-1;
910 AulNet[13][3] = 4.7e-2;
912 AulNet[9][4] = 9.3e-2;
914 AulNet[9][5] = 4.7e-2;
915 AulNet[12][5] = 2.5e-6;
916 AulNet[13][5] = 1.7e-5;
918 AulNet[7][6] = 2.7e-4;
920 AulNet[8][7] = 1.2e-4;
921 AulNet[11][7] = 6.6e-4;
923 AulNet[11][8] = 1.6e-3;
924 AulNet[12][8] = 7.8e-4;
926 AulNet[10][9] = 8.4e-3;
927 AulNet[13][9] = 2.8e-7;
929 AulNet[12][11] = 3.0e-4;
931 AulNet[13][12] = 1.4e-4;
933 for(
int ipHi = 1; ipHi <
NLFE3; ipHi++)
935 for(
int ipLo = 0; ipLo < ipHi; ipLo++)
948 for( ihi=1; ihi <
NLFE3; ++ihi )
950 for( ilo=0; ilo < ihi; ++ilo )
958 for( i=0; i <
NLFE3; i++ )
1006 for( i=0; i <
NLFE3; ++i )
1014 fprintf(
ioQQQ,
" Fe3Lev14 found negative populations\n" );
1025 for( ihi=1; ihi <
NLFE3; ++ihi )
1027 for( ilo=0; ilo < ihi; ++ilo )
1038 static double col_str[14][14];
1040 static double lgOneTimeMustInit=
true;
1041 if( lgOneTimeMustInit )
1043 lgOneTimeMustInit =
false;
1153 double CollisionStrength =
col_str[ipHi][ipLo];
1154 ASSERT( CollisionStrength >0. );
1156 return( CollisionStrength );
1165 static const double Fe4CS[NLFE4][NLFE4] = {
1166 {0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.},
1167 {0.98,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.},
1168 {0.8167,3.72,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.},
1169 {0.49,0.0475,0.330,0.,0.,0.,0.,0.,0.,0.,0.,0.},
1170 {0.6533,0.473,2.26,1.64,0.,0.,0.,0.,0.,0.,0.,0.},
1171 {0.45,0.686,0.446,0.106,0.254,0.,0.,0.,0.,0.,0.,0.},
1172 {0.30,0.392,0.152,0.269,0.199,0.605,0.,0.,0.,0.,0.,0.},
1173 {0.15,0.0207,0.190,0.0857,0.166,0.195,0.327,0.,0.,0.,0.,0.},
1174 {0.512,1.23,0.733,0.174,0.398,0.623,0.335,0.102,0.,0.,0.,0.},
1175 {0.128,0.0583,0.185,0.200,0.188,0.0835,0.127,0.0498,0.0787,0.,0.,0.},
1176 {0.384,0.578,0.534,0.363,0.417,0.396,0.210,0.171,0.810,0.101,0.,0.},
1177 {0.256,0.234,0.306,0.318,0.403,0.209,0.195,0.112,0.195,0.458,0.727,0.}
1181 double CollisionStrength = Fe4CS[ipHi][ipLo];
1182 ASSERT( CollisionStrength >0. );
1184 return( CollisionStrength );
1189 const int NLFE5 = 14;
1190 static double col_str[NLFE5][NLFE5];
1194 static double lgOneTimeMustInit=
true;
1195 if( lgOneTimeMustInit )
1197 lgOneTimeMustInit =
false;
1198 for(
int i = 0;i < NLFE5;i++)
1200 for(
int j = 0;j < NLFE5;j++)
1214 double CollisionStrength =
col_str[ipHi][ipLo];
1215 ASSERT( CollisionStrength >0. );
1217 return( CollisionStrength );
void atom_level2(const TransitionProxy &t)
void atom_level3(const TransitionProxy &t10, const TransitionProxy &t21, const TransitionProxy &t20)
void atom_levelN(long int nLevelCalled, realnum abund, const double g[], const double ex[], char chExUnits, double pops[], double depart[], double ***AulEscp, double ***col_str, double ***AulDest, double ***AulPump, double ***CollRate, const double source[], const double sink[], bool lgCollRateDone, double *cooltl, double *coolder, const char *chLabel, int *nNegPop, bool *lgZeroPop, bool lgDeBug, bool lgLTE, multi_arr< double, 2 > *Cool, multi_arr< double, 2 > *dCooldT)
double atom_pop2(double omega, double g1, double g2, double a21, double bltz, double abund)
bool fp_equal(sys_float x, sys_float y, int n=3)
sys_float SDIV(sys_float x)
#define DEBUG_ENTRY(funcname)
EmissionList::reference Emis() const
TransitionProxy trans(const long ipHi, const long ipLo)
void CoolAdd(const char *chLabel, realnum lambda, double cool)
STATIC void Fe3Lev14(void)
double Fe3_cs(long ipLo, long ipHi)
double Fe5_cs(long ipLo, long ipHi)
double Fe4_cs(long ipLo, long ipHi)
STATIC void Fe2_cooling(void)
STATIC void Fe4Lev12(void)
t_iso_sp iso_sp[NISO][LIMELM]
double RefIndex(double EnergyWN)
UNUSED const double BOLTZMANN
static double ** CollRate
double ddT_Fe2_UVsimp_cool
double ddT_Fe2_large_cool
double DepLTELevels[LIMLEVELN+1]
double PopLevels[LIMLEVELN+1]
bool lgFirstSweepThisZone
double xIonDense[LIMELM][LIMELM+1]
realnum gas_phase[LIMELM]
double heating[LIMELM][LIMELM]
TransitionProxy::iterator TauDummy
TransitionList TauLines("TauLines", &AnonStates)
void LineConvRate2CS(const TransitionProxy &t, realnum rate)
void MakeCS(const TransitionProxy &t)
void PutCS(double cs, const TransitionProxy &t)