00001
00002
00003
00004 #ifndef COLLISION_H_
00005 #define COLLISION_H_
00006
00007
00008 enum collider {
00009 ipELECTRON,
00010 ipPROTON,
00011 ipHE_PLUS,
00012 ipALPHA,
00013 ipATOM_H,
00014 ipATOM_HE,
00015 ipH2_ORTHO,
00016 ipH2_PARA,
00017 ipH2,
00018 ipNCOLLIDER
00019 };
00020
00021 class t_collider
00022 {
00023 public:
00024 long charge;
00025 double *density;
00026 realnum mass_amu;
00027
00028 t_collider()
00029 {
00030 charge = LONG_MAX;
00031 density = NULL;
00032 mass_amu = FLT_MAX;
00033 }
00034 };
00035
00036 class ColliderList
00037 {
00038 public:
00039 vector<t_collider> list;
00040 ColliderList();
00041 void init();
00042 };
00043
00044 extern ColliderList colliders;
00045
00046 class collision_rates
00047 {
00048 double m_rate_coef_ul[ipNCOLLIDER];
00049 realnum m_rate_lu_nontherm;
00050 public:
00051 collision_rates()
00052 {
00053 for( long i=0; i<ipNCOLLIDER; i++ )
00054 m_rate_coef_ul[i] = 0.;
00055 m_rate_lu_nontherm = 0.f;
00056
00057 }
00059 double *rate_coef_ul_set()
00060 {
00061 return m_rate_coef_ul;
00062 }
00063 const double *rate_coef_ul() const
00064 {
00065 return m_rate_coef_ul;
00066 }
00067
00068 realnum &rate_lu_nontherm_set()
00069 {
00070 return m_rate_lu_nontherm;
00071 }
00072 realnum rate_lu_nontherm() const
00073 {
00074 return m_rate_lu_nontherm;
00075 }
00076 };
00077
00078 class CollisionList;
00079 class CollisionProxy
00080 {
00081 CollisionList *m_list;
00082 int m_index;
00083 public:
00084 explicit CollisionProxy(CollisionList *list, int index)
00085 : m_list(list), m_index(index) {}
00086
00088 realnum &col_str() const;
00090 double *rate_coef_ul_set() const;
00091 const double *rate_coef_ul() const;
00092 realnum &rate_lu_nontherm_set() const;
00093 realnum rate_lu_nontherm() const;
00095 double &cool() const;
00096 double &heat() const;
00097
00099 realnum ColUL( const ColliderList& colls ) const
00100 {
00101 double rate = 0.;
00102 ASSERT( colls.list.size() == ipNCOLLIDER );
00103 for( unsigned i = 0; i < colls.list.size(); ++i )
00104 {
00105 ASSERT( rate_coef_ul()[i] >= 0.0 );
00106 rate += rate_coef_ul()[i] * (*colls.list[i].density);
00107 }
00108 ASSERT( rate >= 0. );
00109 return (realnum) rate;
00110 }
00111
00112 void copy(CollisionProxy other)
00113 {
00114 col_str() = other.col_str();
00115 cool() = other.cool();
00116 heat() = other.heat();
00117 for (int i=0; i<ipNCOLLIDER; ++i)
00118 {
00119 rate_coef_ul_set()[i] = other.rate_coef_ul()[i];
00120 }
00121 rate_lu_nontherm_set() = other.rate_lu_nontherm();
00122 }
00123 };
00124
00125 class CollisionList
00126 {
00127 vector<collision_rates> m_rates;
00128 vector<realnum> m_col_str;
00129 vector<double> m_cool;
00130 vector<double> m_heat;
00131
00132 CollisionList &operator=(const CollisionList&);
00133 CollisionList(const CollisionList&);
00134 public:
00135 friend class CollisionProxy;
00136 typedef CollisionProxy reference;
00137 explicit CollisionList(size_t i)
00138 {
00139 resize(i);
00140 }
00141 explicit CollisionList() {}
00142 CollisionProxy operator[](size_t i)
00143 {
00144 return CollisionProxy(this,i);
00145 }
00146 size_t size(void) const
00147 {
00148 return m_rates.size();
00149 }
00150 void resize(size_t i)
00151 {
00152 m_rates.resize(i);
00153 m_col_str.resize(i);
00154 m_cool.resize(i);
00155 m_heat.resize(i);
00156 }
00157 void reserve(size_t i)
00158 {
00159 m_rates.reserve(i);
00160 m_col_str.reserve(i);
00161 m_cool.reserve(i);
00162 m_heat.reserve(i);
00163 }
00164 };
00165
00167 inline realnum &CollisionProxy::col_str() const
00168 {
00169 return m_list->m_col_str[m_index];
00170 }
00172 inline double *CollisionProxy::rate_coef_ul_set() const
00173 {
00174 return m_list->m_rates[m_index].rate_coef_ul_set();
00175 }
00176 inline const double *CollisionProxy::rate_coef_ul() const
00177 {
00178 return m_list->m_rates[m_index].rate_coef_ul();
00179 }
00180
00181 inline realnum &CollisionProxy::rate_lu_nontherm_set() const
00182 {
00183 return m_list->m_rates[m_index].rate_lu_nontherm_set();
00184 }
00185 inline realnum CollisionProxy::rate_lu_nontherm() const
00186 {
00187 return m_list->m_rates[m_index].rate_lu_nontherm();
00188 }
00190 inline double &CollisionProxy::cool() const
00191 {
00192 return m_list->m_cool[m_index];
00193 }
00194 inline double &CollisionProxy::heat() const
00195 {
00196 return m_list->m_heat[m_index];
00197 }
00198
00202 void CollisionJunk( const CollisionProxy & t );
00203
00207 void CollisionZero( const CollisionProxy & t );
00208
00209 #endif // COLLISION_H_