00001
00002
00003
00004 #include "cddefines.h"
00005 #include "taulines.h"
00006 #include "atomfeii.h"
00007 #include "dense.h"
00008 #include "conv.h"
00009 #include "atoms.h"
00010 #include "rfield.h"
00011 #include "wind.h"
00012 #include "iso.h"
00013 #include "h2.h"
00014 #include "opacity.h"
00015 #include "trace.h"
00016 #include "lines_service.h"
00017 #include "atmdat.h"
00018 #include "hydrogenic.h"
00019 #include "rt.h"
00020 #include "cosmology.h"
00021 #include "physconst.h"
00022 #include "doppvel.h"
00023 #include "mole.h"
00024
00025
00026 void RT_line_all( void )
00027 {
00028 long int i,
00029 ion,
00030 ipISO,
00031 nelem;
00032 long ipHi , ipLo;
00033
00034
00035 bool lgPescUpdate = conv.lgFirstSweepThisZone || conv.lgIonStageTrimed;
00036
00037 DEBUG_ENTRY( "RT_line_all()" );
00038
00039 if( trace.lgTrace )
00040 fprintf( ioQQQ, " RT_line_all called\n" );
00041
00042
00043 if( !rfield.lgDoLineTrans && conv.nPres2Ioniz )
00044 {
00045 return;
00046 }
00047
00048
00049
00050 if( conv.lgLastSweepThisZone )
00051 {
00052
00053 memset(rfield.fine_opac_zone , 0 , (unsigned long)rfield.nfine*sizeof(realnum) );
00054
00055 if( 0 && cosmology.lgDo )
00056 {
00057 realnum dVel = (realnum)SPEEDLIGHT * ( 1.f - 1.f/POW2(1.f+cosmology.redshift_start-cosmology.redshift_current) );
00058 rfield.ipFineConVelShift = -(long int)( dVel/ rfield.fine_opac_velocity_width + 0.5 );
00059 }
00060 else
00061 {
00062
00063
00064
00065
00066
00067 realnum dWind = wind.windv - wind.windv0;
00068
00069
00070
00071 rfield.ipFineConVelShift = -(long int)(dWind / rfield.fine_opac_velocity_width+0.5);
00072 }
00073 }
00074
00075 # if 0
00076
00077
00078
00079 {
00080 #include "doppvel.h"
00081 double dTau , aa;
00082 ipISO = 0; nelem = 0;ipLo = 0;
00083 ipHi = 23;
00084 dTau = Transitions[ipISO][nelem][ipHi][ipLo].Emis->PopOpc *
00085 Transitions[ipISO][nelem][ipHi][ipLo].Emis->opacity /
00086 GetDopplerWidth(dense.AtomicWeight[nelem]) + opac.opacity_abs[Transitions[ipISO][nelem][ipHi][ipLo].ipCont-1];
00087 dTau *= radius.drad_x_fillfac_mean;
00088 aa = log(1. + dTau ) / SDIV(dTau);
00089 fprintf(ioQQQ,"DEBUG dTau\t%.2f\t%.5e\t%.5e\t%.5e\n",fnzone,dTau,
00090 radius.drad_x_fillfac_mean,
00091 aa);
00092 }
00093 # endif
00094
00095
00096 if( lgPescUpdate )
00097 RT_stark();
00098
00099
00100
00101 for( ipISO=ipH_LIKE; ipISO < NISO; ++ipISO )
00102 {
00103
00104 for( nelem=ipISO; nelem < LIMELM; ++nelem )
00105 {
00106
00107
00108 ion = nelem+1-ipISO;
00109
00110
00111 if( !dense.lgElmtOn[nelem] )
00112 continue;
00113
00114 if( ion <= dense.IonHigh[nelem] )
00115 {
00116
00117 for( ipHi=1; ipHi < iso.numLevels_local[ipISO][nelem]; ++ipHi )
00118 {
00119 for( ipLo=0; ipLo < ipHi; ++ipLo )
00120 {
00121
00122
00123 if( Transitions[ipISO][nelem][ipHi][ipLo].ipCont < 0 )
00124 continue;
00125
00126
00127
00128 RT_line_one( &Transitions[ipISO][nelem][ipHi][ipLo],
00129 true,(realnum)iso.pestrk[ipISO][nelem][ipLo][ipHi],
00130 GetDopplerWidth(dense.AtomicWeight[nelem]));
00131
00132
00133 enum {DEBUG_LOC=false};
00134 if( DEBUG_LOC && nelem==1&& ipLo==0 )
00135 {
00136 fprintf(ioQQQ,"DEBUG pdest\t%3li\t%.2f\t%.3e\n",
00137 ipHi ,
00138 fnzone,
00139 Transitions[ipISO][nelem][ipHi][ipLo].Emis->Pdest);
00140 }
00141 }
00142 }
00143
00144
00145 atmdat_2phot_rate(ipISO , nelem);
00146
00147
00148
00149 if( opac.lgCaseB_no_pdest )
00150 {
00151 ipLo = 0;
00152
00153 for( ipHi=ipLo+1; ipHi < iso.numLevels_max[ipISO][nelem]; ++ipHi )
00154 {
00155 if( Transitions[ipISO][nelem][ipHi][ipLo].ipCont <= 0 )
00156 continue;
00157
00158
00159 Transitions[ipISO][nelem][ipHi][ipLo].Emis->Pdest = SMALLFLOAT;
00160 }
00161 }
00162
00163 ipLo = 0;
00164
00165
00166
00167 if( dense.xIonDense[nelem][ion] > 1e-30 && conv.lgLastSweepThisZone )
00168 {
00169 for( ipHi=StatesElemNEW[nelem][nelem-ipISO][iso.numLevels_max[ipISO][nelem]-1].n; ipHi < iso.nLyman[ipISO]; ipHi++ )
00170 {
00171
00172 ExtraLymanLines[ipISO][nelem][ipHi].Emis->PopOpc = StatesElemNEW[nelem][nelem-ipISO][0].Pop;
00173 ExtraLymanLines[ipISO][nelem][ipHi].Lo->Pop =
00174 StatesElemNEW[nelem][nelem-ipISO][ipLo].Pop;
00175
00176
00177 RT_line_one( &ExtraLymanLines[ipISO][nelem][ipHi], true, 0.f,
00178 GetDopplerWidth(dense.AtomicWeight[nelem]));
00179 }
00180 }
00181
00182 }
00183 }
00184 }
00185
00186
00187
00188
00189 if( lgTauGood( &Transitions[ipH_LIKE][ipHYDROGEN][iso.nLyaLevel[ipH_LIKE]][0] ) )
00190 {
00191
00192
00193
00194
00195
00196
00197
00198 t_fe2ovr_la::Inst().atoms_fe2ovr();
00199
00200
00201
00202
00203
00204
00205 Transitions[ipH_LIKE][ipHYDROGEN][ipH2p][ipH1s].Emis->Pdest += hydro.dstfe2lya;
00206 }
00207
00208
00209
00210 if( !hydro.lgLymanPumping )
00211 {
00212 ipISO = ipH_LIKE;
00213 nelem = ipHYDROGEN;
00214 ipLo = 0;
00215 for( ipHi=ipLo+1; ipHi < iso.numLevels_max[ipISO][nelem]; ++ipHi )
00216 {
00217 Transitions[ipISO][nelem][ipHi][ipLo].Emis->pump = 0.;
00218 }
00219 }
00220
00221 {
00222
00223 enum {DEBUG_LOC=false};
00224 if( DEBUG_LOC && nzone>433 )
00225 {
00226
00227 DumpLine(&Transitions[ipH_LIKE][ipHYDROGEN][ipH2p][0] );
00228 }
00229 }
00230
00231
00232 for( i=1; i <= nLevel1; i++ )
00233 {
00234 RT_line_one( &TauLines[i], true,0.f, GetDopplerWidth(dense.AtomicWeight[TauLines[i].Hi->nelem-1]) );
00235 }
00236
00237 {
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248 static realnum P_elec_esc_ipTFe56;
00249 static long nSave;
00250 if( nzone <= 1 || nzone!=nSave )
00251 {
00252 P_elec_esc_ipTFe56 = TauLines[ipTFe56].Emis->Pelec_esc;
00253 nSave = nzone;
00254 }
00255 else
00256 TauLines[ipTFe56].Emis->Pelec_esc = P_elec_esc_ipTFe56;
00257 }
00258
00259
00260 for( long ipSpecies=0; ipSpecies<nSpecies; ipSpecies++ )
00261 {
00262 if( Species[ipSpecies].lgActive )
00263 {
00264 for( long ipHi=1; ipHi<Species[ipSpecies].numLevels_local; ipHi++ )
00265 {
00266 transition *t = &dBaseTrans[ipSpecies][ipHi][0];
00267 for(long ipLo = 0; ipLo < ipHi; ipLo++ )
00268 {
00269 if( t->ipCont > 0 )
00270 {
00271 RT_line_one( t, true, 0.f, GetDopplerWidth( t->Hi->sp->fmolweight ) );
00272 }
00273 ++t;
00274 }
00275 }
00276 }
00277 }
00278
00279
00280
00281
00282 if( conv.lgFirstSweepThisZone || conv.lgLastSweepThisZone )
00283 {
00284 for( i=0; i < nUTA; i++ )
00285 {
00286
00287 UTALines[i].Emis->PopOpc = dense.xIonDense[UTALines[i].Hi->nelem-1][UTALines[i].Hi->IonStg-1];
00288 UTALines[i].Lo->Pop = dense.xIonDense[UTALines[i].Hi->nelem-1][UTALines[i].Hi->IonStg-1];
00289 UTALines[i].Hi->Pop = 0.;
00290 RT_line_one( &UTALines[i], true,0.f,
00291 GetDopplerWidth(dense.AtomicWeight[UTALines[i].Hi->nelem-1]) );
00292 }
00293 }
00294
00295
00296
00297 for( ipISO=ipHE_LIKE; ipISO<NISO; ++ipISO )
00298 {
00299
00300 for( nelem=ipISO; nelem<LIMELM; ++nelem )
00301 {
00302 if( dense.lgElmtOn[nelem] && iso.lgDielRecom[ipISO] )
00303 {
00304 for( ipLo=0; ipLo < iso.numLevels_local[ipISO][nelem]; ++ipLo )
00305 {
00306 RT_line_one( &SatelliteLines[ipISO][nelem][ipLo], true,0.f,
00307 GetDopplerWidth(dense.AtomicWeight[nelem]) );
00308 }
00309 }
00310 }
00311 }
00312
00313
00314 H2_RTMake( );
00315 return;
00316 }