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)