cloudy  trunk
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
quantumstate.h
Go to the documentation of this file.
1 /* This file is part of Cloudy and is copyright (C)1978-2017 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 "vectorize.h"
8 #include "proxy_iterator.h"
9 
11 
13 {
14  string m_chConfig;
15 public:
16  string& chConfig()
17  {
18  return m_chConfig;
19  }
20  const string& chConfig() const
21  {
22  return m_chConfig;
23  }
24 };
25 
26 // Quantum state properties as structure of lists -- packing
27 // like physical properties in vector storage is more cache efficient
28 // than a list-of-structures layout.
29 class qStateProxy;
30 class qStateConstProxy;
31 void Junk(qStateProxy);
32 void Zero(qStateProxy);
33 
34 class qList
35 {
36  string m_chLabel;
37  vector<quantumStateLabels> m_labels;
38  vector< double, allocator_avx<double> > m_ConBoltz;
39  vector< double, allocator_avx<double> > m_Boltzmann;
40  vector<Energy> m_energy;
41  vector<realnum> m_g;
42  vector<long> m_j;
43  vector<long> m_J;
44  vector<int> m_IonStg;
45  vector<int> m_nelem;
46  vector<long> m_l;
47  vector<double> m_lifetime;
48  vector<long> m_n;
49  vector<double> m_ColDen;
50  vector<double> m_Pop;
51  vector<double> m_DepartCoef;
52 # ifdef USE_NLTE7
53  vector<double> m_DestCollBB;
54  vector<double> m_DestPhotoBB;
55  vector<double> m_CreatCollBB;
56 # endif
57  vector<long> m_S;
58  vector<long> m_v;
59  vector<enum level_status> m_status;
61  friend class qStateProxy;
62  friend class qStateConstProxy;
63 public:
68  explicit qList()
69  {
70  init("",0);
71  m_width = 0.f;
72  }
73  explicit qList(const char *chLabel, size_t i)
74  {
75  init(chLabel,i);
76  m_width = 0.f;
77  }
78  iterator begin();
79  const_iterator begin() const;
80  iterator end();
81  const_iterator end() const;
82  reference operator[](int i);
83  const_reference operator[](int i) const;
84  // Must resize *all* the list members
85 private:
86  void resize(size_t i)
87  {
88  size_t old_size = size();
89  m_labels.resize(i);
90  m_ConBoltz.resize(i);
91  m_Boltzmann.resize(i);
92  m_energy.resize(i);
93  m_g.resize(i);
94  m_IonStg.resize(i);
95  m_j.resize(i);
96  m_J.resize(i);
97  m_lifetime.resize(i);
98  m_l.resize(i);
99  m_n.resize(i);
100  m_nelem.resize(i);
101  m_ColDen.resize(i);
102  m_Pop.resize(i);
103  m_DepartCoef.resize(i);
104 # ifdef USE_NLTE7
105  m_DestCollBB.resize(i);
106  m_DestPhotoBB.resize(i);
107  m_CreatCollBB.resize(i);
108 # endif
109  m_S.resize(i);
110  m_v.resize(i);
111  m_status.resize(i);
112  for (size_t n=old_size; n<i; ++n)
113  {
114  reset(n);
115  }
116  }
117 public:
118  void init(const char* label, size_t i)
119  {
120  m_chLabel = label;
121  resize(i);
122  }
123  void addone()
124  {
125  resize(size()+1);
126  }
127  void reset(int n);
128  // The size of any of the lists will do, as they should all be
129  // the same. No point really in asserting this, as the assert
130  // will be at least as fragile as the original resize.
131  size_t size() const
132  {
133  return m_labels.size();
134  }
135  realnum width() const
136  {
137  return m_width;
138  }
140  {
141  m_width = width;
142  }
143  string chLabel() const
144  {
145  return m_chLabel;
146  }
147  void chLabel_set(const char *s)
148  {
149  m_chLabel = s;
150  }
151  double* ConBoltz()
152  {
153  return get_ptr(m_ConBoltz);
154  }
155  const double* ConBoltz() const
156  {
157  return get_ptr(m_ConBoltz);
158  }
159  double* Boltzmann()
160  {
161  return get_ptr(m_Boltzmann);
162  }
163  const double* Boltzmann() const
164  {
165  return get_ptr(m_Boltzmann);
166  }
167 };
168 
169 // Quantum state proxy object. This is used to give access to
170 // structure-of-lists class qList in an 'object-like' manner, e.g.
171 //
172 // qs = List[element]; qs.IonStg() = ???; qs.S() = ???; update(qs);
173 //
174 // The member functions of the proxy class must be the same as the
175 // lists which are included in the qList class.
176 class qStateConstProxy;
178 {
179 public:
180  typedef qList list_type;
182 private:
184  friend class qStateConstProxy;
186  int m_index;
187 public:
188  explicit qStateProxy(list_type* list, int index) :
189  m_list(list), m_index(index) {}
190  explicit qStateProxy(void) : m_list(NULL), m_index(0) {}
191 // Proxy functions for members of qList below
192  bool associated() const
193  {
194  return m_list != NULL;
195  }
196  string chLabel() const;
197  string& chConfig() const
198  {
199  return m_list->m_labels[m_index].chConfig();
200  }
202  Energy &energy() const
203  {
204  return m_list->m_energy[m_index];
205  }
207  realnum &g() const
208  {
209  return m_list->m_g[m_index];
210  }
212  double &Pop() const
213  {
214  return m_list->m_Pop[m_index];
215  }
217  double &DepartCoef() const
218  {
219  return m_list->m_DepartCoef[m_index];
220  }
222  double &ColDen() const
223  {
224  return m_list->m_ColDen[m_index];
225  }
226 # ifdef USE_NLTE7
227 
228  double &DestCollBB() const
229  {
230  return m_list->m_DestCollBB[m_index];
231  }
233  double &DestPhotoBB() const
234  {
235  return m_list->m_DestPhotoBB[m_index];
236  }
238  double &CreatCollBB() const
239  {
240  return m_list->m_CreatCollBB[m_index];
241  }
242 # endif
243 
244  int &IonStg() const
245  {
246  return m_list->m_IonStg[m_index];
247  }
249  int &nelem() const
250  {
251  return m_list->m_nelem[m_index];
252  }
254  double &ConBoltz() const
255  {
256  return m_list->m_ConBoltz[m_index];
257  }
259  double &Boltzmann() const
260  {
261  return m_list->m_Boltzmann[m_index];
262  }
264  double &lifetime() const
265  {
266  return m_list->m_lifetime[m_index];
267  }
268  long &n() const
269  {
270  return m_list->m_n[m_index];
271  }
272  long &l() const
273  {
274  return m_list->m_l[m_index];
275  }
276  long &S() const
277  {
278  return m_list->m_S[m_index];
279  }
280  long &v() const
281  {
282  return m_list->m_v[m_index];
283  }
284  long &j() const
285  {
286  return m_list->m_j[m_index];
287  }
288  long &J() const
289  {
290  return m_list->m_J[m_index];
291  }
292  enum level_status &status() const
293  {
294  return m_list->m_status[m_index];
295  }
296 };
298 {
299 public:
300  typedef const qList list_type;
302 private:
305  int m_index;
306 public:
307  explicit qStateConstProxy(const list_type* list, int index) :
308  m_list(list), m_index(index) {}
309  explicit qStateConstProxy(void) : m_list(NULL), m_index(0) {}
311  m_list(q.m_list), m_index(q.m_index) {}
312 // Proxy functions for members of qList below
313  bool associated() const
314  {
315  return m_list != NULL;
316  }
317  string chLabel() const;
318  const string& chConfig() const
319  {
320  return m_list->m_labels[m_index].chConfig();
321  }
322  Energy energy() const
323  {
324  return m_list->m_energy[m_index];
325  }
326  realnum g() const
327  {
328  return m_list->m_g[m_index];
329  }
330  double ColDen() const
331  {
332  return m_list->m_ColDen[m_index];
333  }
334  double Pop() const
335  {
336  return m_list->m_Pop[m_index];
337  }
338  double DepartCoef() const
339  {
340  return m_list->m_DepartCoef[m_index];
341  }
342 # ifdef USE_NLTE7
343  double DestCollBB() const
344  {
345  return m_list->m_DestCollBB[m_index];
346  }
347  double DestPhotoBB() const
348  {
349  return m_list->m_DestPhotoBB[m_index];
350  }
351  double CreatCollBB() const
352  {
353  return m_list->m_CreatCollBB[m_index];
354  }
355 # endif
356  int IonStg() const
357  {
358  return m_list->m_IonStg[m_index];
359  }
360  int nelem() const
361  {
362  return m_list->m_nelem[m_index];
363  }
364  double ConBoltz() const
365  {
366  return m_list->m_ConBoltz[m_index];
367  }
368  double Boltzmann() const
369  {
370  return m_list->m_Boltzmann[m_index];
371  }
372  double lifetime() const
373  {
374  return m_list->m_lifetime[m_index];
375  }
376  long n() const
377  {
378  return m_list->m_n[m_index];
379  }
380  long l() const
381  {
382  return m_list->m_l[m_index];
383  }
384  long S() const
385  {
386  return m_list->m_S[m_index];
387  }
388  long v() const
389  {
390  return m_list->m_v[m_index];
391  }
392  long j() const
393  {
394  return m_list->m_j[m_index];
395  }
396  long J() const
397  {
398  return m_list->m_J[m_index];
399  }
400  enum level_status status() const
401  {
402  return m_list->m_status[m_index];
403  }
404 };
405 
407 {
408  return iterator(this,0);
409 }
411 {
412  return const_iterator(this,0);
413 }
415 {
416  return iterator(this,m_labels.size());
417 }
419 {
420  return const_iterator(this,m_labels.size());
421 }
423 {
424  return begin()[i];
425 }
427 {
428  return begin()[i];
429 }
430 inline void qList::reset(int n)
431 {
432  Junk((*this)[n]);
433  Zero((*this)[n]);
434 }
435 
436 #endif
const string & chConfig() const
Definition: quantumstate.h:20
realnum width() const
Definition: quantumstate.h:135
qStateProxy(void)
Definition: quantumstate.h:190
vector< double > m_ColDen
Definition: quantumstate.h:49
qStateProxy(list_type *list, int index)
Definition: quantumstate.h:188
string & chConfig() const
Definition: quantumstate.h:197
double ConBoltz() const
Definition: quantumstate.h:364
ProxyIterator< qStateProxy, qStateConstProxy > iterator
Definition: quantumstate.h:64
qStateConstProxy(const list_type *list, int index)
Definition: quantumstate.h:307
ProxyIterator< qStateProxy, qStateConstProxy > iterator
Definition: quantumstate.h:181
const qList list_type
Definition: quantumstate.h:300
T * get_ptr(T *v)
Definition: cddefines.h:1113
Energy & energy() const
Definition: quantumstate.h:202
double lifetime() const
Definition: quantumstate.h:372
vector< realnum > m_g
Definition: quantumstate.h:41
long & j() const
Definition: quantumstate.h:284
int & IonStg() const
Definition: quantumstate.h:244
vector< int > m_IonStg
Definition: quantumstate.h:44
vector< long > m_S
Definition: quantumstate.h:57
vector< long > m_J
Definition: quantumstate.h:43
qStateConstProxy const_reference
Definition: quantumstate.h:67
long & l() const
Definition: quantumstate.h:272
long & v() const
Definition: quantumstate.h:280
vector< double > m_DepartCoef
Definition: quantumstate.h:51
vector< double > m_Pop
Definition: quantumstate.h:50
double DepartCoef() const
Definition: quantumstate.h:338
qStateConstProxy(const qStateProxy &q)
Definition: quantumstate.h:310
bool associated() const
Definition: quantumstate.h:192
vector< enum level_status > m_status
Definition: quantumstate.h:59
void resize(size_t i)
Definition: quantumstate.h:86
double & Pop() const
Definition: quantumstate.h:212
double Boltzmann() const
Definition: quantumstate.h:368
ProxyIterator< qStateConstProxy, qStateConstProxy > iterator
Definition: quantumstate.h:301
vector< long > m_n
Definition: quantumstate.h:48
double & ConBoltz() const
Definition: quantumstate.h:254
long & n() const
Definition: quantumstate.h:268
level_status
Definition: quantumstate.h:10
vector< int > m_nelem
Definition: quantumstate.h:45
int IonStg() const
Definition: quantumstate.h:356
qList list_type
Definition: quantumstate.h:180
long n() const
Definition: quantumstate.h:376
double * Boltzmann()
Definition: quantumstate.h:159
vector< long > m_l
Definition: quantumstate.h:46
enum level_status & status() const
Definition: quantumstate.h:292
double & ColDen() const
Definition: quantumstate.h:222
vector< quantumStateLabels > m_labels
Definition: quantumstate.h:37
vector< Energy > m_energy
Definition: quantumstate.h:40
list_type * m_list
Definition: quantumstate.h:185
float realnum
Definition: cddefines.h:124
void set_width(realnum width)
Definition: quantumstate.h:139
size_t size() const
Definition: quantumstate.h:131
qList(const char *chLabel, size_t i)
Definition: quantumstate.h:73
vector< long > m_j
Definition: quantumstate.h:42
vector< long > m_v
Definition: quantumstate.h:58
double & lifetime() const
Definition: quantumstate.h:264
long S() const
Definition: quantumstate.h:384
void reset(int n)
Definition: quantumstate.h:430
string & chConfig()
Definition: quantumstate.h:16
double & DepartCoef() const
Definition: quantumstate.h:217
realnum g() const
Definition: quantumstate.h:326
iterator end()
Definition: quantumstate.h:414
void Junk(qStateProxy st)
Definition: quantumstate.cpp:9
enum level_status status() const
Definition: quantumstate.h:400
ProxyIterator< qStateConstProxy, qStateConstProxy > const_iterator
Definition: quantumstate.h:65
reference operator[](int i)
Definition: quantumstate.h:422
vector< double, allocator_avx< double > > m_Boltzmann
Definition: quantumstate.h:39
vector< double > m_lifetime
Definition: quantumstate.h:47
string chLabel() const
Definition: energy.h:9
bool associated() const
Definition: quantumstate.h:313
qStateProxy reference
Definition: quantumstate.h:66
iterator begin()
Definition: quantumstate.h:406
long v() const
Definition: quantumstate.h:388
double Pop() const
Definition: quantumstate.h:334
vector< double, allocator_avx< double > > m_ConBoltz
Definition: quantumstate.h:38
string m_chLabel
Definition: quantumstate.h:36
double & Boltzmann() const
Definition: quantumstate.h:259
realnum m_width
Definition: quantumstate.h:60
Energy energy() const
Definition: quantumstate.h:322
void Zero(qStateProxy st)
string chLabel() const
long J() const
Definition: quantumstate.h:396
realnum & g() const
Definition: quantumstate.h:207
long l() const
Definition: quantumstate.h:380
const list_type * m_list
Definition: quantumstate.h:304
int nelem() const
Definition: quantumstate.h:360
int & nelem() const
Definition: quantumstate.h:249
long & S() const
Definition: quantumstate.h:276
double * ConBoltz()
Definition: quantumstate.h:151
void addone()
Definition: quantumstate.h:123
void chLabel_set(const char *s)
Definition: quantumstate.h:147
const string & chConfig() const
Definition: quantumstate.h:318
long j() const
Definition: quantumstate.h:392
const double * ConBoltz() const
Definition: quantumstate.h:155
long & J() const
Definition: quantumstate.h:288
double ColDen() const
Definition: quantumstate.h:330
const double * Boltzmann() const
Definition: quantumstate.h:163
void init(const char *label, size_t i)
Definition: quantumstate.h:118
string chLabel() const
Definition: quantumstate.h:143