4#include <boost/container/flat_map.hpp>
116 _edges.emplace_back(vertexOne, vertexTwo);
129 _triangles.emplace_back(edgeOne, edgeTwo, edgeThree);
138 _triangles.emplace_back(vertexOne, vertexTwo, vertexThree);
148 _tetrahedra.emplace_back(vertexOne, vertexTwo, vertexThree, vertexFour);
153 const std::string &name,
161 "Data \"{}\" cannot be created twice for mesh \"{}\". "
162 "Please rename or remove one of the use-data tags with name \"{}\".",
166 std::vector<std::optional<double>> lowerBound = std::vector<std::optional<double>>(dimension);
167 std::vector<std::optional<double>> upperBound = std::vector<std::optional<double>>(dimension);
174 const std::string &name,
178 std::vector<std::optional<double>> lowerBound,
179 std::vector<std::optional<double>> upperBound)
184 "Data \"{}\" cannot be created twice for mesh \"{}\". "
185 "Please rename or remove one of the use-data tags with name \"{}\".",
201 auto iter = std::find_if(
_data.begin(),
_data.end(), [dataID](
const auto &dptr) {
202 return dptr->getID() == dataID;
204 return iter !=
_data.end();
209 auto iter = std::find_if(
_data.begin(),
_data.end(), [dataID](
const auto &dptr) {
210 return dptr->getID() == dataID;
218 auto iter = std::find_if(
_data.begin(),
_data.end(), [&dataName](
const auto &dptr) {
219 return dptr->getName() == dataName;
221 return iter !=
_data.end();
226 std::vector<std::string> names;
228 names.push_back(
data->getName());
235 auto iter = std::find_if(
_data.begin(),
_data.end(), [&dataName](
const auto &dptr) {
236 return dptr->getName() == dataName;
254 return (0 <= vertexID) && (
static_cast<size_t>(vertexID) <
nVertices());
260 const auto expectedCount =
_vertices.size();
262 data->allocateValues(expectedCount);
290 data->values().resize(0);
307 data->waveform().clear();
326 std::vector<double> ownedDataVector;
331 int valueDim = values.size() /
nVertices();
336 for (
int dim = 0; dim < valueDim; ++dim) {
337 ownedDataVector.push_back(values[
index * valueDim + dim]);
342 Eigen::Map<Eigen::VectorXd> ownedData(ownedDataVector.data(), ownedDataVector.size());
360 boost::container::flat_map<VertexID, Vertex *> vertexMap;
361 vertexMap.reserve(deltaMesh.
nVertices());
364 coords =
vertex.getCoords();
371 vertexMap[
vertex.getID()] = &v;
377 for (
const Edge &edge : deltaMesh.
edges()) {
378 VertexID vertexIndex1 = edge.vertex(0).getID();
379 VertexID vertexIndex2 = edge.vertex(1).getID();
381 (vertexMap.count(vertexIndex2) == 1));
382 createEdge(*vertexMap[vertexIndex1], *vertexMap[vertexIndex2]);
386 VertexID vertexIndex1 = triangle.vertex(0).getID();
387 VertexID vertexIndex2 = triangle.vertex(1).getID();
388 VertexID vertexIndex3 = triangle.vertex(2).getID();
390 (vertexMap.count(vertexIndex2) == 1) &&
391 (vertexMap.count(vertexIndex3) == 1));
392 createTriangle(*vertexMap[vertexIndex1], *vertexMap[vertexIndex2], *vertexMap[vertexIndex3]);
396 VertexID vertexIndex1 = tetra.vertex(0).getID();
397 VertexID vertexIndex2 = tetra.vertex(1).getID();
398 VertexID vertexIndex3 = tetra.vertex(2).getID();
399 VertexID vertexIndex4 = tetra.vertex(3).getID();
402 (vertexMap.count(vertexIndex2) == 1) &&
403 (vertexMap.count(vertexIndex3) == 1) &&
404 (vertexMap.count(vertexIndex4) == 1));
405 createTetrahedron(*vertexMap[vertexIndex1], *vertexMap[vertexIndex2], *vertexMap[vertexIndex3], *vertexMap[vertexIndex4]);
441 auto edgeCnt =
_edges.size();
443 auto lastEdge = std::unique(
_edges.begin(),
_edges.end());
446 PRECICE_DEBUG(
"Compression removed {} tetrahedra ({} to {}), {} triangles ({} to {}), and {} edges ({} to {})",
454template <
class Primitive,
int... Indices>
455auto sortedVertexPtrsForImpl(Primitive &p, std::integer_sequence<int, Indices...>)
457 std::array<Vertex *, Primitive::vertexCount> vs{&p.vertex(Indices)...};
458 std::sort(vs.begin(), vs.end());
459 return std::tuple_cat(vs);
470template <
class Primitive>
471auto sortedVertexPtrsFor(Primitive &p)
473 return sortedVertexPtrsForImpl(p, std::make_integer_sequence<int, Primitive::vertexCount>{});
491 using ExisitingTriangle = std::tuple<Vertex *, Vertex *, Vertex *>;
494 triangles.insert(sortedVertexPtrsFor(t));
506 auto [a, b, c, d] = sortedVertexPtrsFor(t);
508 createTriangleIfMissing(a, b, c);
509 createTriangleIfMissing(a, b, d);
510 createTriangleIfMissing(a, c, d);
511 createTriangleIfMissing(b, c, d);
516 using ExisitingEdge = std::tuple<Vertex *, Vertex *>;
517 std::set<ExisitingEdge>
edges;
519 edges.emplace(sortedVertexPtrsFor(e));
524 if (
edges.count({a, b}) == 0) {
530 auto [a, b, c] = sortedVertexPtrsFor(t);
532 createEdgeIfMissing(a, b);
533 createEdgeIfMissing(a, c);
534 createEdgeIfMissing(b, c);
537 PRECICE_DEBUG(
"Generated {} implicit triangles and {} implicit edges",
539 _edges.size() - explEdges);
556 return !(*
this == other);
562 os <<
"GEOMETRYCOLLECTION(\n";
563 const auto token =
", ";
564 const auto *sep =
"";
570 for (
auto &edge : m.
edges()) {
576 os << sep << triangle;
#define PRECICE_DEBUG(...)
#define PRECICE_TRACE(...)
#define PRECICE_CHECK(check,...)
#define PRECICE_ASSERT(...)
An axis-aligned bounding box around a (partition of a) mesh.
void expandBy(const BoundingBox &otherBB)
Expand bounding box using another bounding box.
Describes a set of data values belonging to the vertices of a mesh.
Linear edge of a mesh, defined by two Vertex objects.
bool connectedTo(const Edge &other) const
Checks whether both edges share a vertex.
Container and creator for meshes.
void expandBoundingBox(const BoundingBox &bounding_box)
Triangle & createTriangle(Edge &edgeOne, Edge &edgeTwo, Edge &edgeThree)
Creates and initializes a Triangle object.
MeshID _id
The ID of this mesh.
MeshID getID() const
Returns the base ID of the mesh.
std::string _name
Name of the mesh.
std::deque< Triangle > TriangleContainer
int _globalNumberOfVertices
Number of unique vertices for complete distributed mesh.
int getDimensions() const
VertexContainer & vertices()
Returns modifieable container holding all vertices.
void clearDataStamples()
Clears all data stamples.
std::vector< PtrData > DataContainer
bool hasDataID(DataID dataID) const
Returns whether Mesh has Data with the matchingID.
Eigen::VectorXd getOwnedVertexData(const Eigen::VectorXd &values)
void clear()
Removes all mesh elements and data values (does not remove data or the bounding boxes).
DataContainer _data
Data hold by the vertices of the mesh.
void addMesh(Mesh &deltaMesh)
bool operator!=(const Mesh &other) const
std::vector< std::string > availableData() const
Returns the names of all available data.
const std::string & getName() const
Returns the name of the mesh, as set in the config file.
void removeDuplicates()
Removes all duplicate connectivity.
std::size_t nVertices() const
Returns the number of vertices.
VertexDistribution _vertexDistribution
Vertex distribution for the primary rank, holding for each secondary rank all vertex IDs it owns.
TetraContainer & tetrahedra()
Returns modifiable container holding all tetrahedra.
std::deque< Tetrahedron > TetraContainer
bool operator==(const Mesh &other) const
std::vector< Rank > _connectedRanks
each rank stores list of connected remote ranks. In the m2n package, this is used to create the initi...
bool _isJustInTime
for just-in-time mapping, we need an artificial mesh, which we can use
TetraContainer _tetrahedra
Vertex & vertex(VertexID id)
Mutable access to a vertex by VertexID.
bool isJustInTime() const
Mesh(std::string name, int dimensions, MeshID id, bool isJustInTime=false)
Constructor.
const query::Index & index() const
Call preprocess() before index() to ensure correct projection handling.
VertexContainer _vertices
Holds vertices, edges, triangles and tetrahedra.
bool hasDataName(std::string_view dataName) const
Returns whether Mesh has Data with the dataName.
std::deque< Edge > EdgeContainer
PtrData & createData(const std::string &name, int dimension, DataID id, int waveformDegree=time::Time::DEFAULT_WAVEFORM_DEGREE)
Create only data for vertex.
CommunicationMap _communicationMap
each rank stores list of connected ranks and corresponding vertex IDs here. In the m2n package,...
bool empty() const
Does the mesh contain any vertices?
void generateImplictPrimitives()
void clearPartitioning()
Clears the partitioning information.
void computeBoundingBox()
Computes the boundingBox for the vertices.
TriangleContainer _triangles
bool isPartitionEmpty(Rank rank) const
checks if the given ranks partition is empty
Tetrahedron & createTetrahedron(Vertex &vertexOne, Vertex &vertexTwo, Vertex &vertexThree, Vertex &vertexFour)
Creates and initializes a Tetrahedron object.
VertexOffsets _vertexOffsets
Holds the index of the last vertex for each rank.
bool isValidVertexID(VertexID vertexID) const
Returns true if the given vertexID is valid.
const DataContainer & data() const
Allows access to all data.
TriangleContainer & triangles()
Returns modifiable container holding all triangles.
const BoundingBox & getBoundingBox() const
Returns the bounding box of the mesh.
std::deque< Vertex > VertexContainer
Edge & createEdge(Vertex &vertexOne, Vertex &vertexTwo)
Creates and initializes an Edge object.
Vertex & createVertex(const Eigen::Ref< const Eigen::VectorXd > &coords)
Creates and initializes a Vertex object.
EdgeContainer & edges()
Returns modifiable container holding all edges.
void allocateDataValues()
Allocates memory for the vertex data values and corresponding gradient values.
int _dimensions
Dimension of mesh.
Tetrahedron of a mesh, defined by 4 vertices.
Triangle of a mesh, defined by three vertices.
void setGlobalIndex(int globalIndex)
void setOwner(bool owner)
provides Mesh, Data and primitives.
std::shared_ptr< Data > PtrData
std::ostream & operator<<(std::ostream &os, const BoundingBox &bb)