ESyS-Particle  4.0.1
Mesh2D.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 __MESH2D_H
00014 #define __MESH2D_H
00015 
00016 // -- Project includes --
00017 #include "Geometry/Edge2D.h"
00018 #include "Geometry/Corner2D.h"
00019 #include "Model/MeshData2D.h"
00020 #include "Foundation/vec3.h"
00021 
00022 // -- STL includes --
00023 #include <vector>
00024 #include <map>
00025 #include <string>
00026 
00027 using std::vector;
00028 using std::multimap;
00029 using std::map;
00030 using std::string;
00031 
00032 // -- IO includes ---
00033 #include <iostream>
00034 
00035 using std::ostream;
00036 
00037 //--- TML includes ---
00038 #include "tml/comm/comm.h"
00039 
00046 class Mesh2D
00047 {
00048  private:
00049   vector<Edge2D> m_edges;
00050   vector<Corner2D> m_corners;
00051   map<int,int> m_corner_by_id;
00052   multimap<int,Edge2D*> m_edge_by_node_id;
00053   map<int,int> m_edge_index_by_id;
00054 
00055  public:
00056   // types 
00057   typedef vector<Edge2D>::iterator edge_iterator;
00058   typedef vector<Corner2D>::iterator corner_iterator;
00059 
00060   // functions
00061   Mesh2D();
00062   virtual ~Mesh2D(){};
00063   void LoadMesh(const vector<MeshNodeData2D>&,const vector<MeshEdgeData2D>&);
00064   void moveNode(int,const Vec3&);
00065   void translateBy(const Vec3 &translation);
00066 
00067   edge_iterator edges_begin(){return m_edges.begin();};
00068   edge_iterator edges_end(){return m_edges.end();};
00069   corner_iterator corners_begin(){return m_corners.begin();};
00070   corner_iterator corners_end(){return m_corners.end();};
00071   Edge2D* getEdgeById(int);
00072   Corner2D* getCornerById(int);
00073 
00074   void zeroForces();
00075   virtual void writeCheckPoint(ostream&,const string&) const;
00076   virtual void loadCheckPoint(istream&);
00077   
00078   // edge data access functions
00079   template <typename P> void forAllEdgesGet(P&,typename P::value_type (Edge2D::*rdf)() const);
00080   template <typename P> vector<pair<int,P> > forAllEdgesGetIndexed(P (Edge2D::*rdf)() const);
00081 };
00082 
00083 #include "Mesh2D.hpp"
00084 
00085 #endif // __MESH2D_H