ESyS-Particle  4.0.1
ElasticInteraction.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 __ELASTICINTERACTION_H
00014 #define __ELASTICINTERACTION_H
00015 
00016 #include "Model/IGParam.h"
00017 #include "Model/Interaction.h"
00018 #include "Model/Particle.h"
00019 
00020 
00024 class CElasticIGP : public AIGParam
00025 {
00026 protected:
00027 public:
00028   double m_k;
00029   bool m_scaling;
00030 
00031   CElasticIGP();
00032   CElasticIGP(const std::string&,double,bool scaling=true);
00033 
00034   virtual void  packInto(CVarMPIBuffer*) const;
00035   void setSpringConst(double k){m_k=k;};
00036   double getSpringConst() const{return m_k;};
00037   
00038   virtual std::string getTypeString() const {return "Elastic";}
00039 
00040   friend ostream& operator<<(ostream&,const CElasticIGP&);
00041 };
00042 
00043 
00051 class CElasticInteraction : public APairInteraction
00052 {
00053 public:
00054 
00055   typedef double (CElasticInteraction::* ScalarFieldFunction)() const;
00056   typedef pair<bool,double> (CElasticInteraction::* CheckedScalarFieldFunction)() const;
00057   typedef Vec3 (CElasticInteraction::* VectorFieldFunction)() const;
00058 
00059   static ScalarFieldFunction getScalarFieldFunction(const string&);
00060   static CheckedScalarFieldFunction getCheckedScalarFieldFunction(const string&);
00061   static VectorFieldFunction getVectorFieldFunction(const string&);
00062 
00063 private:
00064   double m_k; 
00065   Vec3   m_force; 
00066   Vec3   m_cpos;
00067   bool   m_scaling; 
00068 
00069 public:
00070   typedef CElasticIGP ParameterType;
00071 
00072   CElasticInteraction(CParticle*,CParticle*,const CElasticIGP&);
00073   virtual ~CElasticInteraction(){};
00074 
00075   virtual Vec3 getPos() const {return m_cpos;};
00076   double getPotentialEnergy() const;
00077 
00078   virtual void calcForces();
00079   Vec3 getForce() const;
00080   friend ostream& operator<<(ostream&,const CElasticInteraction&);
00081   
00082   // save/load of restart parameters
00083   virtual void saveRestartData(std::ostream &oStream);
00084   virtual void loadRestartData(std::istream &iStream);
00085 };
00086 #endif //__ELASTICINTERACTION_H