DOLFIN
DOLFIN C++ interface
Loading...
Searching...
No Matches
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
44namespace 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
Definition BoundaryMesh.h:40
Definition BoundingBoxTree.h:41
Definition CellType.h:47
Definition Expression.h:50
Definition Function.h:66
Definition GenericFunction.h:54
Hierarchical(Mesh &self)
Definition Hierarchical.h:48
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
Definition MeshData.h:59
Definition MeshDomains.h:42
Definition MeshEntity.h:43
MeshGeometry stores the geometry imposed on a mesh.
Definition MeshGeometry.h:40
Definition MeshTopology.h:47
Definition Mesh.h:83
double rmax() const
Definition Mesh.cpp:381
std::size_t num_faces() const
Definition Mesh.h:150
void scale(double factor)
Definition Mesh.cpp:276
bool ordered() const
Definition Mesh.cpp:259
const Mesh & operator=(const Mesh &mesh)
Definition Mesh.cpp:104
Mesh()
Create empty mesh.
Definition Mesh.cpp:58
const MeshGeometry & geometry() const
Definition Mesh.h:240
const MeshDomains & domains() const
Definition Mesh.h:254
void clean()
Definition Mesh.cpp:234
std::size_t hash() const
Definition Mesh.cpp:390
MeshTopology & topology()
Definition Mesh.h:219
MeshData & data()
Definition Mesh.cpp:128
const std::vector< unsigned int > & cells() const
Definition Mesh.h:201
void init_cell_orientations(const Expression &global_normal)
Definition Mesh.cpp:437
~Mesh()
Destructor.
Definition Mesh.cpp:99
std::size_t num_vertices() const
Definition Mesh.h:134
const CellType & type() const
Get mesh cell type (const version).
Definition Mesh.h:287
std::size_t num_edges() const
Definition Mesh.h:142
double rmin() const
Definition Mesh.cpp:372
friend Mesh create_mesh(Function &coordinates)
MPI_Comm mpi_comm() const
Definition Mesh.h:497
void init() const
Compute all entities and connectivity.
Definition Mesh.cpp:216
void init_global(std::size_t dim) const
Compute global indices for entity dimension dim.
Definition Mesh.cpp:228
std::string str(bool verbose) const
Definition Mesh.cpp:404
MeshDomains & domains()
Definition Mesh.h:247
std::size_t num_cells() const
Definition Mesh.h:166
std::vector< double > & coordinates()
Definition Mesh.h:185
void smooth_boundary(std::size_t num_iterations=1, bool harmonic_smoothing=true)
Definition Mesh.cpp:301
CellType & type()
Definition Mesh.h:283
void order()
Definition Mesh.cpp:247
void translate(const Point &point)
Definition Mesh.cpp:281
std::string ghost_mode() const
Definition Mesh.cpp:478
void snap_boundary(const SubDomain &sub_domain, bool harmonic_smoothing=true)
Definition Mesh.cpp:306
const MeshTopology & topology() const
Definition Mesh.h:226
double hmax() const
Definition Mesh.cpp:363
std::size_t num_facets() const
Definition Mesh.h:158
double hmin() const
Definition Mesh.cpp:354
const std::vector< double > & coordinates() const
Definition Mesh.h:193
const std::vector< std::size_t > & color(std::string coloring_type) const
Definition Mesh.cpp:311
MeshGeometry & geometry()
Definition Mesh.h:233
std::size_t num_entities(std::size_t d) const
Definition Mesh.h:177
std::size_t num_entities_global(std::size_t dim) const
Definition Mesh.h:212
Mesh renumber_by_color() const
Definition Mesh.cpp:269
std::shared_ptr< BoundingBoxTree > bounding_box_tree() const
Definition Mesh.cpp:342
void smooth(std::size_t num_iterations=1)
Definition Mesh.cpp:296
void rotate(double angle, std::size_t axis=2)
Definition Mesh.cpp:286
const std::vector< int > & cell_orientations() const
Definition Mesh.cpp:432
Definition Point.h:41
Definition SubDomain.h:43
Variable()
Create unnamed variable.
Definition Variable.cpp:31
Definition adapt.h:30