cloudy  trunk
collision.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 COLLISION_H_
5 #define COLLISION_H_
6 
7  /* these are flags for various colliders that are used across the code */
8 enum collider {
19 };
20 
21 class t_collider
22 {
23 public:
24  long charge;
25  double *density;
27 
29  {
30  charge = LONG_MAX;
31  density = NULL;
32  mass_amu = FLT_MAX;
33  }
34 };
35 
37 {
38 public:
39  vector<t_collider> list;
40  ColliderList();
41  void init();
42 };
43 
44 extern ColliderList colliders;
45 
47 {
50 public:
52  {
53  for( long i=0; i<ipNCOLLIDER; i++ )
54  m_rate_coef_ul[i] = 0.;
55  m_rate_lu_nontherm = 0.f;
56 
57  }
59  double *rate_coef_ul_set()
60  {
61  return m_rate_coef_ul;
62  }
63  const double *rate_coef_ul() const
64  {
65  return m_rate_coef_ul;
66  }
67  // nonthermal collisional excitiation rate [s-1]
69  {
70  return m_rate_lu_nontherm;
71  }
73  {
74  return m_rate_lu_nontherm;
75  }
76 };
77 
78 class CollisionList;
80 {
82  int m_index;
83 public:
84  explicit CollisionProxy(CollisionList *list, int index)
85  : m_list(list), m_index(index) {}
86 
88  realnum &col_str() const;
90  double *rate_coef_ul_set() const;
91  const double *rate_coef_ul() const;
93  realnum rate_lu_nontherm() const;
95  double &cool() const;
96  double &heat() const;
97 
99  realnum ColUL( const ColliderList& colls ) const
100  {
101  double rate = 0.;
102  ASSERT( colls.list.size() == ipNCOLLIDER );
103  for( unsigned i = 0; i < colls.list.size(); ++i )
104  {
105  ASSERT( rate_coef_ul()[i] >= 0.0 );
106  rate += rate_coef_ul()[i] * (*colls.list[i].density);
107  }
108  ASSERT( rate >= 0. );
109  return (realnum) rate;
110  }
111 
112  void copy(CollisionProxy other)
113  {
114  col_str() = other.col_str();
115  cool() = other.cool();
116  heat() = other.heat();
117  for (int i=0; i<ipNCOLLIDER; ++i)
118  {
119  rate_coef_ul_set()[i] = other.rate_coef_ul()[i];
120  }
122  }
123 };
124 
126 {
127  vector<collision_rates> m_rates;
128  vector<realnum> m_col_str;
129  vector<double> m_cool;
130  vector<double> m_heat;
131  // DO NOT IMPEMENT
134 public:
135  friend class CollisionProxy;
137  explicit CollisionList(size_t i)
138  {
139  resize(i);
140  }
141  explicit CollisionList() {}
143  {
144  return CollisionProxy(this,i);
145  }
146  size_t size(void) const
147  {
148  return m_rates.size();
149  }
150  void resize(size_t i)
151  {
152  m_rates.resize(i);
153  m_col_str.resize(i);
154  m_cool.resize(i);
155  m_heat.resize(i);
156  }
157  void reserve(size_t i)
158  {
159  m_rates.reserve(i);
160  m_col_str.reserve(i);
161  m_cool.reserve(i);
162  m_heat.reserve(i);
163  }
164 };
165 
168 {
169  return m_list->m_col_str[m_index];
170 }
172 inline double *CollisionProxy::rate_coef_ul_set() const
173 {
174  return m_list->m_rates[m_index].rate_coef_ul_set();
175 }
176 inline const double *CollisionProxy::rate_coef_ul() const
177 {
178  return m_list->m_rates[m_index].rate_coef_ul();
179 }
180 // nonthermal collisional excitation rate [s-1]
182 {
183  return m_list->m_rates[m_index].rate_lu_nontherm_set();
184 }
186 {
187  return m_list->m_rates[m_index].rate_lu_nontherm();
188 }
190 inline double &CollisionProxy::cool() const
191 {
192  return m_list->m_cool[m_index];
193 }
194 inline double &CollisionProxy::heat() const
195 {
196  return m_list->m_heat[m_index];
197 }
198 
202 void CollisionJunk( const CollisionProxy & t );
203 
207 void CollisionZero( const CollisionProxy & t );
208 
209 #endif // COLLISION_H_
t_collider::t_collider
t_collider()
Definition: collision.h:28
CollisionList::operator=
CollisionList & operator=(const CollisionList &)
CollisionProxy::cool
double & cool() const
Definition: collision.h:190
collision_rates::rate_lu_nontherm_set
realnum & rate_lu_nontherm_set()
Definition: collision.h:68
CollisionList::resize
void resize(size_t i)
Definition: collision.h:150
ipHE_PLUS
@ ipHE_PLUS
Definition: collision.h:11
t_collider
Definition: collision.h:21
CollisionList
Definition: collision.h:125
CollisionProxy::rate_coef_ul
const double * rate_coef_ul() const
Definition: collision.h:176
realnum
float realnum
Definition: cddefines.h:103
ipH2_PARA
@ ipH2_PARA
Definition: collision.h:16
CollisionList::m_col_str
vector< realnum > m_col_str
Definition: collision.h:128
collision_rates::rate_coef_ul_set
double * rate_coef_ul_set()
Definition: collision.h:59
ipH2_ORTHO
@ ipH2_ORTHO
Definition: collision.h:15
collision_rates
Definition: collision.h:46
CollisionProxy::copy
void copy(CollisionProxy other)
Definition: collision.h:112
CollisionList::CollisionProxy
friend class CollisionProxy
Definition: collision.h:135
t_collider::density
double * density
Definition: collision.h:25
collider
collider
Definition: collision.h:8
ASSERT
#define ASSERT(exp)
Definition: cddefines.h:578
ipATOM_H
@ ipATOM_H
Definition: collision.h:13
collision_rates::collision_rates
collision_rates()
Definition: collision.h:51
ipALPHA
@ ipALPHA
Definition: collision.h:12
ColliderList::ColliderList
ColliderList()
Definition: collision.cpp:11
CollisionList::operator[]
CollisionProxy operator[](size_t i)
Definition: collision.h:142
ipPROTON
@ ipPROTON
Definition: collision.h:10
CollisionProxy::heat
double & heat() const
Definition: collision.h:194
CollisionProxy::m_index
int m_index
Definition: collision.h:82
CollisionProxy::m_list
CollisionList * m_list
Definition: collision.h:81
t_collider::charge
long charge
Definition: collision.h:24
CollisionProxy::rate_lu_nontherm_set
realnum & rate_lu_nontherm_set() const
Definition: collision.h:181
CollisionProxy::rate_coef_ul_set
double * rate_coef_ul_set() const
Definition: collision.h:172
CollisionList::m_heat
vector< double > m_heat
Definition: collision.h:130
CollisionProxy::rate_lu_nontherm
realnum rate_lu_nontherm() const
Definition: collision.h:185
ipH2
@ ipH2
Definition: collision.h:17
CollisionList::size
size_t size(void) const
Definition: collision.h:146
ipATOM_HE
@ ipATOM_HE
Definition: collision.h:14
CollisionProxy::CollisionProxy
CollisionProxy(CollisionList *list, int index)
Definition: collision.h:84
CollisionList::CollisionList
CollisionList()
Definition: collision.h:141
ColliderList::list
vector< t_collider > list
Definition: collision.h:39
collision_rates::m_rate_coef_ul
double m_rate_coef_ul[ipNCOLLIDER]
Definition: collision.h:48
colliders
ColliderList colliders
Definition: collision.cpp:57
ipNCOLLIDER
@ ipNCOLLIDER
Definition: collision.h:18
CollisionProxy
Definition: collision.h:79
CollisionProxy::col_str
realnum & col_str() const
Definition: collision.h:167
CollisionProxy::ColUL
realnum ColUL(const ColliderList &colls) const
Definition: collision.h:99
ipELECTRON
@ ipELECTRON
Definition: collision.h:9
ColliderList::init
void init()
Definition: collision.cpp:44
CollisionZero
void CollisionZero(const CollisionProxy &t)
Definition: collision.cpp:81
CollisionList::reserve
void reserve(size_t i)
Definition: collision.h:157
CollisionList::CollisionList
CollisionList(size_t i)
Definition: collision.h:137
ColliderList
Definition: collision.h:36
collision_rates::m_rate_lu_nontherm
realnum m_rate_lu_nontherm
Definition: collision.h:49
collision_rates::rate_coef_ul
const double * rate_coef_ul() const
Definition: collision.h:63
CollisionList::m_cool
vector< double > m_cool
Definition: collision.h:129
t_collider::mass_amu
realnum mass_amu
Definition: collision.h:26
CollisionJunk
void CollisionJunk(const CollisionProxy &t)
Definition: collision.cpp:60
collision_rates::rate_lu_nontherm
realnum rate_lu_nontherm() const
Definition: collision.h:72
CollisionList::reference
CollisionProxy reference
Definition: collision.h:136
CollisionList::m_rates
vector< collision_rates > m_rates
Definition: collision.h:127