00001
00002
00003
00004 #include "cddefines.h"
00005 #include "taulines.h"
00006 #include "iso.h"
00007 #include "rfield.h"
00008 #include "trace.h"
00009 #include "dense.h"
00010 #include "hyperfine.h"
00011 #include "wind.h"
00012 #include "prt.h"
00013 #include "conv.h"
00014 #include "h2.h"
00015 #include "hmi.h"
00016 #include "opacity.h"
00017 #include "cooling.h"
00018 #include "thermal.h"
00019 #include "radius.h"
00020 #include "atomfeii.h"
00021 #include "rt.h"
00022 #include "doppvel.h"
00023 #include "mole.h"
00024
00025
00026 void RT_tau_inc(void)
00027 {
00028
00029 long int i,
00030 ipHi,
00031 nelem,
00032 ipLo,
00033 ipISO;
00034
00035 DEBUG_ENTRY( "RT_tau_inc()" );
00036
00037 if( trace.lgTrace )
00038 {
00039 fprintf( ioQQQ, " RT_tau_inc called.\n" );
00040 }
00041
00042
00043 ASSERT( !conv.lgFirstSweepThisZone );
00044 conv.lgLastSweepThisZone = true;
00045 RT_line_all( );
00046
00047
00048 CoolEvaluate( &thermal.ctot );
00049
00050 if( nzone <=1 )
00051 {
00052 opac.telec = (realnum)(radius.drad_x_fillfac*dense.eden*6.65e-25);
00053 opac.thmin = (realnum)(radius.drad_x_fillfac*hmi.Hmolec[ipMHm]*3.9e-17*
00054 (1. - rfield.ContBoltz[hmi.iphmin-1]/ hmi.hmidep));
00055 }
00056 else
00057 {
00058 opac.telec += (realnum)(radius.drad_x_fillfac*dense.eden*6.65e-25);
00059 opac.thmin += (realnum)(radius.drad_x_fillfac*hmi.Hmolec[ipMHm]*3.9e-17*
00060 (1. - rfield.ContBoltz[hmi.iphmin-1]/ hmi.hmidep));
00061 }
00062
00063
00064 rt.dTauMase = 0;
00065 rt.mas_species = 0;
00066 rt.mas_ion = 0;
00067 rt.mas_hi = 0;
00068 rt.mas_lo = 0;
00069
00070
00071 for( ipISO=ipH_LIKE; ipISO<NISO; ++ipISO )
00072 {
00073 for( nelem=ipISO; nelem < LIMELM; nelem++ )
00074 {
00075
00076
00077 int ion = nelem+1-ipISO;
00078
00079 if( ion <=dense.IonHigh[nelem] && dense.xIonDense[nelem][ion] > dense.density_low_limit )
00080 {
00081
00082 for( ipLo=0; ipLo < iso.numLevels_local[ipISO][nelem]; ipLo++ )
00083 {
00084 if( iso.lgDielRecom[ipISO] )
00085 RT_line_one_tauinc(&SatelliteLines[ipISO][nelem][ipLo], ipISO, nelem, -1, ipLo,
00086 GetDopplerWidth(dense.AtomicWeight[nelem]) );
00087 }
00088
00089 for( ipHi=1; ipHi < iso.numLevels_local[ipISO][nelem]; ipHi++ )
00090 {
00091 for( ipLo=0; ipLo < ipHi; ipLo++ )
00092 {
00093 if( Transitions[ipISO][nelem][ipHi][ipLo].ipCont <= 0 )
00094 continue;
00095
00096
00097 RT_line_one_tauinc(&Transitions[ipISO][nelem][ipHi][ipLo], ipISO, nelem, ipHi, ipLo,
00098 GetDopplerWidth(dense.AtomicWeight[nelem]) );
00099 }
00100 }
00101 ipLo = 0;
00102
00103 for( ipHi=StatesElemNEW[nelem][nelem-ipISO][iso.numLevels_max[ipISO][nelem]-1].n; ipHi < iso.nLyman[ipISO]; ipHi++ )
00104 {
00105 ExtraLymanLines[ipISO][nelem][ipHi].Emis->PopOpc = StatesElemNEW[nelem][nelem-ipISO][0].Pop;
00106
00107
00108 RT_line_one_tauinc(&ExtraLymanLines[ipISO][nelem][ipHi], -1 ,ipISO, nelem, ipHi,
00109 GetDopplerWidth(dense.AtomicWeight[nelem]) );
00110 }
00111 }
00112 }
00113 }
00114
00115
00116
00117
00118 for( i=1; i <= nLevel1; i++ )
00119 {
00120 RT_line_one_tauinc(&TauLines[i], -2, -2, -2, i, GetDopplerWidth(dense.AtomicWeight[TauLines[i].Hi->nelem-1]) );
00121 }
00122
00123
00124 for( i=0; i < nWindLine; i++ )
00125 {
00126
00127
00128 if( TauLine2[i].Hi->IonStg < TauLine2[i].Hi->nelem+1-NISO )
00129 {
00130 RT_line_one_tauinc(&TauLine2[i], -3, -3, -3, i, GetDopplerWidth(dense.AtomicWeight[TauLine2[i].Hi->nelem-1]) );
00131 }
00132 }
00133
00134
00135 for( i=0; i < nUTA; i++ )
00136 {
00137
00138 UTALines[i].Emis->PopOpc = dense.xIonDense[UTALines[i].Hi->nelem-1][UTALines[i].Hi->IonStg-1];
00139 UTALines[i].Lo->Pop = dense.xIonDense[UTALines[i].Hi->nelem-1][UTALines[i].Hi->IonStg-1];
00140 UTALines[i].Hi->Pop = 0.;
00141 RT_line_one_tauinc(&UTALines[i], -4 , -4 , -4 , i, GetDopplerWidth(dense.AtomicWeight[UTALines[i].Hi->nelem-1]) );
00142 }
00143
00144
00145 for( i=0; i < nHFLines; i++ )
00146 {
00147
00148 realnum save = dense.xIonDense[HFLines[i].Hi->nelem-1][HFLines[i].Hi->IonStg-1];
00149
00150
00151 if( save<=0. ) continue;
00152
00153
00154 dense.xIonDense[HFLines[i].Hi->nelem-1][HFLines[i].Hi->IonStg-1] *= hyperfine.HFLabundance[i];
00155
00156 RT_line_one_tauinc(&HFLines[i] , -5 , -5 , -5 , i, GetDopplerWidth(dense.AtomicWeight[HFLines[i].Hi->nelem-1]) );
00157
00158
00159 dense.xIonDense[HFLines[i].Hi->nelem-1][HFLines[i].Hi->IonStg-1] = save;
00160 }
00161
00162
00163 FeII_RT_TauInc();
00164
00165
00166 H2_RT_tau_inc();
00167
00168
00169 for(i=0; i < linesAdded2; i++)
00170 RT_line_one_tauinc(dBaseLines[i].tran, -10, -10, -10, i, GetDopplerWidth( dBaseLines[i].tran->Hi->sp->fmolweight ) );
00171
00172
00173 if( wind.lgStatic() )
00174 {
00175
00176 t_fe2ovr_la::Inst().tau_inc();
00177 }
00178
00179 if( trace.lgTrace && trace.lgOptcBug )
00180 {
00181 fprintf( ioQQQ, " RT_tau_inc updated optical depths:\n" );
00182 prtmet();
00183 }
00184
00185 if( trace.lgTrace )
00186 fprintf( ioQQQ, " RT_tau_inc returns.\n" );
00187
00188 return;
00189 }