Skip to content

Commit

Permalink
Revert: seperate ion flux and yield
Browse files Browse the repository at this point in the history
  • Loading branch information
tobre1 committed Jan 15, 2025
1 parent 514e714 commit cfbbd99
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 32 deletions.
6 changes: 3 additions & 3 deletions examples/holeEtching/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ taperAngle=1.5 # degree
# Process parameters
processTime=50 # seconds

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

ionExponent=200
meanEnergy=100 # eV
Expand All @@ -30,4 +30,4 @@ integrationScheme=EO_1

raysPerPoint=1000

outputFile=final
outputFile=final
49 changes: 20 additions & 29 deletions include/viennaps/models/psSF6O2Etching.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,8 @@ class SF6O2SurfaceModel : public SurfaceModel<NumericType> {
const auto numPoints = rates->getScalarData(0)->size();
std::vector<NumericType> etchRate(numPoints, 0.);

const auto ionEnhancedYield = rates->getScalarData("ionEnhancedYield");
const auto ionSputterYield = rates->getScalarData("ionSputterYield");
const auto ionFlux = rates->getScalarData("ionFlux");
const auto ionEnhancedFlux = rates->getScalarData("ionEnhancedFlux");
const auto ionSputterFlux = rates->getScalarData("ionSputterFlux");

const auto etchantFlux = rates->getScalarData("etchantFlux");
const auto eCoverage = coverages->getScalarData("eCoverage");
Expand All @@ -138,10 +137,9 @@ class SF6O2SurfaceModel : public SurfaceModel<NumericType> {
break;
}

const auto sputterRate =
ionSputterYield->at(i) * ionFlux->at(i) * params.ionFlux;
const auto ionEnhancedRate = eCoverage->at(i) * ionEnhancedYield->at(i) *
ionFlux->at(i) * params.ionFlux;
const auto sputterRate = ionSputterFlux->at(i) * params.ionFlux;
const auto ionEnhancedRate =
eCoverage->at(i) * ionEnhancedFlux->at(i) * params.ionFlux;
const auto chemicalRate = params.Si.k_sigma * eCoverage->at(i) / 4.;

if (MaterialMap::isMaterial(materialIds[i], Material::Mask)) {
Expand Down Expand Up @@ -178,10 +176,9 @@ class SF6O2SurfaceModel : public SurfaceModel<NumericType> {
const auto etchantFlux = rates->getScalarData("etchantFlux");
const auto oxygenFlux = rates->getScalarData("oxygenFlux");

const auto ionEnhancedYield = rates->getScalarData("ionEnhancedYield");
const auto ionEnhancedPassivationYield =
rates->getScalarData("ionEnhancedPassivationYield");
const auto ionFlux = rates->getScalarData("ionFlux");
const auto ionEnhancedFlux = rates->getScalarData("ionEnhancedFlux");
const auto ionEnhancedPassivationFlux =
rates->getScalarData("ionEnhancedPassivationFlux");

// etchant fluorine coverage
auto eCoverage = coverages->getScalarData("eCoverage");
Expand All @@ -193,9 +190,8 @@ class SF6O2SurfaceModel : public SurfaceModel<NumericType> {
for (size_t i = 0; i < numPoints; ++i) {
auto Gb_F = etchantFlux->at(i) * params.etchantFlux * params.beta_F;
auto Gb_O = oxygenFlux->at(i) * params.oxygenFlux * params.beta_O;
auto GY_ie = ionEnhancedYield->at(i) * ionFlux->at(i) * params.ionFlux;
auto GY_o =
ionEnhancedPassivationYield->at(i) * ionFlux->at(i) * params.ionFlux;
auto GY_ie = ionEnhancedFlux->at(i) * params.ionFlux;
auto GY_o = ionEnhancedPassivationFlux->at(i) * params.ionFlux;

auto a = (params.Si.k_sigma + 2 * GY_ie) / Gb_F;
auto b = (params.Si.beta_sigma + GY_o) / Gb_O;
Expand All @@ -222,7 +218,6 @@ class SF6SurfaceModel : public SF6O2SurfaceModel<NumericType, D> {

const auto etchantFlux = rates->getScalarData("etchantFlux");
const auto ionEnhancedYield = rates->getScalarData("ionEnhancedYield");
const auto ionFlux = rates->getScalarData("ionFlux");

// etchant fluorine coverage
auto eCoverage = coverages->getScalarData("eCoverage");
Expand All @@ -233,9 +228,9 @@ class SF6SurfaceModel : public SF6O2SurfaceModel<NumericType, D> {
eCoverage->at(i) = 0;
} else {
double tmp =
1 + (params.Si.k_sigma + 2 * ionEnhancedYield->at(i) *
ionFlux->at(i) * params.ionFlux) /
(etchantFlux->at(i) * params.etchantFlux * params.beta_F);
1 +
(params.Si.k_sigma + 2 * ionEnhancedYield->at(i) * params.ionFlux) /
(etchantFlux->at(i) * params.etchantFlux * params.beta_F);
eCoverage->at(i) = 1 / tmp;
}
}
Expand Down Expand Up @@ -297,17 +292,14 @@ class SF6O2Ion
assert(Y_Si >= 0. && "Invalid yield");
assert(Y_O >= 0. && "Invalid yield");

// sputtering yield Y_sp ionSputteringRate
localData.getVectorData(0)[primID] += Y_sp;

// ion enhanced etching yield Y_Si ionEnhancedRate
localData.getVectorData(1)[primID] += Y_Si;
// sputtering yield Y_sp ionSputterFlux
localData.getVectorData(0)[primID] += Y_sp * rayWeight;

// ion enhanced O sputtering yield Y_O ionEnhancedPassivationYield
localData.getVectorData(2)[primID] += Y_O;
// ion enhanced etching yield Y_Si ionEnhancedFlux
localData.getVectorData(1)[primID] += Y_Si * rayWeight;

// ion flux
localData.getVectorData(3)[primID] += rayWeight;
// ion enhanced O sputtering yield Y_O ionEnhancedPassivationFlux
localData.getVectorData(2)[primID] += Y_O * rayWeight;
}

std::pair<NumericType, Vec3D<NumericType>>
Expand Down Expand Up @@ -372,8 +364,7 @@ class SF6O2Ion
return params.Ions.exponent;
}
std::vector<std::string> getLocalDataLabels() const override final {
return {"ionSputterYield", "ionEnhancedYield",
"ionEnhancedPassivationYield", "ionFlux"};
return {"ionSputterFlux", "ionEnhancedFlux", "ionEnhancedPassivationFlux"};
}

private:
Expand Down

0 comments on commit cfbbd99

Please sign in to comment.