Skip to content

Commit

Permalink
SF6O2 model which replicates Josip's results
Browse files Browse the repository at this point in the history
  • Loading branch information
FilipovicLado committed Jan 30, 2025
1 parent a3d47d7 commit 6791d6c
Show file tree
Hide file tree
Showing 7 changed files with 181 additions and 39 deletions.
31 changes: 31 additions & 0 deletions examples/holeEtching/44/config.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Config file for a hole etching example process

# all length units are in micrometers (um)
# Geometry
holeShape = Quarter
# Domain
gridDelta=45.0 # nm
xExtent=2000.0 # nm
yExtent=2000.0 # nm

# Geometry
holeRadius=350.0 # nm
maskHeight=1200.0 # nm
taperAngle=2.39 # degree

# Process parameters
processTime=150 # seconds

# all flux values are units 1e15 / cm²
ionFlux=10.
etchantFlux=5500.
oxygenFlux=200.

ionExponent=1000
meanEnergy=120 # eV
sigmaEnergy=10 # eV
A_O=2 # passivation layer sputtering coefficient

etchStopDepth=-10000 # maximum etching depth

raysPerPoint=1000
31 changes: 31 additions & 0 deletions examples/holeEtching/50/config.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Config file for a hole etching example process

# all length units are in micrometers (um)
# Geometry
holeShape = Quarter
# Domain
gridDelta=45.0 # nm
xExtent=2000.0 # nm
yExtent=2000.0 # nm

# Geometry
holeRadius=350.0 # nm
maskHeight=1200.0 # nm
taperAngle=2.39 # degree

# Process parameters
processTime=150 # seconds

# all flux values are units 1e15 / cm²
ionFlux=10.
etchantFlux=5000.
oxygenFlux=300.

ionExponent=1000
meanEnergy=120 # eV
sigmaEnergy=10 # eV
A_O=2 # passivation layer sputtering coefficient

etchStopDepth=-10000 # maximum etching depth

raysPerPoint=1000
31 changes: 31 additions & 0 deletions examples/holeEtching/56/config.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Config file for a hole etching example process

# all length units are in micrometers (um)
# Geometry
holeShape = Quarter
# Domain
gridDelta=45.0 # nm
xExtent=2000.0 # nm
yExtent=2000.0 # nm

# Geometry
holeRadius=350.0 # nm
maskHeight=1200.0 # nm
taperAngle=2.39 # degree

# Process parameters
processTime=150 # seconds

# all flux values are units 1e15 / cm²
ionFlux=10.
etchantFlux=4000.
oxygenFlux=1000.

ionExponent=1000
meanEnergy=120 # eV
sigmaEnergy=10 # eV
A_O=2 # passivation layer sputtering coefficient

etchStopDepth=-10000 # maximum etching depth

raysPerPoint=1000
31 changes: 31 additions & 0 deletions examples/holeEtching/62/config.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Config file for a hole etching example process

# all length units are in micrometers (um)
# Geometry
holeShape = Quarter
# Domain
gridDelta=45.0 # nm
xExtent=2000.0 # nm
yExtent=2000.0 # nm

# Geometry
holeRadius=350.0 # nm
maskHeight=1200.0 # nm
taperAngle=2.39 # degree

# Process parameters
processTime=150 # seconds

# all flux values are units 1e15 / cm²
ionFlux=10.
etchantFlux=3000.
oxygenFlux=1500.

ionExponent=1000
meanEnergy=120 # eV
sigmaEnergy=10 # eV
A_O=2 # passivation layer sputtering coefficient

etchStopDepth=-10000 # maximum etching depth

raysPerPoint=1000
30 changes: 16 additions & 14 deletions examples/holeEtching/config.txt
Original file line number Diff line number Diff line change
@@ -1,29 +1,31 @@
# Config file for a hole etching example process

# all length units are in micrometers (um)
# Geometry
holeShape = Quarter
# Domain
gridDelta=4.0 # um
xExtent=100.0 # um
yExtent=100.0 # um
gridDelta=45.0 # nm
xExtent=2000.0 # nm
yExtent=2000.0 # nm

# Geometry
holeRadius=20.0 # um
maskHeight=20.0 # um
taperAngle=0.0 # degree
holeRadius=350.0 # nm
maskHeight=1200.0 # nm
taperAngle=2.39 # degree

# Process parameters
processTime=150 # seconds

# all flux values are units 1e16 / cm²
ionFlux=1.
etchantFlux=180.
oxygenFlux=30.
# all flux values are units 1e15 / cm²
ionFlux=10.
etchantFlux=3000.
oxygenFlux=1500.

ionExponent=200
meanEnergy=100 # eV
ionExponent=1000
meanEnergy=120 # eV
sigmaEnergy=10 # eV
A_O=3 # passivation layer sputtering coefficient
A_O=2 # passivation layer sputtering coefficient

etchStopDepth=-1000 # maximum etching depth
etchStopDepth=-10000 # maximum etching depth

raysPerPoint=1000
28 changes: 21 additions & 7 deletions examples/holeEtching/holeEtching.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,17 @@

params = vps.ReadConfigFile(args.filename)

# print intermediate output surfaces during the process
vps.Logger.setLogLevel(vps.LogLevel.INTERMEDIATE)
# print error output surfaces during the process
vps.Logger.setLogLevel(vps.LogLevel.INFO)

# Map the shape string to the corresponding vps.HoleShape enum
shape_map = {
"Full": vps.HoleShape.Full,
"Half": vps.HoleShape.Half,
"Quarter": vps.HoleShape.Quarter,
}

hole_shape_str = params.get("holeShape", "Full").strip()

# geometry setup, all units in um
geometry = vps.Domain()
Expand All @@ -29,6 +38,8 @@
holeRadius=params["holeRadius"],
holeDepth=params["maskHeight"],
taperingAngle=params["taperAngle"],
holeShape=shape_map[hole_shape_str],
periodicBoundary=False,
makeMask=True,
material=vps.Material.Si,
).apply()
Expand All @@ -44,21 +55,24 @@
etchStopDepth=params["etchStopDepth"],
)
parameters = model.getParameters()
parameters.Mask.rho = 100.
parameters.Mask.rho = 2.6

# process setup
process = vps.Process()
process.setDomain(geometry)
process.setProcessModel(model)
process.setMaxCoverageInitIterations(10)
process.setNumberOfRaysPerPoint(int(params["raysPerPoint"]))
process.setProcessDuration(params["processTime"]) # seconds

process.setProcessDuration(params["processTime"]/10) # seconds
process.setTimeStepRatio(0.2)
# print initial surface
geometry.saveSurfaceMesh(filename="initial.vtp", addMaterialIds=True)

# run the process
process.apply()
for i in range (1,11):
# run the process
process.apply()
# print intermediate surface
geometry.saveSurfaceMesh(filename=f"intermediate_{i}.vtp", addMaterialIds=True)

# print final surface
geometry.saveSurfaceMesh(filename="final.vtp", addMaterialIds=True)
38 changes: 20 additions & 18 deletions include/viennaps/models/psSF6O2Etching.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,12 @@ template <typename NumericType> struct SF6O2Parameters {

// Mask
struct MaskType {
NumericType rho = 500.; // 1e22 atoms/cm³
NumericType beta_F = 0.01;
NumericType beta_O = 0.1;
NumericType rho = 2.6e22; //500.; // 1e22 atoms/cm³
NumericType beta_F = 0.7; //0.01;
NumericType beta_O = 1.; //0.1;

NumericType Eth_sp = 20.; // eV
NumericType A_sp = 0.0139;
NumericType Eth_sp = 0.; //20.; // eV
NumericType A_sp = 0.3; //0.0139;
NumericType B_sp = 9.3;
} Mask;

Expand All @@ -41,11 +41,11 @@ template <typename NumericType> struct SF6O2Parameters {
NumericType rho = 5.02; // 1e22 atoms/cm³

// sputtering coefficients
NumericType Eth_sp = 20.; // eV
NumericType Eth_ie = 4.; // eV
NumericType Eth_sp = 0.; //20.; // eV
NumericType Eth_ie = 15.; //4.; // eV
NumericType A_sp = 0.0337;
NumericType B_sp = 9.3;
NumericType A_ie = 0.0361;
NumericType A_ie = 7.; //0.0361;

// chemical etching
NumericType k_sigma = 3.0e2; // in (1e15 cm⁻²s⁻¹)
Expand All @@ -55,13 +55,13 @@ template <typename NumericType> struct SF6O2Parameters {
// Passivation
struct PassivationType {
// sputtering coefficients
NumericType Eth_ie = 4.; // eV
NumericType A_ie = 0.0361;
NumericType Eth_ie = 15.; // 4.; // eV
NumericType A_ie = 3.; //0.3; //0.0361;
} Passivation;

struct IonType {
NumericType meanEnergy = 100.; // eV
NumericType sigmaEnergy = 10.; // eV
NumericType sigmaEnergy = 40.; // eV
NumericType exponent = 500.;

NumericType inflectAngle = 1.55334303;
Expand Down Expand Up @@ -114,8 +114,8 @@ class SF6O2SurfaceModel : public SurfaceModel<NumericType> {
}

if (MaterialMap::isMaterial(materialIds[i], Material::Mask)) {
etchRate[i] =
-(1 / params.Mask.rho) * ionSputteringRate->at(i) * params.ionFlux;
etchRate[i] = 0.;
// -(1 / params.Mask.rho) * ionSputteringRate->at(i) * params.ionFlux;
} else {
etchRate[i] =
-(1 / params.Si.rho) * (params.Si.k_sigma * eCoverage->at(i) / 4. +
Expand Down Expand Up @@ -244,7 +244,7 @@ class SF6O2Ion
if (cosTheta > 0.5) {
f_ie_theta = 1.;
} else {
f_ie_theta = 3. - 6. * angle / M_PI;
f_ie_theta = std::max(3. - 6. * angle / M_PI, 0.);
}
NumericType A_sp = params.Si.A_sp;
NumericType B_sp = params.Si.B_sp;
Expand All @@ -258,7 +258,7 @@ class SF6O2Ion
NumericType f_sp_theta = (1 + B_sp * (1 - cosTheta * cosTheta)) * cosTheta;

double sqrtE = std::sqrt(E);
NumericType Y_sp =
NumericType Y_sp =
params.Si.A_sp * std::max(sqrtE - std::sqrt(Eth_sp), 0.) * f_sp_theta;
NumericType Y_Si = params.Si.A_ie *
std::max(sqrtE - std::sqrt(params.Si.Eth_ie), 0.) *
Expand Down Expand Up @@ -317,7 +317,7 @@ class SF6O2Ion
if (NewEnergy > params.Si.Eth_ie) {
E = NewEnergy;
auto direction = viennaray::ReflectionConedCosine<NumericType, D>(
rayDir, geomNormal, Rng, std::max(incAngle, params.Ions.minAngle));
rayDir, geomNormal, Rng, M_PI_2 - std::min(incAngle, params.Ions.minAngle));//std::max(incAngle, params.Ions.minAngle));
return std::pair<NumericType, Vec3D<NumericType>>{0., direction};
} else {
return std::pair<NumericType, Vec3D<NumericType>>{
Expand Down Expand Up @@ -412,11 +412,13 @@ class SF6Etchant

// F surface coverage
const auto &phi_F = globalData->getVectorData(0)[primID];
// O surface coverage
const auto &phi_O = globalData->getVectorData(1)[primID];
// Obtain the sticking probability
NumericType beta = params.beta_F;
if (MaterialMap::isMaterial(materialId, Material::Mask))
beta = params.Mask.beta_F;
NumericType S_eff = beta * std::max(1. - phi_F, 0.);
NumericType S_eff = beta * std::max(1. - phi_F - phi_O, 0.);

auto direction =
viennaray::ReflectionDiffuse<NumericType, D>(geomNormal, rngState);
Expand Down Expand Up @@ -485,7 +487,7 @@ class SF6O2Etching : public ProcessModel<NumericType, D> {
const double oxygenFlux, const NumericType meanEnergy /* eV */,
const NumericType sigmaEnergy /* eV */, // 5 parameters
const NumericType ionExponent = 300.,
const NumericType oxySputterYield = 2.,
const NumericType oxySputterYield = 3.,
const NumericType etchStopDepth =
std::numeric_limits<NumericType>::lowest()) {
params.ionFlux = ionFlux;
Expand Down

0 comments on commit 6791d6c

Please sign in to comment.