00001
00002
00003
00004 #ifndef EMISSION_H_
00005 #define EMISSION_H_
00006
00007 #include "proxy_iterator.h"
00008
00009 class TransitionListImpl;
00010 class TransitionProxy;
00011 class TransitionConstProxy;
00012 class EmissionList;
00013 class EmissionConstProxy;
00014 class EmissionProxy
00015 {
00016 public:
00017 typedef EmissionList list_type;
00018 typedef ProxyIterator<EmissionProxy,EmissionConstProxy> iterator;
00019 typedef ProxyIterator<EmissionConstProxy,EmissionConstProxy> const_iterator;
00020 private:
00021 friend class ProxyIterator<EmissionProxy,EmissionConstProxy>;
00022 EmissionList *m_list;
00023 int m_index;
00024 public:
00025 explicit EmissionProxy() : m_list(NULL), m_index(-1) {}
00026 explicit EmissionProxy(EmissionList *list, int index) :
00027 m_list(list), m_index(index) {}
00028 void copy(const EmissionProxy& other);
00029
00030 void check() const
00031 {
00032 ASSERT(ipTran() >= 0);
00033 }
00034
00043 int &iRedisFun() const;
00044
00046 long int &ipFine() const;
00047
00061 realnum &TauIn() const;
00062
00073 realnum &TauTot() const;
00074
00079 iter_track_basic<realnum>& TauTrack() const;
00080
00086 realnum &TauCon() const;
00087
00089 realnum &FracInwd() const;
00090
00093 double &pump() const;
00094
00096 double &xIntensity() const;
00097
00099 double &phots() const;
00100
00102 realnum &gf() const;
00103
00105 realnum &Pesc() const;
00106
00108 realnum &Pelec_esc() const;
00109
00111 realnum &Pdest() const;
00112
00114 realnum Pesc_total() const { return Pesc() + Pelec_esc(); }
00115
00119 realnum &dampXvel() const;
00120
00122 realnum &damp() const;
00123
00125 double &ColOvTot() const;
00126
00128 realnum &AutoIonizFrac() const;
00129
00135 realnum &opacity() const;
00136
00138 double &PopOpc() const;
00139
00141 realnum &Aul() const;
00142
00144 double &ots() const;
00145
00146 int &ipTran() const;
00147
00148 TransitionProxy Tran() const;
00149 };
00150 class EmissionConstProxy
00151 {
00152 public:
00153 typedef const EmissionList list_type;
00154 typedef ProxyIterator<EmissionConstProxy,EmissionConstProxy> iterator;
00155 typedef ProxyIterator<EmissionConstProxy,EmissionConstProxy> const_iterator;
00156 private:
00157 friend class ProxyIterator<EmissionConstProxy,EmissionConstProxy>;
00158 const EmissionList *m_list;
00159 int m_index;
00160 public:
00161 explicit EmissionConstProxy() : m_list(NULL), m_index(-1) {}
00162 explicit EmissionConstProxy(const EmissionList *list, int index) :
00163 m_list(list), m_index(index) {}
00164 void copy(const EmissionConstProxy& other);
00165
00166 void check() const
00167 {
00168 ASSERT(ipTran() >= 0);
00169 }
00170
00179 int iRedisFun() const;
00180
00182 long int ipFine() const;
00183
00197 realnum TauIn() const;
00198
00209 realnum TauTot() const;
00210
00215 const iter_track_basic<realnum>& TauTrack() const;
00216
00222 realnum TauCon() const;
00223
00225 realnum FracInwd() const;
00226
00229 double pump() const;
00230
00232 double xIntensity() const;
00233
00235 double phots() const;
00236
00238 realnum gf() const;
00239
00241 realnum Pesc() const;
00242
00244 realnum Pelec_esc() const;
00245
00247 realnum Pdest() const;
00248
00250 realnum Pesc_total() const { return Pesc() + Pelec_esc(); }
00251
00255 realnum dampXvel() const;
00256
00258 realnum damp() const;
00259
00261 double ColOvTot() const;
00262
00264 realnum AutoIonizFrac() const;
00265
00271 realnum opacity() const;
00272
00274 double PopOpc() const;
00275
00277 realnum Aul() const;
00278
00280 double ots() const;
00281
00282 int ipTran() const;
00283
00284 TransitionConstProxy Tran() const;
00285 };
00286
00287 class EmissionList
00288 {
00289 TransitionListImpl *m_tlist;
00290 vector<realnum> m_Aul;
00291 vector<realnum> m_AutoIonizFrac;
00292 vector<double> m_ColOvTot;
00293 vector<realnum> m_damp;
00294 vector<realnum> m_dampXvel;
00295 vector<realnum> m_FracInwd;
00296 vector<realnum> m_gf;
00297 vector<int> m_iRedisFun;
00298 vector<long> m_ipFine;
00299 vector<realnum> m_opacity;
00300 vector<double> m_ots;
00301 vector<realnum> m_Pdest;
00302 vector<realnum> m_Pesc;
00303 vector<realnum> m_Pelec_esc;
00304 vector<double> m_phots;
00305 vector<double> m_PopOpc;
00306 vector<double> m_pump;
00307 vector<realnum> m_TauCon;
00308 vector<realnum> m_TauIn;
00309 vector<realnum> m_TauTot;
00310 vector<iter_track_basic<realnum> > m_TauTrack;
00311 vector<double> m_xIntensity;
00312 vector<int> m_ipTran;
00313 friend class EmissionProxy;
00314 friend class EmissionConstProxy;
00315 public:
00316 typedef EmissionProxy reference;
00317 typedef EmissionProxy::iterator iterator;
00318 typedef EmissionConstProxy::iterator const_iterator;
00319 explicit EmissionList(TransitionListImpl *tlist, size_t i) : m_tlist(tlist)
00320 {
00321 resize(i);
00322 }
00323 explicit EmissionList(TransitionListImpl *tlist) : m_tlist(tlist) {}
00324 reference operator[](size_t i)
00325 {
00326 return EmissionProxy(this,i);
00327 }
00328 size_t size(void) const
00329 {
00330 return m_Aul.size();
00331 }
00332 void resize(size_t i);
00333 iterator begin()
00334 {
00335 return iterator(this,0);
00336 }
00337 const_iterator begin() const
00338 {
00339 return const_iterator(this,0);
00340 }
00341 iterator end()
00342 {
00343 return iterator(this,size());
00344 }
00345 const_iterator end() const
00346 {
00347 return const_iterator(this,size());
00348 }
00349 };
00350
00354 void EmLineJunk( EmissionList::reference t );
00358 void EmLineZero( EmissionList::reference t );
00363 void TauZero( EmissionList::reference t );
00364
00365 inline void EmissionList::resize(size_t i)
00366 {
00367 size_t oldsize = m_Aul.size();
00368 m_Aul.resize(i);
00369 m_AutoIonizFrac.resize(i);
00370 m_ColOvTot.resize(i);
00371 m_damp.resize(i);
00372 m_dampXvel.resize(i);
00373 m_gf.resize(i);
00374 m_FracInwd.resize(i);
00375 m_ipFine.resize(i);
00376 m_iRedisFun.resize(i);
00377 m_ots.resize(i);
00378 m_opacity.resize(i);
00379 m_Pdest.resize(i);
00380 m_Pelec_esc.resize(i);
00381 m_Pesc.resize(i);
00382 m_phots.resize(i);
00383 m_PopOpc.resize(i);
00384 m_TauCon.resize(i);
00385 m_TauIn.resize(i);
00386 m_TauTot.resize(i);
00387 m_TauTrack.resize(i);
00388 m_pump.resize(i);
00389 m_xIntensity.resize(i);
00390 m_ipTran.resize(i,-1);
00391 for (size_t newelem=oldsize; newelem < size(); ++newelem)
00392 {
00393 EmLineJunk((*this)[newelem]);
00394
00395
00396
00397
00398 EmLineZero((*this)[newelem]);
00399 TauZero((*this)[newelem]);
00400 }
00401 }
00402
00403 inline int &EmissionProxy::iRedisFun() const
00404 {
00405 return m_list->m_iRedisFun[m_index];
00406 }
00407
00408 inline int EmissionConstProxy::iRedisFun() const
00409 {
00410 return m_list->m_iRedisFun[m_index];
00411 }
00412
00413 inline long int &EmissionProxy::ipFine() const
00414 {
00415 return m_list->m_ipFine[m_index];
00416 }
00417
00418 inline long int EmissionConstProxy::ipFine() const
00419 {
00420 return m_list->m_ipFine[m_index];
00421 }
00422
00423 inline realnum &EmissionProxy::TauIn() const
00424 {
00425 return m_list->m_TauIn[m_index];
00426 }
00427
00428 inline realnum EmissionConstProxy::TauIn() const
00429 {
00430 return m_list->m_TauIn[m_index];
00431 }
00432
00433 inline realnum &EmissionProxy::TauTot() const
00434 {
00435 return m_list->m_TauTot[m_index];
00436 }
00437
00438 inline realnum EmissionConstProxy::TauTot() const
00439 {
00440 return m_list->m_TauTot[m_index];
00441 }
00442
00443 inline iter_track_basic<realnum>&EmissionProxy:: TauTrack() const
00444 {
00445 return m_list->m_TauTrack[m_index];
00446 }
00447
00448 inline const iter_track_basic<realnum>&EmissionConstProxy:: TauTrack() const
00449 {
00450 return m_list->m_TauTrack[m_index];
00451 }
00452
00453 inline realnum &EmissionProxy::TauCon() const
00454 {
00455 return m_list->m_TauCon[m_index];
00456 }
00457
00458 inline realnum EmissionConstProxy::TauCon() const
00459 {
00460 return m_list->m_TauCon[m_index];
00461 }
00462
00463 inline realnum &EmissionProxy::FracInwd() const
00464 {
00465 return m_list->m_FracInwd[m_index];
00466 }
00467
00468 inline realnum EmissionConstProxy::FracInwd() const
00469 {
00470 return m_list->m_FracInwd[m_index];
00471 }
00472
00473 inline double &EmissionProxy::pump() const
00474 {
00475 return m_list->m_pump[m_index];
00476 }
00477
00478 inline double EmissionConstProxy::pump() const
00479 {
00480 return m_list->m_pump[m_index];
00481 }
00482
00483 inline double &EmissionProxy::xIntensity() const
00484 {
00485 return m_list->m_xIntensity[m_index];
00486 }
00487
00488 inline double EmissionConstProxy::xIntensity() const
00489 {
00490 return m_list->m_xIntensity[m_index];
00491 }
00492
00493 inline int &EmissionProxy::ipTran() const
00494 {
00495 return m_list->m_ipTran[m_index];
00496 }
00497
00498 inline int EmissionConstProxy::ipTran() const
00499 {
00500 return m_list->m_ipTran[m_index];
00501 }
00502
00503 inline double &EmissionProxy::phots() const
00504 {
00505 return m_list->m_phots[m_index];
00506 }
00507
00508 inline double EmissionConstProxy::phots() const
00509 {
00510 return m_list->m_phots[m_index];
00511 }
00512
00513 inline realnum &EmissionProxy::gf() const
00514 {
00515 return m_list->m_gf[m_index];
00516 }
00517
00518 inline realnum EmissionConstProxy::gf() const
00519 {
00520 return m_list->m_gf[m_index];
00521 }
00522
00523 inline realnum &EmissionProxy::Pesc() const
00524 {
00525 return m_list->m_Pesc[m_index];
00526 }
00527
00528 inline realnum EmissionConstProxy::Pesc() const
00529 {
00530 return m_list->m_Pesc[m_index];
00531 }
00532
00533 inline realnum &EmissionProxy::Pelec_esc() const
00534 {
00535 return m_list->m_Pelec_esc[m_index];
00536 }
00537
00538 inline realnum EmissionConstProxy::Pelec_esc() const
00539 {
00540 return m_list->m_Pelec_esc[m_index];
00541 }
00542
00543 inline realnum &EmissionProxy::Pdest() const
00544 {
00545 return m_list->m_Pdest[m_index];
00546 }
00547
00548 inline realnum EmissionConstProxy::Pdest() const
00549 {
00550 return m_list->m_Pdest[m_index];
00551 }
00552
00553 inline realnum &EmissionProxy::dampXvel() const
00554 {
00555 return m_list->m_dampXvel[m_index];
00556 }
00557
00558 inline realnum EmissionConstProxy::dampXvel() const
00559 {
00560 return m_list->m_dampXvel[m_index];
00561 }
00562
00563 inline realnum &EmissionProxy::damp() const
00564 {
00565 return m_list->m_damp[m_index];
00566 }
00567
00568 inline realnum EmissionConstProxy::damp() const
00569 {
00570 return m_list->m_damp[m_index];
00571 }
00572
00573 inline double &EmissionProxy::ColOvTot() const
00574 {
00575 return m_list->m_ColOvTot[m_index];
00576 }
00577
00578 inline double EmissionConstProxy::ColOvTot() const
00579 {
00580 return m_list->m_ColOvTot[m_index];
00581 }
00582
00583 inline realnum &EmissionProxy::AutoIonizFrac() const
00584 {
00585 return m_list->m_AutoIonizFrac[m_index];
00586 }
00587
00588 inline realnum EmissionConstProxy::AutoIonizFrac() const
00589 {
00590 return m_list->m_AutoIonizFrac[m_index];
00591 }
00592
00593 inline realnum &EmissionProxy::opacity() const
00594 {
00595 return m_list->m_opacity[m_index];
00596 }
00597
00598 inline realnum EmissionConstProxy::opacity() const
00599 {
00600 return m_list->m_opacity[m_index];
00601 }
00602
00603 inline double &EmissionProxy::PopOpc() const
00604 {
00605 return m_list->m_PopOpc[m_index];
00606 }
00607
00608 inline double EmissionConstProxy::PopOpc() const
00609 {
00610 return m_list->m_PopOpc[m_index];
00611 }
00612
00613 inline realnum &EmissionProxy::Aul() const
00614 {
00615 return m_list->m_Aul[m_index];
00616 }
00617
00618 inline realnum EmissionConstProxy::Aul() const
00619 {
00620 return m_list->m_Aul[m_index];
00621 }
00622
00623 inline double &EmissionProxy::ots() const
00624 {
00625 return m_list->m_ots[m_index];
00626 }
00627
00628 inline double EmissionConstProxy::ots() const
00629 {
00630 return m_list->m_ots[m_index];
00631 }
00632
00633 inline void EmissionProxy::copy(const EmissionProxy& other)
00634 {
00635 iRedisFun() = other.iRedisFun();
00636 ipFine() = other.ipFine();
00637 TauIn() = other.TauIn();
00638 TauTot() = other.TauTot();
00639 TauCon() = other.TauCon();
00640 FracInwd() = other.FracInwd();
00641 gf() = other.gf();
00642 Pesc() = other.Pesc();
00643 Pelec_esc() = other.Pelec_esc();
00644 Pdest() = other.Pdest();
00645 dampXvel() = other.dampXvel();
00646 damp() = other.damp();
00647 AutoIonizFrac() = other.AutoIonizFrac();
00648 opacity() = other.opacity();
00649 Aul() = other.Aul();
00650 TauTrack() = other.TauTrack();
00651 pump() = other.pump();
00652 xIntensity() = other.xIntensity();
00653 phots() = other.phots();
00654 ColOvTot() = other.ColOvTot();
00655 PopOpc() = other.PopOpc();
00656 ots() = other.ots();
00657 ipTran() = other.ipTran();
00658 }
00659
00660 #endif // EMISSION_H_