cloudy  trunk
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
rt_line_one.cpp
Go to the documentation of this file.
1 /* This file is part of Cloudy and is copyright (C)1978-2022 by Gary J. Ferland and
2  * others. For conditions of distribution and use see copyright notice in license.txt */
3 /*RT_line_escape do line radiative transfer,
4  * evaluates escape and destruction probability */
5 /* NB no wind distinction - that is done where optical depths are incremented
6  * with line opacity - rt_line_one_tauinc and in line width for rad pressure */
7 /*RT_line_fine_opacity do fine opacities for one line */
8 /*RT_line_pumping pumping by external and locally emitted radiation fields */
9 #include "cddefines.h"
10 #include "rfield.h"
11 #include "opacity.h"
12 #include "conv.h"
13 #include "radius.h"
14 #include "rt_escprob.h"
15 #include "rt.h"
16 #include "cosmology.h"
17 #include "hydrogenic.h"
18 #include "iso.h"
19 #include "wind.h"
20 #include "geometry.h"
21 
22 /*RT_line_pumping pumping by external and locally emitted radiation fields */
24  /* the em line we will work on */
25  const TransitionProxy& t ,
26  /* this is option to not include line self shielding across this zone.
27  * this can cause pump to depend on zone thickness, and leads to unstable
28  * feedback in some models with the large H2 molecule, due to Solomon
29  * process depending on zone thickness and level populations. */
30  bool lgShield_this_zone,
31  realnum DopplerWidth)
32 {
33  DEBUG_ENTRY( "RT_line_pumping()" );
34 
35  ASSERT( t.ipCont() >= 1 );
36 
37  /* pumping by incident and diffuse continua */
38  /* option to kill induced processes */
39  if( !rfield.lgInducProcess )
40  {
41  t.Emis().pump() = 0.;
42  }
43  else if( conv.lgFirstSweepThisZone || t.Emis().iRedisFun() == ipLY_A )
44  {
45  double EffectiveThickness = radius.drad_x_fillfac;
46  if( cosmology.lgDo )
47  {
48  EffectiveThickness = safe_div( DopplerWidth, wind.dvdr );
49  lgShield_this_zone = false;
50  }
51  double dTau = (t.Emis().PopOpc() * t.Emis().opacity() / DopplerWidth +
52  opac.opacity_abs[t.ipCont()-1])* EffectiveThickness;
53 
54  /* continuum shielding into this function -- now includes
55  optional correction for finite zone depth */
56  double shield_continuum = RT_continuum_shield_fcn( t, lgShield_this_zone, dTau );
57 
58  /* continuum upward pumping rate, A gu/gl abs prob occnum
59  * the "no induced" command causes continuum pumping to be set to 0
60  * this includes pumping by diffuse continuum */
61  t.Emis().pump() = t.Emis().Aul() * (*t.Hi()).g() / (*t.Lo()).g() * shield_continuum *(
63 
64  if( 0 && t.chLabel() == "H 1 1215.67A" )
65  fprintf(ioQQQ,
66  "LINE PUMPING:\t label= \"%s\"\t %g\t %g\t %g\n",
67  t.chLabel().c_str(),
68  shield_continuum,
70  t.Emis().pump()
71  );
72  /*
73  * This is an option to account for intrinsic absorption or emission line the lyman
74  * lines. This is done without changing the incident coarse continuum.
75  * Check if continuum pumping of H Lyman lines to be multiplied by scale factor
76  * hydro.xLymanPumpingScaleFactor is set with atom h-like Lyman pumping scale command
77  * Lya pump rate is always updated - this is simplest way to finese intrinsic absorption
78  * or emission
79  */
80  if ( t.ipLo() == 0 && t.systemIs(iso_sp[ipH_LIKE][ipHYDROGEN].tr) )
81  {
83  }
84  /* NB NB line pumping by local diffuse emission is not included. */
85  }
86 
87  return;
88 }
89 
90 /*RT_line_escape do line radiative transfer escape and destruction probabilities
91  * this routine sets */
93  /* the em line we will work on */
94  const TransitionProxy &t,
95  /* Stark escape probability to be added to Pesc */
96  realnum pestrk,
97  realnum DopplerWidth,
98  bool lgGoodTau)
99 {
100  DestType nRedis;
101 
102  DEBUG_ENTRY( "RT_line_escape()" );
103 
104  /* a runaway maser */
105  if( t.Emis().TauIn() < -30. )
106  {
107  fprintf( ioQQQ, "PROBLEM RT_line_escape called with large negative "
108  "optical depth, zone %.2f, setting lgAbort true.\n",
109  fnzone );
110  DumpLine(t);
111  /* return busted true instead of exit here, so that code will
112  * not hang under MPI */
113  lgAbort = true;
114  return;
115  }
116 
117  if( cosmology.lgDo )
118  {
119  /* Sobolev escape */
120  if( conv.lgFirstSweepThisZone && lgGoodTau )
121  {
122  realnum tau_Sobolev = t.Emis().TauTot();
123 
124  if( tau_Sobolev < 1E-5 )
125  {
126  t.Emis().Pesc() = 1.;
127  }
128  else
129  {
130  t.Emis().Pesc() = ( 1.f - exp( -1.f * tau_Sobolev ) )/ tau_Sobolev;
131  }
132 
133  /* inward escaping fraction */
134  t.Emis().FracInwd() = rt.fracin;
135  }
136  fixit("is this correct?");
137  nRedis.t = DestType::ipDEST_K2;
138  }
139  else if (0) // LVG escape from Castor, Radiation Hydrodynamics
140  {
141  if( conv.lgFirstSweepThisZone && lgGoodTau )
142  {
143  long int ipLineCenter = t.Emis().ipFine() + rfield.ipFineConVelShift;
144 
145  double OpacityEffective;
146  // Don't use fine opacity -- need to make sure a fully updated
147  // value is used, or use other means to handle overlap
148  if( 0 &&
149  t.Emis().ipFine()>=0 && ipLineCenter>0 &&
150  ipLineCenter<rfield.nfine && rfield.lgOpacityFine )
151  {
152  OpacityEffective = rfield.fine_opac_zone[ipLineCenter];
153  }
154  else
155  {
156  OpacityEffective = t.Emis().VoigtLineCen() * t.Emis().PopOpc() *
157  t.Emis().opacity() / DopplerWidth;
158  }
159 
160  // Castor, Radiation Hydrodynamics, p127
161  double exprate, sigma;
162  if ( !cosmology.lgDo )
163  {
164  exprate = radius.depth / wind.windv;
165  sigma = exprate * wind.dvdr - 1.0; // (6.103)
166  }
167  else
168  {
170  sigma = 0.0;
171  }
172  double tau = exprate * geometry.FillFac * OpacityEffective *
173  DopplerWidth; // (6.106)
174  t.Emis().Pesc() = (realnum) RT_EscLVG(tau, sigma);
175  t.Emis().FracInwd() = 0.5;
176  }
177  fixit("is this correct?");
178  nRedis.t = DestType::ipDEST_K2;
179  }
180  /* static solution - which type of line will determine
181  * which redistribution function */
182  /* iRedisFun() == 1 - alpha resonance line, partial redistribution,
183  * ipPRD == 1 */
184  else if( t.Emis().iRedisFun() == ipPRD )
185  {
186  /* incomplete redistribution with wings */
187  if( conv.lgFirstSweepThisZone && lgGoodTau )
188  {
189  t.Emis().Pesc() = (realnum)esc_PRD( t.Emis().TauIn(), t.Emis().TauTot(), t.Emis().damp() );
190 
191  /* >>chng 03 jun 07, do not clobber esp prob when line is masing -
192  * this had effect of preventing total escape prob from getting larger than 1 */
193  if( pestrk > 0.f && t.Emis().Pesc() < 1.f )
194  t.Emis().Pesc() = min( 1.f, t.Emis().Pesc() + pestrk );
195 
196  /* inward escaping fraction */
197  t.Emis().FracInwd() = rt.fracin;
198  }
199  nRedis.t = DestType::ipDEST_INCOM;
200  }
201 
202  /* complete redistribution without wings - t.ipLnRedis is ipCRD == -1 */
203  else if( t.Emis().iRedisFun() == ipCRD )
204  {
205  if( conv.lgFirstSweepThisZone && lgGoodTau )
206  {
207  /* >>chng 01 mar -6, escsub will call any of several esc prob routines,
208  * depending of how core is set. We always want core-only for this option,
209  * so call esca0k2(tau) directly */
210  t.Emis().Pesc() = (realnum)esc_CRDcore( t.Emis().TauIn(), t.Emis().TauTot() );
211 
212  if( pestrk > 0.f && t.Emis().Pesc() < 1.f )
213  t.Emis().Pesc() = min( 1.f, t.Emis().Pesc() + pestrk );
214 
215  /* inward escaping fraction */
216  t.Emis().FracInwd() = rt.fracin;
217  }
218  nRedis.t = DestType::ipDEST_K2;
219  }
220 
221  /* CRD with wings, = 2 */
222  else if( t.Emis().iRedisFun() == ipCRDW )
223  {
224  /* complete redistribution with damping wings */
225  if( conv.lgFirstSweepThisZone && lgGoodTau )
226  {
227  t.Emis().Pesc() = (realnum)esc_CRDwing( t.Emis().TauIn(), t.Emis().TauTot(), t.Emis().damp() );
228 
229  if( pestrk > 0.f && t.Emis().Pesc() < 1.f )
230  t.Emis().Pesc() = min( 1.f, t.Emis().Pesc() + pestrk );
231 
232  /* inward escaping fraction */
233  t.Emis().FracInwd() = rt.fracin;
234  }
235  nRedis.t = DestType::ipDEST_K2;
236  }
237 
238  /* Lya is special case */
239  else if( t.Emis().iRedisFun() == ipLY_A )
240  {
241  /* incomplete redistribution with wings, for special case of Lya
242  * uses fits to Hummer & Kunasz numerical results
243  * this routine is different because escape and dest probs
244  * are evaluated together, so no test of lgDoEsc */
245  if( lgGoodTau )
246  {
247  double dest , esin;
248 
249  /* this will always evaluate escape prob, no matter what lgDoEsc is.
250  * The destruction prob comes back as dest */
251  t.Emis().Pesc() = (realnum)RTesc_lya( &esin, &dest, t.Emis().PopOpc(), t, DopplerWidth );
252 
253  if( pestrk > 0.f && t.Emis().Pesc() < 1.f )
254  t.Emis().Pesc() = min( 1.f, t.Emis().Pesc() + pestrk );
255 
256  /* this is fraction of line which is inward escaping */
257  t.Emis().FracInwd() = rt.fracin;
258 
259  nRedis.t = DestType::ipDEST_LYA;
260  nRedis.dest = dest;
261  }
262  }
263  else
264  {
265  fprintf( ioQQQ, " RT_line_escape called with impossible redistribution function %d\n",
266  t.Emis().iRedisFun());
267  ShowMe();
269  }
270 
271  if( lgGoodTau && t.Emis().opacity() > 0. )
272  {
273  // Now include electron escape
274  RT_DestProb(t,
275  /* line width in velocity units */
276  DopplerWidth,
277  /* redistribution function */
278  nRedis);
279  }
280  return;
281 }
282 
283 /*RT_line_fine_opacity do fine opacities for one line */
285  /* the em line we will work on */
286  const TransitionProxy& t,
287  realnum DopplerWidth)
288 {
289  DEBUG_ENTRY( "RT_line_fine_opacity()" );
290 
291  /* this is line center frequency, including bulk motion of gas */
292  long int ipLineCenter = t.Emis().ipFine() + rfield.ipFineConVelShift;
293 
294  /* define fine opacity fine grid fine mesh */
295  /* rfield.lgOpacityFine flag set false with no fine opacities command */
297  if( ipLineCenter < 0 || t.Emis().PopOpc() < SMALLFLOAT ||
298  ipLineCenter>rfield.nfine || !rfield.lgOpacityFine )
299  {
300  return;
301  }
302 
303  /* number of fine opacity cells corresponding to one doppler width for current
304  * temperature, velocity field, and nuclear mass,
305  * rfield.fine_opac_velocity_width is width per cell, cm/s */
306  realnum cells_wide_1x = DopplerWidth/rfield.fine_opac_velocity_width;
307 
308  /* line center opacity - type realnum since will add to fine opacity array,
309  * which is realnum */
310  realnum opac_line = (realnum)t.Emis().PopOpc() * t.Emis().opacity() / DopplerWidth;
311 
312  // this is effective optical depth to this point. Do not do line if
313  // this product is less than SMALLFLOAT
314  double dTauEffec = opac_line*radius.depth_x_fillfac;
315  if( dTauEffec < SMALLFLOAT )
316  return;
317 
318  /* core width of optically thick line, do 4x with exponential Doppler core,
319  * must be at least one cell, but profile is symmetric */
320  const bool doDamp = dTauEffec*t.Emis().damp()/9. > 0.1;
321 
322  long int nCells_damp;
323  /* include damping wings if optical depth is large */
324  if( doDamp )
325  {
326  // find number of cells to extend the damping wings - cells_wide_1x is one dop width
327  // tests with th85orion, stopping at half -h2 point, showed that 0.01 was
328  // needed for outer edge, given the definition of dTauEffec
329  realnum x = realnum(sqrt( dTauEffec * t.Emis().damp()*100./SQRTPI ) * cells_wide_1x);
330  // test on size of x, which can exceed
331  // limits of long in extreme optical depths */
332  long max_cells = max(rfield.nfine-ipLineCenter, ipLineCenter+1);
333  if( x < realnum(max_cells) )
334  {
335  nCells_damp = long(x);
336  }
337  else
338  {
339  /* x was too big, just set to extreme range, which is
340  * number of cells to farthest boundary */
341  nCells_damp = max_cells;
342  }
343  }
344  else
345  {
346  // Doppler core only
347  nCells_damp = long(cells_wide_1x*4.f + 1.5f);
348  }
349 
350  /* want line to be at least one cell wide */
351  nCells_damp = max( 1, nCells_damp );
352 
353  static vector<realnum> xprofile, profile;
354  xprofile.resize(nCells_damp);
355  profile.resize(nCells_damp);
356 
357  realnum dcell = 1.f/cells_wide_1x;
358  for( long int i=0; i < nCells_damp; ++i )
359  {
360  /* distance from line center in units of doppler width */
361  xprofile[i] = i*dcell;
362  }
363 
364  VoigtH(t.Emis().damp(), &xprofile[0], &profile[0], nCells_damp);
365 
366  // Merging loops with abs() increases dynamics_wind run time by x2 for gcc 4.8.3
367  long ilo = max(ipLineCenter-nCells_damp+1,0), ihi = min(ipLineCenter+nCells_damp,rfield.nfine);
368  for( long i=ilo; i < ipLineCenter; ++i )
369  {
370  rfield.fine_opac_zone[i] += profile[ipLineCenter-i]*opac_line;
371  }
372  for( long i=ipLineCenter; i < ihi; ++i )
373  {
374  rfield.fine_opac_zone[i] += profile[i-ipLineCenter]*opac_line;
375  }
376 
377  t.Emis().VoigtLineCen() = profile[0];
378 
379  return;
380 }
381 
382 /*RT_line_one do rt for emission line structure - calls RT_line_escape or RT_line_wind */
384  /* the em line we will work on */
385  const TransitionProxy &t,
386  /* this is option to not include line self shielding across this zone.
387  * this can cause pump to depend on zone thickness, and leads to unstable
388  * feedback in some models with the large H2 molecule, due to Solomon
389  * process depending on zone thickness and level populations. */
390  bool lgShield_this_zone,
391  /* Stark escape probability to be added to Pesc */
392  realnum pestrk,
393  realnum DopplerWidth )
394 {
395  DEBUG_ENTRY( "RT_line_one_escape()" );
396 
397  // do nothing is population and this is not the very first call
398  // skip line transfer if requested with 'no line transfer' command, but never skip Lya
399  if( !rfield.lgDoLineTrans && (t.Emis().iRedisFun() != ipLY_A) )
400  {
401  return;
402  }
403 
404  /* line damping constant at current temperature */
405  t.Emis().damp() = t.Emis().dampXvel() / DopplerWidth;
406  ASSERT( t.Emis().damp() > 0. );
407 
408  // do not evaluate if no population
409  if( (*t.Lo()).Pop()<=SMALLFLOAT )
410  {
411  /* zero population, return after setting everything with side effects */
412  t.Emis().Pesc() = 1.f;
413 
414  /* inward escaping fraction */
415  t.Emis().FracInwd() = 0.5;
416 
417  /* pumping rate */
418  t.Emis().pump() = 0.;
419 
420  /* destruction probability */
421  t.Emis().Pdest() = 0.;
422  t.Emis().Pelec_esc() = 0.;
423  }
424  else if( t.EnergyErg() / EN1RYD <= rfield.plsfrq )
425  {
426  // transition is below plasma frequency - photons not emitted
427  t.Emis().Pesc() = SMALLFLOAT;
428  t.Emis().Pdest() = SMALLFLOAT;
429  t.Emis().Pelec_esc() = SMALLFLOAT;
430  t.Emis().pump() = SMALLFLOAT;
431  }
432  else
433  {
434  /* this checks if we have overrun the optical depth scale,
435  * in which case the inward optical depth is greater than the
436  * previous iteration's total optical depth.
437  * We do not reevaluate escape probabilities if the optical depth
438  * scale has been overrun due to huge bogus change in solution
439  * that would result */
440  bool lgGoodTau = lgTauGood( t );
441  RT_line_escape( t, pestrk, DopplerWidth , lgGoodTau);
442  RT_line_pumping( t , lgShield_this_zone , DopplerWidth );
443  }
444 
445  return;
446 }
447 
448 /*RT_line_one do rt for emission line structure - calls RT_line_escape or RT_line_wind */
450  /* the em line we will work on */
451  const TransitionProxy &t,
452  /* this is option to not include line self shielding across this zone.
453  * this can cause pump to depend on zone thickness, and leads to unstable
454  * feedback in some models with the large H2 molecule, due to Solomon
455  * process depending on zone thickness and level populations. */
456  bool /* lgShield_this_zone */,
457  /* Stark escape probability to be added to Pesc */
458  realnum /* pestrk */ ,
459  realnum DopplerWidth )
460 {
461  DEBUG_ENTRY( "RT_line_one_fine()" );
462 
463  // do nothing is population and this is not the very first call
464  // skip line transfer if requested with 'no line transfer' command, but never skip Lya
465  if( !rfield.lgDoLineTrans && (t.Emis().iRedisFun() != ipLY_A) )
466  {
467  return;
468  }
469 
470  /* line damping constant at current temperature */
471  t.Emis().damp() = t.Emis().dampXvel() / DopplerWidth;
472  ASSERT( t.Emis().damp() > 0. );
473 
474  /* option to keep track of population values during calls,
475  * print out data to make histogram */
476  enum {DEBUG_LOC=false};
477  if( DEBUG_LOC )
478  {
479  static long int nTau[100];
480  long n;
481 
482  if( nzone==0 )
483  {
484  for(n=0; n<100; ++n )
485  nTau[n] = 0;
486  }
487  if( (*t.Lo()).Pop()<=SMALLFLOAT )
488  n = 0;
489  else
490  n = (long)log10( (*t.Lo()).Pop() )+37;
491  n = MIN2( n , 99 );
492  n = MAX2( n , 0 );
493  ++nTau[n];
494  if( nzone > 183 )
495  {
496  for(n=0; n<100; ++n )
497  fprintf(ioQQQ,"%li\t%li\n", n , nTau[n] );
499  }
500  }
501 
502  if( (*t.Lo()).Pop() > SMALLFLOAT && t.EnergyErg() / EN1RYD > rfield.plsfrq )
503  {
504  // transition is below plasma frequency - photons not emitted
505  // the last sweep through this zone is to do the fine opacities
506  // the populations are not updated on the last sweep so the
507  // line transfer details also should not be updated
508  RT_line_fine_opacity( t , DopplerWidth );
509  }
510 
511  return;
512 }
realnum xLymanPumpingScaleFactor
Definition: hydrogenic.h:150
long int & ipFine() const
Definition: emission.h:460
double depth
Definition: radius.h:31
void DumpLine(const TransitionProxy &t)
Definition: transition.cpp:138
realnum dvdr
Definition: wind.h:21
int & iRedisFun() const
Definition: emission.h:450
realnum & opacity() const
Definition: emission.h:650
realnum EnergyErg() const
Definition: transition.h:90
realnum & Pelec_esc() const
Definition: emission.h:590
double * opacity_abs
Definition: opacity.h:104
double esc_CRDcore(double tau_in, double tau_out)
Definition: rt_escprob.cpp:379
double esc_CRDwing(double tau_in, double tau_out, double damp)
Definition: rt_escprob.cpp:356
t_opac opac
Definition: opacity.cpp:5
STATIC void RT_line_pumping(const TransitionProxy &t, bool lgShield_this_zone, realnum DopplerWidth)
Definition: rt_line_one.cpp:23
const realnum SMALLFLOAT
Definition: cpu.h:246
bool lgFirstSweepThisZone
Definition: conv.h:148
void RT_line_one_escape(const TransitionProxy &t, bool lgShield_this_zone, realnum pestrk, realnum DopplerWidth)
double RT_EscLVG(double tau, double sigma)
realnum fine_opac_velocity_width
Definition: rfield.h:371
double dest
Definition: rt_escprob.h:24
realnum & TauTot() const
Definition: emission.h:490
t_conv conv
Definition: conv.cpp:5
realnum * OccNumbContEmitOut
Definition: rfield.h:62
bool lgOpacityFine
Definition: rfield.h:404
FILE * ioQQQ
Definition: cddefines.cpp:7
realnum FillFac
Definition: geometry.h:29
long int nzone
Definition: cddefines.cpp:14
#define MIN2(a, b)
Definition: cddefines.h:803
bool lgDo
Definition: cosmology.h:44
STATIC void RT_line_fine_opacity(const TransitionProxy &t, realnum DopplerWidth)
t_iso_sp iso_sp[NISO][LIMELM]
Definition: iso.cpp:11
double depth_x_fillfac
Definition: radius.h:80
Wind wind
Definition: wind.cpp:5
void RT_DestProb(const TransitionProxy &t, double DopplerWidth, const DestType &nCore)
Definition: rt_escprob.cpp:722
t_geometry geometry
Definition: geometry.cpp:5
realnum redshift_current
Definition: cosmology.h:26
double & VoigtLineCen() const
Definition: emission.h:680
#define STATIC
Definition: cddefines.h:118
realnum & dampXvel() const
Definition: emission.h:610
EmissionList::reference Emis() const
Definition: transition.h:447
t_rfield rfield
Definition: rfield.cpp:9
const int ipCRD
Definition: cddefines.h:342
long & ipCont() const
Definition: transition.h:489
float realnum
Definition: cddefines.h:124
#define EXIT_FAILURE
Definition: cddefines.h:168
const int ipLY_A
Definition: cddefines.h:346
realnum & Pesc() const
Definition: emission.h:580
long int ipFineConVelShift
Definition: rfield.h:401
long max(int a, long b)
Definition: cddefines.h:817
qList::iterator Hi() const
Definition: transition.h:435
t_hydro hydro
Definition: hydrogenic.cpp:5
#define cdEXIT(FAIL)
Definition: cddefines.h:482
long min(int a, long b)
Definition: cddefines.h:762
sys_float safe_div(sys_float x, sys_float y, sys_float res_0by0)
Definition: cddefines.h:1011
realnum * OccNumbIncidCont
Definition: rfield.h:117
int & ipLo() const
Definition: transition.h:497
realnum fracin
Definition: rt.h:174
double RT_continuum_shield_fcn(const TransitionProxy &t, bool lgShieldThisZone, double dTau)
t_radius radius
Definition: radius.cpp:5
bool lgDoLineTrans
Definition: rfield.h:99
realnum * fine_opac_zone
Definition: rfield.h:391
string chLabel() const
Definition: transition.cpp:274
realnum & Pdest() const
Definition: emission.h:600
#define ASSERT(exp)
Definition: cddefines.h:613
qList::iterator Lo() const
Definition: transition.h:431
const int ipH_LIKE
Definition: iso.h:64
long nfine
Definition: rfield.h:387
double drad_x_fillfac
Definition: radius.h:77
enum dest_t t
Definition: rt_escprob.h:23
#define DEBUG_ENTRY(funcname)
Definition: cddefines.h:723
double & PopOpc() const
Definition: emission.h:670
t_cosmology cosmology
Definition: cosmology.cpp:8
#define MAX2(a, b)
Definition: cddefines.h:824
bool lgInducProcess
Definition: rfield.h:233
realnum & damp() const
Definition: emission.h:620
int fprintf(const Output &stream, const char *format,...)
Definition: service.cpp:1121
realnum GetHubbleFactor(realnum z)
Definition: cosmology.cpp:10
const int ipPRD
Definition: cddefines.h:340
double RTesc_lya(double *esin, double *dest, double abund, const TransitionProxy &t, realnum DopplerWidth)
Definition: rt_escprob.cpp:208
double esc_PRD(double tau, double tau_out, double damp)
Definition: rt_escprob.cpp:348
bool lgLastSweepThisZone
Definition: conv.h:150
STATIC void RT_line_escape(const TransitionProxy &t, realnum pestrk, realnum DopplerWidth, bool lgGoodTau)
Definition: rt_line_one.cpp:92
realnum & FracInwd() const
Definition: emission.h:520
#define fixit(a)
Definition: cddefines.h:417
bool lgTauGood(const TransitionProxy &t)
Definition: transition.h:644
double fnzone
Definition: cddefines.cpp:15
void ShowMe(void)
Definition: service.cpp:205
void RT_line_one_fine(const TransitionProxy &t, bool lgShield_this_zone, realnum pestrk, realnum DopplerWidth)
const int ipHYDROGEN
Definition: cddefines.h:349
realnum plsfrq
Definition: rfield.h:430
bool systemIs(const TransitionList *query) const
Definition: transition.h:381
realnum & Aul() const
Definition: emission.h:690
realnum windv
Definition: wind.h:18
realnum & TauIn() const
Definition: emission.h:470
bool lgAbort
Definition: cddefines.cpp:10
void VoigtH(realnum a, const realnum v[], realnum y[], int n)
Definition: thirdparty.h:418
const int ipCRDW
Definition: cddefines.h:344
#define EXIT_SUCCESS
Definition: cddefines.h:166
t_rt rt
Definition: rt.cpp:5
double & pump() const
Definition: emission.h:530