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 // Modified by Cecile Daversin-Catty 2018
28 
29 #ifndef __MESH_H
30 #define __MESH_H
31 
32 #include <memory>
33 #include <string>
34 #include <utility>
35 
36 #include <dolfin/common/Hierarchical.h>
37 #include <dolfin/common/MPI.h>
38 #include <dolfin/common/Variable.h>
39 #include "MeshData.h"
40 #include "MeshDomains.h"
41 #include "MeshGeometry.h"
42 #include "MeshConnectivity.h"
43 #include "MeshTopology.h"
44 
45 namespace dolfin
46 {
47  class BoundaryMesh;
48  class CellType;
49  class Expression;
50  class GenericFunction;
51  class LocalMeshData;
52  class MeshEntity;
53  class Point;
54  class SubDomain;
55  class BoundingBoxTree;
56 
82 
83  class Mesh : public Variable, public Hierarchical<Mesh>
84  {
85  public:
86 
88  Mesh();
89 
91  Mesh(MPI_Comm comm);
92 
97  Mesh(const Mesh& mesh);
98 
103  explicit Mesh(std::string filename);
104 
111  Mesh(MPI_Comm comm, std::string filename);
112 
119  Mesh(MPI_Comm comm, LocalMeshData& local_mesh_data);
120 
122  ~Mesh();
123 
128  const Mesh& operator=(const Mesh& mesh);
129 
135  std::size_t num_vertices() const
136  { return _topology.size(0); }
137 
143  std::size_t num_edges() const
144  { return _topology.size(1); }
145 
151  std::size_t num_faces() const
152  { return _topology.size(2); }
153 
159  std::size_t num_facets() const
160  { return _topology.size(_topology.dim() - 1); }
161 
167  std::size_t num_cells() const
168  { return _topology.size(_topology.dim()); }
169 
178  std::size_t num_entities(std::size_t d) const
179  { return _topology.size(d); }
180 
186  std::vector<double>& coordinates()
187  { return _geometry.x(); }
188 
194  const std::vector<double>& coordinates() const
195  { return _geometry.x(); }
196 
202  const std::vector<unsigned int>& cells() const
203  { return _topology(_topology.dim(), 0)(); }
204 
213  std::size_t num_entities_global(std::size_t dim) const
214  { return _topology.size_global(dim); }
215 
221  { return _topology; }
222 
227  const MeshTopology& topology() const
228  { return _topology; }
229 
235  { return _geometry; }
236 
241  const MeshGeometry& geometry() const
242  { return _geometry; }
243 
249  { return _domains; }
250 
255  const MeshDomains& domains() const
256  { return _domains; }
257 
267  std::shared_ptr<BoundingBoxTree> bounding_box_tree() const;
268 
273  MeshData& data();
274 
278  const MeshData& data() const;
279 
285  { dolfin_assert(_cell_type); return *_cell_type; }
286 
288  const CellType& type() const
289  { dolfin_assert(_cell_type); return *_cell_type; }
290 
298  std::size_t init(std::size_t dim) const;
299 
307  void init(std::size_t d0, std::size_t d1) const;
308 
310  void init() const;
311 
313  void init_global(std::size_t dim) const;
314 
318  void clean();
319 
323  void order();
324 
329  bool ordered() const;
330 
338  Mesh renumber_by_color() const;
339 
345  void scale(double factor);
346 
351  void translate(const Point& point);
352 
360  void rotate(double angle, std::size_t axis=2);
361 
370  void rotate(double angle, std::size_t axis, const Point& point);
371 
377  void smooth(std::size_t num_iterations=1);
378 
388  void smooth_boundary(std::size_t num_iterations=1,
389  bool harmonic_smoothing=true);
390 
399  void snap_boundary(const SubDomain& sub_domain,
400  bool harmonic_smoothing=true);
401 
414  const std::vector<std::size_t>& color(std::string coloring_type) const;
415 
427  const std::vector<std::size_t>&
428  color(std::vector<std::size_t> coloring_type) const;
429 
437  double hmin() const;
438 
446  double hmax() const;
447 
453  double rmin() const;
454 
460  double rmax() const;
461 
468  std::size_t hash() const;
469 
478  std::string str(bool verbose) const;
479 
486  const std::vector<int>& cell_orientations() const;
487 
494  void init_cell_orientations(const Expression& global_normal);
495 
498  MPI_Comm mpi_comm() const
499  { return _mpi_comm.comm(); }
500 
506  std::string ghost_mode() const;
507 
508  // Friend in fem_utils.h
510 
513  void build_mapping(std::shared_ptr<const Mesh> other) const;
514 
515  private:
516 
517  // Friends
518  friend class MeshEditor;
519  friend class TopologyComputation;
520  friend class MeshPartitioning;
521 
522  // Mesh topology
523  mutable MeshTopology _topology;
524 
525  // Mesh geometry
526  MeshGeometry _geometry;
527 
528  // Mesh domains
529  MeshDomains _domains;
530 
531  // Auxiliary mesh data
532  MeshData _data;
533 
534  // Bounding box tree used to compute collisions between the mesh
535  // and other objects. The tree is initialized to a zero pointer
536  // and is allocated and built when bounding_box_tree() is called.
537  mutable std::shared_ptr<BoundingBoxTree> _tree;
538 
539  // Cell type
540  std::unique_ptr<CellType> _cell_type;
541 
542  // True if mesh has been ordered
543  mutable bool _ordered;
544 
545  // Orientation of cells relative to a global direction
546  std::vector<int> _cell_orientations;
547 
548  // MPI communicator
549  dolfin::MPI::Comm _mpi_comm;
550 
551  // Ghost mode used for partitioning
552  std::string _ghost_mode;
553 
554  };
555 }
556 
557 #endif
Definition: CellType.h:47
Definition: Expression.h:50
Definition: Function.h:66
Definition: Hierarchical.h:44
This class stores mesh data on a local processor corresponding to a portion of a (larger) global mesh...
Definition: LocalMeshData.h:59
Definition: MPI.h:77
MPI_Comm comm() const
Return the underlying MPI_Comm object.
Definition: MPI.cpp:117
Definition: MeshData.h:59
Definition: MeshDomains.h:42
Definition: MeshEditor.h:37
MeshGeometry stores the geometry imposed on a mesh.
Definition: MeshGeometry.h:40
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: MeshPartitioning.h:63
Definition: MeshTopology.h:53
std::size_t size(std::size_t dim) const
Return number of entities for given dimension.
Definition: MeshTopology.cpp:79
std::size_t dim() const
Return topological dimension.
Definition: MeshTopology.cpp:74
std::size_t size_global(std::size_t dim) const
Return global number of entities for given dimension.
Definition: MeshTopology.cpp:88
Definition: Mesh.h:84
double rmax() const
Definition: Mesh.cpp:386
std::size_t num_faces() const
Definition: Mesh.h:151
void scale(double factor)
Definition: Mesh.cpp:281
MeshTopology & topology()
Definition: Mesh.h:220
bool ordered() const
Definition: Mesh.cpp:264
const Mesh & operator=(const Mesh &mesh)
Definition: Mesh.cpp:105
const MeshTopology & topology() const
Definition: Mesh.h:227
CellType & type()
Definition: Mesh.h:284
void build_mapping(std::shared_ptr< const Mesh > other) const
Definition: Mesh.cpp:492
const std::vector< unsigned int > & cells() const
Definition: Mesh.h:202
Mesh()
Create empty mesh.
Definition: Mesh.cpp:59
void clean()
Definition: Mesh.cpp:239
std::size_t hash() const
Definition: Mesh.cpp:395
MeshDomains & domains()
Definition: Mesh.h:248
MeshData & data()
Definition: Mesh.cpp:129
void init_cell_orientations(const Expression &global_normal)
Definition: Mesh.cpp:442
~Mesh()
Destructor.
Definition: Mesh.cpp:100
std::size_t num_vertices() const
Definition: Mesh.h:135
std::size_t num_edges() const
Definition: Mesh.h:143
double rmin() const
Definition: Mesh.cpp:377
friend Mesh create_mesh(Function &coordinates)
MPI_Comm mpi_comm() const
Definition: Mesh.h:498
const std::vector< double > & coordinates() const
Definition: Mesh.h:194
void init() const
Compute all entities and connectivity.
Definition: Mesh.cpp:221
const MeshDomains & domains() const
Definition: Mesh.h:255
void init_global(std::size_t dim) const
Compute global indices for entity dimension dim.
Definition: Mesh.cpp:233
std::vector< double > & coordinates()
Definition: Mesh.h:186
std::string str(bool verbose) const
Definition: Mesh.cpp:409
std::size_t num_cells() const
Definition: Mesh.h:167
void smooth_boundary(std::size_t num_iterations=1, bool harmonic_smoothing=true)
Definition: Mesh.cpp:306
void order()
Definition: Mesh.cpp:252
void translate(const Point &point)
Definition: Mesh.cpp:286
const MeshGeometry & geometry() const
Definition: Mesh.h:241
std::string ghost_mode() const
Definition: Mesh.cpp:483
void snap_boundary(const SubDomain &sub_domain, bool harmonic_smoothing=true)
Definition: Mesh.cpp:311
double hmax() const
Definition: Mesh.cpp:368
std::size_t num_facets() const
Definition: Mesh.h:159
double hmin() const
Definition: Mesh.cpp:359
const std::vector< std::size_t > & color(std::string coloring_type) const
Definition: Mesh.cpp:316
std::size_t num_entities(std::size_t d) const
Definition: Mesh.h:178
MeshGeometry & geometry()
Definition: Mesh.h:234
std::size_t num_entities_global(std::size_t dim) const
Definition: Mesh.h:213
Mesh renumber_by_color() const
Definition: Mesh.cpp:274
std::shared_ptr< BoundingBoxTree > bounding_box_tree() const
Definition: Mesh.cpp:347
void smooth(std::size_t num_iterations=1)
Definition: Mesh.cpp:301
const CellType & type() const
Get mesh cell type (const version).
Definition: Mesh.h:288
void rotate(double angle, std::size_t axis=2)
Definition: Mesh.cpp:291
const std::vector< int > & cell_orientations() const
Definition: Mesh.cpp:437
Definition: Point.h:41
Definition: SubDomain.h:43
Definition: TopologyComputation.h:37
Common base class for DOLFIN variables.
Definition: Variable.h:36
Definition: adapt.h:30