|
| 1 | +#include <geometries/psMakeHole.hpp> |
| 2 | +#include <models/psSF6O2Etching.hpp> |
| 3 | + |
| 4 | +#include <process/psProcess.hpp> |
| 5 | +#include <psUtil.hpp> |
| 6 | + |
| 7 | +using namespace viennaps; |
| 8 | + |
| 9 | +int main(int argc, char *argv[]) { |
| 10 | + using NumericType = double; |
| 11 | + constexpr int D = 2; |
| 12 | + |
| 13 | + Logger::setLogLevel(LogLevel::WARNING); |
| 14 | + // set parameter units |
| 15 | + units::Length::setUnit("um"); |
| 16 | + units::Time::setUnit("min"); |
| 17 | + |
| 18 | + auto run = [&](FluxEngineType fluxEngine) { |
| 19 | + // geometry setup |
| 20 | + auto geometry = Domain<NumericType, D>::New( |
| 21 | + 0.03, 1.0, |
| 22 | + BoundaryType::REFLECTIVE_BOUNDARY); // gridDelta, xExtent, boundary |
| 23 | + MakeHole<NumericType, D>(geometry, 0.175, |
| 24 | + 0.0, // holeDepth |
| 25 | + 0.0, // holeTaperAngle |
| 26 | + 1.2, 1.193, HoleShape::QUARTER) |
| 27 | + .apply(); |
| 28 | + |
| 29 | + // use pre-defined model SF6O2 etching model |
| 30 | + auto modelParams = SF6O2Etching<NumericType, D>::defaultParameters(); |
| 31 | + modelParams.beta_E[static_cast<int>(Material::Si)] = 1.0; |
| 32 | + modelParams.beta_E[static_cast<int>(Material::Mask)] = 1.0; |
| 33 | + modelParams.beta_P[static_cast<int>(Material::Si)] = 1.0; |
| 34 | + modelParams.beta_P[static_cast<int>(Material::Mask)] = 1.0; |
| 35 | + |
| 36 | + modelParams.ionFlux = 1.; |
| 37 | + modelParams.etchantFlux = 4.5e3; |
| 38 | + modelParams.passivationFlux = 8e2; |
| 39 | + modelParams.Ions.meanEnergy = 100; |
| 40 | + modelParams.Ions.sigmaEnergy = 10; |
| 41 | + modelParams.Ions.exponent = 1000; |
| 42 | + modelParams.Passivation.A_ie = 2.0; |
| 43 | + modelParams.Substrate.A_ie = 7; |
| 44 | + auto model = SmartPointer<SF6O2Etching<NumericType, D>>::New(modelParams); |
| 45 | + |
| 46 | + CoverageParameters coverageParams; |
| 47 | + coverageParams.tolerance = 1e-4; |
| 48 | + |
| 49 | + RayTracingParameters rayTracingParams; |
| 50 | + rayTracingParams.raysPerPoint = 10000; |
| 51 | + |
| 52 | + Process<NumericType, D> process(geometry, model); |
| 53 | + process.setProcessDuration(1.0); |
| 54 | + process.setParameters(coverageParams); |
| 55 | + process.setFluxEngineType(fluxEngine); |
| 56 | + process.setParameters(rayTracingParams); |
| 57 | + |
| 58 | + process.apply(); |
| 59 | + |
| 60 | + geometry->saveSurfaceMesh("PlasmaEtching_" + util::toString(fluxEngine)); |
| 61 | + }; |
| 62 | + |
| 63 | + run(FluxEngineType::GPU_TRIANGLE); |
| 64 | + run(FluxEngineType::GPU_DISK); |
| 65 | + run(FluxEngineType::CPU_TRIANGLE); |
| 66 | + run(FluxEngineType::CPU_DISK); |
| 67 | +} |
0 commit comments