Skip to content

Commit abf7940

Browse files
FluxEngineType refactor (#195)
* Refactor FluxEngineType and improve GPU build configuration - Move FluxEngineType to psUtil.hpp to fix circular deps - Expose FluxEngineType to Python bindings - Update DRAMWiggling example to parameterize flux engine * refactor FluxEngineType * revert CMakeLists.txt (accidental local version commit) and format * slight fix in DRAM Wiggle example
1 parent 59e8e2a commit abf7940

File tree

6 files changed

+86
-40
lines changed

6 files changed

+86
-40
lines changed

examples/DRAMWiggling/DRAMWiggling.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ int main(int argc, char **argv) {
66
using NumericType = double;
77
constexpr int D = 3;
88

9+
Logger::setLogLevel(LogLevel::INFO);
10+
omp_set_num_threads(12);
11+
912
// Parse the parameters
1013
util::Parameters params;
1114
if (argc > 1) {
@@ -59,25 +62,30 @@ int main(int argc, char **argv) {
5962
RayTracingParameters rayParams;
6063
rayParams.raysPerPoint = params.get<int>("raysPerPoint");
6164

65+
const std::string fluxEngineStr = params.get<std::string>("fluxEngine");
66+
const auto fluxEngine = util::convertFluxEngineType(fluxEngineStr);
67+
6268
CoverageParameters coverageParams;
63-
coverageParams.maxIterations = 10;
69+
coverageParams.tolerance = 1e-5;
6470

6571
// Process setup
6672
Process<NumericType, D> process(geometry, model, params.get("processTime"));
6773
process.setParameters(advectionParams);
6874
process.setParameters(rayParams);
6975
process.setParameters(coverageParams);
7076

77+
process.setFluxEngineType(fluxEngine);
7178
// print initial surface
72-
geometry->saveSurfaceMesh("DRAM_Initial.vtp");
79+
geometry->saveSurfaceMesh("DRAM_Initial_" + fluxEngineStr + ".vtp");
7380

7481
const int numSteps = params.get("numSteps");
7582
for (int i = 0; i < numSteps; ++i) {
7683
process.apply();
77-
geometry->saveSurfaceMesh("DRAM_Etched_" + std::to_string(i + 1) + ".vtp");
84+
geometry->saveSurfaceMesh("DRAM_Etched_" + fluxEngineStr + "_" +
85+
std::to_string(i + 1) + ".vtp");
7886
}
7987

80-
geometry->saveHullMesh("DRAM_Final");
88+
geometry->saveHullMesh("DRAM_Final_" + fluxEngineStr);
8189

8290
return 0;
8391
}

examples/DRAMWiggling/DRAMWiggling.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@
3535
# Add plane
3636
ps.MakePlane(geometry, 0.0, ps.Material.Si, True).apply()
3737

38+
# print intermediate output surfaces during the process
39+
ps.Logger.setLogLevel(ps.LogLevel.INFO)
40+
3841
ps.Length.setUnit(params["lengthUnit"])
3942
ps.Time.setUnit(params["timeUnit"])
4043

@@ -46,33 +49,38 @@
4649
modelParams.Ions.sigmaEnergy = params["sigmaEnergy"]
4750
modelParams.Ions.exponent = params["ionExponent"]
4851
modelParams.Ions.n_l = 200
49-
modelParams.Substrate.B_sp = 0.75
5052
model = ps.HBrO2Etching(modelParams)
5153

5254
coverageParameters = ps.CoverageParameters()
53-
coverageParameters.maxIterations = 10
55+
coverageParameters.tolerance = 1e-5
5456

5557
rayTracingParams = ps.RayTracingParameters()
5658
rayTracingParams.raysPerPoint = int(params["raysPerPoint"])
5759

5860
advectionParams = ps.AdvectionParameters()
59-
advectionParams.spatialScheme = ps.util.convertSpatialScheme(params["spatialScheme"])
61+
advectionParams.spatialScheme = ps.util.convertSpatialScheme(
62+
params["spatialScheme"]
63+
)
64+
65+
fluxEngineStr = params["fluxEngine"]
66+
fluxEngine = ps.util.convertFluxEngineType(fluxEngineStr)
6067

6168
# process setup
6269
process = ps.Process(geometry, model)
6370
process.setProcessDuration(params["processTime"]) # seconds
6471
process.setParameters(coverageParameters)
6572
process.setParameters(rayTracingParams)
6673
process.setParameters(advectionParams)
74+
process.setFluxEngineType(fluxEngine)
6775

6876
# print initial surface
69-
geometry.saveSurfaceMesh(filename="DRAM_Initial.vtp")
77+
geometry.saveSurfaceMesh(filename=f"DRAM_Initial_{fluxEngineStr}.vtp")
7078

7179
numSteps = int(params["numSteps"])
7280
for i in range(numSteps):
7381
# run the process
7482
process.apply()
75-
geometry.saveSurfaceMesh(filename=f"DRAM_Etched_{i + 1}.vtp")
83+
geometry.saveSurfaceMesh(filename=f"DRAM_Etched_{fluxEngineStr}_{i + 1}.vtp")
7684

7785
# print final volume
78-
geometry.saveHullMesh("DRAM_Final")
86+
geometry.saveHullMesh(f"DRAM_Final_{fluxEngineStr}")

examples/DRAMWiggling/config.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,6 @@ spatialScheme=LF_2
2121

2222
numSteps=20
2323
raysPerPoint=1000
24+
fluxEngine=CD
25+
2426
gdsFile=wiggle_full.gds

include/viennaps/process/psFluxEngine.hpp

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -6,36 +6,6 @@
66

77
namespace viennaps {
88

9-
enum class FluxEngineType {
10-
// Platform, Surface representation
11-
AUTO, // Automatic selection
12-
CPU_DISK, // CPU, Disk-based
13-
CPU_TRIANGLE, // CPU, Triangle-based
14-
GPU_DISK, // GPU, Disk-based
15-
GPU_TRIANGLE, // GPU, Triangle-based
16-
GPU_LINE, // GPU, Line-based
17-
// GPU_LEVEL_SET // Future implementations
18-
};
19-
20-
inline std::string to_string(const FluxEngineType type) {
21-
switch (type) {
22-
case FluxEngineType::AUTO:
23-
return "AUTO";
24-
case FluxEngineType::CPU_DISK:
25-
return "CPU_DISK";
26-
case FluxEngineType::CPU_TRIANGLE:
27-
return "CPU_TRIANGLE";
28-
case FluxEngineType::GPU_TRIANGLE:
29-
return "GPU_TRIANGLE";
30-
case FluxEngineType::GPU_DISK:
31-
return "GPU_DISK";
32-
case FluxEngineType::GPU_LINE:
33-
return "GPU_LINE";
34-
default:
35-
return "UNKNOWN";
36-
}
37-
}
38-
399
template <typename NumericType, int D> class FluxEngine {
4010
protected:
4111
viennacore::Timer<> timer_;

include/viennaps/psUtil.hpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,17 @@
1212

1313
#include "psMaterials.hpp"
1414

15+
namespace viennaps {
16+
enum class FluxEngineType {
17+
AUTO, // Automatic selection
18+
CPU_DISK, // CPU, Disk-based
19+
CPU_TRIANGLE, // CPU, Triangle-based
20+
GPU_DISK, // GPU, Disk-based
21+
GPU_TRIANGLE, // GPU, Triangle-based
22+
GPU_LINE // GPU, Line-based
23+
};
24+
}
25+
1526
// Use viennacore here to avoid conflicts with other namespaces
1627
namespace viennacore::util {
1728
[[nodiscard]] inline viennals::SpatialSchemeEnum
@@ -63,6 +74,23 @@ convertIntegrationScheme(const std::string &s) {
6374
return convertSpatialScheme(s);
6475
}
6576

77+
[[nodiscard]] inline viennaps::FluxEngineType
78+
convertFluxEngineType(const std::string &s) {
79+
if (s == "AUTO")
80+
return viennaps::FluxEngineType::AUTO;
81+
if (s == "CPU_DISK" || s == "CD")
82+
return viennaps::FluxEngineType::CPU_DISK;
83+
if (s == "CPU_TRIANGLE" || s == "CT")
84+
return viennaps::FluxEngineType::CPU_TRIANGLE;
85+
if (s == "GPU_DISK" || s == "GD")
86+
return viennaps::FluxEngineType::GPU_DISK;
87+
if (s == "GPU_TRIANGLE" || s == "GT")
88+
return viennaps::FluxEngineType::GPU_TRIANGLE;
89+
if (s == "GPU_LINE" || s == "GL")
90+
return viennaps::FluxEngineType::GPU_LINE;
91+
throw std::invalid_argument("Unknown FluxEngineType: " + s);
92+
}
93+
6694
[[nodiscard]] inline viennals::TemporalSchemeEnum
6795
convertTemporalScheme(const std::string &s) {
6896
if (s == "FORWARD_EULER" || s == "FE")
@@ -106,6 +134,26 @@ convertSpatialSchemeToString(viennals::SpatialSchemeEnum scheme) {
106134
}
107135
}
108136

137+
[[nodiscard]] inline std::string
138+
convertFluxEngineTypeToString(viennaps::FluxEngineType type) {
139+
switch (type) {
140+
case viennaps::FluxEngineType::AUTO:
141+
return "AUTO";
142+
case viennaps::FluxEngineType::CPU_DISK:
143+
return "CPU_DISK";
144+
case viennaps::FluxEngineType::CPU_TRIANGLE:
145+
return "CPU_TRIANGLE";
146+
case viennaps::FluxEngineType::GPU_DISK:
147+
return "GPU_DISK";
148+
case viennaps::FluxEngineType::GPU_TRIANGLE:
149+
return "GPU_TRIANGLE";
150+
case viennaps::FluxEngineType::GPU_LINE:
151+
return "GPU_LINE";
152+
default:
153+
return "UNKNOWN";
154+
}
155+
}
156+
109157
[[nodiscard]] inline std::string
110158
convertTemporalSchemeToString(viennals::TemporalSchemeEnum scheme) {
111159
switch (scheme) {
@@ -151,6 +199,8 @@ template <typename T> [[nodiscard]] std::string toString(const T &value) {
151199
else if constexpr (std::is_same_v<T, viennaps::Material>) {
152200
std::string mat = viennaps::to_string_view(value);
153201
return mat;
202+
} else if constexpr (std::is_same_v<T, viennaps::FluxEngineType>) {
203+
return convertFluxEngineTypeToString(value);
154204
} else if constexpr (std::is_same_v<T, std::string>)
155205
return value;
156206
else
@@ -178,3 +228,9 @@ hexToRGBArray(const uint32_t hexColor) {
178228
return rgb;
179229
}
180230
}; // namespace viennacore::util
231+
232+
namespace viennaps {
233+
[[nodiscard]] inline std::string to_string(FluxEngineType type) {
234+
return viennacore::util::convertFluxEngineTypeToString(type);
235+
}
236+
} // namespace viennaps

python/pyWrap.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,8 @@ PYBIND11_MODULE(VIENNAPS_MODULE_NAME, module) {
594594
"Convert a string to an discretization scheme.");
595595
// convertIntegrationScheme is deprecated
596596
m_util.attr("convertIntegrationScheme") = m_util.attr("convertSpatialScheme");
597+
m_util.def("convertFluxEngineType", &util::convertFluxEngineType,
598+
"Convert a string to a flux engine type.");
597599
m_util.def("convertTemporalScheme", &util::convertTemporalScheme,
598600
"Convert a string to a time integration scheme.");
599601

0 commit comments

Comments
 (0)