Isotropic Process

#include <psIsotropicProcess.hpp>

An isotropic etching or deposition process applies to all materials in the domain except the mask material, which defaults to Material::Undefined (no mask). 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.

psIsotropicProcess(const NumericType rate,
                   const Material maskMaterial = Material::Undefined)
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)