Cloudy
Spectral Synthesis Code for Astrophysics
Loading...
Searching...
No Matches
transition.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 TRANSITION_H_
5#define TRANSITION_H_
6
7#include "emission.h"
8#include "collision.h"
9#include "quantumstate.h"
10
13
14/* create a dummy emission structure. Non-radiative transitions will point to this */
16
17// Proxy class provides 'object' access to struct-of-vectors
18class TransitionList;
21class ExtraInten;
22
24{
25public:
29private:
33public:
34 explicit TransitionProxy(): m_list(0), m_index(-1) {}
35 explicit TransitionProxy(TransitionListImpl *list, int index) :
36 m_list(list), m_index(index) {}
37 void copy(const TransitionProxy& other) const;
38 qList::iterator Lo() const;
39 qList::iterator Hi() const;
40 void setLo(int ipLo) const;
41 void setHi(int ipHi) const;
42 void AddLine2Stack() const;
44 int &ipEmis() const;
45 string chLabel() const;
46 void setComment( const string &comment ) const;
47 string &getComment() const;
48 bool associated() const
49 {
50 return m_list != NULL && m_index >= 0;
51 }
52 bool isSameAs(const TransitionProxy& other) const
53 {
54 return m_list == other.m_list && m_index == other.m_index;
55 }
56 bool hasEmis() const
57 {
58 return ipEmis() != -1;
59 }
60 void resetEmis() const
61 {
62 Emis().ipTran() = m_index;
63 }
64 bool systemIs(const TransitionList *query) const;
66 {
67 return *m_list;
68 }
69 void check() const
70 {
71 ASSERT(!hasEmis() || Emis().ipTran() == m_index);
72 }
73 CollisionProxy Coll() const;
74
76 realnum &WLangVac() const;
77 t_wavl twav() const;
78
81 {
82 return (realnum)T1CM*EnergyWN();
83 }
84
86 {
87 return (realnum)ERG1CM*EnergyWN();
88 }
89
90 double EnergyRyd() const
91 {
92 return WAVNRYD*EnergyWN();
93 }
94
96 realnum &EnergyWN() const;
97
102 long &ipCont() const;
103
104
108 void Junk() const;
109
113 void Zero() const;
114
116 void outline( double nonScatteredFraction, bool lgDoChecks ) const ;
117
118
121 void outline_resonance( ) const ;
122 int &ipLo() const;
123 int &ipHi() const;
125 void AddHiState() const;
126 void AddLoState() const;
127 realnum width() const;
129 {
130 return m_list;
131 }
132};
133
135{
136public:
140private:
144public:
145 explicit TransitionConstProxy(): m_list(0), m_index(-1) {}
146 explicit TransitionConstProxy(const TransitionListImpl *list, int index) :
147 m_list(list), m_index(index) {}
148 void copy(const TransitionConstProxy& other) const;
151 void AddLine2Stack() const;
153 int ipEmis() const;
154 string getComment() const;
155 bool associated() const
156 {
157 return m_list != NULL && m_index >= 0;
158 }
159 bool hasEmis() const
160 {
161 return ipEmis() != -1;
162 }
163 void check() const
164 {
165 ASSERT(!hasEmis() || Emis().ipTran() == m_index);
166 }
168
170 realnum WLangVac() const;
171 t_wavl twav() const;
172
175 {
176 return (realnum)T1CM*EnergyWN();
177 }
178
180 {
181 return (realnum)ERG1CM*EnergyWN();
182 }
183
184 double EnergyRyd() const
185 {
186 return WAVNRYD*EnergyWN();
187 }
188
190 realnum EnergyWN() const;
191
196 long ipCont() const;
197
199 void outline( double nonScatteredFraction, bool lgDoChecks ) const ;
200
203 void outline_resonance( ) const ;
204 int ipLo() const;
205 int ipHi() const;
206};
207
208
209// Structure-of-vectors for transition data
211{
212 vector<int> ipHi, ipLo;
213 vector<long> ipCont;
215 vector<realnum> EnergyWN, WLangVac;
216 vector<string> chComment;
217 // DO NOT IMPLEMENT
220public:
221 friend class TransitionProxy;
223 string chLabel;
224 qList *states; // List of individual states
226 vector<int> ipEmis;
228 const string &chLabel,
230 {}
232 const string &chLabel,
233 qList *states,
234 size_t size) : chLabel(chLabel), states(states), Emis(this)
235 {
236 resize(size);
237 }
238 void resize(size_t newsize);
239 void reserve(size_t newsize);
244 {
245 return TransitionProxy(this,i);
246 }
247 size_t size(void) const
248 {
249 return ipCont.size();
250 }
251 void pop_back(void)
252 {
253 resize(size()-1);
254 }
256 {
257 return iterator(this,0);
258 }
260 {
261 return const_iterator(this,0);
262 }
264 {
265 return iterator(this,size());
266 }
267 const_iterator end(void) const
268 {
269 return const_iterator(this,size());
270 }
272 {
273 int newsize=size()+1;
274 resize(newsize);
275 (*this)[newsize-1].copy(tr);
276 }
278 {
279 return *(end()-1);
280 }
282 {
283 return states->width();
284 }
285};
286
288{
289 // Internal vectors all need to be sized consistently (see three
290 // functions below)
291 shared_ptr<TransitionListImpl> p_impl;
292public:
295 explicit TransitionList(const string &chLabel, qList *states, size_t size=0)
297 {}
298 void resize(size_t newsize)
299 {
300 p_impl->resize(newsize);
301 }
302 void reserve(size_t newsize)
303 {
304 p_impl->reserve(newsize);
305 }
307 {
308 return (*p_impl)[i];
309 }
310 size_t size(void) const
311 {
312 return p_impl->size();
313 }
314 void pop_back(void)
315 {
316 p_impl->pop_back();
317 }
319 {
320 return p_impl->begin();
321 }
323 {
324 return p_impl->end();
325 }
327 {
328 p_impl->push_back(tr);
329 }
331 {
332 return p_impl->back();
333 }
334 string &chLabel()
335 {
336 return p_impl->chLabel;
337 }
339 {
340 return p_impl->states;
341 }
343 {
344 return p_impl->Emis;
345 }
346 vector<int> &ipEmis()
347 {
348 return p_impl->ipEmis;
349 }
350 bool isSame (const TransitionListImpl *other) const
351 {
352 return p_impl.get() == other;
353 }
355 {
356 return p_impl->width();
357 }
358};
359
360inline bool TransitionProxy::systemIs(const TransitionList *query) const
361{
362 return query->isSame(m_list);
363}
364
365// Must include all internal vector elements in these three functions
366inline void TransitionListImpl::resize(size_t newsize)
367{
368 ipLo.resize(newsize);
369 ipHi.resize(newsize);
370 ipCont.resize(newsize);
371 Coll.resize(newsize);
372 EnergyWN.resize(newsize);
373 WLangVac.resize(newsize);
374 ipEmis.resize(newsize,-1);
375 chComment.resize(newsize);
376}
377inline void TransitionListImpl::reserve(size_t newsize)
378{
379 ipLo.reserve(newsize);
380 ipHi.reserve(newsize);
381 ipCont.reserve(newsize);
382 Coll.reserve(newsize);
383 EnergyWN.reserve(newsize);
384 WLangVac.reserve(newsize);
385 ipEmis.reserve(newsize);
386}
387inline void TransitionProxy::copy(const TransitionProxy& other) const
388{
389 m_list->ipLo[m_index] = other.m_list->ipLo[other.m_index];
390 m_list->ipHi[m_index] = other.m_list->ipHi[other.m_index];
391 m_list->ipCont[m_index] = other.m_list->ipCont[other.m_index];
392 m_list->Coll[m_index].copy(other.m_list->Coll[other.m_index]);
393 m_list->EnergyWN[m_index] = other.m_list->EnergyWN[other.m_index];
394 m_list->WLangVac[m_index] = other.m_list->WLangVac[other.m_index];
395 if (other.m_list->ipEmis[other.m_index] == -1)
396 {
397 m_list->ipEmis[m_index] = -1;
398 }
399 else
400 {
401 ASSERT (m_list->ipEmis[m_index] == -1);
403 m_list->Emis[m_list->ipEmis[m_index]].copy(
404 other.m_list->Emis[other.m_list->ipEmis[other.m_index]]);
405 }
406}
407// End of region needing consistency with TransitionListImpl class
408
409// Handle accessors need to see the structure of the TransitionList
411{
412 return m_list->states->begin()+m_list->ipLo[m_index];
413}
415{
416 return m_list->states->begin()+m_list->ipHi[m_index];
417}
418inline void TransitionProxy::setLo(int ipLo) const
419{
420 m_list->ipLo[m_index] = ipLo;
421}
422inline void TransitionProxy::setHi(int ipHi) const
423{
424 m_list->ipHi[m_index] = ipHi;
425}
427{
428 int ipEmis = m_list->ipEmis[m_index];
429 if (ipEmis == -1)
430 return DummyEmis;
431 else
432 return m_list->Emis[ipEmis];
433}
434inline int& TransitionProxy::ipEmis() const
435{
436 return m_list->ipEmis[m_index];
437}
439{
440 return m_list->ipEmis[m_index];
441}
443{
444 return m_list->Coll[m_index];
445}
446
448{
449 return m_list->WLangVac[m_index];
450}
452{
453 return m_list->WLangVac[m_index];
454}
456{
457 return t_vac(WLangVac());
458}
460{
461 return t_vac(WLangVac());
462}
463
465{
466 return m_list->EnergyWN[m_index];
467}
469{
470 return m_list->EnergyWN[m_index];
471}
472
476inline long &TransitionProxy::ipCont() const
477{
478 return m_list->ipCont[m_index];
479}
481{
482 return m_list->ipCont[m_index];
483}
484inline int &TransitionProxy::ipLo() const
485{
486 return m_list->ipLo[m_index];
487}
489{
490 return m_list->ipLo[m_index];
491}
492inline int &TransitionProxy::ipHi() const
493{
494 return m_list->ipHi[m_index];
495}
497{
498 return m_list->ipHi[m_index];
499}
500
502{
504 t.check();
505 return t;
506}
508{
510 t.check();
511 return t;
512}
513
514inline void TransitionProxy::setComment( const string &comment ) const
515{
516 m_list->chComment[m_index] = comment;
517}
518inline string &TransitionProxy::getComment() const
519{
520 return m_list->chComment[m_index];
521}
523{
524 return m_list->chComment[m_index];
525}
526
528{
529 return m_list->width();
530}
531
536void PutLine(const TransitionProxy &t, const char *chComment);
537
543void PutLine(const TransitionProxy &t, const char *chComment, const char *chLabel);
544
545void PutLine(const TransitionProxy& t, const char *chComment, const char *chLabel, const ExtraInten& extra);
546
550double TexcLine(const TransitionProxy &t);
551
555void DumpLine(const TransitionProxy &t);
556
560double emit_frac(const TransitionProxy &t);
561
562double GetLineRec(
563 /* this is the number of the emission line in the stack of lines, on the C scale */
564 long int ip,
565 /* the multiplet wavelength */
566 long int lWl);
567
571string chIonLbl(const TransitionProxy &t);
572string chIonLbl(const long& nelem, const long& IonStg);
573
578inline string chLineLbl(const TransitionProxy &t)
579{
580 return t.chLabel();
581}
582
587void PutCS(double cs,
588 const TransitionProxy & t);
589
596
601
606{
607public:
608 double v;
609 ExtraInten() : v(0.0) {}
610 explicit ExtraInten( double extra ) : v(extra) {}
611};
612
617void LineConvRate2CS( const TransitionProxy & t , realnum rate );
618
623inline bool lgTauGood( const TransitionProxy& t )
624{
625 bool lgOverrunOK = true;
626 if ( lgOverrunOK )
627 {
628 return true;
629 }
630 else
631 {
632 // first iteration only use inward optical depths so scale good
633 return ( iteration == 1 ||
634 // maser - optical depths also ok (but bizarre)
635 t.Emis().TauIn() <= 0. ||
636 // TauIn < TauTot means outward optical depth is positive, so OK
637 t.Emis().TauIn() < t.Emis().TauTot() );
638 }
639}
640
644void MakeCS(const TransitionProxy & t );
645
646extern map<std::string,std::vector<TransitionProxy> > blends;
647typedef map<std::string,std::vector<TransitionProxy> >::iterator blend_iterator;
648
649inline double phots( const TransitionProxy &t )
650{
651 return t.Emis().xIntensity() / t.EnergyErg();
652}
653
654#endif // _TRANSITION_H_
long int iteration
Definition cddefines.cpp:17
#define NULL
Definition cddefines.h:115
#define ASSERT(exp)
Definition cddefines.h:637
t_wavl t_vac(realnum w)
Definition cddefines.h:1333
float realnum
Definition cddefines.h:127
Definition collision.h:144
Definition collision.h:85
const EmissionList * m_list
Definition emission.h:182
int ipTran() const
Definition emission.h:567
TransitionConstProxy Tran() const
Definition transition.h:507
Definition emission.h:331
EmissionProxy reference
Definition emission.h:362
Definition emission.h:20
TransitionProxy Tran() const
Definition transition.h:501
double & xIntensity() const
Definition emission.h:542
realnum & TauIn() const
Definition emission.h:472
EmissionList * m_list
Definition emission.h:27
realnum & TauTot() const
Definition emission.h:492
int & ipTran() const
Definition emission.h:562
Definition transition.h:606
ExtraInten()
Definition transition.h:609
ExtraInten(double extra)
Definition transition.h:610
double v
Definition transition.h:608
Definition proxy_iterator.h:59
Definition transition.h:135
EmissionList::reference Emis() const
TransitionConstProxy()
Definition transition.h:145
TransitionConstProxy(const TransitionListImpl *list, int index)
Definition transition.h:146
realnum WLangVac() const
Definition transition.h:451
realnum EnergyErg() const
Definition transition.h:179
realnum EnergyWN() const
Definition transition.h:468
realnum EnergyK() const
Definition transition.h:174
void AddLine2Stack() const
ProxyIterator< TransitionConstProxy, TransitionConstProxy > const_iterator
Definition transition.h:139
const list_type * m_list
Definition transition.h:142
int m_index
Definition transition.h:143
qList::iterator Lo() const
long ipCont() const
Definition transition.h:480
int ipLo() const
Definition transition.h:488
bool hasEmis() const
Definition transition.h:159
int ipEmis() const
Definition transition.h:438
void copy(const TransitionConstProxy &other) const
double EnergyRyd() const
Definition transition.h:184
CollisionProxy Coll() const
void outline_resonance() const
qList::iterator Hi() const
const TransitionListImpl list_type
Definition transition.h:137
t_wavl twav() const
Definition transition.h:459
int ipHi() const
Definition transition.h:496
string getComment() const
Definition transition.h:522
void check() const
Definition transition.h:163
bool associated() const
Definition transition.h:155
ProxyIterator< TransitionConstProxy, TransitionConstProxy > iterator
Definition transition.h:138
void outline(double nonScatteredFraction, bool lgDoChecks) const
Definition transition.h:288
TransitionProxy::iterator iterator
Definition transition.h:293
void resize(size_t newsize)
Definition transition.h:298
realnum width() const
Definition transition.h:354
string & chLabel()
Definition transition.h:334
bool isSame(const TransitionListImpl *other) const
Definition transition.h:350
void push_back(const TransitionProxy &tr)
Definition transition.h:326
size_t size(void) const
Definition transition.h:310
void pop_back(void)
Definition transition.h:314
TransitionList(const string &chLabel, qList *states, size_t size=0)
Definition transition.h:295
shared_ptr< TransitionListImpl > p_impl
Definition transition.h:291
EmissionList & Emis()
Definition transition.h:342
void reserve(size_t newsize)
Definition transition.h:302
const TransitionProxy back(void)
Definition transition.h:330
vector< int > & ipEmis()
Definition transition.h:346
TransitionConstProxy::iterator const_iterator
Definition transition.h:294
iterator begin(void)
Definition transition.h:318
TransitionProxy operator[](size_t i)
Definition transition.h:306
iterator end(void)
Definition transition.h:322
qList *& states()
Definition transition.h:338
Definition transition.h:211
vector< realnum > WLangVac
Definition transition.h:215
TransitionListImpl(const string &chLabel, qList *states, size_t size)
Definition transition.h:231
vector< int > ipEmis
Definition transition.h:226
string chLabel
Definition transition.h:223
TransitionProxy::iterator iterator
Definition transition.h:240
TransitionListImpl(const TransitionListImpl &)
TransitionProxy reference
Definition transition.h:242
size_t size(void) const
Definition transition.h:247
vector< int > ipHi
Definition transition.h:212
void push_back(const TransitionProxy &tr)
Definition transition.h:271
vector< int > ipLo
Definition transition.h:212
realnum width() const
Definition transition.h:281
TransitionListImpl & operator=(const TransitionListImpl &)
vector< long > ipCont
Definition transition.h:213
friend class TransitionConstProxy
Definition transition.h:222
EmissionList Emis
Definition transition.h:225
const_iterator end(void) const
Definition transition.h:267
void reserve(size_t newsize)
Definition transition.h:377
qList * states
Definition transition.h:224
reference operator[](size_t i)
Definition transition.h:243
vector< realnum > EnergyWN
Definition transition.h:215
friend class TransitionProxy
Definition transition.h:221
TransitionConstProxy::iterator const_iterator
Definition transition.h:241
void resize(size_t newsize)
Definition transition.h:366
iterator begin(void)
Definition transition.h:255
const_iterator begin(void) const
Definition transition.h:259
CollisionList Coll
Definition transition.h:214
iterator end(void)
Definition transition.h:263
const TransitionProxy back(void)
Definition transition.h:277
TransitionListImpl(const string &chLabel, qList *states)
Definition transition.h:227
void pop_back(void)
Definition transition.h:251
vector< string > chComment
Definition transition.h:216
Definition transition.h:24
void setHi(int ipHi) const
Definition transition.h:422
void Zero() const
Definition transition.cpp:488
bool hasEmis() const
Definition transition.h:56
list_type * list() const
Definition transition.h:128
void outline(double nonScatteredFraction, bool lgDoChecks) const
Definition transition.cpp:46
int & ipLo() const
Definition transition.h:484
void check() const
Definition transition.h:69
TransitionProxy()
Definition transition.h:34
int & ipEmis() const
Definition transition.h:434
CollisionProxy Coll() const
Definition transition.h:442
void AddLine2Stack() const
Definition transition.cpp:648
void Junk() const
Definition transition.cpp:460
TransitionProxy(TransitionListImpl *list, int index)
Definition transition.h:35
void resetEmis() const
Definition transition.h:60
bool isSameAs(const TransitionProxy &other) const
Definition transition.h:52
bool associated() const
Definition transition.h:48
list_type * m_list
Definition transition.h:31
realnum EnergyErg() const
Definition transition.h:85
realnum & EnergyWN() const
Definition transition.h:464
ProxyIterator< TransitionConstProxy, TransitionConstProxy > const_iterator
Definition transition.h:28
realnum width() const
Definition transition.h:527
qList::iterator Lo() const
Definition transition.h:410
double EnergyRyd() const
Definition transition.h:90
long & ipCont() const
Definition transition.h:476
string chLabel() const
Definition transition.cpp:278
bool systemIs(const TransitionList *query) const
Definition transition.h:360
realnum EnergyK() const
Definition transition.h:80
const TransitionListImpl & system() const
Definition transition.h:65
void AddHiState() const
Definition transition.cpp:671
void AddLoState() const
Definition transition.cpp:660
string & getComment() const
Definition transition.h:518
ProxyIterator< TransitionProxy, TransitionConstProxy > iterator
Definition transition.h:27
int m_index
Definition transition.h:32
int & ipHi() const
Definition transition.h:492
void setComment(const string &comment) const
Definition transition.h:514
qList::iterator Hi() const
Definition transition.h:414
void copy(const TransitionProxy &other) const
Definition transition.h:387
void setLo(int ipLo) const
Definition transition.h:418
realnum & WLangVac() const
Definition transition.h:447
TransitionListImpl list_type
Definition transition.h:26
EmissionList::reference Emis() const
Definition transition.h:426
t_wavl twav() const
Definition transition.h:455
void outline_resonance() const
Definition transition.cpp:39
Definition quantumstate.h:36
ProxyIterator< qStateProxy, qStateConstProxy > iterator
Definition quantumstate.h:62
Definition cddefines.h:1299
EmissionProxy DummyEmis
Definition taulines.cpp:126
map< std::string, std::vector< TransitionProxy > > blends
Definition transition.cpp:36
map< std::string, std::vector< TransitionProxy > >::iterator blend_iterator
Definition transition.h:647
void LineConvRate2CS(const TransitionProxy &t, realnum rate)
Definition transition.cpp:504
EmissionProxy DummyEmis
Definition taulines.cpp:126
void PutLine(const TransitionProxy &t, const char *chComment)
Definition transition.cpp:451
string chLineLbl(const TransitionProxy &t)
Definition transition.h:578
void DumpLine(const TransitionProxy &t)
Definition transition.cpp:138
string GenerateTransitionConfiguration(const TransitionProxy &t)
Definition transition.cpp:313
double GetLineRec(long int ip, long int lWl)
Definition transition.cpp:107
bool lgTauGood(const TransitionProxy &t)
Definition transition.h:623
double OccupationNumberLine(const TransitionProxy &t)
Definition transition.cpp:181
double emit_frac(const TransitionProxy &t)
Definition transition.cpp:88
void MakeCS(const TransitionProxy &t)
Definition transition.cpp:596
double phots(const TransitionProxy &t)
Definition transition.h:649
double TexcLine(const TransitionProxy &t)
Definition transition.cpp:211
void PutCS(double cs, const TransitionProxy &t)
Definition transition.cpp:300
string chIonLbl(const TransitionProxy &t)
Definition transition.cpp:237