Rocstar  1.0
Rocstar multiphysics simulation application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
includeLinks/MeshImplData.hpp
Go to the documentation of this file.
1 /* *****************************************************************
2  MESQUITE -- The Mesh Quality Improvement Toolkit
3 
4  Copyright 2004 Lawrence Livermore National Laboratory. Under
5  the terms of Contract B545069 with the University of Wisconsin --
6  Madison, Lawrence Livermore National Laboratory retains certain
7  rights in this software.
8 
9  This library is free software; you can redistribute it and/or
10  modify it under the terms of the GNU Lesser General Public
11  License as published by the Free Software Foundation; either
12  version 2.1 of the License, or (at your option) any later version.
13 
14  This library is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  Lesser General Public License for more details.
18 
19  You should have received a copy of the GNU Lesser General Public License
20  (lgpl.txt) along with this library; if not, write to the Free Software
21  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 
23  kraftche@cae.wisc.edu
24 
25  ***************************************************************** */
26 
27 #ifndef MESQUITE_MESH_IMPL_DATA_HPP
28 #define MESQUITE_MESH_IMPL_DATA_HPP
29 
30 #include "Mesquite.hpp"
31 #include "Vector3D.hpp"
32 #include "MeshInterface.hpp"
33 
34 #ifdef MSQ_USE_OLD_STD_HEADERS
35 # include <vector.h>
36 #else
37 # include <vector>
38 #endif
39 
40 #include <sys/types.h>
41 
42 namespace Mesquite {
43 
44 class MsqError;
45 
47 class MeshImplData {
48 
49  public:
50 
52  void clear();
53 
55  size_t num_vertices() const;
57  size_t num_elements() const;
60  size_t num_vertex_uses() const;
61 
62  size_t max_vertex_index() const { return vertexList.size(); }
63  size_t max_element_index() const { return elementList.size(); }
64 
67  void copy_mesh( size_t* vertex_handle_array,
68  size_t* element_hanlde_array,
69  size_t* element_conn_offsets,
70  size_t* element_conn_indices );
71 
73  void all_vertices( msq_std::vector<size_t>& list, MsqError& err ) const;
74 
76  void all_elements( msq_std::vector<size_t>& list, MsqError& err ) const;
77 
79  inline bool is_vertex_valid( size_t index ) const
80  {return index < vertexList.size() && vertexList[index].valid; }
81 
83  inline bool is_element_valid( size_t index ) const
84  { return index < elementList.size() &&
85  !elementList[index].connectivity.empty(); }
86 
88  bool is_mid_node( size_t index ) const;
90  bool is_corner_node( size_t index ) const;
91 
93  const Vector3D& get_vertex_coords( size_t index, MsqError& err ) const;
94 
96  void set_vertex_coords( size_t index,
97  const Vector3D& coords,
98  MsqError& err );
99 
101  bool vertex_is_fixed( size_t index, MsqError& err ) const;
102 
104  void fix_vertex( size_t index, bool flag, MsqError& err );
105 
107  unsigned char get_vertex_byte( size_t index, MsqError& err ) const;
108 
110  void set_vertex_byte( size_t index, unsigned char value, MsqError& err );
111 
113  EntityTopology element_topology( size_t index, MsqError& err ) const;
114 
116  void element_topology( size_t index, EntityTopology type, MsqError& err );
117 
119  const msq_std::vector<size_t>& element_connectivity( size_t index, MsqError& err ) const;
120 
122  const msq_std::vector<size_t>& vertex_adjacencies( size_t index, MsqError& err ) const;
123 
125  void allocate_vertices( size_t count, MsqError& err );
126 
128  void allocate_elements( size_t count, MsqError& err );
129 
131  void reset_vertex( size_t index,
132  const Vector3D& coords,
133  bool fixed,
134  MsqError& err );
135 
141  void reset_element( size_t index,
142  const msq_std::vector<size_t>& vertices,
143  EntityTopology topology,
144  MsqError& err );
145 
147  size_t add_vertex( const Vector3D& coords, bool fixed, MsqError& err );
149  size_t add_element( const msq_std::vector<size_t>& vertices,
150  EntityTopology topology,
151  MsqError& err );
152 
154  void delete_vertex( size_t index, MsqError& err );
156  void delete_element( size_t index, MsqError& err );
157 
159  void copy_higher_order( msq_std::vector<size_t>& mid_nodes,
160  msq_std::vector<size_t>& vertices,
161  msq_std::vector<size_t>& vertex_indices,
162  msq_std::vector<size_t>& index_offsets,
163  MsqError& err );
164 
170  void get_adjacent_elements( msq_std::vector<size_t>::const_iterator nodes,
171  msq_std::vector<size_t>::const_iterator nodes_end,
172  msq_std::vector<size_t>& elems_out,
173  MsqError& err );
174 
181  void skin( msq_std::vector<size_t>& sides, MsqError& err );
182 
183 
184  private:
185 
193  bool has_adjacent_elements( size_t elem,
194  const msq_std::vector<size_t>& nodes,
195  MsqError& err );
196 
197 
199  void clear_element( size_t index, MsqError& err );
200 
202  void set_element( size_t index,
203  const msq_std::vector<size_t>& vertices,
204  EntityTopology topology,
205  MsqError& err );
206 
208  struct Vertex {
209  Vertex( const Vector3D& pos, bool is_fixed )
210  : coords(pos), midcount(0), fixed(is_fixed), valid(true), byte('\0') {}
211 
212  Vertex() : midcount(0), valid(false), byte('\0') {}
213 
215  msq_std::vector<size_t> adjacencies;
216  unsigned midcount;
217  bool fixed;
218  bool valid;
219  unsigned char byte;
220  };
221 
223  struct Element {
224  msq_std::vector<size_t> connectivity;
227  : topology(MIXED)
228  {}
229 
230  };
231 
232  msq_std::vector<Vertex> vertexList;
233  msq_std::vector<Element> elementList;
236  msq_std::vector<size_t> deletedVertexList;
238  msq_std::vector<size_t> deletedElementList;
239 };
240 
246 {
247  private:
249  size_t index;
250 
251  public:
252 
254  : mesh(data) { restart(); }
255 
256  virtual ~MeshImplVertIter();
257 
258  virtual void restart();
259 
260  virtual void operator++();
261 
262  virtual Mesh::VertexHandle operator*() const;
263 
264  virtual bool is_at_end() const;
265 
266 };
267 
268 
274 {
275  private:
277  size_t index;
278 
279  public:
280 
282  : mesh(data) { restart(); }
283 
284  virtual ~MeshImplElemIter();
285 
286  virtual void restart();
287 
288  virtual void operator++();
289 
290  virtual Mesh::ElementHandle operator*() const;
291 
292  virtual bool is_at_end() const;
293 
294 };
295 
296 
297 
298 } // namespace Mesquite
299 
300 #endif
Iterates through a set of entities. An EntityIterator is typically obtained via Mesh::vertex_iterator...
unsigned char get_vertex_byte(size_t index, MsqError &err) const
Get vertex byte.
void all_elements(msq_std::vector< size_t > &list, MsqError &err) const
Get all elements.
Vertex(const Vector3D &pos, bool is_fixed)
void fix_vertex(size_t index, bool flag, MsqError &err)
Set vertex fixed flag.
Used to hold the error state and return it to the application.
virtual bool is_at_end() const
Returns false until the iterator has been advanced PAST the last entity.
EntityTopology
Definition: Mesquite.hpp:92
virtual void operator++()
++iterator
void copy_higher_order(msq_std::vector< size_t > &mid_nodes, msq_std::vector< size_t > &vertices, msq_std::vector< size_t > &vertex_indices, msq_std::vector< size_t > &index_offsets, MsqError &err)
Get all mid-nodes and their adjacent corner vertices.
virtual Mesh::VertexHandle operator*() const
*iterator.
Class to store mesh representation for MeshImpl.
const msq_std::vector< size_t > & element_connectivity(size_t index, MsqError &err) const
Get element connectivity list, including mid-nodes.
msq_std::vector< Element > elementList
Array of elements.
EntityHandle VertexHandle
size_t num_vertices() const
Get number of vertices, does not include mid-nodes.
EntityHandle ElementHandle
This file contains the Mesquite mesh interface. Many users will want to implement a concrete class de...
Vector3D is the object that effeciently stores information about about three-deminsional vectors...
unsigned midcount
num elements referencing this as a mid-node
void get_adjacent_elements(msq_std::vector< size_t >::const_iterator nodes, msq_std::vector< size_t >::const_iterator nodes_end, msq_std::vector< size_t > &elems_out, MsqError &err)
Get elements adjacent to ALL of the passed nodes.
void reset_element(size_t index, const msq_std::vector< size_t > &vertices, EntityTopology topology, MsqError &err)
Clear element at specified index (if any) including connectivity and adjacency data, and re-initialize with passed data.
msq_std::vector< size_t > deletedElementList
List of unused indices in element list.
virtual void operator++()
++iterator
void allocate_vertices(size_t count, MsqError &err)
Allocate space for specified number of vertices.
size_t add_vertex(const Vector3D &coords, bool fixed, MsqError &err)
Add a new vertex.
void clear()
Clear all data.
virtual void restart()
Moves the iterator back to the first entity in the list.
bool has_adjacent_elements(size_t elem, const msq_std::vector< size_t > &nodes, MsqError &err)
helper function for skinning
EntityTopology element_topology(size_t index, MsqError &err) const
Get element type.
const msq_std::vector< size_t > & vertex_adjacencies(size_t index, MsqError &err) const
Get vertex adjacency list.
void skin(msq_std::vector< size_t > &sides, MsqError &err)
Skin mesh.
virtual Mesh::ElementHandle operator*() const
*iterator.
VertexIterator for MeshImpl.
virtual bool is_at_end() const
Returns false until the iterator has been advanced PAST the last entity.
void set_vertex_coords(size_t index, const Vector3D &coords, MsqError &err)
Set vertex coordinates.
msq_std::vector< size_t > deletedVertexList
List of unused indices in vertex list.
bool is_vertex_valid(size_t index) const
Check if passed vertex index is valid.
bool valid
is a valid (initialized) array entry
size_t add_element(const msq_std::vector< size_t > &vertices, EntityTopology topology, MsqError &err)
Add a new element.
const Vector3D & get_vertex_coords(size_t index, MsqError &err) const
Get vertex coordinates.
msq_std::vector< size_t > adjacencies
indices of adjacent elements
void set_vertex_byte(size_t index, unsigned char value, MsqError &err)
Set vertex byte.
bool vertex_is_fixed(size_t index, MsqError &err) const
Get vertex fixed flag.
msq_std::vector< size_t > connectivity
list of vertex indices
virtual void restart()
Moves the iterator back to the first entity in the list.
void delete_vertex(size_t index, MsqError &err)
Delete a vertex - may not be referenced by any element.
bool is_mid_node(size_t index) const
Check if the specified node is used as a mid-node on any element.
void allocate_elements(size_t count, MsqError &err)
Allocate space for specified number of elements.
ElementIterator for MeshImpl.
void reset_vertex(size_t index, const Vector3D &coords, bool fixed, MsqError &err)
Set allocated but unset veretx to specified values.
void copy_mesh(size_t *vertex_handle_array, size_t *element_hanlde_array, size_t *element_conn_offsets, size_t *element_conn_indices)
Copy internal representation into CSR rep Does not include mid-nodes.
void all_vertices(msq_std::vector< size_t > &list, MsqError &err) const
Get all vertices, including mid-nodes.
msq_std::vector< Vertex > vertexList
Array of vertices.
void clear_element(size_t index, MsqError &err)
Clear existing element data.
size_t num_vertex_uses() const
Get number of vertex uses (sum of connectivity length for all elements) Does not count mid-nodes...
void set_element(size_t index, const msq_std::vector< size_t > &vertices, EntityTopology topology, MsqError &err)
Set cleared element.
void delete_element(size_t index, MsqError &err)
Delete an element.
bool is_corner_node(size_t index) const
Check if the specified node is used as a corner vertex on any element.
bool is_element_valid(size_t index) const
Check if passed element index is valid.
size_t num_elements() const
Get number of elements.