DOLFIN
DOLFIN C++ interface
Mesh.h
1 // Copyright (C) 2006-2016 Anders Logg
2 //
3 // This file is part of DOLFIN.
4 //
5 // DOLFIN is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU Lesser General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // DOLFIN is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public License
16 // along with DOLFIN. If not, see <http://www.gnu.org/licenses/>.
17 //
18 // Modified by Johan Hoffman 2007
19 // Modified by Magnus Vikstrøm 2007
20 // Modified by Garth N. Wells 2007-2015
21 // Modified by Niclas Jansson 2008
22 // Modified by Kristoffer Selim 2008
23 // Modified by Andre Massing 2009-2010
24 // Modified by Marie E. Rognes 2012
25 // Modified by Mikael Mortensen 2012
26 // Modified by Jan Blechta 2013
27 
28 #ifndef __MESH_H
29 #define __MESH_H
30 
31 #include <memory>
32 #include <string>
33 #include <utility>
34 
35 #include <dolfin/common/Hierarchical.h>
36 #include <dolfin/common/MPI.h>
37 #include <dolfin/common/Variable.h>
38 #include "MeshData.h"
39 #include "MeshDomains.h"
40 #include "MeshGeometry.h"
41 #include "MeshConnectivity.h"
42 #include "MeshTopology.h"
43 
44 namespace dolfin
45 {
46  class BoundaryMesh;
47  class CellType;
48  class Expression;
49  class GenericFunction;
50  class LocalMeshData;
51  class MeshEntity;
52  class Point;
53  class SubDomain;
54  class BoundingBoxTree;
55 
81 
82  class Mesh : public Variable, public Hierarchical<Mesh>
83  {
84  public:
85 
87  Mesh();
88 
90  Mesh(MPI_Comm comm);
91 
96  Mesh(const Mesh& mesh);
97 
102  explicit Mesh(std::string filename);
103 
110  Mesh(MPI_Comm comm, std::string filename);
111 
118  Mesh(MPI_Comm comm, LocalMeshData& local_mesh_data);
119 
121  ~Mesh();
122 
127  const Mesh& operator=(const Mesh& mesh);
128 
134  std::size_t num_vertices() const
135  { return _topology.size(0); }
136 
142  std::size_t num_edges() const
143  { return _topology.size(1); }
144 
150  std::size_t num_faces() const
151  { return _topology.size(2); }
152 
158  std::size_t num_facets() const
159  { return _topology.size(_topology.dim() - 1); }
160 
166  std::size_t num_cells() const
167  { return _topology.size(_topology.dim()); }
168 
177  std::size_t num_entities(std::size_t d) const
178  { return _topology.size(d); }
179 
185  std::vector<double>& coordinates()
186  { return _geometry.x(); }
187 
193  const std::vector<double>& coordinates() const
194  { return _geometry.x(); }
195 
201  const std::vector<unsigned int>& cells() const
202  { return _topology(_topology.dim(), 0)(); }
203 
212  std::size_t num_entities_global(std::size_t dim) const
213  { return _topology.size_global(dim); }
214 
220  { return _topology; }
221 
226  const MeshTopology& topology() const
227  { return _topology; }
228 
234  { return _geometry; }
235 
240  const MeshGeometry& geometry() const
241  { return _geometry; }
242 
248  { return _domains; }
249 
254  const MeshDomains& domains() const
255  { return _domains; }
256 
266  std::shared_ptr<BoundingBoxTree> bounding_box_tree() const;
267 
272  MeshData& data();
273 
277  const MeshData& data() const;
278 
284  { dolfin_assert(_cell_type); return *_cell_type; }
285 
287  const CellType& type() const
288  { dolfin_assert(_cell_type); return *_cell_type; }
289 
297  std::size_t init(std::size_t dim) const;
298 
306  void init(std::size_t d0, std::size_t d1) const;
307 
309  void init() const;
310 
312  void init_global(std::size_t dim) const;
313 
317  void clean();
318 
322  void order();
323 
328  bool ordered() const;
329 
337  Mesh renumber_by_color() const;
338 
344  void scale(double factor);
345 
350  void translate(const Point& point);
351 
359  void rotate(double angle, std::size_t axis=2);
360 
369  void rotate(double angle, std::size_t axis, const Point& point);
370 
376  void smooth(std::size_t num_iterations=1);
377 
387  void smooth_boundary(std::size_t num_iterations=1,
388  bool harmonic_smoothing=true);
389 
398  void snap_boundary(const SubDomain& sub_domain,
399  bool harmonic_smoothing=true);
400 
413  const std::vector<std::size_t>& color(std::string coloring_type) const;
414 
426  const std::vector<std::size_t>&
427  color(std::vector<std::size_t> coloring_type) const;
428 
436  double hmin() const;
437 
445  double hmax() const;
446 
452  double rmin() const;
453 
459  double rmax() const;
460 
467  std::size_t hash() const;
468 
477  std::string str(bool verbose) const;
478 
485  const std::vector<int>& cell_orientations() const;
486 
493  void init_cell_orientations(const Expression& global_normal);
494 
497  MPI_Comm mpi_comm() const
498  { return _mpi_comm.comm(); }
499 
505  std::string ghost_mode() const;
506 
507  // Friend in fem_utils.h
509 
510  private:
511 
512  // Friends
513  friend class MeshEditor;
514  friend class TopologyComputation;
515  friend class MeshPartitioning;
516 
517  // Mesh topology
518  MeshTopology _topology;
519 
520  // Mesh geometry
521  MeshGeometry _geometry;
522 
523  // Mesh domains
524  MeshDomains _domains;
525 
526  // Auxiliary mesh data
527  MeshData _data;
528 
529  // Bounding box tree used to compute collisions between the mesh
530  // and other objects. The tree is initialized to a zero pointer
531  // and is allocated and built when bounding_box_tree() is called.
532  mutable std::shared_ptr<BoundingBoxTree> _tree;
533 
534  // Cell type
535  std::unique_ptr<CellType> _cell_type;
536 
537  // True if mesh has been ordered
538  mutable bool _ordered;
539 
540  // Orientation of cells relative to a global direction
541  std::vector<int> _cell_orientations;
542 
543  // MPI communicator
544  dolfin::MPI::Comm _mpi_comm;
545 
546  // Ghost mode used for partitioning
547  std::string _ghost_mode;
548 
549  };
550 }
551 
552 #endif
MeshGeometry stores the geometry imposed on a mesh.
Definition: MeshGeometry.h:39
Definition: MeshTopology.h:46
const std::vector< int > & cell_orientations() const
Definition: Mesh.cpp:432
const CellType & type() const
Get mesh cell type (const version).
Definition: Mesh.h:287
Common base class for DOLFIN variables.
Definition: Variable.h:35
std::size_t num_cells() const
Definition: Mesh.h:166
Definition: SubDomain.h:42
MeshDomains & domains()
Definition: Mesh.h:247
void scale(double factor)
Definition: Mesh.cpp:276
double rmin() const
Definition: Mesh.cpp:372
Definition: Hierarchical.h:43
std::size_t size(std::size_t dim) const
Return number of entities for given dimension.
Definition: MeshTopology.cpp:75
void init() const
Compute all entities and connectivity.
Definition: Mesh.cpp:216
std::shared_ptr< BoundingBoxTree > bounding_box_tree() const
Definition: Mesh.cpp:342
const Mesh & operator=(const Mesh &mesh)
Definition: Mesh.cpp:104
void smooth(std::size_t num_iterations=1)
Definition: Mesh.cpp:296
Definition: adapt.h:29
const MeshTopology & topology() const
Definition: Mesh.h:226
This class stores mesh data on a local processor corresponding to a portion of a (larger) global mesh...
Definition: LocalMeshData.h:58
std::size_t hash() const
Definition: Mesh.cpp:390
Definition: Point.h:40
~Mesh()
Destructor.
Definition: Mesh.cpp:99
std::size_t num_entities(std::size_t d) const
Definition: Mesh.h:177
MeshGeometry & geometry()
Definition: Mesh.h:233
Definition: MeshEditor.h:36
Definition: MeshPartitioning.h:62
Definition: MeshDomains.h:41
Definition: Expression.h:49
double rmax() const
Definition: Mesh.cpp:381
std::size_t num_edges() const
Definition: Mesh.h:142
Mesh()
Create empty mesh.
Definition: Mesh.cpp:58
MPI_Comm comm() const
Return the underlying MPI_Comm object.
Definition: MPI.cpp:117
const MeshDomains & domains() const
Definition: Mesh.h:254
double hmin() const
Definition: Mesh.cpp:354
CellType & type()
Definition: Mesh.h:283
Definition: MeshData.h:58
Definition: CellType.h:46
MeshTopology & topology()
Definition: Mesh.h:219
Definition: TopologyComputation.h:36
void snap_boundary(const SubDomain &sub_domain, bool harmonic_smoothing=true)
Definition: Mesh.cpp:306
bool ordered() const
Definition: Mesh.cpp:259
std::size_t num_vertices() const
Definition: Mesh.h:134
void smooth_boundary(std::size_t num_iterations=1, bool harmonic_smoothing=true)
Definition: Mesh.cpp:301
void order()
Definition: Mesh.cpp:247
std::size_t num_entities_global(std::size_t dim) const
Definition: Mesh.h:212
Definition: Function.h:65
std::size_t dim() const
Return topological dimension.
Definition: MeshTopology.cpp:70
const MeshGeometry & geometry() const
Definition: Mesh.h:240
void rotate(double angle, std::size_t axis=2)
Definition: Mesh.cpp:286
double hmax() const
Definition: Mesh.cpp:363
MPI_Comm mpi_comm() const
Definition: Mesh.h:497
const std::vector< double > & coordinates() const
Definition: Mesh.h:193
std::string ghost_mode() const
Definition: Mesh.cpp:478
friend Mesh create_mesh(Function &coordinates)
void init_global(std::size_t dim) const
Compute global indices for entity dimension dim.
Definition: Mesh.cpp:228
const std::vector< unsigned int > & cells() const
Definition: Mesh.h:201
std::size_t num_facets() const
Definition: Mesh.h:158
Mesh renumber_by_color() const
Definition: Mesh.cpp:269
MeshData & data()
Definition: Mesh.cpp:128
std::string str(bool verbose) const
Definition: Mesh.cpp:404
std::size_t size_global(std::size_t dim) const
Return global number of entities for given dimension.
Definition: MeshTopology.cpp:84
void init_cell_orientations(const Expression &global_normal)
Definition: Mesh.cpp:437
const std::vector< std::size_t > & color(std::string coloring_type) const
Definition: Mesh.cpp:311
double x(std::size_t n, std::size_t i) const
Return value of coordinate with local index n in direction i.
Definition: MeshGeometry.h:99
Definition: Mesh.h:82
void translate(const Point &point)
Definition: Mesh.cpp:281
Definition: MPI.h:76
std::size_t num_faces() const
Definition: Mesh.h:150
std::vector< double > & coordinates()
Definition: Mesh.h:185
void clean()
Definition: Mesh.cpp:234