00001
00002
00003
00004
00005 #include "cddefines.h"
00006 #include "taulines.h"
00007 #include "trace.h"
00008 #include "iso.h"
00009 #include "rfield.h"
00010 #include "opacity.h"
00011 #include "h2.h"
00012 #include "mole.h"
00013 #include "geometry.h"
00014 #include "dense.h"
00015 #include "atomfeii.h"
00016 #include "colden.h"
00017 #include "rt.h"
00018
00019
00020
00021
00022 void RT_tau_reset(void)
00023 {
00024 long int i,
00025 ipHi,
00026 ipISO,
00027 nelem,
00028 ipLo;
00029
00030 double WeightNew;
00031
00032 DEBUG_ENTRY( "RT_tau_reset()" );
00033
00034 if( trace.lgTrace )
00035 {
00036 fprintf( ioQQQ, " UPDATE estimating new optical depths\n" );
00037 if( trace.lgHBug && trace.lgIsoTraceFull[ipH_LIKE] )
00038 {
00039 fprintf( ioQQQ, " New Hydrogen outward optical depths:\n" );
00040 for( ipHi=1; ipHi < iso.numLevels_max[ipH_LIKE][trace.ipIsoTrace[ipH_LIKE]]; ipHi++ )
00041 {
00042 fprintf( ioQQQ, "%3ld", ipHi );
00043 for( ipLo=0; ipLo < ipHi; ipLo++ )
00044 {
00045 if( Transitions[ipH_LIKE][trace.ipIsoTrace[ipH_LIKE]][ipHi][ipLo].ipCont <= 0 )
00046 fprintf( ioQQQ, "%10.2e", 1e-30 );
00047 else
00048 fprintf( ioQQQ, "%10.2e",
00049 Transitions[ipH_LIKE][trace.ipIsoTrace[ipH_LIKE]][ipHi][ipLo].Emis->TauIn );
00050 }
00051 fprintf( ioQQQ, "\n" );
00052 }
00053 }
00054 }
00055
00056
00057 opac.tpcah[1] = opac.tpcah[0];
00058 opac.tpcah[0] = opac.taumin;
00059
00060
00061 for( i=0; i<NCOLD; ++i )
00062 {
00063 colden.colden_old[i] = colden.colden[i];
00064 }
00065 for( i=0; i < mole.num_comole_calc; i++ )
00066 {
00067 COmole[i]->hevcol_old = COmole[i]->hevcol;
00068 }
00069
00070
00071
00072 if( iteration <= 1 )
00073 {
00074
00075 WeightNew = 1.;
00076 }
00077 else
00078 {
00079 WeightNew = 0.75;
00080 }
00081
00082 opac.telec = opac.taumin;
00083 opac.thmin = opac.taumin;
00084
00085
00086 for(ipISO=ipH_LIKE; ipISO<NISO; ++ipISO )
00087 {
00088 for( nelem=ipISO; nelem < LIMELM; nelem++ )
00089 {
00090 if( dense.lgElmtOn[nelem] )
00091 {
00092 for( ipHi=1; ipHi < iso.numLevels_max[ipISO][nelem]; ipHi++ )
00093 {
00094 if( iso.lgDielRecom[ipISO] )
00095 RT_line_one_tau_reset(&SatelliteLines[ipISO][nelem][ipHi],WeightNew);
00096
00097
00098 for( ipLo=0; ipLo < ipHi; ipLo++ )
00099 {
00100 enum {DEBUG_LOC=false};
00101 if( DEBUG_LOC )
00102 {
00103 if( ipISO==1 && nelem==1 && ipHi==iso.nLyaLevel[ipISO] && ipLo==0 )
00104 fprintf(ioQQQ,"DEBUG rt before loop %li %li %li %li tot %.3e in %.3e\n",
00105 ipISO, nelem, ipHi , ipLo ,
00106 Transitions[ipISO][nelem][iso.nLyaLevel[ipISO]][0].Emis->TauTot ,
00107 Transitions[ipISO][nelem][iso.nLyaLevel[ipISO]][0].Emis->TauIn);
00108 }
00109
00110
00111 RT_line_one_tau_reset(&Transitions[ipISO][nelem][ipHi][ipLo],WeightNew);
00112 if( DEBUG_LOC )
00113 {
00114 if( ipISO==1 && nelem==1 && ipHi==iso.nLyaLevel[ipISO] && ipLo==0 )
00115 fprintf(ioQQQ,"DEBUG rt after loop %li %li %li %li tot %.3e in %.3e\n",
00116 ipISO, nelem, ipHi , ipLo ,
00117 Transitions[ipISO][nelem][iso.nLyaLevel[ipISO]][0].Emis->TauTot ,
00118 Transitions[ipISO][nelem][iso.nLyaLevel[ipISO]][0].Emis->TauIn);
00119 }
00120 }
00121 }
00122
00123 for( ipHi=StatesElem[ipISO][nelem][iso.numLevels_max[ipISO][nelem]-1].n; ipHi < iso.nLyman[ipISO]; ipHi++ )
00124 {
00125
00126
00127 RT_line_one_tau_reset(&ExtraLymanLines[ipISO][nelem][ipHi],WeightNew);
00128 }
00129 }
00130 }
00131 }
00132
00133
00134
00135
00136 if( opac.lgCaseB )
00137 {
00138 for( nelem=0; nelem < LIMELM; nelem++ )
00139 {
00140 if( dense.lgElmtOn[nelem] )
00141 {
00142 realnum f;
00143
00144 Transitions[ipH_LIKE][nelem][ipH2p][ipH1s].Emis->TauIn = opac.tlamin;
00145
00146 Transitions[ipH_LIKE][nelem][ipH2p][ipH1s].Emis->TauCon = Transitions[ipH_LIKE][nelem][ipH2p][ipH1s].Emis->TauIn;
00147 Transitions[ipH_LIKE][nelem][ipH2p][ipH1s].Emis->TauTot =
00148 2.f*Transitions[ipH_LIKE][nelem][ipH2p][ipH1s].Emis->TauIn;
00149 f = opac.tlamin/Transitions[ipH_LIKE][nelem][ipH2p][ipH1s].Emis->opacity;
00150
00151 for( ipHi=3; ipHi < iso.numLevels_max[ipH_LIKE][nelem]; ipHi++ )
00152 {
00153 if( Transitions[ipH_LIKE][nelem][ipHi][ipH1s].ipCont <= 0 )
00154 continue;
00155
00156 Transitions[ipH_LIKE][nelem][ipHi][ipH1s].Emis->TauIn =
00157 f*Transitions[ipH_LIKE][nelem][ipHi][ipH1s].Emis->opacity;
00158
00159 Transitions[ipH_LIKE][nelem][ipHi][ipH1s].Emis->TauCon = Transitions[ipH_LIKE][nelem][ipHi][ipH1s].Emis->TauIn;
00160 Transitions[ipH_LIKE][nelem][ipHi][ipH1s].Emis->TauTot =
00161 2.f*Transitions[ipH_LIKE][nelem][ipH2p][ipH1s].Emis->TauIn;
00162 }
00163 }
00164 }
00165
00166
00167
00168 for( nelem=1; nelem < LIMELM; nelem++ )
00169 {
00170 if( dense.lgElmtOn[nelem] )
00171 {
00172 double Aprev;
00173 realnum ratio;
00174
00175 Transitions[ipHE_LIKE][nelem][ipHe2p1P][ipHe1s1S].Emis->TauIn = opac.tlamin;
00176
00177 Transitions[ipHE_LIKE][nelem][ipHe2p1P][ipHe1s1S].Emis->TauCon = Transitions[ipHE_LIKE][nelem][ipHe2p1P][ipHe1s1S].Emis->TauIn;
00178
00179 Transitions[ipHE_LIKE][nelem][ipHe2p1P][ipHe1s1S].Emis->TauTot =
00180 2.f*Transitions[ipHE_LIKE][nelem][ipHe2p1P][ipHe1s1S].Emis->TauIn;
00181
00182 ratio = opac.tlamin/Transitions[ipHE_LIKE][nelem][ipHe2p1P][ipHe1s1S].Emis->opacity;
00183
00184
00185
00186 Aprev = Transitions[ipHE_LIKE][nelem][ipHe2p1P][ipHe1s1S].Emis->Aul;
00187
00188 i = ipHe2p1P+1;
00189
00190
00191 for( i = ipHe2p1P+1; i < iso.numLevels_max[ipHE_LIKE][nelem]; i++ )
00192 {
00193 if( Transitions[ipHE_LIKE][nelem][i][ipHe1s1S].ipCont <= 0 )
00194 continue;
00195
00196
00197 if( Transitions[ipHE_LIKE][nelem][i][ipHe1s1S].Emis->Aul> Aprev/10. ||
00198 StatesElem[ipHE_LIKE][nelem][i].S < 0 )
00199 {
00200 Aprev = Transitions[ipHE_LIKE][nelem][i][ipHe1s1S].Emis->Aul;
00201 Transitions[ipHE_LIKE][nelem][i][ipHe1s1S].Emis->TauIn =
00202 ratio*Transitions[ipHE_LIKE][nelem][i][ipHe1s1S].Emis->opacity;
00203
00204 Transitions[ipHE_LIKE][nelem][i][ipHe1s1S].Emis->TauCon =
00205 Transitions[ipHE_LIKE][nelem][i][ipHe1s1S].Emis->TauIn;
00206 Transitions[ipHE_LIKE][nelem][i][ipHe1s1S].Emis->TauTot =
00207 2.f*Transitions[ipHE_LIKE][nelem][i][ipHe1s1S].Emis->TauIn;
00208
00209
00210 }
00211 }
00212 }
00213 }
00214 }
00215
00216
00217 for( i=1; i <= nLevel1; i++ )
00218 {
00219 RT_line_one_tau_reset(&TauLines[i],WeightNew);
00220
00221 ASSERT( fabs(TauLines[i].Emis->TauIn) <= fabs(TauLines[i].Emis->TauTot) );
00222 }
00223
00224
00225 memset(rfield.fine_opt_depth , 0 , (unsigned long)rfield.nfine*sizeof(realnum) );
00226
00227
00228 for( i=0; i < nWindLine; i++ )
00229 {
00230 if( TauLine2[i].Hi->IonStg < TauLine2[i].Hi->nelem+1-NISO )
00231 {
00232 RT_line_one_tau_reset(&TauLine2[i],WeightNew);
00233 }
00234 }
00235
00236
00237 for( i=0; i < nHFLines; i++ )
00238 {
00239 RT_line_one_tau_reset(&HFLines[i],WeightNew);
00240 }
00241
00242
00243 for( i=0; i < linesAdded2; i++)
00244 {
00245 RT_line_one_tau_reset( atmolEmis[i].tran,WeightNew );
00246 }
00247
00248
00249 for( i=0; i < nUTA; i++ )
00250 {
00251 if( UTALines[i].Emis->Aul > 0. )
00252 {
00253
00254
00255
00256 double hsave = UTALines[i].Coll.heat;
00257 RT_line_one_tau_reset(&UTALines[i],WeightNew);
00258 UTALines[i].Coll.heat = hsave;
00259 }
00260 }
00261
00262
00263 for( i=0; i < nCORotate; i++ )
00264 {
00265 RT_line_one_tau_reset(&C12O16Rotate[i],WeightNew);
00266 RT_line_one_tau_reset(&C13O16Rotate[i],WeightNew);
00267 }
00268
00269
00270 H2_RT_tau_reset();
00271
00272
00273 FeII_RT_tau_reset();
00274
00275 if( opac.lgCaseB )
00276 {
00277 for( i=0; i < rfield.nupper; i++ )
00278 {
00279
00280
00281
00282 opac.TauAbsGeo[0][i] = opac.TauAbsGeo[1][i]/2.f;
00283
00284 opac.TauScatGeo[0][i] = opac.TauScatGeo[1][i]/2.f;
00285 }
00286 }
00287 else if( geometry.lgSphere )
00288 {
00289
00290 for( i=0; i < rfield.nupper; i++ )
00291 {
00292
00293
00294 opac.TauAbsGeo[1][i] = 2.f*opac.TauAbsFace[i];
00295 opac.TauAbsGeo[0][i] = opac.TauAbsFace[i];
00296 opac.TauScatGeo[1][i] = 2.f*opac.TauScatFace[i];
00297 opac.TauScatGeo[0][i] = opac.TauScatFace[i];
00298 opac.TauTotalGeo[1][i] = opac.TauScatGeo[1][i] + opac.TauAbsGeo[1][i];
00299 opac.TauTotalGeo[0][i] = opac.TauScatGeo[0][i] + opac.TauAbsGeo[0][i];
00300 }
00301 }
00302 else
00303 {
00304
00305 for( i=0; i < rfield.nupper; i++ )
00306 {
00307 opac.TauTotalGeo[1][i] = opac.TauTotalGeo[0][i];
00308 opac.TauTotalGeo[0][i] = opac.taumin;
00309 opac.TauAbsGeo[1][i] = opac.TauAbsGeo[0][i];
00310 opac.TauAbsGeo[0][i] = opac.taumin;
00311 opac.TauScatGeo[1][i] = opac.TauScatGeo[0][i];
00312 opac.TauScatGeo[0][i] = opac.taumin;
00313 }
00314 }
00315
00316
00317 for( i=0; i < rfield.nupper; i++ )
00318 {
00319
00320 opac.TauAbsTotal[i] = opac.TauAbsFace[i];
00321
00322
00323 opac.E2TauAbsTotal[i] = (realnum)e2( opac.TauAbsTotal[i] );
00324
00325 opac.TauScatFace[i] = opac.taumin;
00326 opac.TauAbsFace[i] = opac.taumin;
00327 }
00328
00329
00330 rt.tauxry = opac.TauAbsGeo[0][rt.ipxry-1];
00331 return;
00332 }