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) );
271 depart = (
double *)
MALLOC(
sizeof(
double)*(NLFE2) );
273 AulPump = ((
double **)
MALLOC((NLFE2)*
sizeof(
double *)));
274 CollRate = ((
double **)
MALLOC((NLFE2)*
sizeof(
double *)));
275 AulDest = ((
double **)
MALLOC((NLFE2)*
sizeof(
double *)));
276 AulEscp = ((
double **)
MALLOC((NLFE2)*
sizeof(
double *)));
277 col_str = ((
double **)
MALLOC((NLFE2)*
sizeof(
double *)));
279 for( i=0; i < NLFE2; ++i )
281 AulPump[i] = ((
double *)
MALLOC((NLFE2)*
sizeof(double )));
282 CollRate[i] = ((
double *)
MALLOC((NLFE2)*
sizeof(double )));
283 AulDest[i] = ((
double *)
MALLOC((NLFE2)*
sizeof(double )));
284 AulEscp[i] = ((
double *)
MALLOC((NLFE2)*
sizeof(double )));
285 col_str[i] = ((
double *)
MALLOC((NLFE2)*
sizeof(double )));
290 for( i=0; i < NLFE2; i++ )
294 for( j=0; j < NLFE2; j++ )
320 AulPump[0][5] += PumpLyaFeII;
391 fprintf(
ioQQQ,
" PROBLEM, atom_levelN returned negative population for simple UV FeII.\n");
401 for( i=0; i < NLFE2; ++i )
421 FeII.
for7 = pops[1]*AulEscp[1][0]*4.65e-12;
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};
641 AulPump = ((
double **)
MALLOC((NLFE4)*
sizeof(
double *)));
642 CollRate = ((
double **)
MALLOC((NLFE4)*
sizeof(
double *)));
643 AulDest = ((
double **)
MALLOC((NLFE4)*
sizeof(
double *)));
644 AulEscp = ((
double **)
MALLOC((NLFE4)*
sizeof(
double *)));
645 col_str = ((
double **)
MALLOC((NLFE4)*
sizeof(
double *)));
646 for( i=0; i < NLFE4; ++i )
648 AulPump[i] = ((
double *)
MALLOC((NLFE4)*
sizeof(double )));
649 CollRate[i] = ((
double *)
MALLOC((NLFE4)*
sizeof(double )));
650 AulDest[i] = ((
double *)
MALLOC((NLFE4)*
sizeof(double )));
651 AulEscp[i] = ((
double *)
MALLOC((NLFE4)*
sizeof(double )));
652 col_str[i] = ((
double *)
MALLOC((NLFE4)*
sizeof(double )));
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];
718 col_str[ipHi][ipLo] =
Fe4_cs(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]) +
771 pops[4]*Fe4A[0][4]*(excit_wn[4] - excit_wn[0]) )*
T1CM*
BOLTZMANN;
777 fe.
fe42567 = (pops[10]*Fe4A[0][10]*(excit_wn[10] - excit_wn[0]) +
778 pops[11]*Fe4A[0][11]*(excit_wn[10] - excit_wn[0]))*
T1CM*
BOLTZMANN;
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 };
835 depart = ((
double *)
MALLOC((
NLFE3)*
sizeof(double)));
837 destroy = ((
double *)
MALLOC((
NLFE3)*
sizeof(double)));
838 create = ((
double *)
MALLOC((
NLFE3)*
sizeof(double)));
842 AulNet = ((
double **)
MALLOC((
NLFE3)*
sizeof(
double *)));
843 col_str = ((
double **)
MALLOC((
NLFE3)*
sizeof(
double *)));
844 AulPump = ((
double **)
MALLOC((
NLFE3)*
sizeof(
double *)));
845 CollRate = ((
double **)
MALLOC((
NLFE3)*
sizeof(
double *)));
846 AulDest = ((
double **)
MALLOC((
NLFE3)*
sizeof(
double *)));
847 for( i=0; i <
NLFE3; ++i )
851 AulNet[i] = ((
double *)
MALLOC((NLFE3)*
sizeof(double )));
852 col_str[i] = ((
double *)
MALLOC((NLFE3)*
sizeof(double )));
853 AulPump[i] = ((
double *)
MALLOC((NLFE3)*
sizeof(double )));
854 CollRate[i] = ((
double *)
MALLOC((NLFE3)*
sizeof(double )));
855 AulDest[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++)
937 col_str[ipHi][ipLo] =
Fe3_cs(ipLo,ipHi);
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;
1047 col_str[1][0] = 2.92;
1048 col_str[2][0] = 1.24;
1049 col_str[3][0] = 0.595;
1050 col_str[4][0] = 0.180;
1051 col_str[5][0] = 0.580;
1052 col_str[6][0] = 1.34;
1053 col_str[7][0] = 0.489;
1054 col_str[8][0] = 0.0926;
1055 col_str[9][0] = 0.165;
1056 col_str[10][0] = 0.0213;
1057 col_str[11][0] = 1.07;
1058 col_str[12][0] = 0.435;
1059 col_str[13][0] = 0.157;
1061 col_str[2][1] = 2.06;
1062 col_str[3][1] = 0.799;
1063 col_str[4][1] = 0.225;
1064 col_str[5][1] = 0.335;
1065 col_str[6][1] = 0.555;
1066 col_str[7][1] = 0.609;
1067 col_str[8][1] = 0.367;
1068 col_str[9][1] = 0.195;
1069 col_str[10][1] = 0.0698;
1070 col_str[11][1] = 0.538;
1071 col_str[12][1] = 0.484;
1072 col_str[13][1] = 0.285;
1074 col_str[3][2] = 1.29;
1075 col_str[4][2] = 0.312;
1076 col_str[5][2] = 0.173;
1077 col_str[6][2] = 0.178;
1078 col_str[7][2] = 0.430;
1079 col_str[8][2] = 0.486;
1080 col_str[9][2] = 0.179;
1081 col_str[10][2] = 0.0741;
1082 col_str[11][2] = 0.249;
1083 col_str[12][2] = 0.362;
1084 col_str[13][2] = 0.324;
1086 col_str[4][3] = 0.493;
1087 col_str[5][3] = 0.0767;
1088 col_str[6][3] = 0.0348;
1089 col_str[7][3] = 0.223;
1090 col_str[8][3] = 0.401;
1091 col_str[9][3] = 0.126;
1092 col_str[10][3] = 0.0528;
1093 col_str[11][3] = 0.101;
1094 col_str[12][3] = 0.207;
1095 col_str[13][3] = 0.253;
1097 col_str[5][4] = 0.0211;
1098 col_str[6][4] = 0.00122;
1099 col_str[7][4] = 0.0653;
1100 col_str[8][4] = 0.154;
1101 col_str[9][4] = 0.0453;
1102 col_str[10][4] = 0.0189;
1103 col_str[11][4] = 0.0265;
1104 col_str[12][4] = 0.0654;
1105 col_str[13][4] = 0.0950;
1107 col_str[6][5] = 0.403;
1108 col_str[7][5] = 0.213;
1109 col_str[8][5] = 0.0939;
1110 col_str[9][5] = 1.10;
1111 col_str[10][5] = 0.282;
1112 col_str[11][5] = 0.942;
1113 col_str[12][5] = 0.768;
1114 col_str[13][5] = 0.579;
1116 col_str[7][6] = 2.84;
1117 col_str[8][6] = 0.379;
1118 col_str[9][6] = 0.0876;
1119 col_str[10][6] = 0.00807;
1120 col_str[11][6] = 1.85;
1121 col_str[12][6] = 0.667;
1122 col_str[13][6] = 0.0905;
1124 col_str[8][7] = 3.07;
1125 col_str[9][7] = 0.167;
1126 col_str[10][7] = 0.0526;
1127 col_str[11][7] = 0.814;
1128 col_str[12][7] = 0.837;
1129 col_str[13][7] = 0.626;
1131 col_str[9][8] = 0.181;
1132 col_str[10][8] = 0.0854;
1133 col_str[11][8] = 0.180;
1134 col_str[12][8] = 0.778;
1135 col_str[13][8] = 0.941;
1137 col_str[10][9] = 0.377;
1138 col_str[11][9] = 0.603;
1139 col_str[12][9] = 0.472;
1140 col_str[13][9] = 0.302;
1142 col_str[11][10] = 0.216;
1143 col_str[12][10] = 0.137;
1144 col_str[13][10] = 0.106;
1146 col_str[12][11] = 1.25;
1147 col_str[13][11] = 0.292;
1149 col_str[13][12] = 1.10;
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++)
1206 col_str[10][3] = 1.4;
1207 col_str[7][2] = 1.1;
1208 col_str[13][4] = 3.7;
1209 col_str[12][3] = 3.7;
1210 col_str[11][2] = 2.0;
1214 double CollisionStrength = col_str[ipHi][ipLo];
1215 ASSERT( CollisionStrength >0. );
1217 return( CollisionStrength );
void CoolAdd(const char *chLabel, realnum lambda, double cool)
TransitionProxy::iterator TauDummy
double Fe4_cs(long ipLo, long ipHi)
bool lgFirstSweepThisZone
STATIC void Fe3Lev14(void)
double DepLTELevels[LIMLEVELN+1]
double RefIndex(double EnergyWN)
STATIC void Fe4Lev12(void)
double Fe3_cs(long ipLo, long ipHi)
double xIonDense[LIMELM][LIMELM+1]
double ddT_Fe2_UVsimp_cool
t_iso_sp iso_sp[NISO][LIMELM]
double heating[LIMELM][LIMELM]
bool fp_equal(sys_float x, sys_float y, int n=3)
double atom_pop2(double omega, double g1, double g2, double a21, double bltz, double abund)
void PutCS(double cs, const TransitionProxy &t)
EmissionList::reference Emis() const
STATIC void Fe2_cooling(void)
void atom_level3(const TransitionProxy &t10, const TransitionProxy &t21, const TransitionProxy &t20)
TransitionProxy trans(const long ipHi, const long ipLo)
realnum gas_phase[LIMELM]
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)
TransitionList TauLines("TauLines",&AnonStates)
static double ** CollRate
#define DEBUG_ENTRY(funcname)
void atom_level2(const TransitionProxy &t)
double Fe5_cs(long ipLo, long ipHi)
sys_float SDIV(sys_float x)
void LineConvRate2CS(const TransitionProxy &t, realnum rate)
double PopLevels[LIMLEVELN+1]
double ddT_Fe2_large_cool
void MakeCS(const TransitionProxy &t)