Loading...
Searching...
No Matches
CellType.h
// Copyright (C) 2006-2017 Anders Logg
//
// This file is part of DOLFIN.
//
// DOLFIN is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// DOLFIN is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with DOLFIN. If not, see <http://www.gnu.org/licenses/>.
//
// Modified by Kristoffer Selim 2008
// Modified by Andre Massing 2009-2010
// Modified by Jan Blechta 2013
//
// First added: 2006-06-05
// Last changed: 2017-09-26
#ifndef __CELL_TYPE_H
#define __CELL_TYPE_H
#include <cstdint>
#include <string>
#include <vector>
#include <boost/multi_array.hpp>
namespace dolfin
{
class Cell;
class MeshEditor;
class MeshEntity;
template <typename T> class MeshFunction;
class Point;
class CellType
{
public:
enum class Type : int { point, interval, triangle, quadrilateral, tetrahedron, hexahedron };
CellType(Type cell_type, Type facet_type);
virtual ~CellType();
static CellType* create(Type type);
static CellType* create(std::string type);
static Type string2type(std::string type);
static std::string type2string(Type type);
Type cell_type() const
{ return _cell_type; }
Type facet_type() const
{ return _facet_type; }
Type entity_type(std::size_t i) const;
virtual bool is_simplex() const = 0;
virtual std::size_t dim() const = 0;
virtual std::size_t num_entities(std::size_t dim) const = 0;
std::size_t num_vertices() const
{ return num_vertices(dim()); }
virtual std::size_t num_vertices(std::size_t dim) const = 0;
virtual std::size_t orientation(const Cell& cell) const = 0;
std::size_t orientation(const Cell& cell, const Point& up) const;
virtual void create_entities(boost::multi_array<unsigned int, 2>& e,
std::size_t dim,
const unsigned int* v) const = 0;
virtual double volume(const MeshEntity& entity) const = 0;
virtual double h(const MeshEntity& entity) const;
virtual double circumradius(const MeshEntity& entity) const = 0;
virtual double inradius(const Cell& cell) const;
virtual double radius_ratio(const Cell& cell) const;
virtual double squared_distance(const Cell& cell,
const Point& point) const = 0;
virtual double normal(const Cell& cell, std::size_t facet,
std::size_t i) const = 0;
virtual Point normal(const Cell& cell, std::size_t facet) const = 0;
virtual Point cell_normal(const Cell& cell) const = 0;
virtual double facet_area(const Cell& cell, std::size_t facet) const = 0;
// FIXME: The order() function should be reimplemented and use one common
// FIXME: implementation for all cell types, just as we have for ordered()
virtual void order(Cell& cell,
const std::vector<std::int64_t>& local_to_global_vertex_indices) const = 0;
bool ordered(const Cell& cell,
const std::vector<std::int64_t>& local_to_global_vertex_indices) const;
virtual bool collides(const Cell& cell, const Point& point) const = 0;
virtual bool collides(const Cell& cell, const MeshEntity& entity) const = 0;
virtual std::string description(bool plural) const = 0;
virtual std::vector<std::int8_t> vtk_mapping() const = 0;
protected:
Type _cell_type;
Type _facet_type;
static void sort_entities(std::size_t num_vertices,
unsigned int* vertices,
const std::vector<std::int64_t>& local_to_global_vertex_indices);
private:
// Check if list of vertices is increasing
static bool increasing(std::size_t num_vertices, const unsigned int* vertices,
const std::vector<std::int64_t>& local_to_global_vertex_indices);
// Check that <entity e0 with vertices v0> <= <entity e1 with vertices v1>
static bool increasing(std::size_t n0, const unsigned int* v0,
std::size_t n1, const unsigned int* v1,
std::size_t num_vertices, const unsigned int* vertices,
const std::vector<std::int64_t>& local_to_global_vertex_indices);
};
}
#endif
dolfin::CellType
Definition CellType.h:47
dolfin::CellType::is_simplex
virtual bool is_simplex() const =0
Check if cell is a simplex.
dolfin::CellType::sort_entities
static void sort_entities(std::size_t num_vertices, unsigned int *vertices, const std::vector< std::int64_t > &local_to_global_vertex_indices)
Sort vertices based on global entity indices.
Definition CellType.cpp:276
dolfin::CellType::volume
virtual double volume(const MeshEntity &entity) const =0
Compute (generalized) volume of mesh entity.
dolfin::CellType::num_entities
virtual std::size_t num_entities(std::size_t dim) const =0
Return number of entities of given topological dimension.
dolfin::CellType::facet_area
virtual double facet_area(const Cell &cell, std::size_t facet) const =0
Compute the area/length of given facet with respect to the cell.
dolfin::CellType::num_vertices
std::size_t num_vertices() const
Return number of vertices for cell.
Definition CellType.h:92
dolfin::CellType::h
virtual double h(const MeshEntity &entity) const
Compute greatest distance between any two vertices.
Definition CellType.cpp:151
dolfin::CellType::entity_type
Type entity_type(std::size_t i) const
Return type of cell for entity of dimension i.
Definition CellType.cpp:134
dolfin::CellType::create
static CellType * create(Type type)
Create cell type from type (factory function).
Definition CellType.cpp:55
dolfin::CellType::inradius
virtual double inradius(const Cell &cell) const
Compute inradius of cell.
Definition CellType.cpp:178
dolfin::CellType::cell_normal
virtual Point cell_normal(const Cell &cell) const =0
Compute normal to given cell (viewed as embedded in 3D).
dolfin::CellType::num_vertices
virtual std::size_t num_vertices(std::size_t dim) const =0
Return number of vertices for entity of given topological dimension.
dolfin::CellType::CellType
CellType(Type cell_type, Type facet_type)
Constructor.
Definition CellType.cpp:44
dolfin::CellType::facet_type
Type facet_type() const
Return type of cell for facets.
Definition CellType.h:76
dolfin::CellType::description
virtual std::string description(bool plural) const =0
Return description of cell type.
dolfin::CellType::radius_ratio
virtual double radius_ratio(const Cell &cell) const
Compute dim*inradius/circumradius for given cell.
Definition CellType.cpp:210
dolfin::CellType::order
virtual void order(Cell &cell, const std::vector< std::int64_t > &local_to_global_vertex_indices) const =0
Order entities locally.
dolfin::CellType::dim
virtual std::size_t dim() const =0
Return topological dimension of cell.
dolfin::CellType::ordered
bool ordered(const Cell &cell, const std::vector< std::int64_t > &local_to_global_vertex_indices) const
Check if entities are ordered.
Definition CellType.cpp:221
dolfin::CellType::collides
virtual bool collides(const Cell &cell, const MeshEntity &entity) const =0
Check whether given entity collides with cell.
dolfin::CellType::create_entities
virtual void create_entities(boost::multi_array< unsigned int, 2 > &e, std::size_t dim, const unsigned int *v) const =0
dolfin::CellType::vtk_mapping
virtual std::vector< std::int8_t > vtk_mapping() const =0
Mapping of DOLFIN/UFC vertex ordering to VTK/XDMF ordering.
dolfin::CellType::circumradius
virtual double circumradius(const MeshEntity &entity) const =0
Compute circumradius of mesh entity.
dolfin::CellType::normal
virtual Point normal(const Cell &cell, std::size_t facet) const =0
Compute of given facet with respect to the cell.
dolfin::CellType::cell_type
Type cell_type() const
Return type of cell.
Definition CellType.h:72
dolfin::CellType::squared_distance
virtual double squared_distance(const Cell &cell, const Point &point) const =0
Compute squared distance to given point.
dolfin::CellType::collides
virtual bool collides(const Cell &cell, const Point &point) const =0
Check whether given point collides with cell.
dolfin::CellType::orientation
virtual std::size_t orientation(const Cell &cell) const =0
Return orientation of the cell (assuming flat space).
dolfin::CellType::Type
Type
Enum for different cell types.
Definition CellType.h:51
dolfin::CellType::string2type
static Type string2type(std::string type)
Convert from string to cell type.
Definition CellType.cpp:85
dolfin::CellType::~CellType
virtual ~CellType()
Destructor.
Definition CellType.cpp:50
dolfin::CellType::type2string
static std::string type2string(Type type)
Convert from cell type to string.
Definition CellType.cpp:109
dolfin::CellType::normal
virtual double normal(const Cell &cell, std::size_t facet, std::size_t i) const =0
Compute component i of normal of given facet with respect to the cell.
dolfin::Cell
A Cell is a MeshEntity of topological codimension 0.
Definition Cell.h:43
dolfin::MeshEditor
Definition MeshEditor.h:37
dolfin::MeshEntity
Definition MeshEntity.h:43
dolfin::MeshFunction
Definition MeshFunction.h:58
dolfin::Point
Definition Point.h:41
dolfin
Definition adapt.h:30