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