Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
1f858ef
Added removeMaterial info when removing top LS layer
FilipovicLado Dec 9, 2025
bd89def
Added WENO 5th order advection scheme
FilipovicLado Dec 10, 2025
1b91423
Reverted back to install script, with ViennaLS default version 5.2.1
FilipovicLado Dec 10, 2025
5c6ca3a
Add option to enable adaptive time stepping during advection
tobre1 Dec 10, 2025
b7fef2e
Add adptive time step threshold
tobre1 Dec 15, 2025
5fddbe9
Update ViennaLS version
tobre1 Dec 15, 2025
04f8fe4
Implement VTK rendering
tobre1 Dec 17, 2025
a36e05b
Add python bindings
tobre1 Dec 17, 2025
f70be9b
Use caching for switch rendering modes
tobre1 Dec 17, 2025
f64c5e3
Screenshot feature
tobre1 Dec 18, 2025
69665e5
renaming integration -> discretization
kenyastyle Dec 18, 2025
684bd7b
Domain offsets
tobre1 Dec 18, 2025
9adde09
Add more features to render window
tobre1 Dec 21, 2025
58d36c0
Add material colors and scalar bar
tobre1 Dec 21, 2025
ab6352a
Hex to RGB util
tobre1 Dec 21, 2025
f4354a9
Fix sphere dist examples
tobre1 Dec 22, 2025
224d88c
Add comments
tobre1 Dec 22, 2025
904395b
Format
tobre1 Dec 23, 2025
c2762a2
Merge branch 'vtk-render' of github.com:ViennaTools/ViennaPS into vtk…
tobre1 Dec 23, 2025
d830d02
Update README
tobre1 Dec 23, 2025
2169435
Merge branch 'vtk-render' of github.com:ViennaTools/ViennaPS into vtk…
tobre1 Dec 23, 2025
7cc9bde
Update advection handler to use RK3 time integration from ViennaLS. …
FilipovicLado Dec 27, 2025
b29e900
Merge remote-tracking branch 'origin/master' into fix_material_interface
FilipovicLado Dec 28, 2025
48b7dd6
Merge remote-tracking branch 'origin/vtk-render' into fix_material_in…
FilipovicLado Dec 28, 2025
7741c2d
Merge remote-tracking branch 'origin/rename' into fix_material_interf…
FilipovicLado Dec 28, 2025
43bbac0
format (newline at the end of CMakeLists.txt)
FilipovicLado Dec 28, 2025
9b0d4b0
Fixed format. Binding errors persist due to ViennaLS version missmatc…
FilipovicLado Dec 28, 2025
ad83400
Adapt ViennaPS to match temporal scheme from the latest ViennaLS commit.
FilipovicLado Dec 29, 2025
20d0357
Allow for calculating intermediate velocities during higher order tim…
FilipovicLado Dec 30, 2025
45992a4
Introduce velocity recalculation during intermediate time integration…
FilipovicLado Dec 30, 2025
5d5db4b
adapted examples, tested against latest ViennaLS build for int-veloci…
FilipovicLado Jan 8, 2026
a5a7611
Merge master into int-velocities
FilipovicLado Jan 9, 2026
8819610
Merge branch 'int-velocities' of https://github.com/ViennaTools/Vienn…
FilipovicLado Jan 9, 2026
1555d19
fix for removeStrayPoints
FilipovicLado Jan 9, 2026
783d5af
revert /python/viennaps/__init__.py
FilipovicLado Jan 9, 2026
8b133e3
format
FilipovicLado Jan 11, 2026
4c37da5
remove GIT_TAG
FilipovicLado Jan 15, 2026
f13eee1
minor fixes
FilipovicLado Jan 15, 2026
e245eb2
Set CMake to use ViennaLS5.5.0 for intermediate velocity calculation …
FilipovicLado Jan 15, 2026
eb77b00
Merge branch 'master' into int-velocities
FilipovicLado Jan 15, 2026
821625b
fix holeEtching config
FilipovicLado Jan 16, 2026
2cb9df4
format
FilipovicLado Jan 16, 2026
ae1919f
format
FilipovicLado Jan 16, 2026
75241e2
avoid caching FetchContent deps on Windows
FilipovicLado Jan 16, 2026
660310b
Revert to caching windows-latest
FilipovicLado Jan 16, 2026
76968fe
Clean FetchContent deps (Windows)
FilipovicLado Jan 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,15 @@ jobs:
- name: 🦥 Cache Dependencies
uses: actions/cache@v4
with:
key: test-${{ matrix.os }}-${{ matrix.config }}
key: test-${{ matrix.os }}-${{ matrix.config }}-${{ hashFiles('CMakeLists.txt', 'cmake/**', 'pyproject.toml') }}
path: build

- name: 🧹 Clean FetchContent deps (Windows)
if: ${{ matrix.os == 'windows-latest' }}
shell: pwsh
run: |
if (Test-Path build/_deps) { Remove-Item -Recurse -Force build/_deps }

- name: 🏗️ Compile
run: cmake -DVIENNAPS_BUILD_TESTS=ON -B build && cmake --build build --config ${{ matrix.config }}

Expand Down
10 changes: 8 additions & 2 deletions .github/workflows/python.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,15 @@ jobs:
- name: 🦥 Cache Dependencies
uses: actions/cache@v4
with:
key: python-${{ matrix.os }}
key: python-${{ matrix.os }}-${{ hashFiles('CMakeLists.txt', 'cmake/**', 'pyproject.toml') }}
path: build

- name: 🧹 Clean FetchContent deps (Windows)
if: ${{ matrix.os == 'windows-latest' }}
shell: pwsh
run: |
if (Test-Path build/_deps) { Remove-Item -Recurse -Force build/_deps }

- name: 🛠️ Disable IPO (Alpine)
if: ${{ matrix.os == 'ubuntu-latest' }}
run: |
Expand Down Expand Up @@ -164,4 +170,4 @@ jobs:
merge-multiple: true

- name: 🚀 Publish Wheels
uses: pypa/gh-action-pypi-publish@release/v1
uses: pypa/gh-action-pypi-publish@release/v1
4 changes: 2 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ include("cmake/cpm.cmake")

CPMAddPackage(
NAME ViennaCore
VERSION 1.9.2
VERSION 1.9.4
GIT_REPOSITORY "https://github.com/ViennaTools/ViennaCore"
EXCLUDE_FROM_ALL ${VIENNAPS_BUILD_PYTHON}
OPTIONS "VIENNACORE_USE_GPU ${VIENNAPS_USE_GPU}")
Expand All @@ -124,7 +124,7 @@ CPMAddPackage(

CPMAddPackage(
NAME ViennaLS
VERSION 5.4.0
VERSION 5.5.0
GIT_REPOSITORY "https://github.com/ViennaTools/ViennaLS"
EXCLUDE_FROM_ALL ${VIENNAPS_BUILD_PYTHON})

Expand Down
2 changes: 2 additions & 0 deletions examples/holeEtching/config.txt
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,7 @@ A_Si=7 # Si yield constant
etchStopDepth=-10 # maximum etching depth
spatialScheme=EO_1
temporalScheme=RK3
fluxEngine=CD

raysPerPoint=1000
outputFile=final.vtp
128 changes: 76 additions & 52 deletions examples/holeEtching/holeEtching.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ using namespace viennaps;

int main(int argc, char *argv[]) {
using NumericType = double;
constexpr int D = 3;
constexpr int D = 2;

omp_set_num_threads(16);
Logger::setLogLevel(LogLevel::ERROR);
omp_set_num_threads(8);

// Parse the parameters
util::Parameters params;
Expand All @@ -30,54 +31,77 @@ int main(int argc, char *argv[]) {
units::Length::setUnit(params.get<std::string>("lengthUnit"));
units::Time::setUnit(params.get<std::string>("timeUnit"));

// geometry setup
auto geometry = Domain<NumericType, D>::New(
params.get("gridDelta"), params.get("xExtent"), params.get("yExtent"));
MakeHole<NumericType, D>(geometry, params.get("holeRadius"),
0.0, // holeDepth
0.0, // holeTaperAngle
params.get("maskHeight"), params.get("taperAngle"),
HoleShape::HALF)
.apply();

// use pre-defined model SF6O2 etching model
auto modelParams = SF6O2Etching<NumericType, D>::defaultParameters();
modelParams.ionFlux = params.get("ionFlux");
modelParams.etchantFlux = params.get("etchantFlux");
modelParams.passivationFlux = params.get("oxygenFlux");
modelParams.Ions.meanEnergy = params.get("meanEnergy");
modelParams.Ions.sigmaEnergy = params.get("sigmaEnergy");
modelParams.Ions.exponent = params.get("ionExponent");
modelParams.Passivation.A_ie = params.get("A_O");
modelParams.Substrate.A_ie = params.get("A_Si");
modelParams.etchStopDepth = params.get("etchStopDepth");
auto model = SmartPointer<SF6O2Etching<NumericType, D>>::New(modelParams);

CoverageParameters coverageParams;
coverageParams.tolerance = 1e-4;

RayTracingParameters rayTracingParams;
rayTracingParams.raysPerPoint = params.get<unsigned>("raysPerPoint");

AdvectionParameters advectionParams;
advectionParams.spatialScheme =
util::convertSpatialScheme(params.get<std::string>("spatialScheme"));
advectionParams.temporalScheme =
util::convertTemporalScheme(params.get<std::string>("temporalScheme"));

// process setup
Process<NumericType, D> process(geometry, model);
process.setProcessDuration(params.get("processTime"));
process.setParameters(coverageParams);
process.setParameters(rayTracingParams);
process.setParameters(advectionParams);

// print initial surface
geometry->saveSurfaceMesh("initial.vtp");

// run the process
process.apply();

// print final surface
geometry->saveSurfaceMesh("final.vtp", true, 0.01, true);
auto runSimulation = [&](bool intermediateVelocities, std::string suffix) {
// geometry setup
auto geometry = Domain<NumericType, D>::New(
params.get("gridDelta"), params.get("xExtent"), params.get("yExtent"));
MakeHole<NumericType, D>(geometry, params.get("holeRadius"),
0.0, // holeDepth
0.0, // holeTaperAngle
params.get("maskHeight"), params.get("taperAngle"),
HoleShape::QUARTER)
.apply();

// use pre-defined model SF6O2 etching model
auto modelParams = SF6O2Etching<NumericType, D>::defaultParameters();
modelParams.ionFlux = params.get("ionFlux");
modelParams.etchantFlux = params.get("etchantFlux");
modelParams.passivationFlux = params.get("oxygenFlux");
modelParams.Ions.meanEnergy = params.get("meanEnergy");
modelParams.Ions.sigmaEnergy = params.get("sigmaEnergy");
modelParams.Ions.exponent = params.get("ionExponent");
modelParams.Passivation.A_ie = params.get("A_O");
modelParams.Substrate.A_ie = params.get("A_Si");
modelParams.etchStopDepth = params.get("etchStopDepth");
auto model = SmartPointer<SF6O2Etching<NumericType, D>>::New(modelParams);

CoverageParameters coverageParams;
coverageParams.tolerance = 1e-4;

RayTracingParameters rayTracingParams;
rayTracingParams.raysPerPoint = params.get<unsigned>("raysPerPoint");

AdvectionParameters advectionParams;
advectionParams.spatialScheme =
util::convertSpatialScheme(params.get<std::string>("spatialScheme"));
advectionParams.temporalScheme =
util::convertTemporalScheme(params.get<std::string>("temporalScheme"));
advectionParams.calculateIntermediateVelocities = intermediateVelocities;

// process setup
const std::string fluxEngineStr = params.get<std::string>("fluxEngine");
const auto fluxEngine = util::convertFluxEngineType(fluxEngineStr);

Process<NumericType, D> process(geometry, model);
process.setProcessDuration(params.get("processTime"));
process.setParameters(coverageParams);
process.setParameters(rayTracingParams);
process.setParameters(advectionParams);
process.setFluxEngineType(fluxEngine);

// print initial surface
if (suffix == "_noIntermediate")
geometry->saveSurfaceMesh("initial.vtp");

// run the process
process.apply();

// print final surface
std::string outputFile = params.get<std::string>("outputFile");
auto pos = outputFile.find_last_of('.');
if (pos != std::string::npos) {
outputFile.insert(pos, suffix);
} else {
outputFile += suffix;
}
geometry->saveSurfaceMesh(outputFile, true, 0.01, true);
};

std::cout << "Running simulation without intermediate velocity calculation..."
<< std::endl;
runSimulation(false, "_noIntermediate");

std::cout << "Running simulation with intermediate velocity calculation..."
<< std::endl;
runSimulation(true, "_intermediate");
}
134 changes: 81 additions & 53 deletions examples/holeEtching/holeEtching.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,62 +13,90 @@
else:
print("Running 3D simulation.")
ps.setDimension(args.dim)
ps.setNumThreads(16)

params = ps.readConfigFile(args.filename)

ps.Length.setUnit(params["lengthUnit"])
ps.Time.setUnit(params["timeUnit"])

# geometry setup, all units in um
geometry = ps.Domain(
gridDelta=params["gridDelta"],
xExtent=params["xExtent"],
yExtent=params["yExtent"],
)
ps.MakeHole(
domain=geometry,
holeRadius=params["holeRadius"],
holeDepth=0.0,
maskHeight=params["maskHeight"],
maskTaperAngle=params["taperAngle"],
holeShape=ps.HoleShape.HALF,
).apply()

# use pre-defined model SF6O2 etching model
modelParams = ps.SF6O2Etching.defaultParameters()
modelParams.ionFlux = params["ionFlux"]
modelParams.etchantFlux = params["etchantFlux"]
modelParams.passivationFlux = params["oxygenFlux"]
modelParams.Ions.meanEnergy = params["meanEnergy"]
modelParams.Ions.sigmaEnergy = params["sigmaEnergy"]
modelParams.Ions.exponent = params["ionExponent"]
modelParams.Passivation.A_ie = params["A_O"]
modelParams.Substrate.A_ie = params["A_Si"]
modelParams.etchStopDepth = params["etchStopDepth"]
model = ps.SF6O2Etching(modelParams)

covParams = ps.CoverageParameters()
covParams.tolerance = 1e-4

rayParams = ps.RayTracingParameters()
rayParams.raysPerPoint = int(params["raysPerPoint"])
rayParams.smoothingNeighbors = 2

advParams = ps.AdvectionParameters()
advParams.spatialScheme = ps.util.convertSpatialScheme(params["spatialScheme"])

# process setup
process = ps.Process(geometry, model)
process.setProcessDuration(params["processTime"]) # seconds
process.setParameters(covParams)
process.setParameters(rayParams)
process.setParameters(advParams)

# print initial surface
geometry.saveSurfaceMesh(filename="initial.vtp")

# run the process
process.apply()

# print final surface
geometry.saveSurfaceMesh(filename="final.vtp", addInterfaces=True)
def run_simulation(intermediate_velocities, suffix):
# geometry setup, all units in um
geometry = ps.Domain(
gridDelta=params["gridDelta"],
xExtent=params["xExtent"],
yExtent=params["yExtent"],
)

hole_shape = ps.HoleShape.QUARTER if args.dim == 3 else ps.HoleShape.HALF

ps.MakeHole(
domain=geometry,
holeRadius=params["holeRadius"],
holeDepth=0.0,
maskHeight=params["maskHeight"],
maskTaperAngle=params["taperAngle"],
holeShape=hole_shape,
).apply()

# use pre-defined model SF6O2 etching model
modelParams = ps.SF6O2Etching.defaultParameters()
modelParams.ionFlux = params["ionFlux"]
modelParams.etchantFlux = params["etchantFlux"]
modelParams.passivationFlux = params["oxygenFlux"]
modelParams.Ions.meanEnergy = params["meanEnergy"]
modelParams.Ions.sigmaEnergy = params["sigmaEnergy"]
modelParams.Ions.exponent = params["ionExponent"]
modelParams.Passivation.A_ie = params["A_O"]
modelParams.Substrate.A_ie = params["A_Si"]
modelParams.etchStopDepth = params["etchStopDepth"]
model = ps.SF6O2Etching(modelParams)

covParams = ps.CoverageParameters()
covParams.tolerance = 1e-4

rayParams = ps.RayTracingParameters()
rayParams.raysPerPoint = int(params["raysPerPoint"])

advParams = ps.AdvectionParameters()
advParams.spatialScheme = ps.util.convertSpatialScheme(
params["spatialScheme"]
)
advParams.temporalScheme = ps.util.convertTemporalScheme(
params["temporalScheme"]
)
advParams.calculateIntermediateVelocities = intermediate_velocities

# process setup
process = ps.Process(geometry, model)
process.setProcessDuration(params["processTime"]) # seconds
process.setParameters(covParams)
process.setParameters(rayParams)
process.setParameters(advParams)

fluxEngineStr = params["fluxEngine"]
fluxEngine = ps.util.convertFluxEngineType(fluxEngineStr)
process.setFluxEngineType(fluxEngine)

# print initial surface
if suffix == "_noIntermediate":
geometry.saveSurfaceMesh(filename="initial.vtp")

# run the process
process.apply()

# print final surface
output_file = params["outputFile"]
if "." in output_file:
parts = output_file.rsplit(".", 1)
output_file = f"{parts[0]}{suffix}.{parts[1]}"
else:
output_file += suffix

geometry.saveSurfaceMesh(filename=output_file, addInterfaces=True, boolMaterials=True)

print("Running simulation without intermediate velocity calculation...")
run_simulation(False, "_noIntermediate")

print("Running simulation with intermediate velocity calculation...")
run_simulation(True, "_intermediate")
3 changes: 3 additions & 0 deletions examples/simpleEtching/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
project(simpleEtching LANGUAGES CXX)

viennaps_add_example(${PROJECT_NAME} "${PROJECT_NAME}.cpp")
Loading
Loading