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 t_iso_sp* sp = &iso_sp[ipISO][nelem];
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 sp->fb[0].gamnc = GammaBn(sp->fb[0].ipIsoLevNIonCon,
00045 rfield.nflux,
00046 sp->fb[0].ipOpac,
00047 sp->fb[0].xIsoLevNIonRyd,
00048 &sp->fb[0].RecomInducRate,
00049 &sp->fb[0].RecomInducCool_Coef,
00050 &photoHeat)*
00051 ionbal.lgPhotoIoniz_On;
00052
00053
00054 sp->fb[0].PhotoHeat = photoHeat.HeatNet*ionbal.lgPhotoIoniz_On;
00055
00056
00057 ionbal.PhotoRate_Shell[nelem][nelem-ipISO][0][0] = sp->fb[ipH1s].gamnc;
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 sp->fb[0].gamnc += ionbal.CompRecoilIonRate[nelem][nelem-ipISO];
00067 sp->fb[0].PhotoHeat += 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(sp->fb[0].ipIsoLevNIonCon,
00078 rfield.nflux,
00079 sp->fb[0].ipOpac,
00080 ioQQQ,
00081 sp->fb[0].gamnc,
00082 sp->fb[0].gamnc*0.05);
00083 }
00084
00085 limit = rfield.nflux;
00086
00087 for( n=1; n < sp->numLevels_local; n++ )
00088 {
00089
00090
00091 if( 0 && sp->st[n].n()>4 && !opac.lgRedoStatic && !sp->lgMustReeval )
00092 break;
00093
00098 if( hydro.lgHInducImp )
00099 {
00100 sp->fb[n].gamnc =
00101 GammaBn(
00102 sp->fb[n].ipIsoLevNIonCon,
00103 limit,
00104 sp->fb[n].ipOpac,
00105 sp->fb[n].xIsoLevNIonRyd,
00106 &sp->fb[n].RecomInducRate,
00107 &sp->fb[n].RecomInducCool_Coef,
00108 &photoHeat)*
00109 ionbal.lgPhotoIoniz_On;
00110 }
00111 else
00112 {
00113 sp->fb[n].gamnc =
00114 GammaK(sp->fb[n].ipIsoLevNIonCon,
00115 limit,
00116 sp->fb[n].ipOpac,1.,
00117 &photoHeat)*
00118 ionbal.lgPhotoIoniz_On;
00119
00120
00121 sp->fb[n].RecomInducRate = 0.;
00122 sp->fb[n].RecomInducCool_Coef = 0.;
00123 }
00124 sp->fb[n].PhotoHeat = photoHeat.HeatNet*ionbal.lgPhotoIoniz_On;
00125
00126 ASSERT( sp->fb[n].gamnc>= 0. );
00127 ASSERT( sp->fb[n].PhotoHeat>= 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 sp->fb[0].gamnc,
00142 sp->fb[1].gamnc,
00143 sp->fb[3].gamnc,
00144 sp->fb[4].gamnc,
00145 sp->fb[5].gamnc,
00146 sp->fb[6].gamnc);
00147 }
00148 }
00149 }
00150
00151
00152
00153 if( opac.lgCaseB_no_photo )
00154 {
00155 for( n=1; n < sp->numLevels_max; n++ )
00156 {
00157 sp->fb[n].gamnc = 0.;
00158 sp->fb[n].RecomInducRate = 0.;
00159 sp->fb[n].RecomInducCool_Coef = 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 < sp->numLevels_max; n++ )
00171 {
00172 sp->fb[n].RecomInducRate = 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", sp->fb[ipH1s].gamnc));
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",sp->fb[ipH1s].gamnc ));
00185 fprintf( ioQQQ, "\n");
00186 }
00187 return;
00188 }