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_