50 if (levelSet ==
nullptr) {
52 .addError(
"No level set was passed to ToMesh.")
56 if (mesh ==
nullptr) {
57 Logger::getInstance().addError(
"No mesh was passed to ToMesh.").print();
64 if (levelSet->getNumberOfPoints() == 0) {
66 .addWarning(
"ToMesh: Level set is empty. No mesh will be created.")
72 std::vector<T> LSValues;
75 const auto &pointData = levelSet->getPointData();
77 using ScalarDataType =
typename DomainType::PointDataType::ScalarDataType;
78 using VectorDataType =
typename DomainType::PointDataType::VectorDataType;
81 std::vector<ScalarDataType> scalarData;
82 std::vector<VectorDataType> vectorData;
83 scalarData.resize(pointData.getScalarDataSize());
84 vectorData.resize(pointData.getVectorDataSize());
86 const T gridDelta = levelSet->getGrid().getGridDelta();
88 for (viennahrle::ConstSparseIterator<hrleDomainType> it(
89 levelSet->getDomain());
90 !it.isFinished(); ++it) {
91 if ((onlyDefined && !it.isDefined()) ||
92 (onlyActive && std::abs(it.getValue()) > 0.5))
95 if (!onlyDefined && !it.isDefined()) {
96 bool skipPoint =
false;
97 for (
unsigned i = 0; i <
D; ++i) {
98 if (std::abs(it.getStartIndices(i)) > maxDomainExtent) {
108 std::array<unsigned, 1> vertex{};
109 vertex[0] = mesh->nodes.size();
110 mesh->insertNextVertex(vertex);
116 for (
unsigned i = 0; i <
D; ++i) {
117 node[i] =
T(it.getStartIndices(i)) * gridDelta;
119 mesh->insertNextNode(node);
122 if (it.isDefined()) {
123 LSValues.push_back(it.getDefinedValue());
125 LSValues.push_back((it.getValue() < 0) ? -1000 : 1000);
127 subLS.push_back(it.getSegmentId());
130 for (
unsigned i = 0; i < pointData.getScalarDataSize(); ++i) {
131 if (
const auto dataPointer = pointData.getScalarData(i);
132 dataPointer !=
nullptr) {
133 const auto ¤tData = *dataPointer;
134 scalarData[i].push_back(currentData[it.getPointId()]);
136 Logger::getInstance()
137 .addWarning(
"ToMesh: Tried to access out of bounds scalarData! "
144 for (
unsigned i = 0; i < pointData.getVectorDataSize(); ++i) {
145 if (
const auto dataPointer = pointData.getVectorData(i);
146 dataPointer !=
nullptr) {
147 const auto ¤tData = *dataPointer;
148 vectorData[i].push_back(currentData[it.getPointId()]);
150 Logger::getInstance()
151 .addWarning(
"ToMesh: Tried to access out of bounds vectorData! "
159 mesh->cellData.insertNextScalarData(LSValues,
"LSValues");
160 mesh->cellData.insertNextScalarData(subLS,
"SegmentID");
164 for (
unsigned i = 0; i < scalarData.size(); ++i) {
165 mesh->cellData.insertNextScalarData(std::move(scalarData[i]),
166 pointData.getScalarDataLabel(i));
169 for (
unsigned i = 0; i < vectorData.size(); ++i) {
170 mesh->cellData.insertNextVectorData(std::move(vectorData[i]),
171 pointData.getVectorDataLabel(i));