ESyS-Particle  4.0.1
BodyForceGroup.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 
00014 #ifndef ESYS_LSMBODYFORCEGROUP_H
00015 #define ESYS_LSMBODYFORCEGROUP_H
00016 
00017 #include "Model/InteractionGroup.h"
00018 #include "Foundation/vec3.h"
00019 
00020 template <class TmplParticle> class ParallelParticleArray;
00021 
00022 namespace esys
00023 {
00024   namespace lsm
00025   {
00026     class BodyForceIGP : public AIGParam
00027     {
00028     public:
00029 
00030       BodyForceIGP();
00031 
00032       BodyForceIGP(const std::string &name, const Vec3 &acceleration);
00033 
00034       virtual ~BodyForceIGP();
00035 
00036       const Vec3 &getAcceleration() const;
00037 
00038       const std::string &getName() const;
00039 
00040       void packInto(CVarMPIBuffer *pBuffer) const;
00041 
00042       static BodyForceIGP extract(CVarMPIBuffer *pBuffer);
00043       
00044       virtual std::string getTypeString() const {return "BodyForce";}
00045 
00046     private:
00047       Vec3 m_acceleration;
00048     };
00049 
00050     class GravityIGP : public BodyForceIGP
00051     {
00052     public:
00053 
00054       GravityIGP() : BodyForceIGP()
00055       {
00056       }
00057 
00058       GravityIGP(const std::string &name, const Vec3 &acceleration) : BodyForceIGP(name, acceleration)
00059       {
00060       }
00061 
00062       virtual std::string getTypeString() const {return "Gravity";}
00063 
00064     private:
00065     };
00066 
00071     template <class TmplParticle>
00072     class BodyForceGroup : public AInteractionGroup<TmplParticle>
00073     {
00074     public:
00075       typedef ParallelParticleArray<TmplParticle> ParticleArray;
00076       typedef typename ParticleArray::ParticleListIterator ParticleIterator;
00077 
00078       BodyForceGroup(const BodyForceIGP &prms, ParticleArray &particleArray);
00079 
00080       ~BodyForceGroup();
00081 
00089       Vec3 getForce(double mass) const;
00090 
00097       void applyForce(TmplParticle &particle) const;
00098 
00099       virtual void Update(ParallelParticleArray<TmplParticle> *particleArray);
00100 
00104       virtual void setTimeStepSize(double dt)
00105       {
00106       }
00107       
00108       virtual void calcForces();
00109 
00110     private:
00111       Vec3          m_acceleration;
00112       ParticleArray *m_pParticleArray;
00113     };
00114   };
00115 };
00116 
00117 #include "Model/BodyForceGroup.hpp"
00118 
00119 #endif