cloudy  trunk
eden_sum.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 #include "cddefines.h"
4 #include "hmi.h"
5 #include "trace.h"
6 #include "grainvar.h"
7 #include "rfield.h"
8 #include "mole.h"
9 #include "dense.h"
10 #include "taulines.h"
11 #include "iso.h"
12 #include "deuterium.h"
13 
14 // eden_sum: sum all contributions to the electron density, sets variable dense.EdenTrue
15 // called by ConvBase - ConvEdenIoniz actually updates the electron density dense.eden
16 // here we allow dense.EdenTrue to become negative, ConvEdenIoniz will deal with this
17 // and will also assure that dense.eden is always positive. this routine always returns 0
18 int eden_sum(void)
19 {
20  DEBUG_ENTRY( "eden_sum()" );
21 
22  if( dense.EdenSet > 0.f )
23  {
24  /* electron density set with set eden command */
27 
28  if( trace.lgTrace || trace.lgESOURCE )
29  fprintf( ioQQQ, " eden_sum zn: %.2f eden set to: %.4e\n", fnzone, dense.EdenSet );
30  }
31  else if( dense.EdenFraction > 0.f )
32  {
33  /* electron fraction set with set eden fraction command */
36 
37  if( trace.lgTrace || trace.lgESOURCE )
38  {
39  fprintf( ioQQQ, " eden_sum zn: %.2f eden ratio set to: %.4e, eden is: %.4e\n",
41  }
42  }
43  else
44  {
45  /* EdenExtra is normally zero, set with EDEN command, to add extra e- */
47 
48  /* sum over all ions */
49  double eden_ions[LIMELM];
50  double sum_all_ions = 0.;
51  double sum_metals = 0.;
52  for( long nelem=ipHYDROGEN; nelem < LIMELM; nelem++ )
53  {
54  eden_ions[nelem] = 0.;
55  for( long ion=1; ion <= nelem+1; ion++ )
56  eden_ions[nelem] += ion*dense.xIonDense[nelem][ion];
57 
58  sum_all_ions += eden_ions[nelem];
59  if( nelem >= ipLITHIUM )
60  sum_metals += eden_ions[nelem];
61  }
62  sum_all_ions += deut.xIonDense[1];
63  dense.EdenTrue += sum_all_ions;
64 
65  /* electrons contributed by heavy molecules */
66  // include electrons lost to negative atomic ions, e.g. H-, but
67  // not +ve which are treated by the ionization ladders
68  mole.elec = 0.;
69  for( long i=0; i < mole_global.num_calc; i++ )
70  {
71  if( mole_global.list[i]->parentLabel.empty() && (!mole_global.list[i]->isMonatomic() || mole_global.list[i]->charge < 0) )
72  mole.elec += mole.species[i].den*mole_global.list[i]->charge;
73  }
74 
76 
77  /* gv.lgGrainElectrons - should grain electron source/sink be included in overall electron sum?
78  * default is true, set false with no grain electrons command */
80 
81  /* fraction of electrons from ions heavier than helium */
82  dense.eden_from_metals = safe_div( sum_metals, dense.EdenTrue, 1. );
83 
84  if( trace.lgTrace || trace.lgESOURCE )
85  {
86  fprintf( ioQQQ,
87  " eden_sum zn: %.2f current: %.4e new true: %.4e ions: %.4e mole: %.4e"
88  " grain: %.4e extra: %.4e LaOTS: %.4e\n",
89  fnzone ,
90  dense.eden ,
91  dense.EdenTrue ,
92  sum_all_ions ,
93  mole.elec ,
97 
98  if( trace.lgNeBug )
99  {
100  for( long nelem=ipHYDROGEN; nelem < LIMELM; nelem++ )
101  {
102  if( nelem == 0 )
103  fprintf( ioQQQ, " eden_sum H -Ne:" );
104  else if( nelem == 10 )
105  fprintf( ioQQQ, " eden_sum Na-Ca:" );
106  else if( nelem == 20 )
107  fprintf( ioQQQ, " eden_sum Sc-Zn:" );
108  fprintf( ioQQQ, " %.4e", eden_ions[nelem] );
109  if( nelem%10 == 9 )
110  fprintf( ioQQQ, "\n" );
111  }
112  }
113  }
114  }
115 
116  /* case where electron density is set with set eden command, make sure we use it */
118 
119  return 0;
120 }
t_dense::eden
double eden
Definition: dense.h:190
dense
t_dense dense
Definition: dense.cpp:24
rfield
t_rfield rfield
Definition: rfield.cpp:8
ioQQQ
FILE * ioQQQ
Definition: cddefines.cpp:7
realnum
float realnum
Definition: cddefines.h:103
rfield.h
ipLITHIUM
const int ipLITHIUM
Definition: cddefines.h:307
GrainVar::TotalEden
double TotalEden
Definition: grainvar.h:528
mole.h
t_mole_local::elec
double elec
Definition: mole.h:390
trace.h
t_mole_global::list
MoleculeList list
Definition: mole.h:317
eden_sum
int eden_sum(void)
Definition: eden_sum.cpp:18
t_dense::gas_phase
realnum gas_phase[LIMELM]
Definition: dense.h:71
TransitionProxy::ipCont
long & ipCont() const
Definition: transition.h:450
t_dense::EdenTrue
double EdenTrue
Definition: dense.h:221
ASSERT
#define ASSERT(exp)
Definition: cddefines.h:578
iso.h
ipHYDROGEN
const int ipHYDROGEN
Definition: cddefines.h:305
GrainVar::lgGrainElectrons
bool lgGrainElectrons
Definition: grainvar.h:494
dense.h
mole
t_mole_local mole
Definition: mole.cpp:7
trace
t_trace trace
Definition: trace.cpp:5
cddefines.h
safe_div
sys_float safe_div(sys_float x, sys_float y, sys_float res_0by0)
Definition: cddefines.h:961
t_dense::EdenExtra
realnum EdenExtra
Definition: dense.h:206
deut
t_deuterium deut
Definition: deuterium.cpp:8
t_trace::lgESOURCE
bool lgESOURCE
Definition: trace.h:24
hmi.h
LIMELM
const int LIMELM
Definition: cddefines.h:258
t_dense::eden_from_metals
double eden_from_metals
Definition: dense.h:224
t_deuterium::xIonDense
double xIonDense[2]
Definition: deuterium.h:21
t_dense::xIonDense
double xIonDense[LIMELM][LIMELM+1]
Definition: dense.h:125
t_rfield::otslin
realnum * otslin
Definition: rfield.h:193
ipH2p
const int ipH2p
Definition: iso.h:29
grainvar.h
fp_equal
bool fp_equal(sys_float x, sys_float y, int n=3)
Definition: cddefines.h:812
gv
GrainVar gv
Definition: grainvar.cpp:5
t_iso_sp::trans
TransitionProxy trans(const long ipHi, const long ipLo)
Definition: iso.h:444
taulines.h
t_dense::EdenFraction
realnum EdenFraction
Definition: dense.h:209
t_mole_local::species
valarray< class molezone > species
Definition: mole.h:398
ipH1s
const int ipH1s
Definition: iso.h:27
t_trace::lgNeBug
bool lgNeBug
Definition: trace.h:115
iso_sp
t_iso_sp iso_sp[NISO][LIMELM]
Definition: iso.cpp:8
fnzone
double fnzone
Definition: cddefines.cpp:15
t_dense::EdenSet
realnum EdenSet
Definition: dense.h:203
mole_global
t_mole_global mole_global
Definition: mole.cpp:6
t_mole_global::num_calc
int num_calc
Definition: mole.h:314
DEBUG_ENTRY
#define DEBUG_ENTRY(funcname)
Definition: cddefines.h:684
ipH_LIKE
const int ipH_LIKE
Definition: iso.h:62
t_trace::lgTrace
bool lgTrace
Definition: trace.h:12
deuterium.h