cloudy  trunk
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
rt_tau_inc.cpp
Go to the documentation of this file.
1 /* This file is part of Cloudy and is copyright (C)1978-2013 by Gary J. Ferland and
2  * others. For conditions of distribution and use see copyright notice in license.txt */
3 /*RT_tau_inc increment optical depths once per zone, called after radius_increment */
4 #include "cddefines.h"
5 #include "taulines.h"
6 #include "iso.h"
7 #include "rfield.h"
8 #include "trace.h"
9 #include "dense.h"
10 #include "hyperfine.h"
11 #include "wind.h"
12 #include "prt.h"
13 #include "conv.h"
14 #include "h2.h"
15 #include "mole.h"
16 #include "hmi.h"
17 #include "opacity.h"
18 #include "cooling.h"
19 #include "thermal.h"
20 #include "radius.h"
21 #include "atomfeii.h"
22 #include "rt.h"
23 #include "doppvel.h"
24 #include "mole.h"
25 
26 /*RT_tau_inc increment optical depths once per zone, called after radius_increment */
27 void RT_tau_inc(void)
28 {
29 
30  long int i,
31  ipHi,
32  ipLo;
33 
34  DEBUG_ENTRY( "RT_tau_inc()" );
35 
36  if( trace.lgTrace )
37  {
38  fprintf( ioQQQ, " RT_tau_inc called.\n" );
39  }
40 
41  /* call RT_line_all one last time in this zone, to get fine opacities defined */
44  RT_line_all( );
45  /* this may have updated some escape/destruction rates - force update
46  * to all cooling lines */
48 
49  if( nzone <=1 )
50  {
53  (1. - rfield.ContBoltz[hmi.iphmin-1]/ hmi.hmidep));
54  }
55  else
56  {
59  (1. - rfield.ContBoltz[hmi.iphmin-1]/ hmi.hmidep));
60  }
61 
62  /* prevent maser runaway */
63  rt.dTauMase = 0;
64  rt.mas_species = 0;
65  rt.mas_ion = 0;
66  rt.mas_hi = 0;
67  rt.mas_lo = 0;
68 
69  /* all lines in iso sequences */
70  for( long ipISO=ipH_LIKE; ipISO<NISO; ++ipISO )
71  {
72  for( long nelem=ipISO; nelem < LIMELM; nelem++ )
73  {
74  /* this is the parent ion, for HI lines, is 1,
75  * for element He is 1 for He-like (HeI) and 2 for H-like (HeII) */
76  int ion = nelem+1-ipISO;
77  /* do not evaluate in case where trivial parent ion */
78  if( ion <=dense.IonHigh[nelem] && dense.xIonDense[nelem][ion] > dense.density_low_limit )
79  {
80  if( iso_ctrl.lgDielRecom[ipISO] )
81  {
82  // SatelliteLines are indexed by lower level
83  for( ipLo=0; ipLo < iso_sp[ipISO][nelem].numLevels_local; ipLo++ )
84  {
85  RT_line_one_tauinc(SatelliteLines[ipISO][nelem][ipSatelliteLines[ipISO][nelem][ipLo]], ipISO, nelem, -1, ipLo,
87  }
88  }
89 
90  for( ipHi=1; ipHi < iso_sp[ipISO][nelem].numLevels_local; ipHi++ )
91  {
92  for( ipLo=0; ipLo < ipHi; ipLo++ )
93  {
94  if( iso_sp[ipISO][nelem].trans(ipHi,ipLo).ipCont() <= 0 )
95  continue;
96 
97  /* actually do the work */
98  RT_line_one_tauinc(iso_sp[ipISO][nelem].trans(ipHi,ipLo), ipISO, nelem, ipHi, ipLo,
100  }
101  }
102  ipLo = 0;
103  /* these are the extra Lyman lines */
104  for( ipHi=iso_sp[ipISO][nelem].st[iso_sp[ipISO][nelem].numLevels_local-1].n()+1; ipHi < iso_ctrl.nLyman[ipISO]; ipHi++ )
105  {
106  TransitionList::iterator tr = ExtraLymanLines[ipISO][nelem].begin()+ipExtraLymanLines[ipISO][nelem][ipHi];
107  (*tr).Emis().PopOpc() = iso_sp[ipISO][nelem].st[0].Pop();
108 
109  /* actually do the work */
110  RT_line_one_tauinc(*tr, -1 ,ipISO, nelem, ipHi,
112  }
113  }
114  }
115  }
116 
117  /* increment optical depths for all heavy element lines
118  * same routine does wind and static,
119  * does not start from 0 since first line is dummy */
120  for( i=1; i <= nLevel1; i++ )
121  {
122  RT_line_one_tauinc(TauLines[i], -2, -2, -2, i, GetDopplerWidth(dense.AtomicWeight[(*TauLines[i].Hi()).nelem()-1]) );
123  }
124 
125  /* all lines in cooling with g-bar */
126  for( i=0; i < nWindLine; i++ )
127  {
128  /* do not include H-like or He-like in the level two lines since
129  * these are already counted in iso sequences */
130  if( (*TauLine2[i].Hi()).IonStg() < (*TauLine2[i].Hi()).nelem()+1-NISO )
131  {
132  RT_line_one_tauinc(TauLine2[i], -3, -3, -3, i, GetDopplerWidth(dense.AtomicWeight[(*TauLine2[i].Hi()).nelem()-1]) );
133  }
134  }
135 
136  /* the block of inner shell lines */
137  for( i=0; i < nUTA; i++ )
138  {
139  /* populations have not been set */
140  UTALines[i].Emis().PopOpc() = dense.xIonDense[(*UTALines[i].Hi()).nelem()-1][(*UTALines[i].Hi()).IonStg()-1];
141  (*UTALines[i].Lo()).Pop() = dense.xIonDense[(*UTALines[i].Hi()).nelem()-1][(*UTALines[i].Hi()).IonStg()-1];
142  (*UTALines[i].Hi()).Pop() = 0.;
143  RT_line_one_tauinc(UTALines[i], -4 , -4 , -4 , i, GetDopplerWidth(dense.AtomicWeight[(*UTALines[i].Hi()).nelem()-1]) );
144  }
145 
146  /* all hyper fine structure lines */
147  for( i=0; i < nHFLines; i++ )
148  {
149  /* remember current gas-phase abundances */
150  realnum save = dense.xIonDense[(*HFLines[i].Hi()).nelem()-1][(*HFLines[i].Hi()).IonStg()-1];
151 
152  /* bail if no abundance */
153  if( save<=0. ) continue;
154 
155  /* set gas-phase abundance to total times isotope ratio */
156  dense.xIonDense[(*HFLines[i].Hi()).nelem()-1][(*HFLines[i].Hi()).IonStg()-1] *= hyperfine.HFLabundance[i];
157 
158  RT_line_one_tauinc(HFLines[i] , -5 , -5 , -5 , i, GetDopplerWidth(dense.AtomicWeight[(*HFLines[i].Hi()).nelem()-1]) );
159 
160  /* put the correct gas-phase abundance back in the array */
161  dense.xIonDense[(*HFLines[i].Hi()).nelem()-1][(*HFLines[i].Hi()).IonStg()-1] = save;
162  }
163 
164  /* do large FeII atom if this is enabled */
165  FeII_RT_TauInc();
166 
167  /* increment optical depth for the H2 molecule */
168  for( diatom_iter diatom = diatoms.begin(); diatom != diatoms.end(); ++diatom )
169  (*diatom)->H2_RT_tau_inc();
170 
171  /* database Lines*/
172  for( long ipSpecies=0; ipSpecies<nSpecies; ipSpecies++ )
173  {
174  if( dBaseSpecies[ipSpecies].lgActive )
175  {
176  realnum DopplerWidth = GetDopplerWidth( dBaseSpecies[ipSpecies].fmolweight );
177  for (TransitionList::iterator tr=dBaseTrans[ipSpecies].begin();
178  tr != dBaseTrans[ipSpecies].end(); ++tr)
179  {
180  int ipHi = (*tr).ipHi();
181  if (ipHi >= dBaseSpecies[ipSpecies].numLevels_local || (*tr).ipCont() <= 0)
182  continue;
183  int ipLo = (*tr).ipLo();
184 
185  RT_line_one_tauinc( *tr, -10, ipSpecies, ipHi, ipLo, DopplerWidth );
186  }
187  }
188  }
189 
190  /* following is for static atmosphere */
191  if( wind.lgStatic() )
192  {
193  /* iron fe feii fe2 - overlapping feii lines */
195  }
196 
197  if( trace.lgTrace && trace.lgOptcBug )
198  {
199  fprintf( ioQQQ, " RT_tau_inc updated optical depths:\n" );
200  prtmet();
201  }
202 
203  if( trace.lgTrace )
204  fprintf( ioQQQ, " RT_tau_inc returns.\n" );
205 
206  return;
207 }
long int iphmin
Definition: hmi.h:117
t_thermal thermal
Definition: thermal.cpp:5
qList st
Definition: iso.h:453
TransitionList UTALines("UTALines",&AnonStates)
t_opac opac
Definition: opacity.cpp:5
multi_arr< int, 3 > ipSatelliteLines
Definition: taulines.cpp:37
long int nLevel1
Definition: taulines.cpp:28
t_hyperfine hyperfine
Definition: hyperfine.cpp:5
t_isoCTRL iso_ctrl
Definition: iso.cpp:6
bool lgFirstSweepThisZone
Definition: conv.h:155
const int NISO
Definition: cddefines.h:265
long int mas_species
Definition: rt.h:277
void RT_line_all(void)
Definition: rt_line_all.cpp:26
void FeII_RT_TauInc(void)
Definition: atom_feii.cpp:1396
double ctot
Definition: thermal.h:110
t_conv conv
Definition: conv.cpp:5
TransitionList HFLines("HFLines",&AnonStates)
void CoolEvaluate(double *tot)
Definition: cool_eval.cpp:45
t_dense dense
Definition: dense.cpp:24
FILE * ioQQQ
Definition: cddefines.cpp:7
molezone * findspecieslocal(const char buf[])
void RT_tau_inc(void)
Definition: rt_tau_inc.cpp:27
long int nzone
Definition: cddefines.cpp:14
TransitionList TauLine2("TauLine2",&AnonStates)
long int nSpecies
Definition: taulines.cpp:21
double density_low_limit
Definition: dense.h:197
double xIonDense[LIMELM][LIMELM+1]
Definition: dense.h:125
static t_fe2ovr_la & Inst()
Definition: cddefines.h:179
t_iso_sp iso_sp[NISO][LIMELM]
Definition: iso.cpp:8
Wind wind
Definition: wind.cpp:5
t_trace trace
Definition: trace.cpp:5
void prtmet(void)
Definition: prt_met.cpp:15
long int nLyman[NISO]
Definition: iso.h:334
bool lgTrace
Definition: trace.h:12
multi_arr< int, 3 > ipExtraLymanLines
Definition: taulines.cpp:24
t_rfield rfield
Definition: rfield.cpp:8
long int IonHigh[LIMELM+1]
Definition: dense.h:120
bool lgDielRecom[NISO]
Definition: iso.h:365
float realnum
Definition: cddefines.h:107
realnum thmin
Definition: opacity.h:175
vector< diatomics * > diatoms
Definition: h2.cpp:8
realnum AtomicWeight[LIMELM]
Definition: dense.h:75
realnum telec
Definition: opacity.h:175
double * ContBoltz
Definition: rfield.h:145
void tau_inc()
realnum GetDopplerWidth(realnum massAMU)
vector< vector< TransitionList > > SatelliteLines
Definition: taulines.cpp:38
long nWindLine
Definition: cdinit.cpp:19
species * dBaseSpecies
Definition: taulines.cpp:14
void RT_line_one_tauinc(const TransitionProxy &t, long int mas_species, long int mas_ion, long int mas_hi, long int mas_lo, realnum DopplerWidth)
t_radius radius
Definition: radius.cpp:5
long int mas_lo
Definition: rt.h:277
#define ASSERT(exp)
Definition: cddefines.h:582
TransitionList TauLines("TauLines",&AnonStates)
const int ipH_LIKE
Definition: iso.h:62
vector< vector< TransitionList > > ExtraLymanLines
Definition: taulines.cpp:25
const int LIMELM
Definition: cddefines.h:262
double hmidep
Definition: hmi.h:33
double drad_x_fillfac
Definition: radius.h:71
double den
Definition: mole.h:396
#define DEBUG_ENTRY(funcname)
Definition: cddefines.h:688
long int mas_hi
Definition: rt.h:277
double eden
Definition: dense.h:190
long int nHFLines
Definition: taulines.cpp:31
realnum dTauMase
Definition: rt.h:267
bool lgStatic(void) const
Definition: wind.h:24
bool lgLastSweepThisZone
Definition: conv.h:157
bool lgOptcBug
Definition: trace.h:49
long int nUTA
Definition: taulines.cpp:26
t_hmi hmi
Definition: hmi.cpp:5
vector< TransitionList > dBaseTrans
Definition: taulines.cpp:17
t_save save
Definition: save.cpp:5
long int mas_ion
Definition: rt.h:277
long int numLevels_local
Definition: iso.h:498
EmissionList & Emis()
Definition: transition.h:329
vector< diatomics * >::iterator diatom_iter
Definition: h2.h:13
realnum * HFLabundance
Definition: hyperfine.h:44
t_rt rt
Definition: rt.cpp:5