cloudy  trunk
quantumstate.h
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 
4 #ifndef QUANTUMSTATE_H_
5 #define QUANTUMSTATE_H_
6 #include "energy.h"
7 #include "proxy_iterator.h"
8 
10 {
11  char m_chLabel[5];
12  char m_chConfig[11];
13 public:
14  char *chLabel()
15  {
16  return m_chLabel;
17  }
18  const char *chLabel() const
19  {
20  return m_chLabel;
21  }
22  char *chConfig()
23  {
24  return m_chConfig;
25  }
26  const char *chConfig() const
27  {
28  return m_chConfig;
29  }
30 };
31 
32 // Quantum state properties as structure of lists -- packing
33 // like physical properties in vector storage is more cache efficient
34 // than a list-of-structures layout.
35 class qStateProxy;
36 class qStateConstProxy;
37 void Junk(qStateProxy);
38 void Zero(qStateProxy);
39 
40 class qList
41 {
42  vector<quantumStateLabels> m_labels;
43  vector<double> m_ConBoltz;
44  vector<double> m_Boltzmann;
45  vector<Energy> m_energy;
46  vector<realnum> m_g;
47  vector<long> m_j;
48  vector<long> m_J;
49  vector<int> m_IonStg;
50  vector<int> m_nelem;
51  vector<long> m_l;
52  vector<double> m_lifetime;
53  vector<long> m_n;
54  vector<double> m_ColDen;
55  vector<double> m_Pop;
56  vector<double> m_DestCollBB;
57  vector<double> m_DestPhotoBB;
58  vector<double> m_CreatCollBB;
59  vector<long> m_S;
60  vector<long> m_v;
61  friend class qStateProxy;
62  friend class qStateConstProxy;
63 public:
68  explicit qList()
69  {
70  resize(0);
71  }
72  explicit qList(size_t i)
73  {
74  resize(i);
75  }
76  iterator begin();
77  const_iterator begin() const;
78  iterator end();
79  const_iterator end() const;
80  reference operator[](int i);
81  const_reference operator[](int i) const;
82  // Must resize *all* the list members
83  void resize(size_t i)
84  {
85  size_t old_size = size();
86  m_labels.resize(i);
87  m_ConBoltz.resize(i);
88  m_Boltzmann.resize(i);
89  m_energy.resize(i);
90  m_g.resize(i);
91  m_IonStg.resize(i);
92  m_j.resize(i);
93  m_J.resize(i);
94  m_lifetime.resize(i);
95  m_l.resize(i);
96  m_n.resize(i);
97  m_nelem.resize(i);
98  m_ColDen.resize(i);
99  m_Pop.resize(i);
100 # ifdef USE_NLTE7
101  m_DestCollBB.resize(i);
102  m_DestPhotoBB.resize(i);
103  m_CreatCollBB.resize(i);
104 # endif
105  m_S.resize(i);
106  m_v.resize(i);
107  for (size_t n=old_size; n<i; ++n)
108  {
109  reset(n);
110  }
111  }
112  void reset(int n);
113  // The size of any of the lists will do, as they should all be
114  // the same. No point really in asserting this, as the assert
115  // will be at least as fragile as the original resize.
116  size_t size() const
117  {
118  return m_labels.size();
119  }
120 };
121 
122 // Quantum state proxy object. This is used to give access to
123 // structure-of-lists class qList in an 'object-like' manner, e.g.
124 //
125 // qs = List[element]; qs.IonStg() = ???; qs.S() = ???; update(qs);
126 //
127 // The member functions of the proxy class must be the same as the
128 // lists which are included in the qList class.
129 class qStateConstProxy;
131 {
132 public:
133  typedef qList list_type;
135 private:
138  int m_index;
139 public:
140  explicit qStateProxy(list_type* list, int index) :
141  m_list(list), m_index(index) {}
142  explicit qStateProxy(void) : m_list(NULL), m_index(0) {}
143 // Proxy functions for members of qList below
144  char *chLabel() const
145  {
146  return m_list->m_labels[m_index].chLabel();
147  }
148  char *chConfig() const
149  {
150  return m_list->m_labels[m_index].chConfig();
151  }
153  Energy &energy() const
154  {
155  return m_list->m_energy[m_index];
156  }
158  realnum &g() const
159  {
160  return m_list->m_g[m_index];
161  }
163  double &Pop() const
164  {
165  return m_list->m_Pop[m_index];
166  }
168  double &ColDen() const
169  {
170  return m_list->m_ColDen[m_index];
171  }
172 # ifdef USE_NLTE7
173 
174  double &DestCollBB() const
175  {
176  return m_list->m_DestCollBB[m_index];
177  }
179  double &DestPhotoBB() const
180  {
181  return m_list->m_DestPhotoBB[m_index];
182  }
184  double &CreatCollBB() const
185  {
186  return m_list->m_CreatCollBB[m_index];
187  }
188 # endif
189 
190  int &IonStg() const
191  {
192  return m_list->m_IonStg[m_index];
193  }
195  int &nelem() const
196  {
197  return m_list->m_nelem[m_index];
198  }
200  double &ConBoltz() const
201  {
202  return m_list->m_ConBoltz[m_index];
203  }
205  double &Boltzmann() const
206  {
207  return m_list->m_Boltzmann[m_index];
208  }
210  double &lifetime() const
211  {
212  return m_list->m_lifetime[m_index];
213  }
214  long &n() const
215  {
216  return m_list->m_n[m_index];
217  }
218  long &l() const
219  {
220  return m_list->m_l[m_index];
221  }
222  long &S() const
223  {
224  return m_list->m_S[m_index];
225  }
226  long &v() const
227  {
228  return m_list->m_v[m_index];
229  }
230  long &j() const
231  {
232  return m_list->m_j[m_index];
233  }
234  long &J() const
235  {
236  return m_list->m_J[m_index];
237  }
238 };
240 {
241 public:
242  typedef const qList list_type;
244 private:
247  int m_index;
248 public:
249  explicit qStateConstProxy(const list_type* list, int index) :
250  m_list(list), m_index(index) {}
251  explicit qStateConstProxy(void) : m_list(NULL), m_index(0) {}
252 // Proxy functions for members of qList below
253  const char *chLabel() const
254  {
255  return m_list->m_labels[m_index].chLabel();
256  }
257  const char *chConfig() const
258  {
259  return m_list->m_labels[m_index].chConfig();
260  }
261  Energy energy() const
262  {
263  return m_list->m_energy[m_index];
264  }
265  realnum g() const
266  {
267  return m_list->m_g[m_index];
268  }
269  double ColDen() const
270  {
271  return m_list->m_ColDen[m_index];
272  }
273  double Pop() const
274  {
275  return m_list->m_Pop[m_index];
276  }
277 # ifdef USE_NLTE7
278  double DestCollBB() const
279  {
280  return m_list->m_DestCollBB[m_index];
281  }
282  double DestPhotoBB() const
283  {
284  return m_list->m_DestPhotoBB[m_index];
285  }
286  double CreatCollBB() const
287  {
288  return m_list->m_CreatCollBB[m_index];
289  }
290 # endif
291  int IonStg() const
292  {
293  return m_list->m_IonStg[m_index];
294  }
295  int nelem() const
296  {
297  return m_list->m_nelem[m_index];
298  }
299  double ConBoltz() const
300  {
301  return m_list->m_ConBoltz[m_index];
302  }
303  double Boltzmann() const
304  {
305  return m_list->m_Boltzmann[m_index];
306  }
307  double lifetime() const
308  {
309  return m_list->m_lifetime[m_index];
310  }
311  long n() const
312  {
313  return m_list->m_n[m_index];
314  }
315  long l() const
316  {
317  return m_list->m_l[m_index];
318  }
319  long S() const
320  {
321  return m_list->m_S[m_index];
322  }
323  long v() const
324  {
325  return m_list->m_v[m_index];
326  }
327  long j() const
328  {
329  return m_list->m_j[m_index];
330  }
331  long J() const
332  {
333  return m_list->m_J[m_index];
334  }
335 };
336 
338 {
339  return iterator(this,0);
340 }
341 inline qList::const_iterator qList::begin() const
342 {
343  return const_iterator(this,0);
344 }
346 {
347  return iterator(this,m_labels.size());
348 }
349 inline qList::const_iterator qList::end() const
350 {
351  return const_iterator(this,m_labels.size());
352 }
354 {
355  return begin()[i];
356 }
358 {
359  return begin()[i];
360 }
361 inline void qList::reset(int n)
362 {
363  Junk((*this)[n]);
364  Zero((*this)[n]);
365 }
366 
367 
368 #endif
quantumStateLabels::chLabel
const char * chLabel() const
Definition: quantumstate.h:18
qStateProxy::m_index
int m_index
Definition: quantumstate.h:138
qStateConstProxy::ConBoltz
double ConBoltz() const
Definition: quantumstate.h:299
qStateProxy::J
long & J() const
Definition: quantumstate.h:234
qStateConstProxy::m_list
const list_type * m_list
Definition: quantumstate.h:246
qStateConstProxy
Definition: quantumstate.h:239
energy.h
qStateConstProxy::nelem
int nelem() const
Definition: quantumstate.h:295
qStateProxy::S
long & S() const
Definition: quantumstate.h:222
qList::m_Boltzmann
vector< double > m_Boltzmann
Definition: quantumstate.h:44
realnum
float realnum
Definition: cddefines.h:103
qList::m_n
vector< long > m_n
Definition: quantumstate.h:53
qList::m_DestPhotoBB
vector< double > m_DestPhotoBB
Definition: quantumstate.h:57
qStateConstProxy::chLabel
const char * chLabel() const
Definition: quantumstate.h:253
qStateConstProxy::n
long n() const
Definition: quantumstate.h:311
qList::m_ConBoltz
vector< double > m_ConBoltz
Definition: quantumstate.h:43
quantumStateLabels
Definition: quantumstate.h:9
qList::m_nelem
vector< int > m_nelem
Definition: quantumstate.h:50
qList::iterator
ProxyIterator< qStateProxy, qStateConstProxy > iterator
Definition: quantumstate.h:64
qStateConstProxy::v
long v() const
Definition: quantumstate.h:323
ProxyIterator
Definition: proxy_iterator.h:58
qStateConstProxy::g
realnum g() const
Definition: quantumstate.h:265
qList::m_l
vector< long > m_l
Definition: quantumstate.h:51
qStateConstProxy::iterator
ProxyIterator< qStateConstProxy, qStateConstProxy > iterator
Definition: quantumstate.h:243
qStateConstProxy::j
long j() const
Definition: quantumstate.h:327
Junk
void Junk(qStateProxy)
Definition: quantumstate.cpp:8
qStateProxy::n
long & n() const
Definition: quantumstate.h:214
qList::qList
qList()
Definition: quantumstate.h:68
qList::end
iterator end()
Definition: quantumstate.h:345
qStateConstProxy::list_type
const typedef qList list_type
Definition: quantumstate.h:242
qList::m_DestCollBB
vector< double > m_DestCollBB
Definition: quantumstate.h:56
qList::m_CreatCollBB
vector< double > m_CreatCollBB
Definition: quantumstate.h:58
qStateConstProxy::ColDen
double ColDen() const
Definition: quantumstate.h:269
qList::const_reference
qStateConstProxy const_reference
Definition: quantumstate.h:67
qList::m_S
vector< long > m_S
Definition: quantumstate.h:59
qStateConstProxy::chConfig
const char * chConfig() const
Definition: quantumstate.h:257
qList::m_J
vector< long > m_J
Definition: quantumstate.h:48
quantumStateLabels::chConfig
const char * chConfig() const
Definition: quantumstate.h:26
qStateProxy::j
long & j() const
Definition: quantumstate.h:230
qList::m_v
vector< long > m_v
Definition: quantumstate.h:60
qStateProxy::IonStg
int & IonStg() const
Definition: quantumstate.h:190
quantumStateLabels::chLabel
char * chLabel()
Definition: quantumstate.h:14
qStateConstProxy::energy
Energy energy() const
Definition: quantumstate.h:261
qList::m_Pop
vector< double > m_Pop
Definition: quantumstate.h:55
qList::qList
qList(size_t i)
Definition: quantumstate.h:72
qStateConstProxy::J
long J() const
Definition: quantumstate.h:331
qList::resize
void resize(size_t i)
Definition: quantumstate.h:83
qList
Definition: quantumstate.h:40
qStateProxy::l
long & l() const
Definition: quantumstate.h:218
qStateProxy::iterator
ProxyIterator< qStateProxy, qStateConstProxy > iterator
Definition: quantumstate.h:134
qStateProxy
Definition: quantumstate.h:130
qList::m_lifetime
vector< double > m_lifetime
Definition: quantumstate.h:52
qStateProxy::nelem
int & nelem() const
Definition: quantumstate.h:195
qStateProxy::chConfig
char * chConfig() const
Definition: quantumstate.h:148
qList::const_iterator
ProxyIterator< qStateConstProxy, qStateConstProxy > const_iterator
Definition: quantumstate.h:65
quantumStateLabels::chConfig
char * chConfig()
Definition: quantumstate.h:22
qStateProxy::energy
Energy & energy() const
Definition: quantumstate.h:153
qStateProxy::v
long & v() const
Definition: quantumstate.h:226
Zero
void Zero(qStateProxy)
Definition: quantumstate.cpp:36
quantumStateLabels::m_chConfig
char m_chConfig[11]
Definition: quantumstate.h:12
qStateProxy::qStateProxy
qStateProxy(list_type *list, int index)
Definition: quantumstate.h:140
Energy
Definition: energy.h:7
qStateConstProxy::IonStg
int IonStg() const
Definition: quantumstate.h:291
qList::m_energy
vector< Energy > m_energy
Definition: quantumstate.h:45
qStateConstProxy::m_index
int m_index
Definition: quantumstate.h:247
qStateProxy::Pop
double & Pop() const
Definition: quantumstate.h:163
qList::size
size_t size() const
Definition: quantumstate.h:116
proxy_iterator.h
qList::m_labels
vector< quantumStateLabels > m_labels
Definition: quantumstate.h:42
qStateProxy::ColDen
double & ColDen() const
Definition: quantumstate.h:168
qStateProxy::m_list
list_type * m_list
Definition: quantumstate.h:137
qList::m_j
vector< long > m_j
Definition: quantumstate.h:47
qStateProxy::list_type
qList list_type
Definition: quantumstate.h:133
qList::reset
void reset(int n)
Definition: quantumstate.h:361
qStateConstProxy::l
long l() const
Definition: quantumstate.h:315
quantumStateLabels::m_chLabel
char m_chLabel[5]
Definition: quantumstate.h:11
qStateConstProxy::Boltzmann
double Boltzmann() const
Definition: quantumstate.h:303
qStateConstProxy::qStateConstProxy
qStateConstProxy(const list_type *list, int index)
Definition: quantumstate.h:249
qStateProxy::lifetime
double & lifetime() const
Definition: quantumstate.h:210
qList::operator[]
reference operator[](int i)
Definition: quantumstate.h:353
qStateConstProxy::qStateConstProxy
qStateConstProxy(void)
Definition: quantumstate.h:251
qList::m_ColDen
vector< double > m_ColDen
Definition: quantumstate.h:54
qStateConstProxy::Pop
double Pop() const
Definition: quantumstate.h:273
qStateProxy::Boltzmann
double & Boltzmann() const
Definition: quantumstate.h:205
qStateProxy::ConBoltz
double & ConBoltz() const
Definition: quantumstate.h:200
qStateConstProxy::S
long S() const
Definition: quantumstate.h:319
qList::reference
qStateProxy reference
Definition: quantumstate.h:66
qStateConstProxy::lifetime
double lifetime() const
Definition: quantumstate.h:307
qList::m_g
vector< realnum > m_g
Definition: quantumstate.h:46
qList::begin
iterator begin()
Definition: quantumstate.h:337
qList::m_IonStg
vector< int > m_IonStg
Definition: quantumstate.h:49
qStateProxy::qStateProxy
qStateProxy(void)
Definition: quantumstate.h:142
qStateProxy::chLabel
char * chLabel() const
Definition: quantumstate.h:144
qStateProxy::g
realnum & g() const
Definition: quantumstate.h:158