ESyS-Particle  4.0.1
SimpleNTable3D.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 __SIMPLENTABLE3D_H
00014 #define __SIMPLENTABLE3D_H
00015 
00016 //-- project includes --
00017 #include "Geometry/SimpleParticle.h"
00018 #include "Geometry/BasicInteraction.h"
00019 #include "Geometry/SimpleNTable.h"
00020 
00021 typedef std::set<BasicInteraction,BILess> InteractionSet;
00022 typedef std::vector<SimpleParticle>       ParticleVector;
00023 
00032 class CSimple3DNTable : public ASimpleNTable
00033 {
00034 private:
00035   Vec3 m_xshift,m_yshift,m_zshift;
00036   int m_xsize,m_ysize,m_zsize;
00037   bool m_xcirc,m_ycirc,m_zcirc;
00038 
00039 protected:
00040   virtual int index(const Vec3&) const;
00041   virtual vector<int> allidx(const Vec3&) const;
00042   virtual void insertParticleCircular(SimpleParticle);
00043 
00044 public:
00045   CSimple3DNTable(const Vec3&,const Vec3&,double,bool xcirc=false,bool ycirc=false,bool zcirc=false);
00046   virtual void getInteractions(set<BasicInteraction,BILess>&,double);
00047   void print();
00048   
00049   template <class TmplInteractionValidator>
00050   InteractionSet getInteractions(const TmplInteractionValidator &validator) const
00051   {
00052     InteractionSet iset;
00053     for(int i=0;i<m_xsize;i++){
00054       for(int j=0;j<m_ysize;j++){
00055         for(int k=0;k<m_zsize;k++){
00056           int idx=i+m_xsize*j+k*m_xsize*m_zsize;
00057           if(m_data[idx].size() >= 2){
00058             for(ParticleVector::const_iterator iter = m_data[idx].begin();
00059                 iter != m_data[idx].end()-1;
00060                 iter++)
00061             {
00062               for (
00063                 ParticleVector::const_iterator iter2 = iter+1;
00064                 iter2 != m_data[idx].end();
00065                 iter2++)
00066               {
00067                 if (validator.isValid(*iter, *iter2))
00068                 {
00069                   iset.insert(BasicInteraction(iter->getID(),iter2->getID()));
00070                 }
00071               }
00072             }
00073           }
00074         }
00075       }
00076     }
00077     return iset;
00078   }
00079 };
00080 
00081 #endif //__SIMPLENTABLE3D_H