Isotropic Process
#include <psIsotropicProcess.hpp>
An isotropic etching or deposition process moves the surface with a material-dependent normal velocity. A negative rate etches the material, while a positive rate deposits the material of the top level set. To deposit a different material, call duplicateTopLevelSet on the domain before running the process.
The simplest constructor applies one default rate to all materials and optionally masks one or more materials by assigning them a rate of 0. For selective processes, material-specific rates can be passed directly with a default fallback rate for all other materials.
IsotropicProcess(NumericType isotropicRate,
Material maskMaterial = Material::Undefined)
IsotropicProcess(NumericType isotropicRate,
const std::vector<Material> &maskMaterials)
IsotropicProcess(std::unordered_map<Material, NumericType> materialRates,
NumericType defaultRate = 0.)
| Parameter | Description | Type |
|---|---|---|
isotropicRate | Default rate of the process. | NumericType |
maskMaterial | Material that does not participate in the process. Defaults to Material::Undefined. | Material |
maskMaterials | Materials that do not participate in the process. | std::vector<Material> |
materialRates | Material-specific process rates. | std::unordered_map<Material, NumericType> |
defaultRate | Fallback rate for materials not listed in materialRates. | NumericType |
Material rates can also be changed after construction:
void setIsotropicRate(NumericType isotropicRate)
void setMaterialRate(Material material, NumericType rate)
| Method | Description |
|---|---|
setIsotropicRate | Updates the default isotropic rate used for materials without a specific rate. |
setMaterialRate | Sets or updates the rate for one material. Use a rate of 0 to mask that material. |
Material-specific example:
C++
std::unordered_map<Material, NumericType> rates = {
{Material::Si, -1.0},
{Material::SiO2, -0.2},
{Material::Mask, 0.0},
};
auto model = SmartPointer<IsotropicProcess<NumericType, D>>::New(
rates, 0.0 /*defaultRate*/);
Python
rates = {
vps.Material.Si: -1.0,
vps.Material.SiO2: -0.2,
vps.Material.Mask: 0.0,
}
model = vps.IsotropicProcess(materialRates=rates, defaultRate=0.0)
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 = 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*/);
domain->saveVolumeMesh("trench_initial");
Process<NumericType, D>(domain, model, 20.).apply(); // run process for 20s
domain->saveVolumeMesh("trench_final");
}
Python
import viennaps 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 viennaps 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)
