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