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 }