~esys-p-dev/esys-particle/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/////////////////////////////////////////////////////////////
//                                                         //
// Copyright (c) 2003-2017 by The University of Queensland //
// Centre for Geoscience Computing                         //
// http://earth.uq.edu.au/centre-geoscience-computing      //
//                                                         //
// Primary Business: Brisbane, Queensland, Australia       //
// Licensed under the Open Software License version 3.0    //
// http://www.apache.org/licenses/LICENSE-2.0              //
//                                                         //
/////////////////////////////////////////////////////////////

#ifndef __TRIMESH_H
#define __TRIMESH_H

//--- TML includes ---
#include "tml/comm/comm.h"

// -- Project includes --
#include "Geometry/Triangle.h"
#include "Geometry/Edge.h"
#include "Geometry/Corner.h"
#include "Model/MeshData.h"
#include "Foundation/vec3.h"

// -- STL includes --
#include <vector>
#include <map>
#include <string>

using std::vector;
using std::multimap;
using std::map;
using std::string;

// -- IO includes ---
#include <iostream>

using std::ostream;


/*!
  \class TriMesh
  \brief class for a triangle mesh

  \author Steffen Abe
  $Revision$
  $Date$
*/
class TriMesh
{
 private:
  vector<Triangle> m_triangles;
  vector<Edge> m_edges;
  vector<Corner> m_corners;
  multimap<int,Triangle*> m_triangle_by_node_id;
  multimap<int,Edge*> m_edge_by_node_id;
  map<int,int> m_corner_by_id;
  
  map<int,int> m_tri_index_by_id;

 public:
  // types 
  typedef vector<Triangle>::iterator triangle_iterator;
  typedef vector<Edge>::iterator edge_iterator;
  typedef vector<Corner>::iterator corner_iterator;
 
  // functions
  TriMesh();

  virtual ~TriMesh()
  {
  }
  
  void LoadMesh(const vector<MeshNodeData>&,const vector<MeshTriData>&);
  void moveNode(int,const Vec3&);
  void translateBy(const Vec3 &translation);
  void rotateBy(const Vec3&,const Vec3 &axis, double angle);
  triangle_iterator triangles_begin(){return m_triangles.begin();};
  triangle_iterator triangles_end(){return m_triangles.end();};
  edge_iterator edges_begin(){return m_edges.begin();};
  edge_iterator edges_end(){return m_edges.end();};
  corner_iterator corners_begin(){return m_corners.begin();};
  corner_iterator corners_end(){return m_corners.end();};
  Triangle* getTriangleById(int);
  bool hasMovedBy(double);
  void resetCurrentDisplacement();

  void zeroForces();
  virtual void writeCheckPoint(ostream&,const string&) const;
  virtual void loadCheckPoint(istream&);

  // triangle data access functions
  template <typename P> void forAllTrianglesGet(P&,typename P::value_type (Triangle::*rdf)() const);
  template <typename P> vector<pair<int,P> > forAllTrianglesGetIndexed(P (Triangle::*rdf)() const);
};

#include "TriMesh.hpp"

#endif // __TRIMESH_H