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
00014
00015
00016 void iso_photo(
00017
00018 long ipISO ,
00019
00020 long int nelem)
00021 {
00022 long int limit ,
00023 n;
00024
00025 DEBUG_ENTRY( "iso_photo()" );
00026
00027
00028 ASSERT( nelem >= 0 && nelem < LIMELM );
00029 ASSERT( ipISO < NISO );
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 iso.gamnc[ipISO][nelem][0] = GammaBn(iso.ipIsoLevNIonCon[ipISO][nelem][0],
00044 rfield.nflux,
00045 iso.ipOpac[ipISO][nelem][0],
00046 iso.xIsoLevNIonRyd[ipISO][nelem][0],
00047 &iso.RecomInducRate[ipISO][nelem][0],
00048 &iso.RecomInducCool_Coef[ipISO][nelem][0])*
00049 ionbal.lgPhotoIoniz_On;
00050
00051
00052 iso.PhotoHeat[ipISO][nelem][0] = thermal.HeatNet*ionbal.lgPhotoIoniz_On;
00053
00054
00055 ionbal.PhotoRate_Shell[nelem][nelem-ipISO][0][0] = iso.gamnc[ipISO][nelem][ipH1s];
00056 ionbal.PhotoRate_Shell[nelem][nelem-ipISO][0][1] = thermal.HeatLowEnr*ionbal.lgPhotoIoniz_On;
00057 ionbal.PhotoRate_Shell[nelem][nelem-ipISO][0][2] = thermal.HeatHiEnr*ionbal.lgPhotoIoniz_On;
00058
00059
00060
00061
00062 ASSERT( ionbal.CompRecoilIonRate[nelem][nelem-ipISO]>=0. &&
00063 ionbal.CompRecoilHeatRate[nelem][nelem-ipISO]>= 0. );
00064 iso.gamnc[ipISO][nelem][0] += ionbal.CompRecoilIonRate[nelem][nelem-ipISO];
00065 iso.PhotoHeat[ipISO][nelem][0] += ionbal.CompRecoilHeatRate[nelem][nelem-ipISO];
00066
00067
00068 ionbal.PhotoRate_Shell[nelem][nelem-ipISO][0][0] += ionbal.CompRecoilIonRate[nelem][nelem-ipISO];
00069
00070 ionbal.PhotoRate_Shell[nelem][nelem-ipISO][0][2] += ionbal.CompRecoilHeatRate[nelem][nelem-ipISO];
00071
00072
00073 if( trace.lgTrace && trace.lgHBug && false )
00074 {
00075 GammaPrt(iso.ipIsoLevNIonCon[ipISO][nelem][0],
00076 rfield.nflux,
00077 iso.ipOpac[ipISO][nelem][0],
00078 ioQQQ,
00079 iso.gamnc[ipISO][nelem][0],iso.gamnc[ipISO][nelem][0]*0.05);
00080 }
00081
00082 {
00083
00084 enum {DEBUG_LOC=false};
00085
00086 if( DEBUG_LOC )
00087 {
00088
00089 if( DEBUG_LOC && nelem==ipHELIUM && ipISO==ipH_LIKE && nzone > 290)
00090 {
00091 GammaPrt(iso.ipIsoLevNIonCon[ipISO][nelem][0],
00092 rfield.nflux,
00093 iso.ipOpac[ipISO][nelem][0],
00094 ioQQQ,
00095 iso.gamnc[ipISO][nelem][0],iso.gamnc[ipISO][nelem][0]*0.05);
00096 }
00097 }
00098 }
00099
00100
00101 limit = iso.ipIsoLevNIonCon[ipISO][nelem][0]-1;
00102
00103 for( n=1; n < iso.numLevels_local[ipISO][nelem]; n++ )
00104 {
00105
00106
00107 if( n>6 && !opac.lgRedoStatic )
00108 break;
00113 if( hydro.lgHInducImp )
00114 {
00115 iso.gamnc[ipISO][nelem][n] =
00116 GammaBn(
00117 iso.ipIsoLevNIonCon[ipISO][nelem][n],
00118 limit,
00119 iso.ipOpac[ipISO][nelem][n],
00120 iso.xIsoLevNIonRyd[ipISO][nelem][n],
00121 &iso.RecomInducRate[ipISO][nelem][n],
00122 &iso.RecomInducCool_Coef[ipISO][nelem][n])*
00123 ionbal.lgPhotoIoniz_On;
00124 }
00125 else
00126 {
00127 iso.gamnc[ipISO][nelem][n] =
00128 GammaK(iso.ipIsoLevNIonCon[ipISO][nelem][n],
00129 limit,
00130 iso.ipOpac[ipISO][nelem][n],1.)*
00131 ionbal.lgPhotoIoniz_On;
00132
00133
00134 iso.RecomInducRate[ipISO][nelem][n] = 0.;
00135 iso.RecomInducCool_Coef[ipISO][nelem][n] = 0.;
00136 }
00137 iso.PhotoHeat[ipISO][nelem][n] = thermal.HeatNet*ionbal.lgPhotoIoniz_On;
00138
00139 ASSERT( iso.gamnc[ipISO][nelem][n]>= 0. );
00140 ASSERT( iso.PhotoHeat[ipISO][nelem][n]>= 0. );
00141
00142 }
00143
00144 {
00145
00146 enum {DEBUG_LOC=false};
00147
00148 if( DEBUG_LOC )
00149 {
00150 n = 1;
00151 if( ipISO==ipHE_LIKE && nelem==ipHELIUM && nzone > 200 )
00152 {
00153 GammaPrt(iso.ipIsoLevNIonCon[ipISO][nelem][n],
00154 iso.ipIsoLevNIonCon[ipISO][nelem][ipH1s]-1,
00155 iso.ipOpac[ipISO][nelem][n],
00156 ioQQQ,
00157 iso.gamnc[ipISO][nelem][n],
00158 iso.gamnc[ipISO][nelem][n]*0.05);
00159 }
00160 }
00161 }
00162
00163 {
00164
00165 enum {DEBUG_LOC=false};
00166
00167 if( DEBUG_LOC )
00168 {
00169 if( ipISO==1 && nelem==1 && nzone > 200 )
00170 fprintf(ioQQQ,"DEBUG isophoto\t%.2f\t%.4e\n",
00171 fnzone,
00172 iso.gamnc[ipISO][nelem][1]);
00173 }
00174 }
00175
00176 {
00177
00178 enum {DEBUG_LOC=false};
00179
00180 if( DEBUG_LOC )
00181 {
00182 if( nelem==0 )
00183 {
00184 fprintf(ioQQQ," buggbugg hphotodebugg%li\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\t%.2e\n",
00185 nzone,
00186 iso.gamnc[ipISO][nelem][0],
00187 iso.gamnc[ipISO][nelem][1],
00188 iso.gamnc[ipISO][nelem][3],
00189 iso.gamnc[ipISO][nelem][4],
00190 iso.gamnc[ipISO][nelem][5],
00191 iso.gamnc[ipISO][nelem][6]);
00192 }
00193 }
00194 }
00195
00196
00197
00198 if( opac.lgCaseB_no_photo )
00199 {
00200 for( n=1; n < iso.numLevels_max[ipISO][nelem]; n++ )
00201 {
00202 iso.gamnc[ipISO][nelem][n] = 0.;
00203 iso.RecomInducRate[ipISO][nelem][n] = 0.;
00204 iso.RecomInducCool_Coef[ipISO][nelem][n] = 0.;
00205 }
00206 }
00207 {
00208
00209
00210 enum {DEBUG_LOC=false};
00211
00212 if( DEBUG_LOC && ipISO==1 && nelem==5)
00213 {
00214
00215 for( n=0; n < iso.numLevels_max[ipISO][nelem]; n++ )
00216 {
00217 iso.RecomInducRate[ipISO][nelem][n] = 0.;
00218 }
00219 }
00220 }
00221
00222 if( trace.lgTrace )
00223 {
00224 fprintf( ioQQQ, " iso_photo, ipISO%2ld nelem%2ld low, hi=",ipISO,nelem);
00225 fprintf( ioQQQ,PrintEfmt("%9.2e", iso.gamnc[ipISO][nelem][ipH1s]));
00226 ASSERT(nelem>=ipISO);
00227 fprintf( ioQQQ,PrintEfmt("%9.2e", ionbal.CompRecoilIonRate[nelem][nelem-ipISO]));
00228 fprintf( ioQQQ, " total=");
00229 fprintf( ioQQQ,PrintEfmt("%9.2e",iso.gamnc[ipISO][nelem][ipH1s] ));
00230 fprintf( ioQQQ, "\n");
00231 }
00232
00233 DEBUG_EXIT( "iso_photo()" );
00234 return;
00235 }
00236
00237