ESyS-Particle  4.0.1
HertzianElasticInteraction.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 __HERTZIANELASTICINTERACTION_H
00014 #define __HERTZIANELASTICINTERACTION_H
00015 
00016 #include "Model/IGParam.h"
00017 #include "Model/Interaction.h"
00018 #include "Model/Particle.h"
00019 
00020 
00024 class CHertzianElasticIGP : public AIGParam
00025 {
00026 public:
00027   double m_E;
00028   double m_nu; // poisson ratio
00029 
00030   CHertzianElasticIGP();
00031   CHertzianElasticIGP(const std::string&,double,double);
00032   
00033   virtual std::string getTypeString() const {return "HertzianElastic";}
00034 };
00035 
00043 class CHertzianElasticInteraction : public APairInteraction
00044 {
00045 public:
00046 
00047   typedef double (CHertzianElasticInteraction::* ScalarFieldFunction)() const;
00048   typedef Vec3 (CHertzianElasticInteraction::* VectorFieldFunction)() const;
00049   typedef pair<bool,double> (CHertzianElasticInteraction::* CheckedScalarFieldFunction)() const;
00050 
00051   static ScalarFieldFunction getScalarFieldFunction(const string&);
00052   static VectorFieldFunction getVectorFieldFunction(const string&);
00053   static CheckedScalarFieldFunction getCheckedScalarFieldFunction(const string&);
00054 
00055 private:
00056   double m_E;
00057   double m_nu; 
00058   Vec3   m_force; // caching force for E_pot
00059   double m_dn; // caching displacement for E_pot
00060   Vec3   m_cpos; // center position
00061 
00062 public:
00063   typedef CHertzianElasticIGP ParameterType;
00064 
00065   CHertzianElasticInteraction(CParticle*,CParticle*,const CHertzianElasticIGP&);
00066   virtual ~CHertzianElasticInteraction(){};
00067 
00068   virtual Vec3 getPos() const {return m_cpos;};
00069   double getPotentialEnergy() const;
00070 
00071   virtual void calcForces();
00072   Vec3 getForce() const;
00073 };
00074 #endif //__HERTZIANELASTICINTERACTION_H