├── images ├── Example.jpeg ├── Nanostructures.pdf └── Nanostructures.png ├── __pycache__ └── HelperFunctions.cpython-310.pyc ├── AdvectionDiffusion ├── run.sh ├── CMakeLists.txt └── AdvectionDiffusion.cpp ├── .gitignore ├── ChannelGenerator.py ├── README.md ├── ChannelGeometries ├── Cube.stl ├── Groove.stl ├── Step.stl └── Offset.stl └── HelperFunctions.py /images/Example.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cda-tum/mmft-fuel-cell/HEAD/images/Example.jpeg -------------------------------------------------------------------------------- /images/Nanostructures.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cda-tum/mmft-fuel-cell/HEAD/images/Nanostructures.pdf -------------------------------------------------------------------------------- /images/Nanostructures.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cda-tum/mmft-fuel-cell/HEAD/images/Nanostructures.png -------------------------------------------------------------------------------- /__pycache__/HelperFunctions.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cda-tum/mmft-fuel-cell/HEAD/__pycache__/HelperFunctions.cpython-310.pyc -------------------------------------------------------------------------------- /AdvectionDiffusion/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | nproc=$1 3 | N=$2 4 | 5 | if [ ! -d "./tmpCube/" ]; then 6 | mkdir ./tmpCube/ 7 | fi 8 | mpirun -np ${nproc} ./AdvectionDiffusion ${N} ../ChannelGeometries/Cube.stl ./tmpCube/ &> Cube.out 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | *.smod 22 | 23 | # Compiled Static libraries 24 | *.lai 25 | *.la 26 | *.a 27 | *.lib 28 | 29 | # Executables 30 | *.exe 31 | *.out 32 | *.app 33 | 34 | # Exclude directories 35 | build/ 36 | external/*/ 37 | .cache/ 38 | .vscode 39 | -------------------------------------------------------------------------------- /ChannelGenerator.py: -------------------------------------------------------------------------------- 1 | from HelperFunctions import * 2 | import numpy as np 3 | from scipy.spatial import Delaunay 4 | import triangle as tr 5 | 6 | def main(): 7 | Channels_3D() 8 | 9 | def Channels_3D(): 10 | """3D channels with a selection of nanostructures: Cubes, Steps, Grooves, and Offset Cubes. 11 | The nanostructure can be set in Type.""" 12 | 13 | # The four different types. 14 | Types = ["Cube","Step","Groove","Offset"] 15 | # Select here the nanostructure type to be generated. 16 | Type = Types[0] 17 | 18 | origin = [0.0,0.0,0.0] 19 | 20 | # Variables to for defining nanostructure dimension and frequency. 21 | channelWidths = [30,60,120] 22 | channelLengths = [30,60,120] 23 | Heights = [20,30,40] 24 | Lengths = [30,60,120] 25 | Widths = [30,60,120] 26 | for channelWidth in channelWidths: 27 | for channelLength in channelLengths: 28 | for height in Heights: 29 | for length in Lengths: 30 | for width in Widths: 31 | dim = [(channelWidth+width)*1e-8,(channelLength+length)*1e-8,0.5e-6] 32 | stepDim = [width*1e-8,length*1e-8,height*1e-8] 33 | match Type: 34 | case "Cube": 35 | cube = Cube(origin,dim,stepDim) 36 | filename = "ChannelGeometries/{}_cW{}_cL{}_H{}_L{}_W{}.stl".format("Cube",\ 37 | channelWidth,channelLength,height,length,width) 38 | case "Step": 39 | cube = Cube(origin,dim,stepDim) 40 | filename = "ChannelGeometries/{}_cL{}_H{}_L{}.stl".format("Step",\ 41 | channelLength,height,length) 42 | case "Groove": 43 | cube = Cube(origin,dim,stepDim) 44 | filename = "ChannelGeometries/{}_cW{}_H{}_W{}.stl".format("Groove",\ 45 | channelWidth,height,width) 46 | case "Offset": 47 | cube = OffsetCube(origin,dim,stepDim) 48 | filename = "ChannelGeometries/{}_cW{}_cL{}_H{}_L{}_W{}.stl".format("Offset",\ 49 | channelWidth,channelLength,height,length,width) 50 | cube.write(filename) 51 | 52 | 53 | if __name__ == "__main__": 54 | main() 55 | -------------------------------------------------------------------------------- /AdvectionDiffusion/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | if(CI) 2 | ############################################################################### 3 | 4 | set(EXECUTABLE_NAME "AdvectionDiffusion") 5 | 6 | set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) 7 | 8 | ############################################################################### 9 | 10 | get_filename_component(PROJECT_NAME ${CMAKE_CURRENT_SOURCE_DIR} NAME) 11 | add_executable(${PROJECT_NAME} "./${EXECUTABLE_NAME}.cpp") 12 | 13 | # Link with the following libraries 14 | target_link_libraries(${PROJECT_NAME} palabos) 15 | if(ENABLE_MPI) 16 | target_link_libraries(${PROJECT_NAME} ${MPI_CXX_LIBRARIES}) 17 | endif() 18 | 19 | ############################################################################### 20 | 21 | # This returns when you compile Palabos and all the examples (root CMakeLists.txt) 22 | return() 23 | 24 | ############################################################################### 25 | endif() 26 | 27 | cmake_minimum_required(VERSION 2.8.12) 28 | 29 | project(palabosExample) 30 | enable_language(CXX) 31 | 32 | set(EXECUTABLE_NAME "AdvectionDiffusion") 33 | set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "../") 34 | 35 | if(NOT CMAKE_BUILD_TYPE) 36 | set(CMAKE_BUILD_TYPE "Release") 37 | #set(CMAKE_CONFIGURATION_TYPES "Debug;Release") 38 | endif() 39 | message("Generated with config types: ${CMAKE_CONFIGURATION_TYPES}") 40 | message(${CMAKE_BUILD_TYPE}) 41 | 42 | # Compiler flags 43 | # Append flags: set(CMAKE_XXX_FLAGS "${CMAKE_XXX_FLAGS} ...") 44 | if(${CMAKE_CXX_COMPILER_ID} STREQUAL GNU) 45 | message("GCC.") 46 | set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -Wnon-virtual-dtor") 47 | set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") 48 | set(CMAKE_CXX_FLAGS_DEBUG "-g -DPLB_DEBUG -O0") 49 | elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL Clang) 50 | message("Clang.") 51 | set(CMAKE_CXX_FLAGS "-std=c++11 -Wall -Wnon-virtual-dtor") 52 | set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") 53 | set(CMAKE_CXX_FLAGS_DEBUG "-g -DPLB_DEBUG -O0") 54 | elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC) 55 | message("MSVC.") 56 | set(CMAKE_CXX_FLAGS_RELEASE "/Ox /Ot /GS- /GL /DNDEBUG") 57 | set(CMAKE_CXX_FLAGS_DEBUG "/DPLB_DEBUG") 58 | set(CMAKE_EXE_LINKER_FLAGS_RELEASE "/LTCG /INCREMENTAL:NO /OPT:REF") 59 | else() 60 | message( FATAL_ERROR "CXX compiler not recognized. CMake will quit." ) 61 | endif() 62 | 63 | option(ENABLE_MPI "Enable MPI" ON) 64 | if(ENABLE_MPI) 65 | message("Enabling MPI") 66 | find_package(MPI REQUIRED) 67 | if(MPI_CXX_FOUND) 68 | #set(CMAKE_CXX_COMPILER "${MPI_CXX_COMPILER}") 69 | include_directories(${MPI_CXX_INCLUDE_PATH}) 70 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MPI_CXX_COMPILE_FLAGS}") 71 | add_definitions(-DPLB_MPI_PARALLEL) 72 | endif() 73 | endif() 74 | 75 | if(WIN32) 76 | option(ENABLE_POSIX "Enable POSIX" OFF) 77 | else() 78 | option(ENABLE_POSIX "Enable POSIX" ON) 79 | endif() 80 | 81 | if(ENABLE_POSIX) 82 | message("Enabling POSIX") 83 | add_definitions(-DPLB_USE_POSIX) 84 | endif() 85 | 86 | if(APPLE) 87 | add_definitions(-DPLB_MAC_OS_X) 88 | endif() 89 | 90 | if(WIN32 OR CYGWIN) 91 | add_definitions(-DPLB_WINDOWS) 92 | endif() 93 | 94 | ############################################################################### 95 | # Palabos Library 96 | ############################################################################### 97 | 98 | include_directories("pathToPalabos/src") 99 | include_directories("pathToPalabos/externalLibraries") 100 | include_directories("pathToPalabos/externalLibraries/Eigen3") 101 | 102 | file(GLOB_RECURSE PALABOS_SRC "pathToPalabos/src/*.cpp") 103 | file(GLOB_RECURSE EXT_SRC "pathToPalabos/externalLibraries/tinyxml/*.cpp") 104 | 105 | add_library(palabos STATIC ${PALABOS_SRC} ${EXT_SRC}) 106 | 107 | ############################################################################### 108 | 109 | add_executable(${EXECUTABLE_NAME} "./${EXECUTABLE_NAME}.cpp") 110 | 111 | # Link with the following libraries 112 | target_link_libraries(${EXECUTABLE_NAME} palabos) 113 | if(ENABLE_MPI) 114 | target_link_libraries(${EXECUTABLE_NAME} ${MPI_CXX_LIBRARIES}) 115 | endif() 116 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MMFT Fuel Cell 2 | 3 | The Microfluidic Fuel Cell (MFFC) simulator is developed by the [Chair for Design Automation](https://www.cda.cit.tum.de/) at the [Technical University of Munich](https://www.tum.de/), as part of the Munich MicroFluidic Toolkit (MMFT). This simulator models the hydrogen transport in a liquid electrolyte for microfluidic applications on anode surfaces with _nanostructures_. More details about the implementation can be found in: 4 | 5 | [[1]](https://www.cda.cit.tum.de/files/eda/2022_microtas_improved_performance_of_two_phase_microfluidic_fuel_cells_using_nanostructures.pdf) Takken, Michel and Wille, Robert. Improved Performance of Membraneless Microfluidic Fuel Cells Using Nanostructures: A Numerical Study. MicroTAS, 2022. 6 | 7 | The simulation is based on the Navier-Stokes equations with the advection-diffusion equation, and is solved with the lattice Boltzmann method (LBM). The LBM solver used is the Parallel Lattice Boltzmann Solver: [Palabos](https://palabos.unige.ch/) v2.3.0. 8 | 9 | [[2]](https://doi.org/10.1016/j.camwa.2020.03.022) Latt, Jonas, et al. Palabos: parallel lattice Boltzmann solver. Computers & Mathematics with Applications, 2021. 10 | 11 | For more information about our work on Microfluidics, please visit [https://www.cda.cit.tum.de/research/microfluidics/]( https://www.cda.cit.tum.de/research/microfluidics/). 12 | 13 | If you have any questions, feel free to contact us via [microfluidics.cda@xcit.tum.de](microfluidics.cda@xcit.tum.de) or by creating an issue on GitHub. 14 | 15 | ## System Requirements 16 | This repository has been tested and works for Ubuntu 20.6. Minimal system requirements are: 17 | 18 | * Palabos v2.3.0 19 | * CMake version 2.8.12 20 | * MPI version 4.1 21 | * Python 3.10 22 | 23 | ## Usage 24 | 25 | 26 | #### Install Palabos as the fluid solver 27 | Install the latest version of Palabos [here](https://gitlab.com/unigespc/palabos), for more info see [https://palabos.unige.ch/](https://palabos.unige.ch/). 28 | 29 | In `AdvectionDiffusion/CMakeLists.txt` specify the location of your palabos library 30 | 31 | ``` 32 | ############################################################################### 33 | # Palabos Library 34 | ############################################################################### 35 | 36 | include_directories("pathToPalabos/src") 37 | include_directories("pathToPalabos/externalLibraries") 38 | include_directories("pathToPalabos/externalLibraries/Eigen3") 39 | 40 | file(GLOB_RECURSE PALABOS_SRC "pathToPalabos/src/*.cpp") 41 | file(GLOB_RECURSE EXT_SRC "pathToPalabos/externalLibraries/tinyxml/*.cpp") 42 | ``` 43 | 44 | then go to `build/` and do the following commands 45 | 46 | `cmake ..` 47 | 48 | `make` 49 | 50 | After the executable is created in `AdvectionDiffusion/` you can do a test run with 51 | 52 | `./run.sh 1 50` 53 | 54 | to do a test run on cubic nanostructures, where 1 is the number of processors, and 50 the amount of cells in the z direction. 55 | 56 | #### Geometry generation 57 | 58 | To generate a shape with dimensions, use 59 | 60 | `python3 ChannelGenerator.py` 61 | 62 | The available shapes are 63 | 64 | * cube 65 | * Step 66 | * Groove 67 | * Offset (for the offset cubes) 68 | 69 | The dimensions of the elements are given by the following variables, and can be set in `ChannelGenerator.py` 70 | 71 | ![](images/Nanostructures.png) 72 | 73 | Please note that for steps the channel width is 0, and for grooves, the channel length is 0. For offset cubes, choose channel width 0, to have an offset that is equal to the cube width. 74 | 75 | ## Example 76 | 77 | For a cube with channel width and length 300 nanometers, width and length 300 nanometers, andheight 400 nanometers, the resulting flow velocity field is shown below. The effective flux for this nanostructure is 780% better than for a flat surface, whereas the total surface is increased by 130%. 78 | 79 | ![](images/Example.jpeg) 80 | 81 | ## References 82 | [[1]](https://www.cda.cit.tum.de/files/eda/2022_microtas_improved_performance_of_two_phase_microfluidic_fuel_cells_using_nanostructures.pdf) Takken, Michel and Wille, Robert. Improved Performance of Membraneless Microfluidic Fuel Cells Using Nanostructures: A Numerical Study. MicroTAS, 2022. 83 | 84 | [[2]](https://doi.org/10.1016/j.camwa.2020.03.022) Latt, Jonas, et al. Palabos: parallel lattice Boltzmann solver. Computers & Mathematics with Applications, 2021. 85 | 86 | [[3]](https://doi.org/10.1016/j.jpowsour.2017.02.079) Hashemi, S. M. H., et al. Membrane-less micro fuel cell based on two-phase flow. Journal of Power Sources, 2017. 87 | -------------------------------------------------------------------------------- /ChannelGeometries/Cube.stl: -------------------------------------------------------------------------------- 1 | solid 2 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 3 | outer loop 4 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 5 | vertex 6.000000e-07 0.000000e+00 0.000000e+00 6 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 7 | endloop 8 | endfacet 9 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 10 | outer loop 11 | vertex 6.000000e-07 0.000000e+00 0.000000e+00 12 | vertex 6.000000e-07 0.000000e+00 5.000000e-07 13 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 14 | endloop 15 | endfacet 16 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 17 | outer loop 18 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 19 | vertex 0.000000e+00 6.000000e-07 5.000000e-07 20 | vertex 6.000000e-07 6.000000e-07 0.000000e+00 21 | endloop 22 | endfacet 23 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 24 | outer loop 25 | vertex 0.000000e+00 6.000000e-07 5.000000e-07 26 | vertex 6.000000e-07 6.000000e-07 5.000000e-07 27 | vertex 6.000000e-07 6.000000e-07 0.000000e+00 28 | endloop 29 | endfacet 30 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 31 | outer loop 32 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 33 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 34 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 35 | endloop 36 | endfacet 37 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 38 | outer loop 39 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 40 | vertex 0.000000e+00 6.000000e-07 5.000000e-07 41 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 42 | endloop 43 | endfacet 44 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 45 | outer loop 46 | vertex 6.000000e-07 0.000000e+00 0.000000e+00 47 | vertex 6.000000e-07 6.000000e-07 0.000000e+00 48 | vertex 6.000000e-07 0.000000e+00 5.000000e-07 49 | endloop 50 | endfacet 51 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 52 | outer loop 53 | vertex 6.000000e-07 6.000000e-07 0.000000e+00 54 | vertex 6.000000e-07 6.000000e-07 5.000000e-07 55 | vertex 6.000000e-07 0.000000e+00 5.000000e-07 56 | endloop 57 | endfacet 58 | facet normal 0.000000e+00 0.000000e+00 1.000000e+00 59 | outer loop 60 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 61 | vertex 6.000000e-07 0.000000e+00 5.000000e-07 62 | vertex 0.000000e+00 6.000000e-07 5.000000e-07 63 | endloop 64 | endfacet 65 | facet normal 0.000000e+00 0.000000e+00 1.000000e+00 66 | outer loop 67 | vertex 6.000000e-07 0.000000e+00 5.000000e-07 68 | vertex 6.000000e-07 6.000000e-07 5.000000e-07 69 | vertex 0.000000e+00 6.000000e-07 5.000000e-07 70 | endloop 71 | endfacet 72 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 73 | outer loop 74 | vertex 1.500000e-07 1.500000e-07 0.000000e+00 75 | vertex 1.500000e-07 1.500000e-07 4.000000e-07 76 | vertex 4.500000e-07 1.500000e-07 0.000000e+00 77 | endloop 78 | endfacet 79 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 80 | outer loop 81 | vertex 1.500000e-07 1.500000e-07 4.000000e-07 82 | vertex 4.500000e-07 1.500000e-07 4.000000e-07 83 | vertex 4.500000e-07 1.500000e-07 0.000000e+00 84 | endloop 85 | endfacet 86 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 87 | outer loop 88 | vertex 1.500000e-07 4.500000e-07 4.000000e-07 89 | vertex 1.500000e-07 4.500000e-07 0.000000e+00 90 | vertex 4.500000e-07 4.500000e-07 4.000000e-07 91 | endloop 92 | endfacet 93 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 94 | outer loop 95 | vertex 1.500000e-07 4.500000e-07 0.000000e+00 96 | vertex 4.500000e-07 4.500000e-07 0.000000e+00 97 | vertex 4.500000e-07 4.500000e-07 4.000000e-07 98 | endloop 99 | endfacet 100 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 101 | outer loop 102 | vertex 1.500000e-07 1.500000e-07 0.000000e+00 103 | vertex 1.500000e-07 4.500000e-07 0.000000e+00 104 | vertex 1.500000e-07 1.500000e-07 4.000000e-07 105 | endloop 106 | endfacet 107 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 108 | outer loop 109 | vertex 1.500000e-07 4.500000e-07 0.000000e+00 110 | vertex 1.500000e-07 4.500000e-07 4.000000e-07 111 | vertex 1.500000e-07 1.500000e-07 4.000000e-07 112 | endloop 113 | endfacet 114 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 115 | outer loop 116 | vertex 4.500000e-07 1.500000e-07 0.000000e+00 117 | vertex 4.500000e-07 1.500000e-07 4.000000e-07 118 | vertex 4.500000e-07 4.500000e-07 0.000000e+00 119 | endloop 120 | endfacet 121 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 122 | outer loop 123 | vertex 4.500000e-07 1.500000e-07 4.000000e-07 124 | vertex 4.500000e-07 4.500000e-07 4.000000e-07 125 | vertex 4.500000e-07 4.500000e-07 0.000000e+00 126 | endloop 127 | endfacet 128 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 129 | outer loop 130 | vertex 1.500000e-07 1.500000e-07 4.000000e-07 131 | vertex 1.500000e-07 4.500000e-07 4.000000e-07 132 | vertex 4.500000e-07 1.500000e-07 4.000000e-07 133 | endloop 134 | endfacet 135 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 136 | outer loop 137 | vertex 1.500000e-07 4.500000e-07 4.000000e-07 138 | vertex 4.500000e-07 4.500000e-07 4.000000e-07 139 | vertex 4.500000e-07 1.500000e-07 4.000000e-07 140 | endloop 141 | endfacet 142 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 143 | outer loop 144 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 145 | vertex 4.500000e-07 1.500000e-07 0.000000e+00 146 | vertex 6.000000e-07 0.000000e+00 0.000000e+00 147 | endloop 148 | endfacet 149 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 150 | outer loop 151 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 152 | vertex 1.500000e-07 1.500000e-07 0.000000e+00 153 | vertex 4.500000e-07 1.500000e-07 0.000000e+00 154 | endloop 155 | endfacet 156 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 157 | outer loop 158 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 159 | vertex 1.500000e-07 1.500000e-07 0.000000e+00 160 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 161 | endloop 162 | endfacet 163 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 164 | outer loop 165 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 166 | vertex 1.500000e-07 4.500000e-07 0.000000e+00 167 | vertex 1.500000e-07 1.500000e-07 0.000000e+00 168 | endloop 169 | endfacet 170 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 171 | outer loop 172 | vertex 6.000000e-07 6.000000e-07 0.000000e+00 173 | vertex 1.500000e-07 4.500000e-07 0.000000e+00 174 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 175 | endloop 176 | endfacet 177 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 178 | outer loop 179 | vertex 6.000000e-07 6.000000e-07 0.000000e+00 180 | vertex 4.500000e-07 4.500000e-07 0.000000e+00 181 | vertex 1.500000e-07 4.500000e-07 0.000000e+00 182 | endloop 183 | endfacet 184 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 185 | outer loop 186 | vertex 6.000000e-07 0.000000e+00 0.000000e+00 187 | vertex 4.500000e-07 4.500000e-07 0.000000e+00 188 | vertex 6.000000e-07 6.000000e-07 0.000000e+00 189 | endloop 190 | endfacet 191 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 192 | outer loop 193 | vertex 6.000000e-07 0.000000e+00 0.000000e+00 194 | vertex 4.500000e-07 1.500000e-07 0.000000e+00 195 | vertex 4.500000e-07 4.500000e-07 0.000000e+00 196 | endloop 197 | endfacet 198 | endsolid -------------------------------------------------------------------------------- /ChannelGeometries/Groove.stl: -------------------------------------------------------------------------------- 1 | solid 2 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 3 | outer loop 4 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 5 | vertex 6.000000e-07 0.000000e+00 0.000000e+00 6 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 7 | endloop 8 | endfacet 9 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 10 | outer loop 11 | vertex 6.000000e-07 0.000000e+00 0.000000e+00 12 | vertex 6.000000e-07 0.000000e+00 5.000000e-07 13 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 14 | endloop 15 | endfacet 16 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 17 | outer loop 18 | vertex 0.000000e+00 3.000000e-07 0.000000e+00 19 | vertex 0.000000e+00 3.000000e-07 5.000000e-07 20 | vertex 6.000000e-07 3.000000e-07 0.000000e+00 21 | endloop 22 | endfacet 23 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 24 | outer loop 25 | vertex 0.000000e+00 3.000000e-07 5.000000e-07 26 | vertex 6.000000e-07 3.000000e-07 5.000000e-07 27 | vertex 6.000000e-07 3.000000e-07 0.000000e+00 28 | endloop 29 | endfacet 30 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 31 | outer loop 32 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 33 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 34 | vertex 0.000000e+00 3.000000e-07 0.000000e+00 35 | endloop 36 | endfacet 37 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 38 | outer loop 39 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 40 | vertex 0.000000e+00 3.000000e-07 5.000000e-07 41 | vertex 0.000000e+00 3.000000e-07 0.000000e+00 42 | endloop 43 | endfacet 44 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 45 | outer loop 46 | vertex 6.000000e-07 0.000000e+00 0.000000e+00 47 | vertex 6.000000e-07 3.000000e-07 0.000000e+00 48 | vertex 6.000000e-07 0.000000e+00 5.000000e-07 49 | endloop 50 | endfacet 51 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 52 | outer loop 53 | vertex 6.000000e-07 3.000000e-07 0.000000e+00 54 | vertex 6.000000e-07 3.000000e-07 5.000000e-07 55 | vertex 6.000000e-07 0.000000e+00 5.000000e-07 56 | endloop 57 | endfacet 58 | facet normal 0.000000e+00 0.000000e+00 1.000000e+00 59 | outer loop 60 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 61 | vertex 6.000000e-07 0.000000e+00 5.000000e-07 62 | vertex 0.000000e+00 3.000000e-07 5.000000e-07 63 | endloop 64 | endfacet 65 | facet normal 0.000000e+00 0.000000e+00 1.000000e+00 66 | outer loop 67 | vertex 6.000000e-07 0.000000e+00 5.000000e-07 68 | vertex 6.000000e-07 3.000000e-07 5.000000e-07 69 | vertex 0.000000e+00 3.000000e-07 5.000000e-07 70 | endloop 71 | endfacet 72 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 73 | outer loop 74 | vertex 1.500000e-07 0.000000e+00 0.000000e+00 75 | vertex 1.500000e-07 0.000000e+00 4.000000e-07 76 | vertex 4.500000e-07 0.000000e+00 0.000000e+00 77 | endloop 78 | endfacet 79 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 80 | outer loop 81 | vertex 1.500000e-07 0.000000e+00 4.000000e-07 82 | vertex 4.500000e-07 0.000000e+00 4.000000e-07 83 | vertex 4.500000e-07 0.000000e+00 0.000000e+00 84 | endloop 85 | endfacet 86 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 87 | outer loop 88 | vertex 1.500000e-07 3.000000e-07 4.000000e-07 89 | vertex 1.500000e-07 3.000000e-07 0.000000e+00 90 | vertex 4.500000e-07 3.000000e-07 4.000000e-07 91 | endloop 92 | endfacet 93 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 94 | outer loop 95 | vertex 1.500000e-07 3.000000e-07 0.000000e+00 96 | vertex 4.500000e-07 3.000000e-07 0.000000e+00 97 | vertex 4.500000e-07 3.000000e-07 4.000000e-07 98 | endloop 99 | endfacet 100 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 101 | outer loop 102 | vertex 1.500000e-07 0.000000e+00 0.000000e+00 103 | vertex 1.500000e-07 3.000000e-07 0.000000e+00 104 | vertex 1.500000e-07 0.000000e+00 4.000000e-07 105 | endloop 106 | endfacet 107 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 108 | outer loop 109 | vertex 1.500000e-07 3.000000e-07 0.000000e+00 110 | vertex 1.500000e-07 3.000000e-07 4.000000e-07 111 | vertex 1.500000e-07 0.000000e+00 4.000000e-07 112 | endloop 113 | endfacet 114 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 115 | outer loop 116 | vertex 4.500000e-07 0.000000e+00 0.000000e+00 117 | vertex 4.500000e-07 0.000000e+00 4.000000e-07 118 | vertex 4.500000e-07 3.000000e-07 0.000000e+00 119 | endloop 120 | endfacet 121 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 122 | outer loop 123 | vertex 4.500000e-07 0.000000e+00 4.000000e-07 124 | vertex 4.500000e-07 3.000000e-07 4.000000e-07 125 | vertex 4.500000e-07 3.000000e-07 0.000000e+00 126 | endloop 127 | endfacet 128 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 129 | outer loop 130 | vertex 1.500000e-07 0.000000e+00 4.000000e-07 131 | vertex 1.500000e-07 3.000000e-07 4.000000e-07 132 | vertex 4.500000e-07 0.000000e+00 4.000000e-07 133 | endloop 134 | endfacet 135 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 136 | outer loop 137 | vertex 1.500000e-07 3.000000e-07 4.000000e-07 138 | vertex 4.500000e-07 3.000000e-07 4.000000e-07 139 | vertex 4.500000e-07 0.000000e+00 4.000000e-07 140 | endloop 141 | endfacet 142 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 143 | outer loop 144 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 145 | vertex 4.500000e-07 0.000000e+00 0.000000e+00 146 | vertex 6.000000e-07 0.000000e+00 0.000000e+00 147 | endloop 148 | endfacet 149 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 150 | outer loop 151 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 152 | vertex 1.500000e-07 0.000000e+00 0.000000e+00 153 | vertex 4.500000e-07 0.000000e+00 0.000000e+00 154 | endloop 155 | endfacet 156 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 157 | outer loop 158 | vertex 0.000000e+00 3.000000e-07 0.000000e+00 159 | vertex 1.500000e-07 0.000000e+00 0.000000e+00 160 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 161 | endloop 162 | endfacet 163 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 164 | outer loop 165 | vertex 0.000000e+00 3.000000e-07 0.000000e+00 166 | vertex 1.500000e-07 3.000000e-07 0.000000e+00 167 | vertex 1.500000e-07 0.000000e+00 0.000000e+00 168 | endloop 169 | endfacet 170 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 171 | outer loop 172 | vertex 6.000000e-07 3.000000e-07 0.000000e+00 173 | vertex 1.500000e-07 3.000000e-07 0.000000e+00 174 | vertex 0.000000e+00 3.000000e-07 0.000000e+00 175 | endloop 176 | endfacet 177 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 178 | outer loop 179 | vertex 6.000000e-07 3.000000e-07 0.000000e+00 180 | vertex 4.500000e-07 3.000000e-07 0.000000e+00 181 | vertex 1.500000e-07 3.000000e-07 0.000000e+00 182 | endloop 183 | endfacet 184 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 185 | outer loop 186 | vertex 6.000000e-07 0.000000e+00 0.000000e+00 187 | vertex 4.500000e-07 3.000000e-07 0.000000e+00 188 | vertex 6.000000e-07 3.000000e-07 0.000000e+00 189 | endloop 190 | endfacet 191 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 192 | outer loop 193 | vertex 6.000000e-07 0.000000e+00 0.000000e+00 194 | vertex 4.500000e-07 0.000000e+00 0.000000e+00 195 | vertex 4.500000e-07 3.000000e-07 0.000000e+00 196 | endloop 197 | endfacet 198 | endsolid -------------------------------------------------------------------------------- /ChannelGeometries/Step.stl: -------------------------------------------------------------------------------- 1 | solid 2 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 3 | outer loop 4 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 5 | vertex 3.000000e-07 0.000000e+00 0.000000e+00 6 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 7 | endloop 8 | endfacet 9 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 10 | outer loop 11 | vertex 3.000000e-07 0.000000e+00 0.000000e+00 12 | vertex 3.000000e-07 0.000000e+00 5.000000e-07 13 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 14 | endloop 15 | endfacet 16 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 17 | outer loop 18 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 19 | vertex 0.000000e+00 6.000000e-07 5.000000e-07 20 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 21 | endloop 22 | endfacet 23 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 24 | outer loop 25 | vertex 0.000000e+00 6.000000e-07 5.000000e-07 26 | vertex 3.000000e-07 6.000000e-07 5.000000e-07 27 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 28 | endloop 29 | endfacet 30 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 31 | outer loop 32 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 33 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 34 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 35 | endloop 36 | endfacet 37 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 38 | outer loop 39 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 40 | vertex 0.000000e+00 6.000000e-07 5.000000e-07 41 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 42 | endloop 43 | endfacet 44 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 45 | outer loop 46 | vertex 3.000000e-07 0.000000e+00 0.000000e+00 47 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 48 | vertex 3.000000e-07 0.000000e+00 5.000000e-07 49 | endloop 50 | endfacet 51 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 52 | outer loop 53 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 54 | vertex 3.000000e-07 6.000000e-07 5.000000e-07 55 | vertex 3.000000e-07 0.000000e+00 5.000000e-07 56 | endloop 57 | endfacet 58 | facet normal 0.000000e+00 0.000000e+00 1.000000e+00 59 | outer loop 60 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 61 | vertex 3.000000e-07 0.000000e+00 5.000000e-07 62 | vertex 0.000000e+00 6.000000e-07 5.000000e-07 63 | endloop 64 | endfacet 65 | facet normal 0.000000e+00 0.000000e+00 1.000000e+00 66 | outer loop 67 | vertex 3.000000e-07 0.000000e+00 5.000000e-07 68 | vertex 3.000000e-07 6.000000e-07 5.000000e-07 69 | vertex 0.000000e+00 6.000000e-07 5.000000e-07 70 | endloop 71 | endfacet 72 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 73 | outer loop 74 | vertex 0.000000e+00 1.500000e-07 0.000000e+00 75 | vertex 0.000000e+00 1.500000e-07 4.000000e-07 76 | vertex 3.000000e-07 1.500000e-07 0.000000e+00 77 | endloop 78 | endfacet 79 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 80 | outer loop 81 | vertex 0.000000e+00 1.500000e-07 4.000000e-07 82 | vertex 3.000000e-07 1.500000e-07 4.000000e-07 83 | vertex 3.000000e-07 1.500000e-07 0.000000e+00 84 | endloop 85 | endfacet 86 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 87 | outer loop 88 | vertex 0.000000e+00 4.500000e-07 4.000000e-07 89 | vertex 0.000000e+00 4.500000e-07 0.000000e+00 90 | vertex 3.000000e-07 4.500000e-07 4.000000e-07 91 | endloop 92 | endfacet 93 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 94 | outer loop 95 | vertex 0.000000e+00 4.500000e-07 0.000000e+00 96 | vertex 3.000000e-07 4.500000e-07 0.000000e+00 97 | vertex 3.000000e-07 4.500000e-07 4.000000e-07 98 | endloop 99 | endfacet 100 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 101 | outer loop 102 | vertex 0.000000e+00 1.500000e-07 0.000000e+00 103 | vertex 0.000000e+00 4.500000e-07 0.000000e+00 104 | vertex 0.000000e+00 1.500000e-07 4.000000e-07 105 | endloop 106 | endfacet 107 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 108 | outer loop 109 | vertex 0.000000e+00 4.500000e-07 0.000000e+00 110 | vertex 0.000000e+00 4.500000e-07 4.000000e-07 111 | vertex 0.000000e+00 1.500000e-07 4.000000e-07 112 | endloop 113 | endfacet 114 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 115 | outer loop 116 | vertex 3.000000e-07 1.500000e-07 0.000000e+00 117 | vertex 3.000000e-07 1.500000e-07 4.000000e-07 118 | vertex 3.000000e-07 4.500000e-07 0.000000e+00 119 | endloop 120 | endfacet 121 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 122 | outer loop 123 | vertex 3.000000e-07 1.500000e-07 4.000000e-07 124 | vertex 3.000000e-07 4.500000e-07 4.000000e-07 125 | vertex 3.000000e-07 4.500000e-07 0.000000e+00 126 | endloop 127 | endfacet 128 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 129 | outer loop 130 | vertex 0.000000e+00 1.500000e-07 4.000000e-07 131 | vertex 0.000000e+00 4.500000e-07 4.000000e-07 132 | vertex 3.000000e-07 1.500000e-07 4.000000e-07 133 | endloop 134 | endfacet 135 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 136 | outer loop 137 | vertex 0.000000e+00 4.500000e-07 4.000000e-07 138 | vertex 3.000000e-07 4.500000e-07 4.000000e-07 139 | vertex 3.000000e-07 1.500000e-07 4.000000e-07 140 | endloop 141 | endfacet 142 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 143 | outer loop 144 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 145 | vertex 3.000000e-07 1.500000e-07 0.000000e+00 146 | vertex 3.000000e-07 0.000000e+00 0.000000e+00 147 | endloop 148 | endfacet 149 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 150 | outer loop 151 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 152 | vertex 0.000000e+00 1.500000e-07 0.000000e+00 153 | vertex 3.000000e-07 1.500000e-07 0.000000e+00 154 | endloop 155 | endfacet 156 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 157 | outer loop 158 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 159 | vertex 0.000000e+00 1.500000e-07 0.000000e+00 160 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 161 | endloop 162 | endfacet 163 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 164 | outer loop 165 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 166 | vertex 0.000000e+00 4.500000e-07 0.000000e+00 167 | vertex 0.000000e+00 1.500000e-07 0.000000e+00 168 | endloop 169 | endfacet 170 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 171 | outer loop 172 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 173 | vertex 0.000000e+00 4.500000e-07 0.000000e+00 174 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 175 | endloop 176 | endfacet 177 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 178 | outer loop 179 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 180 | vertex 3.000000e-07 4.500000e-07 0.000000e+00 181 | vertex 0.000000e+00 4.500000e-07 0.000000e+00 182 | endloop 183 | endfacet 184 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 185 | outer loop 186 | vertex 3.000000e-07 0.000000e+00 0.000000e+00 187 | vertex 3.000000e-07 4.500000e-07 0.000000e+00 188 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 189 | endloop 190 | endfacet 191 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 192 | outer loop 193 | vertex 3.000000e-07 0.000000e+00 0.000000e+00 194 | vertex 3.000000e-07 1.500000e-07 0.000000e+00 195 | vertex 3.000000e-07 4.500000e-07 0.000000e+00 196 | endloop 197 | endfacet 198 | endsolid -------------------------------------------------------------------------------- /ChannelGeometries/Offset.stl: -------------------------------------------------------------------------------- 1 | solid 2 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 3 | outer loop 4 | vertex 0.000000e+00 1.500000e-07 0.000000e+00 5 | vertex 0.000000e+00 1.500000e-07 4.000000e-07 6 | vertex 3.000000e-07 1.500000e-07 0.000000e+00 7 | endloop 8 | endfacet 9 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 10 | outer loop 11 | vertex 0.000000e+00 1.500000e-07 4.000000e-07 12 | vertex 3.000000e-07 1.500000e-07 4.000000e-07 13 | vertex 3.000000e-07 1.500000e-07 0.000000e+00 14 | endloop 15 | endfacet 16 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 17 | outer loop 18 | vertex 0.000000e+00 4.500000e-07 4.000000e-07 19 | vertex 0.000000e+00 4.500000e-07 0.000000e+00 20 | vertex 3.000000e-07 4.500000e-07 4.000000e-07 21 | endloop 22 | endfacet 23 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 24 | outer loop 25 | vertex 0.000000e+00 4.500000e-07 0.000000e+00 26 | vertex 3.000000e-07 4.500000e-07 0.000000e+00 27 | vertex 3.000000e-07 4.500000e-07 4.000000e-07 28 | endloop 29 | endfacet 30 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 31 | outer loop 32 | vertex 0.000000e+00 1.500000e-07 0.000000e+00 33 | vertex 0.000000e+00 4.500000e-07 0.000000e+00 34 | vertex 0.000000e+00 1.500000e-07 4.000000e-07 35 | endloop 36 | endfacet 37 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 38 | outer loop 39 | vertex 0.000000e+00 4.500000e-07 0.000000e+00 40 | vertex 0.000000e+00 4.500000e-07 4.000000e-07 41 | vertex 0.000000e+00 1.500000e-07 4.000000e-07 42 | endloop 43 | endfacet 44 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 45 | outer loop 46 | vertex 3.000000e-07 1.500000e-07 0.000000e+00 47 | vertex 3.000000e-07 1.500000e-07 4.000000e-07 48 | vertex 3.000000e-07 4.500000e-07 0.000000e+00 49 | endloop 50 | endfacet 51 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 52 | outer loop 53 | vertex 3.000000e-07 1.500000e-07 4.000000e-07 54 | vertex 3.000000e-07 4.500000e-07 4.000000e-07 55 | vertex 3.000000e-07 4.500000e-07 0.000000e+00 56 | endloop 57 | endfacet 58 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 59 | outer loop 60 | vertex 0.000000e+00 1.500000e-07 4.000000e-07 61 | vertex 0.000000e+00 4.500000e-07 4.000000e-07 62 | vertex 3.000000e-07 1.500000e-07 4.000000e-07 63 | endloop 64 | endfacet 65 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 66 | outer loop 67 | vertex 0.000000e+00 4.500000e-07 4.000000e-07 68 | vertex 3.000000e-07 4.500000e-07 4.000000e-07 69 | vertex 3.000000e-07 1.500000e-07 4.000000e-07 70 | endloop 71 | endfacet 72 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 73 | outer loop 74 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 75 | vertex 3.000000e-07 1.500000e-07 0.000000e+00 76 | vertex 3.000000e-07 0.000000e+00 0.000000e+00 77 | endloop 78 | endfacet 79 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 80 | outer loop 81 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 82 | vertex 0.000000e+00 1.500000e-07 0.000000e+00 83 | vertex 3.000000e-07 1.500000e-07 0.000000e+00 84 | endloop 85 | endfacet 86 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 87 | outer loop 88 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 89 | vertex 0.000000e+00 1.500000e-07 0.000000e+00 90 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 91 | endloop 92 | endfacet 93 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 94 | outer loop 95 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 96 | vertex 0.000000e+00 4.500000e-07 0.000000e+00 97 | vertex 0.000000e+00 1.500000e-07 0.000000e+00 98 | endloop 99 | endfacet 100 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 101 | outer loop 102 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 103 | vertex 0.000000e+00 4.500000e-07 0.000000e+00 104 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 105 | endloop 106 | endfacet 107 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 108 | outer loop 109 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 110 | vertex 3.000000e-07 4.500000e-07 0.000000e+00 111 | vertex 0.000000e+00 4.500000e-07 0.000000e+00 112 | endloop 113 | endfacet 114 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 115 | outer loop 116 | vertex 3.000000e-07 0.000000e+00 0.000000e+00 117 | vertex 3.000000e-07 4.500000e-07 0.000000e+00 118 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 119 | endloop 120 | endfacet 121 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 122 | outer loop 123 | vertex 3.000000e-07 0.000000e+00 0.000000e+00 124 | vertex 3.000000e-07 1.500000e-07 0.000000e+00 125 | vertex 3.000000e-07 4.500000e-07 0.000000e+00 126 | endloop 127 | endfacet 128 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 129 | outer loop 130 | vertex 3.000000e-07 7.500000e-07 0.000000e+00 131 | vertex 3.000000e-07 7.500000e-07 4.000000e-07 132 | vertex 6.000000e-07 7.500000e-07 0.000000e+00 133 | endloop 134 | endfacet 135 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 136 | outer loop 137 | vertex 3.000000e-07 7.500000e-07 4.000000e-07 138 | vertex 6.000000e-07 7.500000e-07 4.000000e-07 139 | vertex 6.000000e-07 7.500000e-07 0.000000e+00 140 | endloop 141 | endfacet 142 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 143 | outer loop 144 | vertex 3.000000e-07 1.050000e-06 4.000000e-07 145 | vertex 3.000000e-07 1.050000e-06 0.000000e+00 146 | vertex 6.000000e-07 1.050000e-06 4.000000e-07 147 | endloop 148 | endfacet 149 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 150 | outer loop 151 | vertex 3.000000e-07 1.050000e-06 0.000000e+00 152 | vertex 6.000000e-07 1.050000e-06 0.000000e+00 153 | vertex 6.000000e-07 1.050000e-06 4.000000e-07 154 | endloop 155 | endfacet 156 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 157 | outer loop 158 | vertex 3.000000e-07 7.500000e-07 0.000000e+00 159 | vertex 3.000000e-07 1.050000e-06 0.000000e+00 160 | vertex 3.000000e-07 7.500000e-07 4.000000e-07 161 | endloop 162 | endfacet 163 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 164 | outer loop 165 | vertex 3.000000e-07 1.050000e-06 0.000000e+00 166 | vertex 3.000000e-07 1.050000e-06 4.000000e-07 167 | vertex 3.000000e-07 7.500000e-07 4.000000e-07 168 | endloop 169 | endfacet 170 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 171 | outer loop 172 | vertex 6.000000e-07 7.500000e-07 0.000000e+00 173 | vertex 6.000000e-07 7.500000e-07 4.000000e-07 174 | vertex 6.000000e-07 1.050000e-06 0.000000e+00 175 | endloop 176 | endfacet 177 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 178 | outer loop 179 | vertex 6.000000e-07 7.500000e-07 4.000000e-07 180 | vertex 6.000000e-07 1.050000e-06 4.000000e-07 181 | vertex 6.000000e-07 1.050000e-06 0.000000e+00 182 | endloop 183 | endfacet 184 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 185 | outer loop 186 | vertex 3.000000e-07 7.500000e-07 4.000000e-07 187 | vertex 3.000000e-07 1.050000e-06 4.000000e-07 188 | vertex 6.000000e-07 7.500000e-07 4.000000e-07 189 | endloop 190 | endfacet 191 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 192 | outer loop 193 | vertex 3.000000e-07 1.050000e-06 4.000000e-07 194 | vertex 6.000000e-07 1.050000e-06 4.000000e-07 195 | vertex 6.000000e-07 7.500000e-07 4.000000e-07 196 | endloop 197 | endfacet 198 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 199 | outer loop 200 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 201 | vertex 6.000000e-07 7.500000e-07 0.000000e+00 202 | vertex 6.000000e-07 6.000000e-07 0.000000e+00 203 | endloop 204 | endfacet 205 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 206 | outer loop 207 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 208 | vertex 3.000000e-07 7.500000e-07 0.000000e+00 209 | vertex 6.000000e-07 7.500000e-07 0.000000e+00 210 | endloop 211 | endfacet 212 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 213 | outer loop 214 | vertex 3.000000e-07 1.200000e-06 0.000000e+00 215 | vertex 3.000000e-07 7.500000e-07 0.000000e+00 216 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 217 | endloop 218 | endfacet 219 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 220 | outer loop 221 | vertex 3.000000e-07 1.200000e-06 0.000000e+00 222 | vertex 3.000000e-07 1.050000e-06 0.000000e+00 223 | vertex 3.000000e-07 7.500000e-07 0.000000e+00 224 | endloop 225 | endfacet 226 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 227 | outer loop 228 | vertex 6.000000e-07 1.200000e-06 0.000000e+00 229 | vertex 3.000000e-07 1.050000e-06 0.000000e+00 230 | vertex 3.000000e-07 1.200000e-06 0.000000e+00 231 | endloop 232 | endfacet 233 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 234 | outer loop 235 | vertex 6.000000e-07 1.200000e-06 0.000000e+00 236 | vertex 6.000000e-07 1.050000e-06 0.000000e+00 237 | vertex 3.000000e-07 1.050000e-06 0.000000e+00 238 | endloop 239 | endfacet 240 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 241 | outer loop 242 | vertex 6.000000e-07 6.000000e-07 0.000000e+00 243 | vertex 6.000000e-07 1.050000e-06 0.000000e+00 244 | vertex 6.000000e-07 1.200000e-06 0.000000e+00 245 | endloop 246 | endfacet 247 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 248 | outer loop 249 | vertex 6.000000e-07 6.000000e-07 0.000000e+00 250 | vertex 6.000000e-07 7.500000e-07 0.000000e+00 251 | vertex 6.000000e-07 1.050000e-06 0.000000e+00 252 | endloop 253 | endfacet 254 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 255 | outer loop 256 | vertex 3.000000e-07 0.000000e+00 0.000000e+00 257 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 258 | vertex 6.000000e-07 0.000000e+00 0.000000e+00 259 | endloop 260 | endfacet 261 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 262 | outer loop 263 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 264 | vertex 6.000000e-07 6.000000e-07 0.000000e+00 265 | vertex 6.000000e-07 0.000000e+00 0.000000e+00 266 | endloop 267 | endfacet 268 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 269 | outer loop 270 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 271 | vertex 0.000000e+00 1.200000e-06 0.000000e+00 272 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 273 | endloop 274 | endfacet 275 | facet normal 0.000000e+00 0.000000e+00 -1.000000e+00 276 | outer loop 277 | vertex 0.000000e+00 1.200000e-06 0.000000e+00 278 | vertex 3.000000e-07 1.200000e-06 0.000000e+00 279 | vertex 3.000000e-07 6.000000e-07 0.000000e+00 280 | endloop 281 | endfacet 282 | facet normal 0.000000e+00 0.000000e+00 1.000000e+00 283 | outer loop 284 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 285 | vertex 6.000000e-07 0.000000e+00 5.000000e-07 286 | vertex 0.000000e+00 1.200000e-06 5.000000e-07 287 | endloop 288 | endfacet 289 | facet normal 0.000000e+00 0.000000e+00 1.000000e+00 290 | outer loop 291 | vertex 6.000000e-07 0.000000e+00 5.000000e-07 292 | vertex 6.000000e-07 1.200000e-06 5.000000e-07 293 | vertex 0.000000e+00 1.200000e-06 5.000000e-07 294 | endloop 295 | endfacet 296 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 297 | outer loop 298 | vertex 6.000000e-07 0.000000e+00 0.000000e+00 299 | vertex 6.000000e-07 0.000000e+00 5.000000e-07 300 | vertex 3.000000e-07 0.000000e+00 0.000000e+00 301 | endloop 302 | endfacet 303 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 304 | outer loop 305 | vertex 6.000000e-07 0.000000e+00 5.000000e-07 306 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 307 | vertex 3.000000e-07 0.000000e+00 0.000000e+00 308 | endloop 309 | endfacet 310 | facet normal 0.000000e+00 -1.000000e+00 0.000000e+00 311 | outer loop 312 | vertex 3.000000e-07 0.000000e+00 0.000000e+00 313 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 314 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 315 | endloop 316 | endfacet 317 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 318 | outer loop 319 | vertex 6.000000e-07 1.200000e-06 0.000000e+00 320 | vertex 3.000000e-07 1.200000e-06 0.000000e+00 321 | vertex 6.000000e-07 1.200000e-06 5.000000e-07 322 | endloop 323 | endfacet 324 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 325 | outer loop 326 | vertex 6.000000e-07 1.200000e-06 5.000000e-07 327 | vertex 3.000000e-07 1.200000e-06 0.000000e+00 328 | vertex 0.000000e+00 1.200000e-06 5.000000e-07 329 | endloop 330 | endfacet 331 | facet normal 0.000000e+00 1.000000e+00 0.000000e+00 332 | outer loop 333 | vertex 3.000000e-07 1.200000e-06 0.000000e+00 334 | vertex 0.000000e+00 1.200000e-06 0.000000e+00 335 | vertex 0.000000e+00 1.200000e-06 5.000000e-07 336 | endloop 337 | endfacet 338 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 339 | outer loop 340 | vertex 0.000000e+00 0.000000e+00 0.000000e+00 341 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 342 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 343 | endloop 344 | endfacet 345 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 346 | outer loop 347 | vertex 0.000000e+00 0.000000e+00 5.000000e-07 348 | vertex 0.000000e+00 1.200000e-06 5.000000e-07 349 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 350 | endloop 351 | endfacet 352 | facet normal -1.000000e+00 0.000000e+00 0.000000e+00 353 | outer loop 354 | vertex 0.000000e+00 6.000000e-07 0.000000e+00 355 | vertex 0.000000e+00 1.200000e-06 5.000000e-07 356 | vertex 0.000000e+00 1.200000e-06 0.000000e+00 357 | endloop 358 | endfacet 359 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 360 | outer loop 361 | vertex 6.000000e-07 0.000000e+00 0.000000e+00 362 | vertex 6.000000e-07 6.000000e-07 0.000000e+00 363 | vertex 6.000000e-07 0.000000e+00 5.000000e-07 364 | endloop 365 | endfacet 366 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 367 | outer loop 368 | vertex 6.000000e-07 6.000000e-07 0.000000e+00 369 | vertex 6.000000e-07 1.200000e-06 5.000000e-07 370 | vertex 6.000000e-07 0.000000e+00 5.000000e-07 371 | endloop 372 | endfacet 373 | facet normal 1.000000e+00 0.000000e+00 0.000000e+00 374 | outer loop 375 | vertex 6.000000e-07 6.000000e-07 0.000000e+00 376 | vertex 6.000000e-07 1.200000e-06 0.000000e+00 377 | vertex 6.000000e-07 1.200000e-06 5.000000e-07 378 | endloop 379 | endfacet 380 | endsolid -------------------------------------------------------------------------------- /HelperFunctions.py: -------------------------------------------------------------------------------- 1 | """These are helper functions used to define channel objects that are written 2 | in STL format""" 3 | 4 | import numpy as np 5 | from decimal import Decimal 6 | from scipy.spatial import Delaunay 7 | import matplotlib.pyplot as plt 8 | import triangle as tr 9 | 10 | class Cube(): 11 | """A cube element object, used for 3D channels with cubic obstacles""" 12 | def __init__(self, origin, Dim, stepDim): 13 | self.cubeOrigin = np.array([(Dim[0]-stepDim[0])/2, \ 14 | (Dim[1]-stepDim[1])/2, \ 15 | 0.0]) 16 | self.origin = origin 17 | self.dim = Dim 18 | self.stepDim = stepDim 19 | self.triangles = [] 20 | self.rectangles = [] 21 | 22 | # Vertex order, first big cube, then small cube 23 | # 5------6 13-----14 24 | # /| /| /| /| 25 | # 4------7 | 12-----15| 26 | # | 1----|-2 | 9----|-10 27 | # |/ |/ |/ |/ 28 | # 0------3 8------11 29 | 30 | # Vertices placed in an array 31 | self.vertices = np.array([\ 32 | [0,0,0],\ 33 | [0,Dim[1],0],\ 34 | [Dim[0],Dim[1],0],\ 35 | [Dim[0],0,0],\ 36 | [0,0,Dim[2]],\ 37 | [0,Dim[1],Dim[2]],\ 38 | [Dim[0],Dim[1],Dim[2]],\ 39 | [Dim[0],0,Dim[2]],\ 40 | [self.cubeOrigin[0],self.cubeOrigin[1],0],\ 41 | [self.cubeOrigin[0],self.cubeOrigin[1]+stepDim[1],0],\ 42 | [self.cubeOrigin[0]+stepDim[0],self.cubeOrigin[1]+stepDim[1],0],\ 43 | [self.cubeOrigin[0]+stepDim[0],self.cubeOrigin[1],0],\ 44 | [self.cubeOrigin[0],self.cubeOrigin[1],stepDim[2]],\ 45 | [self.cubeOrigin[0],self.cubeOrigin[1]+stepDim[1],stepDim[2]],\ 46 | [self.cubeOrigin[0]+stepDim[0],self.cubeOrigin[1]+stepDim[1],stepDim[2]],\ 47 | [self.cubeOrigin[0]+stepDim[0],self.cubeOrigin[1],stepDim[2]]]) 48 | 49 | for vertex in self.vertices: 50 | vertex += self.origin 51 | 52 | # Channel Front 53 | self.rectangles.append(Rectangle(self.vertices[0], np.array([Dim[0],Dim[2]]), np.array([1,0,0]), np.array([0,0,1]))) 54 | # Channel Back 55 | self.rectangles.append(Rectangle(self.vertices[1], np.array([Dim[2],Dim[0]]), np.array([0,0,1]), np.array([1,0,0]))) 56 | # Channel Left 57 | self.rectangles.append(Rectangle(self.vertices[0], np.array([Dim[2],Dim[1]]), np.array([0,0,1]), np.array([0,1,0]))) 58 | # Channel Right 59 | self.rectangles.append(Rectangle(self.vertices[3], np.array([Dim[1],Dim[2]]), np.array([0,1,0]), np.array([0,0,1]))) 60 | # Channel Top 61 | self.rectangles.append(Rectangle(self.vertices[4], np.array([Dim[0],Dim[1]]), np.array([1,0,0]), np.array([0,1,0]))) 62 | # Cube Front 63 | self.rectangles.append(Rectangle(self.vertices[8], np.array([stepDim[2],stepDim[0]]), np.array([0,0,1]), np.array([1,0,0]))) 64 | # Cube Back 65 | self.rectangles.append(Rectangle(self.vertices[13], np.array([stepDim[2],stepDim[0]]), np.array([0,0,-1]), np.array([1,0,0]))) 66 | # Cube Left 67 | self.rectangles.append(Rectangle(self.vertices[8], np.array([stepDim[1],stepDim[2]]), np.array([0,1,0]), np.array([0,0,1]))) 68 | # Cube Right 69 | self.rectangles.append(Rectangle(self.vertices[11], np.array([stepDim[2],stepDim[1]]), np.array([0,0,1]), np.array([0,1,0]))) 70 | # Cube Top 71 | self.rectangles.append(Rectangle(self.vertices[12], np.array([stepDim[1],stepDim[0]]), np.array([0,1,0]), np.array([1,0,0]))) 72 | # Channel Bottom 73 | self.triangles.append(Triangle(np.array([self.vertices[0],self.vertices[11],self.vertices[3]]),np.array([0,0,-1]))) 74 | self.triangles.append(Triangle(np.array([self.vertices[0],self.vertices[8],self.vertices[11]]),np.array([0,0,-1]))) 75 | self.triangles.append(Triangle(np.array([self.vertices[1],self.vertices[8],self.vertices[0]]),np.array([0,0,-1]))) 76 | self.triangles.append(Triangle(np.array([self.vertices[1],self.vertices[9],self.vertices[8]]),np.array([0,0,-1]))) 77 | self.triangles.append(Triangle(np.array([self.vertices[2],self.vertices[9],self.vertices[1]]),np.array([0,0,-1]))) 78 | self.triangles.append(Triangle(np.array([self.vertices[2],self.vertices[10],self.vertices[9]]),np.array([0,0,-1]))) 79 | self.triangles.append(Triangle(np.array([self.vertices[3],self.vertices[10],self.vertices[2]]),np.array([0,0,-1]))) 80 | self.triangles.append(Triangle(np.array([self.vertices[3],self.vertices[11],self.vertices[10]]),np.array([0,0,-1]))) 81 | 82 | def write(self,filename): 83 | file = open(filename, "w") 84 | file.write("solid\n") 85 | for rectangle in self.rectangles: 86 | rectangle.write(file) 87 | for triangle in self.triangles: 88 | triangle.write(file) 89 | file.write("endsolid") 90 | file.close() 91 | 92 | class OffsetCube(): 93 | """An element of two cubes that are positions with an offset to each other""" 94 | def __init__(self, origin, Dim, cubeDim): 95 | self.origin = origin 96 | self.dim = Dim 97 | 98 | self.cubeElements = [] 99 | self.rectangles = [] 100 | self.triangles = [] 101 | 102 | self.totalDim = np.array([2*Dim[0], 2*Dim[1], Dim[2]]) 103 | 104 | self.cubeOrigin = np.array([(Dim[0]-cubeDim[0])/2, \ 105 | (Dim[1]-cubeDim[1])/2, \ 106 | 0.0]) 107 | 108 | offsetOrigin = self.origin + np.array([Dim[0], Dim[1], 0.0]) 109 | 110 | # Vertices placed in an array 111 | self.vertices = np.array([\ 112 | [0,0,0],\ 113 | [0,Dim[1],0],\ 114 | [0,2*Dim[1],0],\ 115 | [Dim[0],0,0],\ 116 | [Dim[0],Dim[1],0],\ 117 | [Dim[0],2*Dim[1],0],\ 118 | [2*Dim[0],0,0],\ 119 | [2*Dim[0],Dim[1],0],\ 120 | [2*Dim[0],2*Dim[1],0],\ 121 | [0,0,Dim[2]],\ 122 | [0,2*Dim[1],Dim[2]],\ 123 | [2*Dim[0],2*Dim[1],Dim[2]],\ 124 | [2*Dim[0],0,Dim[2]]]) 125 | 126 | # Cubes 127 | self.cubeElements.append(CubeElement(self.origin, Dim, self.cubeOrigin, cubeDim)) 128 | self.cubeElements.append(CubeElement(offsetOrigin, Dim, self.cubeOrigin, cubeDim)) 129 | # Channel Bottom 130 | self.rectangles.append(Rectangle(self.vertices[3], np.array([Dim[1],Dim[0]]), np.array([0,1,0]), np.array([1,0,0]))) 131 | self.rectangles.append(Rectangle(self.vertices[1], np.array([Dim[1],Dim[0]]), np.array([0,1,0]), np.array([1,0,0]))) 132 | # Channel Front 133 | self.triangles.append(Triangle(np.array([self.vertices[6],self.vertices[12],self.vertices[3]]),np.array([0,-1,0]))) 134 | self.triangles.append(Triangle(np.array([self.vertices[12],self.vertices[9],self.vertices[3]]),np.array([0,-1,0]))) 135 | self.triangles.append(Triangle(np.array([self.vertices[3],self.vertices[9],self.vertices[0]]),np.array([0,-1,0]))) 136 | # Channel Back 137 | self.triangles.append(Triangle(np.array([self.vertices[8],self.vertices[5],self.vertices[11]]),np.array([0,1,0]))) 138 | self.triangles.append(Triangle(np.array([self.vertices[11],self.vertices[5],self.vertices[10]]),np.array([0,1,0]))) 139 | self.triangles.append(Triangle(np.array([self.vertices[5],self.vertices[2],self.vertices[10]]),np.array([0,1,0]))) 140 | # Channel Left 141 | self.triangles.append(Triangle(np.array([self.vertices[0],self.vertices[9],self.vertices[1]]),np.array([-1,0,0]))) 142 | self.triangles.append(Triangle(np.array([self.vertices[9],self.vertices[10],self.vertices[1]]),np.array([-1,0,0]))) 143 | self.triangles.append(Triangle(np.array([self.vertices[1],self.vertices[10],self.vertices[2]]),np.array([-1,0,0]))) 144 | # Channel Right 145 | self.triangles.append(Triangle(np.array([self.vertices[6],self.vertices[7],self.vertices[12]]),np.array([1,0,0]))) 146 | self.triangles.append(Triangle(np.array([self.vertices[7],self.vertices[11],self.vertices[12]]),np.array([1,0,0]))) 147 | self.triangles.append(Triangle(np.array([self.vertices[7],self.vertices[8],self.vertices[11]]),np.array([1,0,0]))) 148 | # Channel Top 149 | self.rectangles.append(Rectangle(self.vertices[9], np.array([2*Dim[0],2*Dim[1]]), np.array([1,0,0]), np.array([0,1,0]))) 150 | 151 | def write(self,filename): 152 | file = open(filename, "w") 153 | file.write("solid\n") 154 | for cubeElement in self.cubeElements: 155 | cubeElement.write(file) 156 | for rectangle in self.rectangles: 157 | rectangle.write(file) 158 | for triangle in self.triangles: 159 | triangle.write(file) 160 | file.write("endsolid") 161 | file.close() 162 | 163 | class CubeElement(): 164 | """ A cubic element, used for 3D channels with multiple cubes.""" 165 | 166 | # Vertex order, first channel floor, then the cube element 167 | # 9------10 168 | # 1-/| /|----2 169 | # / 8------11| / 170 | # / | 5----|-6 / 171 | # / |/ |/ / 172 | # / 4------7 / 173 | # 0--------------3 174 | 175 | def __init__(self,origin,Dim,cubeOrigin,cubeDim): 176 | self.vertices = [] 177 | self.triangles = [] 178 | self.rectangles = [] 179 | 180 | self.origin = origin 181 | self.cubeOrigin = cubeOrigin 182 | 183 | self.vertices = np.array([\ 184 | [0,0,0],\ 185 | [0,Dim[1],0],\ 186 | [Dim[0],Dim[1],0],\ 187 | [Dim[0],0,0],\ 188 | [cubeOrigin[0],cubeOrigin[1],0],\ 189 | [cubeOrigin[0],cubeOrigin[1]+cubeDim[1],0],\ 190 | [cubeOrigin[0]+cubeDim[0],cubeOrigin[1]+cubeDim[1],0],\ 191 | [cubeOrigin[0]+cubeDim[0],cubeOrigin[1],0],\ 192 | [cubeOrigin[0],cubeOrigin[1],cubeDim[2]],\ 193 | [cubeOrigin[0],cubeOrigin[1]+cubeDim[1],cubeDim[2]],\ 194 | [cubeOrigin[0]+cubeDim[0],cubeOrigin[1]+cubeDim[1],cubeDim[2]],\ 195 | [cubeOrigin[0]+cubeDim[0],cubeOrigin[1],cubeDim[2]]]) 196 | 197 | for vertex in self.vertices: 198 | vertex += self.origin 199 | 200 | # Cube Front 201 | self.rectangles.append(Rectangle(self.vertices[4], np.array([cubeDim[2],cubeDim[0]]), np.array([0,0,1]), np.array([1,0,0]))) 202 | # Cube Back 203 | self.rectangles.append(Rectangle(self.vertices[9], np.array([cubeDim[2],cubeDim[0]]), np.array([0,0,-1]), np.array([1,0,0]))) 204 | # Cube Left 205 | self.rectangles.append(Rectangle(self.vertices[4], np.array([cubeDim[1],cubeDim[2]]), np.array([0,1,0]), np.array([0,0,1]))) 206 | # Cube Right 207 | self.rectangles.append(Rectangle(self.vertices[7], np.array([cubeDim[2],cubeDim[1]]), np.array([0,0,1]), np.array([0,1,0]))) 208 | # Cube Top 209 | self.rectangles.append(Rectangle(self.vertices[8], np.array([cubeDim[1],cubeDim[0]]), np.array([0,1,0]), np.array([1,0,0]))) 210 | # Channel Bottom 211 | self.triangles.append(Triangle(np.array([self.vertices[0],self.vertices[7],self.vertices[3]]),np.array([0,0,-1]))) 212 | self.triangles.append(Triangle(np.array([self.vertices[0],self.vertices[4],self.vertices[7]]),np.array([0,0,-1]))) 213 | self.triangles.append(Triangle(np.array([self.vertices[1],self.vertices[4],self.vertices[0]]),np.array([0,0,-1]))) 214 | self.triangles.append(Triangle(np.array([self.vertices[1],self.vertices[5],self.vertices[4]]),np.array([0,0,-1]))) 215 | self.triangles.append(Triangle(np.array([self.vertices[2],self.vertices[5],self.vertices[1]]),np.array([0,0,-1]))) 216 | self.triangles.append(Triangle(np.array([self.vertices[2],self.vertices[6],self.vertices[5]]),np.array([0,0,-1]))) 217 | self.triangles.append(Triangle(np.array([self.vertices[3],self.vertices[6],self.vertices[2]]),np.array([0,0,-1]))) 218 | self.triangles.append(Triangle(np.array([self.vertices[3],self.vertices[7],self.vertices[6]]),np.array([0,0,-1]))) 219 | 220 | def write(self,file): 221 | for rectangle in self.rectangles: 222 | rectangle.write(file) 223 | for triangle in self.triangles: 224 | triangle.write(file) 225 | 226 | class Rectangle(): 227 | """A rectangular object""" 228 | 229 | def __init__(self,origin,dim,t1,t2): 230 | vertices = np.zeros((4,3)) 231 | vertices[1] = np.array([dim[0]*t1[0], dim[0]*t1[1], dim[0]*t1[2]]) 232 | vertices[3] = np.array([dim[1]*t2[0], dim[1]*t2[1], dim[1]*t2[2]]) 233 | vertices[2] = vertices[1] + vertices[3] 234 | for vertex in vertices: 235 | vertex += origin 236 | n = np.cross(t1,t2) 237 | # Rectangular vertices 238 | # 1---2 239 | # | | 240 | # 0---3 241 | self.triangle1 = Triangle(np.array([vertices[0],vertices[1],vertices[3]]),n) 242 | self.triangle2 = Triangle(np.array([vertices[1],vertices[2],vertices[3]]),n) 243 | 244 | def write(self,file): 245 | self.triangle1.write(file) 246 | self.triangle2.write(file) 247 | 248 | class Triangle(): 249 | """A triangle object""" 250 | def __init__(self,vertices,n): 251 | self.vertices = vertices 252 | self.n = n 253 | 254 | def write(self,file): 255 | writeString = """facet normal {:.6e} {:.6e} {:.6e} 256 | outer loop 257 | vertex {:.6e} {:.6e} {:.6e} 258 | vertex {:.6e} {:.6e} {:.6e} 259 | vertex {:.6e} {:.6e} {:.6e} 260 | endloop 261 | endfacet\n""".format(\ 262 | self.n[0], self.n[1], self.n[2], \ 263 | self.vertices[0][0], self.vertices[0][1], self.vertices[0][2], \ 264 | self.vertices[1][0], self.vertices[1][1], self.vertices[1][2], \ 265 | self.vertices[2][0], self.vertices[2][1], self.vertices[2][2]) 266 | file.write(writeString) 267 | -------------------------------------------------------------------------------- /AdvectionDiffusion/AdvectionDiffusion.cpp: -------------------------------------------------------------------------------- 1 | /* This file is part of the Palabos library. 2 | * 3 | * The Palabos softare is developed since 2011 by FlowKit-Numeca Group Sarl 4 | * (Switzerland) and the University of Geneva (Switzerland), which jointly 5 | * own the IP rights for most of the code base. Since October 2019, the 6 | * Palabos project is maintained by the University of Geneva and accepts 7 | * source code contributions from the community. 8 | * 9 | * Contact: 10 | * Jonas Latt 11 | * Computer Science Department 12 | * University of Geneva 13 | * 7 Route de Drize 14 | * 1227 Carouge, Switzerland 15 | * jonas.latt@unige.ch 16 | * 17 | * The most recent release of Palabos can be downloaded at 18 | * 19 | * 20 | * The library Palabos is free software: you can redistribute it and/or 21 | * modify it under the terms of the GNU Affero General Public License as 22 | * published by the Free Software Foundation, either version 3 of the 23 | * License, or (at your option) any later version. 24 | * 25 | * The library is distributed in the hope that it will be useful, 26 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 27 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 28 | * GNU Affero General Public License for more details. 29 | * 30 | * You should have received a copy of the GNU Affero General Public License 31 | * along with this program. If not, see . 32 | */ 33 | 34 | #include "palabos3D.h" 35 | #include "palabos3D.hh" 36 | 37 | #include 38 | #include 39 | #include 40 | #include 41 | 42 | using namespace plb; 43 | using namespace std; 44 | 45 | typedef double T; 46 | #define DESCRIPTOR descriptors::D3Q19Descriptor 47 | #define ADESCRIPTOR descriptors::AdvectionDiffusionD3Q7Descriptor 48 | 49 | #define DYNAMICS BGKdynamics(omega) 50 | #define ADYNAMICS AdvectionDiffusionBGKdynamics(adOmega) 51 | 52 | plint extraLayer = 0.; 53 | plint referenceDirection = 0.; 54 | plint envelopeWidth = 1; 55 | plint extendedEnvelopeWidth = 1; 56 | plint blockSize = 2000000; 57 | 58 | T simTime = 0; 59 | plint maxIter = 0; 60 | plint writeInterval = 0; 61 | T epsilon = 0; 62 | bool performOutput = false; 63 | 64 | TriangleSet* triangleSet = 0; 65 | 66 | #define NMAX 150topDomain 67 | 68 | const T pi = (T)4.*std::atan((T)1.); 69 | 70 | // Initiate 2D field from STL file 71 | template 72 | class domainInitializer3D : public BoxProcessingFunctional3D_S { 73 | public: 74 | domainInitializer3D(ScalarField3D* write_) 75 | : write(write_) 76 | { } 77 | domainInitializer3D* clone() const { 78 | return new domainInitializer3D(*this); 79 | } 80 | virtual void process(Box3D domain, ScalarField3D& from) { 81 | Dot3D rel = from.getLocation(); 82 | for (plint iX=domain.x0; iX<=domain.x1; ++iX){ 83 | for (plint iY=domain.y0; iY<=domain.y1; ++iY) { 84 | for (plint iZ=domain.z0; iZ<=domain.z1; ++iZ) { 85 | write->get(iX+rel.x, iY+rel.y, iZ+rel.z) = from.get(iX,iY,iZ); 86 | } 87 | } 88 | } 89 | } 90 | virtual void getTypeOfModification(std::vector& modified) const{ 91 | modified[0] = modif::dataStructure; 92 | } 93 | private: 94 | ScalarField3D* write; 95 | }; 96 | 97 | // Initiate 2D field from STL file 98 | template 99 | class domainInitializer2D : public BoxProcessingFunctional3D_S { 100 | public: 101 | domainInitializer2D(ScalarField3D* write_) 102 | : write(write_) 103 | { } 104 | domainInitializer2D* clone() const { 105 | return new domainInitializer2D(*this); 106 | } 107 | virtual void process(Box3D domain, ScalarField3D& to) { 108 | Dot3D rel = to.getLocation(); 109 | for (plint iX=domain.x0; iX<=domain.x1; ++iX){ 110 | for (plint iY=domain.y0; iY<=domain.y1; ++iY) { 111 | for (plint iZ=domain.z0; iZ<=domain.z1; ++iZ){ 112 | to.get(iX,iY,iZ) = write->get(iX+rel.x, iY+rel.y, iZ+rel.z); 113 | } 114 | } 115 | } 116 | } 117 | virtual void getTypeOfModification(std::vector& modified) const{ 118 | modified[0] = modif::dataStructure; 119 | } 120 | private: 121 | ScalarField3D* write; 122 | }; 123 | 124 | // InstantiateDynamicsFunctional3D 125 | template class Descriptor> 126 | class GetFlux : public BoxProcessingFunctional3D_LS { 127 | public: 128 | GetFlux(T LatticeDiffusivity_, T dt_, T dx_, T* fluxP_, T* surfaceP_) 129 | : LatticeDiffusivity(LatticeDiffusivity_), dt(dt_), dx(dx_), fluxP(fluxP_), surfaceP(surfaceP_) 130 | { 131 | totalFLux = 0.0; 132 | surface = 0.0; 133 | } 134 | GetFlux* clone() const { 135 | return new GetFlux(*this); 136 | } 137 | virtual void process(Box3D domain, BlockLattice3D& lattice, 138 | ScalarField3D& flagMatrix) { 139 | for (plint iX=domain.x0; iX<=domain.x1; ++iX){ 140 | for (plint iY=domain.y0; iY<=domain.y1; ++iY){ 141 | for (plint iZ=domain.z0; iZ<=domain.z1; ++iZ){ 142 | if (flagMatrix.get(iX,iY,iZ) == 2){ 143 | if (flagMatrix.get(iX-1,iY,iZ) == 1){ 144 | totalFLux += ((T) 2.0)*lattice.get(iX-1,iY,iZ).computeDensity(); 145 | surface += (T) 1.0; 146 | } 147 | if (flagMatrix.get(iX+1,iY,iZ) == 1){ 148 | totalFLux += ((T) 2.0)*lattice.get(iX+1,iY,iZ).computeDensity(); 149 | surface += (T) 1.0; 150 | } 151 | if (flagMatrix.get(iX,iY-1,iZ) == 1){ 152 | totalFLux += ((T) 2.0)*lattice.get(iX,iY-1,iZ).computeDensity(); 153 | surface += (T) 1.0; 154 | } 155 | if (flagMatrix.get(iX,iY+1,iZ) == 1){ 156 | totalFLux += ((T) 2.0)*lattice.get(iX,iY+1,iZ).computeDensity(); 157 | surface += (T) 1.0; 158 | } 159 | if (flagMatrix.get(iX,iY,iZ-1) == 1){ 160 | totalFLux += ((T) 2.0)*lattice.get(iX,iY,iZ-1).computeDensity(); 161 | surface += (T) 1.0; 162 | } 163 | if (flagMatrix.get(iX,iY,iZ+1) == 1){ 164 | totalFLux += ((T) 2.0)*lattice.get(iX,iY,iZ+1).computeDensity(); 165 | surface += (T) 1.0; 166 | } 167 | } 168 | } 169 | } 170 | } 171 | cout << "Surface is: " << surface << std::endl; 172 | cout << "The local lattice flux is: " << LatticeDiffusivity*totalFLux << std::endl; 173 | cout << "The local physical flux is: " << (LatticeDiffusivity*totalFLux)*(dx/dt) << std::endl; 174 | *fluxP = (LatticeDiffusivity*totalFLux)*(dx/dt); 175 | *surfaceP = surface; 176 | } 177 | 178 | virtual void getTypeOfModification(std::vector& modified) const{ 179 | modified[0] = modif::dataStructure; 180 | } 181 | private: 182 | T LatticeDiffusivity; 183 | T dt; 184 | T dx; 185 | T totalFLux; 186 | T surface; 187 | T* fluxP; 188 | T* surfaceP; 189 | }; 190 | 191 | template class Descriptor> 192 | class initializeField : public BoxProcessingFunctional3D_LS { 193 | public: 194 | initializeField(T uMax_, plint nz_) 195 | : uMax(uMax_), nz(nz_) 196 | { } 197 | initializeField* clone() const{ 198 | return new initializeField(*this); 199 | } 200 | virtual void process(Box3D domain, BlockLattice3D& lattice, 201 | ScalarField3D& flagMatrix) { 202 | T rho = 1.; 203 | Array tempVel (0., 0., 0.); 204 | Dot3D rel = lattice.getLocation(); 205 | 206 | cout << "The proc no. " << global::mpi().getRank() << " is doing the processor" << std::endl; 207 | 208 | for (plint iX=domain.x0; iX<=domain.x1; ++iX){ 209 | for (plint iY=domain.y0; iY<=domain.y1; ++iY){ 210 | for (plint iZ=domain.z0; iZ <=domain.z1; ++iZ){ 211 | rho = (T)1; 212 | if (flagMatrix.get(iX,iY,iZ) == 1){ 213 | tempVel[0] = T(); 214 | tempVel[1] = uMax*(((T)iZ+rel.z)/(T)nz); 215 | tempVel[2] = T(); 216 | } else { 217 | tempVel[0] = T(); 218 | tempVel[1] = T(); 219 | tempVel[2] = T(); 220 | } 221 | iniCellAtEquilibrium(lattice.get(iX,iY,iZ), rho, tempVel); 222 | } 223 | } 224 | } 225 | } 226 | virtual void getTypeOfModification(std::vector& modified) const{ 227 | for (pluint iBlock=0; iBlock class adDescriptor> 237 | class initializeConcentration : public BoxProcessingFunctional3D_LS { 238 | public: 239 | initializeConcentration(T cMax_, plint nz_) 240 | : cMax(cMax_), nz(nz_) 241 | { } 242 | initializeConcentration* clone() const{ 243 | return new initializeConcentration(*this); 244 | } 245 | virtual void process(Box3D domain, BlockLattice3D& adLattice, 246 | ScalarField3D& flagMatrix) { 247 | T concentration = 0.; 248 | Array jEq (0., 0., 0.); 249 | Dot3D rel = adLattice.getLocation(); 250 | 251 | for (plint iX=domain.x0; iX<=domain.x1; ++iX){ 252 | for (plint iY=domain.y0; iY<=domain.y1; ++iY){ 253 | for (plint iZ=domain.z0; iZ<=domain.z1; ++iZ){ 254 | if (flagMatrix.get(iX,iY,iZ) == 1){ 255 | concentration = cMax*(((T)iZ+rel.z)/(T)nz); 256 | } else if (flagMatrix.get(iX,iY,iZ) == 3) { 257 | concentration = cMax; 258 | } else if (flagMatrix.get(iX,iY,iZ) == 2) { 259 | concentration = 0.001; 260 | } else { 261 | concentration = 0.0; 262 | } 263 | iniCellAtEquilibrium(adLattice.get(iX,iY,iZ), concentration, jEq); 264 | if (iX == domain.x1/2){ 265 | cout << flagMatrix.get(iX,iY,iZ); 266 | } 267 | } 268 | if (iX == domain.x1/2){ 269 | cout << std::endl; 270 | } 271 | } 272 | } 273 | } 274 | 275 | virtual void getTypeOfModification(std::vector& modified) const{ 276 | for (pluint iBlock=0; iBlock& lattice, 286 | MultiBlockLattice3D& adLattice, 287 | T dx, T dt, plint iter) 288 | { 289 | VtkImageOutput3D vtkOut(createFileName("vtk", iter, 6), dx); 290 | vtkOut.writeData(*computeDensity(adLattice), "concentration", (T)1.); 291 | vtkOut.writeData(*computeDensity(lattice), "pressure", (dx*dx)/(dt*dt)); 292 | vtkOut.writeData<3,float>(*computeVelocity(lattice), "velocity", dx/dt); 293 | } 294 | 295 | int main(int argc, char* argv[]) { 296 | 297 | plbInit(&argc, &argv); 298 | 299 | if (argc != 4) { 300 | pcout << "Error the parameters are wrong. The structure must be :\n"; 301 | pcout << "1 : N\n2 : filename\n3 : Outdir\n"; 302 | exit(1); 303 | } 304 | 305 | const plint maxIter = 200000; 306 | const plint N = atoi(argv[1]); 307 | const std::string meshFileName = argv[2]; 308 | const std::string outDir = argv[3]; 309 | global::directories().setOutputDir(outDir); 310 | 311 | triangleSet = new TriangleSet(meshFileName, DBL); 312 | referenceDirection = 2; 313 | plint referenceResolution = 20; 314 | plint margin = 1; 315 | plint borderWidth = 1; 316 | 317 | pcout << "At least we're getting here." << std::endl; 318 | 319 | DEFscaledMesh* defMesh = 320 | new DEFscaledMesh(*triangleSet, N, referenceDirection, margin, extraLayer); 321 | TriangleBoundary3D boundary(*defMesh); 322 | delete defMesh; 323 | 324 | pcout << "Getting here 2" << std::endl; 325 | 326 | boundary.getMesh().inflate(); 327 | 328 | pcout << "Probably failing here" << std::endl; 329 | 330 | 331 | T uAveLB = 107.8167e-6; // 2.88e-6 332 | T uMax = 0.3743636; // 0.01 333 | T cMax = 1.61514e-3; // same 334 | T Re = 0.03743636; // 4e-3 335 | 336 | 337 | T dx = boundary.getDx(); 338 | T dt = 2.358e-9; 339 | T nuLB = (uAveLB*N) / Re; 340 | T Diffusivity = 4.58e-9; 341 | T LatticeDiffusivity = Diffusivity*dt/(dx*dx); 342 | T tau = (3.*nuLB+0.5); 343 | T omega = 1./tau; 344 | T adOmega = 1.0/(ADESCRIPTOR::invCs2*LatticeDiffusivity + 0.5); 345 | 346 | Arraylocation(boundary.getPhysicalLocation()); 347 | 348 | bool performOutput = true; 349 | 350 | if (performOutput) { 351 | pcout << "dx = " << dx << std::endl; 352 | pcout << "dt = " << dt << std::endl; 353 | pcout << "nuLB = " << nuLB << std::endl; 354 | pcout << "tau = " << tau << std::endl; 355 | pcout << "LatticeDiffusivity = " << LatticeDiffusivity << "\t adOmega = " << adOmega << std::endl; 356 | pcout << "adTau = " << ADESCRIPTOR::invCs2*LatticeDiffusivity + 0.5 << std::endl; 357 | pcout << "invCs2 Diffusion: " << ADESCRIPTOR::invCs2 << std::endl; 358 | } 359 | 360 | if(tau <= 0.5){ 361 | pcout << "tau has invalid value." << std::endl; 362 | exit(1); 363 | } 364 | 365 | const int flowType = voxelFlag::inside; 366 | VoxelizedDomain3D voxelizedDomain ( 367 | boundary, flowType, extraLayer, borderWidth, extendedEnvelopeWidth, blockSize); 368 | 369 | MultiScalarField3D flagMatrix3D((MultiBlock3D&)voxelizedDomain.getVoxelMatrix()); 370 | setToConstant(flagMatrix3D, voxelizedDomain.getVoxelMatrix(), 371 | voxelFlag::inside, flagMatrix3D.getBoundingBox(), 1); 372 | setToConstant(flagMatrix3D, voxelizedDomain.getVoxelMatrix(), 373 | voxelFlag::innerBorder, flagMatrix3D.getBoundingBox(), 1); 374 | setToConstant(flagMatrix3D, voxelizedDomain.getVoxelMatrix(), 375 | voxelFlag::outerBorder, flagMatrix3D.getBoundingBox(), 2); 376 | 377 | MultiScalarField3D Flags3D( 378 | flagMatrix3D.getBoundingBox().getNx(), 379 | flagMatrix3D.getBoundingBox().getNy(), 380 | flagMatrix3D.getBoundingBox().getNz()); 381 | 382 | Box3D Domain3D = flagMatrix3D.getBoundingBox(); 383 | 384 | plint nx = flagMatrix3D.getBoundingBox().getNx(); 385 | plint ny = flagMatrix3D.getBoundingBox().getNy(); 386 | plint nz = flagMatrix3D.getBoundingBox().getNz(); 387 | 388 | Box3D topDomain(0,nx-1,0,ny-1,nz-1,nz-1); 389 | Box3D Inlet(0,nx-1,0,0,1,nz-2); 390 | //Box3D Outlet(0,nx-1,ny-1,ny-1,1,nz-2); 391 | Box3D Outlet(0,nx-1,ny-3,ny-1,1,nz-2); 392 | Box3D Left(0,0,0,ny-1,1,nz-2); 393 | //Box3D Right(nx-1,nx-1,0,ny-1,1,nz-2); 394 | Box3D Right(nx-3,nx-1,0,ny-1,1,nz-2); 395 | 396 | Box3D entireDomain(0,nx-1,0,ny-1,0,nz-1); 397 | 398 | pcout << "nx: " << nx << "\t ny: " << ny << "\t nz: " << nz << std::endl; 399 | 400 | int* rank = new int; 401 | MPI_Comm_rank(MPI_COMM_WORLD,rank); 402 | 403 | int count(nx*ny*nz); 404 | int* tempArray = new int[count]; 405 | 406 | plint numCells = 0; 407 | 408 | ScalarField3D* temp = new ScalarField3D (flagMatrix3D.getBoundingBox().getNx(), 409 | flagMatrix3D.getBoundingBox().getNy(), 410 | flagMatrix3D.getBoundingBox().getNz()); 411 | 412 | applyProcessingFunctional(new domainInitializer3D(temp), Domain3D, flagMatrix3D); 413 | 414 | if (*rank == global::mpi().bossId()){ 415 | for (plint x=0; xget(x,y,z); 419 | } 420 | } 421 | } 422 | } 423 | global::mpi().barrier(); 424 | pcout << "We broadcast here" << std::endl; 425 | MPI_Bcast(tempArray, count, MPI_INT, global::mpi().bossId(), MPI_COMM_WORLD); 426 | 427 | if (global::mpi().getRank() != -1){ 428 | for (plint x=0; xget(x,y,z) = (int)tempArray[x*ny*nz+y*nz+z]; 432 | } 433 | } 434 | } 435 | } 436 | 437 | applyProcessingFunctional(new domainInitializer2D(temp), Domain3D, Flags3D); 438 | 439 | setToConstant(Flags3D, topDomain, 3); 440 | setToConstant(Flags3D, Inlet, 1); 441 | setToConstant(Flags3D, Outlet, 1); 442 | setToConstant(Flags3D, Left, 1); 443 | setToConstant(Flags3D, Right, 1); 444 | 445 | delete temp; 446 | delete tempArray; 447 | 448 | std::unique_ptr> lattice 449 | = generateMultiBlockLattice(Domain3D, new DYNAMICS, envelopeWidth); 450 | std::unique_ptr> adLattice 451 | = generateMultiBlockLattice(Domain3D, new ADYNAMICS, envelopeWidth); 452 | lattice->toggleInternalStatistics(false); 453 | adLattice->toggleInternalStatistics(false); 454 | 455 | // Use periodic boundary conditions. 456 | lattice->periodicity().toggle(0,true); 457 | adLattice->periodicity().toggle(0,true); 458 | lattice->periodicity().toggle(1,true); 459 | adLattice->periodicity().toggle(1,true); 460 | 461 | defineDynamics(*lattice, Flags3D, entireDomain, new BounceBack((T) 1.), 2); 462 | defineDynamics(*lattice, topDomain, new VelocityBounceBack((T) 1., Array((T) 0., uMax, (T) 0.))); 463 | defineDynamics(*adLattice, Flags3D, entireDomain, new AntiBounceBack((T) 0., Array((T) 0., (T) 0., (T) 0.)), 2); 464 | defineDynamics(*adLattice, topDomain, new AntiBounceBack(cMax, Array((T) 0., (T) 0., (T) 0.))); 465 | 466 | applyProcessingFunctional(new initializeField(uMax,nz), entireDomain, *lattice, Flags3D); 467 | applyProcessingFunctional(new initializeConcentration(cMax,nz), entireDomain, *adLattice, Flags3D); 468 | 469 | plint processorLevel = 1; 470 | integrateProcessingFunctional ( 471 | new LatticeToPassiveAdvDiff3D (), 472 | lattice->getBoundingBox(), 473 | *lattice, *adLattice, processorLevel ); 474 | 475 | //RectangleSetup(lattice, parameters,initializeAtEquilibrium(*lattice, lattice->getBoundingBox(), initializeField(lattice->getBoundingBox().getNy(), uMax, flagMatrix2D)); *boundaryCondition); 476 | 477 | plint numCores = global::mpi().getSize(); 478 | pcout << "Number of MPI threads: " << numCores << std::endl; 479 | 480 | global::timer("benchmark").start(); 481 | //global::profiler().turnOn(); 482 | 483 | // Loop over main time iteration. 484 | util::ValueTracer converge(uMax,lattice->getBoundingBox().getNy(),1.0e-3); 485 | writeVTK(*lattice, *adLattice, dx, dt, (plint) 0); 486 | for (plint iT=0; iTcollideAndStream(); 509 | lattice->collideAndStream(); 510 | 511 | } 512 | 513 | T* totalFLux = new T; 514 | T* totalSurface = new T; 515 | 516 | T* globalFlux = new T; 517 | T* globalSurface = new T; 518 | 519 | applyProcessingFunctional(new GetFlux(LatticeDiffusivity, dt, dx, totalFLux, totalSurface), adLattice->getBoundingBox(), *adLattice, Flags3D); 520 | 521 | MPI_Reduce(totalFLux, globalFlux, global::mpi().getSize(), MPI_DOUBLE, MPI_SUM, global::mpi().bossId(), MPI_COMM_WORLD); 522 | MPI_Reduce(totalSurface, globalSurface, global::mpi().getSize(), MPI_DOUBLE, MPI_SUM, global::mpi().bossId(), MPI_COMM_WORLD); 523 | 524 | pcout << "The global physical flux is: " << *globalFlux << std::endl; 525 | pcout << "The global surface is: " << *globalSurface << std::endl; 526 | pcout << "The global average physical flux is " << (*globalFlux)/(*globalSurface) << std::endl; 527 | 528 | MPI_Barrier(MPI_COMM_WORLD); 529 | 530 | global::profiler().writeReport(); 531 | } 532 | --------------------------------------------------------------------------------