Isotropic Process
#include <psIsotropicProcess.hpp>
An isotropic etching or deposition process initiates across all materials in the domain, excluding the masking material, which is by default set to Material::None
. The default setting means, that the process unfolds uniformly across all materials within the domain. When the rate is less than 0, the material undergoes etching. Conversely, when the rate exceeds 0, material deposition occurs in accordance with the material of the top level set. If you want to deposit a new material, make sure to call the function duplicateTopLevelSet
in your domain instance.
psIsotropicProcess(const NumericType rate,
const Material maskMaterial = Material::None)
Parameter | Description | Type |
---|---|---|
rate | Rate of the process. | NumericType |
maskMaterial | Material that does not participate in the process. | Material |
Deposition example:
C++
#include <psIsotropicProcess.hpp>
#include <psMakeTrench.hpp>
#include <psProcess.hpp>
using namespace viennaps;
int main() {
using NumericType = double;
constexpr int D = 2;
auto domain = SmartPointer<Domain<NumericType, D>>::New();
MakeTrench<NumericType, D>(domain, 0.1 /*gridDelta*/, 20. /*xExtent*/,
20. /*yExtent*/, 10. /*trenchWidth*/,
10. /*trenchDepth*/, 0., 0., false, false,
Material::Si)
.apply();
// duplicate top layer to capture deposition
domain->duplicateTopLevelSet(Material::SiO2);
auto model = SmartPointer<IsotropicProcess<NumericType, D>>::New(
0.1 /*rate*/, Material::None);
domain->saveVolumeMesh("trench_initial");
Process<NumericType, D>(domain, model, 20.).apply(); // run process for 20s
domain->saveVolumeMesh("trench_final");
}
Python
import viennaps2d as vps
domain = vps.Domain()
vps.MakeTrench(domain=domain,
gridDelta=0.1,
xExtent=20.0,
yExtent=20.0,
trenchWidth=10.0,
trenchDepth=10.0,
taperingAngle=0.0,
baseHeight=0.0,
periodicBoundary=False,
makeMask=False,
material=vps.Material.Si
).apply()
# duplicate top layer to capture deposition
domain.duplicateTopLevelSet(vps.Material.SiO2)
model = vps.IsotropicProcess(rate=0.1)
domain.saveVolumeMesh("trench_initial")
vps.Process(domain, model, 20.0).apply()
domain.saveVolumeMesh("trench_final")
Results:
Etching example:
C++
#include <psIsotropicProcess.hpp>
#include <psMakeTrench.hpp>
#include <psProcess.hpp>
using namespace viennaps;
int main() {
using NumericType = double;
constexpr int D = 2;
auto domain = SmartPointer<Domain<NumericType, D>>::New();
MakeTrench<NumericType, D>(domain, 0.1 /*gridDelta*/, 20. /*xExtent*/,
20. /*yExtent*/, 5. /*trenchWidth*/,
5. /*trenchDepth*/, 0., 0., false, true /*makeMask*/,
Material::Si)
.apply();
auto model = SmartPointer<IsotropicProcess<NumericType, D>>::New(
-0.1 /*rate*/, Material::Mask);
domain->saveVolumeMesh("trench_initial");
Process<NumericType, D>(domain, model, 50.).apply(); // run process for 20s
domain->saveVolumeMesh("trench_final");
}
Python
import viennaps2d as vps
domain = vps.Domain()
vps.MakeTrench(domain=domain,
gridDelta=0.1,
xExtent=20.0,
yExtent=20.0,
trenchWidth=5.0,
trenchDepth=5.0,
taperingAngle=0.0,
baseHeight=0.0,
periodicBoundary=False,
makeMask=True,
material=vps.Material.Si
).apply()
model = vps.IsotropicProcess(rate=-0.1, maskMaterial=vps.Material.Mask)
domain.saveVolumeMesh("trench_initial", True)
vps.Process(domain, model, 50.0).apply()
domain.saveVolumeMesh("trench_final", True)