├── 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 | 
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 | 
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 |
--------------------------------------------------------------------------------