ESyS-Particle  4.0.1
RotElasticInteraction.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 __ROTELASTICINTERACTION_H
00014 #define __ROTELASTICINTERACTION_H
00015 
00016 #include "Model/RotPairInteraction.h"
00017 #include "Model/RotParticle.h"
00018 #include "Model/IGParam.h"
00019 
00020 
00024 class CRotElasticIGP : public AIGParam
00025 {
00026  protected:
00027  public:
00028   CRotElasticIGP();
00029   CRotElasticIGP(const std::string &name, double kr, bool scaling);
00030   
00031   double m_kr;
00032   bool   m_scaling;
00033 
00034   virtual void packInto(CVarMPIBuffer*) const;
00035   void setNormalSpringConst(double k){m_kr=k;};
00036   double getNormalSpringConst() const{return m_kr;};
00037   
00038   virtual std::string getTypeString() const {return "RotElastic";}
00039 
00040   friend ostream& operator<<(ostream&,const CRotElasticIGP&);
00041 };
00042 
00043 CRotElasticIGP* extractRotElasticIGP(AMPIBuffer*);
00044 CRotElasticIGP* extractRotElasticIGP_p(AMPIBuffer*);
00045 
00050 class CRotElasticInteraction : public ARotPairInteraction
00051 {
00052 public:
00053   typedef double (CRotElasticInteraction::* ScalarFieldFunction)() const;
00054   typedef pair<bool,double> (CRotElasticInteraction::* CheckedScalarFieldFunction)() const;
00055   typedef Vec3 (CRotElasticInteraction::* VectorFieldFunction)() const;
00056 
00057   static ScalarFieldFunction getScalarFieldFunction(const string&);
00058   static CheckedScalarFieldFunction getCheckedScalarFieldFunction(const string&);
00059   static VectorFieldFunction getVectorFieldFunction(const string&);
00060 
00061 private:
00062   double m_kr; 
00063   Vec3   m_force; 
00064   double m_nForce; 
00065   Vec3   m_cpos; 
00066   Vec3   m_D; 
00067   bool   m_scaling; 
00068 
00069 public:
00070   typedef CRotElasticIGP ParameterType;
00071 
00072   CRotElasticInteraction();
00073   CRotElasticInteraction(CRotParticle*,CRotParticle*,const CRotElasticIGP&);
00074   virtual ~CRotElasticInteraction(){};
00075 
00076   virtual Vec3 getPos() const {return m_cpos;}
00077 
00078   static string getType(){return "RotElastic";}
00079 
00080   virtual void calcForces();
00081 
00082   Vec3   getForce() const;
00083   double getPotentialEnergy() const;
00084 
00085   friend ostream& operator<<(ostream&,const CRotElasticInteraction&);
00086   
00087   // save/load of restart parameters
00088   virtual void saveRestartData(std::ostream &oStream);
00089   virtual void loadRestartData(std::istream &iStream);
00090 };
00091 #endif //__ELASTICINTERACTION_H