ViennaLS
Loading...
Searching...
No Matches
lsExtrude.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <lsDomain.hpp>
5#include <lsToSurfaceMesh.hpp>
6
7#include <hrleSparseIterator.hpp>
8
9namespace viennals {
10
11using namespace viennacore;
12
16template <class T> class Extrude {
17 using hrleIndexType = viennahrle::IndexType;
18 SmartPointer<Domain<T, 2>> inputLevelSet = nullptr;
19 SmartPointer<Domain<T, 3>> outputLevelSet = nullptr;
20 Vec2D<T> extent = {0., 0.};
21 int extrusionAxis = 0;
22 std::array<BoundaryConditionEnum, 3> boundaryConds = {};
23
24public:
25 Extrude() = default;
26
27 Extrude(SmartPointer<Domain<T, 2>> passedInputLS,
28 SmartPointer<Domain<T, 3>> passedOutputLS, Vec2D<T> passedExtent,
29 int passedExtrusionAxis,
30 BoundaryConditionEnum passedBoundaryCond =
31 BoundaryConditionEnum::INFINITE_BOUNDARY)
32 : inputLevelSet(passedInputLS), outputLevelSet(passedOutputLS),
33 extent(passedExtent), extrusionAxis(passedExtrusionAxis),
34 boundaryConds{{passedInputLS->getGrid().getBoundaryConditions(0),
35 passedInputLS->getGrid().getBoundaryConditions(1),
36 passedBoundaryCond}} {}
37
38 Extrude(SmartPointer<Domain<T, 2>> passedInputLS,
39 SmartPointer<Domain<T, 3>> passedOutputLS, Vec2D<T> passedExtent,
40 int passedExtrusionAxis,
41 std::array<BoundaryConditionEnum, 3> passedBoundaryConds)
42 : inputLevelSet(passedInputLS), outputLevelSet(passedOutputLS),
43 extent(passedExtent), extrusionAxis(passedExtrusionAxis),
44 boundaryConds(passedBoundaryConds) {}
45
46 void setInputLevelSet(SmartPointer<Domain<T, 2>> passedInputLS) {
47 inputLevelSet = passedInputLS;
48 }
49
50 // The 3D output LS will be overwritten by the extruded LS
51 void setOutputLevelSet(SmartPointer<Domain<T, 3>> &passedOutputLS) {
52 outputLevelSet = passedOutputLS;
53 }
54
55 // Set the min and max extent in the extruded dimension
56 void setExtent(Vec2D<T> passedExtent) { extent = passedExtent; }
57
58 void setExtrusionAxis(int passedExtrusionAxis) {
59 extrusionAxis = passedExtrusionAxis;
60 }
61
63 std::array<BoundaryConditionEnum, 3> passedBoundaryConds) {
64 boundaryConds = passedBoundaryConds;
65 }
66
67 void setBoundaryConditions(BoundaryConditionEnum passedBoundaryConds[3]) {
68 for (int i = 0; i < 3; i++)
69 boundaryConds[i] = passedBoundaryConds[i];
70 }
71
72 void apply() {
73 if (inputLevelSet == nullptr) {
74 Logger::getInstance()
75 .addError("No input Level Set supplied to Extrude.")
76 .print();
77 }
78 if (outputLevelSet == nullptr) {
79 Logger::getInstance()
80 .addError("No output Level Set supplied to Extrude.")
81 .print();
82 return;
83 }
84 if (extrusionAxis < 0 || extrusionAxis > 2) {
85 Logger::getInstance()
86 .addError("Extrusion axis must be between 0 and 2.")
87 .print();
88 return;
89 }
90
91 std::vector<std::pair<viennahrle::Index<3>, T>> points3D;
92
93 auto &domain2D = inputLevelSet->getDomain();
94 auto &grid2D = inputLevelSet->getGrid();
95 const T gridDelta = grid2D.getGridDelta();
96 auto minBounds = grid2D.getMinBounds();
97 auto maxBounds = grid2D.getMaxBounds();
98
99 double domainBounds[2 * 3];
100 unsigned xx, yy;
101 if (extrusionAxis == 0) {
102 domainBounds[0] = extent[0];
103 domainBounds[1] = extent[1];
104 domainBounds[2] = minBounds[0] * gridDelta;
105 domainBounds[3] = maxBounds[0] * gridDelta;
106 domainBounds[4] = minBounds[1] * gridDelta;
107 domainBounds[5] = maxBounds[1] * gridDelta;
108 xx = 1;
109 yy = 2;
110 } else if (extrusionAxis == 1) {
111 domainBounds[0] = minBounds[0] * gridDelta;
112 domainBounds[1] = maxBounds[0] * gridDelta;
113 domainBounds[2] = extent[0];
114 domainBounds[3] = extent[1];
115 domainBounds[4] = minBounds[1] * gridDelta;
116 domainBounds[5] = maxBounds[1] * gridDelta;
117 xx = 0;
118 yy = 2;
119 } else if (extrusionAxis == 2) {
120 domainBounds[0] = minBounds[0] * gridDelta;
121 domainBounds[1] = maxBounds[0] * gridDelta;
122 domainBounds[2] = minBounds[1] * gridDelta;
123 domainBounds[3] = maxBounds[1] * gridDelta;
124 domainBounds[4] = extent[0];
125 domainBounds[5] = extent[1];
126 xx = 0;
127 yy = 1;
128 }
129
130 auto tmpLevelSet = SmartPointer<Domain<T, 3>>::New(
131 domainBounds, boundaryConds.data(), gridDelta);
132 outputLevelSet->deepCopy(tmpLevelSet);
133
134 const hrleIndexType extStart = std::floor(extent[0] / gridDelta);
135 const hrleIndexType extEnd = std::ceil(extent[1] / gridDelta);
136
137 for (viennahrle::SparseIterator<typename Domain<T, 2>::DomainType> it(
138 domain2D);
139 !it.isFinished(); ++it) {
140 if (!it.isDefined())
141 continue;
142
143 const auto index2D = it.getStartIndices();
144 const T value = it.getValue();
145
146 for (hrleIndexType ext = extStart; ext <= extEnd; ++ext) {
147 viennahrle::Index<3> index3D;
148 index3D[extrusionAxis] = ext;
149 index3D[xx] = index2D[0];
150 index3D[yy] = index2D[1];
151
152 points3D.emplace_back(index3D, value);
153 }
154 }
155
156 outputLevelSet->insertPoints(points3D);
157 outputLevelSet->finalize(2);
158 }
159};
160
161} // namespace viennals
double T
Definition Epitaxy.cpp:12
Class containing all information about the level set, including the dimensions of the domain,...
Definition lsDomain.hpp:27
viennahrle::Domain< T, D > DomainType
Definition lsDomain.hpp:32
void setBoundaryConditions(BoundaryConditionEnum passedBoundaryConds[3])
Definition lsExtrude.hpp:67
void setExtent(Vec2D< T > passedExtent)
Definition lsExtrude.hpp:56
void setExtrusionAxis(int passedExtrusionAxis)
Definition lsExtrude.hpp:58
void setBoundaryConditions(std::array< BoundaryConditionEnum, 3 > passedBoundaryConds)
Definition lsExtrude.hpp:62
Extrude(SmartPointer< Domain< T, 2 > > passedInputLS, SmartPointer< Domain< T, 3 > > passedOutputLS, Vec2D< T > passedExtent, int passedExtrusionAxis, std::array< BoundaryConditionEnum, 3 > passedBoundaryConds)
Definition lsExtrude.hpp:38
void apply()
Definition lsExtrude.hpp:72
void setOutputLevelSet(SmartPointer< Domain< T, 3 > > &passedOutputLS)
Definition lsExtrude.hpp:51
Extrude(SmartPointer< Domain< T, 2 > > passedInputLS, SmartPointer< Domain< T, 3 > > passedOutputLS, Vec2D< T > passedExtent, int passedExtrusionAxis, BoundaryConditionEnum passedBoundaryCond=BoundaryConditionEnum::INFINITE_BOUNDARY)
Definition lsExtrude.hpp:27
void setInputLevelSet(SmartPointer< Domain< T, 2 > > passedInputLS)
Definition lsExtrude.hpp:46
Definition lsAdvect.hpp:36
viennahrle::BoundaryType BoundaryConditionEnum
Definition lsDomain.hpp:23