cloudy trunk
Loading...
Searching...
No Matches
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
18int 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 */
25 dense.EdenTrue = dense.EdenSet;
26 dense.eden_from_metals = 1.;
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 */
34 dense.EdenTrue = dense.EdenFraction*dense.gas_phase[ipHYDROGEN];
35 dense.eden_from_metals = 1.;
36
37 if( trace.lgTrace || trace.lgESOURCE )
38 {
39 fprintf( ioQQQ, " eden_sum zn: %.2f eden ratio set to: %.4e, eden is: %.4e\n",
40 fnzone, dense.EdenFraction, dense.EdenTrue );
41 }
42 }
43 else
44 {
45 /* EdenExtra is normally zero, set with EDEN command, to add extra e- */
46 dense.EdenTrue = dense.EdenExtra;
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
75 dense.EdenTrue += mole.elec;
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 */
79 dense.EdenTrue += gv.TotalEden*gv.lgGrainElectrons;
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 ,
94 gv.TotalEden*gv.lgGrainElectrons,
95 dense.EdenExtra ,
96 rfield.otslin[iso_sp[ipH_LIKE][ipHYDROGEN].trans(ipH2p,ipH1s).ipCont()-1] );
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 */
117 ASSERT( dense.EdenSet <= 0.f || fp_equal((realnum)dense.EdenTrue, dense.EdenSet) );
118
119 return 0;
120}
FILE * ioQQQ
Definition cddefines.cpp:7
double fnzone
Definition cddefines.cpp:15
#define ASSERT(exp)
Definition cddefines.h:578
const int LIMELM
Definition cddefines.h:258
const int ipLITHIUM
Definition cddefines.h:307
sys_float safe_div(sys_float x, sys_float y, sys_float res_0by0)
Definition cddefines.h:961
float realnum
Definition cddefines.h:103
bool fp_equal(sys_float x, sys_float y, int n=3)
Definition cddefines.h:812
const int ipHYDROGEN
Definition cddefines.h:305
#define DEBUG_ENTRY(funcname)
Definition cddefines.h:684
t_dense dense
Definition dense.cpp:24
t_deuterium deut
Definition deuterium.cpp:8
int eden_sum(void)
Definition eden_sum.cpp:18
GrainVar gv
Definition grainvar.cpp:5
t_iso_sp iso_sp[NISO][LIMELM]
Definition iso.cpp:8
const int ipH1s
Definition iso.h:27
const int ipH2p
Definition iso.h:29
const int ipH_LIKE
Definition iso.h:62
t_mole_global mole_global
Definition mole.cpp:6
t_mole_local mole
Definition mole.cpp:7
t_rfield rfield
Definition rfield.cpp:8
t_trace trace
Definition trace.cpp:5