ESyS-Particle
4.0.1
|
00001 00002 // // 00003 // Copyright (c) 2003-2011 by The University of Queensland // 00004 // Earth Systems Science Computational Centre (ESSCC) // 00005 // http://www.uq.edu.au/esscc // 00006 // // 00007 // Primary Business: Brisbane, Queensland, Australia // 00008 // Licensed under the Open Software License version 3.0 // 00009 // http://www.opensource.org/licenses/osl-3.0.php // 00010 // // 00012 00013 #ifndef __INTERACTION_H 00014 #define __INTERACTION_H 00015 00016 // -- project includes -- 00017 #include "Model/Particle.h" 00018 #include "Foundation/quintuple.h" 00019 00020 // -- STL includes -- 00021 #include <utility> 00022 #include <vector> 00023 using std::vector; 00024 using std::pair; 00025 using std::make_pair; 00026 00027 00036 class AInteraction 00037 { 00038 protected: 00039 vector<int> m_id; 00040 int m_iid; 00041 bool m_init; 00042 00043 public: 00044 AInteraction(); 00045 virtual ~AInteraction(); 00046 00047 bool initialized() const; 00048 virtual void calcForces()=0; 00049 virtual void calcHeatTrans() {}; 00050 virtual void calcHeatFrict() {}; 00051 vector<int> getAllID() const; 00052 int getID(){return m_iid;}; 00053 virtual bool hasTag(int,int) const=0; 00054 virtual Vec3 getPosFirst() const=0; 00055 virtual Vec3 getPosSecond() const{return Vec3(0.0,0.0,0.0);}; 00056 inline double Count() const {return 1.0;}; 00057 }; 00058 00059 00068 class APairInteraction : public AInteraction 00069 { 00070 protected: 00071 CParticle *m_p1,*m_p2; 00072 00073 public: 00074 // functions 00075 APairInteraction(); 00076 APairInteraction(CParticle*,CParticle*); 00077 virtual ~APairInteraction(); 00078 00079 inline const CParticle* first()const {return m_p1;} 00080 inline const CParticle* second()const {return m_p2;} 00081 inline CParticle* first() {return m_p1;} 00082 inline CParticle* second() {return m_p2;} 00083 00084 inline pair<int,int> getPairID() const {return make_pair(m_p1->getID(),m_p2->getID());}; 00085 virtual Vec3 getPos() const = 0; 00086 virtual void calcForces() = 0; 00087 void setPP(CParticle*,CParticle*); 00088 void checkIDs(); 00089 virtual bool hasTag(int,int) const; 00090 virtual Vec3 getPosFirst() const {return m_p1->getPos();}; 00091 virtual Vec3 getPosSecond() const{return m_p2->getPos();}; 00092 00093 esys::lsm::quintuple<Vec3,double,Vec3,double,Vec3> getRaw2Data() const 00094 { 00095 return 00096 esys::lsm::quintuple<Vec3,double,Vec3,double,Vec3>( 00097 m_p1->getPos(), 00098 m_p1->getRad(), 00099 m_p2->getPos(), 00100 m_p2->getRad(), 00101 getPos() 00102 ); 00103 } 00104 00105 template <class TmplParticle> void setPP(const vector<TmplParticle *> &pp) 00106 { 00107 m_p1=pp[0]; 00108 m_p2=pp[1]; 00109 m_id.clear(); 00110 m_id.push_back(m_p1->getID()); 00111 m_id.push_back(m_p2->getID()); 00112 } 00113 00114 // dummy implementations for save/load of restart parameters 00115 virtual void saveRestartData(std::ostream &oStream){}; 00116 virtual void loadRestartData(std::istream &iStream){}; 00117 }; 00118 #endif