cloudy trunk
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-2013 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 "count_ptr.h"
8#include "emission.h"
9#include "collision.h"
10#include "proxy_iterator.h"
11#include "quantumstate.h"
12
15
16/* create a dummy emission structure. Non-radiative transitions will point to this */
18
19// Proxy class provides 'object' access to struct-of-vectors
20class TransitionList;
24{
25public:
29private:
33public:
34 //TransitionProxy()
35 //{
36 // Junk();
37 //}
38
39 explicit TransitionProxy(): m_list(0), m_index(-1) {}
40 explicit TransitionProxy(TransitionListImpl *list, int index) :
41 m_list(list), m_index(index) {}
42 void copy(const TransitionProxy& other) const;
43 qList::iterator Lo() const;
44 qList::iterator Hi() const;
45 void setLo(int ipLo) const;
46 void setHi(int ipHi) const;
47 void AddLine2Stack() const;
49 int &ipEmis() const;
50 bool associated() const
51 {
52 return m_list != NULL && m_index >= 0;
53 }
54 bool hasEmis() const
55 {
56 return ipEmis() != -1;
57 }
58 void resetEmis() const
59 {
60 Emis().ipTran() = m_index;
61 }
62 bool systemIs(const TransitionList *query) const;
63 void check() const
64 {
65 ASSERT(!hasEmis() || Emis().ipTran() == m_index);
66 }
67 CollisionProxy Coll() const;
68
70 realnum &WLAng() const;
71
74 {
75 return (realnum)T1CM*EnergyWN();
76 }
77
79 {
80 return (realnum)ERG1CM*EnergyWN();
81 }
82
83 double EnergyRyd() const
84 {
85 return WAVNRYD*EnergyWN();
86 }
87
88
90 realnum &EnergyWN() const;
91
96 long &ipCont() const;
97
98
102 void Junk( void ) const ;
103
107 void Zero( void ) const ;
108
110 void outline( double nonScatteredFraction, bool lgDoChecks ) const ;
111
112
115 void outline_resonance( ) const ;
116 int &ipLo() const;
117 int &ipHi() const;
119 void AddHiState() const;
120 void AddLoState() const;
121};
123{
124public:
128private:
132public:
133 //TransitionProxy()
134 //{
135 // Junk();
136 //}
137
138 explicit TransitionConstProxy(): m_list(0), m_index(-1) {}
139 explicit TransitionConstProxy(const TransitionListImpl *list, int index) :
140 m_list(list), m_index(index) {}
141 void copy(const TransitionConstProxy& other) const;
144 void AddLine2Stack() const;
146 int ipEmis() const;
147 bool associated() const
148 {
149 return m_list != NULL && m_index >= 0;
150 }
151 bool hasEmis() const
152 {
153 return ipEmis() != -1;
154 }
155 void check() const
156 {
157 ASSERT(!hasEmis() || Emis().ipTran() == m_index);
158 }
160
162 realnum WLAng() const;
163
166 {
167 return (realnum)T1CM*EnergyWN();
168 }
169
171 {
172 return (realnum)ERG1CM*EnergyWN();
173 }
174
175 double EnergyRyd() const
176 {
177 return WAVNRYD*EnergyWN();
178 }
179
180
182 realnum EnergyWN() const;
183
188 long ipCont() const;
189
191 void outline( double nonScatteredFraction, bool lgDoChecks ) const ;
192
195 void outline_resonance( ) const ;
196 int ipLo() const;
197 int ipHi() const;
198};
199
200
201// Structure-of-vectors for transition data
203{
204 vector<int> ipHi, ipLo;
205 vector<long> ipCont;
207 vector<realnum> EnergyWN, WLAng;
208 // DO NOT IMPLEMENT
211public:
212 friend class TransitionProxy;
214 string chLabel;
215 qList *states; // List of individual states
217 vector<int> ipEmis;
219 const string &chLabel,
221 {}
223 const string &chLabel,
224 qList *states,
225 size_t size) : chLabel(chLabel), states(states), Emis(this)
226 {
227 resize(size);
228 }
229 void resize(size_t newsize);
230 void reserve(size_t newsize);
235 {
236 return TransitionProxy(this,i);
237 }
238 size_t size(void) const
239 {
240 return ipCont.size();
241 }
242 void pop_back(void)
243 {
244 resize(size()-1);
245 }
247 {
248 return iterator(this,0);
249 }
251 {
252 return const_iterator(this,0);
253 }
255 {
256 return iterator(this,size());
257 }
258 const_iterator end(void) const
259 {
260 return const_iterator(this,size());
261 }
263 {
264 int newsize=size()+1;
265 resize(newsize);
266 (*this)[newsize-1].copy(tr);
267 }
269 {
270 return *(end()-1);
271 }
272};
273
275{
276 // Internal vectors all need to be sized consistently (see three
277 // functions below)
279public:
282 explicit TransitionList(const string &chLabel, qList *states, size_t size=0)
284 {}
285 void resize(size_t newsize)
286 {
287 p_impl->resize(newsize);
288 }
289 void reserve(size_t newsize)
290 {
291 p_impl->reserve(newsize);
292 }
294 {
295 return (*p_impl)[i];
296 }
297 size_t size(void) const
298 {
299 return p_impl->size();
300 }
301 void pop_back(void)
302 {
303 p_impl->pop_back();
304 }
306 {
307 return p_impl->begin();
308 }
310 {
311 return p_impl->end();
312 }
314 {
315 p_impl->push_back(tr);
316 }
318 {
319 return p_impl->back();
320 }
321 string &chLabel()
322 {
323 return p_impl->chLabel;
324 }
326 {
327 return p_impl->states;
328 }
330 {
331 return p_impl->Emis;
332 }
333 vector<int> &ipEmis()
334 {
335 return p_impl->ipEmis;
336 }
337 bool isSame (const TransitionListImpl *other) const
338 {
339 return p_impl.get_ptr() == other;
340 }
341};
342
343inline bool TransitionProxy::systemIs(const TransitionList *query) const
344{
345 return query->isSame(m_list);
346}
347
348// Must include all internal vector elements in these three functions
349inline void TransitionListImpl::resize(size_t newsize)
350{
351 ipLo.resize(newsize);
352 ipHi.resize(newsize);
353 ipCont.resize(newsize);
354 Coll.resize(newsize);
355 EnergyWN.resize(newsize);
356 WLAng.resize(newsize);
357 ipEmis.resize(newsize,-1);
358}
359inline void TransitionListImpl::reserve(size_t newsize)
360{
361 ipLo.reserve(newsize);
362 ipHi.reserve(newsize);
363 ipCont.reserve(newsize);
364 Coll.reserve(newsize);
365 EnergyWN.reserve(newsize);
366 WLAng.reserve(newsize);
367 ipEmis.reserve(newsize);
368}
369inline void TransitionProxy::copy(const TransitionProxy& other) const
370{
371 m_list->ipLo[m_index] = other.m_list->ipLo[other.m_index];
372 m_list->ipHi[m_index] = other.m_list->ipHi[other.m_index];
373 m_list->ipCont[m_index] = other.m_list->ipCont[other.m_index];
374 m_list->Coll[m_index].copy(other.m_list->Coll[other.m_index]);
375 m_list->EnergyWN[m_index] = other.m_list->EnergyWN[other.m_index];
376 m_list->WLAng[m_index] = other.m_list->WLAng[other.m_index];
377 if (other.m_list->ipEmis[other.m_index] == -1)
378 {
379 m_list->ipEmis[m_index] = -1;
380 }
381 else
382 {
383 ASSERT (m_list->ipEmis[m_index] == -1);
385 m_list->Emis[m_list->ipEmis[m_index]].copy(
386 other.m_list->Emis[other.m_list->ipEmis[other.m_index]]);
387 }
388}
389// End of region needing consistency with TransitionListImpl class
390
391// Handle accessors need to see the structure of the TransitionList
393{
394 return m_list->states->begin()+m_list->ipLo[m_index];
395}
397{
398 return m_list->states->begin()+m_list->ipHi[m_index];
399}
400inline void TransitionProxy::setLo(int ipLo) const
401{
402 m_list->ipLo[m_index] = ipLo;
403}
404inline void TransitionProxy::setHi(int ipHi) const
405{
406 m_list->ipHi[m_index] = ipHi;
407}
409{
410 int ipEmis = m_list->ipEmis[m_index];
411 if (ipEmis == -1)
412 return DummyEmis;
413 else
414 return m_list->Emis[ipEmis];
415}
416inline int& TransitionProxy::ipEmis() const
417{
418 return m_list->ipEmis[m_index];
419}
421{
422 return m_list->ipEmis[m_index];
423}
425{
426 return m_list->Coll[m_index];
427}
428
430{
431 return m_list->WLAng[m_index];
432}
434{
435 return m_list->WLAng[m_index];
436}
437
439{
440 return m_list->EnergyWN[m_index];
441}
443{
444 return m_list->EnergyWN[m_index];
445}
446
450inline long &TransitionProxy::ipCont() const
451{
452 return m_list->ipCont[m_index];
453}
455{
456 return m_list->ipCont[m_index];
457}
458inline int &TransitionProxy::ipLo() const
459{
460 return m_list->ipLo[m_index];
461}
463{
464 return m_list->ipLo[m_index];
465}
466inline int &TransitionProxy::ipHi() const
467{
468 return m_list->ipHi[m_index];
469}
471{
472 return m_list->ipHi[m_index];
473}
474
476{
478 t.check();
479 return t;
480}
482{
484 t.check();
485 return t;
486}
487
495
500void PutLine(const TransitionProxy &t, const char *chComment);
501
507void PutLine(const TransitionProxy &t, const char *chComment, const char *chLabel);
508
512double TexcLine(const TransitionProxy &t);
513
517void DumpLine(const TransitionProxy &t);
518
522double emit_frac(const TransitionProxy &t);
523
527void chIonLbl(char*, const TransitionProxy &t);
528void chIonLbl(char *chIonLbl_v, const long& nelem, const long& IonStg);
529
534char* chLineLbl(const TransitionProxy &t);
535
540void PutCS(double cs,
541 const TransitionProxy & t);
542
548void GenerateTransitionConfiguration( const TransitionProxy &t, char *chComment );
549
554
558void PutExtra(double Extra);
559
564void LineConvRate2CS( const TransitionProxy & t , realnum rate );
565
570inline bool lgTauGood( const TransitionProxy& t )
571{
572 // first iteration only use inward optical depths so scale good
573 return ( iteration == 1 ||
574 // maser - optical depths also ok (but bizarre)
575 t.Emis().TauIn() <= 0. ||
576 // TauIn < TauTot means outward optical depth is positive, so OK
577 t.Emis().TauIn() < t.Emis().TauTot() );
578}
579
583void MakeCS(const TransitionProxy & t );
584
585#endif // _TRANSITION_H_
long int iteration
Definition cddefines.cpp:16
#define ASSERT(exp)
Definition cddefines.h:578
float realnum
Definition cddefines.h:103
const EmissionList * m_list
Definition emission.h:158
int ipTran() const
Definition emission.h:498
TransitionConstProxy Tran() const
Definition transition.h:481
EmissionProxy reference
Definition emission.h:316
TransitionProxy Tran() const
Definition transition.h:475
realnum & TauIn() const
Definition emission.h:423
EmissionList * m_list
Definition emission.h:22
realnum & TauTot() const
Definition emission.h:433
int & ipTran() const
Definition emission.h:493
EmissionList::reference Emis() const
TransitionConstProxy(const TransitionListImpl *list, int index)
Definition transition.h:139
realnum EnergyErg() const
Definition transition.h:170
realnum EnergyWN() const
Definition transition.h:442
realnum EnergyK() const
Definition transition.h:165
void AddLine2Stack() const
ProxyIterator< TransitionConstProxy, TransitionConstProxy > const_iterator
Definition transition.h:127
const list_type * m_list
Definition transition.h:130
qList::iterator Lo() const
long ipCont() const
Definition transition.h:454
bool hasEmis() const
Definition transition.h:151
void copy(const TransitionConstProxy &other) const
double EnergyRyd() const
Definition transition.h:175
CollisionProxy Coll() const
void outline_resonance() const
qList::iterator Hi() const
const TransitionListImpl list_type
Definition transition.h:125
realnum WLAng() const
Definition transition.h:433
void check() const
Definition transition.h:155
bool associated() const
Definition transition.h:147
ProxyIterator< TransitionConstProxy, TransitionConstProxy > iterator
Definition transition.h:126
void outline(double nonScatteredFraction, bool lgDoChecks) const
TransitionProxy::iterator iterator
Definition transition.h:280
void resize(size_t newsize)
Definition transition.h:285
string & chLabel()
Definition transition.h:321
bool isSame(const TransitionListImpl *other) const
Definition transition.h:337
void push_back(const TransitionProxy &tr)
Definition transition.h:313
size_t size(void) const
Definition transition.h:297
void pop_back(void)
Definition transition.h:301
TransitionList(const string &chLabel, qList *states, size_t size=0)
Definition transition.h:282
EmissionList & Emis()
Definition transition.h:329
count_ptr< TransitionListImpl > p_impl
Definition transition.h:278
void reserve(size_t newsize)
Definition transition.h:289
const TransitionProxy back(void)
Definition transition.h:317
vector< int > & ipEmis()
Definition transition.h:333
TransitionConstProxy::iterator const_iterator
Definition transition.h:281
iterator begin(void)
Definition transition.h:305
TransitionProxy operator[](size_t i)
Definition transition.h:293
iterator end(void)
Definition transition.h:309
qList *& states()
Definition transition.h:325
TransitionListImpl(const string &chLabel, qList *states, size_t size)
Definition transition.h:222
vector< int > ipEmis
Definition transition.h:217
TransitionProxy::iterator iterator
Definition transition.h:231
TransitionListImpl(const TransitionListImpl &)
TransitionProxy reference
Definition transition.h:233
size_t size(void) const
Definition transition.h:238
vector< int > ipHi
Definition transition.h:204
void push_back(const TransitionProxy &tr)
Definition transition.h:262
vector< int > ipLo
Definition transition.h:204
TransitionListImpl & operator=(const TransitionListImpl &)
vector< long > ipCont
Definition transition.h:205
friend class TransitionConstProxy
Definition transition.h:213
EmissionList Emis
Definition transition.h:216
const_iterator end(void) const
Definition transition.h:258
void reserve(size_t newsize)
Definition transition.h:359
reference operator[](size_t i)
Definition transition.h:234
vector< realnum > EnergyWN
Definition transition.h:207
friend class TransitionProxy
Definition transition.h:212
TransitionConstProxy::iterator const_iterator
Definition transition.h:232
void resize(size_t newsize)
Definition transition.h:349
iterator begin(void)
Definition transition.h:246
const_iterator begin(void) const
Definition transition.h:250
CollisionList Coll
Definition transition.h:206
iterator end(void)
Definition transition.h:254
vector< realnum > WLAng
Definition transition.h:207
const TransitionProxy back(void)
Definition transition.h:268
TransitionListImpl(const string &chLabel, qList *states)
Definition transition.h:218
void pop_back(void)
Definition transition.h:242
void setHi(int ipHi) const
Definition transition.h:404
bool hasEmis() const
Definition transition.h:54
void outline(double nonScatteredFraction, bool lgDoChecks) const
int & ipLo() const
Definition transition.h:458
void check() const
Definition transition.h:63
int & ipEmis() const
Definition transition.h:416
CollisionProxy Coll() const
Definition transition.h:424
void AddLine2Stack() const
TransitionProxy(TransitionListImpl *list, int index)
Definition transition.h:40
void resetEmis() const
Definition transition.h:58
bool associated() const
Definition transition.h:50
list_type * m_list
Definition transition.h:31
realnum & WLAng() const
Definition transition.h:429
realnum EnergyErg() const
Definition transition.h:78
realnum & EnergyWN() const
Definition transition.h:438
ProxyIterator< TransitionConstProxy, TransitionConstProxy > const_iterator
Definition transition.h:28
qList::iterator Lo() const
Definition transition.h:392
double EnergyRyd() const
Definition transition.h:83
long & ipCont() const
Definition transition.h:450
void Junk(void) const
bool systemIs(const TransitionList *query) const
Definition transition.h:343
realnum EnergyK() const
Definition transition.h:73
void AddHiState() const
void AddLoState() const
ProxyIterator< TransitionProxy, TransitionConstProxy > iterator
Definition transition.h:27
int & ipHi() const
Definition transition.h:466
qList::iterator Hi() const
Definition transition.h:396
void copy(const TransitionProxy &other) const
Definition transition.h:369
void setLo(int ipLo) const
Definition transition.h:400
TransitionListImpl list_type
Definition transition.h:26
void Zero(void) const
EmissionList::reference Emis() const
Definition transition.h:408
void outline_resonance() const
ProxyIterator< qStateProxy, qStateConstProxy > iterator
UNUSED const double T1CM
Definition physconst.h:167
UNUSED const double ERG1CM
Definition physconst.h:164
UNUSED const double WAVNRYD
Definition physconst.h:173
EmissionProxy DummyEmis
Definition taulines.cpp:61
void LineConvRate2CS(const TransitionProxy &t, realnum rate)
EmissionProxy DummyEmis
Definition taulines.cpp:61
void PutLine(const TransitionProxy &t, const char *chComment)
void PutExtra(double Extra)
void DumpLine(const TransitionProxy &t)
void chIonLbl(char *, const TransitionProxy &t)
void GenerateTransitionConfiguration(const TransitionProxy &t, char *chComment)
bool lgTauGood(const TransitionProxy &t)
Definition transition.h:570
double OccupationNumberLine(const TransitionProxy &t)
double emit_frac(const TransitionProxy &t)
void MakeCS(const TransitionProxy &t)
double TexcLine(const TransitionProxy &t)
void PutCS(double cs, const TransitionProxy &t)
char * chLineLbl(const TransitionProxy &t)