00001
00002
00003
00004 #include "cddefines.h"
00005 #include "hydrogenic.h"
00006 #include "rfield.h"
00007 #include "opacity.h"
00008 #include "trace.h"
00009 #include "ionbal.h"
00010 #include "thermal.h"
00011 #include "gammas.h"
00012 #include "iso.h"
00013 #include "taulines.h"
00014
00015 void iso_photo(
00016
00017 long ipISO ,
00018
00019 long int nelem)
00020 {
00021 long int limit ,
00022 n;
00023
00024 t_phoHeat photoHeat;
00025
00026 DEBUG_ENTRY( "iso_photo()" );
00027
00028
00029 ASSERT( nelem >= 0 && nelem < LIMELM );
00030 ASSERT( ipISO < NISO );
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 iso.gamnc[ipISO][nelem][0] = GammaBn(iso.ipIsoLevNIonCon[ipISO][nelem][0],
00045 rfield.nflux,
00046 iso.ipOpac[ipISO][nelem][0],
00047 iso.xIsoLevNIonRyd[ipISO][nelem][0],
00048 &iso.RecomInducRate[ipISO][nelem][0],
00049 &iso.RecomInducCool_Coef[ipISO][nelem][0],
00050 &photoHeat)*
00051 ionbal.lgPhotoIoniz_On;
00052
00053
00054 iso.PhotoHeat[ipISO][nelem][0] = photoHeat.HeatNet*ionbal.lgPhotoIoniz_On;
00055
00056
00057 ionbal.PhotoRate_Shell[nelem][nelem-ipISO][0][0] = iso.gamnc[ipISO][nelem][ipH1s];
00058 ionbal.PhotoRate_Shell[nelem][nelem-ipISO][0][1] = photoHeat.HeatLowEnr*ionbal.lgPhotoIoniz_On;
00059 ionbal.PhotoRate_Shell[nelem][nelem-ipISO][0][2] = photoHeat.HeatHiEnr*ionbal.lgPhotoIoniz_On;
00060
00061
00062
00063
00064 ASSERT( ionbal.CompRecoilIonRate[nelem][nelem-ipISO]>=0. &&
00065 ionbal.CompRecoilHeatRate[nelem][nelem-ipISO]>= 0. );
00066 iso.gamnc[ipISO][nelem][0] += ionbal.CompRecoilIonRate[nelem][nelem-ipISO];
00067 iso.PhotoHeat[ipISO][nelem][0] += ionbal.CompRecoilHeatRate[nelem][nelem-ipISO];
00068
00069
00070 ionbal.PhotoRate_Shell[nelem][nelem-ipISO][0][0] += ionbal.CompRecoilIonRate[nelem][nelem-ipISO];
00071
00072 ionbal.PhotoRate_Shell[nelem][nelem-ipISO][0][2] += ionbal.CompRecoilHeatRate[nelem][nelem-ipISO];
00073
00074
00075 if( trace.lgTrace && trace.lgIsoTraceFull[ipISO] && (nelem == trace.ipIsoTrace[ipISO]) )
00076 {
00077 GammaPrt(iso.ipIsoLevNIonCon[ipISO][nelem][0],
00078 rfield.nflux,
00079 iso.ipOpac[ipISO][nelem][0],
00080 ioQQQ,
00081 iso.gamnc[ipISO][nelem][0],
00082 iso.gamnc[ipISO][nelem][0]*0.05);
00083 }
00084
00085
00086 limit = iso.ipIsoLevNIonCon[ipISO][nelem][0]-1;
00087
00088 for( n=1; n < iso.numLevels_local[ipISO][nelem]; n++ )
00089 {
00090
00091
00092 if( StatesElemNEW[nelem][nelem-ipISO][n].n>4 && !opac.lgRedoStatic )
00093 break;
00098 if( hydro.lgHInducImp )
00099 {
00100 iso.gamnc[ipISO][nelem][n] =
00101 GammaBn(
00102 iso.ipIsoLevNIonCon[ipISO][nelem][n],
00103 limit,
00104 iso.ipOpac[ipISO][nelem][n],
00105 iso.xIsoLevNIonRyd[ipISO][nelem][n],
00106 &iso.RecomInducRate[ipISO][nelem][n],
00107 &iso.RecomInducCool_Coef[ipISO][nelem][n],
00108 &photoHeat)*
00109 ionbal.lgPhotoIoniz_On;
00110 }
00111 else
00112 {
00113 iso.gamnc[ipISO][nelem][n] =
00114 GammaK(iso.ipIsoLevNIonCon[ipISO][nelem][n],
00115 limit,
00116 iso.ipOpac[ipISO][nelem][n],1.,
00117 &photoHeat)*
00118 ionbal.lgPhotoIoniz_On;
00119
00120
00121 iso.RecomInducRate[ipISO][nelem][n] = 0.;
00122 iso.RecomInducCool_Coef[ipISO][nelem][n] = 0.;
00123 }
00124 iso.PhotoHeat[ipISO][nelem][n] = photoHeat.HeatNet*ionbal.lgPhotoIoniz_On;
00125
00126 ASSERT( iso.gamnc[ipISO][nelem][n]>= 0. );
00127 ASSERT( iso.PhotoHeat[ipISO][nelem][n]>= 0. );
00128
00129 }
00130
00131 {
00132
00133 enum {DEBUG_LOC=false};
00134
00135 if( DEBUG_LOC )
00136 {
00137 if( nelem==ipHYDROGEN )
00138 {
00139 fprintf(ioQQQ," buggbugg hphotodebugg%li\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\n",
00140 nzone,
00141 iso.gamnc[ipISO][nelem][0],
00142 iso.gamnc[ipISO][nelem][1],
00143 iso.gamnc[ipISO][nelem][3],
00144 iso.gamnc[ipISO][nelem][4],
00145 iso.gamnc[ipISO][nelem][5],
00146 iso.gamnc[ipISO][nelem][6]);
00147 }
00148 }
00149 }
00150
00151
00152
00153 if( opac.lgCaseB_no_photo )
00154 {
00155 for( n=1; n < iso.numLevels_max[ipISO][nelem]; n++ )
00156 {
00157 iso.gamnc[ipISO][nelem][n] = 0.;
00158 iso.RecomInducRate[ipISO][nelem][n] = 0.;
00159 iso.RecomInducCool_Coef[ipISO][nelem][n] = 0.;
00160 }
00161 }
00162 {
00163
00164
00165 enum {DEBUG_LOC=false};
00166
00167 if( DEBUG_LOC && ipISO==1 && nelem==5)
00168 {
00169
00170 for( n=0; n < iso.numLevels_max[ipISO][nelem]; n++ )
00171 {
00172 iso.RecomInducRate[ipISO][nelem][n] = 0.;
00173 }
00174 }
00175 }
00176
00177 if( trace.lgTrace && (trace.lgHBug||trace.lgHeBug) )
00178 {
00179 fprintf( ioQQQ, " iso_photo, ipISO%2ld nelem%2ld low, hi=",ipISO,nelem);
00180 fprintf( ioQQQ,PrintEfmt("%9.2e", iso.gamnc[ipISO][nelem][ipH1s]));
00181 ASSERT(nelem>=ipISO);
00182 fprintf( ioQQQ,PrintEfmt("%9.2e", ionbal.CompRecoilIonRate[nelem][nelem-ipISO]));
00183 fprintf( ioQQQ, " total=");
00184 fprintf( ioQQQ,PrintEfmt("%9.2e",iso.gamnc[ipISO][nelem][ipH1s] ));
00185 fprintf( ioQQQ, "\n");
00186 }
00187 return;
00188 }