From 8dee837d94662614c1ac2594fb7bad63a51a9ea6 Mon Sep 17 00:00:00 2001 From: tobre1 Date: Thu, 18 Jan 2024 10:13:26 +0100 Subject: [PATCH] Some docs on geometry output --- docs/_site/assets/js/search-data.json | 320 ++++++++++++++------------ docs/_site/output/levelset.html | 12 +- docs/_site/output/surface.html | 12 +- docs/_site/output/volume.html | 12 +- docs/output/levelset.md | 40 +++- docs/output/surface.md | 34 ++- docs/output/volume.md | 34 ++- include/psDomain.hpp | 3 +- 8 files changed, 304 insertions(+), 163 deletions(-) diff --git a/docs/_site/assets/js/search-data.json b/docs/_site/assets/js/search-data.json index 8691c603..23854f29 100644 --- a/docs/_site/assets/js/search-data.json +++ b/docs/_site/assets/js/search-data.json @@ -181,194 +181,194 @@ "relUrl": "/geo/basic/hole.html" },"26": { - "doc": "Advanced Cell-Set Functionalities", - "title": "Advanced Cell-Set Functionalities", - "content": ". Coming soon . ", - "url": "/cellset/", + "doc": "Simulation Domain", + "title": "Simulation Domain", + "content": "#include <psDomain.hpp> . In our simulation framework, the essential hub for all geometry details is the psDomain class. This class is like a smart keeper of information, holding everything about the materials in the simulation domain. It uses level sets to show surfaces and material interfaces with great detail and organizes data in a cell-based structure for the underlying volumes. Depending on the specific process, it can use one or both of these methods. This flexibility ensures that the simulation can handle different processes accurately and efficiently. ", + "url": "/domain/", - "relUrl": "/cellset/" + "relUrl": "/domain/" },"27": { - "doc": "Miscellaneous", - "title": "Miscellaneous", - "content": " ", - "url": "/misc/", - - "relUrl": "/misc/" - },"28": { - "doc": "Examples", - "title": "Examples", - "content": ". | Custom Example Process | GDS Reader | Cantilever Wet Etching | Selective Epitaxy | Trench Deposition | Trench Deposition Geometric | TEOS Trench Deposition | Hole Etching | Stack Etching | Oxide Regrowth | Volume Model | KD Tree Benchmark | Interpolation Demo | . ", - "url": "/examples/", - - "relUrl": "/examples/" - },"29": { "doc": "Basic Geometries", "title": "Basic Geometries", "content": ". ViennaPS provides a set of functions to effortlessly create basic geometries, facilitating quick testing of models or serving as the groundwork for your process simulation configuration. The various available geometries are outlined below: . ", "url": "/geo/basic/", "relUrl": "/geo/basic/" - },"30": { + },"28": { "doc": "Creating a Geometry", "title": "Creating a Geometry", "content": ". Create intricate geometries using the versatile tools offered by ViennaLS or generate a basic geometry using of the provided geometry builders. Alternatively, you can import a geometry from a GDSII mask file. ", "url": "/geo/", "relUrl": "/geo/" + },"29": { + "doc": "Advanced Cell-Set Functionalities", + "title": "Advanced Cell-Set Functionalities", + "content": ". Coming soon . ", + "url": "/cellset/", + + "relUrl": "/cellset/" + },"30": { + "doc": "Examples", + "title": "Examples", + "content": ". | Custom Example Process | GDS Reader | Cantilever Wet Etching | Selective Epitaxy | Trench Deposition | Trench Deposition Geometric | TEOS Trench Deposition | Hole Etching | Stack Etching | Oxide Regrowth | Volume Model | KD Tree Benchmark | Interpolation Demo | . ", + "url": "/examples/", + + "relUrl": "/examples/" },"31": { - "doc": "Geometry Output", - "title": "Geometry Output", - "content": ". ViennaPS provides various methods for outputting the surface or volume of the processed domain. The data is typically saved in the VTK file format, with surfaces stored in .vtp files and volumes in .vtu files. For visualization, we recommend using ParaView, a powerful open-source visualization tool. Below, you’ll find further details on the available geometry outputs. In addition to VTK file formats, ViennaPS provides the flexibility to store level sets directly in the proprietary .lvst format. This feature enables users to save intermediate states during the process, allowing for more detailed analysis and the ability to revisit specific simulation stages. ", - "url": "/output/", + "doc": "Installing the Library", + "title": "Installing the Library", + "content": ". ", + "url": "/inst/", - "relUrl": "/output/" + "relUrl": "/inst/" },"32": { - "doc": "Compact Modelling", - "title": "Compact Modelling", - "content": ". Coming soon . ", - "url": "/compact/", + "doc": "Installing the Library", + "title": "Supported Operating Systems", + "content": ". | Windows (Visual Studio) . | Linux (g++ / clang) . | macOS (XCode) . | . ", + "url": "/inst/#supported-operating-systems", - "relUrl": "/compact/" + "relUrl": "/inst/#supported-operating-systems" },"33": { - "doc": "Pre-Built Models", - "title": "Pre-Built Models", - "content": " ", - "url": "/models/prebuilt/", + "doc": "Installing the Library", + "title": "System Requirements", + "content": ". | C++17 Compiler with OpenMP support | . ", + "url": "/inst/#system-requirements", - "relUrl": "/models/prebuilt/" + "relUrl": "/inst/#system-requirements" },"34": { - "doc": "Custom Models", - "title": "Custom Models", - "content": ". Users can create a custom process model by interfacing one or more of the classes described below and then inserting them into their custom process model. | The psSurfaceModel class is used to describe surface reactions, combining particle fluxes with the surface chemical reactions. | The psVelocityField provides the interface between surface velocities and the advection kernel to integrate the Level-Set equation in a time step. | ViennaPS seamlessly integrates ViennaRay functionality through the rayParticle class, providing users with a versatile interface to define the key characteristics of the simulated particle species. | . ", - "url": "/models/custom/", + "doc": "Installing the Library", + "title": "Installation", + "content": "Since this is a header only project, it does not require any installation. However, we recommend the following procedure in order to set up all dependencies correctly and relocate all header files to a designated directory: . git clone https://github.com/ViennaTools/ViennaPS.git cd ViennaPS mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/path/to/your/custom/install/ make buildDependencies # this will install all dependencies and might take a while make install . The CMake configuration automatically checks if the dependencies are installed. If CMake is unable to find them, the dependencies will be built from source with the buildDependencies target. This will install the necessary headers and CMake files to the specified path. If CMAKE_INSTALL_PREFIX is not specified, it will be installed to the standard path for your system, usually /usr/local/ . If one wants to use a specific installation of one or more of the dependencies, just pass the corresponding *_DIR variable as a configuration option (e.g. -DViennaLS_DIR=/path/to/viennals/install -DViennaRay_DIR=/path/to/viennaray/install). ViennaLS and ViennaRay both have external dependencies which can be installed beforehand to save some time when building the dependencies. ViennaLS uses VTK as dependency and ViennaRay uses Embree. On Linux based systems, these dependencies can be installed using the package manager: sudo apt install libvtk9.1 libvtk9-dev libembree3-3 libembree-dev. On macOS, one can use Homebrew to install these dependencies: brew install vtk embree. ", + "url": "/inst/#installation", - "relUrl": "/models/custom/" + "relUrl": "/inst/#installation" },"35": { - "doc": "Process Models", - "title": "Process Models", - "content": "#include <psProcessModel.hpp> . All the information about the process is encompassed in the class psProcessModel, as it includes all the particle type information required for ray tracing, the surface model, as well as advection callbacks, for generating volume models describing chemical processes inside the material. Users have the flexibility to configure their own custom process model or opt for pre-defined models encompassing frequently used processes. ", - "url": "/models/", + "doc": "Installing the Library", + "title": "Building the Python package", + "content": "In order to build the Python bindings, the pybind11 library is required. On Linux based system (Ubuntu/Debian), pybind11 can be installed via the package manager: sudo apt install pybind11-dev. For macOS, the installation via Homebrew is recommended: brew install pybind11. The ViennaPS Python package can be built and installed using the pip command: . git clone https://github.com/ViennaTools/ViennaPS.git cd ViennaPS pip install --user . Some functionalities of the ViennaPS Python module only work in combination with the ViennaLS Python module. It is therefore recommended to additionally install the ViennaLS Python module on your system. Instructions to do so can be found in the ViennaLS Git Repository. ", + "url": "/inst/#building-the-python-package", - "relUrl": "/models/" + "relUrl": "/inst/#building-the-python-package" },"36": { + "doc": "Installing the Library", + "title": "Using the Python package", + "content": "The 2D version of the library can be imported as follows: . import viennaps2d as vps . In order to switch to three dimensions, only the import needs to be changed: . import viennaps3d as vps . ", + "url": "/inst/#using-the-python-package", + + "relUrl": "/inst/#using-the-python-package" + },"37": { + "doc": "Installing the Library", + "title": "Integration in CMake projects", + "content": "In order to use this library in your CMake project, add the following lines to the CMakeLists.txt of your project: . set(ViennaPS_DIR \"/path/to/your/custom/install/\") find_package(ViennaPS REQUIRED) add_executable(${PROJECT_NAME} ...) target_include_directories(${PROJECT_NAME} PUBLIC ${VIENNAPS_INCLUDE_DIRS}) target_link_libraries(${PROJECT_NAME} ${VIENNAPS_LIBRARIES}) . ", + "url": "/inst/#integration-in-cmake-projects", + + "relUrl": "/inst/#integration-in-cmake-projects" + },"38": { + "doc": "Geometry Output", + "title": "Geometry Output", + "content": ". ViennaPS provides various methods for outputting the surface or volume of the processed domain. The data is typically saved in the VTK file format, with surfaces stored in .vtp files and volumes in .vtu files. For visualization, we recommend using ParaView, a powerful open-source visualization tool. Below, you’ll find further details on the available geometry outputs. In addition to VTK file formats, ViennaPS provides the flexibility to store level sets directly in the proprietary .lvst format. This feature enables users to save intermediate states during the process, allowing for more detailed analysis and the ability to revisit specific simulation stages. ", + "url": "/output/", + + "relUrl": "/output/" + },"39": { + "doc": "Running a Process", + "title": "Running a Process", + "content": "#include <psProcess.hpp> . The psProcess class functions as the primary simulation interface, consolidating crucial elements such as the simulation domain, process model, process duration, and requisite ray-tracing parameters. This interface also encompasses the necessary methods for configuring these attributes. Upon setting these parameters, the apply() method is employed to execute the process, initiating and conducting the simulation. Example usage: . C++ ... psProcess<NumericType, D> process; process.setDomain(myDomain); process.setProcessModel(myModel); process.setProcessDuration(10.); process.setNumberOfRaysPerPoint(1000); process.enableFluxSmoothing(); process.apply(); ... Python ... process = vps.Process() process.setDomain(myDomain) process.setProcessModel(myModel) process.setProcessDuration(10.) process.setNumberOfRaysPerPoint(1000) process.enableFluxSmoothing() process.apply() ... ", + "url": "/process/", + + "relUrl": "/process/" + },"40": { + "doc": "Running a Process", + "title": "Member Functions", + "content": "Constructors . // Default constructor psProcess() // Constructor from domain psProcess(psSmartPointer<psDomain<NumericType, D>> passedDomain) // Constructor from domain, process model, and duration, // to apply simple processes template <typename ProcessModelType> psProcess(psSmartPointer<psDomain<NumericType, D>> passedDomain, psSmartPointer<ProcessModelType> passedProcessModel, const NumericType passedDuration = 0.) . In summary, these constructors provide different ways to create a psProcess object, allowing for flexibility depending on what data is available at the time of object creation. | The first constructor is a default constructor. It’s defined as psProcess() and it doesn’t take any arguments. This constructor allows for the creation of a psProcess object without any initial values. | The second constructor takes a single argument: a smart pointer to a psDomain object. This constructor initializes the domain member variable of the psProcess class with the passed psDomain object. | The third constructor is a template constructor that takes three arguments: a smart pointer to a psDomain object, a smart pointer to a ProcessModelType object, and a NumericType representing the process duration. This constructor initializes the domain and processDuration member variables with the passed values and also sets the model member variable to the dynamically cast ProcessModelType object. This allows the user to run a process from an anonymous object. For example: psProcess<NumericType, D>(myDomain, myModel, processDuration).apply() . | . Set the domain . void setDomain(psSmartPointer<psDomain<NumericType, D>> passedDomain) . Sets the process domain. Set the process model . template <typename ProcessModelType> void setProcessModel(psSmartPointer<ProcessModelType> passedProcessModel) . Sets the process model. This can be either a pre-configured process model or a custom process model. A custom process model must interface the psProcessModel class. Set the source direction . void setSourceDirection(const rayTraceDirection passedDirection) . Set the source direction, where the rays should be traced from. The passed direction parameter is using the enum rayTraceDirection which contains the following values: POS_X, NEG_X, POS_Y, NEG_Y, POS_Z, NEG_Z. Set the process duration . void setProcessDuration(NumericType passedDuration) . Specifies the duration of the process. If the process duration is set to 0, exclusively the advection callback applyPreAdvect() is executed on the domain. This feature is particularly useful for applying only a volume model without engaging in further simulation steps. Set the number of rays to be traced . void setNumberOfRaysPerPoint(unsigned raysPerPoint) . Specify the number of rays to be traced for each particle throughout the process. The total count of rays is the product of this number and the number of points in the process geometry. Set the number of coverage initialization iterations . void setMaxCoverageInitIterations(unsigned numIter) . Set the number of iterations to initialize the coverages. Enable or disable flux smoothing . void enableFluxSmoothing() void disableFluxSmoothing() . Toggle the option to enable or disable flux smoothing. When flux smoothing is activated, the flux at each surface point, computed by the ray tracer, undergoes averaging across the neighboring surface points. Per default, flux smoothing is enabled. Set the integration scheme . void setIntegrationScheme(lsIntegrationSchemeEnum passedIntegrationScheme) . Set the integration scheme for solving the level-set equation. Possible integration schemes are specified in lsIntegrationSchemeEnum. Set the time step ratio . void setTimeStepRatio(NumericType cfl) . Set the CFL (Courant-Friedrichs-Levy) condition to use during surface advection in the level-set. The CFL condition defines the maximum distance a surface is allowed to move in a single advection step. It MUST be below 0.5 to guarantee numerical stability. Defaults to 0.4999. Set time interval to save intermediate results . void setPrintTimeInterval(NumericType passedTime) . Sets the minimum time between printing intermediate results during the process. If this is set to a non-positive value, no intermediate results are printed. ", + "url": "/process/#member-functions", + + "relUrl": "/process/#member-functions" + },"41": { "doc": "General Notes", "title": "General Notes", "content": ". ", "url": "/general/", "relUrl": "/general/" - },"37": { + },"42": { "doc": "General Notes", "title": "Numeric Types", "content": "ViennaPS supports the utilization of either float or double as the underlying numeric type. While float might offer slightly higher performance in some cases, it is generally recommended to use double in your simulation due to its enhanced precision. It’s essential to note that the choice of numeric type is a static (compile-time) parameter in every ViennaPS class and function. Once a numeric type is selected for a particular simulation, it is not possible to switch to a different numeric type within the program. Additionally, for users working with Python bindings, it’s important to be aware that the Python interface always uses double as the numeric type. ", "url": "/general/#numeric-types", "relUrl": "/general/#numeric-types" - },"38": { + },"43": { "doc": "General Notes", "title": "Switching between 2D and 3D mode", "content": "ViennaPS provides the flexibility for users to choose between 2D and 3D modes during compile time. The dimensionality is specified as a second template (static) parameter, and most classes and functions in ViennaPS adhere to this structure. It’s important to note that 2D and 3D classes cannot be mixed within the same simulation, and the choice of dimensionality is fixed at compile time. For users who need to transition from a 2D to a 3D simulation, ViennaPS offers the psExtrude utility. This utility enables the extrusion of a 2D domain to 3D, providing a seamless way to extend simulations across different dimensions. ", "url": "/general/#switching-between-2d-and-3d-mode", "relUrl": "/general/#switching-between-2d-and-3d-mode" - },"39": { + },"44": { "doc": "General Notes", "title": "Using Smart Pointers", "content": "Coming soon . ", "url": "/general/#using-smart-pointers", "relUrl": "/general/#using-smart-pointers" - },"40": { - "doc": "Running a Process", - "title": "Running a Process", - "content": "#include <psProcess.hpp> . The psProcess class functions as the primary simulation interface, consolidating crucial elements such as the simulation domain, process model, process duration, and requisite ray-tracing parameters. This interface also encompasses the necessary methods for configuring these attributes. Upon setting these parameters, the apply() method is employed to execute the process, initiating and conducting the simulation. Example usage: . C++ ... psProcess<NumericType, D> process; process.setDomain(myDomain); process.setProcessModel(myModel); process.setProcessDuration(10.); process.setNumberOfRaysPerPoint(1000); process.enableFluxSmoothing(); process.apply(); ... Python ... process = vps.Process() process.setDomain(myDomain) process.setProcessModel(myModel) process.setProcessDuration(10.) process.setNumberOfRaysPerPoint(1000) process.enableFluxSmoothing() process.apply() ... ", - "url": "/process/", - - "relUrl": "/process/" - },"41": { - "doc": "Running a Process", - "title": "Member Functions", - "content": "Constructors . // Default constructor psProcess() // Constructor from domain psProcess(psSmartPointer<psDomain<NumericType, D>> passedDomain) // Constructor from domain, process model, and duration, // to apply simple processes template <typename ProcessModelType> psProcess(psSmartPointer<psDomain<NumericType, D>> passedDomain, psSmartPointer<ProcessModelType> passedProcessModel, const NumericType passedDuration = 0.) . In summary, these constructors provide different ways to create a psProcess object, allowing for flexibility depending on what data is available at the time of object creation. | The first constructor is a default constructor. It’s defined as psProcess() and it doesn’t take any arguments. This constructor allows for the creation of a psProcess object without any initial values. | The second constructor takes a single argument: a smart pointer to a psDomain object. This constructor initializes the domain member variable of the psProcess class with the passed psDomain object. | The third constructor is a template constructor that takes three arguments: a smart pointer to a psDomain object, a smart pointer to a ProcessModelType object, and a NumericType representing the process duration. This constructor initializes the domain and processDuration member variables with the passed values and also sets the model member variable to the dynamically cast ProcessModelType object. This allows the user to run a process from an anonymous object. For example: psProcess<NumericType, D>(myDomain, myModel, processDuration).apply() . | . Set the domain . void setDomain(psSmartPointer<psDomain<NumericType, D>> passedDomain) . Sets the process domain. Set the process model . template <typename ProcessModelType> void setProcessModel(psSmartPointer<ProcessModelType> passedProcessModel) . Sets the process model. This can be either a pre-configured process model or a custom process model. A custom process model must interface the psProcessModel class. Set the source direction . void setSourceDirection(const rayTraceDirection passedDirection) . Set the source direction, where the rays should be traced from. The passed direction parameter is using the enum rayTraceDirection which contains the following values: POS_X, NEG_X, POS_Y, NEG_Y, POS_Z, NEG_Z. Set the process duration . void setProcessDuration(NumericType passedDuration) . Specifies the duration of the process. If the process duration is set to 0, exclusively the advection callback applyPreAdvect() is executed on the domain. This feature is particularly useful for applying only a volume model without engaging in further simulation steps. Set the number of rays to be traced . void setNumberOfRaysPerPoint(unsigned raysPerPoint) . Specify the number of rays to be traced for each particle throughout the process. The total count of rays is the product of this number and the number of points in the process geometry. Set the number of coverage initialization iterations . void setMaxCoverageInitIterations(unsigned numIter) . Set the number of iterations to initialize the coverages. Enable or disable flux smoothing . void enableFluxSmoothing() void disableFluxSmoothing() . Toggle the option to enable or disable flux smoothing. When flux smoothing is activated, the flux at each surface point, computed by the ray tracer, undergoes averaging across the neighboring surface points. Per default, flux smoothing is enabled. Set the integration scheme . void setIntegrationScheme(lsIntegrationSchemeEnum passedIntegrationScheme) . Set the integration scheme for solving the level-set equation. Possible integration schemes are specified in lsIntegrationSchemeEnum. Set the time step ratio . void setTimeStepRatio(NumericType cfl) . Set the CFL (Courant-Friedrichs-Levy) condition to use during surface advection in the level-set. The CFL condition defines the maximum distance a surface is allowed to move in a single advection step. It MUST be below 0.5 to guarantee numerical stability. Defaults to 0.4999. Set time interval to save intermediate results . void setPrintTimeInterval(NumericType passedTime) . Sets the minimum time between printing intermediate results during the process. If this is set to a non-positive value, no intermediate results are printed. ", - "url": "/process/#member-functions", - - "relUrl": "/process/#member-functions" - },"42": { + },"45": { "doc": "Dependencies", "title": "Dependencies", "content": ". ", "url": "/deps/", "relUrl": "/deps/" - },"43": { + },"46": { "doc": "Dependencies", "title": "ViennaLS", "content": "ViennaLS forms the foundation of the process simulator, applying the level-set surface representation concepts for topography simulations. This module not only stores the level-set surface but also encompasses essential algorithms for geometry initialization, level-set value manipulation based on a velocity field, surface feature analysis, and seamless conversion of the level-set representation to other commonly employed material representations in device simulators. ", "url": "/deps/#viennals", "relUrl": "/deps/#viennals" - },"44": { + },"47": { "doc": "Dependencies", "title": "ViennaRay", "content": "ViennaPS relies on ViennaRay, a top-down Monte Carlo flux calculation library, to carry out essential flux calculations. This library is built upon Intel®’s ray tracing kernel, Embree. Crafted with a focus on efficiency and high-performance ray tracing, ViennaRay ensures a seamless user experience through its straightforward and user-friendly interface. In the top-down Monte Carlo approach, a large number of pseudo-particles are launched from a source plane situated above the surface, and their points of impact on the surface are determined. These pseudo-particles are initialized with a uniform initial position on the source plane and an initial direction that follows a power-cosine distribution. Each pseudo-particle carries a specific payload, representing a fraction of the total source flux. Upon reaching the surface, the current payload of the pseudo-particle contributes to the flux at that particular surface location. Furthermore, pseudo-particles have the capability to undergo reflection from the surface. The payload of a pseudo-particle undergoes reduction by the sticking coefficient during reflection. As a result, a pseudo-particle is tracked until its payload falls below a certain threshold or until it exits the simulation domain. This tracking mechanism provides a comprehensive understanding of the particle dynamics during its interaction with the sample surface. ", "url": "/deps/#viennaray", "relUrl": "/deps/#viennaray" - },"45": { - "doc": "Simulation Domain", - "title": "Simulation Domain", - "content": "#include <psDomain.hpp> . In our simulation framework, the essential hub for all geometry details is the psDomain class. This class is like a smart keeper of information, holding everything about the materials in the simulation domain. It uses level sets to show surfaces and material interfaces with great detail and organizes data in a cell-based structure for the underlying volumes. Depending on the specific process, it can use one or both of these methods. This flexibility ensures that the simulation can handle different processes accurately and efficiently. ", - "url": "/domain/", - - "relUrl": "/domain/" - },"46": { - "doc": "Installing the Library", - "title": "Installing the Library", - "content": ". ", - "url": "/inst/", - - "relUrl": "/inst/" - },"47": { - "doc": "Installing the Library", - "title": "Supported Operating Systems", - "content": ". | Windows (Visual Studio) . | Linux (g++ / clang) . | macOS (XCode) . | . ", - "url": "/inst/#supported-operating-systems", - - "relUrl": "/inst/#supported-operating-systems" },"48": { - "doc": "Installing the Library", - "title": "System Requirements", - "content": ". | C++17 Compiler with OpenMP support | . ", - "url": "/inst/#system-requirements", + "doc": "Pre-Built Models", + "title": "Pre-Built Models", + "content": " ", + "url": "/models/prebuilt/", - "relUrl": "/inst/#system-requirements" + "relUrl": "/models/prebuilt/" },"49": { - "doc": "Installing the Library", - "title": "Installation", - "content": "Since this is a header only project, it does not require any installation. However, we recommend the following procedure in order to set up all dependencies correctly and relocate all header files to a designated directory: . git clone https://github.com/ViennaTools/ViennaPS.git cd ViennaPS mkdir build && cd build cmake .. -DCMAKE_INSTALL_PREFIX=/path/to/your/custom/install/ make buildDependencies # this will install all dependencies and might take a while make install . The CMake configuration automatically checks if the dependencies are installed. If CMake is unable to find them, the dependencies will be built from source with the buildDependencies target. This will install the necessary headers and CMake files to the specified path. If CMAKE_INSTALL_PREFIX is not specified, it will be installed to the standard path for your system, usually /usr/local/ . If one wants to use a specific installation of one or more of the dependencies, just pass the corresponding *_DIR variable as a configuration option (e.g. -DViennaLS_DIR=/path/to/viennals/install -DViennaRay_DIR=/path/to/viennaray/install). ViennaLS and ViennaRay both have external dependencies which can be installed beforehand to save some time when building the dependencies. ViennaLS uses VTK as dependency and ViennaRay uses Embree. On Linux based systems, these dependencies can be installed using the package manager: sudo apt install libvtk9.1 libvtk9-dev libembree3-3 libembree-dev. On macOS, one can use Homebrew to install these dependencies: brew install vtk embree. ", - "url": "/inst/#installation", + "doc": "Custom Models", + "title": "Custom Models", + "content": ". Users can create a custom process model by interfacing one or more of the classes described below and then inserting them into their custom process model. | The psSurfaceModel class is used to describe surface reactions, combining particle fluxes with the surface chemical reactions. | The psVelocityField provides the interface between surface velocities and the advection kernel to integrate the Level-Set equation in a time step. | ViennaPS seamlessly integrates ViennaRay functionality through the rayParticle class, providing users with a versatile interface to define the key characteristics of the simulated particle species. | . ", + "url": "/models/custom/", - "relUrl": "/inst/#installation" + "relUrl": "/models/custom/" },"50": { - "doc": "Installing the Library", - "title": "Building the Python package", - "content": "In order to build the Python bindings, the pybind11 library is required. On Linux based system (Ubuntu/Debian), pybind11 can be installed via the package manager: sudo apt install pybind11-dev. For macOS, the installation via Homebrew is recommended: brew install pybind11. The ViennaPS Python package can be built and installed using the pip command: . git clone https://github.com/ViennaTools/ViennaPS.git cd ViennaPS pip install --user . Some functionalities of the ViennaPS Python module only work in combination with the ViennaLS Python module. It is therefore recommended to additionally install the ViennaLS Python module on your system. Instructions to do so can be found in the ViennaLS Git Repository. ", - "url": "/inst/#building-the-python-package", + "doc": "Process Models", + "title": "Process Models", + "content": "#include <psProcessModel.hpp> . All the information about the process is encompassed in the class psProcessModel, as it includes all the particle type information required for ray tracing, the surface model, as well as advection callbacks, for generating volume models describing chemical processes inside the material. Users have the flexibility to configure their own custom process model or opt for pre-defined models encompassing frequently used processes. ", + "url": "/models/", - "relUrl": "/inst/#building-the-python-package" + "relUrl": "/models/" },"51": { - "doc": "Installing the Library", - "title": "Using the Python package", - "content": "The 2D version of the library can be imported as follows: . import viennaps2d as vps . In order to switch to three dimensions, only the import needs to be changed: . import viennaps3d as vps . ", - "url": "/inst/#using-the-python-package", + "doc": "Compact Modelling", + "title": "Compact Modelling", + "content": ". Coming soon . ", + "url": "/compact/", - "relUrl": "/inst/#using-the-python-package" + "relUrl": "/compact/" },"52": { - "doc": "Installing the Library", - "title": "Integration in CMake projects", - "content": "In order to use this library in your CMake project, add the following lines to the CMakeLists.txt of your project: . set(ViennaPS_DIR \"/path/to/your/custom/install/\") find_package(ViennaPS REQUIRED) add_executable(${PROJECT_NAME} ...) target_include_directories(${PROJECT_NAME} PUBLIC ${VIENNAPS_INCLUDE_DIRS}) target_link_libraries(${PROJECT_NAME} ${VIENNAPS_LIBRARIES}) . ", - "url": "/inst/#integration-in-cmake-projects", + "doc": "Miscellaneous", + "title": "Miscellaneous", + "content": " ", + "url": "/misc/", - "relUrl": "/inst/#integration-in-cmake-projects" + "relUrl": "/misc/" },"53": { "doc": "Home", "title": "ViennaPS", @@ -400,219 +400,233 @@ },"57": { "doc": "Level Set", "title": "Level Set", - "content": ". Coming soon . ", + "content": ". ", "url": "/output/levelset.html", "relUrl": "/output/levelset.html" },"58": { + "doc": "Level Set", + "title": "Saving the Domain", + "content": "Documentation Coming soon . ", + "url": "/output/levelset.html#saving-the-domain", + + "relUrl": "/output/levelset.html#saving-the-domain" + },"59": { + "doc": "Level Set", + "title": "Visualization", + "content": "ViennaPS provides a feature enabling users to save the level set grid points explicitly for each material layer within the domain in the VTK file format. This export includes the level set value associated with each grid point. Users also have the option to specify a width parameter, determining the number of grid points around the zero level set. This functionality enhances the ability to analyze and visualize the level set information in a detailed and customizable manner. Example usage: . C++ . auto domain = psSmartPointer<psDomain<NumericType, D>>::New(); ... // create geometry in domain ... domain->saveLevelSetMesh(\"fileNamePrefix\", 3 /* width */); . Python: . domain = vps.Domain() ... # create geometry in domain ... domain.saveLevelSetMesh(fileName=\"fileNamePrefix\", width=3) . ", + "url": "/output/levelset.html#visualization", + + "relUrl": "/output/levelset.html#visualization" + },"60": { "doc": "Logging", "title": "Logging", "content": ". Singleton class for thread-safe logging. The psLogger class can be used to set the verbosity of the program. The verbosity levels are: . | Code | Description | . | ERROR | Log errors only | . | WARNING | Log warnings | . | INFO | Log information (e.g. remaining time) | . | TIMING | Log timing results for the different methods | . | INTERMEDIATE | Save intermediate results (disk meshes) during the process | . | DEBUG | Debug | . Example usage: Set the log level of the current program to INTERMEDIATE . C++ . psLogger::setLogLevel(psLogLevel::INTERMEDIATE); . Python . vps.Logger.setLogLevel(vps.LogLevel.INTERMEDIATE) . ", "url": "/misc/logging.html", "relUrl": "/misc/logging.html" - },"59": { + },"61": { "doc": "Material Mapping", "title": "Material Mapping", "content": ". If specified, each Level-Set in the psDomain is assigned a specific material, which can be used in a process to implement material-specific rates or similar. The following materials are available: Mask, Si, SiO2, Si3N4, SiN, SiON, SiC, SiGe, PolySi, GaN, W, Al2O3, TiN, Cu, Polymer, Dielectric, Metal, Air, GAS. ", "url": "/domain/material.html", "relUrl": "/domain/material.html" - },"60": { + },"62": { "doc": "Oxide Regrowth", "title": "Oxide Regrowth", "content": "#include <psOxideRegrowth.hpp> . Coming soon . ", "url": "/models/prebuilt/oxideRegrowth.html#oxide-regrowth", "relUrl": "/models/prebuilt/oxideRegrowth.html#oxide-regrowth" - },"61": { + },"63": { "doc": "Oxide Regrowth", "title": "Related Examples", "content": ". | Oxide Regrowth | . ", "url": "/models/prebuilt/oxideRegrowth.html#related-examples", "relUrl": "/models/prebuilt/oxideRegrowth.html#related-examples" - },"62": { + },"64": { "doc": "Oxide Regrowth", "title": "Oxide Regrowth", "content": " ", "url": "/models/prebuilt/oxideRegrowth.html", "relUrl": "/models/prebuilt/oxideRegrowth.html" - },"63": { + },"65": { "doc": "Parsing Parameters", "title": "Parsing Parameters", "content": ". Coming soon . ", "url": "/misc/parsing.html", "relUrl": "/misc/parsing.html" - },"64": { + },"66": { "doc": "Particles - Flux Calculation", "title": "Particles - Flux Calculation", "content": ". ViennaPS integrates advanced ray tracing techniques, leveraging the power of the ViennaRay library based on Intel®’s Embree ray tracing kernel, into the realm of process simulations. This combination enables precise and efficient flux calculations within topography simulations. This process includes launching rays from a source and tracing their paths as they interact with the surface geometry. Ray tracing allows for the simulation of complex phenomena such as shadows, reflections, and transmission of energy through transparent materials. ViennaPS seamlessly integrates ViennaRay functionality through the rayParticle class, providing users with a versatile interface to define the key characteristics of the simulated particle species and tailor their behavior upon surface interactions, including reflective properties. Within the particle class, users can fine-tune parameters governing the initial state of particles, enabling precise control over their interactions with material surfaces. For an in-depth understanding of the rayParticle class and its functionalities, users are encouraged to refer to the detailed documentation available within the ViennaRay documentation. Within ViennaPS, a process model has the flexibility to encompass multiple particle species, each contributing distinct characteristics to the simulation. The fluxes computed from these particles are conveniently accessible through the psSurfaceModel class. This crucial interface allows users to seamlessly integrate the particle flux data into a physical model, facilitating the simulation of intricate physical processes. By leveraging the calculated fluxes within the surface model, users can construct comprehensive simulations that capture the nuanced interplay of particles and materials, offering a robust framework for exploring diverse scenarios in process simulation. ", "url": "/models/custom/particle.html", "relUrl": "/models/custom/particle.html" - },"65": { + },"67": { "doc": "Planarize Geometry", "title": "Planarize a Geometry", "content": "#include <psPlanarize.hpp> . With this class, the user is able to planarize the domain at a specified cutoff position. The planarization process involves subtracting a plane from all materials within the domain using a boolean operation. Example usage: . C++ . psPlanarize<double, 3>(domain, 0. /*cut off height in z-direction*/).apply(); . Python . vps.Planarize(geometry=domain, cutoffHeight=0.).apply() . ", "url": "/misc/planarize.html#planarize-a-geometry", "relUrl": "/misc/planarize.html#planarize-a-geometry" - },"66": { + },"68": { "doc": "Planarize Geometry", "title": "Planarize Geometry", "content": " ", "url": "/misc/planarize.html", "relUrl": "/misc/planarize.html" - },"67": { + },"69": { "doc": "Plane Geometry", "title": "Plane Geometry", "content": "#include <psMakePlane.hpp> . The psMakePlane class offers a straightforward approach to generate a plane as a level-set within your domain. This utility is useful for crafting substrates with any material. You have the flexibility to append the plane to an existing geometry or create a new one. In 3D, the plane is generated with a normal direction in the positive z direction, while in 2D, it is oriented in the positive y direction. The plane is centered around the origin, with the total specified extent and height. Additionally, you can opt for a periodic boundary in the x and y directions. // New geometry psMakePlane(psDomainType domain, const NumericType gridDelta, const NumericType xExtent, const NumericType yExtent, const NumericType height, const bool periodicBoundary = false, const psMaterial material = psMaterial::None) // Add to existing geometry psMakePlane(psDomainType domain, NumericType height = 0., const psMaterial material = psMaterial::None) . Depending on the specific constructor invoked for the plane-builder, the behavior varies: the domain may be cleared, and a new plane inserted, or the plane can be added to the existing geometry in the domain. A detailed description of the parameters follows: . | Parameter | Description | Type | . | domain | The psDomain object passed in a smart pointer. | psSmartPointer<psDomain<NumericType, D>> | . | gridDelta | Represents the grid spacing or resolution used in the simulation. | NumericType | . | xExtent | Defines the extent of the plane geometry in the x-direction. | NumericType | . | yExtent | Defines the extent of the plane geometry in the y-direction. | NumericType | . | height | Sets the position of the plane in y(2D)/z(3D) direction. | NumericType | . | periodicBoundary | (Optional) If set to true, enables periodic boundaries in both x and y directions. Default is set to false. | bool | . | material | (Optional) Specifies the material used for the plane. Default is set to psMaterial::None. | psMaterial | . Example usage: . | Creating a new domain: | . C++ . auto domain = psSmartPointer<psDomain<NumericType, D>>::New(); psMakePlane<NumericType, D>(domain, 0.5, 10.0, 10.0, 0.0, false, psMaterial::Si).apply(); . Python . domain = vps.Domain() vps.MakePlane(domain=domain, gridDelta=0.5, xExtent=10.0, yExtent=10.0, height=0.0, periodicBoundary=False, material=vps.Material.Si, ).apply() . | Adding plane to existing domain | . C++ . auto domain = psSmartPointer<psDomain<NumericType, D>>::New(); psMakePlane<NumericType, D>(domain, 10.0, psMaterial::Si).apply(); . Python . domain = vps.Domain() vps.MakePlane(domain=domain, height=0.0, material=vps.Material.Si, ).apply() . ", "url": "/geo/basic/plane.html", "relUrl": "/geo/basic/plane.html" - },"68": { + },"70": { "doc": "Plasma Damage", "title": "Plasma Damage", "content": "#include <psPlasmaDamage.hpp> . Coming soon . ", "url": "/models/prebuilt/plasmaDamage.html#plasma-damage", "relUrl": "/models/prebuilt/plasmaDamage.html#plasma-damage" - },"69": { + },"71": { "doc": "Plasma Damage", "title": "Related Examples", "content": ". | Volume Model | . ", "url": "/models/prebuilt/plasmaDamage.html#related-examples", "relUrl": "/models/prebuilt/plasmaDamage.html#related-examples" - },"70": { + },"72": { "doc": "Plasma Damage", "title": "Plasma Damage", "content": " ", "url": "/models/prebuilt/plasmaDamage.html", "relUrl": "/models/prebuilt/plasmaDamage.html" - },"71": { + },"73": { "doc": "Point Data", "title": "Point Data", "content": ". Coming soon . ", "url": "/misc/pointData.html", "relUrl": "/misc/pointData.html" - },"72": { + },"74": { "doc": "Single Particle Process", "title": "Single Particle Process", "content": "#include <psSingleParticleProcess.hpp> . Coming soon . ", "url": "/models/prebuilt/singleParticle.html", "relUrl": "/models/prebuilt/singleParticle.html" - },"73": { + },"75": { "doc": "Single Particle Process", "title": "Related Examples", "content": ". | Trench Deposition | . ", "url": "/models/prebuilt/singleParticle.html#related-examples", "relUrl": "/models/prebuilt/singleParticle.html#related-examples" - },"74": { + },"76": { "doc": "Primary Source Direction", "title": "Primary Source Direction", "content": ". The primary source direction is an optional parameter that allows users to tailor the initial particle direction distribution by specifying a tilt during flux calculation from a source plane. In cases where no primary source direction is explicitly defined, it defaults to being aligned with the surface normal of the source plane. If there is no intention to tilt the initial distribution, it is advisable not to set the primary source direction equal to the source plane normal. Instead, using the default value is recommended for a slight performance advantage. Example usage: . auto myModel = psSmartPointer<psProcessModel<NumericType, D>>::New(); double tiltingAngle = 30. * M_PI / 180.; // tilting angle of 30 degree double x = -std::sin(tiltingAngle); double y = -std::cos(tiltingAngle); myModel->setPrimaryDirection({x, y, -1.}); . ", "url": "/models/custom/sourceDirection.html", "relUrl": "/models/custom/sourceDirection.html" - },"75": { + },"77": { "doc": "Stack Geometry", "title": "Stack Geometry", "content": "#include <psMakeStack.hpp> . The psMakeStack generates a stack of alternating SiO2/Si3N4 layers featuring an optionally etched hole (3D) or trench (2D) at the center. The stack emerges in the positive z direction (3D) or y direction (2D) and is centered around the origin, with its x/y extent specified. Users have the flexibility to introduce periodic boundaries in the x and y directions. Additionally, the stack can incorporate a top mask with a central hole of a specified radius or a trench with a designated width. This versatile functionality enables users to create diverse and customized structures for simulation scenarios. psMakeStack(psDomainType domain, const NumericType gridDelta, const NumericType xExtent, const NumericType yExtent, const int numLayers, const NumericType layerHeight, const NumericType substrateHeight, const NumericType holeRadius, const NumericType trenchWidth, const NumericType maskHeight, const bool periodicBoundary = false) . | Parameter | Description | Type | . | domain | Specifies the domain type for the stack geometry. | psSmartPointer<psDomain<NumericType, D>> | . | gridDelta | Represents the grid spacing or resolution used in the simulation. | NumericType | . | xExtent | Defines the extent of the stack geometry in the x-direction. | NumericType | . | yExtent | Specifies the extent of the stack geometry in the y-direction. | NumericType | . | numLayers | Sets the number of layers in the stack. | int | . | layerHeight | Determines the height of each layer in the stack. | NumericType | . | substrateHeight | Specifies the height of the substrate. | NumericType | . | holeRadius | Sets the radius of the hole. | NumericType | . | trenchWidth | Determines the width of the trench. | NumericType | . | maskHeight | Specifies the height of the mask. | NumericType | . | periodicBoundary | (Optional) If set to true, enables periodic boundaries. Default is set to false. | bool | . trenchWidth and holeRadius can only be used mutually exclusive. I.e., if one is set, the other has to be set to 0. Example usage: . C++ . auto domain = psSmartPointer<psDomain<NumericType, D>>::New(); psMakeStack<NumericType, D>(domain, 0.5, 10.0, 10.0, 5, 5.0, 10., 0.0, 5.0, 0.0, false) .apply(); . Python . domain = vps.Domain() vps.MakeStack(domain=domain, gridDelta=0.5, xExtent=10.0, yExtent=10.0, numLayers=5, layerHeight=5.0, substrateHeight=10.0, holeRadius=0.0, trenchWidth=5.0, maskHeight=0.0, periodicBoundary=False, ).apply() . ", "url": "/geo/basic/stack.html", "relUrl": "/geo/basic/stack.html" - },"76": { - "doc": "Surface Mesh", - "title": "Surface Mesh", - "content": ". Coming soon . ", - "url": "/output/surface.html", - - "relUrl": "/output/surface.html" - },"77": { + },"78": { "doc": "Surface and Material Interfaces", "title": "Surface and Material Interfaces", "content": ". The surface, as well as the material interfaces, are described implicitly by a level set (LS) function $\\phi(\\vec{x})$ which is defined at every point $\\vec{x}$ in space. This function is obtained using signed distance transforms, describing the surface $S$ as the zero LS: . \\[S = \\{\\vec{x}\\!: \\, \\phi(\\vec{x}) = 0 \\}.\\] For a more detailed description of the Level-Set method, please refer to one of the following sources1. If the domain contains multiple LSs, the top LS wraps the entire structure and therefore represents the surface, while all other LS functions just describe material interfaces. Formally, the different material regions can be described by ${M}$ LS functions satisfying . \\[\\Phi_k(\\vec{x}) \\leq 0 \\quad \\Leftrightarrow \\quad \\vec{x} \\in \\bigcup_{i=1}^k \\mathcal{M}_i.\\] Here $\\Phi_M$ describes the entire structure $\\mathcal{M}$, and the other LS functions correspond to material interfaces. When inserting a new LS into the domain, an automatic wrapping process ensues. This process involves enveloping all existing Level-Sets through a Boolean operation, specifically a union with the topmost LS. It’s worth noting, though, that this default behavior is not obligatory. In instances where a specialized domain structure is desired, users have the option to circumvent this automatic wrapping mechanism. Coming soon . | Source ↩ . | . ", "url": "/domain/surface.html#surface-and-material-interfaces", "relUrl": "/domain/surface.html#surface-and-material-interfaces" - },"78": { + },"79": { "doc": "Surface and Material Interfaces", "title": "Surface and Material Interfaces", "content": " ", "url": "/domain/surface.html", "relUrl": "/domain/surface.html" - },"79": { + },"80": { + "doc": "Surface Mesh", + "title": "Surface Mesh", + "content": ". Documentation Coming soon . Example usage: . C++ . auto domain = psSmartPointer<psDomain<NumericType, D>>::New(); ... // create geometry in domain ... domain->saveSurfaceMesh(\"fileName\", true); . Python: . domain = vps.Domain() ... # create geometry in domain ... domain.saveSurfaceMesh(fileName=\"fileName\", addMaterialIds=True) . ", + "url": "/output/surface.html", + + "relUrl": "/output/surface.html" + },"81": { "doc": "Surface Model", "title": "Surface Model", "content": ". ", "url": "/models/custom/surfaceModel.html", "relUrl": "/models/custom/surfaceModel.html" - },"80": { + },"82": { "doc": "Surface Model", "title": "Summary", "content": ". | The psSurfaceModel class is used to describe surface reactions, combining particle fluxes with the surface chemical reactions. | The velocities used for surface advection in a time step are calculated through the calculateVelocities() function. | Surface coverages can be used to track the coverage a chemical species on the surface through a time step. | The coverages can be initialized to equilibrium by iteratively calculating the fluxes on the surface and updating the coverages. The number of iterations to initialize the coverages can be specified through the psProcess. | Coverages and fluxes are stored as psPointData. | . The psSurfaceModel class serves as a comprehensive framework for detailing surface chemistries. Users have the flexibility to create a customized child class where they can precisely dictate how surface coverages evolve, driven by the rates at which particles impact the surface. One key feature is the capability to monitor surface coverages, providing insights into the presence of chemical species on the surface throughout a simulation’s time step. To initialize the coverage data vector, the method initializeCoverages() is employed. void initializeCoverages(unsigned numSurfacePoints) override { // a single set of coverages is initialized here std::vector<NumericType> someCoverage(numSurfacePoints, 0); coverages = psSmartPointer<psPointData<NumericType>>::New(); coverages->insertNextScalarData(someCoverage, \"someCoverage\"); } . To use coverages, it is essential to initialize the class member coverages with a new instance of psPointData. If the coverages variable is left as nullptr, no coverages will be utilized during the simulation. To initialize a single coverage, a container with a size equal to the number of surface points must be created and inserted into the psPointData. Additionally, a name for the coverage can be specified during initialization. This designated name should then be used in updateCoverages() or calculateVelocities() to access the specific coverage as needed. To ensure accurate representations, coverages can be initialized to equilibrium by iteratively calculating surface fluxes and updating coverages. The initialization process’s iteration count is customizable through the psProcess interface. The method updateCoverages() encapsulates the user-defined description of surface coverage evolution in each iteration. Since coverages is a member of the psSurfaceModel class, it can be accessed in every member function. void updateCoverages(psSmartPointer<psPointData<NumericType>> particleFluxes, const std::vector<NumericType> &materialIds) override { auto myCoverage = coverages->getScalarData(\"someCoverage\"); // update coverage from calculated fluxes } . Within the psSurfaceModel class, the method calculateVelocities() utilizes fluxes obtained through ray tracing, to provide the velocities used for surface advection in a time step. Here the fluxes from particle, as well as previously calculated coverages can be accessed and combined to yield the final velocity at each surface point. The function should return a psSmartPointer to a new vector, containing the velocity at each surface point. In order to create a custom surface the user has to interface the psSurfaceModel class. An example implementation of a custom surface model is given below: . template <typename NumericType> class myCustomSurfaceModel : public psSurfaceModel<NumericType> { public: using psSurfaceModel<NumericType>::coverages; // needed to access coverages void initializeCoverages(unsigned numSurfacePoints) override { // a single set of coverages is initialized here std::vector<NumericType> someCoverage(numSurfacePoints, 0); coverages = psSmartPointer<psPointData<NumericType>>::New(); coverages->insertNextScalarData(someCoverage, \"someCoverage\"); } void updateCoverages(psSmartPointer<psPointData<NumericType>> particleFluxes, const std::vector<NumericType> &materialIds) override { auto myCoverage = coverages->getScalarData(\"someCoverage\"); // update coverage from calculated fluxes } psSmartPointer<std::vector<NumericType>> calculateVelocities( psSmartPointer<psPointData<NumericType>> rates, const std::vector<std::array<NumericType, 3>> &coordinates, const std::vector<NumericType> &materialIds) override { // use coverages and rates here to calculate the velocity here return psSmartPointer<std::vector<NumericType>>::New( *rates->getScalarData(\"particleRate\")); } }; . ", "url": "/models/custom/surfaceModel.html#summary", "relUrl": "/models/custom/surfaceModel.html#summary" - },"81": { + },"83": { "doc": "Trench Geometry", "title": "Trench Geometry", "content": "#include <psMakeTrench.hpp> . The psMakeTrench class is used to generate a new trench geometry extending in the z (3D) or y (2D) direction, centrally positioned at the origin with the total extent specified in the x and y directions. The trench configuration may include periodic boundaries in both the x and y directions. Users have the flexibility to define the trench’s width, depth, and incorporate tapering with a designated angle. Moreover, the trench can serve as a mask, applying the specified material exclusively to the bottom while the remaining portion adopts the mask material. psMakeTrench(psDomainType domain, const NumericType gridDelta, const NumericType xExtent, const NumericType yExtent, const NumericType trenchWidth, const NumericType trenchDepth, const NumericType taperingAngle = 0., // in degrees const NumericType baseHeight = 0., const bool periodicBoundary = false, const bool makeMask = false, const psMaterial material = psMaterial::None) . | Parameter | Description | Type | . | domain | Specifies the type of domain for the trench geometry. | psSmartPointer<psDomain<NumericType, D>> | . | gridDelta | Represents the grid spacing or resolution used in the simulation. | NumericType | . | xExtent | Defines the extent of the trench geometry in the x-direction. | NumericType | . | yExtent | Specifies the extent of the trench geometry in the y-direction. | NumericType | . | trenchWidth | Sets the width of the trench. | NumericType | . | trenchDepth | Determines the depth of the trench. | NumericType | . | taperingAngle | (Optional) Specifies the angle of tapering for the trench geometry in degrees. Default is set to 0. | NumericType | . | baseHeight | (Optional) Sets the base height of the trench. Default is set to 0. | NumericType | . | periodicBoundary | (Optional) If set to true, enables periodic boundaries in both x and y directions (only applicable in 3D). Default is set to false. | bool | . | makeMask | (Optional) If set to true, allows the trench to function as a mask, with specified material applied only to the bottom. Default is set to false. | bool | . | material | (Optional) Specifies the material used for the trench. Default is set to psMaterial_None. | psMaterial | . Example usage: . C++ . auto domain = psSmartPointer<psDomain<NumericType, D>>::New(); psMakeTrench<NumericType, D>(domain, 0.5, 10.0, 10.0, 5.0, 5.0, 10., 0., false, false, psMaterial::Si) .apply(); . Python . domain = vps.Domain() vps.MakeTrench(domain=domain, gridDelta=0.5, xExtent=10.0, yExtent=10.0, trenchWidth=5.0, trenchDepth=5.0, taperingAngle=10.0, baseHeight=0.0, periodicBoundary=False, makeMask=False, material=vps.Material.Si, ).apply() . ", "url": "/geo/basic/trench.html", "relUrl": "/geo/basic/trench.html" - },"82": { + },"84": { "doc": "Velocity Field", "title": "Velocity Field", "content": ". Coming soon . ", "url": "/models/custom/velocityField.html", "relUrl": "/models/custom/velocityField.html" - },"83": { + },"85": { "doc": "Velocity Field", "title": "Surface Velocity Extension", "content": "| Option | Description | . | 0 | Do not translate level set ID to surface ID. This should be enabled if the surface velocity is only provided in the psVelocityField class and not through the psSurfaceModel class. | . | 1 | Use unordered map to translate level set ID to surface ID. | . | 2 | Use KD-tree to translate level set ID to surface ID. The KD-tree uses a nearest neighbor lookup to determine the closest surface point and according velocity. | . ", "url": "/models/custom/velocityField.html#surface-velocity-extension", "relUrl": "/models/custom/velocityField.html#surface-velocity-extension" - },"84": { - "doc": "Volume Mesh", - "title": "Volume Mesh", - "content": ". Coming soon . ", - "url": "/output/volume.html", - - "relUrl": "/output/volume.html" - },"85": { + },"86": { "doc": "Volume", "title": "Volume", "content": ". A Cell-Set (CS) is used to store and track volume information in the domain. The CS is stored over the whole simulation domain, above and/or below the surface described by the Level-Set. It uses the same grid as the Level-Set, such that each Level-Set grid point acts as the corner of the cells around the point. To determine which material region a cell lies in, the LS values at the cell corner of the material interface are inspected. If the sum of the values is negative the cell belongs to the underlying material, otherwise it represents the material on the other side of the interface. To find a cell in which an arbitrary point in space resides, a bounding volume hierarchy (BVH) is built on top of the CS. This allows for fast access to random cells in the CS. Additionally, cell-neighbor relations are established when setting up the CS. This allows for quick access to neighbor cells. ", "url": "/domain/volume.html", "relUrl": "/domain/volume.html" - },"86": { + },"87": { "doc": "Volume", "title": "How to use the Cell-Set", "content": "To generate the CS from your domain, use the function: . auto domain = psSmartPointer<psDomain<NumericType, D>>::New() ... // Add level-sets to domain ... domain->generateCellSet(position, isCellSetAboveSurface) . The position parameter describes the location of the cell set surface. With the parameter isCellSetAboveSurface one can specify whether the Cell-Set should be placed above or below the surface. If the Cell-Set is above the surface it covers all material in the domain and the position parameter should be set higher than the highest surface point in the domain. ", "url": "/domain/volume.html#how-to-use-the-cell-set", "relUrl": "/domain/volume.html#how-to-use-the-cell-set" - },"87": { + },"88": { "doc": "Volume", "title": "Related Examples", "content": ". | Volume Model | Oxide Regrowth | . ", "url": "/domain/volume.html#related-examples", "relUrl": "/domain/volume.html#related-examples" + },"89": { + "doc": "Volume Mesh", + "title": "Volume Mesh", + "content": ". Documentation Coming soon . Example usage: . C++ . auto domain = psSmartPointer<psDomain<NumericType, D>>::New(); ... // create geometry in domain ... domain->saveVolumeMesh(\"fileName\"); . Python: . domain = vps.Domain() ... # create geometry in domain ... domain.saveVolumeMesh(fileName=\"fileName\") . ", + "url": "/output/volume.html", + + "relUrl": "/output/volume.html" } } diff --git a/docs/_site/output/levelset.html b/docs/_site/output/levelset.html index e10e9256..2e38e845 100644 --- a/docs/_site/output/levelset.html +++ b/docs/_site/output/levelset.html @@ -1 +1,11 @@ - Level Set | ViennaPS Documentation Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Level Set


Coming soon


+ Level Set | ViennaPS Documentation Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Level Set


Saving the Domain

Documentation Coming soon

Visualization

ViennaPS provides a feature enabling users to save the level set grid points explicitly for each material layer within the domain in the VTK file format. This export includes the level set value associated with each grid point. Users also have the option to specify a width parameter, determining the number of grid points around the zero level set. This functionality enhances the ability to analyze and visualize the level set information in a detailed and customizable manner.

Example usage:

C++

auto domain = psSmartPointer<psDomain<NumericType, D>>::New();
+...
+// create geometry in domain
+...
+domain->saveLevelSetMesh("fileNamePrefix", 3 /* width */);
+

Python:

domain = vps.Domain()
+...
+# create geometry in domain
+...
+domain.saveLevelSetMesh(fileName="fileNamePrefix", width=3)
+

diff --git a/docs/_site/output/surface.html b/docs/_site/output/surface.html index 156fed65..71158145 100644 --- a/docs/_site/output/surface.html +++ b/docs/_site/output/surface.html @@ -1 +1,11 @@ - Surface Mesh | ViennaPS Documentation Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Surface Mesh


Coming soon


+ Surface Mesh | ViennaPS Documentation Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Surface Mesh


Documentation Coming soon

Example usage:

C++

auto domain = psSmartPointer<psDomain<NumericType, D>>::New();
+...
+// create geometry in domain
+...
+domain->saveSurfaceMesh("fileName", true);
+

Python:

domain = vps.Domain()
+...
+# create geometry in domain
+...
+domain.saveSurfaceMesh(fileName="fileName", addMaterialIds=True)
+

diff --git a/docs/_site/output/volume.html b/docs/_site/output/volume.html index f029884a..a8914ee1 100644 --- a/docs/_site/output/volume.html +++ b/docs/_site/output/volume.html @@ -1 +1,11 @@ - Volume Mesh | ViennaPS Documentation Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Volume Mesh


Coming soon


+ Volume Mesh | ViennaPS Documentation Skip to main content Link Menu Expand (external link) Document Search Copy Copied

Volume Mesh


Documentation Coming soon

Example usage:

C++

auto domain = psSmartPointer<psDomain<NumericType, D>>::New();
+...
+// create geometry in domain
+...
+domain->saveVolumeMesh("fileName");
+

Python:

domain = vps.Domain()
+...
+# create geometry in domain
+...
+domain.saveVolumeMesh(fileName="fileName")
+

diff --git a/docs/output/levelset.md b/docs/output/levelset.md index 92f208c7..cdec20f2 100644 --- a/docs/output/levelset.md +++ b/docs/output/levelset.md @@ -10,5 +10,41 @@ nav_order: 1 --- -Coming soon -{: .label .label-yellow} \ No newline at end of file +## Saving the Domain + +Documentation Coming soon +{: .label .label-yellow} + +## Visualization + +ViennaPS provides a feature enabling users to save the level set grid points explicitly for each material layer within the domain in the VTK file format. This export includes the level set value associated with each grid point. Users also have the option to specify a width parameter, determining the number of grid points around the zero level set. This functionality enhances the ability to analyze and visualize the level set information in a detailed and customizable manner. + +__Example usage:__ + +
+ +C++ +{: .label .label-blue } + +```c++ +auto domain = psSmartPointer>::New(); +... +// create geometry in domain +... +domain->saveLevelSetMesh("fileNamePrefix", 3 /* width */); +``` +
+ +
+ +Python: +{: .label .label-green } + +```python +domain = vps.Domain() +... +# create geometry in domain +... +domain.saveLevelSetMesh(fileName="fileNamePrefix", width=3) +``` +
\ No newline at end of file diff --git a/docs/output/surface.md b/docs/output/surface.md index 383c912c..6528d6a8 100644 --- a/docs/output/surface.md +++ b/docs/output/surface.md @@ -10,5 +10,35 @@ nav_order: 2 --- -Coming soon -{: .label .label-yellow} \ No newline at end of file +Documentation Coming soon +{: .label .label-yellow} + +__Example usage:__ + +
+ +C++ +{: .label .label-blue } + +```c++ +auto domain = psSmartPointer>::New(); +... +// create geometry in domain +... +domain->saveSurfaceMesh("fileName", true); +``` +
+ +
+ +Python: +{: .label .label-green } + +```python +domain = vps.Domain() +... +# create geometry in domain +... +domain.saveSurfaceMesh(fileName="fileName", addMaterialIds=True) +``` +
\ No newline at end of file diff --git a/docs/output/volume.md b/docs/output/volume.md index 47016c3a..4e7003ad 100644 --- a/docs/output/volume.md +++ b/docs/output/volume.md @@ -10,5 +10,35 @@ nav_order: 3 --- -Coming soon -{: .label .label-yellow} \ No newline at end of file +Documentation Coming soon +{: .label .label-yellow} + +__Example usage:__ + +
+ +C++ +{: .label .label-blue } + +```c++ +auto domain = psSmartPointer>::New(); +... +// create geometry in domain +... +domain->saveVolumeMesh("fileName"); +``` +
+ +
+ +Python: +{: .label .label-green } + +```python +domain = vps.Domain() +... +# create geometry in domain +... +domain.saveVolumeMesh(fileName="fileName") +``` +
\ No newline at end of file diff --git a/include/psDomain.hpp b/include/psDomain.hpp index e3b397b8..af29e584 100644 --- a/include/psDomain.hpp +++ b/include/psDomain.hpp @@ -218,7 +218,8 @@ template class psDomain { std::cout << "**************************" << std::endl; } - // Save the level set as a VTK file. + // Save all level sets as a VTK files. The width parameter specifies the + // number of grid points around the zero level set to be saved. void saveLevelSetMesh(std::string name, int width = 1) { for (int i = 0; i < levelSets->size(); i++) { auto mesh = psSmartPointer>::New();