50 if (levelSet ==
nullptr) {
52 .addWarning(
"No level set was passed to ToMesh.")
56 if (mesh ==
nullptr) {
57 Logger::getInstance().addWarning(
"No mesh was passed to ToMesh.").print();
64 if (levelSet->getNumberOfPoints() == 0) {
69 std::vector<T> LSValues;
72 const auto &pointData = levelSet->getPointData();
74 using ScalarDataType =
typename DomainType::PointDataType::ScalarDataType;
75 using VectorDataType =
typename DomainType::PointDataType::VectorDataType;
78 std::vector<ScalarDataType> scalarData;
79 std::vector<VectorDataType> vectorData;
80 scalarData.resize(pointData.getScalarDataSize());
81 vectorData.resize(pointData.getVectorDataSize());
83 const T gridDelta = levelSet->getGrid().getGridDelta();
85 for (viennahrle::ConstSparseIterator<hrleDomainType> it(
86 levelSet->getDomain());
87 !it.isFinished(); ++it) {
88 if ((onlyDefined && !it.isDefined()) ||
89 (onlyActive && std::abs(it.getValue()) > 0.5))
92 if (!onlyDefined && !it.isDefined()) {
93 bool skipPoint =
false;
94 for (
unsigned i = 0; i <
D; ++i) {
95 if (std::abs(it.getStartIndices(i)) > maxDomainExtent) {
105 std::array<unsigned, 1> vertex{};
106 vertex[0] = mesh->nodes.size();
107 mesh->insertNextVertex(vertex);
113 for (
unsigned i = 0; i <
D; ++i) {
114 node[i] =
T(it.getStartIndices(i)) * gridDelta;
116 mesh->insertNextNode(node);
119 if (it.isDefined()) {
120 LSValues.push_back(it.getDefinedValue());
122 LSValues.push_back((it.getValue() < 0) ? -1000 : 1000);
124 subLS.push_back(it.getSegmentId());
127 for (
unsigned i = 0; i < pointData.getScalarDataSize(); ++i) {
128 if (
const auto dataPointer = pointData.getScalarData(i);
129 dataPointer !=
nullptr) {
130 const auto ¤tData = *dataPointer;
131 scalarData[i].push_back(currentData[it.getPointId()]);
133 Logger::getInstance()
134 .addWarning(
"ToMesh: Tried to access out of bounds scalarData! "
141 for (
unsigned i = 0; i < pointData.getVectorDataSize(); ++i) {
142 if (
const auto dataPointer = pointData.getVectorData(i);
143 dataPointer !=
nullptr) {
144 const auto ¤tData = *dataPointer;
145 vectorData[i].push_back(currentData[it.getPointId()]);
147 Logger::getInstance()
148 .addWarning(
"ToMesh: Tried to access out of bounds vectorData! "
156 mesh->cellData.insertNextScalarData(LSValues,
"LSValues");
157 mesh->cellData.insertNextScalarData(subLS,
"SegmentID");
161 for (
unsigned i = 0; i < scalarData.size(); ++i) {
162 mesh->cellData.insertNextScalarData(std::move(scalarData[i]),
163 pointData.getScalarDataLabel(i));
166 for (
unsigned i = 0; i < vectorData.size(); ++i) {
167 mesh->cellData.insertNextVectorData(std::move(vectorData[i]),
168 pointData.getVectorDataLabel(i));