12using namespace viennacore;
20 SmartPointer<Domain<T, 3>> sourceLevelSet =
nullptr;
21 SmartPointer<Domain<T, 2>> sliceLevelSet =
nullptr;
23 int sliceDimension = 0;
26 bool writeSliceLevelSet =
false;
27 bool writeSurfaceMesh =
false;
28 std::string writePath;
30 bool reflectX =
false;
37 int passedSliceDimension = 0,
T passedSlicePosition = 0)
38 : sourceLevelSet(passedDomain), sliceLevelSet(passedSliceDomain),
39 sliceDimension(passedSliceDimension),
40 slicePosition(passedSlicePosition) {}
43 T passedSlicePosition = 0)
44 : sourceLevelSet(passedDomain), sliceDimension(passedSliceDimension),
45 slicePosition(passedSlicePosition) {}
48 sourceLevelSet = passedDomain;
52 sliceLevelSet = passedDomain;
56 bool writeSliceSurfaceMesh =
false) {
57 writeSliceLevelSet =
true;
58 writeSurfaceMesh = writeSliceSurfaceMesh;
66 if (dimension >= 0 && dimension < 3) {
67 sliceDimension = dimension;
70 .addError(
"Invalid slice dimension. Must be 0 (x), 1 (y), or 2 (z)")
80 if (sourceLevelSet ==
nullptr) {
82 .addError(
"No source level-set passed to Slice")
89 bool autoCreateSlice =
false;
90 if (sliceLevelSet ==
nullptr) {
91 autoCreateSlice =
true;
93 .addInfo(
"No slice level-set passed to Slice. Auto-created slice "
94 "level-set with bounds derived from "
99 const auto &sourceGrid = sourceLevelSet->getGrid();
100 auto const gridDelta = sourceGrid.getGridDelta();
103 std::vector<std::pair<viennahrle::Index<2>,
T>> pointData;
106 if (std::fmod(slicePosition, gridDelta) != 0) {
108 slicePosition = std::round(slicePosition / gridDelta) * gridDelta;
109 Logger::getInstance()
110 .addWarning(
"Slice position is not divisible by grid delta in "
111 "Slice. Adjusting slice position to the nearest "
112 "multiple of grid delta: " +
113 std::to_string(slicePosition))
118 const int sliceIndex =
static_cast<int>(slicePosition / gridDelta);
121 viennahrle::ConstSparseIterator<typename Domain<T, 3>::DomainType> it(
122 sourceLevelSet->getDomain());
124 while (!it.isFinished()) {
125 if (!it.isDefined()) {
130 auto indices = it.getStartIndices();
131 if (indices[sliceDimension] == sliceIndex) {
133 T value = it.getValue();
136 viennahrle::Index<2> sliceIndices;
137 for (
int d = 0, j = 0; d < 3; d++) {
138 if (d != sliceDimension) {
139 sliceIndices[j++] = indices[d];
144 sliceIndices[0] = -sliceIndices[0];
148 pointData.emplace_back(sliceIndices, value);
156 if (pointData.empty()) {
157 Logger::getInstance().addWarning(
"No points extracted in Slice").print();
159 if (autoCreateSlice) {
161 double sliceBounds[4];
164 for (
int i = 0, d = 0; d < 3; d++) {
165 if (d != sliceDimension) {
166 sliceBounds[2 * i] = sourceGrid.getMinGridPoint(d) * gridDelta;
167 sliceBounds[2 * i + 1] = sourceGrid.getMaxGridPoint(d) * gridDelta;
168 sliceBoundaryConds[i] = sourceGrid.getBoundaryConditions(d);
175 double temp = sliceBounds[0];
176 sliceBounds[0] = -sliceBounds[1];
177 sliceBounds[1] = -temp;
180 sliceLevelSet = SmartPointer<Domain<T, 2>>::New(
181 pointData, sliceBounds, sliceBoundaryConds, gridDelta);
184 sliceLevelSet->insertPoints(pointData);
187 if (writeSliceLevelSet) {
190 if (writeSurfaceMesh) {
191 auto mesh = SmartPointer<Mesh<>>::New();
Class containing all information about the level set, including the dimensions of the domain,...
Definition lsDomain.hpp:27
Slice(SmartPointer< Domain< T, 3 > > passedDomain, SmartPointer< Domain< T, 2 > > passedSliceDomain, int passedSliceDimension=0, T passedSlicePosition=0)
Definition lsSlice.hpp:35
Slice(SmartPointer< Domain< T, 3 > > passedDomain, int passedSliceDimension=0, T passedSlicePosition=0)
Definition lsSlice.hpp:42
void setSourceLevelSet(SmartPointer< Domain< T, 3 > > passedDomain)
Definition lsSlice.hpp:47
void setReflectX(bool reflect)
Definition lsSlice.hpp:77
void setSliceDimension(const int dimension)
Definition lsSlice.hpp:65
void setWritePath(const std::string &path, bool writeSliceSurfaceMesh=false)
Definition lsSlice.hpp:55
SmartPointer< Domain< T, 2 > > getSliceLevelSet()
Definition lsSlice.hpp:63
void setSlicePosition(T position)
Definition lsSlice.hpp:75
void setSliceLevelSet(SmartPointer< Domain< T, 2 > > passedDomain)
Definition lsSlice.hpp:51
void apply()
Definition lsSlice.hpp:79
Extract an explicit Mesh<> instance from an lsDomain. The interface is then described by explicit sur...
Definition lsToSurfaceMesh.hpp:20
void apply()
Definition lsToSurfaceMesh.hpp:44
Class handling the output of an Mesh<> to VTK file types.
Definition lsVTKWriter.hpp:32
void apply()
Definition lsVTKWriter.hpp:92
Definition lsWriter.hpp:13
void apply()
Definition lsWriter.hpp:35
#define PRECOMPILE_PRECISION(className)
Definition lsPreCompileMacros.hpp:30
Definition lsAdvect.hpp:36
viennahrle::BoundaryType BoundaryConditionEnum
Definition lsDomain.hpp:23
double T
Definition pyWrap.cpp:69