10#include <dune/common/hybridutilities.hh>
12#include <dune/geometry/utility/typefromvertexcount.hh>
13#include <dune/geometry/multilineargeometry.hh>
17#include <dune/gmsh4/types.hh>
18#include <dune/gmsh4/gridcreatorinterface.hh>
20#include <dune/gmsh4/utility/lagrangepoints.hh>
38 template <
class Gr
idType>
44 using GlobalCoordinate =
typename Super::GlobalCoordinate;
46 using Nodes = std::vector<GlobalCoordinate>;
48 struct ElementParametrization
51 std::vector<std::int64_t> nodes;
52 std::vector<unsigned int> corners;
55 using Parametrization = std::vector<ElementParametrization>;
57 using LocalCoordinate =
typename Element::Geometry::LocalCoordinate;
59 class LocalParametrization;
67 template <
class NodeAttributes>
69 std::pair<std::size_t,std::size_t> nodeTagRange,
70 std::vector<NodeAttributes>
const& entityBlocks)
72 vertexMap_.resize(nodeTagRange.second - nodeTagRange.first + 1);
73 vertexShift_ = nodeTagRange.first;
74 nodes_.resize(numNodes);
76 size_t vertexIndex = 0;
78 for (
auto const& entityBlock : entityBlocks) {
79 for (
auto const& node : entityBlock.nodes) {
80 for (std::size_t j = 0; j < p.size(); ++j)
82 nodes_[vertexIndex] = p;
83 vertexMap_[node.tag - vertexShift_] = vertexIndex++;
89 using HasParametrizedElements =
decltype(std::declval<F>().insertElement(std::declval<GeometryType>(),
90 std::declval<std::vector<unsigned int>
const&>(), std::declval<std::function<GlobalCoordinate(LocalCoordinate)>>()));
93 template <
class ElementAttributes,
class BoundaryEntities>
95 std::pair<std::size_t,std::size_t> elementTagRange,
96 std::vector<ElementAttributes>
const& entityBlocks,
97 BoundaryEntities
const& boundaryEntities)
99 const int dim = GridType::dimension;
100 std::vector<unsigned int> connectivity;
101 std::size_t cornerIndex = 0;
102 std::vector<std::int64_t> cornerVertices(nodes_.size(), -1);
104 for (
auto const& entityBlock : entityBlocks) {
105 if (entityBlock.entityDim < dim - 1)
108 auto type = Gmsh4::gmshNumberToGeometryType(entityBlock.elementType);
111 if (entityBlock.entityDim == dim) {
112 auto refElem = referenceElement<double, dim>(type);
113 connectivity.resize(refElem.size(dim));
115 for (
auto const& element : entityBlock.elements) {
116 GMSH4_ASSERT(element.nodes.size() >= connectivity.size());
117 for (std::size_t j = 0; j < connectivity.size(); ++j) {
118 auto index = vertexMap_[element.nodes[j] - vertexShift_];
119 auto&
vertex = cornerVertices.at(index);
124 connectivity[cell.gmshVertexToDuneVertex(j)] =
vertex;
128 parametrization_.push_back(ElementParametrization{type});
129 auto& param = parametrization_.back();
130 param.nodes.resize(element.nodes.size());
131 for (std::size_t j = 0; j < element.nodes.size(); ++j)
132 param.nodes[j] = vertexMap_[element.nodes[j] - vertexShift_];
133 param.corners = connectivity;
160 assert(!nodes_.empty() && !parametrization_.empty());
161 auto const& localParam = parametrization_.at(insertionIndex);
162 return LocalParametrization{nodes_, localParam,
order(localParam)};
180 assert(!nodes_.empty() && !parametrization_.empty());
183 auto const& localParam = parametrization_.at(insertionIndex);
187 std::vector<unsigned int> indices(element.subEntities(GridType::dimension));
188 for (
unsigned int i = 0; i < element.subEntities(GridType::dimension); ++i)
192 std::vector<unsigned int> permutation(indices.size());
193 for (std::size_t i = 0; i < indices.size(); ++i) {
194 auto it = std::find(localParam.corners.begin(), localParam.corners.end(), indices[i]);
196 permutation[i] = std::distance(localParam.corners.begin(), it);
199 return LocalParametrization{nodes_, localParam,
order(localParam), permutation};
203 template <
class LocalParam>
204 int order (LocalParam
const& localParam)
const
207 int nNodes = localParam.nodes.size();
208 for (
int o = 1; o <= nNodes; ++o)
210 if (numLagrangePoints(type.
id(), type.
dim(), o) == std::size_t(nNodes))
212 if (numLagrangePoints(type, o) == std::size_t(nNodes))
223 return order(parametrization_.front());
243 return LocalFunction{gridCreator};
248 return LocalFunction{gridCreator};
251 friend LocalFunction
localFunction (LagrangeGridCreator&& gridCreator)
253 DUNE_THROW(Dune::Gmsh4Error,
"Cannot pass temporary LagrangeGridCreator to localFunction(). Pass an lvalue-reference instead.");
254 return LocalFunction{gridCreator};
259 using Grid = GridType;
260 using GlobalCoordinate =
typename Self::GlobalCoordinate;
266 assert(
false &&
"Should not be used!");
273 assert(
false &&
"Should not be used!");
274 return GlobalCoordinate{};
282 Parametrization parametrization_;
284 std::vector<std::size_t> vertexMap_;
285 std::size_t vertexShift_ = 0;
289 template <
class Gr
id>
291 -> LagrangeGridCreator<Grid>;
294 template <
class Gr
id>
295 class LagrangeGridCreator<
Grid>::LocalParametrization
304 using LocalBasis =
typename LocalFE::Traits::LocalBasisType;
309 template <
class Nodes,
class LocalParam>
310 LocalParametrization (Nodes
const& nodes, LocalParam
const& param,
int order)
311 : localFE_(param.type,
order)
312 , localNodes_(param.nodes.
size())
314 for (std::size_t i = 0; i < localNodes_.size(); ++i)
315 localNodes_[i] = nodes[param.nodes[i]];
319 template <
class Nodes,
class LocalParam,
class Permutation>
320 LocalParametrization (Nodes
const& nodes, LocalParam
const& param,
int order, Permutation
const& permutation)
321 : LocalParametrization(nodes, param,
order)
323 auto refElem = referenceElement<ctype,Grid::dimension>(param.type);
324 std::vector<LocalCoordinate> corners(permutation.size());
325 for (std::size_t i = 0; i < permutation.size(); ++i)
328 localGeometry_.emplace(param.type, corners);
332 template <
class LocalCoordinate>
333 GlobalCoordinate
operator() (LocalCoordinate
const& local)
const
336 LocalCoordinate x = localGeometry_ ? localGeometry_->global(local) : local;
338 LocalBasis
const& localBasis = localFE_.localBasis();
339 localBasis.evaluateFunction(x, shapeValues_);
340 GMSH4_ASSERT(shapeValues_.size() == localNodes_.size());
342 GlobalCoordinate out(0);
343 for (std::size_t i = 0; i < shapeValues_.size(); ++i)
344 out.axpy(shapeValues_[i], localNodes_[i]);
351 std::vector<GlobalCoordinate> localNodes_;
352 std::optional<LocalGeometry> localGeometry_;
354 mutable std::vector<typename LocalBasisTraits::RangeType> shapeValues_;
358 template <
class Gr
id>
359 class LagrangeGridCreator<Grid>::LocalFunction
362 using LocalContext =
typename Grid::template Codim<0>::Entity;
363 using GlobalCoordinate =
typename LocalContext::Geometry::GlobalCoordinate;
364 using LocalCoordinate =
typename LocalContext::Geometry::LocalCoordinate;
365 using LocalParametrization =
typename LagrangeGridCreator::LocalParametrization;
368 explicit LocalFunction (LagrangeGridCreator& gridCreator)
369 : gridCreator_(&gridCreator)
372 explicit LocalFunction (LagrangeGridCreator
const& gridCreator)
373 : gridCreator_(&gridCreator)
376 explicit LocalFunction (LagrangeGridCreator&& gridCreator) =
delete;
379 void bind (LocalContext
const& element)
381 localContext_ = element;
382 localParametrization_.emplace(gridCreator_->localParametrization(element));
388 GlobalCoordinate
operator() (LocalCoordinate
const& local)
const
390 assert(!!localParametrization_);
391 return (*localParametrization_)(local);
395 LocalContext
const& localContext ()
const
397 return localContext_;
401 LagrangeGridCreator
const* gridCreator_;
403 LocalContext localContext_;
404 std::optional<LocalParametrization> localParametrization_;
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:114
constexpr unsigned int dim() const
Return dimension of the type.
Definition: type.hh:360
constexpr unsigned int id() const
Return the topology id of the type.
Definition: type.hh:365
Mapping of Dune geometry types to Gmsh cell types.
Definition: types.hh:25
Base class for grid creators in a CRTP style.
Definition: gridcreatorinterface.hh:23
GridFactory< Grid > & factory()
Return the associated GridFactory.
Definition: gridcreatorinterface.hh:60
Base class for exceptions in Dune grid modules.
Definition: exceptions.hh:20
virtual unsigned int insertionIndex(const typename Codim< 0 >::Entity &entity) const
obtain an element's insertion index
Definition: gridfactory.hh:181
Provide a generic factory class for unstructured grids.
Definition: gridfactory.hh:275
virtual void insertElement(const GeometryType &type, const std::vector< unsigned int > &vertices)
Insert an element into the coarse grid.
Definition: gridfactory.hh:307
virtual void insertVertex(const FieldVector< ctype, dimworld > &pos)
Insert a vertex into the coarse grid.
Definition: gridfactory.hh:296
Grid abstract base class.
Definition: grid.hh:375
static constexpr int dimension
The dimension of the grid.
Definition: grid.hh:387
ct ctype
Define type used for coordinates in grid module.
Definition: grid.hh:518
generic geometry implementation based on corner coordinates
Definition: multilineargeometry.hh:181
Provide a generic factory class for unstructured grids.
A few common exception classes.
Various macros to work with Dune module version numbers.
#define DUNE_VERSION_LT(module, major, minor)
True if 'module' has a version less than major.minor.
Definition: version.hh:100
Macro for wrapping error checks and throwing exceptions.
#define GMSH4_ASSERT(cond)
check if condition cond holds; otherwise, throw a Gmsh4Error.
Definition: errors.hh:34
#define DUNE_THROW(E,...)
Definition: exceptions.hh:314
constexpr GeometryType vertex
GeometryType representing a vertex.
Definition: type.hh:492
Convenience header that includes all implementations of Lagrange finite elements.
Dune namespace
Definition: alignedallocator.hh:13
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition: integersequence.hh:75
Static tag representing a codimension.
Definition: dimension.hh:24
Definition: lagrangegridcreator.hh:41
LocalParametrization localParametrization(Element const &element) const
Construct an element parametrization.
Definition: lagrangegridcreator.hh:178
LocalParametrization localParametrization(unsigned int insertionIndex) const
Construct an element parametrization.
Definition: lagrangegridcreator.hh:158
void insertElementsImpl(std::size_t numElements, std::pair< std::size_t, std::size_t > elementTagRange, std::vector< ElementAttributes > const &entityBlocks, BoundaryEntities const &boundaryEntities)
Implementation of the interface function insertElements()
Definition: lagrangegridcreator.hh:94
int order(LocalParam const &localParam) const
Determine Lagrange order from number of points.
Definition: lagrangegridcreator.hh:204
void insertVerticesImpl(std::size_t numNodes, std::pair< std::size_t, std::size_t > nodeTagRange, std::vector< NodeAttributes > const &entityBlocks)
Implementation of the interface function insertVertices()
Definition: lagrangegridcreator.hh:68
int order() const
Determine Lagrange order from number of points from the first element parametrization.
Definition: lagrangegridcreator.hh:220
friend LocalFunction localFunction(LagrangeGridCreator &gridCreator)
Local function representing the parametrization of the grid.
Definition: lagrangegridcreator.hh:241
GridFactory< Grid > & factory()
Return the associated GridFactory.
Definition: gridcreatorinterface.hh:60
EntitySet entitySet() const
Dummy function returning a placeholder entityset.
Definition: lagrangegridcreator.hh:264
GlobalCoordinate operator()(GlobalCoordinate const &) const
Dummy function returning a placeholder entityset.
Definition: lagrangegridcreator.hh:271
Type traits for LocalBasisVirtualInterface.
Definition: localbasis.hh:35