ESyS-Particle  4.0.1
Interaction.h
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