00001
00002
00003
00004 #ifndef TRANSITION_H_
00005 #define TRANSITION_H_
00006
00007 #include "count_ptr.h"
00008 #include "emission.h"
00009 #include "collision.h"
00010 #include "proxy_iterator.h"
00011 #include "quantumstate.h"
00012
00016
00017 extern EmissionProxy DummyEmis;
00018
00019
00020 class TransitionList;
00021 class TransitionListImpl;
00022 class TransitionConstProxy;
00023 class TransitionProxy
00024 {
00025 public:
00026 typedef TransitionListImpl list_type;
00027 typedef ProxyIterator<TransitionProxy,TransitionConstProxy> iterator;
00028 typedef ProxyIterator<TransitionConstProxy,TransitionConstProxy> const_iterator;
00029 private:
00030 friend class ProxyIterator<TransitionProxy,TransitionConstProxy>;
00031 list_type *m_list;
00032 int m_index;
00033 public:
00034
00035
00036
00037
00038
00039 explicit TransitionProxy(): m_list(0), m_index(-1) {}
00040 explicit TransitionProxy(TransitionListImpl *list, int index) :
00041 m_list(list), m_index(index) {}
00042 void copy(const TransitionProxy& other) const;
00043 qList::iterator Lo() const;
00044 qList::iterator Hi() const;
00045 void setLo(int ipLo) const;
00046 void setHi(int ipHi) const;
00047 void AddLine2Stack() const;
00048 EmissionList::reference Emis() const;
00049 int &ipEmis() const;
00050 bool associated() const
00051 {
00052 return m_list != NULL && m_index >= 0;
00053 }
00054 bool hasEmis() const
00055 {
00056 return ipEmis() != -1;
00057 }
00058 void resetEmis() const
00059 {
00060 Emis().ipTran() = m_index;
00061 }
00062 bool systemIs(const TransitionList *query) const;
00063 void check() const
00064 {
00065 ASSERT(!hasEmis() || Emis().ipTran() == m_index);
00066 }
00067 CollisionProxy Coll() const;
00068
00070 realnum &WLAng() const;
00071
00073 realnum EnergyK() const
00074 {
00075 return (realnum)T1CM*EnergyWN();
00076 }
00078 realnum EnergyErg() const
00079 {
00080 return (realnum)ERG1CM*EnergyWN();
00081 }
00083 double EnergyRyd() const
00084 {
00085 return WAVNRYD*EnergyWN();
00086 }
00087
00088
00090 realnum &EnergyWN() const;
00091
00096 long &ipCont() const;
00097
00098
00102 void Junk( void ) const ;
00103
00107 void Zero( void ) const ;
00108
00110 void outline( double nonScatteredFraction, bool lgDoChecks ) const ;
00111
00112
00115 void outline_resonance( ) const ;
00116 int &ipLo() const;
00117 int &ipHi() const;
00119 void AddHiState() const;
00120 void AddLoState() const;
00121 };
00122 class TransitionConstProxy
00123 {
00124 public:
00125 typedef const TransitionListImpl list_type;
00126 typedef ProxyIterator<TransitionConstProxy,TransitionConstProxy> iterator;
00127 typedef ProxyIterator<TransitionConstProxy,TransitionConstProxy> const_iterator;
00128 private:
00129 friend class ProxyIterator<TransitionConstProxy,TransitionConstProxy>;
00130 const list_type *m_list;
00131 int m_index;
00132 public:
00133
00134
00135
00136
00137
00138 explicit TransitionConstProxy(): m_list(0), m_index(-1) {}
00139 explicit TransitionConstProxy(const TransitionListImpl *list, int index) :
00140 m_list(list), m_index(index) {}
00141 void copy(const TransitionConstProxy& other) const;
00142 qList::iterator Lo() const;
00143 qList::iterator Hi() const;
00144 void AddLine2Stack() const;
00145 EmissionList::reference Emis() const;
00146 int ipEmis() const;
00147 bool associated() const
00148 {
00149 return m_list != NULL && m_index >= 0;
00150 }
00151 bool hasEmis() const
00152 {
00153 return ipEmis() != -1;
00154 }
00155 void check() const
00156 {
00157 ASSERT(!hasEmis() || Emis().ipTran() == m_index);
00158 }
00159 CollisionProxy Coll() const;
00160
00162 realnum WLAng() const;
00163
00165 realnum EnergyK() const
00166 {
00167 return (realnum)T1CM*EnergyWN();
00168 }
00170 realnum EnergyErg() const
00171 {
00172 return (realnum)ERG1CM*EnergyWN();
00173 }
00175 double EnergyRyd() const
00176 {
00177 return WAVNRYD*EnergyWN();
00178 }
00179
00180
00182 realnum EnergyWN() const;
00183
00188 long ipCont() const;
00189
00191 void outline( double nonScatteredFraction, bool lgDoChecks ) const ;
00192
00195 void outline_resonance( ) const ;
00196 int ipLo() const;
00197 int ipHi() const;
00198 };
00199
00200
00201
00202 class TransitionListImpl
00203 {
00204 vector<int> ipHi, ipLo;
00205 vector<long> ipCont;
00206 CollisionList Coll;
00207 vector<realnum> EnergyWN, WLAng;
00208
00209 TransitionListImpl(const TransitionListImpl&);
00210 TransitionListImpl& operator=(const TransitionListImpl&);
00211 public:
00212 friend class TransitionProxy;
00213 friend class TransitionConstProxy;
00214 string chLabel;
00215 qList *states;
00216 EmissionList Emis;
00217 vector<int> ipEmis;
00218 explicit TransitionListImpl(
00219 const string &chLabel,
00220 qList *states) : chLabel(chLabel), states(states), Emis(this)
00221 {}
00222 explicit TransitionListImpl(
00223 const string &chLabel,
00224 qList *states,
00225 size_t size) : chLabel(chLabel), states(states), Emis(this)
00226 {
00227 resize(size);
00228 }
00229 void resize(size_t newsize);
00230 void reserve(size_t newsize);
00231 typedef TransitionProxy::iterator iterator;
00232 typedef TransitionConstProxy::iterator const_iterator;
00233 typedef TransitionProxy reference;
00234 reference operator[](size_t i)
00235 {
00236 return TransitionProxy(this,i);
00237 }
00238 size_t size(void) const
00239 {
00240 return ipCont.size();
00241 }
00242 void pop_back(void)
00243 {
00244 resize(size()-1);
00245 }
00246 iterator begin(void)
00247 {
00248 return iterator(this,0);
00249 }
00250 const_iterator begin(void) const
00251 {
00252 return const_iterator(this,0);
00253 }
00254 iterator end(void)
00255 {
00256 return iterator(this,size());
00257 }
00258 const_iterator end(void) const
00259 {
00260 return const_iterator(this,size());
00261 }
00262 void push_back(const TransitionProxy &tr)
00263 {
00264 int newsize=size()+1;
00265 resize(newsize);
00266 (*this)[newsize-1].copy(tr);
00267 }
00268 const TransitionProxy back(void)
00269 {
00270 return *(end()-1);
00271 }
00272 };
00273
00274 class TransitionList
00275 {
00276
00277
00278 count_ptr<TransitionListImpl> p_impl;
00279 public:
00280 typedef TransitionProxy::iterator iterator;
00281 typedef TransitionConstProxy::iterator const_iterator;
00282 explicit TransitionList(const string &chLabel, qList *states, size_t size=0)
00283 : p_impl(new TransitionListImpl(chLabel, states, size))
00284 {}
00285 void resize(size_t newsize)
00286 {
00287 p_impl->resize(newsize);
00288 }
00289 void reserve(size_t newsize)
00290 {
00291 p_impl->reserve(newsize);
00292 }
00293 TransitionProxy operator[](size_t i)
00294 {
00295 return (*p_impl)[i];
00296 }
00297 size_t size(void) const
00298 {
00299 return p_impl->size();
00300 }
00301 void pop_back(void)
00302 {
00303 p_impl->pop_back();
00304 }
00305 iterator begin(void)
00306 {
00307 return p_impl->begin();
00308 }
00309 iterator end(void)
00310 {
00311 return p_impl->end();
00312 }
00313 void push_back(const TransitionProxy &tr)
00314 {
00315 p_impl->push_back(tr);
00316 }
00317 const TransitionProxy back(void)
00318 {
00319 return p_impl->back();
00320 }
00321 string &chLabel()
00322 {
00323 return p_impl->chLabel;
00324 }
00325 qList *&states()
00326 {
00327 return p_impl->states;
00328 }
00329 EmissionList &Emis()
00330 {
00331 return p_impl->Emis;
00332 }
00333 vector<int> &ipEmis()
00334 {
00335 return p_impl->ipEmis;
00336 }
00337 bool isSame (const TransitionListImpl *other) const
00338 {
00339 return p_impl.get_ptr() == other;
00340 }
00341 };
00342
00343 inline bool TransitionProxy::systemIs(const TransitionList *query) const
00344 {
00345 return query->isSame(m_list);
00346 }
00347
00348
00349 inline void TransitionListImpl::resize(size_t newsize)
00350 {
00351 ipLo.resize(newsize);
00352 ipHi.resize(newsize);
00353 ipCont.resize(newsize);
00354 Coll.resize(newsize);
00355 EnergyWN.resize(newsize);
00356 WLAng.resize(newsize);
00357 ipEmis.resize(newsize,-1);
00358 }
00359 inline void TransitionListImpl::reserve(size_t newsize)
00360 {
00361 ipLo.reserve(newsize);
00362 ipHi.reserve(newsize);
00363 ipCont.reserve(newsize);
00364 Coll.reserve(newsize);
00365 EnergyWN.reserve(newsize);
00366 WLAng.reserve(newsize);
00367 ipEmis.reserve(newsize);
00368 }
00369 inline void TransitionProxy::copy(const TransitionProxy& other) const
00370 {
00371 m_list->ipLo[m_index] = other.m_list->ipLo[other.m_index];
00372 m_list->ipHi[m_index] = other.m_list->ipHi[other.m_index];
00373 m_list->ipCont[m_index] = other.m_list->ipCont[other.m_index];
00374 m_list->Coll[m_index].copy(other.m_list->Coll[other.m_index]);
00375 m_list->EnergyWN[m_index] = other.m_list->EnergyWN[other.m_index];
00376 m_list->WLAng[m_index] = other.m_list->WLAng[other.m_index];
00377 if (other.m_list->ipEmis[other.m_index] == -1)
00378 {
00379 m_list->ipEmis[m_index] = -1;
00380 }
00381 else
00382 {
00383 ASSERT (m_list->ipEmis[m_index] == -1);
00384 AddLine2Stack();
00385 m_list->Emis[m_list->ipEmis[m_index]].copy(
00386 other.m_list->Emis[other.m_list->ipEmis[other.m_index]]);
00387 }
00388 }
00389
00390
00391
00392 inline qList::iterator TransitionProxy::Lo() const
00393 {
00394 return m_list->states->begin()+m_list->ipLo[m_index];
00395 }
00396 inline qList::iterator TransitionProxy::Hi() const
00397 {
00398 return m_list->states->begin()+m_list->ipHi[m_index];
00399 }
00400 inline void TransitionProxy::setLo(int ipLo) const
00401 {
00402 m_list->ipLo[m_index] = ipLo;
00403 }
00404 inline void TransitionProxy::setHi(int ipHi) const
00405 {
00406 m_list->ipHi[m_index] = ipHi;
00407 }
00408 inline EmissionList::reference TransitionProxy::Emis() const
00409 {
00410 int ipEmis = m_list->ipEmis[m_index];
00411 if (ipEmis == -1)
00412 return DummyEmis;
00413 else
00414 return m_list->Emis[ipEmis];
00415 }
00416 inline int& TransitionProxy::ipEmis() const
00417 {
00418 return m_list->ipEmis[m_index];
00419 }
00420 inline int TransitionConstProxy::ipEmis() const
00421 {
00422 return m_list->ipEmis[m_index];
00423 }
00424 inline CollisionProxy TransitionProxy::Coll() const
00425 {
00426 return m_list->Coll[m_index];
00427 }
00429 inline realnum &TransitionProxy::WLAng() const
00430 {
00431 return m_list->WLAng[m_index];
00432 }
00433 inline realnum TransitionConstProxy::WLAng() const
00434 {
00435 return m_list->WLAng[m_index];
00436 }
00438 inline realnum &TransitionProxy::EnergyWN() const
00439 {
00440 return m_list->EnergyWN[m_index];
00441 }
00442 inline realnum TransitionConstProxy::EnergyWN() const
00443 {
00444 return m_list->EnergyWN[m_index];
00445 }
00450 inline long &TransitionProxy::ipCont() const
00451 {
00452 return m_list->ipCont[m_index];
00453 }
00454 inline long TransitionConstProxy::ipCont() const
00455 {
00456 return m_list->ipCont[m_index];
00457 }
00458 inline int &TransitionProxy::ipLo() const
00459 {
00460 return m_list->ipLo[m_index];
00461 }
00462 inline int TransitionConstProxy::ipLo() const
00463 {
00464 return m_list->ipLo[m_index];
00465 }
00466 inline int &TransitionProxy::ipHi() const
00467 {
00468 return m_list->ipHi[m_index];
00469 }
00470 inline int TransitionConstProxy::ipHi() const
00471 {
00472 return m_list->ipHi[m_index];
00473 }
00474
00475 inline TransitionProxy EmissionProxy::Tran() const
00476 {
00477 TransitionProxy t = TransitionProxy(m_list->m_tlist,ipTran());
00478 t.check();
00479 return t;
00480 }
00481 inline TransitionConstProxy EmissionConstProxy::Tran() const
00482 {
00483 TransitionConstProxy t = TransitionConstProxy(m_list->m_tlist,ipTran());
00484 t.check();
00485 return t;
00486 }
00487
00500 void PutLine(const TransitionProxy &t, const char *chComment);
00501
00507 void PutLine(const TransitionProxy &t, const char *chComment, const char *chLabel);
00508
00512 double TexcLine(const TransitionProxy &t);
00513
00517 void DumpLine(const TransitionProxy &t);
00518
00522 double emit_frac(const TransitionProxy &t);
00523
00527 void chIonLbl(char*, const TransitionProxy &t);
00528 void chIonLbl(char *chIonLbl_v, const long& nelem, const long& IonStg);
00529
00534 char* chLineLbl(const TransitionProxy &t);
00535
00540 void PutCS(double cs,
00541 const TransitionProxy & t);
00542
00548 void GenerateTransitionConfiguration( const TransitionProxy &t, char *chComment );
00549
00553 double OccupationNumberLine(const TransitionProxy &t);
00554
00558 void PutExtra(double Extra);
00559
00564 void LineConvRate2CS( const TransitionProxy & t , realnum rate );
00565
00570 inline bool lgTauGood( const TransitionProxy& t )
00571 {
00572
00573 return ( iteration == 1 ||
00574
00575 t.Emis().TauIn() <= 0. ||
00576
00577 t.Emis().TauIn() < t.Emis().TauTot() );
00578 }
00579
00583 void MakeCS(const TransitionProxy & t );
00584
00585 #endif // _TRANSITION_H_