50 if (levelSet ==
nullptr) {
52 .addError(
"No level set was passed to ToMesh.")
56 if (mesh ==
nullptr) {
57 VIENNACORE_LOG_ERROR(
"No mesh was passed to ToMesh.");
64 if (levelSet->getNumberOfPoints() == 0) {
65 VIENNACORE_LOG_WARNING(
66 "ToMesh: Level set is empty. No mesh will be created.");
71 std::vector<T> LSValues;
74 const auto &pointData = levelSet->getPointData();
76 using ScalarDataType =
typename DomainType::PointDataType::ScalarDataType;
77 using VectorDataType =
typename DomainType::PointDataType::VectorDataType;
80 std::vector<ScalarDataType> scalarData;
81 std::vector<VectorDataType> vectorData;
82 scalarData.resize(pointData.getScalarDataSize());
83 vectorData.resize(pointData.getVectorDataSize());
85 const T gridDelta = levelSet->getGrid().getGridDelta();
87 for (viennahrle::ConstSparseIterator<hrleDomainType> it(
88 levelSet->getDomain());
89 !it.isFinished(); ++it) {
90 if ((onlyDefined && !it.isDefined()) ||
91 (onlyActive && std::abs(it.getValue()) > 0.5))
94 if (!onlyDefined && !it.isDefined()) {
95 bool skipPoint =
false;
96 for (
unsigned i = 0; i <
D; ++i) {
97 if (std::abs(it.getStartIndices(i)) > maxDomainExtent) {
107 std::array<unsigned, 1> vertex{};
108 vertex[0] = mesh->nodes.size();
109 mesh->insertNextVertex(vertex);
115 for (
unsigned i = 0; i <
D; ++i) {
116 node[i] =
T(it.getStartIndices(i)) * gridDelta;
118 mesh->insertNextNode(node);
121 if (it.isDefined()) {
122 LSValues.push_back(it.getDefinedValue());
124 LSValues.push_back((it.getValue() < 0) ? -1000 : 1000);
126 subLS.push_back(it.getSegmentId());
129 for (
unsigned i = 0; i < pointData.getScalarDataSize(); ++i) {
130 if (
const auto dataPointer = pointData.getScalarData(i);
131 dataPointer !=
nullptr) {
132 const auto ¤tData = *dataPointer;
133 scalarData[i].push_back(currentData[it.getPointId()]);
135 VIENNACORE_LOG_WARNING(
136 "ToMesh: Tried to access out of bounds scalarData! Ignoring.");
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 VIENNACORE_LOG_WARNING(
148 "ToMesh: Tried to access out of bounds vectorData! Ignoring.");
154 mesh->cellData.insertNextScalarData(LSValues,
"LSValues");
155 mesh->cellData.insertNextScalarData(subLS,
"SegmentID");
159 for (
unsigned i = 0; i < scalarData.size(); ++i) {
160 mesh->cellData.insertNextScalarData(std::move(scalarData[i]),
161 pointData.getScalarDataLabel(i));
164 for (
unsigned i = 0; i < vectorData.size(); ++i) {
165 mesh->cellData.insertNextVectorData(std::move(vectorData[i]),
166 pointData.getVectorDataLabel(i));