From 49d5364e91a87e955eea6d557b1fa48069ac36c2 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Sun, 14 Jan 2024 22:29:21 +0100 Subject: [PATCH 01/67] [mask][surface tracking] --- src/main.cpp | 1 - src/storage/mask.cpp | 7 +++++ src/storage/mask.h | 53 ++++++++++++++++++++++++++++++++++++ src/surface/fluid_trace.cpp | 30 ++++++++++++++++++++ src/surface/fluid_tracer.h | 25 +++++++++++++++++ submission.zip | Bin 26359 -> 27436 bytes 6 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 src/storage/mask.cpp create mode 100644 src/storage/mask.h create mode 100644 src/surface/fluid_trace.cpp create mode 100644 src/surface/fluid_tracer.h diff --git a/src/main.cpp b/src/main.cpp index 42125a04..9ad97714 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -11,7 +11,6 @@ int main(int argc, char *argv[]) std::cout << "usage: " << argv[0] << " " << std::endl; return EXIT_FAILURE; } - Computation computation; auto start = std::chrono::system_clock::now(); diff --git a/src/storage/mask.cpp b/src/storage/mask.cpp new file mode 100644 index 00000000..80d3119a --- /dev/null +++ b/src/storage/mask.cpp @@ -0,0 +1,7 @@ +#include "mask.h" + +Mask::Mask(std::array size) : size_(size) +{ + assert(size[0] > 0 && size[1] > 0); + data_.resize(size_[0] * size_[1], 0); +} \ No newline at end of file diff --git a/src/storage/mask.h b/src/storage/mask.h new file mode 100644 index 00000000..2d8a4f26 --- /dev/null +++ b/src/storage/mask.h @@ -0,0 +1,53 @@ +#pragma once + +#include "array2D.h" + +enum CellType{ + FLUID = 0, + OBSTACLE = 10, + OBSTACLE_BORDER_LEFT = 11, + OBSTACLE_BORDER_TOP = 12, + OBSTACLE_BORDER_RIGHT = 13, + OBSTACLE_BORDER_BOTTOM = 14, + OBSTACLE_CORNER_BOTTOM_LEFT = 15, + OBSTACLE_CORNER_TOP_LEFT = 16, + OBSTACLE_CORNER_TOP_RIGHT = 17, + OBSTACLE_CORNER_BOTTOM_RIGHT = 18 +}; + +class Mask{ + public: + /** + * @brief constructor. + * + * @param size size of array in x and y direction + */ + Mask(std::array size); + + /** + * @brief set array value. + * Overloads the () operator + * + * @param i index in x direction + * @param j index in y direction + */ + double &operator()(int i, int j); + + /** + * @brief get array value. + * Overloads the () operator + * + * @param i index in x direction + * @param j index in y direction + */ + double operator()(int i, int j) const; + + /** + * @brief get size of array in x and y direction + */ + std::array size() const; + +protected: + const std::array size_; //!< size of array in x and y direction + std::vector data_; //!< storage array values, in row-major order +}; \ No newline at end of file diff --git a/src/surface/fluid_trace.cpp b/src/surface/fluid_trace.cpp new file mode 100644 index 00000000..89efdfb6 --- /dev/null +++ b/src/surface/fluid_trace.cpp @@ -0,0 +1,30 @@ +#include "fluid_tracer.h" + +FluidTracer::FluidTracer(int numParticlesperCell, std::shared_ptr discretization) { + numParticles_ = numParticlesperCell; + discretization_ = discretization; + + int n_x = discretization_->nCells()[0]; + int n_y = discretization_->nCells()[1]; + std::array physicalSize_ = {discretization_->meshWidth()[0]*n_x, + discretization_->meshWidth()[1]*n_y}; + int numParticles_ = numParticlesperCell * discretization_->nCells()[0] * discretization_->nCells()[1]; + + + // Resize for speed up + x_.resize(numParticles_); + y_.resize(numParticles_); + + + // Initialize particles + // TODO: Obsticle + + for (int j = 0; j < n_y; j++) { + for (int i = 0; i < n_x; i++) { + // Invariant: distance to border most be 1/2 meshWidth such that no discretization artefacts occur + for (int k = 0; k < numParticlesperCell; k++) { + x_[i*numParticlesperCell + j*numParticlesperCell + k] = 2; + } + } + } +} \ No newline at end of file diff --git a/src/surface/fluid_tracer.h b/src/surface/fluid_tracer.h new file mode 100644 index 00000000..fa897a23 --- /dev/null +++ b/src/surface/fluid_tracer.h @@ -0,0 +1,25 @@ +#pragma once + +#include +#include + +#include "discretization/discretization.h" + + +class FluidTracer { + public: + FluidTracer(int numParticlesperCell, std::shared_ptr discretization); + + void updatePosition(double dt); + + void updateMask(); + + + + private: + int numParticles_; + int numParticlesperCell_; + std::shared_ptr discretization_; + std::vector x_; + std::vector y_; +}; \ No newline at end of file diff --git a/submission.zip b/submission.zip index 833736ec591807ff9c14b51f80c64258b3abbb66..6df1381ef32cafc7a05a98b6863235d33946c76a 100644 GIT binary patch delta 9580 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 CZHt)z From 9576bc5969cca9f406292a6ab0dd469771788547 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Tue, 16 Jan 2024 23:14:10 +0100 Subject: [PATCH 02/67] Added features to Mask -> velocity update step for Surfaces --- src/storage/mask.cpp | 72 ++++++++++++++++++++++++++++++++- src/storage/mask.h | 94 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 154 insertions(+), 12 deletions(-) diff --git a/src/storage/mask.cpp b/src/storage/mask.cpp index 80d3119a..5e0bdb64 100644 --- a/src/storage/mask.cpp +++ b/src/storage/mask.cpp @@ -4,4 +4,74 @@ Mask::Mask(std::array size) : size_(size) { assert(size[0] > 0 && size[1] > 0); data_.resize(size_[0] * size_[1], 0); -} \ No newline at end of file +} + +int &Mask::operator()(int i, int j) +{ + assert(i >= 0 && i < size_[0] && j >= 0 && j < size_[1]); + return data_[i + j * size_[0]]; +} + +int Mask::operator()(int i, int j) const +{ + assert(i >= 0 && i < size_[0] && j >= 0 && j < size_[1]); + return data_[i + j * size_[0]]; +} + +std::array Mask::size() const +{ + return size_; +} + +void Mask::updateMaskBoundaries() +{ + std::vector data_temp = data_; + for (int i = 0; i < size_[0]; i++) + { + for (int j = 0; j < size_[1]; j++) + { + int idx = i + j * size_[0]; + bool isFluid = data_[idx] < 100; + + if (isFluid) + { + data_temp[idx] = 1 * (data_[idx - 1] < FLUID_TYPE) + + 2 * (data_[idx + size_[0]] < FLUID_TYPE) + + 4 * (data_[idx + 1] < FLUID_TYPE) + + 8 * (data_[idx - size_[0]] < FLUID_TYPE); + + } + } + } + data_ = data_temp; +} + + + + + + + + + +bool Mask::isFluid(int i, int j) const + { + return (data_[i + j * size_[0]] < FLUID_TYPE); + } + +bool Mask::isObstacle(int i, int j) const + { + return (data_[i + j * size_[0]] > OBSTACLE); + } + +bool Mask::isFluidBorder(int i, int j) const + { + int val = data_[i + j * size_[0]]; + return (val >= FLUID_BORDER_LEFT && + val <= FLUID_TYPE); + } + +bool Mask::isAir(int i, int j) const + { + return (data_[i + j * size_[0]] == AIR); + } \ No newline at end of file diff --git a/src/storage/mask.h b/src/storage/mask.h index 2d8a4f26..b46b521e 100644 --- a/src/storage/mask.h +++ b/src/storage/mask.h @@ -2,17 +2,43 @@ #include "array2D.h" +//TODO: it is weird but if we would use `char` instead of int, we would use less memory + enum CellType{ FLUID = 0, - OBSTACLE = 10, - OBSTACLE_BORDER_LEFT = 11, - OBSTACLE_BORDER_TOP = 12, - OBSTACLE_BORDER_RIGHT = 13, - OBSTACLE_BORDER_BOTTOM = 14, - OBSTACLE_CORNER_BOTTOM_LEFT = 15, - OBSTACLE_CORNER_TOP_LEFT = 16, - OBSTACLE_CORNER_TOP_RIGHT = 17, - OBSTACLE_CORNER_BOTTOM_RIGHT = 18 + + FLUID_SINGLE_LEFT = 1, + FLUID_SINGLE_TOP = 2, + FLUID_SINGLE_RIGHT = 4, + FLUID_SINGLE_BOTTOM = 8, + + FLUID_CORNER_BOTTOM_LEFT = 6, + FLUID_CORNER_TOP_LEFT = 12, + FLUID_CORNER_TOP_RIGHT = 9, + FLUID_CORNER_BOTTOM_RIGHT = 3, + + FLUID_COLUMN_HORIZONTAL = 5, + FLUID_COLUMN_VERTICAL = 10, + + FLUID_BORDER_LEFT = 15, + FLUID_BORDER_TOP = 14, + FLUID_BORDER_RIGHT = 12, + FLUID_BORDER_BOTTOM = 7, + + FLUID_TYPE = 50, + AIR = 64, + + OBSTACLE = 100, + + OBSTACLE_BORDER_LEFT = 110, + OBSTACLE_BORDER_TOP = 111, + OBSTACLE_BORDER_RIGHT = 112, + OBSTACLE_BORDER_BOTTOM = 113, + + OBSTACLE_CORNER_BOTTOM_LEFT = 120, + OBSTACLE_CORNER_TOP_LEFT = 121, + OBSTACLE_CORNER_TOP_RIGHT = 122, + OBSTACLE_CORNER_BOTTOM_RIGHT = 123, }; class Mask{ @@ -31,7 +57,7 @@ class Mask{ * @param i index in x direction * @param j index in y direction */ - double &operator()(int i, int j); + int &operator()(int i, int j); /** * @brief get array value. @@ -40,13 +66,59 @@ class Mask{ * @param i index in x direction * @param j index in y direction */ - double operator()(int i, int j) const; + int operator()(int i, int j) const; /** * @brief get size of array in x and y direction */ std::array size() const; + /** + * @brief update boundary of mask after the velocity step + * + * TODO: this can be implemented more efficiently by only updating the cells which are next + * to a fluid cell, because only those can change their type + * Could use `isFluidBorder` + */ + void updateMaskBoundaries(); + + + /** + * @brief Returns a boolean indicating whether the cell at (i,j) is fluid or not + * + * @param i index in x direction + * @param j index in y direction + */ + bool isFluid(int i, int j) const; + + + /** + * @brief Returns a boolean indicating whether the cell at (i,j) is an obstacle or not + * + * @param i index in x direction + * @param j index in y direction + */ + bool isObstacle(int i, int j) const; + + /** + * @brief Returns a boolean indicating whether the cell at (i,j) is a border cell or not + * + * @param i index in x direction + * @param j index in y direction + */ + bool isFluidBorder(int i, int j) const; + + /** + * @brief Returns a boolean indicating whether the cell at (i,j) is a air cell or not + * + * @param i index in x direction + * @param j index in y direction + */ + bool isAir(int i, int j) const; + + + + protected: const std::array size_; //!< size of array in x and y direction std::vector data_; //!< storage array values, in row-major order From 96f26113e0ede35135f28061f16ac57beb59c67a Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Tue, 16 Jan 2024 23:32:32 +0100 Subject: [PATCH 03/67] Added Tests for mask --- CMakeLists.txt | 2 +- build.sh | 20 ++++---------------- src/CMakeLists.txt | 1 + src/storage/mask.cpp | 14 ++++++-------- submission.zip | Bin 27436 -> 29092 bytes tests/CMakeLists.txt | 2 ++ tests/test_mask.cpp | 37 +++++++++++++++++++++++++++++++++++++ 7 files changed, 51 insertions(+), 25 deletions(-) create mode 100644 tests/test_mask.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 88055bf0..9fa651df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,4 +2,4 @@ cmake_minimum_required(VERSION 3.8) project(numsim) add_subdirectory(src) -# add_subdirectory(tests) \ No newline at end of file +add_subdirectory(tests) \ No newline at end of file diff --git a/build.sh b/build.sh index b95dffcd..3dfba072 100755 --- a/build.sh +++ b/build.sh @@ -18,19 +18,7 @@ fi make install -j4 # ./numsim ../input/settings_v3.txt -# run different resolution -# ./numsim ../input/different_resolutions/settings_01.txt -# ./numsim ../input/different_resolutions/settings_02.txt -# ./numsim ../input/different_resolutions/settings_03.txt -# ./numsim ../input/different_resolutions/settings_04.txt -# ./numsim ../input/different_resolutions/settings_05.txt -# ./numsim ../input/different_resolutions/settings_06.txt - -# run different viscosity -# ./numsim ../input/different_re/100.txt -# ./numsim ../input/different_re/500.txt -# ./numsim ../input/different_re/2000.txt -# ./numsim ../input/different_re/10000.txt + cd .. @@ -46,7 +34,7 @@ cd .. # doxygen ../Doxyfile # cd .. -# run tests -# build/tests/run_tests +run tests +build/tests/run_tests -zip -r submission.zip src/ CMakeLists.txt \ No newline at end of file +# zip -r submission.zip src/ CMakeLists.txt \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index dee3a415..078b29ea 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -21,6 +21,7 @@ add_executable(${PROJECT_NAME} storage/array2D.cpp storage/field_variable.cpp + storage/mask.cpp solver/pressure_solver.cpp solver/gauss_seidel.cpp diff --git a/src/storage/mask.cpp b/src/storage/mask.cpp index 5e0bdb64..5e43b949 100644 --- a/src/storage/mask.cpp +++ b/src/storage/mask.cpp @@ -25,25 +25,23 @@ std::array Mask::size() const void Mask::updateMaskBoundaries() { - std::vector data_temp = data_; for (int i = 0; i < size_[0]; i++) { for (int j = 0; j < size_[1]; j++) { int idx = i + j * size_[0]; - bool isFluid = data_[idx] < 100; + bool isFluid = data_[idx] < FLUID_TYPE; if (isFluid) { - data_temp[idx] = 1 * (data_[idx - 1] < FLUID_TYPE) - + 2 * (data_[idx + size_[0]] < FLUID_TYPE) - + 4 * (data_[idx + 1] < FLUID_TYPE) - + 8 * (data_[idx - size_[0]] < FLUID_TYPE); + data_[idx] = 1 * (data_[idx - 1] < FLUID_TYPE) + + 2 * (data_[idx + size_[0]] < FLUID_TYPE) + + 4 * (data_[idx + 1] < FLUID_TYPE) + + 8 * (data_[idx - size_[0]] < FLUID_TYPE); } } } - data_ = data_temp; } @@ -61,7 +59,7 @@ bool Mask::isFluid(int i, int j) const bool Mask::isObstacle(int i, int j) const { - return (data_[i + j * size_[0]] > OBSTACLE); + return (data_[i + j * size_[0]] >= OBSTACLE); } bool Mask::isFluidBorder(int i, int j) const diff --git a/submission.zip b/submission.zip index 6df1381ef32cafc7a05a98b6863235d33946c76a..953b0c5ae090965c254d6f36527ba4876c554e0d 100644 GIT binary patch delta 4231 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 RGSNUMLwnFvZskVn{SOF#KDht@ delta 2634 zcmZuz2{=@H8$V}`CCQj8>tKXoQiGB$)E!M@Nw&FUN@OthED?&^*j=*aZ%r$rqEb?y zt}KzLYn!4{QlVlJBHHkcGrG^$(|4Zdoag<$=Xd_+|Gww%M;!*1Eo4`)(KFn7=DeEZm-{KJ9|cuIWBBt;lxUWn8}wC&d1K%jylA z_AsYI{brA9fPv1lnCm$ z%WcyVy&Xr`pF1)>OVu`rYFB0=Dm!_~Vx* zb{0i)VIN5m^ops`16|=*&JOuJrhOgMX1BRnRNeDbiD~XJLYL~LA+DaOfU~^D*NYZW zq~89o^<=%OeM*pxe0}Ri19sBHi=?R8KMnI4D`p$hXZn?{g-uZca!vjH<11a}+Q&Z} zf83{Ylqa_7L%8(i!PaEq$6k(YwRnxe2ZI3G*J6?&y143-1 z{R~-t7-P-VY)jXQtr!TWas)Gq^o;sgS5?PINe#}fgDrm;Cdf>)*gEM9SyJY>q_Tmo zM6Le7WEN9W%7nr>}^c9L*vSiE^E zH>t|HlrZO8KQLW7%`Vz(o#Fkki1lPe&68?{dnSsO6tQ5MgD1Dxr-+y*9I;5Zjs1t& z9ic;%*}_h@?UcVWI=KGj$%#|?oF}DEjYEDbf4NY6yGX<5d`zcJqQl(GRh{p>_^|Bg436Ll zr(CkPZ?wFrtR^Q?-*Wy+d$pHRrrA(Z-R&FmjUvkP=Z?KHHl;Xib(?1t``ursH+o~l z?2GV)LnFpyZdJU&U^F$TzGp`EMS8A(*ctPd@UqDVquj?co;?#H26s-|IoBm1oZ0RKpIv-cqOl1 z`DM;Tig`Czi$8@?)&x!jgL=M6xWP#Dvyy68Ni)8uTsjYfawu}H2+BFDV2nXIg9K{? zZ5N9^gmsxP1ii#S(5mHjv7hN1sO1qH{BNV+?dF$8VQ*zSv;kND)+w#u>Y6*VR^3Po)F2MSL#1qhWp)-%l0vhV2K12ulBHyiA%5CK5&mIabTMI-{92n0YUnxG0eM%=)cON-h7 z-zX(n2=N7^nZZ{{%!Wn;^-y)2;pLe^03`j*sB}E^gZcbElWyeS_3u%1(Yp&2Oa3A| zsHHIKncA+*Uroy576uhIXUASXXQTCBFe>bJ8!1%SKX!}Ql2N=QaD7`6Ebx>!&;ZkJ z9qL`ucDCI(fB86iJzvRG$54#c5>H`ob)FLhK`h>hQ;%*4Y{y6c~kSs5Nr2_}en+AZF?((43TNMyI@Ng{;NrOqO9Psg=VDfR` zmAe!VN`i+TR7{x!3N<|)Frt#EIUpep$~~!=UD7B_m&O5eFLhwR!egdnmtCSDltsm8 z$)m7?WsBLVfSRYg#KAT%8YYdf40V;3!uYve@OR3~40JtK0Ze&GqJhcsR7gaoR3X45 zt_BS6ZO9hllC6%uebgI|98g=r%7ElUMa)S{_8PG0vl8U{(2yL>AJ`fpZQ$D*bcMh{ zUmEg$(+?~H-uP1B7C`db4NHJnKNgZ~0)Yw>Ww6qp0`CV_{&tva6tLir2NM)QP{(sZ zVBX&qQ@kBC1t@~U0W`P`GzKu?OrWyg37!Op_Zy)3U-eV|&x7v$l1uqlu>bT-P>dI< z81Gj}W|_l}{DTdM36$n#YrXtaswJm@=k?_&Md~NgPQVUSL_cIhARe=c4t@_(1fK(G z@GRIGL{<7#!2g@ubKp#nH1AA?T#@lGOeSaw= +#include "../src/storage/mask.h" + +TEST(Mask, Constructor){ + std::array size = {3,3}; + Mask mask(size); + for (int i = 0; i < 3; i++){ + for (int j = 0; j < 3; j++){ + EXPECT_EQ(mask(i,j), FLUID); + } + } +}; + +TEST(Mask, SetAndGet){ + std::array size = {3,3}; + Mask mask(size); + mask(0,0) = AIR; + EXPECT_EQ(mask(0,0), AIR); +}; + +TEST(Mask, isFluid){ + std::array size = {3,3}; + Mask mask(size); + mask(0,0) = AIR; + EXPECT_FALSE(mask.isFluid(0,0)); + EXPECT_TRUE(mask.isFluid(1,1)); +}; + +TEST(Mask, isObstacle){ + std::array size = {3,3}; + Mask mask(size); + mask(0,0) = OBSTACLE; + mask(1,1) = AIR; + EXPECT_TRUE(mask.isObstacle(0,0)); + EXPECT_FALSE(mask.isObstacle(1,1)); + EXPECT_FALSE(mask.isObstacle(2,2)); +}; \ No newline at end of file From 841e573f5ac5bb5d39a49a236e6f168a4bfa4209 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Thu, 18 Jan 2024 10:56:34 +0100 Subject: [PATCH 04/67] [Boundary][Mask] -> boundary_list, print ... --- src/discretization/boundary.cpp | 21 ++++++++ src/discretization/boundary.h | 15 ++++++ src/solver/pressure_solver.cpp | 17 ++---- src/solver/pressure_solver.h | 2 + src/storage/mask.cpp | 91 ++++++++++++++++++++++++++++----- src/storage/mask.h | 39 ++++++++++++-- tests/test_mask.cpp | 34 ++++++++++-- 7 files changed, 186 insertions(+), 33 deletions(-) create mode 100644 src/discretization/boundary.cpp create mode 100644 src/discretization/boundary.h diff --git a/src/discretization/boundary.cpp b/src/discretization/boundary.cpp new file mode 100644 index 00000000..8af30390 --- /dev/null +++ b/src/discretization/boundary.cpp @@ -0,0 +1,21 @@ +#include "boundary.h" + +void Boundary::updateBoundaryPressure(){ + updateBoundaryPressureDomain(); + updateBoundaryPressureObstacle(); + updateBoundaryPressureSurfaceTension(); +} + + +void Boundary::updateBoundaryPressureDomain(){ + // for (int i = i_beg; i < i_end; i++){ + // discretization_->p(i, j_beg - 1) = discretization_->p(i, j_beg); + // discretization_->p(i, j_end) = discretization_->p(i, j_end - 1); + // } + + // // Vertical (without corners) + // for (int j = j_beg - 1; j < j_end + 1; j++){ + // discretization_->p(i_beg - 1, j) = discretization_->p(i_beg, j); + // discretization_->p(i_end, j) = discretization_->p(i_end - 1, j); + // } +} \ No newline at end of file diff --git a/src/discretization/boundary.h b/src/discretization/boundary.h new file mode 100644 index 00000000..3291eb52 --- /dev/null +++ b/src/discretization/boundary.h @@ -0,0 +1,15 @@ +#pragma once + +#include "storage/mask.h" + +class Boundary +{ + public: + void updateBoundaryPressure(); + + private: + void updateBoundaryPressureDomain(); + void updateBoundaryPressureObstacle(); + void updateBoundaryPressureSurfaceTension(); + +}; \ No newline at end of file diff --git a/src/solver/pressure_solver.cpp b/src/solver/pressure_solver.cpp index 26426f10..f41290a7 100644 --- a/src/solver/pressure_solver.cpp +++ b/src/solver/pressure_solver.cpp @@ -24,20 +24,9 @@ PressureSolver::PressureSolver(std::shared_ptr discretization, void PressureSolver::setBoundaryValues() { + boundary_->updateBoundaryPressure(); - // Horizontal (without corners) - for (int i = i_beg; i < i_end; i++) - { - discretization_->p(i, j_beg - 1) = discretization_->p(i, j_beg); - discretization_->p(i, j_end) = discretization_->p(i, j_end - 1); - } - // Vertical (without corners) - for (int j = j_beg - 1; j < j_end + 1; j++) - { - discretization_->p(i_beg - 1, j) = discretization_->p(i_beg, j); - discretization_->p(i_end, j) = discretization_->p(i_end - 1, j); - } } double PressureSolver::calculateResiduum() @@ -56,6 +45,10 @@ double PressureSolver::calculateResiduum() { for (int j = j_beg; j < j_end; j++) { + // if (mask_->isFluid(i, j)) + // { + // continue; + // } pxx = (discretization_->p(i - 1, j) - 2 * discretization_->p(i, j) + discretization_->p(i + 1, j)) / dx2; pyy = (discretization_->p(i, j - 1) - 2 * discretization_->p(i, j) + discretization_->p(i, j + 1)) / dy2; res_current_point = pxx + pyy - discretization_->rhs(i, j); diff --git a/src/solver/pressure_solver.h b/src/solver/pressure_solver.h index 9f7ea8db..d606ab25 100644 --- a/src/solver/pressure_solver.h +++ b/src/solver/pressure_solver.h @@ -1,6 +1,7 @@ #pragma once #include "../storage/field_variable.h" #include "../discretization/discretization.h" +#include "../discretization/boundary.h" #include /** @@ -53,6 +54,7 @@ class PressureSolver int j_end; //!< end of loop for rhs in y direction std::shared_ptr discretization_; //!< object holding the needed field variables for rhs and p + std::shared_ptr boundary_; //!< object managing boundary for obstacle and surface tension double epsilon_; //!< tolerance for the solver diff --git a/src/storage/mask.cpp b/src/storage/mask.cpp index 5e43b949..ccf0fb7f 100644 --- a/src/storage/mask.cpp +++ b/src/storage/mask.cpp @@ -3,7 +3,17 @@ Mask::Mask(std::array size) : size_(size) { assert(size[0] > 0 && size[1] > 0); - data_.resize(size_[0] * size_[1], 0); + data_.resize(size_[0] * size_[1], FLUID); + for (int i = 0; i < size_[0]; i++) + { + data_[i] = OBSTACLE; + data_[i + (size_[1] - 1) * size_[0]] = OBSTACLE; + } + for (int j = 0; j < size_[1]; j++) + { + data_[j * size_[0]] = OBSTACLE; + data_[(size_[0] - 1) + j * size_[0]] = OBSTACLE; + } } int &Mask::operator()(int i, int j) @@ -30,14 +40,13 @@ void Mask::updateMaskBoundaries() for (int j = 0; j < size_[1]; j++) { int idx = i + j * size_[0]; - bool isFluid = data_[idx] < FLUID_TYPE; - if (isFluid) + if (Mask::isFluid(i, j)) { - data_[idx] = 1 * (data_[idx - 1] < FLUID_TYPE) - + 2 * (data_[idx + size_[0]] < FLUID_TYPE) - + 4 * (data_[idx + 1] < FLUID_TYPE) - + 8 * (data_[idx - size_[0]] < FLUID_TYPE); + data_[idx] = 1 * Mask::isNotAir(i - 1, j) + + 2 * Mask::isNotAir(i, j + 1) + + 4 * Mask::isNotAir(i + 1, j) + + 8 * Mask::isNotAir(i, j - 1); } } @@ -47,14 +56,13 @@ void Mask::updateMaskBoundaries() - - - - - bool Mask::isFluid(int i, int j) const { + if (i < 0 || i >= size_[0] || j < 0 || j >= size_[1]){ + return false; + } else { return (data_[i + j * size_[0]] < FLUID_TYPE); + } } bool Mask::isObstacle(int i, int j) const @@ -72,4 +80,61 @@ bool Mask::isFluidBorder(int i, int j) const bool Mask::isAir(int i, int j) const { return (data_[i + j * size_[0]] == AIR); - } \ No newline at end of file + } + +bool Mask::isNotAir(int i, int j) const + { + if (i < 0 || i >= size_[0] || j < 0 || j >= size_[1]) + { + return true; + } else { + return (data_[i + j * size_[0]] != AIR); + } + } +/////////////////////////////////////////////////// +// Temporary Print Statements + +void Mask::printMask() const{ + for (int j = size_[1] - 1; j >= 0; j--){ + for (int i = 0; i < size_[0]; i++){ + std::cout << data_[i + j * size_[0]] << " "; + } + std::cout << std::endl; + } +} + + +// void Mask::createBitmap() const{ +// std::ofstream file("output.bmp", std::ios::binary); +// int width = size_[0]; +// int height = size_[1]; +// std::vector pixels = data_; + +// // Bitmap header +// unsigned char header[54] = { +// 0x42, 0x4D, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, +// 0, 0, static_cast(width), static_cast(width >> 8), static_cast(width >> 16), static_cast(width >> 24), +// static_cast(height), static_cast(height >> 8), static_cast(height >> 16), static_cast(height >> 24), +// 1, 0, 24, 0 +// }; + +// file.write(reinterpret_cast(header), sizeof(header)); + +// // Bitmap data +// int rowSize = (3 width + 3) & ~3; // Ensure each row is a multiple of 4 bytes +// unsigned char padding[3] = {0, 0, 0}; + +// for (int y = height - 1; y >= 0; --y) { +// for (int x = 0; x < width; ++x) { +// unsigned char pixel[3] = { +// pixels[y * width + x], +// pixels[y * width + x], +// pixels[y * width + x] +// }; +// file.write(reinterpret_cast(pixel), sizeof(pixel)); +// } +// file.write(reinterpret_cast(padding), rowSize - 3 * width); +// } + +// file.close(); +// } diff --git a/src/storage/mask.h b/src/storage/mask.h index b46b521e..c01bf7d7 100644 --- a/src/storage/mask.h +++ b/src/storage/mask.h @@ -2,10 +2,14 @@ #include "array2D.h" +#include +#include + //TODO: it is weird but if we would use `char` instead of int, we would use less memory enum CellType{ - FLUID = 0, + DROPLET = 0, + FLUID = 15, FLUID_SINGLE_LEFT = 1, FLUID_SINGLE_TOP = 2, @@ -20,9 +24,9 @@ enum CellType{ FLUID_COLUMN_HORIZONTAL = 5, FLUID_COLUMN_VERTICAL = 10, - FLUID_BORDER_LEFT = 15, - FLUID_BORDER_TOP = 14, - FLUID_BORDER_RIGHT = 12, + FLUID_BORDER_LEFT = 14, + FLUID_BORDER_TOP = 13, + FLUID_BORDER_RIGHT = 11, FLUID_BORDER_BOTTOM = 7, FLUID_TYPE = 50, @@ -49,6 +53,7 @@ class Mask{ * @param size size of array in x and y direction */ Mask(std::array size); + /** * @brief set array value. @@ -88,10 +93,11 @@ class Mask{ * * @param i index in x direction * @param j index in y direction + * + * If i and j are out of bond returns false */ bool isFluid(int i, int j) const; - /** * @brief Returns a boolean indicating whether the cell at (i,j) is an obstacle or not * @@ -113,13 +119,36 @@ class Mask{ * * @param i index in x direction * @param j index in y direction + * + * If i and j are out of bond returns false */ bool isAir(int i, int j) const; + /** + * @brief Returns a boolean indicating whether the cell at (i,j) is not a air cell or not + * + * @param i index in x direction + * @param j index in y direction + * + * If i and j are out of bond returns true + */ + bool isNotAir(int i, int j) const; + + + + + + // void placeRectangle() + + + void printMask() const; + + // void createBitmap() const; protected: const std::array size_; //!< size of array in x and y direction std::vector data_; //!< storage array values, in row-major order + std::vector boundary_list; //!< stores the indices of the boundary cells }; \ No newline at end of file diff --git a/tests/test_mask.cpp b/tests/test_mask.cpp index c40612ab..7581071d 100644 --- a/tests/test_mask.cpp +++ b/tests/test_mask.cpp @@ -1,7 +1,7 @@ #include #include "../src/storage/mask.h" -TEST(Mask, Constructor){ +TEST(Mask, ConstructorInitAllAsFluid){ std::array size = {3,3}; Mask mask(size); for (int i = 0; i < 3; i++){ @@ -27,11 +27,39 @@ TEST(Mask, isFluid){ }; TEST(Mask, isObstacle){ - std::array size = {3,3}; + std::array size = {5,5}; Mask mask(size); - mask(0,0) = OBSTACLE; mask(1,1) = AIR; + mask(3,3) = OBSTACLE; EXPECT_TRUE(mask.isObstacle(0,0)); EXPECT_FALSE(mask.isObstacle(1,1)); EXPECT_FALSE(mask.isObstacle(2,2)); + EXPECT_TRUE(mask.isObstacle(3,3)); +}; + +TEST(Mask, updateMaskBoundaries){ + // A A F F F + // A A A F F + // A F A F F + // F F F A F + // F F F F F + std::array size = {5,5}; + Mask mask(size); + mask(0,4) = AIR; + mask(1,4) = AIR; + mask(0,3) = AIR; + mask(1,3) = AIR; + mask(2,3) = AIR; + mask(0,2) = AIR; + mask(2,2) = AIR; + mask(3,1) = AIR; + + mask.updateMaskBoundaries(); + EXPECT_EQ(mask(0,1), FLUID_BORDER_TOP); + EXPECT_EQ(mask(1,1), FLUID); + EXPECT_EQ(mask(1,2), FLUID_SINGLE_BOTTOM); + EXPECT_EQ(mask(2,1), FLUID_CORNER_TOP_RIGHT); + EXPECT_EQ(mask(2,2), FLUID_COLUMN_HORIZONTAL); + + mask.printMask(); }; \ No newline at end of file From 50d127a407dd7ff97f37ac27433113a249cbce25 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Thu, 18 Jan 2024 15:31:50 +0100 Subject: [PATCH 05/67] minor update --- src/solver/pressure_solver.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/solver/pressure_solver.cpp b/src/solver/pressure_solver.cpp index f41290a7..daee6e1f 100644 --- a/src/solver/pressure_solver.cpp +++ b/src/solver/pressure_solver.cpp @@ -24,9 +24,7 @@ PressureSolver::PressureSolver(std::shared_ptr discretization, void PressureSolver::setBoundaryValues() { - boundary_->updateBoundaryPressure(); - - + // discretization_->boundary()->updateBoundaryPressure(); } double PressureSolver::calculateResiduum() From 9b674ac19ca50492676169863fa76346458dd4d8 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Mon, 22 Jan 2024 12:26:06 +0100 Subject: [PATCH 06/67] [Boundary] works with lid-driven cavity --- build.sh | 2 +- src/CMakeLists.txt | 4 +- src/boundary/boundary.cpp | 82 +++++++++++++++++++++++++++++ src/boundary/boundary.h | 22 ++++++++ src/{storage => boundary}/mask.cpp | 17 ++++-- src/{storage => boundary}/mask.h | 41 ++++++++++----- src/computation.cpp | 9 +++- src/computation.h | 1 + src/discretization/boundary.cpp | 21 -------- src/discretization/boundary.h | 15 ------ src/discretization/discretization.h | 5 +- src/output_writer/output_writer.h | 1 + src/solver/gauss_seidel.cpp | 3 +- src/solver/gauss_seidel.h | 3 +- src/solver/pressure_solver.cpp | 15 +++--- src/solver/pressure_solver.h | 15 ++++-- src/solver/sor.cpp | 3 +- src/solver/sor.h | 1 + tests/CMakeLists.txt | 2 +- tests/test_mask.cpp | 48 +++++++++-------- 20 files changed, 215 insertions(+), 95 deletions(-) create mode 100644 src/boundary/boundary.cpp create mode 100644 src/boundary/boundary.h rename src/{storage => boundary}/mask.cpp (87%) rename src/{storage => boundary}/mask.h (88%) delete mode 100644 src/discretization/boundary.cpp delete mode 100644 src/discretization/boundary.h diff --git a/build.sh b/build.sh index 3dfba072..ca65b7bc 100755 --- a/build.sh +++ b/build.sh @@ -16,7 +16,7 @@ else fi make install -j4 -# ./numsim ../input/settings_v3.txt +./numsim ../input/settings.txt diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 078b29ea..e2043174 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -21,7 +21,9 @@ add_executable(${PROJECT_NAME} storage/array2D.cpp storage/field_variable.cpp - storage/mask.cpp + + boundary/mask.cpp + boundary/boundary.cpp solver/pressure_solver.cpp solver/gauss_seidel.cpp diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp new file mode 100644 index 00000000..76f2b1ee --- /dev/null +++ b/src/boundary/boundary.cpp @@ -0,0 +1,82 @@ +#include "boundary.h" + +Boundary::Boundary(std::shared_ptr mask, + std::shared_ptr discretization) : mask_(mask), discretization_(discretization) +{ + for (int i = 0; i < mask_->size()[0]; i++) + { + for (int j = 0; j < mask_->size()[1]; j++) + { + if (mask_->isBorder(i, j)) + { + boundaryCells_.push_back(i + j * mask_->size()[0]); + } + } + } + +} + +void Boundary::setPressureBoundaryValues(){ + for (int idx : boundaryCells_) + { + int i = idx % mask_->size()[0]; + int j = idx / mask_->size()[0]; + + if (mask_->isFluid(i, j)) + { + setPressureBoundarySurface(i, j); + } + else if (mask_->isObstacle(i, j)) + { + setPressureBoundaryObstacle(i, j); + } + } +} + +void Boundary::setPressureBoundarySurface(int i, int j){ + //TODO: Implement +} + +void Boundary::setPressureBoundaryObstacle(int i, int j){ + if ((*mask_)(i, j) == Mask::OBSTACLE_BORDER_TOP){ + discretization_->p(i, j) = discretization_->p(i, j + 1); + } + else if ((*mask_)(i, j) == Mask::OBSTACLE_BORDER_BOTTOM){ + discretization_->p(i, j) = discretization_->p(i, j - 1); + } + else if ((*mask_)(i, j) == Mask::OBSTACLE_BORDER_LEFT){ + discretization_->p(i, j) = discretization_->p(i - 1, j); + } + else if ((*mask_)(i, j)== Mask::OBSTACLE_BORDER_RIGHT){ + discretization_->p(i, j) = discretization_->p(i + 1, j); + } + // else if (mask_->(i, j) == OBSTACLE_CORNER_BOTTOM_LEFT){ + // discretization_->p(i, j) = 0.5 * (discretization_->p(i, j - 1) + discretization_->p(i - 1, j)); + // } + // else if (mask_->(i, j) == OBSTACLE_CORNER_TOP_LEFT){ + // discretization_->p(i, j) = 0.5 * (discretization_->p(i, j + 1) + discretization_->p(i - 1, j)); + // } + // else if (mask_->(i, j) == OBSTACLE_CORNER_TOP_RIGHT){ + // discretization_->p(i, j) = 0.5 * (discretization_->p(i, j + 1) + discretization_->p(i + 1, j)); + // } + // else if (mask_->(i, j) == OBSTACLE_CORNER_BOTTOM_RIGHT){ + // discretization_->p(i, j) = 0.5 * (discretization_->p(i, j - 1) + discretization_->p(i + 1, j)); + // } + // else{ + // std::cout << "Error: Boundary condition not implemented" << std::endl; + // } +} + + +// void Boundary::updateBoundaryPressureDomain(){ +// // for (int i = i_beg; i < i_end; i++){ +// // discretization_->p(i, j_beg - 1) = discretization_->p(i, j_beg); +// // discretization_->p(i, j_end) = discretization_->p(i, j_end - 1); +// // } + +// // // Vertical (without corners) +// // for (int j = j_beg - 1; j < j_end + 1; j++){ +// // discretization_->p(i_beg - 1, j) = discretization_->p(i_beg, j); +// // discretization_->p(i_end, j) = discretization_->p(i_end - 1, j); +// // } +// } \ No newline at end of file diff --git a/src/boundary/boundary.h b/src/boundary/boundary.h new file mode 100644 index 00000000..ecb74492 --- /dev/null +++ b/src/boundary/boundary.h @@ -0,0 +1,22 @@ +#pragma once + +#include "boundary/mask.h" +#include "discretization/discretization.h" +#include +#include + +class Boundary +{ + public: + Boundary(std::shared_ptr mask, std::shared_ptr discretization); + void setPressureBoundaryValues(); + + private: + void setPressureBoundarySurface(int i, int j); + void setPressureBoundaryObstacle(int i, int j); + + std::shared_ptr discretization_; + std::shared_ptr mask_; + std::vector boundaryCells_; + +}; \ No newline at end of file diff --git a/src/storage/mask.cpp b/src/boundary/mask.cpp similarity index 87% rename from src/storage/mask.cpp rename to src/boundary/mask.cpp index ccf0fb7f..eb3e1999 100644 --- a/src/storage/mask.cpp +++ b/src/boundary/mask.cpp @@ -1,18 +1,20 @@ #include "mask.h" -Mask::Mask(std::array size) : size_(size) +Mask::Mask(std::array size) : size_({size[0]+2, size[1]+2}) { assert(size[0] > 0 && size[1] > 0); data_.resize(size_[0] * size_[1], FLUID); + + // Set domain boundaries to obstacle for (int i = 0; i < size_[0]; i++) { - data_[i] = OBSTACLE; - data_[i + (size_[1] - 1) * size_[0]] = OBSTACLE; + data_[i] = OBSTACLE_BORDER_TOP; // is bottom therefore the top of an obstacle + data_[i + (size_[1] - 1) * size_[0]] = OBSTACLE_BORDER_BOTTOM; } for (int j = 0; j < size_[1]; j++) { - data_[j * size_[0]] = OBSTACLE; - data_[(size_[0] - 1) + j * size_[0]] = OBSTACLE; + data_[j * size_[0]] = OBSTACLE_BORDER_RIGHT; + data_[(size_[0] - 1) + j * size_[0]] = OBSTACLE_BORDER_LEFT; } } @@ -77,6 +79,11 @@ bool Mask::isFluidBorder(int i, int j) const val <= FLUID_TYPE); } +bool Mask::isBorder(int i, int j) const + { + return isFluidBorder(i, j) || isObstacle(i, j); + } + bool Mask::isAir(int i, int j) const { return (data_[i + j * size_[0]] == AIR); diff --git a/src/storage/mask.h b/src/boundary/mask.h similarity index 88% rename from src/storage/mask.h rename to src/boundary/mask.h index c01bf7d7..624c352e 100644 --- a/src/storage/mask.h +++ b/src/boundary/mask.h @@ -1,10 +1,25 @@ #pragma once -#include "array2D.h" +#include +#include +#include #include #include + + +class Mask{ + public: + /** + * @brief constructor. + * + * @param size size of array in x and y direction + */ + Mask(std::array size); + + + //TODO: it is weird but if we would use `char` instead of int, we would use less memory enum CellType{ @@ -44,15 +59,6 @@ enum CellType{ OBSTACLE_CORNER_TOP_RIGHT = 122, OBSTACLE_CORNER_BOTTOM_RIGHT = 123, }; - -class Mask{ - public: - /** - * @brief constructor. - * - * @param size size of array in x and y direction - */ - Mask(std::array size); /** @@ -89,7 +95,7 @@ class Mask{ /** - * @brief Returns a boolean indicating whether the cell at (i,j) is fluid or not + * @brief Cell at (i,j) is fluid or not * * @param i index in x direction * @param j index in y direction @@ -99,7 +105,7 @@ class Mask{ bool isFluid(int i, int j) const; /** - * @brief Returns a boolean indicating whether the cell at (i,j) is an obstacle or not + * @brief Cell at (i,j) is an obstacle or not * * @param i index in x direction * @param j index in y direction @@ -107,13 +113,22 @@ class Mask{ bool isObstacle(int i, int j) const; /** - * @brief Returns a boolean indicating whether the cell at (i,j) is a border cell or not + * @brief Cell at (i,j) is a fluid border cell or not * * @param i index in x direction * @param j index in y direction */ bool isFluidBorder(int i, int j) const; + /** + * @brief Cell at (i,j) is border cell (fluid or obstacle) or not + * + * @param i index in x direction + * @param j index in y direction + */ + bool isBorder(int i, int j) const; + + /** * @brief Returns a boolean indicating whether the cell at (i,j) is a air cell or not * diff --git a/src/computation.cpp b/src/computation.cpp index 58712784..6280af5e 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -22,19 +22,26 @@ void Computation::initialize(int argc, char *argv[]) { discretization_ = std::make_shared(settings_.nCells, meshWidth_); } + + // create boundary + std::shared_ptr mask_ = std::make_shared(settings_.nCells); + std::shared_ptr boundary_ = std::make_shared(mask_, discretization_); + if (settings_.pressureSolver == "SOR") { pressureSolver_ = std::make_unique(discretization_, settings_.epsilon, settings_.maximumNumberOfIterations, + boundary_, settings_.omega); } else { pressureSolver_ = std::make_unique(discretization_, settings_.epsilon, - settings_.maximumNumberOfIterations); + settings_.maximumNumberOfIterations, + boundary_); } outputWriterParaview_ = std::make_unique(discretization_); diff --git a/src/computation.h b/src/computation.h index 3308bf99..68901e2c 100644 --- a/src/computation.h +++ b/src/computation.h @@ -75,6 +75,7 @@ class Computation Settings settings_; std::shared_ptr discretization_; //!< discretization instance + std::shared_ptr boundary_; //!< boundary instance std::unique_ptr pressureSolver_; //!< pressureSolver instance std::unique_ptr outputWriterParaview_; //!< outputWriterParaview instance std::unique_ptr outputWriterText_; //!< outputWriterText instance diff --git a/src/discretization/boundary.cpp b/src/discretization/boundary.cpp deleted file mode 100644 index 8af30390..00000000 --- a/src/discretization/boundary.cpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "boundary.h" - -void Boundary::updateBoundaryPressure(){ - updateBoundaryPressureDomain(); - updateBoundaryPressureObstacle(); - updateBoundaryPressureSurfaceTension(); -} - - -void Boundary::updateBoundaryPressureDomain(){ - // for (int i = i_beg; i < i_end; i++){ - // discretization_->p(i, j_beg - 1) = discretization_->p(i, j_beg); - // discretization_->p(i, j_end) = discretization_->p(i, j_end - 1); - // } - - // // Vertical (without corners) - // for (int j = j_beg - 1; j < j_end + 1; j++){ - // discretization_->p(i_beg - 1, j) = discretization_->p(i_beg, j); - // discretization_->p(i_end, j) = discretization_->p(i_end - 1, j); - // } -} \ No newline at end of file diff --git a/src/discretization/boundary.h b/src/discretization/boundary.h deleted file mode 100644 index 3291eb52..00000000 --- a/src/discretization/boundary.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "storage/mask.h" - -class Boundary -{ - public: - void updateBoundaryPressure(); - - private: - void updateBoundaryPressureDomain(); - void updateBoundaryPressureObstacle(); - void updateBoundaryPressureSurfaceTension(); - -}; \ No newline at end of file diff --git a/src/discretization/discretization.h b/src/discretization/discretization.h index cff36c8e..7e38ec2b 100644 --- a/src/discretization/discretization.h +++ b/src/discretization/discretization.h @@ -66,4 +66,7 @@ class Discretization : public StaggeredGrid * @brief Calculate first derivative of p with respect to y */ virtual double computeDpDy(int i, int j) const; -}; \ No newline at end of file + + +}; + diff --git a/src/output_writer/output_writer.h b/src/output_writer/output_writer.h index 49afbbfb..9fc9e86e 100644 --- a/src/output_writer/output_writer.h +++ b/src/output_writer/output_writer.h @@ -4,6 +4,7 @@ #include #include +#include /** * @class OutputWriter diff --git a/src/solver/gauss_seidel.cpp b/src/solver/gauss_seidel.cpp index d3afb83d..1891e075 100644 --- a/src/solver/gauss_seidel.cpp +++ b/src/solver/gauss_seidel.cpp @@ -2,7 +2,8 @@ GaussSeidel::GaussSeidel(const std::shared_ptr &data, double epsilon, - int maximumNumberOfIterations) : PressureSolver(data, epsilon, maximumNumberOfIterations) + int maximumNumberOfIterations, + std::shared_ptr boundary) : PressureSolver(data, epsilon, maximumNumberOfIterations, boundary) { } diff --git a/src/solver/gauss_seidel.h b/src/solver/gauss_seidel.h index 22f5572b..900416e0 100644 --- a/src/solver/gauss_seidel.h +++ b/src/solver/gauss_seidel.h @@ -21,7 +21,8 @@ class GaussSeidel : public PressureSolver */ GaussSeidel(const std::shared_ptr &data, double epsilon, - int maximumNumberOfIterations); + int maximumNumberOfIterations, + std::shared_ptr boundary); /** * @brief override function that starts solver. * diff --git a/src/solver/pressure_solver.cpp b/src/solver/pressure_solver.cpp index daee6e1f..5aa5677d 100644 --- a/src/solver/pressure_solver.cpp +++ b/src/solver/pressure_solver.cpp @@ -1,12 +1,15 @@ #include "pressure_solver.h" -#include -#include + + PressureSolver::PressureSolver(std::shared_ptr discretization, double epsilon, - int maximumNumberOfIterations) : discretization_(discretization), - epsilon_(epsilon), - maximumNumberOfIterations_(maximumNumberOfIterations) + int maximumNumberOfIterations, + std::shared_ptr boundary) : + discretization_(discretization), + epsilon_(epsilon), + maximumNumberOfIterations_(maximumNumberOfIterations), + boundary_(boundary) { assert(epsilon > 0); assert(maximumNumberOfIterations > 0); @@ -24,7 +27,7 @@ PressureSolver::PressureSolver(std::shared_ptr discretization, void PressureSolver::setBoundaryValues() { - // discretization_->boundary()->updateBoundaryPressure(); + boundary_->setPressureBoundaryValues(); } double PressureSolver::calculateResiduum() diff --git a/src/solver/pressure_solver.h b/src/solver/pressure_solver.h index d606ab25..adc831b4 100644 --- a/src/solver/pressure_solver.h +++ b/src/solver/pressure_solver.h @@ -1,8 +1,13 @@ #pragma once + +#include +#include +#include + #include "../storage/field_variable.h" #include "../discretization/discretization.h" -#include "../discretization/boundary.h" -#include +#include "../boundary/boundary.h" + /** * @class PressureSolver @@ -21,11 +26,13 @@ class PressureSolver * @param discretization instance of Discretization holding the needed field variables for rhs and p * @param epsilon tolerance for the solver * @param maximumNumberOfIterations maximum of iteration + * @param boundary object managing boundary for obstacle and surface tension */ PressureSolver(std::shared_ptr discretization, double epsilon, - int maximumNumberOfIterations); - + int maximumNumberOfIterations, + std::shared_ptr boundary); + /** * @brief virtual function that starts solver. * diff --git a/src/solver/sor.cpp b/src/solver/sor.cpp index b0e7c29c..2295a911 100644 --- a/src/solver/sor.cpp +++ b/src/solver/sor.cpp @@ -4,7 +4,8 @@ SOR::SOR(const std::shared_ptr &data, double epsilon, int maximumNumberOfIterations, - double omega) : PressureSolver(data, epsilon, maximumNumberOfIterations), omega_(omega) + std::shared_ptr boundary, + double omega) : PressureSolver(data, epsilon, maximumNumberOfIterations, boundary), omega_(omega) { } diff --git a/src/solver/sor.h b/src/solver/sor.h index 614d9327..9d40204a 100644 --- a/src/solver/sor.h +++ b/src/solver/sor.h @@ -22,6 +22,7 @@ class SOR : public PressureSolver SOR(const std::shared_ptr &data, double epsilon, int maximumNumberOfIterations, + std::shared_ptr boundary, double omega); /** diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f7e12fd1..a05e94b2 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -18,7 +18,7 @@ add_executable(run_tests test_central_differences.cpp ../src/storage/array2D.cpp ../src/storage/field_variable.cpp - ../src/storage/mask.cpp + ../src/boundary/mask.cpp ../src/discretization/staggered_grid.cpp ../src/discretization/discretization.cpp ../src/discretization/donor_cell.cpp diff --git a/tests/test_mask.cpp b/tests/test_mask.cpp index 7581071d..3d0501b2 100644 --- a/tests/test_mask.cpp +++ b/tests/test_mask.cpp @@ -1,12 +1,12 @@ #include -#include "../src/storage/mask.h" +#include "../src/boundary/mask.h" -TEST(Mask, ConstructorInitAllAsFluid){ +TEST(Mask, ConstructorInitAllInnerCellsAsFluid){ std::array size = {3,3}; Mask mask(size); - for (int i = 0; i < 3; i++){ - for (int j = 0; j < 3; j++){ - EXPECT_EQ(mask(i,j), FLUID); + for (int i = 1; i < 4; i++){ + for (int j = 1; j < 4; j++){ + EXPECT_EQ(mask(i,j), Mask::FLUID); } } }; @@ -14,14 +14,14 @@ TEST(Mask, ConstructorInitAllAsFluid){ TEST(Mask, SetAndGet){ std::array size = {3,3}; Mask mask(size); - mask(0,0) = AIR; - EXPECT_EQ(mask(0,0), AIR); + mask(0,0) = Mask::AIR; + EXPECT_EQ(mask(0,0), Mask::AIR); }; TEST(Mask, isFluid){ std::array size = {3,3}; Mask mask(size); - mask(0,0) = AIR; + mask(0,0) = Mask::AIR; EXPECT_FALSE(mask.isFluid(0,0)); EXPECT_TRUE(mask.isFluid(1,1)); }; @@ -29,8 +29,8 @@ TEST(Mask, isFluid){ TEST(Mask, isObstacle){ std::array size = {5,5}; Mask mask(size); - mask(1,1) = AIR; - mask(3,3) = OBSTACLE; + mask(1,1) = Mask::AIR; + mask(3,3) = Mask::OBSTACLE; EXPECT_TRUE(mask.isObstacle(0,0)); EXPECT_FALSE(mask.isObstacle(1,1)); EXPECT_FALSE(mask.isObstacle(2,2)); @@ -45,21 +45,23 @@ TEST(Mask, updateMaskBoundaries){ // F F F F F std::array size = {5,5}; Mask mask(size); - mask(0,4) = AIR; - mask(1,4) = AIR; - mask(0,3) = AIR; - mask(1,3) = AIR; - mask(2,3) = AIR; - mask(0,2) = AIR; - mask(2,2) = AIR; - mask(3,1) = AIR; + mask(1,5) = Mask::AIR; + mask(2,5) = Mask::AIR; + mask(1,4) = Mask::AIR; + mask(2,4) = Mask::AIR; + mask(3,4) = Mask::AIR; + mask(1,3) = Mask::AIR; + mask(3,3) = Mask::AIR; + mask(2,2) = Mask::AIR; + + mask.updateMaskBoundaries(); - EXPECT_EQ(mask(0,1), FLUID_BORDER_TOP); - EXPECT_EQ(mask(1,1), FLUID); - EXPECT_EQ(mask(1,2), FLUID_SINGLE_BOTTOM); - EXPECT_EQ(mask(2,1), FLUID_CORNER_TOP_RIGHT); - EXPECT_EQ(mask(2,2), FLUID_COLUMN_HORIZONTAL); + EXPECT_EQ(mask(1,2), Mask::FLUID_BORDER_TOP); + EXPECT_EQ(mask(2,2), Mask::FLUID); + EXPECT_EQ(mask(2,3), Mask::FLUID_SINGLE_BOTTOM); + EXPECT_EQ(mask(3,2), Mask::FLUID_CORNER_TOP_RIGHT); + EXPECT_EQ(mask(3,3), Mask::FLUID_COLUMN_HORIZONTAL); mask.printMask(); }; \ No newline at end of file From 9440d7b942ec1943a762aec0b9d2a48021e35463 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Mon, 22 Jan 2024 19:34:24 +0100 Subject: [PATCH 07/67] "Working on velocity boundary conditions and boundary primitives --- build.sh | 4 +- input/settings_debug.txt | 4 +- src/boundary/boundary.cpp | 89 +++++++++++++++++++++++++++++++++- src/boundary/boundary.h | 12 ++++- src/boundary/mask.cpp | 41 ++++++++++++++-- src/boundary/mask.h | 21 +++++++- src/computation.cpp | 52 +++++--------------- src/computation.h | 2 + src/solver/pressure_solver.cpp | 2 +- src/solver/sor.cpp | 3 ++ tests/test_mask.cpp | 30 +++++++----- 11 files changed, 195 insertions(+), 65 deletions(-) diff --git a/build.sh b/build.sh index ca65b7bc..3d13f31a 100755 --- a/build.sh +++ b/build.sh @@ -34,7 +34,7 @@ cd .. # doxygen ../Doxyfile # cd .. -run tests -build/tests/run_tests +# run tests +# build/tests/run_tests # zip -r submission.zip src/ CMakeLists.txt \ No newline at end of file diff --git a/input/settings_debug.txt b/input/settings_debug.txt index c1c76989..3d3461a1 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -2,8 +2,8 @@ # Run ./numsim lid_driven_cavity.txt # Problem description -physicalSizeX = 2.0 # physical size of the domain -physicalSizeY = 2.0 +physicalSizeX = 1.0 # physical size of the domain +physicalSizeY = 1.0 endTime = 10.0 # duration of the simulation re = 1000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 76f2b1ee..7745f06f 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -1,8 +1,10 @@ #include "boundary.h" Boundary::Boundary(std::shared_ptr mask, - std::shared_ptr discretization) : mask_(mask), discretization_(discretization) + std::shared_ptr discretization, + Settings settings) : mask_(mask), discretization_(discretization), settings_(settings) { + for (int i = 0; i < mask_->size()[0]; i++) { for (int j = 0; j < mask_->size()[1]; j++) @@ -38,6 +40,23 @@ void Boundary::setPressureBoundarySurface(int i, int j){ } void Boundary::setPressureBoundaryObstacle(int i, int j){ + // switch((*mask_)(i, j)){ + // case Mask::OBSTACLE_BORDER_TOP: + // discretization_->p(i, j) = discretization_->p(i, j + 1); + // break; + // case Mask::OBSTACLE_BORDER_BOTTOM: + // discretization_->p(i, j) = discretization_->p(i, j - 1); + // break; + // case Mask::OBSTACLE_BORDER_LEFT: + // discretization_->p(i, j) = discretization_->p(i - 1, j); + // break; + // case Mask::OBSTACLE_BORDER_RIGHT: + // discretization_->p(i, j) = discretization_->p(i + 1, j); + // break; + // } + + + if ((*mask_)(i, j) == Mask::OBSTACLE_BORDER_TOP){ discretization_->p(i, j) = discretization_->p(i, j + 1); } @@ -68,6 +87,72 @@ void Boundary::setPressureBoundaryObstacle(int i, int j){ } + + +void Boundary::setVelocityBoundaryValues(){ + setUBoundaryValues(); + setVBoundaryValues(); +} + +void Boundary::setUBoundaryValues(){ + // BV for u + + int i_beg = discretization_->uIBegin(); + int i_end = discretization_->uIEnd(); + int j_beg = discretization_->uJBegin(); + int j_end = discretization_->uJEnd(); + + // Vertical + for (int j = j_beg; j < j_end; j++) + { + discretization_->u(i_beg, j) = settings_.dirichletBcLeft[0]; + discretization_->u(i_end - 1, j) = settings_.dirichletBcRight[0]; + } + // Horizontal (leave out corners) + for (int i = i_beg + 1; i < i_end - 1; i++) + { + discretization_->u(i, j_beg) = 2 * settings_.dirichletBcBottom[0] - discretization_->u(i, j_beg + 1); + discretization_->u(i, j_end - 1) = 2 * settings_.dirichletBcTop[0] - discretization_->u(i, j_end - 2); + } +} + +void Boundary::setVBoundaryValues(){ + // BV for v + int i_beg = discretization_->vIBegin(); + int i_end = discretization_->vIEnd(); + int j_beg = discretization_->vJBegin(); + int j_end = discretization_->vJEnd(); + + // Vertical + for (int j = j_beg; j < j_end; j++) + { + discretization_->v(i_beg, j) = 2 * settings_.dirichletBcLeft[1] - discretization_->v(i_beg + 1, j); + discretization_->v(i_end - 1, j) = 2 * settings_.dirichletBcRight[1] - discretization_->v(i_end - 2, j); + } + // Horizontal (leave out corners) + for (int i = i_beg + 1; i < i_end - 1; i++) + { + discretization_->v(i, j_beg) = settings_.dirichletBcBottom[1]; + discretization_->v(i, j_end - 1) = settings_.dirichletBcTop[1]; + } +} + + + + + + + + + + + + + + + + + // void Boundary::updateBoundaryPressureDomain(){ // // for (int i = i_beg; i < i_end; i++){ // // discretization_->p(i, j_beg - 1) = discretization_->p(i, j_beg); @@ -79,4 +164,4 @@ void Boundary::setPressureBoundaryObstacle(int i, int j){ // // discretization_->p(i_beg - 1, j) = discretization_->p(i_beg, j); // // discretization_->p(i_end, j) = discretization_->p(i_end - 1, j); // // } -// } \ No newline at end of file +// }P \ No newline at end of file diff --git a/src/boundary/boundary.h b/src/boundary/boundary.h index ecb74492..35a41a10 100644 --- a/src/boundary/boundary.h +++ b/src/boundary/boundary.h @@ -2,21 +2,31 @@ #include "boundary/mask.h" #include "discretization/discretization.h" +#include "settings_parser/settings.h" #include #include class Boundary { public: - Boundary(std::shared_ptr mask, std::shared_ptr discretization); + Boundary(std::shared_ptr mask, std::shared_ptr discretization, Settings settings); void setPressureBoundaryValues(); + void setVelocityBoundaryValues(); private: void setPressureBoundarySurface(int i, int j); void setPressureBoundaryObstacle(int i, int j); + void setVelocityBoundarySurface(int i, int j); + void setVelocityBoundaryObstacle(int i, int j); + + void setUBoundaryValues(); + void setVBoundaryValues(); + std::shared_ptr discretization_; std::shared_ptr mask_; + Settings settings_; + std::vector boundaryCells_; }; \ No newline at end of file diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index eb3e1999..be9b6258 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -4,7 +4,7 @@ Mask::Mask(std::array size) : size_({size[0]+2, size[1]+2}) { assert(size[0] > 0 && size[1] > 0); data_.resize(size_[0] * size_[1], FLUID); - + // Set domain boundaries to obstacle for (int i = 0; i < size_[0]; i++) { @@ -98,8 +98,43 @@ bool Mask::isNotAir(int i, int j) const return (data_[i + j * size_[0]] != AIR); } } -/////////////////////////////////////////////////// -// Temporary Print Statements + +// ************************ +// P R I M I T I V E S +// ************************ + + +void Mask::makeRectangularObstacle(std::array obstaclePosition_ , std::array obstacleSize_){ + // only works for global size {1.0; 1.0} + int i_beg = static_cast(std::floor(obstaclePosition_[0] * size_[0])); + int i_end = static_cast(std::ceil(obstaclePosition_[0] + obstacleSize_[0]) * size_[0]); + int j_beg = static_cast(std::floor(obstaclePosition_[1] * size_[1])); + int j_end = static_cast(std::ceil(obstaclePosition_[1] + obstacleSize_[1]) * size_[1]); + // interior obstacle + for (int i = i_beg + 1; i < i_end - 1; i++){ + for (int j = j_beg + 1; j < j_end - 1; j++){ + data_[i + j * size_[0]] = OBSTACLE; + } + } + // boundary obstacle + for (int i = i_beg; i < i_end; i++){ + data_[i + j_beg * size_[0]] = OBSTACLE_BORDER_BOTTOM; + data_[i + (j_end - 1) * size_[0]] = OBSTACLE_BORDER_TOP; + } + for (int j = j_beg; j < j_end; j++){ + data_[i_beg + j * size_[0]] = OBSTACLE_BORDER_LEFT; + data_[(i_end - 1) + j * size_[0]] = OBSTACLE_BORDER_RIGHT; + } +}; + + + + + + +// ****************************** +// P R I N T I N G +// ****************************** void Mask::printMask() const{ for (int j = size_[1] - 1; j >= 0; j--){ diff --git a/src/boundary/mask.h b/src/boundary/mask.h index 624c352e..d04b2e5e 100644 --- a/src/boundary/mask.h +++ b/src/boundary/mask.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -150,10 +151,28 @@ enum CellType{ bool isNotAir(int i, int j) const; + // ****************************** + // P R I M I T I V E S + // ****************************** + + /** + * @brief creates an obstacle at the given position + * + * assumes + * * that the obstacle is within the boundary and sets the boundaries of the obstacle to its + * according value + * * + * + * @param obstaclePosition_ + * @param obstacleSize_ + */ + void makeRectangularObstacle(std::array obstaclePosition_ , std::array obstacleSize_); - // void placeRectangle() + // ****************************** + // P R I N T I N G + // ****************************** void printMask() const; diff --git a/src/computation.cpp b/src/computation.cpp index 6280af5e..3c805d2a 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -24,9 +24,14 @@ void Computation::initialize(int argc, char *argv[]) } // create boundary - std::shared_ptr mask_ = std::make_shared(settings_.nCells); - std::shared_ptr boundary_ = std::make_shared(mask_, discretization_); + + // Obstacle from Primitives: Can be done inside boundary, since I give it the settings file + mask_ = std::make_shared(settings_.nCells); + // std::array obstaclePosition_ = {0.4, 0.4}; //settings.obstaclePosition; + // std::array obstacleSize_ = {0.2, 0.2}; //settings.obstacleSize; + // mask_->makeRectangularObstacle(obstaclePosition_ , obstacleSize_); + boundary_ = std::make_shared(mask_, discretization_, settings_); if (settings_.pressureSolver == "SOR") { @@ -44,6 +49,9 @@ void Computation::initialize(int argc, char *argv[]) boundary_); } + std::cout << "testfasldfj" << std::endl; + boundary_->setVelocityBoundaryValues(); + outputWriterParaview_ = std::make_unique(discretization_); outputWriterText_ = std::make_unique(discretization_); } @@ -74,46 +82,8 @@ void Computation::runSimulation() void Computation::applyBoundaryValues() { - // set Dirichlet BC - - // BV for u - int i_beg = discretization_->uIBegin(); - int i_end = discretization_->uIEnd(); - int j_beg = discretization_->uJBegin(); - int j_end = discretization_->uJEnd(); - - // Vertical - for (int j = j_beg; j < j_end; j++) - { - discretization_->u(i_beg, j) = settings_.dirichletBcLeft[0]; - discretization_->u(i_end - 1, j) = settings_.dirichletBcRight[0]; - } - // Horizontal (leave out corners) - for (int i = i_beg + 1; i < i_end - 1; i++) - { - discretization_->u(i, j_beg) = 2 * settings_.dirichletBcBottom[0] - discretization_->u(i, j_beg + 1); - discretization_->u(i, j_end - 1) = 2 * settings_.dirichletBcTop[0] - discretization_->u(i, j_end - 2); - } - - // BV for v - i_beg = discretization_->vIBegin(); - i_end = discretization_->vIEnd(); - j_beg = discretization_->vJBegin(); - j_end = discretization_->vJEnd(); - - // Vertical - for (int j = j_beg; j < j_end; j++) - { - discretization_->v(i_beg, j) = 2 * settings_.dirichletBcLeft[1] - discretization_->v(i_beg + 1, j); - discretization_->v(i_end - 1, j) = 2 * settings_.dirichletBcRight[1] - discretization_->v(i_end - 2, j); - } - // Horizontal (leave out corners) - for (int i = i_beg + 1; i < i_end - 1; i++) - { - discretization_->v(i, j_beg) = settings_.dirichletBcBottom[1]; - discretization_->v(i, j_end - 1) = settings_.dirichletBcTop[1]; - } + boundary_->setVelocityBoundaryValues(); } void Computation::computeTimeStepWidth(double currentTime) diff --git a/src/computation.h b/src/computation.h index 68901e2c..ade9c19a 100644 --- a/src/computation.h +++ b/src/computation.h @@ -76,6 +76,8 @@ class Computation Settings settings_; std::shared_ptr discretization_; //!< discretization instance std::shared_ptr boundary_; //!< boundary instance + std::shared_ptr mask_; + std::unique_ptr pressureSolver_; //!< pressureSolver instance std::unique_ptr outputWriterParaview_; //!< outputWriterParaview instance std::unique_ptr outputWriterText_; //!< outputWriterText instance diff --git a/src/solver/pressure_solver.cpp b/src/solver/pressure_solver.cpp index 5aa5677d..3f43de47 100644 --- a/src/solver/pressure_solver.cpp +++ b/src/solver/pressure_solver.cpp @@ -46,7 +46,7 @@ double PressureSolver::calculateResiduum() { for (int j = j_beg; j < j_end; j++) { - // if (mask_->isFluid(i, j)) + // if (mask_->isNotFluid(i, j)) // { // continue; // } diff --git a/src/solver/sor.cpp b/src/solver/sor.cpp index 2295a911..9c8126cb 100644 --- a/src/solver/sor.cpp +++ b/src/solver/sor.cpp @@ -23,6 +23,9 @@ void SOR::solve() { for (int j = j_beg; j < j_end; j++) { + // if (boundary_->isBoundary(i, j)){ + // continue; + // } p_x = 1 / dx2 * (discretization_->p(i + 1, j) + discretization_->p(i - 1, j)); p_y = 1 / dy2 * (discretization_->p(i, j + 1) + discretization_->p(i, j - 1)); diff --git a/tests/test_mask.cpp b/tests/test_mask.cpp index 3d0501b2..9d634c2a 100644 --- a/tests/test_mask.cpp +++ b/tests/test_mask.cpp @@ -38,30 +38,36 @@ TEST(Mask, isObstacle){ }; TEST(Mask, updateMaskBoundaries){ - // A A F F F - // A A A F F - // A F A F F - // F F F A F - // F F F F F + // Create simple map + + // O O O O O O O + // O A A A F F O + // O A A A F F O + // O A A A F F O + // O F F F F F O + // O F F F F F O + // O O O O O O O + + // O - Obstacle + // F - Fluid + // A - Air std::array size = {5,5}; Mask mask(size); mask(1,5) = Mask::AIR; mask(2,5) = Mask::AIR; + mask(3,5) = Mask::AIR; mask(1,4) = Mask::AIR; mask(2,4) = Mask::AIR; mask(3,4) = Mask::AIR; mask(1,3) = Mask::AIR; + mask(2,3) = Mask::AIR; mask(3,3) = Mask::AIR; - mask(2,2) = Mask::AIR; - mask.updateMaskBoundaries(); - EXPECT_EQ(mask(1,2), Mask::FLUID_BORDER_TOP); - EXPECT_EQ(mask(2,2), Mask::FLUID); - EXPECT_EQ(mask(2,3), Mask::FLUID_SINGLE_BOTTOM); - EXPECT_EQ(mask(3,2), Mask::FLUID_CORNER_TOP_RIGHT); - EXPECT_EQ(mask(3,3), Mask::FLUID_COLUMN_HORIZONTAL); + EXPECT_EQ(mask(3,2), Mask::FLUID_BORDER_TOP); + EXPECT_EQ(mask(4,2), Mask::FLUID); + EXPECT_EQ(mask(4,3), Mask::FLUID_BORDER_LEFT); mask.printMask(); }; \ No newline at end of file From 37e6a9b26d8a482cdf7f96050f309a5fff0bd7b5 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Mon, 22 Jan 2024 22:27:58 +0100 Subject: [PATCH 08/67] [Domain] update velocities via DOMAIN -- error is low but not 0 to lid-driven sol --- build.sh | 2 +- src/boundary/boundary.cpp | 180 +++++++++++++++++++++----------------- src/boundary/boundary.h | 10 +-- src/boundary/mask.cpp | 14 ++- src/boundary/mask.h | 6 ++ src/computation.cpp | 2 - 6 files changed, 119 insertions(+), 95 deletions(-) diff --git a/build.sh b/build.sh index 3d13f31a..2d134421 100755 --- a/build.sh +++ b/build.sh @@ -35,6 +35,6 @@ cd .. # cd .. # run tests -# build/tests/run_tests +build/tests/run_tests # zip -r submission.zip src/ CMakeLists.txt \ No newline at end of file diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 7745f06f..7cc8d5bb 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -12,9 +12,12 @@ Boundary::Boundary(std::shared_ptr mask, if (mask_->isBorder(i, j)) { boundaryCells_.push_back(i + j * mask_->size()[0]); + std::cout << "Boundary cell: " << i << ", " << j << std::endl; } } } + mask_->printMask(); + } @@ -35,106 +38,125 @@ void Boundary::setPressureBoundaryValues(){ } } + void Boundary::setPressureBoundarySurface(int i, int j){ //TODO: Implement } void Boundary::setPressureBoundaryObstacle(int i, int j){ - // switch((*mask_)(i, j)){ - // case Mask::OBSTACLE_BORDER_TOP: - // discretization_->p(i, j) = discretization_->p(i, j + 1); - // break; - // case Mask::OBSTACLE_BORDER_BOTTOM: - // discretization_->p(i, j) = discretization_->p(i, j - 1); - // break; - // case Mask::OBSTACLE_BORDER_LEFT: - // discretization_->p(i, j) = discretization_->p(i - 1, j); - // break; - // case Mask::OBSTACLE_BORDER_RIGHT: - // discretization_->p(i, j) = discretization_->p(i + 1, j); - // break; - // } - - - - if ((*mask_)(i, j) == Mask::OBSTACLE_BORDER_TOP){ - discretization_->p(i, j) = discretization_->p(i, j + 1); + switch((*mask_)(i, j)){ + case Mask::OBSTACLE_BORDER_LEFT: + discretization_->p(i, j) = discretization_->p(i - 1, j); + break; + case Mask::OBSTACLE_BORDER_TOP: + discretization_->p(i, j) = discretization_->p(i, j + 1); + break; + case Mask::OBSTACLE_BORDER_RIGHT: + discretization_->p(i, j) = discretization_->p(i + 1, j); + break; + case Mask::OBSTACLE_BORDER_BOTTOM: + discretization_->p(i, j) = discretization_->p(i, j - 1); + break; } - else if ((*mask_)(i, j) == Mask::OBSTACLE_BORDER_BOTTOM){ - discretization_->p(i, j) = discretization_->p(i, j - 1); - } - else if ((*mask_)(i, j) == Mask::OBSTACLE_BORDER_LEFT){ - discretization_->p(i, j) = discretization_->p(i - 1, j); - } - else if ((*mask_)(i, j)== Mask::OBSTACLE_BORDER_RIGHT){ - discretization_->p(i, j) = discretization_->p(i + 1, j); - } - // else if (mask_->(i, j) == OBSTACLE_CORNER_BOTTOM_LEFT){ - // discretization_->p(i, j) = 0.5 * (discretization_->p(i, j - 1) + discretization_->p(i - 1, j)); - // } - // else if (mask_->(i, j) == OBSTACLE_CORNER_TOP_LEFT){ - // discretization_->p(i, j) = 0.5 * (discretization_->p(i, j + 1) + discretization_->p(i - 1, j)); - // } - // else if (mask_->(i, j) == OBSTACLE_CORNER_TOP_RIGHT){ - // discretization_->p(i, j) = 0.5 * (discretization_->p(i, j + 1) + discretization_->p(i + 1, j)); - // } - // else if (mask_->(i, j) == OBSTACLE_CORNER_BOTTOM_RIGHT){ - // discretization_->p(i, j) = 0.5 * (discretization_->p(i, j - 1) + discretization_->p(i + 1, j)); - // } - // else{ - // std::cout << "Error: Boundary condition not implemented" << std::endl; - // } + } +void Boundary::setVelocityBoundaryValues(){ + for (int idx : boundaryCells_) + { + int i = idx % mask_->size()[0]; + int j = idx / mask_->size()[0]; + if (mask_->isFluid(i, j)) + { + setVelocityBoundarySurfaceU(i, j); + setVelocityBoundarySurfaceV(i, j); + } + else if (mask_->isObstacle(i, j)) + { + setVelocityBoundaryObstacleU(i, j); + setVelocityBoundaryObstacleV(i, j); + } + } + +} +void Boundary::setVelocityBoundarySurfaceU(int i, int j){ + // TODO: +} -void Boundary::setVelocityBoundaryValues(){ - setUBoundaryValues(); - setVBoundaryValues(); +void Boundary::setVelocityBoundarySurfaceV(int i, int j){ + // TODO: } -void Boundary::setUBoundaryValues(){ - // BV for u - - int i_beg = discretization_->uIBegin(); - int i_end = discretization_->uIEnd(); - int j_beg = discretization_->uJBegin(); - int j_end = discretization_->uJEnd(); - // Vertical - for (int j = j_beg; j < j_end; j++) - { - discretization_->u(i_beg, j) = settings_.dirichletBcLeft[0]; - discretization_->u(i_end - 1, j) = settings_.dirichletBcRight[0]; - } - // Horizontal (leave out corners) - for (int i = i_beg + 1; i < i_end - 1; i++) + +void Boundary::setVelocityBoundaryObstacleU(int i, int j){ + switch ((*mask_)(i, j)) { - discretization_->u(i, j_beg) = 2 * settings_.dirichletBcBottom[0] - discretization_->u(i, j_beg + 1); - discretization_->u(i, j_end - 1) = 2 * settings_.dirichletBcTop[0] - discretization_->u(i, j_end - 2); + case Mask::DOMAIN_LEFT: + discretization_->u(i, j) = settings_.dirichletBcLeft[0]; + break; + case Mask::DOMAIN_TOP: + discretization_->u(i, j) = 2 * settings_.dirichletBcTop[0] - discretization_->u(i, j - 1); + break; + case Mask::DOMAIN_RIGHT: + discretization_->u(i - 1, j) = settings_.dirichletBcRight[0]; + break; + case Mask::DOMAIN_BOTTOM: + discretization_->u(i, j) = 2 * settings_.dirichletBcBottom[0] - discretization_->u(i, j + 1); + break; } + + // int i_beg = discretization_->uIBegin(); + // int i_end = discretization_->uIEnd(); + // int j_beg = discretization_->uJBegin(); + // int j_end = discretization_->uJEnd(); + + // // Vertical + // for (int j = j_beg; j < j_end; j++) + // { + // discretization_->u(i_beg, j) = settings_.dirichletBcLeft[0]; + // discretization_->u(i_end - 1, j) = settings_.dirichletBcRight[0]; + // } + // // Horizontal (leave out corners) + // for (int i = i_beg + 1; i < i_end - 1; i++) + // { + // discretization_->u(i, j_beg) = 2 * settings_.dirichletBcBottom[0] - discretization_->u(i, j_beg + 1); + // discretization_->u(i, j_end - 1) = 2 * settings_.dirichletBcTop[0] - discretization_->u(i, j_end - 2); + // } + } -void Boundary::setVBoundaryValues(){ - // BV for v - int i_beg = discretization_->vIBegin(); - int i_end = discretization_->vIEnd(); - int j_beg = discretization_->vJBegin(); - int j_end = discretization_->vJEnd(); +void Boundary::setVelocityBoundaryObstacleV(int i, int j){ - // Vertical - for (int j = j_beg; j < j_end; j++) - { - discretization_->v(i_beg, j) = 2 * settings_.dirichletBcLeft[1] - discretization_->v(i_beg + 1, j); - discretization_->v(i_end - 1, j) = 2 * settings_.dirichletBcRight[1] - discretization_->v(i_end - 2, j); - } - // Horizontal (leave out corners) - for (int i = i_beg + 1; i < i_end - 1; i++) + switch ((*mask_)(i, j)) { - discretization_->v(i, j_beg) = settings_.dirichletBcBottom[1]; - discretization_->v(i, j_end - 1) = settings_.dirichletBcTop[1]; + case Mask::DOMAIN_LEFT: + discretization_->v(i, j) = 2 * settings_.dirichletBcLeft[1] - discretization_->v(i + 1, j); + break; + case Mask::DOMAIN_TOP: + discretization_->v(i, j - 1) = settings_.dirichletBcTop[1]; + break; + case Mask::DOMAIN_RIGHT: + discretization_->v(i, j) = 2 * settings_.dirichletBcRight[1] - discretization_->v(i - 1, j); + break; + case Mask::DOMAIN_BOTTOM: + discretization_->v(i, j) = settings_.dirichletBcBottom[1]; + break; } + // // Vertical + // for (int j = j_beg; j < j_end; j++) + // { + // discretization_->v(i_beg, j) = 2 * settings_.dirichletBcLeft[1] - discretization_->v(i_beg + 1, j); + // discretization_->v(i_end - 1, j) = 2 * settings_.dirichletBcRight[1] - discretization_->v(i_end - 2, j); + // } + // // Horizontal (leave out corners) + // for (int i = i_beg + 1; i < i_end - 1; i++) + // { + // discretization_->v(i, j_beg) = settings_.dirichletBcBottom[1]; + // discretization_->v(i, j_end - 1) = settings_.dirichletBcTop[1]; + // } } diff --git a/src/boundary/boundary.h b/src/boundary/boundary.h index 35a41a10..72634972 100644 --- a/src/boundary/boundary.h +++ b/src/boundary/boundary.h @@ -14,14 +14,14 @@ class Boundary void setVelocityBoundaryValues(); private: - void setPressureBoundarySurface(int i, int j); void setPressureBoundaryObstacle(int i, int j); + void setPressureBoundarySurface(int i, int j); - void setVelocityBoundarySurface(int i, int j); - void setVelocityBoundaryObstacle(int i, int j); + void setVelocityBoundaryObstacleU(int i, int j); + void setVelocityBoundaryObstacleV(int i, int j); - void setUBoundaryValues(); - void setVBoundaryValues(); + void setVelocityBoundarySurfaceU(int i, int j); + void setVelocityBoundarySurfaceV(int i, int j); std::shared_ptr discretization_; std::shared_ptr mask_; diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index be9b6258..a5982d31 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -8,13 +8,13 @@ Mask::Mask(std::array size) : size_({size[0]+2, size[1]+2}) // Set domain boundaries to obstacle for (int i = 0; i < size_[0]; i++) { - data_[i] = OBSTACLE_BORDER_TOP; // is bottom therefore the top of an obstacle - data_[i + (size_[1] - 1) * size_[0]] = OBSTACLE_BORDER_BOTTOM; + data_[i] = DOMAIN_BOTTOM; + data_[i + (size_[1] - 1) * size_[0]] = DOMAIN_TOP; } for (int j = 0; j < size_[1]; j++) { - data_[j * size_[0]] = OBSTACLE_BORDER_RIGHT; - data_[(size_[0] - 1) + j * size_[0]] = OBSTACLE_BORDER_LEFT; + data_[j * size_[0]] = DOMAIN_LEFT; + data_[(size_[0] - 1) + j * size_[0]] = DOMAIN_RIGHT; } } @@ -74,9 +74,7 @@ bool Mask::isObstacle(int i, int j) const bool Mask::isFluidBorder(int i, int j) const { - int val = data_[i + j * size_[0]]; - return (val >= FLUID_BORDER_LEFT && - val <= FLUID_TYPE); + return data_[i + j * size_[0]] < FLUID; } bool Mask::isBorder(int i, int j) const @@ -139,7 +137,7 @@ void Mask::makeRectangularObstacle(std::array obstaclePosition_ , std void Mask::printMask() const{ for (int j = size_[1] - 1; j >= 0; j--){ for (int i = 0; i < size_[0]; i++){ - std::cout << data_[i + j * size_[0]] << " "; + std::cout << std::setw(3) << std::setfill('0') << data_[i + j * size_[0]] << " "; } std::cout << std::endl; } diff --git a/src/boundary/mask.h b/src/boundary/mask.h index d04b2e5e..556da28f 100644 --- a/src/boundary/mask.h +++ b/src/boundary/mask.h @@ -6,6 +6,7 @@ #include #include +#include #include @@ -59,6 +60,11 @@ enum CellType{ OBSTACLE_CORNER_TOP_LEFT = 121, OBSTACLE_CORNER_TOP_RIGHT = 122, OBSTACLE_CORNER_BOTTOM_RIGHT = 123, + + DOMAIN_LEFT = 130, + DOMAIN_TOP = 131, + DOMAIN_RIGHT = 132, + DOMAIN_BOTTOM = 133, }; diff --git a/src/computation.cpp b/src/computation.cpp index 3c805d2a..8e7e0f61 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -49,8 +49,6 @@ void Computation::initialize(int argc, char *argv[]) boundary_); } - std::cout << "testfasldfj" << std::endl; - boundary_->setVelocityBoundaryValues(); outputWriterParaview_ = std::make_unique(discretization_); outputWriterText_ = std::make_unique(discretization_); From 03f2e86e0de512176807f15372d5e80cdbc7a7c0 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Tue, 23 Jan 2024 09:24:53 +0100 Subject: [PATCH 09/67] [Bug Fixed] solves lid-driven cavity with no error --- src/boundary/boundary.cpp | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 7cc8d5bb..d9807ba1 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -38,25 +38,36 @@ void Boundary::setPressureBoundaryValues(){ } } - +// its important that first the velocities are updated void Boundary::setPressureBoundarySurface(int i, int j){ - //TODO: Implement + // switch((*mask_)(i, j)){ + // case Mask::FLUID_BORDER_LEFT: + // break; + // case Mask::FLUID_BORDER_TOP: + // break; + // case Mask::FLUID_BORDER_RIGHT: + // discretization_->p(i, j) = 2/settings_.re * ( discretization_->u(i, j) - discretization_->u(i - 1, j))/discretization_->dx(); + // break; + // case Mask::FLUID_BORDER_BOTTOM: + // discretization_->p(i, j) = 2/settings_.re * ( discretization_->v(i, j) - discretization_->v(i, j - 1))/discretization_->dy(); + // break; + // } } void Boundary::setPressureBoundaryObstacle(int i, int j){ switch((*mask_)(i, j)){ - case Mask::OBSTACLE_BORDER_LEFT: - discretization_->p(i, j) = discretization_->p(i - 1, j); - break; - case Mask::OBSTACLE_BORDER_TOP: - discretization_->p(i, j) = discretization_->p(i, j + 1); - break; - case Mask::OBSTACLE_BORDER_RIGHT: + case Mask::DOMAIN_LEFT: discretization_->p(i, j) = discretization_->p(i + 1, j); break; - case Mask::OBSTACLE_BORDER_BOTTOM: + case Mask::DOMAIN_TOP: discretization_->p(i, j) = discretization_->p(i, j - 1); break; + case Mask::DOMAIN_RIGHT: + discretization_->p(i, j) = discretization_->p(i - 1, j); + break; + case Mask::DOMAIN_BOTTOM: + discretization_->p(i, j) = discretization_->p(i, j + 1); + break; } } @@ -101,7 +112,7 @@ void Boundary::setVelocityBoundaryObstacleU(int i, int j){ discretization_->u(i, j) = 2 * settings_.dirichletBcTop[0] - discretization_->u(i, j - 1); break; case Mask::DOMAIN_RIGHT: - discretization_->u(i - 1, j) = settings_.dirichletBcRight[0]; + discretization_->u(i - 1, j) = settings_.dirichletBcRight[0]; // index shift for u in x direction break; case Mask::DOMAIN_BOTTOM: discretization_->u(i, j) = 2 * settings_.dirichletBcBottom[0] - discretization_->u(i, j + 1); @@ -136,7 +147,7 @@ void Boundary::setVelocityBoundaryObstacleV(int i, int j){ discretization_->v(i, j) = 2 * settings_.dirichletBcLeft[1] - discretization_->v(i + 1, j); break; case Mask::DOMAIN_TOP: - discretization_->v(i, j - 1) = settings_.dirichletBcTop[1]; + discretization_->v(i, j - 1) = settings_.dirichletBcTop[1]; // index shift for v in y direction break; case Mask::DOMAIN_RIGHT: discretization_->v(i, j) = 2 * settings_.dirichletBcRight[1] - discretization_->v(i - 1, j); From 30d30723189f0101645ab23eb7f8e11194fe248a Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Tue, 23 Jan 2024 22:53:32 +0100 Subject: [PATCH 10/67] [Tests] added framework and first test ... TODO: MORE --- src/boundary/boundary.cpp | 10 +++++--- src/boundary/boundary.h | 9 ++++--- src/boundary/mask.cpp | 16 ++++++++++++ src/boundary/mask.h | 13 ++++++++-- src/surface/fluid_trace.cpp | 30 ---------------------- src/surface/fluid_tracer.cpp | 49 ++++++++++++++++++++++++++++++++++++ src/surface/fluid_tracer.h | 19 +++++++++++--- tests/CMakeLists.txt | 8 ++++-- tests/test_boundary.cpp | 14 +++++++++++ tests/test_fluid_tracer.cpp | 13 ++++++++++ 10 files changed, 137 insertions(+), 44 deletions(-) delete mode 100644 src/surface/fluid_trace.cpp create mode 100644 src/surface/fluid_tracer.cpp create mode 100644 tests/test_boundary.cpp create mode 100644 tests/test_fluid_tracer.cpp diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index d9807ba1..553da10b 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -12,13 +12,16 @@ Boundary::Boundary(std::shared_ptr mask, if (mask_->isBorder(i, j)) { boundaryCells_.push_back(i + j * mask_->size()[0]); - std::cout << "Boundary cell: " << i << ", " << j << std::endl; } } } - mask_->printMask(); - + #ifndef NDEBUG + mask_->printMask(); + #endif +} +int Boundary::getNumberOfBoundaryCells() const { + return boundaryCells_.size(); } void Boundary::setPressureBoundaryValues(){ @@ -69,7 +72,6 @@ void Boundary::setPressureBoundaryObstacle(int i, int j){ discretization_->p(i, j) = discretization_->p(i, j + 1); break; } - } void Boundary::setVelocityBoundaryValues(){ diff --git a/src/boundary/boundary.h b/src/boundary/boundary.h index 72634972..0e088bad 100644 --- a/src/boundary/boundary.h +++ b/src/boundary/boundary.h @@ -1,8 +1,8 @@ #pragma once -#include "boundary/mask.h" -#include "discretization/discretization.h" -#include "settings_parser/settings.h" +#include "mask.h" +#include "../discretization/discretization.h" +#include "../settings_parser/settings.h" #include #include @@ -13,10 +13,13 @@ class Boundary void setPressureBoundaryValues(); void setVelocityBoundaryValues(); + int getNumberOfBoundaryCells() const; + private: void setPressureBoundaryObstacle(int i, int j); void setPressureBoundarySurface(int i, int j); + // Helpers to set Boundary values void setVelocityBoundaryObstacleU(int i, int j); void setVelocityBoundaryObstacleV(int i, int j); diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index a5982d31..827f7a70 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -97,6 +97,22 @@ bool Mask::isNotAir(int i, int j) const } } +int Mask::getNumberOfFluidCells() const +{ + int numFluidCells = 0; + for (int i = 0; i < size_[0]; i++) + { + for (int j = 0; j < size_[1]; j++) + { + if (isFluid(i, j)) + { + numFluidCells++; + } + } + } + return numFluidCells; +} + // ************************ // P R I M I T I V E S // ************************ diff --git a/src/boundary/mask.h b/src/boundary/mask.h index 556da28f..7a61eba1 100644 --- a/src/boundary/mask.h +++ b/src/boundary/mask.h @@ -137,7 +137,7 @@ enum CellType{ /** - * @brief Returns a boolean indicating whether the cell at (i,j) is a air cell or not + * @brief Cell at (i,j) is a air cell or not * * @param i index in x direction * @param j index in y direction @@ -147,7 +147,7 @@ enum CellType{ bool isAir(int i, int j) const; /** - * @brief Returns a boolean indicating whether the cell at (i,j) is not a air cell or not + * @brief Cell at (i,j) is not a air cell or not * * @param i index in x direction * @param j index in y direction @@ -156,6 +156,15 @@ enum CellType{ */ bool isNotAir(int i, int j) const; + /** + * @brief number of fluid cells + * + * not efficient but is only used once in the creation of the fluid tracer + * + */ + int getNumberOfFluidCells() const; + + // ****************************** // P R I M I T I V E S diff --git a/src/surface/fluid_trace.cpp b/src/surface/fluid_trace.cpp deleted file mode 100644 index 89efdfb6..00000000 --- a/src/surface/fluid_trace.cpp +++ /dev/null @@ -1,30 +0,0 @@ -#include "fluid_tracer.h" - -FluidTracer::FluidTracer(int numParticlesperCell, std::shared_ptr discretization) { - numParticles_ = numParticlesperCell; - discretization_ = discretization; - - int n_x = discretization_->nCells()[0]; - int n_y = discretization_->nCells()[1]; - std::array physicalSize_ = {discretization_->meshWidth()[0]*n_x, - discretization_->meshWidth()[1]*n_y}; - int numParticles_ = numParticlesperCell * discretization_->nCells()[0] * discretization_->nCells()[1]; - - - // Resize for speed up - x_.resize(numParticles_); - y_.resize(numParticles_); - - - // Initialize particles - // TODO: Obsticle - - for (int j = 0; j < n_y; j++) { - for (int i = 0; i < n_x; i++) { - // Invariant: distance to border most be 1/2 meshWidth such that no discretization artefacts occur - for (int k = 0; k < numParticlesperCell; k++) { - x_[i*numParticlesperCell + j*numParticlesperCell + k] = 2; - } - } - } -} \ No newline at end of file diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp new file mode 100644 index 00000000..36ff382d --- /dev/null +++ b/src/surface/fluid_tracer.cpp @@ -0,0 +1,49 @@ +#include "fluid_tracer.h" + +FluidTracer::FluidTracer(int numParticlesPerCell, + std::shared_ptr discretization, + std::shared_ptr mask) { + + discretization_ = discretization; + mask_ = mask; + + + seedRelationDyDx_ = discretization_->dy()/ discretization_->dx(); + n_x = static_cast(std::ceil(std::sqrt(numParticlesPerCell/seedRelationDyDx_))); + n_y = static_cast(std::ceil(n_x * seedRelationDyDx_)); + numParticlesPerCell_ = n_x * n_y; + numParticles_ = numParticlesPerCell_ * mask_->getNumberOfFluidCells(); + // std::cout << "Actual particles per cell: " << numParticlesPerCell_ << std::endl; + // std::cout << "Number of particles: " << numParticlesPerCell << std::endl; + // std::cout << "nx: " << n_x << std::endl; + // std::cout << "ny: " << n_y << std::endl; + // std::cout << "seedRelationDyDx_: " << seedRelationDyDx_ << std::endl; + + // Resize for speed up + x_.resize(numParticles_); + y_.resize(numParticles_); + + + for (int i = 0; i < discretization->nCells()[0]; i++) { + for (int j = 0; j < discretization->nCells()[1]; j++) { + if (mask_->isFluid(i, j)) { + initializeFluidCell(i, j, numParticlesPerCell); + } + } + } +} + +void FluidTracer::initializeFluidCell(int i, int j, int numParticlesPerCell) { + int idx = 0; + for (int k = 0; k < n_x; k++) { + for (int l = 0; l < n_y; l++) { + x_[idx] = (k + 0.5) * discretization_->dx() / n_x; + y_[idx] = (l + 0.5) * discretization_->dy() / n_y; + idx++; + } + } +} + +int FluidTracer::getNumberOfParticles() const { + return numParticles_; +} \ No newline at end of file diff --git a/src/surface/fluid_tracer.h b/src/surface/fluid_tracer.h index fa897a23..53bdde2e 100644 --- a/src/surface/fluid_tracer.h +++ b/src/surface/fluid_tracer.h @@ -3,23 +3,36 @@ #include #include -#include "discretization/discretization.h" +#include "../discretization/discretization.h" +#include "../boundary/boundary.h" class FluidTracer { public: - FluidTracer(int numParticlesperCell, std::shared_ptr discretization); + FluidTracer(int numParticlesperCell, + std::shared_ptr discretization, + std::shared_ptr mask); void updatePosition(double dt); void updateMask(); + int getNumberOfParticles() const; + private: + + void initializeFluidCell(int i, int j, int numParticlesPerCell); + int numParticles_; - int numParticlesperCell_; + int numParticlesPerCell_; // + double seedRelationDyDx_; + int n_x; + int n_y; + std::shared_ptr discretization_; + std::shared_ptr mask_; std::vector x_; std::vector y_; }; \ No newline at end of file diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a05e94b2..ca09ff51 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -12,17 +12,21 @@ include_directories(${GTEST_INCLUDE_DIRS}) add_executable(run_tests test_array2D.cpp test_field_variable.cpp - test_mask.cpp test_staggered_grid.cpp test_donor_cell.cpp test_central_differences.cpp + test_mask.cpp + test_boundary.cpp + test_fluid_tracer.cpp ../src/storage/array2D.cpp ../src/storage/field_variable.cpp - ../src/boundary/mask.cpp ../src/discretization/staggered_grid.cpp ../src/discretization/discretization.cpp ../src/discretization/donor_cell.cpp ../src/discretization/central_differences.cpp + ../src/boundary/mask.cpp + ../src/boundary/boundary.cpp + ../src/surface/fluid_tracer.cpp ) target_link_libraries(run_tests gtest gtest_main) diff --git a/tests/test_boundary.cpp b/tests/test_boundary.cpp new file mode 100644 index 00000000..b0bb90b7 --- /dev/null +++ b/tests/test_boundary.cpp @@ -0,0 +1,14 @@ +#include +#include "../src/boundary/boundary.h" +#include "../src/discretization/central_differences.h" + +TEST(Boundary, BoundaryCellsWithoutObstacle) { + std::array n_cells = {4,3}; + std::array meshWidth = {1.0, 1.0}; + std::shared_ptr mask = std::make_shared(n_cells); + std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); + Settings settings; + Boundary boundary(mask, discretization, settings); + + EXPECT_EQ(boundary.getNumberOfBoundaryCells(), 18); +}; diff --git a/tests/test_fluid_tracer.cpp b/tests/test_fluid_tracer.cpp new file mode 100644 index 00000000..984fee79 --- /dev/null +++ b/tests/test_fluid_tracer.cpp @@ -0,0 +1,13 @@ +#include +#include "../src/surface/fluid_tracer.h" +#include "../src/discretization/central_differences.h" + +TEST(FluidTracer, InitializeSingleCell){ + std::array n_cells = {1, 1}; + std::array meshWidth = {1.0, 1.0}; + std::shared_ptr mask = std::make_shared(n_cells); + std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); + int numParticlesPerCell = 9; + FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); + EXPECT_GE(fluid_tracer.getNumberOfParticles(), numParticlesPerCell); +}; From 9f0a7ec2decd903c7daa25519f9d4a4ca4612267 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Wed, 24 Jan 2024 00:22:48 +0100 Subject: [PATCH 11/67] [FluidTracker] Fluid Tracking -> needs more testing --- build.sh | 2 +- src/surface/fluid_tracer.cpp | 97 ++++++++++++++++++++++++++++++++++++ src/surface/fluid_tracer.h | 5 ++ tests/test_fluid_tracer.cpp | 48 ++++++++++++++++++ tests/test_mask.cpp | 2 +- 5 files changed, 152 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index 2d134421..d9882454 100755 --- a/build.sh +++ b/build.sh @@ -16,7 +16,7 @@ else fi make install -j4 -./numsim ../input/settings.txt +# ./numsim ../input/settings.txt diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index 36ff382d..05c63442 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -46,4 +46,101 @@ void FluidTracer::initializeFluidCell(int i, int j, int numParticlesPerCell) { int FluidTracer::getNumberOfParticles() const { return numParticles_; +} + +void FluidTracer::updatePosition(double dt) { + for (int i = 0; i < numParticles_; i++) { + double vel_x = discretization_->u().interpolateAt(x_[i], y_[i]); + double vel_y = discretization_->v().interpolateAt(x_[i], y_[i]); + double step_x = dt * vel_x; + double step_y = dt * vel_y; + + // Check if collision with obstacle or boundary + // This is slow (because of CFL condition only cells next to boundary could do this check) + int idx_x = val2CellX(x_[i] + step_x); + int idx_y = val2CellY(y_[i] + step_y); + if (mask_->isObstacle(idx_x, idx_y)) { + // collision on x or y axis + double leftBorder = discretization_->dx()*(idx_x - 1); // -1 because idx starts at 0 with outer cell -dx + double topBorder = discretization_->dy()*(idx_y); + double rightBorder = discretization_->dx()*(idx_x); + double lowerBorder = discretization_->dy()*(idx_y - 1); + + // four cases for collision + if (step_x >= 0 && step_y >= 0) { + // need to check for collision with left and bottom border + double dist_x = x_[i] - leftBorder; + double dt_x = dist_x/vel_x; + double dist_y = y_[i] - lowerBorder; + double dt_y = dist_y/vel_y; + if (dt_x < dt_y) { + // collision with left border + // first dt_x * vel_x then - (dt - dt_x) * vel_x + step_x = (2*dt_x - dt) * vel_x; + } else { + // collision with bottom border + step_y = (2*dt_y - dt) * vel_y; + } + } + else if (step_x >= 0 && step_y < 0) { + // need to check for collision with left and top border + double dist_x = x_[i] - leftBorder; + double dt_x = dist_x/vel_x; + double dist_y = topBorder - y_[i]; // double negative + double dt_y = dist_y/vel_y; + if (dt_x < dt_y) { + // collision with left border + // first dt_x * vel_x then - (dt - dt_x) * vel_x + step_x = (2*dt_x - dt) * vel_x; + } else { + // collision with top border + step_y = (2*dt_y - dt) * vel_y; + } + } + else if (step_x < 0 && step_y >= 0) { + // need to check for collision with right and bottom border + double dist_x = rightBorder - x_[i]; + double dt_x = dist_x/vel_x; + double dist_y = y_[i] - lowerBorder; + double dt_y = dist_y/vel_y; + if (dt_x < dt_y) { + // collision with right border + step_x = (2*dt_x - dt) * vel_x; + } else { + // collision with bottom border + step_y = (2*dt_y - dt) * vel_y; + } + } + else if (step_x < 0 && step_y < 0) { + // need to check for collision with right and top border + double dist_x = rightBorder - x_[i]; + double dt_x = dist_x/vel_x; + double dist_y = topBorder - y_[i]; + double dt_y = dist_y/vel_y; + if (dt_x < dt_y) { + // collision with right border + // first dt_x * vel_x then - (dt - dt_x) * vel_x + step_x = (2*dt_x - dt) * vel_x; + } else { + // collision with top border + step_y = (2*dt_y - dt) * vel_y; + } + } + } + + x_[i] += step_x; + y_[i] += step_y; + } +} + +int FluidTracer::val2CellX(double xVal){ + return static_cast(std::floor(xVal/discretization_->dx())) + 1; +} + +int FluidTracer::val2CellY(double yVal){ + return static_cast(std::floor(yVal/discretization_->dy())) + 1; +} + +std::array FluidTracer::getParticlePosition(int i) const { + return {x_[i], y_[i]}; } \ No newline at end of file diff --git a/src/surface/fluid_tracer.h b/src/surface/fluid_tracer.h index 53bdde2e..126b310b 100644 --- a/src/surface/fluid_tracer.h +++ b/src/surface/fluid_tracer.h @@ -19,12 +19,17 @@ class FluidTracer { int getNumberOfParticles() const; + int val2CellX(double xVal); + int val2CellY(double yVal); + + std::array getParticlePosition(int i) const; private: void initializeFluidCell(int i, int j, int numParticlesPerCell); + int numParticles_; int numParticlesPerCell_; // double seedRelationDyDx_; diff --git a/tests/test_fluid_tracer.cpp b/tests/test_fluid_tracer.cpp index 984fee79..3a63d9d9 100644 --- a/tests/test_fluid_tracer.cpp +++ b/tests/test_fluid_tracer.cpp @@ -10,4 +10,52 @@ TEST(FluidTracer, InitializeSingleCell){ int numParticlesPerCell = 9; FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); EXPECT_GE(fluid_tracer.getNumberOfParticles(), numParticlesPerCell); + + int numParticlesPerCell2 = 100; + FluidTracer fluid_tracer2(numParticlesPerCell2, discretization, mask); + EXPECT_GE(fluid_tracer2.getNumberOfParticles(), numParticlesPerCell2); + + int numParticlesPerCell3 = 7; + FluidTracer fluid_tracer3(numParticlesPerCell3, discretization, mask); + EXPECT_GE(fluid_tracer3.getNumberOfParticles(), numParticlesPerCell3); }; + + +TEST(FluidTracer, val2CellXAndY){ + std::array n_cells = {1, 1}; + std::array meshWidth = {1.0, 1.0}; + std::shared_ptr mask = std::make_shared(n_cells); + std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); + int numParticlesPerCell = 9; + FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); + EXPECT_EQ(fluid_tracer.val2CellX(0.5), 1); + EXPECT_EQ(fluid_tracer.val2CellX(0.0), 1); + EXPECT_EQ(fluid_tracer.val2CellX(-0.5), 0); + EXPECT_EQ(fluid_tracer.val2CellX(1.5), 2); + + EXPECT_EQ(fluid_tracer.val2CellY(0.5), 1); + EXPECT_EQ(fluid_tracer.val2CellY(0.0), 1); + EXPECT_EQ(fluid_tracer.val2CellY(-0.5), 0); + EXPECT_EQ(fluid_tracer.val2CellY(1.5), 2); +} + +TEST(FluidTracer, updatePositionWithoutBorderCollision){ + std::array n_cells = {1, 1}; + std::array meshWidth = {1.0, 1.0}; + std::shared_ptr mask = std::make_shared(n_cells); + std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); + double vel_x = 0.01; + discretization->u(0,0) = vel_x; + discretization->u(1,0) = vel_x; + discretization->u(0,1) = vel_x; + discretization->u(1,1) = vel_x; + discretization->u(0,2) = vel_x; + discretization->u(1,2) = vel_x; + int numParticlesPerCell = 1; + FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); + EXPECT_EQ(fluid_tracer.getNumberOfParticles(), 1); + double old_pos_x = fluid_tracer.getParticlePosition(0)[0]; + double dt = 0.1; + fluid_tracer.updatePosition(dt); + EXPECT_EQ(fluid_tracer.getParticlePosition(0)[0], old_pos_x + dt * vel_x); +} \ No newline at end of file diff --git a/tests/test_mask.cpp b/tests/test_mask.cpp index 9d634c2a..09bbb45b 100644 --- a/tests/test_mask.cpp +++ b/tests/test_mask.cpp @@ -11,7 +11,7 @@ TEST(Mask, ConstructorInitAllInnerCellsAsFluid){ } }; -TEST(Mask, SetAndGet){ +TEST(Mask, SetOriginToAir){ std::array size = {3,3}; Mask mask(size); mask(0,0) = Mask::AIR; From 80d72ef899e33fade7fe21dfdab1e06b8b921212 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Wed, 24 Jan 2024 08:50:51 +0100 Subject: [PATCH 12/67] [Init Distribution of Fluid Trace Cells] --- src/surface/fluid_tracer.cpp | 18 ++++---- src/surface/fluid_tracer.h | 31 ++++++++++++- tests/test_fluid_tracer.cpp | 86 +++++++++++++++++++++++++++++++++--- 3 files changed, 119 insertions(+), 16 deletions(-) diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index 05c63442..e81add51 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -22,10 +22,9 @@ FluidTracer::FluidTracer(int numParticlesPerCell, // Resize for speed up x_.resize(numParticles_); y_.resize(numParticles_); - - - for (int i = 0; i < discretization->nCells()[0]; i++) { - for (int j = 0; j < discretization->nCells()[1]; j++) { + ; + for (int i = 1; i < mask_->size()[0] - 1; i++) { + for (int j = 1; j < mask_->size()[1] - 1; j++) { if (mask_->isFluid(i, j)) { initializeFluidCell(i, j, numParticlesPerCell); } @@ -35,10 +34,13 @@ FluidTracer::FluidTracer(int numParticlesPerCell, void FluidTracer::initializeFluidCell(int i, int j, int numParticlesPerCell) { int idx = 0; - for (int k = 0; k < n_x; k++) { - for (int l = 0; l < n_y; l++) { - x_[idx] = (k + 0.5) * discretization_->dx() / n_x; - y_[idx] = (l + 0.5) * discretization_->dy() / n_y; + double cell_x = discretization_->dx() * (i - 1); + double cell_y = discretization_->dy() * (j - 1); + // fills in from bottom left to top right + for (int l = 0; l < n_y; l++) { + for (int k = 0; k < n_x; k++) { + x_[idx] = cell_x + (0.5 + (k * discretization_->dx())) / n_x; + y_[idx] = cell_y + (0.5 + (l * discretization_->dy())) / n_y; idx++; } } diff --git a/src/surface/fluid_tracer.h b/src/surface/fluid_tracer.h index 126b310b..80e4385e 100644 --- a/src/surface/fluid_tracer.h +++ b/src/surface/fluid_tracer.h @@ -13,17 +13,44 @@ class FluidTracer { std::shared_ptr discretization, std::shared_ptr mask); + /** + * @brief Update the position of the particles according to the velocity field + * + * Uses the ptr to the discretization to get the velocity field $u$ and $v$ + * + * Checks for collision with border or obstacle and reflects the particle at this position + * + * @param dt + */ void updatePosition(double dt); + /** + * @brief Update after the particles move there are new Air or Fluid cells + * + * @requires that afterwards the mask borders are updated + * + */ void updateMask(); + + /** + * @brief Get the Number Of Particles object + * + * @return int + */ int getNumberOfParticles() const; - int val2CellX(double xVal); - int val2CellY(double yVal); + /** + * @brief Get the Particle Position, index starts at 0 + * + * @param i + * @return std::array + */ std::array getParticlePosition(int i) const; + int val2CellX(double xVal); + int val2CellY(double yVal); private: diff --git a/tests/test_fluid_tracer.cpp b/tests/test_fluid_tracer.cpp index 3a63d9d9..e7bf1907 100644 --- a/tests/test_fluid_tracer.cpp +++ b/tests/test_fluid_tracer.cpp @@ -2,24 +2,75 @@ #include "../src/surface/fluid_tracer.h" #include "../src/discretization/central_differences.h" -TEST(FluidTracer, InitializeSingleCell){ +TEST(FluidTracer, NParticlesSingleCell){ + /* + Test for a single cell (with 8 boundary cells) how many particles are placed + */ std::array n_cells = {1, 1}; std::array meshWidth = {1.0, 1.0}; std::shared_ptr mask = std::make_shared(n_cells); std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); - int numParticlesPerCell = 9; + int numParticlesPerCell = 1; FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); EXPECT_GE(fluid_tracer.getNumberOfParticles(), numParticlesPerCell); - int numParticlesPerCell2 = 100; + int numParticlesPerCell2 = 9; FluidTracer fluid_tracer2(numParticlesPerCell2, discretization, mask); EXPECT_GE(fluid_tracer2.getNumberOfParticles(), numParticlesPerCell2); - int numParticlesPerCell3 = 7; + int numParticlesPerCell3 = 17; FluidTracer fluid_tracer3(numParticlesPerCell3, discretization, mask); EXPECT_GE(fluid_tracer3.getNumberOfParticles(), numParticlesPerCell3); + + int numParticlesPerCell4 = 100; + FluidTracer fluid_tracer4(numParticlesPerCell4, discretization, mask); + EXPECT_GE(fluid_tracer4.getNumberOfParticles(), numParticlesPerCell4); + EXPECT_GE(fluid_tracer4.getNumberOfParticles(), fluid_tracer3.getNumberOfParticles()); + EXPECT_LE(fluid_tracer4.getNumberOfParticles(), 2 * numParticlesPerCell4); }; +TEST(FluidTracer, DistributionSingleCell){ + /* + Test for a single cell (with 8 boundary cells) how many particles are placed + */ + std::array n_cells = {1, 1}; + std::array meshWidth = {1.0, 1.0}; + std::shared_ptr mask = std::make_shared(n_cells); + std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); + int numParticlesPerCell = 1; + FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); + EXPECT_NEAR(fluid_tracer.getParticlePosition(0)[0], 0.5, 0.001); + EXPECT_NEAR(fluid_tracer.getParticlePosition(0)[1], 0.5, 0.001); + + int numParticlesPerCell2 = 9; + FluidTracer fluid_tracer2(numParticlesPerCell2, discretization, mask); + EXPECT_NEAR(fluid_tracer2.getParticlePosition(0)[0], 0.166667, 0.001); + EXPECT_NEAR(fluid_tracer2.getParticlePosition(0)[1], 0.166667, 0.001); + EXPECT_NEAR(fluid_tracer2.getParticlePosition(1)[0], 0.5, 0.001); + EXPECT_NEAR(fluid_tracer2.getParticlePosition(1)[1], 0.166667, 0.001); + EXPECT_NEAR(fluid_tracer2.getParticlePosition(4)[0], 0.5, 0.001); + EXPECT_NEAR(fluid_tracer2.getParticlePosition(4)[1], 0.5, 0.001); + EXPECT_NEAR(fluid_tracer2.getParticlePosition(8)[0], 0.833333, 0.001); + EXPECT_NEAR(fluid_tracer2.getParticlePosition(8)[1], 0.833333, 0.001); + + int numParticlesPerCell3 = 17; + FluidTracer fluid_tracer3(numParticlesPerCell3, discretization, mask); + EXPECT_NEAR(fluid_tracer3.getParticlePosition(0)[0], 0.125, 0.1); + EXPECT_NEAR(fluid_tracer3.getParticlePosition(0)[1], 0.1, 0.1); + EXPECT_NEAR(fluid_tracer3.getParticlePosition(1)[0], 0.375, 0.1); + EXPECT_NEAR(fluid_tracer3.getParticlePosition(1)[1], 0.1, 0.1); + +} + +TEST(FluidTracer, GridSingleCellUnevenDxDy){ + std::array n_cells = {1, 1}; + std::array meshWidth1 = {1.0, 0.5}; + std::shared_ptr mask = std::make_shared(n_cells); + std::shared_ptr discretization = std::make_shared(n_cells, meshWidth1); + int numParticlesPerCell = 16; + FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); +} + TEST(FluidTracer, val2CellXAndY){ std::array n_cells = {1, 1}; @@ -39,7 +90,7 @@ TEST(FluidTracer, val2CellXAndY){ EXPECT_EQ(fluid_tracer.val2CellY(1.5), 2); } -TEST(FluidTracer, updatePositionWithoutBorderCollision){ +TEST(FluidTracer, updatePositionFluidOnly){ std::array n_cells = {1, 1}; std::array meshWidth = {1.0, 1.0}; std::shared_ptr mask = std::make_shared(n_cells); @@ -58,4 +109,27 @@ TEST(FluidTracer, updatePositionWithoutBorderCollision){ double dt = 0.1; fluid_tracer.updatePosition(dt); EXPECT_EQ(fluid_tracer.getParticlePosition(0)[0], old_pos_x + dt * vel_x); -} \ No newline at end of file +} + + +// TEST(FluidTracer, updatePositionWithBorderCollision){ +// std::array n_cells = {1, 1}; +// std::array meshWidth = {1.0, 1.0}; +// std::shared_ptr mask = std::make_shared(n_cells); +// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); +// double vel_x = 1.5; +// discretization->u(0,0) = vel_x; +// discretization->u(1,0) = vel_x; +// discretization->u(0,1) = vel_x; +// discretization->u(1,1) = vel_x; +// discretization->u(0,2) = vel_x; +// discretization->u(1,2) = vel_x; +// int numParticlesPerCell = 1; +// FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); +// EXPECT_EQ(fluid_tracer.getNumberOfParticles(), 1); +// double old_pos_x = fluid_tracer.getParticlePosition(0)[0]; +// double dt = 1; +// fluid_tracer.updatePosition(dt); +// EXPECT_EQ(fluid_tracer.getParticlePosition(0)[0], 0.5); +// } + From bfad09313afe3bc4da4b8ef2cc492e666d950a37 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Wed, 24 Jan 2024 15:11:49 +0100 Subject: [PATCH 13/67] Make Rect --- src/boundary/mask.cpp | 23 +++++++++++++++++------ tests/test_mask.cpp | 41 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 7 deletions(-) diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index 827f7a70..8e8620c0 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -120,10 +120,14 @@ int Mask::getNumberOfFluidCells() const void Mask::makeRectangularObstacle(std::array obstaclePosition_ , std::array obstacleSize_){ // only works for global size {1.0; 1.0} - int i_beg = static_cast(std::floor(obstaclePosition_[0] * size_[0])); - int i_end = static_cast(std::ceil(obstaclePosition_[0] + obstacleSize_[0]) * size_[0]); - int j_beg = static_cast(std::floor(obstaclePosition_[1] * size_[1])); - int j_end = static_cast(std::ceil(obstaclePosition_[1] + obstacleSize_[1]) * size_[1]); + // should work with changing factor from `obstaclePosition_` to `obstaclePosition_[0]/globalSize_[0]` + int i_beg = static_cast(std::floor(obstaclePosition_[0] * (size_[0] - 2))) + 1; + int i_end = static_cast(std::ceil((obstaclePosition_[0] + obstacleSize_[0]) * (size_[0] - 2))) + 1; + int j_beg = static_cast(std::floor(obstaclePosition_[1] * (size_[1] - 2))) + 1; + int j_end = static_cast(std::ceil((obstaclePosition_[1] + obstacleSize_[1]) * (size_[1] - 2))) + 1; + + std::cout << i_beg << " from obstacle Position" << obstaclePosition_[0] << " and size " << size_[0] - 2 << std::endl; + std::cout << i_end << " from obstacle Size " << obstacleSize_[0] << " and size " << size_[0] - 2 << std::endl; // interior obstacle for (int i = i_beg + 1; i < i_end - 1; i++){ for (int j = j_beg + 1; j < j_end - 1; j++){ @@ -131,14 +135,21 @@ void Mask::makeRectangularObstacle(std::array obstaclePosition_ , std } } // boundary obstacle - for (int i = i_beg; i < i_end; i++){ + data_[i_beg + j_beg * size_[0]] = OBSTACLE_CORNER_BOTTOM_LEFT; + data_[i_beg + (j_end - 1) * size_[0]] = OBSTACLE_CORNER_TOP_LEFT; + data_[(i_end - 1) + j_beg * size_[0]] = OBSTACLE_CORNER_BOTTOM_RIGHT; + data_[(i_end - 1) + (j_end - 1) * size_[0]] = OBSTACLE_CORNER_TOP_RIGHT; + + for (int i = i_beg + 1; i < i_end - 1; i++){ data_[i + j_beg * size_[0]] = OBSTACLE_BORDER_BOTTOM; data_[i + (j_end - 1) * size_[0]] = OBSTACLE_BORDER_TOP; } - for (int j = j_beg; j < j_end; j++){ + for (int j = j_beg + 1; j < j_end - 1; j++){ data_[i_beg + j * size_[0]] = OBSTACLE_BORDER_LEFT; data_[(i_end - 1) + j * size_[0]] = OBSTACLE_BORDER_RIGHT; } + + // TODO: think of edges }; diff --git a/tests/test_mask.cpp b/tests/test_mask.cpp index 09bbb45b..f6d302e1 100644 --- a/tests/test_mask.cpp +++ b/tests/test_mask.cpp @@ -70,4 +70,43 @@ TEST(Mask, updateMaskBoundaries){ EXPECT_EQ(mask(4,3), Mask::FLUID_BORDER_LEFT); mask.printMask(); -}; \ No newline at end of file +}; + +TEST(Mask, makeSmallRectangularObstacleCenter){ + // Create simple map + + // 130 131 131 131 131 131 131 131 131 131 131 132 + // 130 015 015 015 015 015 015 015 015 015 015 132 + // 130 015 015 015 015 015 015 015 015 015 015 132 + // 130 015 015 015 015 015 015 015 015 015 015 132 + // 130 015 015 015 015 015 015 015 015 015 015 132 + // 130 015 015 015 015 121 122 015 015 015 015 132 + // 130 015 015 015 015 120 123 015 015 015 015 132 + // 130 015 015 015 015 015 015 015 015 015 015 132 + // 130 015 015 015 015 015 015 015 015 015 015 132 + // 130 015 015 015 015 015 015 015 015 015 015 132 + // 130 015 015 015 015 015 015 015 015 015 015 132 + // 130 133 133 133 133 133 133 133 133 133 133 132 + + // O - Obstacle + // F - Fluid + // A - Air + std::array size = {10,10}; + Mask mask(size); + // std::array meshWidth = {1.0, 1.0}; + // std::array physicalSize = {1.0, 1.0}; + + std::array obstaclePosition = {0.45, 0.45}; + std::array obstacleSize = {0.1, 0.1}; + + mask.makeRectangularObstacle(obstaclePosition, obstacleSize); + + EXPECT_EQ(mask(5,5), Mask::OBSTACLE_CORNER_BOTTOM_LEFT); + EXPECT_EQ(mask(5,6), Mask::OBSTACLE_CORNER_TOP_LEFT); + EXPECT_EQ(mask(6,5), Mask::OBSTACLE_CORNER_BOTTOM_RIGHT); + EXPECT_EQ(mask(6,6), Mask::OBSTACLE_CORNER_TOP_RIGHT); + + + mask.printMask(); +}; + From a129ac552d89bddb3ed4c3893bc7b21a6da9ff7b Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Sat, 27 Jan 2024 17:38:47 +0100 Subject: [PATCH 14/67] Fluid Tracker -> Animation for testing --- src/boundary/boundary.cpp | 11 +- src/boundary/mask.cpp | 15 +++ src/boundary/mask.h | 13 +- src/surface/fluid_tracer.cpp | 245 ++++++++++++++++++++++++----------- src/surface/fluid_tracer.h | 24 ++-- tests/test_fluid_tracer.cpp | 241 +++++++++++++++++++++++++++++----- 6 files changed, 423 insertions(+), 126 deletions(-) diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 553da10b..50488f30 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -95,7 +95,16 @@ void Boundary::setVelocityBoundaryValues(){ } void Boundary::setVelocityBoundarySurfaceU(int i, int j){ - // TODO: + switch ((*mask_)(i, j)) { + case Mask::FLUID_BORDER_LEFT: + + + break; + + default: + break; + } + } void Boundary::setVelocityBoundarySurfaceV(int i, int j){ diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index 8e8620c0..d956a638 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -35,6 +35,17 @@ std::array Mask::size() const return size_; } +void Mask::resetMask() +{ + for (int i = 0; i < size_[0]; i++) { + for (int j = 0; j < size_[1]; j++) { + if (!isObstacle(i, j)) { + data_[i + j * size_[0]] = AIR; + } + } + } +} + void Mask::updateMaskBoundaries() { for (int i = 0; i < size_[0]; i++) @@ -164,7 +175,11 @@ void Mask::makeRectangularObstacle(std::array obstaclePosition_ , std void Mask::printMask() const{ for (int j = size_[1] - 1; j >= 0; j--){ for (int i = 0; i < size_[0]; i++){ + if (data_[i + j * size_[0]] == AIR){ + std::cout << " "; + } else { std::cout << std::setw(3) << std::setfill('0') << data_[i + j * size_[0]] << " "; + } } std::cout << std::endl; } diff --git a/src/boundary/mask.h b/src/boundary/mask.h index 7a61eba1..ae42168b 100644 --- a/src/boundary/mask.h +++ b/src/boundary/mask.h @@ -91,12 +91,17 @@ enum CellType{ */ std::array size() const; + + /** + * @brief sets all not obstacle cells to air + * + */ + void resetMask(); + /** - * @brief update boundary of mask after the velocity step + * @brief update boundary of mask after the `moveParticles` step * - * TODO: this can be implemented more efficiently by only updating the cells which are next - * to a fluid cell, because only those can change their type - * Could use `isFluidBorder` + * TODO: efficiency: only update `isFluidBorder` */ void updateMaskBoundaries(); diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index e81add51..6d494d65 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -13,11 +13,6 @@ FluidTracer::FluidTracer(int numParticlesPerCell, n_y = static_cast(std::ceil(n_x * seedRelationDyDx_)); numParticlesPerCell_ = n_x * n_y; numParticles_ = numParticlesPerCell_ * mask_->getNumberOfFluidCells(); - // std::cout << "Actual particles per cell: " << numParticlesPerCell_ << std::endl; - // std::cout << "Number of particles: " << numParticlesPerCell << std::endl; - // std::cout << "nx: " << n_x << std::endl; - // std::cout << "ny: " << n_y << std::endl; - // std::cout << "seedRelationDyDx_: " << seedRelationDyDx_ << std::endl; // Resize for speed up x_.resize(numParticles_); @@ -32,6 +27,17 @@ FluidTracer::FluidTracer(int numParticlesPerCell, } } +FluidTracer::FluidTracer(std::vector x, std::vector y, + std::shared_ptr discretization, + std::shared_ptr mask) { + x_ = x; + y_ = y; + discretization_ = discretization; + mask_ = mask; + numParticles_ = x_.size(); +} + + void FluidTracer::initializeFluidCell(int i, int j, int numParticlesPerCell) { int idx = 0; double cell_x = discretization_->dx() * (i - 1); @@ -46,95 +52,184 @@ void FluidTracer::initializeFluidCell(int i, int j, int numParticlesPerCell) { } } + int FluidTracer::getNumberOfParticles() const { return numParticles_; } -void FluidTracer::updatePosition(double dt) { + +void FluidTracer::moveParticles(double dt) { + // Cells without particle are air or obstacle + mask_->resetMask(); + for (int i = 0; i < numParticles_; i++) { + double vel_x = discretization_->u().interpolateAt(x_[i], y_[i]); double vel_y = discretization_->v().interpolateAt(x_[i], y_[i]); - double step_x = dt * vel_x; - double step_y = dt * vel_y; - - // Check if collision with obstacle or boundary - // This is slow (because of CFL condition only cells next to boundary could do this check) - int idx_x = val2CellX(x_[i] + step_x); - int idx_y = val2CellY(y_[i] + step_y); - if (mask_->isObstacle(idx_x, idx_y)) { - // collision on x or y axis - double leftBorder = discretization_->dx()*(idx_x - 1); // -1 because idx starts at 0 with outer cell -dx - double topBorder = discretization_->dy()*(idx_y); - double rightBorder = discretization_->dx()*(idx_x); - double lowerBorder = discretization_->dy()*(idx_y - 1); - - // four cases for collision - if (step_x >= 0 && step_y >= 0) { - // need to check for collision with left and bottom border - double dist_x = x_[i] - leftBorder; - double dt_x = dist_x/vel_x; - double dist_y = y_[i] - lowerBorder; - double dt_y = dist_y/vel_y; - if (dt_x < dt_y) { - // collision with left border - // first dt_x * vel_x then - (dt - dt_x) * vel_x - step_x = (2*dt_x - dt) * vel_x; - } else { - // collision with bottom border - step_y = (2*dt_y - dt) * vel_y; + updateParticle(i, dt, vel_x, vel_y); + + // Update mask + int idx_x = val2CellX(x_[i]); + int idx_y = val2CellY(y_[i]); + (*mask_)(idx_x, idx_y) = Mask::FLUID; + } + + mask_->updateMaskBoundaries(); +} + + +void FluidTracer::updateParticle(int i, double dt, double vel_x, double vel_y) { + + double step_x = dt * vel_x; + double step_y = dt * vel_y; + + + // Check for Collision with obstacle + int idxNextCellX = val2CellX(x_[i] + step_x); + int idxNextCellY = val2CellY(y_[i] + step_y); + + if (mask_->isObstacle(idxNextCellX, idxNextCellY)) { + int idx_x = val2CellX(x_[i]); + int idx_y = val2CellY(y_[i]); + + // x - Border + double leftBorder = discretization_->dx()*(idx_x - 1); // -1 because idx starts at 0 with outer cell -dx + double rightBorder = discretization_->dx()*(idx_x); + + // y - Border + double lowerBorder = discretization_->dy()*(idx_y - 1); + double topBorder = discretization_->dy()*(idx_y); + + // distance and time to border + double dist_x, dt_x, dist_y, dt_y; + double dtBeforeCollision; + + double new_vel_x = vel_x; + double new_vel_y = vel_y; + + + // Note: ZERO_DIVISON is no problem, because then dt is pos_inf, which is always larger and therefore the other case is taken + + // Uses CFL condition --> accelerate? + + // TODO: CORNER: double equality rounding errors? + + + + // Summary: + // 1. `dt_x`: Calculate time till collision with x-Border (depending on direction of `vel_x` ) + // 2. `dt_y`: Calculate time till collision with y-Border (depending on direction of `vel_y` ) + // 3. Check which collision of the two possible happens first + // + // --> assign `dtBeforeCollision`, `new_vel_x` and `new_vel_y` accordingly + + + if (vel_x >= 0) { + dist_x = rightBorder - x_[i]; + dt_x = dist_x/vel_x; + + if (vel_y >= 0) { + // direction TOP_RIGHT + dist_y = topBorder - y_[i]; + dt_y = dist_y/vel_y; + + if (dt_x >= dt_y) { + // collision TOP + if (mask_->isObstacle(idx_x, idx_y + 1)){ + new_vel_y = -vel_y; + } + dtBeforeCollision = dt_y; } - } - else if (step_x >= 0 && step_y < 0) { - // need to check for collision with left and top border - double dist_x = x_[i] - leftBorder; - double dt_x = dist_x/vel_x; - double dist_y = topBorder - y_[i]; // double negative - double dt_y = dist_y/vel_y; - if (dt_x < dt_y) { - // collision with left border - // first dt_x * vel_x then - (dt - dt_x) * vel_x - step_x = (2*dt_x - dt) * vel_x; - } else { - // collision with top border - step_y = (2*dt_y - dt) * vel_y; + if (dt_x <= dt_y){ + // collision RIGHT + if (mask_->isObstacle(idx_x, idx_y + 1)){ + new_vel_x = -vel_x; + } + dtBeforeCollision = dt_x; } - } - else if (step_x < 0 && step_y >= 0) { - // need to check for collision with right and bottom border - double dist_x = rightBorder - x_[i]; - double dt_x = dist_x/vel_x; - double dist_y = y_[i] - lowerBorder; - double dt_y = dist_y/vel_y; - if (dt_x < dt_y) { - // collision with right border - step_x = (2*dt_x - dt) * vel_x; - } else { - // collision with bottom border - step_y = (2*dt_y - dt) * vel_y; + } else if (vel_y < 0){ + // direction BOTTOM_RIGHT + dist_y = lowerBorder - y_[i]; + dt_y = dist_y/vel_y; // -- = + + + if (dt_x >= dt_y) { + // collision BOTTOM + if (mask_->isObstacle(idx_x, idx_y - 1)){ + new_vel_y = -vel_y; + } + dtBeforeCollision = dt_y; } - } - else if (step_x < 0 && step_y < 0) { - // need to check for collision with right and top border - double dist_x = rightBorder - x_[i]; - double dt_x = dist_x/vel_x; - double dist_y = topBorder - y_[i]; - double dt_y = dist_y/vel_y; - if (dt_x < dt_y) { - // collision with right border - // first dt_x * vel_x then - (dt - dt_x) * vel_x - step_x = (2*dt_x - dt) * vel_x; - } else { - // collision with top border - step_y = (2*dt_y - dt) * vel_y; + if (dt_x <= dt_y){ + // collision RIGHT + if (mask_->isObstacle(idx_x, idx_y + 1)){ + new_vel_x = -vel_x; + } + dtBeforeCollision = dt_x; + } + } + } else if (vel_x < 0){ + dist_x = leftBorder - x_[i]; + dt_x = dist_x/vel_x; // -- = + + + if (vel_y >= 0) { + // direction TOP_LEFT + dist_y = topBorder - y_[i]; + dt_y = dist_y/vel_y; + + if (dt_x >= dt_y) { + // collision TOP + if (mask_->isObstacle(idx_x, idx_y + 1)){ + new_vel_y = -vel_y; + } + dtBeforeCollision = dt_y; + } + if (dt_x <= dt_y){ + // collision LEFT + if (mask_->isObstacle(idx_x, idx_y - 1)){ + new_vel_x = -vel_x; + } + dtBeforeCollision = dt_x; + } + } else if (vel_y < 0){ + // direction BOTTOM_LEFT + dist_y = lowerBorder - y_[i]; + dt_y = dist_y/vel_y; // -- = + + + if (dt_x <= dt_y) { + // collision BOTTOM + if (mask_->isObstacle(idx_x, idx_y - 1)){ + new_vel_y = -vel_y; + } + dtBeforeCollision = dt_x; + } + if (dt_x >= dt_y){ + // collision LEFT + if (mask_->isObstacle(idx_x, idx_y - 1)){ + new_vel_x = -vel_x; + } + dtBeforeCollision = dt_y; } } } + x_[i] += dtBeforeCollision * vel_x; + y_[i] += dtBeforeCollision * vel_y; + + // dtBeforeCollision is always smaller + // the maximum depth of recursion is 1 + updateParticle(i, dt - dtBeforeCollision, new_vel_x, new_vel_y); + } else { + // std::cout << "x=" << x_[i] << "+" << dt << "*" << vel_x << " -> "; x_[i] += step_x; + // std::cout << x_[i] << std::endl; + + // std::cout << " y=" << y_[i] << "+" << dt << "*" << vel_y << " -> "; y_[i] += step_y; + // std::cout << y_[i] << std::endl; } } + int FluidTracer::val2CellX(double xVal){ return static_cast(std::floor(xVal/discretization_->dx())) + 1; } diff --git a/src/surface/fluid_tracer.h b/src/surface/fluid_tracer.h index 80e4385e..df5f14a2 100644 --- a/src/surface/fluid_tracer.h +++ b/src/surface/fluid_tracer.h @@ -2,6 +2,7 @@ #include #include +#include #include "../discretization/discretization.h" #include "../boundary/boundary.h" @@ -13,24 +14,23 @@ class FluidTracer { std::shared_ptr discretization, std::shared_ptr mask); + // Mainly for testing purposes + FluidTracer(std::vector x, std::vector y, + std::shared_ptr discretization, + std::shared_ptr mask); + /** - * @brief Update the position of the particles according to the velocity field - * - * Uses the ptr to the discretization to get the velocity field $u$ and $v$ + * @brief Update the position of the particles according to the velocity field and sets mask accordingly * + * get the velocity field $u$ and $v$ * Checks for collision with border or obstacle and reflects the particle at this position + * Update the mask where there are new Air or Fluid cells * * @param dt */ - void updatePosition(double dt); + void moveParticles(double dt); + - /** - * @brief Update after the particles move there are new Air or Fluid cells - * - * @requires that afterwards the mask borders are updated - * - */ - void updateMask(); /** @@ -56,6 +56,8 @@ class FluidTracer { void initializeFluidCell(int i, int j, int numParticlesPerCell); + void updateParticle(int i, double dt, double vel_x, double vel_y); + int numParticles_; int numParticlesPerCell_; // diff --git a/tests/test_fluid_tracer.cpp b/tests/test_fluid_tracer.cpp index e7bf1907..8c998580 100644 --- a/tests/test_fluid_tracer.cpp +++ b/tests/test_fluid_tracer.cpp @@ -2,7 +2,9 @@ #include "../src/surface/fluid_tracer.h" #include "../src/discretization/central_differences.h" -TEST(FluidTracer, NParticlesSingleCell){ +#include + +TEST(FluidTracer, NumberParticlesSingleCell){ /* Test for a single cell (with 8 boundary cells) how many particles are placed */ @@ -90,46 +92,215 @@ TEST(FluidTracer, val2CellXAndY){ EXPECT_EQ(fluid_tracer.val2CellY(1.5), 2); } -TEST(FluidTracer, updatePositionFluidOnly){ +TEST(FluidTracer, moveParticles_1Cell_1Particle_WithoutCollision){ + // u(0,2) ----- u(1,2) + // : : + // v(0,1) |____v(1,1)_____| v(2,1) + // | | + // u(0,1) ----- u(1,1) + // | | + // v(0,0) |____v(1,0)_____| v(2,0) + // : : + // u(0,0) ----- u(1,0) + // + std::array n_cells = {1, 1}; std::array meshWidth = {1.0, 1.0}; std::shared_ptr mask = std::make_shared(n_cells); std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); - double vel_x = 0.01; - discretization->u(0,0) = vel_x; - discretization->u(1,0) = vel_x; - discretization->u(0,1) = vel_x; - discretization->u(1,1) = vel_x; - discretization->u(0,2) = vel_x; - discretization->u(1,2) = vel_x; - int numParticlesPerCell = 1; - FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); - EXPECT_EQ(fluid_tracer.getNumberOfParticles(), 1); - double old_pos_x = fluid_tracer.getParticlePosition(0)[0]; + + std::array velocitiesU = {-1, -0.1, -0.01, 0, 0.01, 0.1, 1}; + std::array velocitiesV = {-1, -0.1, -0.01, 0, 0.01, 0.1, 1}; + + // Checks 49 Cases + for (int idx_u = 0; idx_u < velocitiesU.size(); idx_u++){ + for (int idx_v = 0; idx_v < velocitiesV.size(); idx_v++){ + + // Set all velocities to the same value + discretization->u(0,0) = velocitiesU[idx_u]; + discretization->u(1,0) = velocitiesU[idx_u]; + discretization->u(0,1) = velocitiesU[idx_u]; + discretization->u(1,1) = velocitiesU[idx_u]; + discretization->u(0,2) = velocitiesU[idx_u]; + discretization->u(1,2) = velocitiesU[idx_u]; + + discretization->v(0,0) = velocitiesV[idx_v]; + discretization->v(1,0) = velocitiesV[idx_v]; + discretization->v(2,0) = velocitiesV[idx_v]; + discretization->v(0,1) = velocitiesV[idx_v]; + discretization->v(1,1) = velocitiesV[idx_v]; + discretization->v(2,1) = velocitiesV[idx_v]; + + // Initialize Fluid tracer with single particle + int numParticlesPerCell = 1; + FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); + double old_pos_x = fluid_tracer.getParticlePosition(0)[0]; + double old_pos_y = fluid_tracer.getParticlePosition(0)[1]; + EXPECT_EQ(fluid_tracer.getNumberOfParticles(), 1); + EXPECT_EQ(old_pos_x, 0.5); + EXPECT_EQ(old_pos_y, 0.5); + + + // Update particle according to velocity + + double dt = 0.1; // + fluid_tracer.moveParticles(dt); + EXPECT_EQ(fluid_tracer.getParticlePosition(0)[0], old_pos_x + dt * velocitiesU[idx_u]); + EXPECT_EQ(fluid_tracer.getParticlePosition(0)[1], old_pos_y + dt * velocitiesV[idx_v]); + } + } +} + + +TEST(FluidTracer, moveParticles_1Cell_1Particle_WithCollision){ + // u(0,2) ----- u(1,2) + // : : + // v(0,1) |____v(1,1)_____| v(2,1) + // | | + // u(0,1) ----- u(1,1) + // | | + // v(0,0) |____v(1,0)_____| v(2,0) + // : : + // u(0,0) ----- u(1,0) + // + + // TODO: check obstacle edges + + std::array n_cells = {1, 1}; + std::array meshWidth = {1.0, 1.0}; + std::shared_ptr mask = std::make_shared(n_cells); + std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); + + std::array velocitiesU = {-6, -1, 1, 6}; + std::array velocitiesV = {-6, -1, 1, 6}; + // std::array velocitiesU = {8}; + // std::array velocitiesV = {1}; + +// Checks 16 Cases --> 0°, 27°, 45°, 63°, 90°, ... + for (int idx_u = 0; idx_u < velocitiesU.size(); idx_u++){ + for (int idx_v = 0; idx_v < velocitiesV.size(); idx_v++){ + + // Set all velocities to the same value + discretization->u(0,0) = velocitiesU[idx_u]; + discretization->u(1,0) = velocitiesU[idx_u]; + discretization->u(0,1) = velocitiesU[idx_u]; + discretization->u(1,1) = velocitiesU[idx_u]; + discretization->u(0,2) = velocitiesU[idx_u]; + discretization->u(1,2) = velocitiesU[idx_u]; + + discretization->v(0,0) = velocitiesV[idx_v]; + discretization->v(1,0) = velocitiesV[idx_v]; + discretization->v(2,0) = velocitiesV[idx_v]; + discretization->v(0,1) = velocitiesV[idx_v]; + discretization->v(1,1) = velocitiesV[idx_v]; + discretization->v(2,1) = velocitiesV[idx_v]; + + + // Initialize Fluid tracer with single particle + int numParticlesPerCell = 1; + FluidTracer fluidTracer(numParticlesPerCell, discretization, mask); + double old_pos_x = fluidTracer.getParticlePosition(0)[0]; + double old_pos_y = fluidTracer.getParticlePosition(0)[1]; + EXPECT_EQ(fluidTracer.getNumberOfParticles(), 1); + EXPECT_EQ(old_pos_x, 0.5); + EXPECT_EQ(old_pos_y, 0.5); + + + + // Update particle + + double dt = 0.1; + fluidTracer.moveParticles(dt); + + // Particle is still in the box + EXPECT_GE(fluidTracer.getParticlePosition(0)[0], 0.0); + EXPECT_LE(fluidTracer.getParticlePosition(0)[0], 1.0); + EXPECT_GE(fluidTracer.getParticlePosition(0)[1], 0.0); + EXPECT_LE(fluidTracer.getParticlePosition(0)[1], 1.0); + + + // SPECIAL CASE + // if (idx_u == 3 && idx_v == 2){ + // // Particles position is + // double new_pos_x = 0.75; + // double new_pos_y = 0.875; + // EXPECT_EQ(fluid_tracer.getParticlePosition(0)[0], new_pos_x); + // EXPECT_EQ(fluid_tracer.getParticlePosition(0)[1], new_pos_y); + // } + + + } + } +} + + +TEST(FluidTracer, moveParticleInLargeGrid){ + // Flow Field like this: + // + // Right Down + // Up Left + + + std::array n_cells = {9, 9}; + + std::array meshWidth = {1.0/n_cells[0], 1.0/n_cells[1]}; + std::shared_ptr mask = std::make_shared(n_cells); + std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); + + std::vector x = {0.1, 0.1, 0.9, 0.9, 0.25, 0.75, 0.25, 0.75}; + std::vector y = {0.1, 0.9, 0.1, 0.9, 0.25, 0.25, 0.75, 0.75}; + + FluidTracer fluidTracer(x, y, discretization, mask); + + + // Wirbel + for (int i = 0; i < n_cells[0]; i++){ + for (int j = 0; j < n_cells[1]; j++){ + if (i > n_cells[0]/2){ + if (j > n_cells[1]/2){ + discretization->v(i,j) = -1; + } else { + discretization->u(i,j) = -1; + } + } else { + if (j > n_cells[1]/2){ + discretization->u(i,j) = 1; + } else { + discretization->v(i,j) = 1; + } + } + } + } + + double dt = 0.1; - fluid_tracer.updatePosition(dt); - EXPECT_EQ(fluid_tracer.getParticlePosition(0)[0], old_pos_x + dt * vel_x); + for (int k = 0; k < 100; k++){ + fluidTracer.moveParticles(dt); + + // does a cool animation + + + // mask->printMask(); + // std::cout << "\033[2J\033[1;1H"; + // usleep(500000); + + // Particle is still in the box + EXPECT_GE(fluidTracer.getParticlePosition(0)[0], 0.0); + EXPECT_LE(fluidTracer.getParticlePosition(0)[0], 1.0); + EXPECT_GE(fluidTracer.getParticlePosition(0)[1], 0.0); + EXPECT_LE(fluidTracer.getParticlePosition(0)[1], 1.0); + } + + + } -// TEST(FluidTracer, updatePositionWithBorderCollision){ -// std::array n_cells = {1, 1}; -// std::array meshWidth = {1.0, 1.0}; -// std::shared_ptr mask = std::make_shared(n_cells); -// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); -// double vel_x = 1.5; -// discretization->u(0,0) = vel_x; -// discretization->u(1,0) = vel_x; -// discretization->u(0,1) = vel_x; -// discretization->u(1,1) = vel_x; -// discretization->u(0,2) = vel_x; -// discretization->u(1,2) = vel_x; -// int numParticlesPerCell = 1; -// FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); -// EXPECT_EQ(fluid_tracer.getNumberOfParticles(), 1); -// double old_pos_x = fluid_tracer.getParticlePosition(0)[0]; -// double dt = 1; -// fluid_tracer.updatePosition(dt); -// EXPECT_EQ(fluid_tracer.getParticlePosition(0)[0], 0.5); -// } + + + +// ----------------------------------------------------------------- +// --- T E S T U P D A T E M A S K B O U N D A R I E S --- +// ----------------------------------------------------------------- + From 4fe497f451797d71c5fe4da961584f7e1b4257f6 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Sat, 27 Jan 2024 22:20:32 +0100 Subject: [PATCH 15/67] [tracing lid-driven] animation and bug fix cmake and distribution --- build.sh | 5 ++- input/settings_debug.txt | 4 +- src/CMakeLists.txt | 1 + src/boundary/boundary.cpp | 43 ++++++++++++------- src/computation.cpp | 21 ++++++---- src/computation.h | 13 +++++- src/surface/fluid_tracer.cpp | 39 +++++++++-------- src/surface/fluid_tracer.h | 11 ++++- tests/test_fluid_tracer.cpp | 81 ++++++++++++++++++++++++++++++++++-- 9 files changed, 166 insertions(+), 52 deletions(-) diff --git a/build.sh b/build.sh index d9882454..20a2ddf2 100755 --- a/build.sh +++ b/build.sh @@ -16,7 +16,8 @@ else fi make install -j4 -# ./numsim ../input/settings.txt + +./numsim ../input/settings_debug.txt @@ -35,6 +36,6 @@ cd .. # cd .. # run tests -build/tests/run_tests +# build/tests/run_tests # zip -r submission.zip src/ CMakeLists.txt \ No newline at end of file diff --git a/input/settings_debug.txt b/input/settings_debug.txt index 3d3461a1..c1c76989 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -2,8 +2,8 @@ # Run ./numsim lid_driven_cavity.txt # Problem description -physicalSizeX = 1.0 # physical size of the domain -physicalSizeY = 1.0 +physicalSizeX = 2.0 # physical size of the domain +physicalSizeY = 2.0 endTime = 10.0 # duration of the simulation re = 1000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e2043174..ac34f7e1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -24,6 +24,7 @@ add_executable(${PROJECT_NAME} boundary/mask.cpp boundary/boundary.cpp + surface/fluid_tracer.cpp solver/pressure_solver.cpp solver/gauss_seidel.cpp diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 50488f30..42918cd5 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -43,18 +43,19 @@ void Boundary::setPressureBoundaryValues(){ // its important that first the velocities are updated void Boundary::setPressureBoundarySurface(int i, int j){ - // switch((*mask_)(i, j)){ - // case Mask::FLUID_BORDER_LEFT: - // break; - // case Mask::FLUID_BORDER_TOP: - // break; - // case Mask::FLUID_BORDER_RIGHT: - // discretization_->p(i, j) = 2/settings_.re * ( discretization_->u(i, j) - discretization_->u(i - 1, j))/discretization_->dx(); - // break; - // case Mask::FLUID_BORDER_BOTTOM: - // discretization_->p(i, j) = 2/settings_.re * ( discretization_->v(i, j) - discretization_->v(i, j - 1))/discretization_->dy(); - // break; - // } + // u and v must be updated before p + switch((*mask_)(i, j)){ + case Mask::FLUID_BORDER_LEFT: + break; + case Mask::FLUID_BORDER_TOP: + break; + case Mask::FLUID_BORDER_RIGHT: + discretization_->p(i, j) = 2/settings_.re * ( discretization_->u(i, j) - discretization_->u(i - 1, j))/discretization_->dx(); + break; + case Mask::FLUID_BORDER_BOTTOM: + discretization_->p(i, j) = 2/settings_.re * ( discretization_->v(i, j) - discretization_->v(i, j - 1))/discretization_->dy(); + break; + } } void Boundary::setPressureBoundaryObstacle(int i, int j){ @@ -82,8 +83,8 @@ void Boundary::setVelocityBoundaryValues(){ if (mask_->isFluid(i, j)) { - setVelocityBoundarySurfaceU(i, j); - setVelocityBoundarySurfaceV(i, j); + // setVelocityBoundarySurfaceU(i, j); + // setVelocityBoundarySurfaceV(i, j); } else if (mask_->isObstacle(i, j)) { @@ -95,10 +96,20 @@ void Boundary::setVelocityBoundaryValues(){ } void Boundary::setVelocityBoundarySurfaceU(int i, int j){ + // important that this is solved + // from left to right (increasing i) + // from bottom to top (increasing j) + double dxByDy = discretization_->dx() / discretization_->dy(); + switch ((*mask_)(i, j)) { case Mask::FLUID_BORDER_LEFT: - - + discretization_->u(i, j); + break; + case Mask::FLUID_BORDER_TOP: + break; + case Mask::FLUID_BORDER_RIGHT: + discretization_->u(i, j) = discretization_->u(i - 1, j) + - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); break; default: diff --git a/src/computation.cpp b/src/computation.cpp index 8e7e0f61..a26bfae8 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -1,4 +1,5 @@ #include "computation.h" +#include "surface/fluid_tracer.h" void Computation::initialize(int argc, char *argv[]) { @@ -23,14 +24,14 @@ void Computation::initialize(int argc, char *argv[]) discretization_ = std::make_shared(settings_.nCells, meshWidth_); } - // create boundary - - // Obstacle from Primitives: Can be done inside boundary, since I give it the settings file + // create boundary and tracer mask_ = std::make_shared(settings_.nCells); - // std::array obstaclePosition_ = {0.4, 0.4}; //settings.obstaclePosition; - // std::array obstacleSize_ = {0.2, 0.2}; //settings.obstacleSize; - // mask_->makeRectangularObstacle(obstaclePosition_ , obstacleSize_); - + + // std::vector traceX = {0.1, 1.8, 0.1, 1.8}; + // std::vector traceY = {0.1, 1.8, 1.8, 0.1}; + // fluidTracer_ = std::make_shared(traceX, traceY, discretization_, mask_); + fluidTracer_ = std::make_shared(100, discretization_, mask_); + boundary_ = std::make_shared(mask_, discretization_, settings_); if (settings_.pressureSolver == "SOR") @@ -66,6 +67,12 @@ void Computation::runSimulation() computePressure(); computeVelocities(); + // update tracer + fluidTracer_->moveParticles(dt_); + mask_->printMask(); + std::cout << "\033[2J\033[1;1H"; + // usleep(100000); + currentTime += dt_; outputWriterParaview_->writeFile(currentTime); diff --git a/src/computation.h b/src/computation.h index ade9c19a..258d70fa 100644 --- a/src/computation.h +++ b/src/computation.h @@ -12,6 +12,11 @@ #include "output_writer/output_writer_text.h" #include "settings_parser/settings.h" +#include "boundary/boundary.h" +#include "boundary/mask.h" +#include "surface/fluid_tracer.h" +#include + #include #include #include @@ -39,6 +44,8 @@ class Computation */ void runSimulation(); + + private: /** * @brief Compute the time step width dt from maximum velocities @@ -75,8 +82,10 @@ class Computation Settings settings_; std::shared_ptr discretization_; //!< discretization instance - std::shared_ptr boundary_; //!< boundary instance + std::shared_ptr mask_; + std::shared_ptr boundary_; //!< boundary instance + std::shared_ptr fluidTracer_; std::unique_ptr pressureSolver_; //!< pressureSolver instance std::unique_ptr outputWriterParaview_; //!< outputWriterParaview instance @@ -84,3 +93,5 @@ class Computation std::array meshWidth_; //!< mesh width of domain in x and y direction double dt_; //!< iteration time step }; + + diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index 6d494d65..4acfe191 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -1,5 +1,16 @@ #include "fluid_tracer.h" +FluidTracer::FluidTracer(std::vector x, std::vector y, + std::shared_ptr discretization, + std::shared_ptr mask) { + x_ = x; + y_ = y; + discretization_ = discretization; + mask_ = mask; + numParticles_ = x_.size(); +} + + FluidTracer::FluidTracer(int numParticlesPerCell, std::shared_ptr discretization, std::shared_ptr mask) { @@ -11,42 +22,35 @@ FluidTracer::FluidTracer(int numParticlesPerCell, seedRelationDyDx_ = discretization_->dy()/ discretization_->dx(); n_x = static_cast(std::ceil(std::sqrt(numParticlesPerCell/seedRelationDyDx_))); n_y = static_cast(std::ceil(n_x * seedRelationDyDx_)); + numParticlesPerCell_ = n_x * n_y; numParticles_ = numParticlesPerCell_ * mask_->getNumberOfFluidCells(); // Resize for speed up x_.resize(numParticles_); y_.resize(numParticles_); - ; + + int placedParticles = 0; for (int i = 1; i < mask_->size()[0] - 1; i++) { for (int j = 1; j < mask_->size()[1] - 1; j++) { if (mask_->isFluid(i, j)) { - initializeFluidCell(i, j, numParticlesPerCell); + initializeFluidCell(i, j, placedParticles); + placedParticles += numParticlesPerCell_; } } } -} - -FluidTracer::FluidTracer(std::vector x, std::vector y, - std::shared_ptr discretization, - std::shared_ptr mask) { - x_ = x; - y_ = y; - discretization_ = discretization; - mask_ = mask; - numParticles_ = x_.size(); + assert(placedParticles == numParticles_); } -void FluidTracer::initializeFluidCell(int i, int j, int numParticlesPerCell) { - int idx = 0; +void FluidTracer::initializeFluidCell(int i, int j, int idx) { double cell_x = discretization_->dx() * (i - 1); double cell_y = discretization_->dy() * (j - 1); // fills in from bottom left to top right for (int l = 0; l < n_y; l++) { for (int k = 0; k < n_x; k++) { - x_[idx] = cell_x + (0.5 + (k * discretization_->dx())) / n_x; - y_[idx] = cell_y + (0.5 + (l * discretization_->dy())) / n_y; + x_[idx] = cell_x + ((0.5 + k) * discretization_->dx()) / n_x; + y_[idx] = cell_y + ((0.5 + l) * discretization_->dy()) / n_y; idx++; } } @@ -63,11 +67,10 @@ void FluidTracer::moveParticles(double dt) { mask_->resetMask(); for (int i = 0; i < numParticles_; i++) { - double vel_x = discretization_->u().interpolateAt(x_[i], y_[i]); double vel_y = discretization_->v().interpolateAt(x_[i], y_[i]); updateParticle(i, dt, vel_x, vel_y); - + // Update mask int idx_x = val2CellX(x_[i]); int idx_y = val2CellY(y_[i]); diff --git a/src/surface/fluid_tracer.h b/src/surface/fluid_tracer.h index df5f14a2..5af8b5bd 100644 --- a/src/surface/fluid_tracer.h +++ b/src/surface/fluid_tracer.h @@ -3,6 +3,7 @@ #include #include #include +#include #include "../discretization/discretization.h" #include "../boundary/boundary.h" @@ -53,8 +54,14 @@ class FluidTracer { int val2CellY(double yVal); private: - - void initializeFluidCell(int i, int j, int numParticlesPerCell); + /** + * @brief initializes a single cell according to nx, ny and numParticlesPerCell_ + * + * @param i index of inner cells in x direction + * @param j index of inner cells in y direction + * @param idx current number of particles + */ + void initializeFluidCell(int i, int j, int idx); void updateParticle(int i, double dt, double vel_x, double vel_y); diff --git a/tests/test_fluid_tracer.cpp b/tests/test_fluid_tracer.cpp index 8c998580..f03a9809 100644 --- a/tests/test_fluid_tracer.cpp +++ b/tests/test_fluid_tracer.cpp @@ -2,6 +2,7 @@ #include "../src/surface/fluid_tracer.h" #include "../src/discretization/central_differences.h" +// Experimental stuff #include TEST(FluidTracer, NumberParticlesSingleCell){ @@ -234,15 +235,24 @@ TEST(FluidTracer, moveParticles_1Cell_1Particle_WithCollision){ } -TEST(FluidTracer, moveParticleInLargeGrid){ +TEST(FluidTracer, moveParticlesInLargeGrid){ // Flow Field like this: // // Right Down // Up Left - + // + // Or larger + // + // R R R D D D + // R R R D D D + // R R R D D D + // U U U L L L + // U U U L L L + // U U U L L L std::array n_cells = {9, 9}; + std::array meshWidth = {1.0/n_cells[0], 1.0/n_cells[1]}; std::shared_ptr mask = std::make_shared(n_cells); std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); @@ -284,17 +294,80 @@ TEST(FluidTracer, moveParticleInLargeGrid){ // std::cout << "\033[2J\033[1;1H"; // usleep(500000); - // Particle is still in the box + // 1st particle is still in the box EXPECT_GE(fluidTracer.getParticlePosition(0)[0], 0.0); EXPECT_LE(fluidTracer.getParticlePosition(0)[0], 1.0); EXPECT_GE(fluidTracer.getParticlePosition(0)[1], 0.0); EXPECT_LE(fluidTracer.getParticlePosition(0)[1], 1.0); } +} + +TEST(FluidTracer, moveDistributedParticlesInLargeGrid){ + // Flow Field like this: + // + // Right Down + // Up Left + // + // Or larger + // + // R R R D D D + // R R R D D D + // R R R D D D + // U U U L L L + // U U U L L L + // U U U L L L + + std::array n_cells = {5, 5}; -} + std::array meshWidth = {1.0/n_cells[0], 1.0/n_cells[1]}; + + std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); + std::shared_ptr mask = std::make_shared(n_cells); + mask->printMask(); + + FluidTracer fluidTracer(1, discretization, mask); + double vel = meshWidth[0]; + for (int i = 0; i < n_cells[0]; i++){ + for (int j = 0; j < n_cells[1] + 1; j++){ + // Flow to right + discretization->u(i,j) = vel; + // Wirbel + // if (i > n_cells[0]/2){ + // if (j > n_cells[1]/2){ + // discretization->v(i,j) = -vel; + // } else { + // discretization->u(i,j) = -vel; + // } + // } else { + // if (j > n_cells[1]/2){ + // discretization->u(i,j) = vel; + // } else { + // discretization->v(i,j) = vel; + // } + // } + } + } + + double dt = 0.5; + for (int k = 0; k < 1; k++){ + fluidTracer.moveParticles(dt); + + // does a cool animation + // mask->printMask(); + // std::cout << "\033[2J\033[1;1H"; + // usleep(1000000); + + // Particle is still in the box + EXPECT_GE(fluidTracer.getParticlePosition(0)[0], 0.0); + EXPECT_LE(fluidTracer.getParticlePosition(0)[0], 1.0); + EXPECT_GE(fluidTracer.getParticlePosition(0)[1], 0.0); + EXPECT_LE(fluidTracer.getParticlePosition(0)[1], 1.0); + } + +} From 9c8984c2710cd39f50920912617259147ddb423d Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Sun, 28 Jan 2024 13:31:22 +0100 Subject: [PATCH 16/67] Fluid Tracking with source -> spiral animation --- input/settings_debug.txt | 6 +++--- src/boundary/boundary.cpp | 28 +++++++++++++++++++++++++++- src/computation.cpp | 14 ++++++++------ src/surface/fluid_tracer.cpp | 22 ++++++++++++++++++++++ src/surface/fluid_tracer.h | 9 +++++++-- 5 files changed, 67 insertions(+), 12 deletions(-) diff --git a/input/settings_debug.txt b/input/settings_debug.txt index c1c76989..fd5061d5 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -4,7 +4,7 @@ # Problem description physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 -endTime = 10.0 # duration of the simulation +endTime = 1000.0 # duration of the simulation re = 1000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity gY = 0.0 @@ -20,8 +20,8 @@ dirichletRightX = 0 dirichletRightY = 0 # Discretization parameters -nCellsX = 20 # number of cells in x and y direction -nCellsY = 20 +nCellsX = 30 # number of cells in x and y direction +nCellsY = 30 useDonorCell = true # if donor cell discretization should be used, possible values: true false alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences tau = 0.5 # safety factor for time step width diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 42918cd5..2f367991 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -100,6 +100,7 @@ void Boundary::setVelocityBoundarySurfaceU(int i, int j){ // from left to right (increasing i) // from bottom to top (increasing j) double dxByDy = discretization_->dx() / discretization_->dy(); + double dyByDx = discretization_->dy() / discretization_->dx(); switch ((*mask_)(i, j)) { case Mask::FLUID_BORDER_LEFT: @@ -111,7 +112,32 @@ void Boundary::setVelocityBoundarySurfaceU(int i, int j){ discretization_->u(i, j) = discretization_->u(i - 1, j) - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); break; - + case Mask::FLUID_BORDER_BOTTOM: + break; + case Mask::FLUID_CORNER_TOP_LEFT: + break; + case Mask::FLUID_CORNER_TOP_RIGHT: + discretization_->u(i, j) = discretization_->u(i - 1, j); + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) + - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + discretization_->u(i, j + 1) = discretization_->u(i, j); + break; + case Mask::FLUID_CORNER_BOTTOM_RIGHT: + break; + case Mask::FLUID_CORNER_BOTTOM_LEFT: + break; + case Mask::FLUID_COLUMN_HORIZONTAL: + break; + case Mask::FLUID_COLUMN_VERTICAL: + break; + case Mask::FLUID_SINGLE_LEFT: + break; + case Mask::FLUID_SINGLE_TOP: + break; + case Mask::FLUID_SINGLE_RIGHT: + break; + case Mask::FLUID_SINGLE_BOTTOM: + // Here the next time step can be calculated directly default: break; } diff --git a/src/computation.cpp b/src/computation.cpp index a26bfae8..fca6d907 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -27,10 +27,10 @@ void Computation::initialize(int argc, char *argv[]) // create boundary and tracer mask_ = std::make_shared(settings_.nCells); - // std::vector traceX = {0.1, 1.8, 0.1, 1.8}; - // std::vector traceY = {0.1, 1.8, 1.8, 0.1}; - // fluidTracer_ = std::make_shared(traceX, traceY, discretization_, mask_); - fluidTracer_ = std::make_shared(100, discretization_, mask_); + std::vector traceX = {1.8}; + std::vector traceY = {1.8}; + fluidTracer_ = std::make_shared(traceX, traceY, discretization_, mask_); + // fluidTracer_ = std::make_shared(100, discretization_, mask_); boundary_ = std::make_shared(mask_, discretization_, settings_); @@ -66,12 +66,14 @@ void Computation::runSimulation() computeRightHandSide(); computePressure(); computeVelocities(); - + // ------------------------------- // update tracer + fluidTracer_->createParticles(1.8, 1.8); fluidTracer_->moveParticles(dt_); mask_->printMask(); std::cout << "\033[2J\033[1;1H"; - // usleep(100000); + usleep(10000); + // ------------------------------- currentTime += dt_; outputWriterParaview_->writeFile(currentTime); diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index 4acfe191..2347353e 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -8,6 +8,10 @@ FluidTracer::FluidTracer(std::vector x, std::vector y, discretization_ = discretization; mask_ = mask; numParticles_ = x_.size(); + + numParticlesPerCell_ = 1; + n_x = 1; + n_y = 1; } @@ -51,12 +55,30 @@ void FluidTracer::initializeFluidCell(int i, int j, int idx) { for (int k = 0; k < n_x; k++) { x_[idx] = cell_x + ((0.5 + k) * discretization_->dx()) / n_x; y_[idx] = cell_y + ((0.5 + l) * discretization_->dy()) / n_y; + idx++; + } } } +void FluidTracer::createParticles(double positionSourceX, double positionSourceY){ + int idx_x = val2CellX(positionSourceX); + int idx_y = val2CellY(positionSourceY); + double newNumParticles_ = numParticles_ + numParticlesPerCell_; + x_.resize(newNumParticles_); + y_.resize(newNumParticles_); + + initializeFluidCell(idx_x, idx_y, numParticles_); + numParticles_ = newNumParticles_; + std::cout << "____________________________________________" << std::endl; + std::cout << "| ----- CIRCLING IN ----- |" << std::endl; + std::cout << "____________________________________________" << std::endl; + std::cout << "Current number of Particles: " << numParticles_ << std::endl; +} + + int FluidTracer::getNumberOfParticles() const { return numParticles_; } diff --git a/src/surface/fluid_tracer.h b/src/surface/fluid_tracer.h index 5af8b5bd..df43547e 100644 --- a/src/surface/fluid_tracer.h +++ b/src/surface/fluid_tracer.h @@ -31,8 +31,13 @@ class FluidTracer { */ void moveParticles(double dt); - - + /** + * @brief can be used to create a source cell for particles + * + * fills the cell homogenously with particles by cell + * + */ + void createParticles(double positionSourceX, double positionSourceY); /** * @brief Get the Number Of Particles object From d66a2e6f5fc028f8726378e14f4283f6cfd187b5 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Sun, 28 Jan 2024 14:49:02 +0100 Subject: [PATCH 17/67] Rectangle physicalSize --- input/settings_debug.txt | 4 +- src/boundary/mask.cpp | 18 +++- src/boundary/mask.h | 10 +- src/computation.cpp | 1 + src/surface/fluid_tracer.cpp | 174 +++++++++++++++++++++++++++++++---- tests/test_mask.cpp | 3 +- 6 files changed, 180 insertions(+), 30 deletions(-) diff --git a/input/settings_debug.txt b/input/settings_debug.txt index fd5061d5..2672ee2a 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -20,8 +20,8 @@ dirichletRightX = 0 dirichletRightY = 0 # Discretization parameters -nCellsX = 30 # number of cells in x and y direction -nCellsY = 30 +nCellsX = 20 # number of cells in x and y direction +nCellsY = 20 useDonorCell = true # if donor cell discretization should be used, possible values: true false alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences tau = 0.5 # safety factor for time step width diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index d956a638..0cb250c9 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -129,13 +129,21 @@ int Mask::getNumberOfFluidCells() const // ************************ -void Mask::makeRectangularObstacle(std::array obstaclePosition_ , std::array obstacleSize_){ +void Mask::makeRectangularObstacle(std::array physicalSize_, + std::array obstaclePosition_, + std::array obstacleSize_){ // only works for global size {1.0; 1.0} // should work with changing factor from `obstaclePosition_` to `obstaclePosition_[0]/globalSize_[0]` - int i_beg = static_cast(std::floor(obstaclePosition_[0] * (size_[0] - 2))) + 1; - int i_end = static_cast(std::ceil((obstaclePosition_[0] + obstacleSize_[0]) * (size_[0] - 2))) + 1; - int j_beg = static_cast(std::floor(obstaclePosition_[1] * (size_[1] - 2))) + 1; - int j_end = static_cast(std::ceil((obstaclePosition_[1] + obstacleSize_[1]) * (size_[1] - 2))) + 1; + + double scaleX = obstaclePosition_[0]/physicalSize_[0]; + double scaleY = obstaclePosition_[1]/physicalSize_[1]; + int nCellsX = size_[0] - 2; + int nCellsY = size_[1] - 2; + + int i_beg = static_cast(std::floor(scaleX * nCellsX)) + 1; + int i_end = static_cast(std::ceil((obstaclePosition_[0] + obstacleSize_[0])/physicalSize_[0] * nCellsX)) + 1; + int j_beg = static_cast(std::floor(scaleY * nCellsY)) + 1; + int j_end = static_cast(std::ceil((obstaclePosition_[1] + obstacleSize_[1])/physicalSize_[1] * nCellsY)) + 1; std::cout << i_beg << " from obstacle Position" << obstaclePosition_[0] << " and size " << size_[0] - 2 << std::endl; std::cout << i_end << " from obstacle Size " << obstacleSize_[0] << " and size " << size_[0] - 2 << std::endl; diff --git a/src/boundary/mask.h b/src/boundary/mask.h index ae42168b..395c5381 100644 --- a/src/boundary/mask.h +++ b/src/boundary/mask.h @@ -65,6 +65,7 @@ enum CellType{ DOMAIN_TOP = 131, DOMAIN_RIGHT = 132, DOMAIN_BOTTOM = 133, + }; @@ -181,12 +182,13 @@ enum CellType{ * assumes * * that the obstacle is within the boundary and sets the boundaries of the obstacle to its * according value - * * * - * @param obstaclePosition_ - * @param obstacleSize_ + * @param obstaclePosition_ position of lower left corner + * @param obstacleSize_ length and width of the rectangle */ - void makeRectangularObstacle(std::array obstaclePosition_ , std::array obstacleSize_); + void makeRectangularObstacle(std::array physicalSize_, + std::array obstaclePosition_, + std::array obstacleSize_); diff --git a/src/computation.cpp b/src/computation.cpp index fca6d907..cbfbe56c 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -26,6 +26,7 @@ void Computation::initialize(int argc, char *argv[]) // create boundary and tracer mask_ = std::make_shared(settings_.nCells); + mask_->makeRectangularObstacle(settings_.physicalSize, {0.5, 0.5}, {0.5, 0.5}); std::vector traceX = {1.8}; std::vector traceY = {1.8}; diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index 2347353e..77d29c3f 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -72,10 +72,6 @@ void FluidTracer::createParticles(double positionSourceX, double positionSourceY initializeFluidCell(idx_x, idx_y, numParticles_); numParticles_ = newNumParticles_; - std::cout << "____________________________________________" << std::endl; - std::cout << "| ----- CIRCLING IN ----- |" << std::endl; - std::cout << "____________________________________________" << std::endl; - std::cout << "Current number of Particles: " << numParticles_ << std::endl; } @@ -102,6 +98,18 @@ void FluidTracer::moveParticles(double dt) { mask_->updateMaskBoundaries(); } +int FluidTracer::val2CellX(double xVal){ + return static_cast(std::floor(xVal/discretization_->dx())) + 1; +} + +int FluidTracer::val2CellY(double yVal){ + return static_cast(std::floor(yVal/discretization_->dy())) + 1; +} + +std::array FluidTracer::getParticlePosition(int i) const { + return {x_[i], y_[i]}; +} + void FluidTracer::updateParticle(int i, double dt, double vel_x, double vel_y) { @@ -244,25 +252,155 @@ void FluidTracer::updateParticle(int i, double dt, double vel_x, double vel_y) { updateParticle(i, dt - dtBeforeCollision, new_vel_x, new_vel_y); } else { - // std::cout << "x=" << x_[i] << "+" << dt << "*" << vel_x << " -> "; x_[i] += step_x; - // std::cout << x_[i] << std::endl; - - // std::cout << " y=" << y_[i] << "+" << dt << "*" << vel_y << " -> "; y_[i] += step_y; - // std::cout << y_[i] << std::endl; } } +// ONLY FOR TESTING PURPOSES -int FluidTracer::val2CellX(double xVal){ - return static_cast(std::floor(xVal/discretization_->dx())) + 1; -} +// void FluidTracer::updateParticle(int i, double dt, double vel_x, double vel_y) { -int FluidTracer::val2CellY(double yVal){ - return static_cast(std::floor(yVal/discretization_->dy())) + 1; -} +// double step_x = dt * vel_x; +// double step_y = dt * vel_y; -std::array FluidTracer::getParticlePosition(int i) const { - return {x_[i], y_[i]}; -} \ No newline at end of file + +// // Check for Collision with obstacle +// int idxNextCellX = val2CellX(x_[i] + step_x); +// int idxNextCellY = val2CellY(y_[i] + step_y); + +// if (mask_->isObstacle(idxNextCellX, idxNextCellY)) { +// int idx_x = val2CellX(x_[i]); +// int idx_y = val2CellY(y_[i]); + +// // x - Border +// double leftBorder = discretization_->dx()*(idx_x - 1); // -1 because idx starts at 0 with outer cell -dx +// double rightBorder = discretization_->dx()*(idx_x); + +// // y - Border +// double lowerBorder = discretization_->dy()*(idx_y - 1); +// double topBorder = discretization_->dy()*(idx_y); + +// // distance and time to border +// double dist_x, dt_x, dist_y, dt_y; +// double dtBeforeCollision; + +// double new_vel_x = vel_x; +// double new_vel_y = vel_y; + + +// // Note: ZERO_DIVISON is no problem, because then dt is pos_inf, which is always larger and therefore the other case is taken + +// // Uses CFL condition --> accelerate? + +// // TODO: CORNER: double equality rounding errors? + + + +// // Summary: +// // 1. `dt_x`: Calculate time till collision with x-Border (depending on direction of `vel_x` ) +// // 2. `dt_y`: Calculate time till collision with y-Border (depending on direction of `vel_y` ) +// // 3. Check which collision of the two possible happens first +// // +// // --> assign `dtBeforeCollision`, `new_vel_x` and `new_vel_y` accordingly + + +// if (vel_x >= 0) { +// dist_x = rightBorder - x_[i]; +// dt_x = dist_x/vel_x; + +// if (vel_y >= 0) { +// // direction TOP_RIGHT +// dist_y = topBorder - y_[i]; +// dt_y = dist_y/vel_y; + +// if (dt_x >= dt_y) { +// // collision TOP +// if (mask_->isObstacle(idx_x, idx_y + 1)){ +// new_vel_y = -vel_y; +// } +// dtBeforeCollision = dt_y; +// } +// if (dt_x <= dt_y){ +// // collision RIGHT +// if (mask_->isObstacle(idx_x, idx_y + 1)){ +// new_vel_x = -vel_x; +// } +// dtBeforeCollision = dt_x; +// } +// } else if (vel_y < 0){ +// // direction BOTTOM_RIGHT +// dist_y = lowerBorder - y_[i]; +// dt_y = dist_y/vel_y; // -- = + + +// if (dt_x >= dt_y) { +// // collision BOTTOM +// if (mask_->isObstacle(idx_x, idx_y - 1)){ +// new_vel_y = -vel_y; +// } +// dtBeforeCollision = dt_y; +// } +// if (dt_x <= dt_y){ +// // collision RIGHT +// if (mask_->isObstacle(idx_x, idx_y + 1)){ +// new_vel_x = -vel_x; +// } +// dtBeforeCollision = dt_x; +// } +// } +// } else if (vel_x < 0){ +// dist_x = leftBorder - x_[i]; +// dt_x = dist_x/vel_x; // -- = + + +// if (vel_y >= 0) { +// // direction TOP_LEFT +// dist_y = topBorder - y_[i]; +// dt_y = dist_y/vel_y; + +// if (dt_x >= dt_y) { +// // collision TOP +// if (mask_->isObstacle(idx_x, idx_y + 1)){ +// new_vel_y = -vel_y; +// } +// dtBeforeCollision = dt_y; +// } +// if (dt_x <= dt_y){ +// // collision LEFT +// if (mask_->isObstacle(idx_x, idx_y - 1)){ +// new_vel_x = -vel_x; +// } +// dtBeforeCollision = dt_x; +// } +// } else if (vel_y < 0){ +// // direction BOTTOM_LEFT +// dist_y = lowerBorder - y_[i]; +// dt_y = dist_y/vel_y; // -- = + + +// if (dt_x <= dt_y) { +// // collision BOTTOM +// if (mask_->isObstacle(idx_x, idx_y - 1)){ +// new_vel_y = -vel_y; +// } +// dtBeforeCollision = dt_x; +// } +// if (dt_x >= dt_y){ +// // collision LEFT +// if (mask_->isObstacle(idx_x, idx_y - 1)){ +// new_vel_x = -vel_x; +// } +// dtBeforeCollision = dt_y; +// } +// } +// } +// x_[i] += dtBeforeCollision * vel_x; +// y_[i] += dtBeforeCollision * vel_y; + +// // dtBeforeCollision is always smaller +// // the maximum depth of recursion is 1 +// updateParticle(i, dt - dtBeforeCollision, new_vel_x, new_vel_y); +// } else { + +// x_[i] += step_x; +// y_[i] += step_y; +// } +// } \ No newline at end of file diff --git a/tests/test_mask.cpp b/tests/test_mask.cpp index f6d302e1..b47fe157 100644 --- a/tests/test_mask.cpp +++ b/tests/test_mask.cpp @@ -96,10 +96,11 @@ TEST(Mask, makeSmallRectangularObstacleCenter){ // std::array meshWidth = {1.0, 1.0}; // std::array physicalSize = {1.0, 1.0}; + std::array physicalSize = {1.0, 1.0}; std::array obstaclePosition = {0.45, 0.45}; std::array obstacleSize = {0.1, 0.1}; - mask.makeRectangularObstacle(obstaclePosition, obstacleSize); + mask.makeRectangularObstacle(physicalSize, obstaclePosition, obstacleSize); EXPECT_EQ(mask(5,5), Mask::OBSTACLE_CORNER_BOTTOM_LEFT); EXPECT_EQ(mask(5,6), Mask::OBSTACLE_CORNER_TOP_LEFT); From 8c9426f3e04b0a4dbee8c329ab11765da83c3c60 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Sun, 28 Jan 2024 14:50:27 +0100 Subject: [PATCH 18/67] working main --- src/computation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/computation.cpp b/src/computation.cpp index cbfbe56c..fee180d5 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -26,7 +26,7 @@ void Computation::initialize(int argc, char *argv[]) // create boundary and tracer mask_ = std::make_shared(settings_.nCells); - mask_->makeRectangularObstacle(settings_.physicalSize, {0.5, 0.5}, {0.5, 0.5}); + // mask_->makeRectangularObstacle(settings_.physicalSize, {0.5, 0.5}, {0.5, 0.5}); std::vector traceX = {1.8}; std::vector traceY = {1.8}; From 2f2d804f1080b0c59e0cd7356bd6388eb9df663b Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Sun, 28 Jan 2024 18:23:42 +0100 Subject: [PATCH 19/67] added new setting for different domain BC --- input/settings_debug.txt | 38 +++++-- src/boundary/boundary.cpp | 16 +-- src/boundary/mask.cpp | 188 ++++++++++++++++--------------- src/boundary/mask.h | 11 +- src/computation.cpp | 21 ++-- src/settings_parser/settings.cpp | 79 +++++++++---- src/settings_parser/settings.h | 21 +++- 7 files changed, 228 insertions(+), 146 deletions(-) diff --git a/input/settings_debug.txt b/input/settings_debug.txt index 2672ee2a..f02cbd48 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -4,20 +4,38 @@ # Problem description physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 -endTime = 1000.0 # duration of the simulation +endTime = 10.0 # duration of the simulation re = 1000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity gY = 0.0 -# Dirichlet boundary conditions -dirichletBottomX = 0 -dirichletBottomY = 0 -dirichletTopX = 1 -dirichletTopY = 0 -dirichletLeftX = 0 -dirichletLeftY = 0 -dirichletRightX = 0 -dirichletRightY = 0 + +# Boundary Conditions Type +BCTop = NoSlip +BCRight = NoSlip +BCBottom = NoSlip +BCLeft = NoSlip + + +# NoSlip boundary conditions + +NoSlipVelTopX = 1 +NoSlipVelTopY = 0 +NoSlipVelRightX = 0 +NoSlipVelRightY = 0 +NoSlipVelBottomX = 0 +NoSlipVelBottomY = 0 +NoSlipVelLeftX = 0 +NoSlipVelLeftY = 0 + + +# Pressure BoundaryConditions. + +PressureTop = 0 +PressureRight = 10.0 +PressureBottom = 0 +PressureLeft = 100.0 + # Discretization parameters nCellsX = 20 # number of cells in x and y direction diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 2f367991..8226c596 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -154,16 +154,16 @@ void Boundary::setVelocityBoundaryObstacleU(int i, int j){ switch ((*mask_)(i, j)) { case Mask::DOMAIN_LEFT: - discretization_->u(i, j) = settings_.dirichletBcLeft[0]; + discretization_->u(i, j) = settings_.NoSlipVelLeft[0]; break; case Mask::DOMAIN_TOP: - discretization_->u(i, j) = 2 * settings_.dirichletBcTop[0] - discretization_->u(i, j - 1); + discretization_->u(i, j) = 2 * settings_.NoSlipVelTop[0] - discretization_->u(i, j - 1); break; case Mask::DOMAIN_RIGHT: - discretization_->u(i - 1, j) = settings_.dirichletBcRight[0]; // index shift for u in x direction + discretization_->u(i - 1, j) = settings_.NoSlipVelRight[0]; // index shift for u in x direction break; case Mask::DOMAIN_BOTTOM: - discretization_->u(i, j) = 2 * settings_.dirichletBcBottom[0] - discretization_->u(i, j + 1); + discretization_->u(i, j) = 2 * settings_.NoSlipVelBottom[0] - discretization_->u(i, j + 1); break; } @@ -192,16 +192,16 @@ void Boundary::setVelocityBoundaryObstacleV(int i, int j){ switch ((*mask_)(i, j)) { case Mask::DOMAIN_LEFT: - discretization_->v(i, j) = 2 * settings_.dirichletBcLeft[1] - discretization_->v(i + 1, j); + discretization_->v(i, j) = 2 * settings_.NoSlipVelLeft[1] - discretization_->v(i + 1, j); break; case Mask::DOMAIN_TOP: - discretization_->v(i, j - 1) = settings_.dirichletBcTop[1]; // index shift for v in y direction + discretization_->v(i, j - 1) = settings_.NoSlipVelTop[1]; // index shift for v in y direction break; case Mask::DOMAIN_RIGHT: - discretization_->v(i, j) = 2 * settings_.dirichletBcRight[1] - discretization_->v(i - 1, j); + discretization_->v(i, j) = 2 * settings_.NoSlipVelRight[1] - discretization_->v(i - 1, j); break; case Mask::DOMAIN_BOTTOM: - discretization_->v(i, j) = settings_.dirichletBcBottom[1]; + discretization_->v(i, j) = settings_.NoSlipVelBottom[1]; break; } // // Vertical diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index 0cb250c9..e46c8e72 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -1,6 +1,6 @@ #include "mask.h" -Mask::Mask(std::array size) : size_({size[0]+2, size[1]+2}) +Mask::Mask(std::array size) : size_({size[0] + 2, size[1] + 2}) { assert(size[0] > 0 && size[1] > 0); data_.resize(size_[0] * size_[1], FLUID); @@ -8,13 +8,13 @@ Mask::Mask(std::array size) : size_({size[0]+2, size[1]+2}) // Set domain boundaries to obstacle for (int i = 0; i < size_[0]; i++) { - data_[i] = DOMAIN_BOTTOM; - data_[i + (size_[1] - 1) * size_[0]] = DOMAIN_TOP; + data_[i] = DOMAIN_BOUNDARY; + data_[i + (size_[1] - 1) * size_[0]] = DOMAIN_BOUNDARY; } for (int j = 0; j < size_[1]; j++) { - data_[j * size_[0]] = DOMAIN_LEFT; - data_[(size_[0] - 1) + j * size_[0]] = DOMAIN_RIGHT; + data_[j * size_[0]] = DOMAIN_BOUNDARY; + data_[(size_[0] - 1) + j * size_[0]] = DOMAIN_BOUNDARY; } } @@ -37,9 +37,12 @@ std::array Mask::size() const void Mask::resetMask() { - for (int i = 0; i < size_[0]; i++) { - for (int j = 0; j < size_[1]; j++) { - if (!isObstacle(i, j)) { + for (int i = 0; i < size_[0]; i++) + { + for (int j = 0; j < size_[1]; j++) + { + if (!isObstacle(i, j)) + { data_[i + j * size_[0]] = AIR; } } @@ -56,57 +59,55 @@ void Mask::updateMaskBoundaries() if (Mask::isFluid(i, j)) { - data_[idx] = 1 * Mask::isNotAir(i - 1, j) - + 2 * Mask::isNotAir(i, j + 1) - + 4 * Mask::isNotAir(i + 1, j) - + 8 * Mask::isNotAir(i, j - 1); - + data_[idx] = 1 * Mask::isNotAir(i - 1, j) + 2 * Mask::isNotAir(i, j + 1) + 4 * Mask::isNotAir(i + 1, j) + 8 * Mask::isNotAir(i, j - 1); } } } } - - - bool Mask::isFluid(int i, int j) const - { - if (i < 0 || i >= size_[0] || j < 0 || j >= size_[1]){ - return false; - } else { - return (data_[i + j * size_[0]] < FLUID_TYPE); - } - } +{ + if (i < 0 || i >= size_[0] || j < 0 || j >= size_[1]) + { + return false; + } + else + { + return (data_[i + j * size_[0]] < FLUID_TYPE); + } +} bool Mask::isObstacle(int i, int j) const - { - return (data_[i + j * size_[0]] >= OBSTACLE); - } +{ + return (data_[i + j * size_[0]] >= OBSTACLE); +} bool Mask::isFluidBorder(int i, int j) const - { - return data_[i + j * size_[0]] < FLUID; - } +{ + return data_[i + j * size_[0]] < FLUID; +} bool Mask::isBorder(int i, int j) const - { - return isFluidBorder(i, j) || isObstacle(i, j); - } +{ + return isFluidBorder(i, j) || isObstacle(i, j); +} bool Mask::isAir(int i, int j) const - { - return (data_[i + j * size_[0]] == AIR); - } +{ + return (data_[i + j * size_[0]] == AIR); +} bool Mask::isNotAir(int i, int j) const - { - if (i < 0 || i >= size_[0] || j < 0 || j >= size_[1]) - { - return true; - } else { - return (data_[i + j * size_[0]] != AIR); - } - } +{ + if (i < 0 || i >= size_[0] || j < 0 || j >= size_[1]) + { + return true; + } + else + { + return (data_[i + j * size_[0]] != AIR); + } +} int Mask::getNumberOfFluidCells() const { @@ -128,72 +129,81 @@ int Mask::getNumberOfFluidCells() const // P R I M I T I V E S // ************************ - void Mask::makeRectangularObstacle(std::array physicalSize_, std::array obstaclePosition_, - std::array obstacleSize_){ + std::array obstacleSize_) +{ // only works for global size {1.0; 1.0} // should work with changing factor from `obstaclePosition_` to `obstaclePosition_[0]/globalSize_[0]` - double scaleX = obstaclePosition_[0]/physicalSize_[0]; - double scaleY = obstaclePosition_[1]/physicalSize_[1]; + double scaleX = obstaclePosition_[0] / physicalSize_[0]; + double scaleY = obstaclePosition_[1] / physicalSize_[1]; int nCellsX = size_[0] - 2; int nCellsY = size_[1] - 2; - int i_beg = static_cast(std::floor(scaleX * nCellsX)) + 1; - int i_end = static_cast(std::ceil((obstaclePosition_[0] + obstacleSize_[0])/physicalSize_[0] * nCellsX)) + 1; - int j_beg = static_cast(std::floor(scaleY * nCellsY)) + 1; - int j_end = static_cast(std::ceil((obstaclePosition_[1] + obstacleSize_[1])/physicalSize_[1] * nCellsY)) + 1; - - std::cout << i_beg << " from obstacle Position" << obstaclePosition_[0] << " and size " << size_[0] - 2 << std::endl; - std::cout << i_end << " from obstacle Size " << obstacleSize_[0] << " and size " << size_[0] - 2 << std::endl; - // interior obstacle - for (int i = i_beg + 1; i < i_end - 1; i++){ - for (int j = j_beg + 1; j < j_end - 1; j++){ - data_[i + j * size_[0]] = OBSTACLE; - } - } - // boundary obstacle - data_[i_beg + j_beg * size_[0]] = OBSTACLE_CORNER_BOTTOM_LEFT; - data_[i_beg + (j_end - 1) * size_[0]] = OBSTACLE_CORNER_TOP_LEFT; - data_[(i_end - 1) + j_beg * size_[0]] = OBSTACLE_CORNER_BOTTOM_RIGHT; - data_[(i_end - 1) + (j_end - 1) * size_[0]] = OBSTACLE_CORNER_TOP_RIGHT; - - for (int i = i_beg + 1; i < i_end - 1; i++){ - data_[i + j_beg * size_[0]] = OBSTACLE_BORDER_BOTTOM; - data_[i + (j_end - 1) * size_[0]] = OBSTACLE_BORDER_TOP; - } - for (int j = j_beg + 1; j < j_end - 1; j++){ - data_[i_beg + j * size_[0]] = OBSTACLE_BORDER_LEFT; - data_[(i_end - 1) + j * size_[0]] = OBSTACLE_BORDER_RIGHT; - } - - // TODO: think of edges -}; - + int i_beg = static_cast(std::floor(scaleX * nCellsX)) + 1; + int i_end = static_cast(std::ceil((obstaclePosition_[0] + obstacleSize_[0]) / physicalSize_[0] * nCellsX)) + 1; + int j_beg = static_cast(std::floor(scaleY * nCellsY)) + 1; + int j_end = static_cast(std::ceil((obstaclePosition_[1] + obstacleSize_[1]) / physicalSize_[1] * nCellsY)) + 1; + std::cout << i_beg << " from obstacle Position" << obstaclePosition_[0] << " and size " << size_[0] - 2 << std::endl; + std::cout << i_end << " from obstacle Size " << obstacleSize_[0] << " and size " << size_[0] - 2 << std::endl; + // interior obstacle + for (int i = i_beg + 1; i < i_end - 1; i++) + { + for (int j = j_beg + 1; j < j_end - 1; j++) + { + data_[i + j * size_[0]] = OBSTACLE; + } + } + // boundary obstacle + data_[i_beg + j_beg * size_[0]] = OBSTACLE; // OBSTACLE_CORNER_BOTTOM_LEFT; + data_[i_beg + (j_end - 1) * size_[0]] = OBSTACLE; // OBSTACLE_CORNER_TOP_LEFT; + data_[(i_end - 1) + j_beg * size_[0]] = OBSTACLE; // OBSTACLE_CORNER_BOTTOM_RIGHT; + data_[(i_end - 1) + (j_end - 1) * size_[0]] = OBSTACLE; // OBSTACLE_CORNER_TOP_RIGHT; + for (int i = i_beg + 1; i < i_end - 1; i++) + { + data_[i + j_beg * size_[0]] = OBSTACLE; // OBSTACLE_BORDER_BOTTOM; + data_[i + (j_end - 1) * size_[0]] = OBSTACLE; // OBSTACLE_BORDER_TOP; + } + for (int j = j_beg + 1; j < j_end - 1; j++) + { + data_[i_beg + j * size_[0]] = OBSTACLE; // OBSTACLE_BORDER_LEFT; + data_[(i_end - 1) + j * size_[0]] = OBSTACLE; // OBSTACLE_BORDER_RIGHT; + } + // TODO: think of edges +}; +void Mask::setDomainBoundary(std::string domainBoundary_left, std::string domainBoundary_right, std::string domainBoundary_top, std::string domainBoundary_bot) +{ + int i = 0; +} // ****************************** // P R I N T I N G // ****************************** -void Mask::printMask() const{ - for (int j = size_[1] - 1; j >= 0; j--){ - for (int i = 0; i < size_[0]; i++){ - if (data_[i + j * size_[0]] == AIR){ - std::cout << " "; - } else { - std::cout << std::setw(3) << std::setfill('0') << data_[i + j * size_[0]] << " "; - } - } - std::cout << std::endl; +void Mask::printMask() const +{ + for (int j = size_[1] - 1; j >= 0; j--) + { + for (int i = 0; i < size_[0]; i++) + { + if (data_[i + j * size_[0]] == AIR) + { + std::cout << " "; + } + else + { + std::cout << std::setw(3) << std::setfill('0') << data_[i + j * size_[0]] << " "; + } } + std::cout << std::endl; + } } - // void Mask::createBitmap() const{ // std::ofstream file("output.bmp", std::ios::binary); // int width = size_[0]; diff --git a/src/boundary/mask.h b/src/boundary/mask.h index 395c5381..46917b1f 100644 --- a/src/boundary/mask.h +++ b/src/boundary/mask.h @@ -61,11 +61,12 @@ enum CellType{ OBSTACLE_CORNER_TOP_RIGHT = 122, OBSTACLE_CORNER_BOTTOM_RIGHT = 123, - DOMAIN_LEFT = 130, - DOMAIN_TOP = 131, - DOMAIN_RIGHT = 132, - DOMAIN_BOTTOM = 133, + DOMAIN_BOUNDARY = 130, + DOMAIN_LEFT = 131, + DOMAIN_TOP = 132, + DOMAIN_RIGHT = 133, + DOMAIN_BOTTOM = 134, }; @@ -190,6 +191,8 @@ enum CellType{ std::array obstaclePosition_, std::array obstacleSize_); + void setDomainBoundary(std::string domainBoundary_left, std::string domainBoundary_right, std::string domainBoundary_top, std::string domainBoundary_bot); + // ****************************** diff --git a/src/computation.cpp b/src/computation.cpp index fee180d5..50d20055 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -26,11 +26,12 @@ void Computation::initialize(int argc, char *argv[]) // create boundary and tracer mask_ = std::make_shared(settings_.nCells); - // mask_->makeRectangularObstacle(settings_.physicalSize, {0.5, 0.5}, {0.5, 0.5}); + mask_->makeRectangularObstacle(settings_.physicalSize, {0.5, 0.5}, {0.5, 0.5}); + mask_->printMask(); std::vector traceX = {1.8}; std::vector traceY = {1.8}; - fluidTracer_ = std::make_shared(traceX, traceY, discretization_, mask_); + //fluidTracer_ = std::make_shared(traceX, traceY, discretization_, mask_); // fluidTracer_ = std::make_shared(100, discretization_, mask_); boundary_ = std::make_shared(mask_, discretization_, settings_); @@ -67,14 +68,14 @@ void Computation::runSimulation() computeRightHandSide(); computePressure(); computeVelocities(); - // ------------------------------- - // update tracer - fluidTracer_->createParticles(1.8, 1.8); - fluidTracer_->moveParticles(dt_); - mask_->printMask(); - std::cout << "\033[2J\033[1;1H"; - usleep(10000); - // ------------------------------- + // // ------------------------------- + // // update tracer + // fluidTracer_->createParticles(1.8, 1.8); + // fluidTracer_->moveParticles(dt_); + // mask_->printMask(); + // std::cout << "\033[2J\033[1;1H"; + // usleep(10000); + // // ------------------------------- currentTime += dt_; outputWriterParaview_->writeFile(currentTime); diff --git a/src/settings_parser/settings.cpp b/src/settings_parser/settings.cpp index 8bf75d5b..ad4dd08c 100644 --- a/src/settings_parser/settings.cpp +++ b/src/settings_parser/settings.cpp @@ -42,10 +42,10 @@ void Settings::printSettings() std::cout << "Settings: " << std::endl << " physicalSize: " << physicalSize[0] << " x " << physicalSize[1] << ", nCells: " << nCells[0] << " x " << nCells[1] << std::endl << " endTime: " << endTime << " s, re: " << re << ", g: (" << g[0] << "," << g[1] << "), tau: " << tau << ", maximum dt: " << maximumDt << std::endl - << " dirichletBC: bottom: (" << dirichletBcBottom[0] << "," << dirichletBcBottom[1] << ")" - << ", top: (" << dirichletBcTop[0] << "," << dirichletBcTop[1] << ")" - << ", left: (" << dirichletBcLeft[0] << "," << dirichletBcLeft[1] << ")" - << ", right: (" << dirichletBcRight[0] << "," << dirichletBcRight[1] << ")" << std::endl + << " dirichletBC: bottom: (" << NoSlipVelBottom[0] << "," << NoSlipVelBottom[1] << ")" + << ", top: (" << NoSlipVelTop[0] << "," << NoSlipVelTop[1] << ")" + << ", left: (" << NoSlipVelLeft[0] << "," << NoSlipVelLeft[1] << ")" + << ", right: (" << NoSlipVelRight[0] << "," << NoSlipVelRight[1] << ")" << std::endl << " useDonorCell: " << std::boolalpha << useDonorCell << ", alpha: " << alpha << std::endl << " pressureSolver: " << pressureSolver << ", omega: " << omega << ", epsilon: " << epsilon << ", maximumNumberOfIterations: " << maximumNumberOfIterations << std::endl; } @@ -111,23 +111,60 @@ void Settings::setParameter(std::string parameterName, std::string value) else if (parameterName == "gY") Settings::g[1] = atof(value.c_str()); - // Dirichlet boundary conditions - else if (parameterName == "dirichletBottomX") - Settings::dirichletBcBottom[0] = atof(value.c_str()); - else if (parameterName == "dirichletBottomY") - Settings::dirichletBcBottom[1] = atof(value.c_str()); - else if (parameterName == "dirichletTopX") - Settings::dirichletBcTop[0] = atof(value.c_str()); - else if (parameterName == "dirichletTopY") - Settings::dirichletBcTop[1] = atof(value.c_str()); - else if (parameterName == "dirichletLeftX") - Settings::dirichletBcLeft[0] = atof(value.c_str()); - else if (parameterName == "dirichletLeftY") - Settings::dirichletBcLeft[1] = atof(value.c_str()); - else if (parameterName == "dirichletRightX") - Settings::dirichletBcRight[0] = atof(value.c_str()); - else if (parameterName == "dirichletRightY") - Settings::dirichletBcRight[1] = atof(value.c_str()); + // // Boundary conditions type + else if (parameterName == "BCTop"){ + if (value == "NoSlip" || value == "Pressure") + Settings::pressureSolver = value; + else + throw std::invalid_argument("Supported values for BCTop are NoSlip and Pressure."); + } + else if (parameterName == "BCRight"){ + if (value == "NoSlip" || value == "Pressure") + Settings::pressureSolver = value; + else + throw std::invalid_argument("Supported values for BCRight are NoSlip and Pressure."); + } + else if (parameterName == "BCBottom"){ + if (value == "NoSlip" || value == "Pressure") + Settings::pressureSolver = value; + else + throw std::invalid_argument("Supported values for BCBottom are NoSlip and Pressure."); + } + else if (parameterName == "BCLeft"){ + if (value == "NoSlip" || value == "Pressure") + Settings::pressureSolver = value; + else + throw std::invalid_argument("Supported values for BCLeft are NoSlip and Pressure."); + } + + // NoSlip boundary conditions + else if (parameterName == "NoSlipVelTopX") + Settings::NoSlipVelTop[0] = atof(value.c_str()); + else if (parameterName == "NoSlipVelTopY") + Settings::NoSlipVelTop[1] = atof(value.c_str()); + else if (parameterName == "NoSlipVelRightX") + Settings::NoSlipVelRight[0] = atof(value.c_str()); + else if (parameterName == "NoSlipVelRightY") + Settings::NoSlipVelRight[1] = atof(value.c_str()); + else if (parameterName == "NoSlipVelBottomX") + Settings::NoSlipVelBottom[0] = atof(value.c_str()); + else if (parameterName == "NoSlipVelBottomY") + Settings::NoSlipVelBottom[1] = atof(value.c_str()); + else if (parameterName == "NoSlipVelLeftX") + Settings::NoSlipVelLeft[0] = atof(value.c_str()); + else if (parameterName == "NoSlipVelLeftY") + Settings::NoSlipVelLeft[1] = atof(value.c_str()); + + // Pressure BoundaryConditions. + else if (parameterName == "PressureTop") + Settings::PressureTop = atof(value.c_str()); + else if (parameterName == "PressureRight") + Settings::PressureRight = atof(value.c_str()); + else if (parameterName == "PressureBottom") + Settings::PressureBottom = atof(value.c_str()); + else if (parameterName == "PressureLeft") + Settings::PressureLeft = atof(value.c_str()); + // Discretization parameters else if (parameterName == "nCellsX") diff --git a/src/settings_parser/settings.h b/src/settings_parser/settings.h index fc2429ca..ddcb9578 100644 --- a/src/settings_parser/settings.h +++ b/src/settings_parser/settings.h @@ -24,10 +24,23 @@ struct Settings bool useDonorCell = false; //!< if the donor cell scheme schould be used double alpha = 0.5; //!< factor for donor-cell scheme - std::array dirichletBcBottom; //!< prescribed values of u,v at bottom of domain - std::array dirichletBcTop; //!< prescribed values of u,v at top of domain - std::array dirichletBcLeft; //!< prescribed values of u,v at left of domain - std::array dirichletBcRight; //!< prescribed values of u,v at right of domain + // Boundary Conditions Type + std::string BCTop = "NoSlip"; + std::string BCRight = "NoSlip"; + std::string BCBotom = "NoSlip"; + std::string BCLeft = "NoSlip"; + + // NoSlip boundary conditions + std::array NoSlipVelTop; //!< prescribed values of u,v at top of domain + std::array NoSlipVelRight; //!< prescribed values of u,v at right of domain + std::array NoSlipVelBottom; //!< prescribed values of u,v at bottom of domain + std::array NoSlipVelLeft; //!< prescribed values of u,v at left of domain + + // Pressure boundary conditions + double PressureTop; //!< prescribed pressure BC top of domain + double PressureRight; //!< prescribed pressure BC right of domain + double PressureBottom; //!< prescribed pressure BC bottom of domain + double PressureLeft; //!< prescribed pressure BC left of domain std::string pressureSolver = "SOR"; //!< which pressure solver to use, "GaussSeidel" or "SOR" double omega = 1.0; //!< overrelaxation factor From d47a5575cc6a0726b62b24485e489c9d29dead9c Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Sun, 28 Jan 2024 18:43:52 +0100 Subject: [PATCH 20/67] added settings paramter to mask --- CMakeLists.txt | 2 +- src/boundary/mask.cpp | 2 +- src/boundary/mask.h | 4 +++- src/computation.cpp | 3 +-- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9fa651df..72ac5c8a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,4 +2,4 @@ cmake_minimum_required(VERSION 3.8) project(numsim) add_subdirectory(src) -add_subdirectory(tests) \ No newline at end of file +#add_subdirectory(tests) \ No newline at end of file diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index e46c8e72..266035cf 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -1,6 +1,6 @@ #include "mask.h" -Mask::Mask(std::array size) : size_({size[0] + 2, size[1] + 2}) +Mask::Mask(std::array size, Settings settings) : size_({size[0] + 2, size[1] + 2}), settings_(settings) { assert(size[0] > 0 && size[1] > 0); data_.resize(size_[0] * size_[1], FLUID); diff --git a/src/boundary/mask.h b/src/boundary/mask.h index 46917b1f..b5d2e31b 100644 --- a/src/boundary/mask.h +++ b/src/boundary/mask.h @@ -8,6 +8,7 @@ #include #include #include +#include "../settings_parser/settings.h" @@ -18,7 +19,7 @@ class Mask{ * * @param size size of array in x and y direction */ - Mask(std::array size); + Mask(std::array size, Settings settings); @@ -210,4 +211,5 @@ enum CellType{ const std::array size_; //!< size of array in x and y direction std::vector data_; //!< storage array values, in row-major order std::vector boundary_list; //!< stores the indices of the boundary cells + Settings settings_; }; \ No newline at end of file diff --git a/src/computation.cpp b/src/computation.cpp index 50d20055..b414b1eb 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -1,5 +1,4 @@ #include "computation.h" -#include "surface/fluid_tracer.h" void Computation::initialize(int argc, char *argv[]) { @@ -25,7 +24,7 @@ void Computation::initialize(int argc, char *argv[]) } // create boundary and tracer - mask_ = std::make_shared(settings_.nCells); + mask_ = std::make_shared(settings_.nCells, settings_); mask_->makeRectangularObstacle(settings_.physicalSize, {0.5, 0.5}, {0.5, 0.5}); mask_->printMask(); From fe9df50bc36aaa7f4a7e08f7876c824883921a6e Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Tue, 30 Jan 2024 16:48:32 +0100 Subject: [PATCH 21/67] added new function to specify domain boundary conditions --- input/settings_debug.txt | 22 ++++-- src/boundary/boundary.cpp | 24 +++---- src/boundary/mask.cpp | 114 +++++++++++++++++++------------ src/boundary/mask.h | 25 ++++--- src/computation.cpp | 4 +- src/settings_parser/settings.cpp | 28 ++++++-- src/settings_parser/settings.h | 16 +++-- 7 files changed, 150 insertions(+), 83 deletions(-) diff --git a/input/settings_debug.txt b/input/settings_debug.txt index f02cbd48..c5294796 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -4,16 +4,17 @@ # Problem description physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 -endTime = 10.0 # duration of the simulation +endTime = 1.0 # duration of the simulation re = 1000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity gY = 0.0 # Boundary Conditions Type -BCTop = NoSlip + +BCTop = Pressure BCRight = NoSlip -BCBottom = NoSlip +BCBottom = Pressure BCLeft = NoSlip @@ -29,17 +30,26 @@ NoSlipVelLeftX = 0 NoSlipVelLeftY = 0 -# Pressure BoundaryConditions. +# Pressure BoundaryConditions PressureTop = 0 PressureRight = 10.0 PressureBottom = 0 PressureLeft = 100.0 +# Create Rectangular object in domain + +createRectangularObject = true + +obstaclePositionX = 0.5 +obstaclePositionY = 0.5 +obstacleDimensionX = 0.5 +obstacleDimensionY = 0.5 + # Discretization parameters -nCellsX = 20 # number of cells in x and y direction -nCellsY = 20 +nCellsX = 10 # number of cells in x and y direction +nCellsY = 10 useDonorCell = true # if donor cell discretization should be used, possible values: true false alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences tau = 0.5 # safety factor for time step width diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 8226c596..4c528b2d 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -60,16 +60,16 @@ void Boundary::setPressureBoundarySurface(int i, int j){ void Boundary::setPressureBoundaryObstacle(int i, int j){ switch((*mask_)(i, j)){ - case Mask::DOMAIN_LEFT: + case Mask::DOMAIN_LEFT_NOSLIP: discretization_->p(i, j) = discretization_->p(i + 1, j); break; - case Mask::DOMAIN_TOP: + case Mask::DOMAIN_TOP_NOSLIP: discretization_->p(i, j) = discretization_->p(i, j - 1); break; - case Mask::DOMAIN_RIGHT: + case Mask::DOMAIN_RIGHT_NOSLIP: discretization_->p(i, j) = discretization_->p(i - 1, j); break; - case Mask::DOMAIN_BOTTOM: + case Mask::DOMAIN_BOTTOM_NOSLIP: discretization_->p(i, j) = discretization_->p(i, j + 1); break; } @@ -153,16 +153,16 @@ void Boundary::setVelocityBoundarySurfaceV(int i, int j){ void Boundary::setVelocityBoundaryObstacleU(int i, int j){ switch ((*mask_)(i, j)) { - case Mask::DOMAIN_LEFT: + case Mask::DOMAIN_LEFT_NOSLIP: discretization_->u(i, j) = settings_.NoSlipVelLeft[0]; break; - case Mask::DOMAIN_TOP: + case Mask::DOMAIN_TOP_NOSLIP: discretization_->u(i, j) = 2 * settings_.NoSlipVelTop[0] - discretization_->u(i, j - 1); break; - case Mask::DOMAIN_RIGHT: + case Mask::DOMAIN_RIGHT_NOSLIP: discretization_->u(i - 1, j) = settings_.NoSlipVelRight[0]; // index shift for u in x direction break; - case Mask::DOMAIN_BOTTOM: + case Mask::DOMAIN_BOTTOM_NOSLIP: discretization_->u(i, j) = 2 * settings_.NoSlipVelBottom[0] - discretization_->u(i, j + 1); break; } @@ -191,16 +191,16 @@ void Boundary::setVelocityBoundaryObstacleV(int i, int j){ switch ((*mask_)(i, j)) { - case Mask::DOMAIN_LEFT: + case Mask::DOMAIN_LEFT_NOSLIP: discretization_->v(i, j) = 2 * settings_.NoSlipVelLeft[1] - discretization_->v(i + 1, j); break; - case Mask::DOMAIN_TOP: + case Mask::DOMAIN_TOP_NOSLIP: discretization_->v(i, j - 1) = settings_.NoSlipVelTop[1]; // index shift for v in y direction break; - case Mask::DOMAIN_RIGHT: + case Mask::DOMAIN_RIGHT_NOSLIP: discretization_->v(i, j) = 2 * settings_.NoSlipVelRight[1] - discretization_->v(i - 1, j); break; - case Mask::DOMAIN_BOTTOM: + case Mask::DOMAIN_BOTTOM_NOSLIP: discretization_->v(i, j) = settings_.NoSlipVelBottom[1]; break; } diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index 266035cf..05faf277 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -1,21 +1,25 @@ #include "mask.h" -Mask::Mask(std::array size, Settings settings) : size_({size[0] + 2, size[1] + 2}), settings_(settings) +Mask::Mask(Settings settings) : settings_(settings) { - assert(size[0] > 0 && size[1] > 0); + assert(settings_.nCells[0] > 0 && settings_.nCells[1] > 0); + size_ = {settings_.nCells[0] + 2, settings_.nCells[1] + 2}; data_.resize(size_[0] * size_[1], FLUID); - // Set domain boundaries to obstacle - for (int i = 0; i < size_[0]; i++) + printMask(); + if (settings_.createRectangularObject) { - data_[i] = DOMAIN_BOUNDARY; - data_[i + (size_[1] - 1) * size_[0]] = DOMAIN_BOUNDARY; - } - for (int j = 0; j < size_[1]; j++) - { - data_[j * size_[0]] = DOMAIN_BOUNDARY; - data_[(size_[0] - 1) + j * size_[0]] = DOMAIN_BOUNDARY; + Mask::makeRectangularObstacle(); } + std::cout << "\n\n\n"; + + printMask(); + + setDomainBoundary(); + + std::cout << "\n\n\n"; + + printMask(); } int &Mask::operator()(int i, int j) @@ -129,56 +133,80 @@ int Mask::getNumberOfFluidCells() const // P R I M I T I V E S // ************************ -void Mask::makeRectangularObstacle(std::array physicalSize_, - std::array obstaclePosition_, - std::array obstacleSize_) +void Mask::makeRectangularObstacle() { - // only works for global size {1.0; 1.0} - // should work with changing factor from `obstaclePosition_` to `obstaclePosition_[0]/globalSize_[0]` - double scaleX = obstaclePosition_[0] / physicalSize_[0]; - double scaleY = obstaclePosition_[1] / physicalSize_[1]; + double scaleX = settings_.obstaclePosition[0] / settings_.physicalSize[0]; + double scaleY = settings_.obstaclePosition[1] / settings_.physicalSize[1]; int nCellsX = size_[0] - 2; int nCellsY = size_[1] - 2; int i_beg = static_cast(std::floor(scaleX * nCellsX)) + 1; - int i_end = static_cast(std::ceil((obstaclePosition_[0] + obstacleSize_[0]) / physicalSize_[0] * nCellsX)) + 1; + int i_end = static_cast(std::ceil((settings_.obstaclePosition[0] + settings_.obstacleDimension[0]) / settings_.physicalSize[0] * nCellsX)) + 1; int j_beg = static_cast(std::floor(scaleY * nCellsY)) + 1; - int j_end = static_cast(std::ceil((obstaclePosition_[1] + obstacleSize_[1]) / physicalSize_[1] * nCellsY)) + 1; + int j_end = static_cast(std::ceil((settings_.obstaclePosition[1] + settings_.obstacleDimension[1]) / settings_.physicalSize[1] * nCellsY)) + 1; - std::cout << i_beg << " from obstacle Position" << obstaclePosition_[0] << " and size " << size_[0] - 2 << std::endl; - std::cout << i_end << " from obstacle Size " << obstacleSize_[0] << " and size " << size_[0] - 2 << std::endl; - // interior obstacle - for (int i = i_beg + 1; i < i_end - 1; i++) + std::cout << i_beg << " from obstacle Position" << settings_.obstaclePosition[0] << " and size " << size_[0] - 2 << std::endl; + std::cout << i_end << " from obstacle Size " << settings_.obstacleDimension[0] << " and size " << size_[0] - 2 << std::endl; + + for (int i = i_beg; i < i_end; i++) { - for (int j = j_beg + 1; j < j_end - 1; j++) + for (int j = j_beg; j < j_end; j++) { data_[i + j * size_[0]] = OBSTACLE; } } - // boundary obstacle - data_[i_beg + j_beg * size_[0]] = OBSTACLE; // OBSTACLE_CORNER_BOTTOM_LEFT; - data_[i_beg + (j_end - 1) * size_[0]] = OBSTACLE; // OBSTACLE_CORNER_TOP_LEFT; - data_[(i_end - 1) + j_beg * size_[0]] = OBSTACLE; // OBSTACLE_CORNER_BOTTOM_RIGHT; - data_[(i_end - 1) + (j_end - 1) * size_[0]] = OBSTACLE; // OBSTACLE_CORNER_TOP_RIGHT; +}; - for (int i = i_beg + 1; i < i_end - 1; i++) - { - data_[i + j_beg * size_[0]] = OBSTACLE; // OBSTACLE_BORDER_BOTTOM; - data_[i + (j_end - 1) * size_[0]] = OBSTACLE; // OBSTACLE_BORDER_TOP; - } - for (int j = j_beg + 1; j < j_end - 1; j++) +void Mask::setDomainBoundary() +{ + // Set domain boundaries + + for (int i = 0; i < size_[0]; i++) { - data_[i_beg + j * size_[0]] = OBSTACLE; // OBSTACLE_BORDER_LEFT; - data_[(i_end - 1) + j * size_[0]] = OBSTACLE; // OBSTACLE_BORDER_RIGHT; + // Bottom Domain Boundary + if (data_[i+size_[0]] == OBSTACLE) + data_[i] = OBSTACLE_INSIDE; + else if (settings_.BCBottom == "NoSlip") + data_[i] = DOMAIN_BOTTOM_NOSLIP; + else if (settings_.BCBottom == "Pressure") + data_[i] = DOMAIN_BOTTOM_PRESSURE; + + + // Top Domain Boundary + if (data_[i + (size_[1] - 2) * size_[0]] == OBSTACLE) + data_[i + (size_[1] - 1) * size_[0]] = OBSTACLE_INSIDE; + else if (settings_.BCTop == "NoSlip") + data_[i + (size_[1] - 1) * size_[0]] = DOMAIN_TOP_NOSLIP; + else if (settings_.BCTop == "Pressure") + data_[i + (size_[1] - 1) * size_[0]] = DOMAIN_TOP_PRESSURE; + } + + for (int j = 0; j < size_[1]; j++) + { + // Left Domain Boundary + if (data_[j * size_[0]+1] == OBSTACLE) + data_[j * size_[0]] = OBSTACLE_INSIDE; + else if (settings_.BCLeft == "NoSlip") + data_[j * size_[0]] = DOMAIN_LEFT_NOSLIP; + else if (settings_.BCLeft == "Pressure") + data_[j * size_[0]] = DOMAIN_LEFT_PRESSURE; + + // Right Domain Boundary + if (data_[(size_[0] - 2) + j * size_[0]] == OBSTACLE) + data_[(size_[0] - 1) + j * size_[0]] = OBSTACLE_INSIDE; + else if (settings_.BCRight == "NoSlip") + data_[(size_[0] - 1) + j * size_[0]] = DOMAIN_RIGHT_NOSLIP; + else if (settings_.BCRight == "Pressure") + data_[(size_[0] - 1) + j * size_[0]] = DOMAIN_RIGHT_PRESSURE; } - // TODO: think of edges -}; + data_[0] = OBSTACLE_INSIDE; + data_[size_[0]-1] = OBSTACLE_INSIDE; + data_[0+size_[0]*(size_[1]-1)] = OBSTACLE_INSIDE; + data_[size_[0]-1+size_[0]*(size_[1]-1)] = OBSTACLE_INSIDE; + -void Mask::setDomainBoundary(std::string domainBoundary_left, std::string domainBoundary_right, std::string domainBoundary_top, std::string domainBoundary_bot) -{ - int i = 0; } // ****************************** diff --git a/src/boundary/mask.h b/src/boundary/mask.h index b5d2e31b..e82ac44e 100644 --- a/src/boundary/mask.h +++ b/src/boundary/mask.h @@ -19,7 +19,7 @@ class Mask{ * * @param size size of array in x and y direction */ - Mask(std::array size, Settings settings); + Mask(Settings settings); @@ -51,6 +51,7 @@ enum CellType{ AIR = 64, OBSTACLE = 100, + OBSTACLE_INSIDE = 101, OBSTACLE_BORDER_LEFT = 110, OBSTACLE_BORDER_TOP = 111, @@ -62,12 +63,18 @@ enum CellType{ OBSTACLE_CORNER_TOP_RIGHT = 122, OBSTACLE_CORNER_BOTTOM_RIGHT = 123, + DOMAIN_BOUNDARY = 130, - DOMAIN_LEFT = 131, - DOMAIN_TOP = 132, - DOMAIN_RIGHT = 133, - DOMAIN_BOTTOM = 134, + DOMAIN_LEFT_NOSLIP = 131, + DOMAIN_TOP_NOSLIP = 132, + DOMAIN_RIGHT_NOSLIP = 133, + DOMAIN_BOTTOM_NOSLIP = 134, + + DOMAIN_LEFT_PRESSURE = 135, + DOMAIN_TOP_PRESSURE = 136, + DOMAIN_RIGHT_PRESSURE = 137, + DOMAIN_BOTTOM_PRESSURE = 138, }; @@ -188,11 +195,9 @@ enum CellType{ * @param obstaclePosition_ position of lower left corner * @param obstacleSize_ length and width of the rectangle */ - void makeRectangularObstacle(std::array physicalSize_, - std::array obstaclePosition_, - std::array obstacleSize_); + void makeRectangularObstacle(); - void setDomainBoundary(std::string domainBoundary_left, std::string domainBoundary_right, std::string domainBoundary_top, std::string domainBoundary_bot); + void setDomainBoundary(); @@ -208,7 +213,7 @@ enum CellType{ protected: - const std::array size_; //!< size of array in x and y direction + std::array size_; //!< size of array in x and y direction std::vector data_; //!< storage array values, in row-major order std::vector boundary_list; //!< stores the indices of the boundary cells Settings settings_; diff --git a/src/computation.cpp b/src/computation.cpp index b414b1eb..7321c52d 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -24,9 +24,7 @@ void Computation::initialize(int argc, char *argv[]) } // create boundary and tracer - mask_ = std::make_shared(settings_.nCells, settings_); - mask_->makeRectangularObstacle(settings_.physicalSize, {0.5, 0.5}, {0.5, 0.5}); - mask_->printMask(); + mask_ = std::make_shared(settings_); std::vector traceX = {1.8}; std::vector traceY = {1.8}; diff --git a/src/settings_parser/settings.cpp b/src/settings_parser/settings.cpp index ad4dd08c..d6a92d36 100644 --- a/src/settings_parser/settings.cpp +++ b/src/settings_parser/settings.cpp @@ -114,25 +114,25 @@ void Settings::setParameter(std::string parameterName, std::string value) // // Boundary conditions type else if (parameterName == "BCTop"){ if (value == "NoSlip" || value == "Pressure") - Settings::pressureSolver = value; + Settings::BCTop = value; else throw std::invalid_argument("Supported values for BCTop are NoSlip and Pressure."); } else if (parameterName == "BCRight"){ if (value == "NoSlip" || value == "Pressure") - Settings::pressureSolver = value; + Settings::BCRight = value; else throw std::invalid_argument("Supported values for BCRight are NoSlip and Pressure."); } else if (parameterName == "BCBottom"){ if (value == "NoSlip" || value == "Pressure") - Settings::pressureSolver = value; + Settings::BCBottom = value; else throw std::invalid_argument("Supported values for BCBottom are NoSlip and Pressure."); } else if (parameterName == "BCLeft"){ if (value == "NoSlip" || value == "Pressure") - Settings::pressureSolver = value; + Settings::BCLeft = value; else throw std::invalid_argument("Supported values for BCLeft are NoSlip and Pressure."); } @@ -165,6 +165,26 @@ void Settings::setParameter(std::string parameterName, std::string value) else if (parameterName == "PressureLeft") Settings::PressureLeft = atof(value.c_str()); + + // Rectangular object in domain + else if (parameterName == "createRectangularObject") + { + if (value == "true" || value == "True") + Settings::createRectangularObject = true; + else if (value == "false" || value == "False") + Settings::createRectangularObject = false; + else + throw std::invalid_argument("createRectangularObject must be a boolean (true or false)."); + } + else if (parameterName == "obstaclePositionX"){ + Settings::obstaclePosition[0] = atof(value.c_str()); + } + else if (parameterName == "obstaclePositionY") + Settings::obstaclePosition[1] = atof(value.c_str()); + else if (parameterName == "obstacleDimensionX") + Settings::obstacleDimension[0] = atof(value.c_str()); + else if (parameterName == "obstacleDimensionY") + Settings::obstacleDimension[1] = atof(value.c_str()); // Discretization parameters else if (parameterName == "nCellsX") diff --git a/src/settings_parser/settings.h b/src/settings_parser/settings.h index ddcb9578..2a30c5a9 100644 --- a/src/settings_parser/settings.h +++ b/src/settings_parser/settings.h @@ -27,7 +27,7 @@ struct Settings // Boundary Conditions Type std::string BCTop = "NoSlip"; std::string BCRight = "NoSlip"; - std::string BCBotom = "NoSlip"; + std::string BCBottom = "NoSlip"; std::string BCLeft = "NoSlip"; // NoSlip boundary conditions @@ -37,10 +37,16 @@ struct Settings std::array NoSlipVelLeft; //!< prescribed values of u,v at left of domain // Pressure boundary conditions - double PressureTop; //!< prescribed pressure BC top of domain - double PressureRight; //!< prescribed pressure BC right of domain - double PressureBottom; //!< prescribed pressure BC bottom of domain - double PressureLeft; //!< prescribed pressure BC left of domain + double PressureTop; //!< prescribed pressure BC top of domain + double PressureRight; //!< prescribed pressure BC right of domain + double PressureBottom; //!< prescribed pressure BC bottom of domain + double PressureLeft; //!< prescribed pressure BC left of domain + + // Create rectangular obstacle in domain + bool createRectangularObject = false; //!< wheter a rectangular object in domain should be created + + std::array obstaclePosition; //!< x and y position of rectangular object + std::array obstacleDimension; //!< x and y dimension of rectangular object std::string pressureSolver = "SOR"; //!< which pressure solver to use, "GaussSeidel" or "SOR" double omega = 1.0; //!< overrelaxation factor From 52e089e40127c7c26ac46fb490fa803e8215cd57 Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Tue, 30 Jan 2024 18:11:35 +0100 Subject: [PATCH 22/67] added boundary conditions obstacle fluid to mask --- input/settings_debug.txt | 4 ++-- src/boundary/mask.cpp | 27 +++++++++++++++++--------- src/boundary/mask.h | 42 +++++++++++++++++++++------------------- 3 files changed, 42 insertions(+), 31 deletions(-) diff --git a/input/settings_debug.txt b/input/settings_debug.txt index c5294796..4d50e466 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -12,9 +12,9 @@ gY = 0.0 # Boundary Conditions Type -BCTop = Pressure +BCTop = NoSlip BCRight = NoSlip -BCBottom = Pressure +BCBottom = NoSlip BCLeft = NoSlip diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index 05faf277..00441928 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -6,18 +6,12 @@ Mask::Mask(Settings settings) : settings_(settings) size_ = {settings_.nCells[0] + 2, settings_.nCells[1] + 2}; data_.resize(size_[0] * size_[1], FLUID); - printMask(); if (settings_.createRectangularObject) { Mask::makeRectangularObstacle(); } - std::cout << "\n\n\n"; - - printMask(); - - setDomainBoundary(); - - std::cout << "\n\n\n"; + setDomainBC(); + setObstacleBC(); printMask(); } @@ -158,7 +152,7 @@ void Mask::makeRectangularObstacle() } }; -void Mask::setDomainBoundary() +void Mask::setDomainBC() { // Set domain boundaries @@ -206,9 +200,24 @@ void Mask::setDomainBoundary() data_[0+size_[0]*(size_[1]-1)] = OBSTACLE_INSIDE; data_[size_[0]-1+size_[0]*(size_[1]-1)] = OBSTACLE_INSIDE; +} +void Mask::setObstacleBC(){ + for (int i = 0; i < size_[0]; i++){ + for(int j=0; j< size_[1]; j ++){ + if ((*this)(i,j) == OBSTACLE){ + int BC = 1*Mask::isFluid(i-1,j)+2*Mask::isFluid(i,j+1)+4*Mask::isFluid(i+1,j)+8*Mask::isFluid(i,j-1)+100; + bool BCinForbiddenCombinations = std::find(std::begin(forbiddenObstacleFluidCombinations), std::end(forbiddenObstacleFluidCombinations), BC) != std::end(forbiddenObstacleFluidCombinations); + if (BCinForbiddenCombinations) + throw std::runtime_error("Obstacel is only one cell wide at i: " + std::to_string(i) + "j: " + std::to_string(j)); + else + (*this)(i,j) = BC; + } + } + } } + // ****************************** // P R I N T I N G // ****************************** diff --git a/src/boundary/mask.h b/src/boundary/mask.h index e82ac44e..fb03ddc8 100644 --- a/src/boundary/mask.h +++ b/src/boundary/mask.h @@ -50,31 +50,31 @@ enum CellType{ FLUID_TYPE = 50, AIR = 64, - OBSTACLE = 100, - OBSTACLE_INSIDE = 101, + OBSTACLE = 99, + OBSTACLE_INSIDE = 100, - OBSTACLE_BORDER_LEFT = 110, - OBSTACLE_BORDER_TOP = 111, - OBSTACLE_BORDER_RIGHT = 112, - OBSTACLE_BORDER_BOTTOM = 113, + OBSTACLE_BORDER_LEFT = 101, + OBSTACLE_BORDER_TOP = 102, + OBSTACLE_CORNER_TOP_LEFT = 103, + OBSTACLE_BORDER_RIGHT = 104, + OBSTACLE_CORNER_TOP_RIGHT = 106, + OBSTACLE_BORDER_BOTTOM = 108, + OBSTACLE_CORNER_BOTTOM_LEFT = 109, + OBSTACLE_CORNER_BOTTOM_RIGHT = 112, - OBSTACLE_CORNER_BOTTOM_LEFT = 120, - OBSTACLE_CORNER_TOP_LEFT = 121, - OBSTACLE_CORNER_TOP_RIGHT = 122, - OBSTACLE_CORNER_BOTTOM_RIGHT = 123, - DOMAIN_BOUNDARY = 130, + DOMAIN_BOUNDARY = 200, - DOMAIN_LEFT_NOSLIP = 131, - DOMAIN_TOP_NOSLIP = 132, - DOMAIN_RIGHT_NOSLIP = 133, - DOMAIN_BOTTOM_NOSLIP = 134, + DOMAIN_LEFT_NOSLIP = 201, + DOMAIN_TOP_NOSLIP = 202, + DOMAIN_RIGHT_NOSLIP = 203, + DOMAIN_BOTTOM_NOSLIP = 204, - DOMAIN_LEFT_PRESSURE = 135, - DOMAIN_TOP_PRESSURE = 136, - DOMAIN_RIGHT_PRESSURE = 137, - DOMAIN_BOTTOM_PRESSURE = 138, + DOMAIN_LEFT_PRESSURE = 205, + DOMAIN_TOP_PRESSURE = 206, + DOMAIN_RIGHT_PRESSURE = 207, + DOMAIN_BOTTOM_PRESSURE = 208, }; @@ -197,7 +197,8 @@ enum CellType{ */ void makeRectangularObstacle(); - void setDomainBoundary(); + void setDomainBC(); + void setObstacleBC(); @@ -217,4 +218,5 @@ enum CellType{ std::vector data_; //!< storage array values, in row-major order std::vector boundary_list; //!< stores the indices of the boundary cells Settings settings_; + int forbiddenObstacleFluidCombinations[7] = {105,107,110,111,113,114,115}; }; \ No newline at end of file From c86e052f4b096d1576a5e48db695ad70c4f3b040 Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Fri, 2 Feb 2024 10:52:45 +0100 Subject: [PATCH 23/67] added functoin to read in Bitmaps --- input/settings_debug.txt | 6 +- src/CMakeLists.txt | 6 +- src/boundary/mask.cpp | 162 ++++++++++++++++++++++++------- src/boundary/mask.h | 2 + src/settings_parser/settings.cpp | 13 +++ src/settings_parser/settings.h | 4 + 6 files changed, 157 insertions(+), 36 deletions(-) diff --git a/input/settings_debug.txt b/input/settings_debug.txt index 4d50e466..5c64d981 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -39,13 +39,17 @@ PressureLeft = 100.0 # Create Rectangular object in domain -createRectangularObject = true +createRectangularObject = false obstaclePositionX = 0.5 obstaclePositionY = 0.5 obstacleDimensionX = 0.5 obstacleDimensionY = 0.5 +# Create domain from PNGBitmap + +createDomainfromBitmap = true +pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/test.png # Discretization parameters nCellsX = 10 # number of cells in x and y direction diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ac34f7e1..666d583e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -36,12 +36,14 @@ add_executable(${PROJECT_NAME} # Add the project directory to include directories, # to be able to include all project header files from anywhere -target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR}) +target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR} ${PNG_INCLUDE_DIRS}) # Search for the external package "VTK" find_package(VTK) +find_package(PNG REQUIRED) + # Output various cmake variables for demonstration purpose message("If VTK was found on the system: VTK_FOUND: ${VTK_FOUND}") message("The directory of VTK: VTK_DIR: ${VTK_DIR}") @@ -50,7 +52,7 @@ message("The include directory of VTK: VTK_INCLUDE_DIRS: ${VTK_INCLUDE_DIRS}") # If an installation of vtk was found on the system if (VTK_FOUND) include_directories(${VTK_INCLUDE_DIRS}) # add the include directory where the header files are for the compiler - target_link_libraries(${PROJECT_NAME} ${VTK_LIBRARIES}) # add the libraries for the linker + target_link_libraries(${PROJECT_NAME} ${VTK_LIBRARIES} ${PNG_LIBRARIES}) # add the libraries for the linker endif(VTK_FOUND) # install numsim executable in build directory diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index 00441928..e137a569 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -2,18 +2,21 @@ Mask::Mask(Settings settings) : settings_(settings) { - assert(settings_.nCells[0] > 0 && settings_.nCells[1] > 0); - size_ = {settings_.nCells[0] + 2, settings_.nCells[1] + 2}; - data_.resize(size_[0] * size_[1], FLUID); - - if (settings_.createRectangularObject) + if (settings_.createDomainfromBitmap) + createMaskFromPNGBitMap(); + else { - Mask::makeRectangularObstacle(); + assert(settings_.nCells[0] > 0 && settings_.nCells[1] > 0); + size_ = {settings_.nCells[0] + 2, settings_.nCells[1] + 2}; + data_.resize(size_[0] * size_[1], FLUID); } - setDomainBC(); - setObstacleBC(); + if (settings_.createRectangularObject) + makeRectangularObstacle(); + + setDomainBC(); printMask(); + setObstacleBC(); } int &Mask::operator()(int i, int j) @@ -142,7 +145,7 @@ void Mask::makeRectangularObstacle() std::cout << i_beg << " from obstacle Position" << settings_.obstaclePosition[0] << " and size " << size_[0] - 2 << std::endl; std::cout << i_end << " from obstacle Size " << settings_.obstacleDimension[0] << " and size " << size_[0] - 2 << std::endl; - + for (int i = i_beg; i < i_end; i++) { for (int j = j_beg; j < j_end; j++) @@ -152,34 +155,120 @@ void Mask::makeRectangularObstacle() } }; +void Mask::createMaskFromPNGBitMap() +{ + const char *file_path = settings_.pathToBitmap.c_str(); + FILE *fp = fopen(file_path, "rb"); + if (!fp) + abort(); + + png_structp png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png) + abort(); + + png_infop info = png_create_info_struct(png); + if (!info) + abort(); + + if (setjmp(png_jmpbuf(png))) + abort(); + + png_init_io(png, fp); + + png_read_info(png, info); + + int width = png_get_image_width(png, info); + int height = png_get_image_height(png, info); + png_byte color_type = png_get_color_type(png, info); + png_byte bit_depth = png_get_bit_depth(png, info); + + std::cout << "Width: " << width << ", Height: " << height << std::endl; + + size_ = {width + 2, height + 2}; + data_.resize(size_[0] * size_[1], FLUID); + + if (bit_depth == 16) + png_set_strip_16(png); + if (color_type == PNG_COLOR_TYPE_PALETTE) + png_set_palette_to_rgb(png); + if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) + png_set_expand_gray_1_2_4_to_8(png); + if (png_get_valid(png, info, PNG_INFO_tRNS)) + png_set_tRNS_to_alpha(png); + + if (color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_PALETTE) + png_set_filler(png, 0xFF, PNG_FILLER_AFTER); + + if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_gray_to_rgb(png); + + png_read_update_info(png, info); + + png_bytep *row_pointers = new png_bytep[height]; + for (int y = 0; y < height; y++) + row_pointers[y] = new png_byte[png_get_rowbytes(png, info)]; + + png_read_image(png, row_pointers); + + fclose(fp); + + // Iterate over each pixel + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + { + png_byte *pixel = &row_pointers[y][x * 4]; // Assuming RGBA format + + int red = pixel[0]; + int green = pixel[1]; + int blue = pixel[2]; + + // Black pixel + if (red == 0 && green == 0 && blue == 0) + (*this)(x+1,height-y) = OBSTACLE; + //White pixel + else if (red == 255 && green == 255 && blue == 255) + (*this)(x+1,height-y) = AIR; + // Blue pixel + else + (*this)(x+1,height-y) = FLUID; + } + } + + // Clean up + for (int y = 0; y < height; y++) + delete[] row_pointers[y]; + delete[] row_pointers; +} + void Mask::setDomainBC() { // Set domain boundaries - + for (int i = 0; i < size_[0]; i++) { // Bottom Domain Boundary - if (data_[i+size_[0]] == OBSTACLE) + if (data_[i + size_[0]] != FLUID) data_[i] = OBSTACLE_INSIDE; else if (settings_.BCBottom == "NoSlip") data_[i] = DOMAIN_BOTTOM_NOSLIP; else if (settings_.BCBottom == "Pressure") data_[i] = DOMAIN_BOTTOM_PRESSURE; - // Top Domain Boundary - if (data_[i + (size_[1] - 2) * size_[0]] == OBSTACLE) + if (data_[i + (size_[1] - 2) * size_[0]] != FLUID) data_[i + (size_[1] - 1) * size_[0]] = OBSTACLE_INSIDE; else if (settings_.BCTop == "NoSlip") data_[i + (size_[1] - 1) * size_[0]] = DOMAIN_TOP_NOSLIP; else if (settings_.BCTop == "Pressure") data_[i + (size_[1] - 1) * size_[0]] = DOMAIN_TOP_PRESSURE; - } + } for (int j = 0; j < size_[1]; j++) - { + { // Left Domain Boundary - if (data_[j * size_[0]+1] == OBSTACLE) + if (data_[j * size_[0] + 1] != FLUID) data_[j * size_[0]] = OBSTACLE_INSIDE; else if (settings_.BCLeft == "NoSlip") data_[j * size_[0]] = DOMAIN_LEFT_NOSLIP; @@ -187,7 +276,7 @@ void Mask::setDomainBC() data_[j * size_[0]] = DOMAIN_LEFT_PRESSURE; // Right Domain Boundary - if (data_[(size_[0] - 2) + j * size_[0]] == OBSTACLE) + if (data_[(size_[0] - 2) + j * size_[0]] != FLUID) data_[(size_[0] - 1) + j * size_[0]] = OBSTACLE_INSIDE; else if (settings_.BCRight == "NoSlip") data_[(size_[0] - 1) + j * size_[0]] = DOMAIN_RIGHT_NOSLIP; @@ -195,29 +284,36 @@ void Mask::setDomainBC() data_[(size_[0] - 1) + j * size_[0]] = DOMAIN_RIGHT_PRESSURE; } + // corners of domain data_[0] = OBSTACLE_INSIDE; - data_[size_[0]-1] = OBSTACLE_INSIDE; - data_[0+size_[0]*(size_[1]-1)] = OBSTACLE_INSIDE; - data_[size_[0]-1+size_[0]*(size_[1]-1)] = OBSTACLE_INSIDE; - + data_[size_[0] - 1] = OBSTACLE_INSIDE; + data_[0 + size_[0] * (size_[1] - 1)] = OBSTACLE_INSIDE; + data_[size_[0] - 1 + size_[0] * (size_[1] - 1)] = OBSTACLE_INSIDE; } -void Mask::setObstacleBC(){ - for (int i = 0; i < size_[0]; i++){ - for(int j=0; j< size_[1]; j ++){ - if ((*this)(i,j) == OBSTACLE){ - int BC = 1*Mask::isFluid(i-1,j)+2*Mask::isFluid(i,j+1)+4*Mask::isFluid(i+1,j)+8*Mask::isFluid(i,j-1)+100; - bool BCinForbiddenCombinations = std::find(std::begin(forbiddenObstacleFluidCombinations), std::end(forbiddenObstacleFluidCombinations), BC) != std::end(forbiddenObstacleFluidCombinations); - if (BCinForbiddenCombinations) - throw std::runtime_error("Obstacel is only one cell wide at i: " + std::to_string(i) + "j: " + std::to_string(j)); - else - (*this)(i,j) = BC; - } +void Mask::setObstacleBC() +{ + for (int i = 0; i < size_[0]; i++) + { + for (int j = 0; j < size_[1]; j++) + { + if ((*this)(i, j) == OBSTACLE) + { + int BC = 1 * Mask::isFluid(i - 1, j) + 2 * Mask::isFluid(i, j + 1) + 4 * Mask::isFluid(i + 1, j) + 8 * Mask::isFluid(i, j - 1) + 100; + bool BCinForbiddenCombinations = std::find(std::begin(forbiddenObstacleFluidCombinations), std::end(forbiddenObstacleFluidCombinations), BC) != std::end(forbiddenObstacleFluidCombinations); + if (Mask::isAir(i - 1, j) && Mask::isAir(i + 1, j)) + throw std::runtime_error("Obstacel is only one cell wide at i: " + std::to_string(i) + "j: " + std::to_string(j)); + else if (Mask::isAir(i, j + 1) && Mask::isAir(i, j - 1)) + throw std::runtime_error("Obstacel is only one cell wide at i: " + std::to_string(i) + "j: " + std::to_string(j)); + else if (BCinForbiddenCombinations) + throw std::runtime_error("Obstacel is only one cell wide at i: " + std::to_string(i) + "j: " + std::to_string(j)); + else + (*this)(i, j) = BC; } } + } } - // ****************************** // P R I N T I N G // ****************************** diff --git a/src/boundary/mask.h b/src/boundary/mask.h index fb03ddc8..fd1bea2b 100644 --- a/src/boundary/mask.h +++ b/src/boundary/mask.h @@ -6,6 +6,7 @@ #include #include +#include #include #include #include "../settings_parser/settings.h" @@ -196,6 +197,7 @@ enum CellType{ * @param obstacleSize_ length and width of the rectangle */ void makeRectangularObstacle(); + void createMaskFromPNGBitMap(); void setDomainBC(); void setObstacleBC(); diff --git a/src/settings_parser/settings.cpp b/src/settings_parser/settings.cpp index d6a92d36..30a5138a 100644 --- a/src/settings_parser/settings.cpp +++ b/src/settings_parser/settings.cpp @@ -186,6 +186,19 @@ void Settings::setParameter(std::string parameterName, std::string value) else if (parameterName == "obstacleDimensionY") Settings::obstacleDimension[1] = atof(value.c_str()); + // Domain from Bitmap + else if (parameterName == "createDomainfromBitmap") + { + if (value == "true" || value == "True") + Settings::createDomainfromBitmap = true; + else if (value == "false" || value == "False") + Settings::createDomainfromBitmap = false; + else + throw std::invalid_argument("createDomainfromBitmap must be a boolean (true or false)."); + } + else if (parameterName == "pathToBitmap") + Settings::pathToBitmap = value; + // Discretization parameters else if (parameterName == "nCellsX") Settings::nCells[0] = atoi(value.c_str()); diff --git a/src/settings_parser/settings.h b/src/settings_parser/settings.h index 2a30c5a9..1def45c5 100644 --- a/src/settings_parser/settings.h +++ b/src/settings_parser/settings.h @@ -45,6 +45,10 @@ struct Settings // Create rectangular obstacle in domain bool createRectangularObject = false; //!< wheter a rectangular object in domain should be created + // Create domain from PNGBitmap + bool createDomainfromBitmap = false; //!< wheter domain should be created from bitmap + std::string pathToBitmap; //!< path to bitmap + std::array obstaclePosition; //!< x and y position of rectangular object std::array obstacleDimension; //!< x and y dimension of rectangular object From 82712f5e81146f27e0f3542672d3fb76ca696993 Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Fri, 2 Feb 2024 19:09:44 +0100 Subject: [PATCH 24/67] implemented boundary conditions --- input/settings_debug.txt | 2 +- src/boundary/boundary.cpp | 419 ++++++++++++++++++++++++++------------ src/boundary/boundary.h | 9 + src/boundary/mask.cpp | 20 +- src/boundary/mask.h | 3 + 5 files changed, 318 insertions(+), 135 deletions(-) diff --git a/input/settings_debug.txt b/input/settings_debug.txt index 5c64d981..9be40483 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -49,7 +49,7 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap createDomainfromBitmap = true -pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/test.png +pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/legal_water.png # Discretization parameters nCellsX = 10 # number of cells in x and y direction diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 4c528b2d..093f1dc2 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -4,78 +4,253 @@ Boundary::Boundary(std::shared_ptr mask, std::shared_ptr discretization, Settings settings) : mask_(mask), discretization_(discretization), settings_(settings) { + createBoundaryCellsLists(); + // for (int i = 0; i < mask_->size()[0]; i++) + // { + // for (int j = 0; j < mask_->size()[1]; j++) + // { + // if (mask_->isBorder(i, j)) + // { + // boundaryCells_.push_back(i + j * mask_->size()[0]); + // } + // } + // } + // #ifndef NDEBUG + // mask_->printMask(); + // #endif +} +void Boundary::createBoundaryCellsLists() +{ for (int i = 0; i < mask_->size()[0]; i++) { for (int j = 0; j < mask_->size()[1]; j++) { - if (mask_->isBorder(i, j)) - { - boundaryCells_.push_back(i + j * mask_->size()[0]); - } + if (mask_->isDomainBoundary(i, j)) + DomainBoundaryCells_.push_back(i + j * mask_->size()[0]); + if (mask_->isObstacleBoundary(i, j)) + ObstacleBoundaryCells_.push_back(i + j * mask_->size()[0]); } } - #ifndef NDEBUG - mask_->printMask(); - #endif } -int Boundary::getNumberOfBoundaryCells() const { - return boundaryCells_.size(); +void Boundary::setPressureBoundaryValues() +{ + setPressureDomainBC(); + setPressureObstacleBC(); } -void Boundary::setPressureBoundaryValues(){ - for (int idx : boundaryCells_) +void Boundary::setPressureDomainBC() +{ + for (int idx : DomainBoundaryCells_) { int i = idx % mask_->size()[0]; int j = idx / mask_->size()[0]; - - if (mask_->isFluid(i, j)) + switch ((*mask_)(i, j)) { - setPressureBoundarySurface(i, j); + case Mask::DOMAIN_LEFT_NOSLIP: + discretization_->p(i, j) = discretization_->p(i + 1, j); + case Mask::DOMAIN_TOP_NOSLIP: + discretization_->p(i, j) = discretization_->p(i, j - 1); + case Mask::DOMAIN_RIGHT_NOSLIP: + discretization_->p(i, j) = discretization_->p(i - 1, j); + case Mask::DOMAIN_BOTTOM_NOSLIP: + discretization_->p(i, j) = discretization_->p(i, j + 1); + case Mask::DOMAIN_LEFT_PRESSURE: + break; + case Mask::DOMAIN_TOP_PRESSURE: + break; + case Mask::DOMAIN_RIGHT_PRESSURE: + break; + case Mask::DOMAIN_BOTTOM_PRESSURE: + break; } - else if (mask_->isObstacle(i, j)) + } +} + +void Boundary::setPressureObstacleBC() +{ + for (int idx : ObstacleBoundaryCells_) + { + int i = idx % mask_->size()[0]; + int j = idx / mask_->size()[0]; + switch ((*mask_)(i, j)) { - setPressureBoundaryObstacle(i, j); + case Mask::OBSTACLE_BORDER_LEFT: + discretization_->p(i, j) = discretization_->p(i - 1, j); + case Mask::OBSTACLE_BORDER_TOP: + discretization_->p(i, j) = discretization_->p(i, j + 1); + case Mask::OBSTACLE_CORNER_TOP_LEFT: + discretization_->p(i, j) = 0.5 * (discretization_->p(i - 1, j) + discretization_->p(i, j + 1)); + case Mask::OBSTACLE_BORDER_RIGHT: + discretization_->p(i, j) = discretization_->p(i + 1, j);; + case Mask::OBSTACLE_CORNER_TOP_RIGHT: + discretization_->p(i, j) = 0.5 * (discretization_->p(i + 1, j) + discretization_->p(i, j + 1)); + case Mask::OBSTACLE_BORDER_BOTTOM: + discretization_->p(i, j) = discretization_->p(i, j - 1); + case Mask::OBSTACLE_CORNER_BOTTOM_RIGHT: + discretization_->p(i, j) = 0.5 * (discretization_->p(i + 1, j) + discretization_->p(i, j - 1)); + case Mask::OBSTACLE_CORNER_BOTTOM_LEFT: + discretization_->p(i, j) = 0.5 * (discretization_->p(i - 1, j) + discretization_->p(i, j - 1)); } } } -// its important that first the velocities are updated -void Boundary::setPressureBoundarySurface(int i, int j){ - // u and v must be updated before p - switch((*mask_)(i, j)){ - case Mask::FLUID_BORDER_LEFT: + + +void Boundary::setVelocityDomainBC(){ + for (int idx : DomainBoundaryCells_) + { + int i = idx % mask_->size()[0]; + int j = idx / mask_->size()[0]; + switch ((*mask_)(i, j)) + { + case Mask::DOMAIN_LEFT_NOSLIP: + discretization_->u(i, j) = settings_.NoSlipVelLeft[0]; + discretization_->f(i, j) = discretization_->u(i, j); + discretization_->v(i, j) = 2 * settings_.NoSlipVelLeft[1] - discretization_->v(i+1, j); + case Mask::DOMAIN_TOP_NOSLIP: + discretization_->u(i, j) = 2 * settings_.NoSlipVelTop[0] - discretization_->u(i, j - 1); + discretization_->v(i, j-1) = settings_.NoSlipVelTop[1]; + discretization_->g(i, j-1) = discretization_->v(i, j-1); + case Mask::DOMAIN_RIGHT_NOSLIP: + discretization_->u(i-1, j) = settings_.NoSlipVelRight[0]; + discretization_->f(i-1, j) = discretization_->u(i-1, j); + discretization_->v(i, j) = 2 * settings_.NoSlipVelRight[1] - discretization_->v(i-1, j); + case Mask::DOMAIN_BOTTOM_NOSLIP: + discretization_->u(i, j) = 2 * settings_.NoSlipVelBottom[0] - discretization_->u(i, j + 1); + discretization_->v(i, j) = settings_.NoSlipVelBottom[1]; + discretization_->g(i, j) = discretization_->v(i, j); + case Mask::DOMAIN_LEFT_PRESSURE: break; - case Mask::FLUID_BORDER_TOP: + case Mask::DOMAIN_TOP_PRESSURE: break; - case Mask::FLUID_BORDER_RIGHT: - discretization_->p(i, j) = 2/settings_.re * ( discretization_->u(i, j) - discretization_->u(i - 1, j))/discretization_->dx(); + case Mask::DOMAIN_RIGHT_PRESSURE: break; - case Mask::FLUID_BORDER_BOTTOM: - discretization_->p(i, j) = 2/settings_.re * ( discretization_->v(i, j) - discretization_->v(i, j - 1))/discretization_->dy(); + case Mask::DOMAIN_BOTTOM_PRESSURE: break; + } } } -void Boundary::setPressureBoundaryObstacle(int i, int j){ - switch((*mask_)(i, j)){ - case Mask::DOMAIN_LEFT_NOSLIP: - discretization_->p(i, j) = discretization_->p(i + 1, j); - break; - case Mask::DOMAIN_TOP_NOSLIP: - discretization_->p(i, j) = discretization_->p(i, j - 1); - break; - case Mask::DOMAIN_RIGHT_NOSLIP: - discretization_->p(i, j) = discretization_->p(i - 1, j); - break; - case Mask::DOMAIN_BOTTOM_NOSLIP: - discretization_->p(i, j) = discretization_->p(i, j + 1); - break; + +void Boundary::setVelocityObstacleBC(){ + for (int idx : ObstacleBoundaryCells_) + { + int i = idx % mask_->size()[0]; + int j = idx / mask_->size()[0]; + switch ((*mask_)(i, j)) + { + case Mask::OBSTACLE_BORDER_LEFT: + discretization_->v(i,j) = -discretization_->v(i-1,j); + discretization_->u(i-1,j) = 0.0; + discretization_->f(i-1,j) = discretization_->u(i-1,j); + case Mask::OBSTACLE_BORDER_TOP: + discretization_->u(i,j) = -discretization_->u(i,j+1); + discretization_->v(i,j) = 0.0; + discretization_->g(i,j) = discretization_->v(i,j); + case Mask::OBSTACLE_CORNER_TOP_LEFT: + discretization_->u(i-1,j) = 0.0; + discretization_->f(i-1,j) = discretization_->u(i-1,j); + discretization_->v(i,j) = 0.0; + discretization_->g(i,j) = discretization_->v(i,j); + discretization_->u(i,j) = -discretization_->u(i,j+1); + discretization_->v(i,j-1) = -discretization_->v(i-1,j-1); + case Mask::OBSTACLE_BORDER_RIGHT: + discretization_->v(i,j) = -discretization_->v(i+1,j); + discretization_->u(i,j) = 0.0; + discretization_->f(i,j) = discretization_->u(i,j); + case Mask::OBSTACLE_CORNER_TOP_RIGHT: + discretization_->u(i,j) = 0.0; + discretization_->f(i,j) = discretization_->u(i,j); + discretization_->v(i,j) = 0.0; + discretization_->g(i,j) = discretization_->v(i,j); + discretization_->u(i-1,j) = -discretization_->u(i-1,j+1); + discretization_->v(i,j-1) = -discretization_->v(i-1,j-1); + case Mask::OBSTACLE_BORDER_BOTTOM: + discretization_->u(i,j) = -discretization_->u(i,j-1); + discretization_->v(i,j-1) = 0.0; + discretization_->g(i,j-1) = 0.0; + case Mask::OBSTACLE_CORNER_BOTTOM_RIGHT: + discretization_->u(i,j) = 0.0; + discretization_->f(i,j) = discretization_->u(i,j); + discretization_->v(i,j-1) = 0.0; + discretization_->g(i,j-1) = discretization_->v(i,j-1); + discretization_->u(i-1,j) = -discretization_->u(i-1,j-1); + discretization_->v(i,j) = -discretization_->v(i+1,j); + case Mask::OBSTACLE_CORNER_BOTTOM_LEFT: + discretization_->u(i-1,j) = 0.0; + discretization_->f(i-1,j) = discretization_->u(i,j); + discretization_->v(i,j-1) = 0.0; + discretization_->g(i,j-1) = discretization_->v(i,j-1); + discretization_->u(i,j) = -discretization_->u(i,j-1); + discretization_->v(i,j) = -discretization_->v(i-1,j); + } } } -void Boundary::setVelocityBoundaryValues(){ + +// int Boundary::getNumberOfBoundaryCells() const { +// return boundaryCells_.size(); +// } + +// void Boundary::setPressureBoundaryValues(){ +// for (int idx : boundaryCells_) +// { +// int i = idx % mask_->size()[0]; +// int j = idx / mask_->size()[0]; + +// if (mask_->isFluid(i, j)) +// { +// setPressureBoundarySurface(i, j); +// } +// else if (mask_->isObstacle(i, j)) +// { +// setPressureBoundaryObstacle(i, j); +// } +// } +// } + +// its important that first the velocities are updated +void Boundary::setPressureBoundarySurface(int i, int j) +{ + // u and v must be updated before p + switch ((*mask_)(i, j)) + { + case Mask::FLUID_BORDER_LEFT: + break; + case Mask::FLUID_BORDER_TOP: + break; + case Mask::FLUID_BORDER_RIGHT: + discretization_->p(i, j) = 2 / settings_.re * (discretization_->u(i, j) - discretization_->u(i - 1, j)) / discretization_->dx(); + break; + case Mask::FLUID_BORDER_BOTTOM: + discretization_->p(i, j) = 2 / settings_.re * (discretization_->v(i, j) - discretization_->v(i, j - 1)) / discretization_->dy(); + break; + } +} + +void Boundary::setPressureBoundaryObstacle(int i, int j) +{ + switch ((*mask_)(i, j)) + { + case Mask::DOMAIN_LEFT_NOSLIP: + discretization_->p(i, j) = discretization_->p(i + 1, j); + break; + case Mask::DOMAIN_TOP_NOSLIP: + discretization_->p(i, j) = discretization_->p(i, j - 1); + break; + case Mask::DOMAIN_RIGHT_NOSLIP: + discretization_->p(i, j) = discretization_->p(i - 1, j); + break; + case Mask::DOMAIN_BOTTOM_NOSLIP: + discretization_->p(i, j) = discretization_->p(i, j + 1); + break; + } +} + +void Boundary::setVelocityBoundaryValues() +{ for (int idx : boundaryCells_) { int i = idx % mask_->size()[0]; @@ -92,79 +267,81 @@ void Boundary::setVelocityBoundaryValues(){ setVelocityBoundaryObstacleV(i, j); } } - } -void Boundary::setVelocityBoundarySurfaceU(int i, int j){ - // important that this is solved + + + + +void Boundary::setVelocityBoundarySurfaceU(int i, int j) +{ + // important that this is solved // from left to right (increasing i) // from bottom to top (increasing j) double dxByDy = discretization_->dx() / discretization_->dy(); double dyByDx = discretization_->dy() / discretization_->dx(); - switch ((*mask_)(i, j)) { - case Mask::FLUID_BORDER_LEFT: - discretization_->u(i, j); - break; - case Mask::FLUID_BORDER_TOP: - break; - case Mask::FLUID_BORDER_RIGHT: - discretization_->u(i, j) = discretization_->u(i - 1, j) - - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); - break; - case Mask::FLUID_BORDER_BOTTOM: - break; - case Mask::FLUID_CORNER_TOP_LEFT: - break; - case Mask::FLUID_CORNER_TOP_RIGHT: - discretization_->u(i, j) = discretization_->u(i - 1, j); - discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); - discretization_->u(i, j + 1) = discretization_->u(i, j); - break; - case Mask::FLUID_CORNER_BOTTOM_RIGHT: - break; - case Mask::FLUID_CORNER_BOTTOM_LEFT: - break; - case Mask::FLUID_COLUMN_HORIZONTAL: - break; - case Mask::FLUID_COLUMN_VERTICAL: - break; - case Mask::FLUID_SINGLE_LEFT: - break; - case Mask::FLUID_SINGLE_TOP: - break; - case Mask::FLUID_SINGLE_RIGHT: - break; - case Mask::FLUID_SINGLE_BOTTOM: - // Here the next time step can be calculated directly - default: - break; + switch ((*mask_)(i, j)) + { + case Mask::FLUID_BORDER_LEFT: + discretization_->u(i, j); + break; + case Mask::FLUID_BORDER_TOP: + break; + case Mask::FLUID_BORDER_RIGHT: + discretization_->u(i, j) = discretization_->u(i - 1, j) - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); + break; + case Mask::FLUID_BORDER_BOTTOM: + break; + case Mask::FLUID_CORNER_TOP_LEFT: + break; + case Mask::FLUID_CORNER_TOP_RIGHT: + discretization_->u(i, j) = discretization_->u(i - 1, j); + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + discretization_->u(i, j + 1) = discretization_->u(i, j); + break; + case Mask::FLUID_CORNER_BOTTOM_RIGHT: + break; + case Mask::FLUID_CORNER_BOTTOM_LEFT: + break; + case Mask::FLUID_COLUMN_HORIZONTAL: + break; + case Mask::FLUID_COLUMN_VERTICAL: + break; + case Mask::FLUID_SINGLE_LEFT: + break; + case Mask::FLUID_SINGLE_TOP: + break; + case Mask::FLUID_SINGLE_RIGHT: + break; + case Mask::FLUID_SINGLE_BOTTOM: + // Here the next time step can be calculated directly + default: + break; } - } -void Boundary::setVelocityBoundarySurfaceV(int i, int j){ +void Boundary::setVelocityBoundarySurfaceV(int i, int j) +{ // TODO: } - - -void Boundary::setVelocityBoundaryObstacleU(int i, int j){ +void Boundary::setVelocityBoundaryObstacleU(int i, int j) +{ switch ((*mask_)(i, j)) { - case Mask::DOMAIN_LEFT_NOSLIP: - discretization_->u(i, j) = settings_.NoSlipVelLeft[0]; - break; - case Mask::DOMAIN_TOP_NOSLIP: - discretization_->u(i, j) = 2 * settings_.NoSlipVelTop[0] - discretization_->u(i, j - 1); - break; - case Mask::DOMAIN_RIGHT_NOSLIP: - discretization_->u(i - 1, j) = settings_.NoSlipVelRight[0]; // index shift for u in x direction - break; - case Mask::DOMAIN_BOTTOM_NOSLIP: - discretization_->u(i, j) = 2 * settings_.NoSlipVelBottom[0] - discretization_->u(i, j + 1); - break; + case Mask::DOMAIN_LEFT_NOSLIP: + discretization_->u(i, j) = settings_.NoSlipVelLeft[0]; + break; + case Mask::DOMAIN_TOP_NOSLIP: + discretization_->u(i, j) = 2 * settings_.NoSlipVelTop[0] - discretization_->u(i, j - 1); + break; + case Mask::DOMAIN_RIGHT_NOSLIP: + discretization_->u(i - 1, j) = settings_.NoSlipVelRight[0]; // index shift for u in x direction + break; + case Mask::DOMAIN_BOTTOM_NOSLIP: + discretization_->u(i, j) = 2 * settings_.NoSlipVelBottom[0] - discretization_->u(i, j + 1); + break; } // int i_beg = discretization_->uIBegin(); @@ -184,25 +361,25 @@ void Boundary::setVelocityBoundaryObstacleU(int i, int j){ // discretization_->u(i, j_beg) = 2 * settings_.dirichletBcBottom[0] - discretization_->u(i, j_beg + 1); // discretization_->u(i, j_end - 1) = 2 * settings_.dirichletBcTop[0] - discretization_->u(i, j_end - 2); // } - } -void Boundary::setVelocityBoundaryObstacleV(int i, int j){ +void Boundary::setVelocityBoundaryObstacleV(int i, int j) +{ switch ((*mask_)(i, j)) { - case Mask::DOMAIN_LEFT_NOSLIP: - discretization_->v(i, j) = 2 * settings_.NoSlipVelLeft[1] - discretization_->v(i + 1, j); - break; - case Mask::DOMAIN_TOP_NOSLIP: - discretization_->v(i, j - 1) = settings_.NoSlipVelTop[1]; // index shift for v in y direction - break; - case Mask::DOMAIN_RIGHT_NOSLIP: - discretization_->v(i, j) = 2 * settings_.NoSlipVelRight[1] - discretization_->v(i - 1, j); - break; - case Mask::DOMAIN_BOTTOM_NOSLIP: - discretization_->v(i, j) = settings_.NoSlipVelBottom[1]; - break; + case Mask::DOMAIN_LEFT_NOSLIP: + discretization_->v(i, j) = 2 * settings_.NoSlipVelLeft[1] - discretization_->v(i + 1, j); + break; + case Mask::DOMAIN_TOP_NOSLIP: + discretization_->v(i, j - 1) = settings_.NoSlipVelTop[1]; // index shift for v in y direction + break; + case Mask::DOMAIN_RIGHT_NOSLIP: + discretization_->v(i, j) = 2 * settings_.NoSlipVelRight[1] - discretization_->v(i - 1, j); + break; + case Mask::DOMAIN_BOTTOM_NOSLIP: + discretization_->v(i, j) = settings_.NoSlipVelBottom[1]; + break; } // // Vertical // for (int j = j_beg; j < j_end; j++) @@ -218,22 +395,6 @@ void Boundary::setVelocityBoundaryObstacleV(int i, int j){ // } } - - - - - - - - - - - - - - - - // void Boundary::updateBoundaryPressureDomain(){ // // for (int i = i_beg; i < i_end; i++){ // // discretization_->p(i, j_beg - 1) = discretization_->p(i, j_beg); diff --git a/src/boundary/boundary.h b/src/boundary/boundary.h index 0e088bad..9d008bd1 100644 --- a/src/boundary/boundary.h +++ b/src/boundary/boundary.h @@ -12,6 +12,7 @@ class Boundary Boundary(std::shared_ptr mask, std::shared_ptr discretization, Settings settings); void setPressureBoundaryValues(); void setVelocityBoundaryValues(); + void createBoundaryCellsLists(); int getNumberOfBoundaryCells() const; @@ -32,4 +33,12 @@ class Boundary std::vector boundaryCells_; + std::vector DomainBoundaryCells_; + std::vector ObstacleBoundaryCells_; + + void setPressureDomainBC(); + void setPressureObstacleBC(); + + void setVelocityDomainBC(); + void setVelocityObstacleBC(); }; \ No newline at end of file diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index e137a569..c933a7fc 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -15,10 +15,11 @@ Mask::Mask(Settings settings) : settings_(settings) makeRectangularObstacle(); setDomainBC(); - printMask(); setObstacleBC(); + printMask(); } + int &Mask::operator()(int i, int j) { assert(i >= 0 && i < size_[0] && j >= 0 && j < size_[1]); @@ -110,6 +111,14 @@ bool Mask::isNotAir(int i, int j) const } } +bool Mask::isDomainBoundary(int i, int j) const{ + return (*this)(i,j)>200; +} + +bool Mask::isObstacleBoundary(int i, int j) const{ + return ((*this)(i,j)>100 && (*this)(i,j)<200); +} + int Mask::getNumberOfFluidCells() const { int numFluidCells = 0; @@ -157,6 +166,7 @@ void Mask::makeRectangularObstacle() void Mask::createMaskFromPNGBitMap() { + std::cout << "Creating Domain from PNGBitMap\n"; const char *file_path = settings_.pathToBitmap.c_str(); FILE *fp = fopen(file_path, "rb"); if (!fp) @@ -182,7 +192,7 @@ void Mask::createMaskFromPNGBitMap() png_byte color_type = png_get_color_type(png, info); png_byte bit_depth = png_get_bit_depth(png, info); - std::cout << "Width: " << width << ", Height: " << height << std::endl; + std::cout << "Bitmap width: " << width << ", Bitmap height: " << height << std::endl; size_ = {width + 2, height + 2}; data_.resize(size_[0] * size_[1], FLUID); @@ -302,11 +312,11 @@ void Mask::setObstacleBC() int BC = 1 * Mask::isFluid(i - 1, j) + 2 * Mask::isFluid(i, j + 1) + 4 * Mask::isFluid(i + 1, j) + 8 * Mask::isFluid(i, j - 1) + 100; bool BCinForbiddenCombinations = std::find(std::begin(forbiddenObstacleFluidCombinations), std::end(forbiddenObstacleFluidCombinations), BC) != std::end(forbiddenObstacleFluidCombinations); if (Mask::isAir(i - 1, j) && Mask::isAir(i + 1, j)) - throw std::runtime_error("Obstacel is only one cell wide at i: " + std::to_string(i) + "j: " + std::to_string(j)); + throw std::runtime_error("Obstacel is only one cell wide at i: " + std::to_string(i) + " ,j: " + std::to_string(j)); else if (Mask::isAir(i, j + 1) && Mask::isAir(i, j - 1)) - throw std::runtime_error("Obstacel is only one cell wide at i: " + std::to_string(i) + "j: " + std::to_string(j)); + throw std::runtime_error("Obstacel is only one cell wide at i: " + std::to_string(i) + " ,j: " + std::to_string(j)); else if (BCinForbiddenCombinations) - throw std::runtime_error("Obstacel is only one cell wide at i: " + std::to_string(i) + "j: " + std::to_string(j)); + throw std::runtime_error("Obstacel is only one cell wide at i: " + std::to_string(i) + " ,j: " + std::to_string(j)); else (*this)(i, j) = BC; } diff --git a/src/boundary/mask.h b/src/boundary/mask.h index fd1bea2b..a85bd4b9 100644 --- a/src/boundary/mask.h +++ b/src/boundary/mask.h @@ -199,6 +199,9 @@ enum CellType{ void makeRectangularObstacle(); void createMaskFromPNGBitMap(); + bool isDomainBoundary(int i, int j) const; + bool isObstacleBoundary(int i, int j) const; + void setDomainBC(); void setObstacleBC(); From d7730ea21015916605609c9e9be2fb41f4776076 Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Sat, 3 Feb 2024 12:28:21 +0100 Subject: [PATCH 25/67] fully implemented boundary conditions. However it is not working --- input/settings_debug.txt | 8 +- src/boundary/boundary.cpp | 243 ++---------------------------------- src/boundary/boundary.h | 21 +--- src/boundary/mask.cpp | 1 - src/computation.cpp | 117 +++++------------ src/solver/gauss_seidel.cpp | 3 +- src/solver/sor.cpp | 13 +- 7 files changed, 53 insertions(+), 353 deletions(-) diff --git a/input/settings_debug.txt b/input/settings_debug.txt index 9be40483..e0c0c683 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -4,7 +4,7 @@ # Problem description physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 -endTime = 1.0 # duration of the simulation +endTime = 10.0 # duration of the simulation re = 1000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity gY = 0.0 @@ -48,12 +48,12 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap -createDomainfromBitmap = true +createDomainfromBitmap = false pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/legal_water.png # Discretization parameters -nCellsX = 10 # number of cells in x and y direction -nCellsY = 10 +nCellsX = 20 # number of cells in x and y direction +nCellsY = 20 useDonorCell = true # if donor cell discretization should be used, possible values: true false alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences tau = 0.5 # safety factor for time step width diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 093f1dc2..146deebc 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -5,19 +5,6 @@ Boundary::Boundary(std::shared_ptr mask, Settings settings) : mask_(mask), discretization_(discretization), settings_(settings) { createBoundaryCellsLists(); - // for (int i = 0; i < mask_->size()[0]; i++) - // { - // for (int j = 0; j < mask_->size()[1]; j++) - // { - // if (mask_->isBorder(i, j)) - // { - // boundaryCells_.push_back(i + j * mask_->size()[0]); - // } - // } - // } - // #ifndef NDEBUG - // mask_->printMask(); - // #endif } void Boundary::createBoundaryCellsLists() @@ -40,12 +27,19 @@ void Boundary::setPressureBoundaryValues() setPressureObstacleBC(); } +void Boundary::setVelocityBoundaryValues() +{ + setVelocityDomainBC(); + setVelocityObstacleBC(); +} + void Boundary::setPressureDomainBC() { for (int idx : DomainBoundaryCells_) - { + { int i = idx % mask_->size()[0]; int j = idx / mask_->size()[0]; + switch ((*mask_)(i, j)) { case Mask::DOMAIN_LEFT_NOSLIP: @@ -83,7 +77,7 @@ void Boundary::setPressureObstacleBC() case Mask::OBSTACLE_CORNER_TOP_LEFT: discretization_->p(i, j) = 0.5 * (discretization_->p(i - 1, j) + discretization_->p(i, j + 1)); case Mask::OBSTACLE_BORDER_RIGHT: - discretization_->p(i, j) = discretization_->p(i + 1, j);; + discretization_->p(i, j) = discretization_->p(i + 1, j); case Mask::OBSTACLE_CORNER_TOP_RIGHT: discretization_->p(i, j) = 0.5 * (discretization_->p(i + 1, j) + discretization_->p(i, j + 1)); case Mask::OBSTACLE_BORDER_BOTTOM: @@ -188,222 +182,3 @@ void Boundary::setVelocityObstacleBC(){ } } } - - -// int Boundary::getNumberOfBoundaryCells() const { -// return boundaryCells_.size(); -// } - -// void Boundary::setPressureBoundaryValues(){ -// for (int idx : boundaryCells_) -// { -// int i = idx % mask_->size()[0]; -// int j = idx / mask_->size()[0]; - -// if (mask_->isFluid(i, j)) -// { -// setPressureBoundarySurface(i, j); -// } -// else if (mask_->isObstacle(i, j)) -// { -// setPressureBoundaryObstacle(i, j); -// } -// } -// } - -// its important that first the velocities are updated -void Boundary::setPressureBoundarySurface(int i, int j) -{ - // u and v must be updated before p - switch ((*mask_)(i, j)) - { - case Mask::FLUID_BORDER_LEFT: - break; - case Mask::FLUID_BORDER_TOP: - break; - case Mask::FLUID_BORDER_RIGHT: - discretization_->p(i, j) = 2 / settings_.re * (discretization_->u(i, j) - discretization_->u(i - 1, j)) / discretization_->dx(); - break; - case Mask::FLUID_BORDER_BOTTOM: - discretization_->p(i, j) = 2 / settings_.re * (discretization_->v(i, j) - discretization_->v(i, j - 1)) / discretization_->dy(); - break; - } -} - -void Boundary::setPressureBoundaryObstacle(int i, int j) -{ - switch ((*mask_)(i, j)) - { - case Mask::DOMAIN_LEFT_NOSLIP: - discretization_->p(i, j) = discretization_->p(i + 1, j); - break; - case Mask::DOMAIN_TOP_NOSLIP: - discretization_->p(i, j) = discretization_->p(i, j - 1); - break; - case Mask::DOMAIN_RIGHT_NOSLIP: - discretization_->p(i, j) = discretization_->p(i - 1, j); - break; - case Mask::DOMAIN_BOTTOM_NOSLIP: - discretization_->p(i, j) = discretization_->p(i, j + 1); - break; - } -} - -void Boundary::setVelocityBoundaryValues() -{ - for (int idx : boundaryCells_) - { - int i = idx % mask_->size()[0]; - int j = idx / mask_->size()[0]; - - if (mask_->isFluid(i, j)) - { - // setVelocityBoundarySurfaceU(i, j); - // setVelocityBoundarySurfaceV(i, j); - } - else if (mask_->isObstacle(i, j)) - { - setVelocityBoundaryObstacleU(i, j); - setVelocityBoundaryObstacleV(i, j); - } - } -} - - - - - -void Boundary::setVelocityBoundarySurfaceU(int i, int j) -{ - // important that this is solved - // from left to right (increasing i) - // from bottom to top (increasing j) - double dxByDy = discretization_->dx() / discretization_->dy(); - double dyByDx = discretization_->dy() / discretization_->dx(); - - switch ((*mask_)(i, j)) - { - case Mask::FLUID_BORDER_LEFT: - discretization_->u(i, j); - break; - case Mask::FLUID_BORDER_TOP: - break; - case Mask::FLUID_BORDER_RIGHT: - discretization_->u(i, j) = discretization_->u(i - 1, j) - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); - break; - case Mask::FLUID_BORDER_BOTTOM: - break; - case Mask::FLUID_CORNER_TOP_LEFT: - break; - case Mask::FLUID_CORNER_TOP_RIGHT: - discretization_->u(i, j) = discretization_->u(i - 1, j); - discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); - discretization_->u(i, j + 1) = discretization_->u(i, j); - break; - case Mask::FLUID_CORNER_BOTTOM_RIGHT: - break; - case Mask::FLUID_CORNER_BOTTOM_LEFT: - break; - case Mask::FLUID_COLUMN_HORIZONTAL: - break; - case Mask::FLUID_COLUMN_VERTICAL: - break; - case Mask::FLUID_SINGLE_LEFT: - break; - case Mask::FLUID_SINGLE_TOP: - break; - case Mask::FLUID_SINGLE_RIGHT: - break; - case Mask::FLUID_SINGLE_BOTTOM: - // Here the next time step can be calculated directly - default: - break; - } -} - -void Boundary::setVelocityBoundarySurfaceV(int i, int j) -{ - // TODO: -} - -void Boundary::setVelocityBoundaryObstacleU(int i, int j) -{ - switch ((*mask_)(i, j)) - { - case Mask::DOMAIN_LEFT_NOSLIP: - discretization_->u(i, j) = settings_.NoSlipVelLeft[0]; - break; - case Mask::DOMAIN_TOP_NOSLIP: - discretization_->u(i, j) = 2 * settings_.NoSlipVelTop[0] - discretization_->u(i, j - 1); - break; - case Mask::DOMAIN_RIGHT_NOSLIP: - discretization_->u(i - 1, j) = settings_.NoSlipVelRight[0]; // index shift for u in x direction - break; - case Mask::DOMAIN_BOTTOM_NOSLIP: - discretization_->u(i, j) = 2 * settings_.NoSlipVelBottom[0] - discretization_->u(i, j + 1); - break; - } - - // int i_beg = discretization_->uIBegin(); - // int i_end = discretization_->uIEnd(); - // int j_beg = discretization_->uJBegin(); - // int j_end = discretization_->uJEnd(); - - // // Vertical - // for (int j = j_beg; j < j_end; j++) - // { - // discretization_->u(i_beg, j) = settings_.dirichletBcLeft[0]; - // discretization_->u(i_end - 1, j) = settings_.dirichletBcRight[0]; - // } - // // Horizontal (leave out corners) - // for (int i = i_beg + 1; i < i_end - 1; i++) - // { - // discretization_->u(i, j_beg) = 2 * settings_.dirichletBcBottom[0] - discretization_->u(i, j_beg + 1); - // discretization_->u(i, j_end - 1) = 2 * settings_.dirichletBcTop[0] - discretization_->u(i, j_end - 2); - // } -} - -void Boundary::setVelocityBoundaryObstacleV(int i, int j) -{ - - switch ((*mask_)(i, j)) - { - case Mask::DOMAIN_LEFT_NOSLIP: - discretization_->v(i, j) = 2 * settings_.NoSlipVelLeft[1] - discretization_->v(i + 1, j); - break; - case Mask::DOMAIN_TOP_NOSLIP: - discretization_->v(i, j - 1) = settings_.NoSlipVelTop[1]; // index shift for v in y direction - break; - case Mask::DOMAIN_RIGHT_NOSLIP: - discretization_->v(i, j) = 2 * settings_.NoSlipVelRight[1] - discretization_->v(i - 1, j); - break; - case Mask::DOMAIN_BOTTOM_NOSLIP: - discretization_->v(i, j) = settings_.NoSlipVelBottom[1]; - break; - } - // // Vertical - // for (int j = j_beg; j < j_end; j++) - // { - // discretization_->v(i_beg, j) = 2 * settings_.dirichletBcLeft[1] - discretization_->v(i_beg + 1, j); - // discretization_->v(i_end - 1, j) = 2 * settings_.dirichletBcRight[1] - discretization_->v(i_end - 2, j); - // } - // // Horizontal (leave out corners) - // for (int i = i_beg + 1; i < i_end - 1; i++) - // { - // discretization_->v(i, j_beg) = settings_.dirichletBcBottom[1]; - // discretization_->v(i, j_end - 1) = settings_.dirichletBcTop[1]; - // } -} - -// void Boundary::updateBoundaryPressureDomain(){ -// // for (int i = i_beg; i < i_end; i++){ -// // discretization_->p(i, j_beg - 1) = discretization_->p(i, j_beg); -// // discretization_->p(i, j_end) = discretization_->p(i, j_end - 1); -// // } - -// // // Vertical (without corners) -// // for (int j = j_beg - 1; j < j_end + 1; j++){ -// // discretization_->p(i_beg - 1, j) = discretization_->p(i_beg, j); -// // discretization_->p(i_end, j) = discretization_->p(i_end - 1, j); -// // } -// }P \ No newline at end of file diff --git a/src/boundary/boundary.h b/src/boundary/boundary.h index 9d008bd1..cd0ee5f2 100644 --- a/src/boundary/boundary.h +++ b/src/boundary/boundary.h @@ -13,32 +13,21 @@ class Boundary void setPressureBoundaryValues(); void setVelocityBoundaryValues(); void createBoundaryCellsLists(); + std::shared_ptr mask_; - int getNumberOfBoundaryCells() const; private: - void setPressureBoundaryObstacle(int i, int j); - void setPressureBoundarySurface(int i, int j); - - // Helpers to set Boundary values - void setVelocityBoundaryObstacleU(int i, int j); - void setVelocityBoundaryObstacleV(int i, int j); + void setPressureDomainBC(); + void setPressureObstacleBC(); - void setVelocityBoundarySurfaceU(int i, int j); - void setVelocityBoundarySurfaceV(int i, int j); + void setVelocityDomainBC(); + void setVelocityObstacleBC(); std::shared_ptr discretization_; - std::shared_ptr mask_; Settings settings_; std::vector boundaryCells_; std::vector DomainBoundaryCells_; std::vector ObstacleBoundaryCells_; - - void setPressureDomainBC(); - void setPressureObstacleBC(); - - void setVelocityDomainBC(); - void setVelocityObstacleBC(); }; \ No newline at end of file diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index c933a7fc..3d87e860 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -16,7 +16,6 @@ Mask::Mask(Settings settings) : settings_(settings) setDomainBC(); setObstacleBC(); - printMask(); } diff --git a/src/computation.cpp b/src/computation.cpp index 7321c52d..315ba024 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -22,14 +22,11 @@ void Computation::initialize(int argc, char *argv[]) { discretization_ = std::make_shared(settings_.nCells, meshWidth_); } - - // create boundary and tracer + mask_ = std::make_shared(settings_); std::vector traceX = {1.8}; std::vector traceY = {1.8}; - //fluidTracer_ = std::make_shared(traceX, traceY, discretization_, mask_); - // fluidTracer_ = std::make_shared(100, discretization_, mask_); boundary_ = std::make_shared(mask_, discretization_, settings_); @@ -49,7 +46,6 @@ void Computation::initialize(int argc, char *argv[]) boundary_); } - outputWriterParaview_ = std::make_unique(discretization_); outputWriterText_ = std::make_unique(discretization_); } @@ -58,21 +54,13 @@ void Computation::runSimulation() { double currentTime = 0.; do - { + { applyBoundaryValues(); computeTimeStepWidth(currentTime); computePreliminaryVelocities(); computeRightHandSide(); computePressure(); computeVelocities(); - // // ------------------------------- - // // update tracer - // fluidTracer_->createParticles(1.8, 1.8); - // fluidTracer_->moveParticles(dt_); - // mask_->printMask(); - // std::cout << "\033[2J\033[1;1H"; - // usleep(10000); - // // ------------------------------- currentTime += dt_; outputWriterParaview_->writeFile(currentTime); @@ -88,7 +76,6 @@ void Computation::runSimulation() void Computation::applyBoundaryValues() { - // set Dirichlet BC boundary_->setVelocityBoundaryValues(); } @@ -115,98 +102,47 @@ void Computation::computeTimeStepWidth(double currentTime) void Computation::computePreliminaryVelocities() { - // **************************************** // Compute F - // **************************************** - int f_i_beg = discretization_->fIBegin(); - int f_i_end = discretization_->fIEnd(); - int f_j_beg = discretization_->fJBegin(); - int f_j_end = discretization_->fJEnd(); - - // Boundary of F - - // Vertical - for (int j = f_j_beg - 1; j < f_j_end + 1; j++) - { - discretization_->f(f_i_beg, j) = discretization_->u(f_i_beg, j); - discretization_->f(f_i_end - 1, j) = discretization_->u(f_i_end - 1, j); - } - - // Horizontal - for (int i = f_i_beg; i < f_i_end + 1; i++) - { - discretization_->f(i, f_j_beg - 1) = discretization_->u(i, f_j_beg - 1); - // std::cout << discretization_->u(i, f_j_beg) << std::endl; - discretization_->f(i, f_j_end) = discretization_->u(i, f_j_end); - } - - // Interior - for (int i = f_i_beg + 1; i < f_i_end - 1; i++) + for (int i = discretization_->fIBegin(); i < discretization_->fIEnd(); i++) { - for (int j = f_j_beg; j < f_j_end; j++) + for (int j = discretization_->fJBegin(); j < discretization_->fJEnd(); j++) { - - double diffusion = 1 / settings_.re * (discretization_->computeD2uDx2(i, j) + discretization_->computeD2uDy2(i, j)); - double convection = -discretization_->computeDu2Dx(i, j) - discretization_->computeDuvDy(i, j); - discretization_->f(i, j) = discretization_->u(i, j) + dt_ * (diffusion + convection + settings_.g[0]); + if (mask_->isFluid(i, j)) + { + double diffusion = 1 / settings_.re * (discretization_->computeD2uDx2(i, j) + discretization_->computeD2uDy2(i, j)); + double convection = -discretization_->computeDu2Dx(i, j) - discretization_->computeDuvDy(i, j); + discretization_->f(i, j) = discretization_->u(i, j) + dt_ * (diffusion + convection + settings_.g[0]); + } } } - // **************************************** // Compute G - // **************************************** - - int g_i_beg = discretization_->gIBegin(); - int g_i_end = discretization_->gIEnd(); - int g_j_beg = discretization_->gJBegin(); - int g_j_end = discretization_->gJEnd(); - - // Boundary of G - - // Horizontal - for (int i = g_i_beg - 1; i < g_i_end + 1; i++) - { - discretization_->g(i, g_j_beg) = discretization_->v(i, g_j_beg); - discretization_->g(i, g_j_end - 1) = discretization_->v(i, g_j_end - 1); - } - - // Vertical - for (int j = g_j_beg; j < g_j_end + 1; j++) - { - discretization_->g(g_i_beg - 1, j) = discretization_->v(g_i_beg - 1, j); - discretization_->g(g_i_end, j) = discretization_->v(g_i_end, j); - } - - // Interior - for (int i = g_i_beg; i < g_i_end; i++) + for (int i = discretization_->gIBegin(); i < discretization_->gIEnd(); i++) { - for (int j = g_j_beg + 1; j < g_j_end - 1; j++) + for (int j = discretization_->gJBegin(); j < discretization_->gJEnd(); j++) { - + if (mask_->isFluid(i, j)) + { double diffusion = 1 / settings_.re * (discretization_->computeD2vDx2(i, j) + discretization_->computeD2vDy2(i, j)); double convection = -discretization_->computeDv2Dy(i, j) - discretization_->computeDuvDx(i, j); - discretization_->g(i, j) = discretization_->v(i, j) + dt_ * (diffusion + convection + settings_.g[1]); + } } } } void Computation::computeRightHandSide() { - - int i_beg = discretization_->rhsIBegin(); - int i_end = discretization_->rhsIEnd(); - int j_beg = discretization_->rhsJBegin(); - int j_end = discretization_->rhsJEnd(); - - // Interior - for (int i = i_beg; i < i_end; i++) + for (int i = discretization_->rhsIBegin(); i < discretization_->rhsIEnd(); i++) { - for (int j = j_beg; j < j_end; j++) - { + for (int j = discretization_->rhsJBegin(); j < discretization_->rhsJEnd(); j++) + { + if (mask_->isFluid(i, j)) + { double dF = (1 / discretization_->dx()) * (discretization_->f(i, j) - discretization_->f(i - 1, j)); double dG = (1 / discretization_->dy()) * (discretization_->g(i, j) - discretization_->g(i, j - 1)); discretization_->rhs(i, j) = (1 / dt_) * (dF + dG); + } } } } @@ -218,19 +154,22 @@ void Computation::computePressure() void Computation::computeVelocities() { - - for (int i = discretization_->uIBegin() + 1; i < discretization_->uIEnd() - 1; i++) + // Compute u + for (int i = discretization_->uIBegin(); i < discretization_->uIEnd(); i++) { - for (int j = discretization_->uJBegin() + 1; j < discretization_->uJEnd() - 1; j++) + for (int j = discretization_->uJBegin(); j < discretization_->uJEnd(); j++) { - discretization_->u(i, j) = discretization_->f(i, j) - dt_ * discretization_->computeDpDx(i, j); + if (mask_->isFluid(i, j)) + discretization_->u(i, j) = discretization_->f(i, j) - dt_ * discretization_->computeDpDx(i, j); } } + // Compute v for (int i = discretization_->vIBegin() + 1; i < discretization_->vIEnd() - 1; i++) { for (int j = discretization_->vJBegin() + 1; j < discretization_->vJEnd() - 1; j++) { + if (mask_->isFluid(i, j)) discretization_->v(i, j) = discretization_->g(i, j) - dt_ * discretization_->computeDpDy(i, j); } } diff --git a/src/solver/gauss_seidel.cpp b/src/solver/gauss_seidel.cpp index 1891e075..f01d71ad 100644 --- a/src/solver/gauss_seidel.cpp +++ b/src/solver/gauss_seidel.cpp @@ -21,11 +21,12 @@ void GaussSeidel::solve() { for (int j = j_beg; j < j_end; j++) { - + if (boundary_->mask_->isFluid(i,j)){ double p_x = 1 / dx2 * (discretization_->p(i + 1, j) + discretization_->p(i - 1, j)); double p_y = 1 / dy2 * (discretization_->p(i, j + 1) + discretization_->p(i, j - 1)); discretization_->p(i, j) = d_fac * (p_x + p_y - discretization_->rhs(i, j)); + } } } setBoundaryValues(); diff --git a/src/solver/sor.cpp b/src/solver/sor.cpp index 9c8126cb..e466df50 100644 --- a/src/solver/sor.cpp +++ b/src/solver/sor.cpp @@ -23,14 +23,11 @@ void SOR::solve() { for (int j = j_beg; j < j_end; j++) { - // if (boundary_->isBoundary(i, j)){ - // continue; - // } - - p_x = 1 / dx2 * (discretization_->p(i + 1, j) + discretization_->p(i - 1, j)); - p_y = 1 / dy2 * (discretization_->p(i, j + 1) + discretization_->p(i, j - 1)); - - discretization_->p(i, j) = (1 - omega_) * discretization_->p(i, j) + omega_ * (d_fac * (p_x + p_y - discretization_->rhs(i, j))); + if (boundary_->mask_->isFluid(i,j)){ + p_x = 1 / dx2 * (discretization_->p(i + 1, j) + discretization_->p(i - 1, j)); + p_y = 1 / dy2 * (discretization_->p(i, j + 1) + discretization_->p(i, j - 1)); + discretization_->p(i, j) = (1 - omega_) * discretization_->p(i, j) + omega_ * (d_fac * (p_x + p_y - discretization_->rhs(i, j))); + } } } setBoundaryValues(); From cbd700b574b477d37e52f5ebf9d8629967e7e8bf Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Sun, 4 Feb 2024 09:33:27 +0100 Subject: [PATCH 26/67] almost working version --- input/settings_debug.txt | 2 +- src/boundary/boundary.cpp | 133 +++++++++++++++----------- src/boundary/boundary.h | 9 +- src/boundary/mask.cpp | 164 ++++++++++++--------------------- src/boundary/mask.h | 151 ++++++++++++++---------------- src/computation.cpp | 48 +++++----- src/solver/gauss_seidel.cpp | 9 +- src/solver/pressure_solver.cpp | 14 ++- src/solver/sor.cpp | 4 +- 9 files changed, 252 insertions(+), 282 deletions(-) diff --git a/input/settings_debug.txt b/input/settings_debug.txt index e0c0c683..9eb0d0cd 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -39,7 +39,7 @@ PressureLeft = 100.0 # Create Rectangular object in domain -createRectangularObject = false +createRectangularObject = true obstaclePositionX = 0.5 obstaclePositionY = 0.5 diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 146deebc..195f7ff2 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -27,29 +27,27 @@ void Boundary::setPressureBoundaryValues() setPressureObstacleBC(); } -void Boundary::setVelocityBoundaryValues() -{ - setVelocityDomainBC(); - setVelocityObstacleBC(); -} - void Boundary::setPressureDomainBC() { for (int idx : DomainBoundaryCells_) - { + { int i = idx % mask_->size()[0]; int j = idx / mask_->size()[0]; - + switch ((*mask_)(i, j)) { case Mask::DOMAIN_LEFT_NOSLIP: discretization_->p(i, j) = discretization_->p(i + 1, j); + break; case Mask::DOMAIN_TOP_NOSLIP: discretization_->p(i, j) = discretization_->p(i, j - 1); + break; case Mask::DOMAIN_RIGHT_NOSLIP: discretization_->p(i, j) = discretization_->p(i - 1, j); + break; case Mask::DOMAIN_BOTTOM_NOSLIP: discretization_->p(i, j) = discretization_->p(i, j + 1); + break; case Mask::DOMAIN_LEFT_PRESSURE: break; case Mask::DOMAIN_TOP_PRESSURE: @@ -72,27 +70,40 @@ void Boundary::setPressureObstacleBC() { case Mask::OBSTACLE_BORDER_LEFT: discretization_->p(i, j) = discretization_->p(i - 1, j); + break; case Mask::OBSTACLE_BORDER_TOP: discretization_->p(i, j) = discretization_->p(i, j + 1); + break; case Mask::OBSTACLE_CORNER_TOP_LEFT: discretization_->p(i, j) = 0.5 * (discretization_->p(i - 1, j) + discretization_->p(i, j + 1)); + break; case Mask::OBSTACLE_BORDER_RIGHT: discretization_->p(i, j) = discretization_->p(i + 1, j); + break; case Mask::OBSTACLE_CORNER_TOP_RIGHT: discretization_->p(i, j) = 0.5 * (discretization_->p(i + 1, j) + discretization_->p(i, j + 1)); + break; case Mask::OBSTACLE_BORDER_BOTTOM: discretization_->p(i, j) = discretization_->p(i, j - 1); + break; case Mask::OBSTACLE_CORNER_BOTTOM_RIGHT: discretization_->p(i, j) = 0.5 * (discretization_->p(i + 1, j) + discretization_->p(i, j - 1)); + break; case Mask::OBSTACLE_CORNER_BOTTOM_LEFT: discretization_->p(i, j) = 0.5 * (discretization_->p(i - 1, j) + discretization_->p(i, j - 1)); + break; } } } +void Boundary::setVelocityBoundaryValues() +{ + setVelocityDomainBC(); + setVelocityObstacleBC(); +} - -void Boundary::setVelocityDomainBC(){ +void Boundary::setVelocityDomainBC() +{ for (int idx : DomainBoundaryCells_) { int i = idx % mask_->size()[0]; @@ -102,19 +113,23 @@ void Boundary::setVelocityDomainBC(){ case Mask::DOMAIN_LEFT_NOSLIP: discretization_->u(i, j) = settings_.NoSlipVelLeft[0]; discretization_->f(i, j) = discretization_->u(i, j); - discretization_->v(i, j) = 2 * settings_.NoSlipVelLeft[1] - discretization_->v(i+1, j); + discretization_->v(i, j) = 2 * settings_.NoSlipVelLeft[1] - discretization_->v(i + 1, j); + break; case Mask::DOMAIN_TOP_NOSLIP: discretization_->u(i, j) = 2 * settings_.NoSlipVelTop[0] - discretization_->u(i, j - 1); - discretization_->v(i, j-1) = settings_.NoSlipVelTop[1]; - discretization_->g(i, j-1) = discretization_->v(i, j-1); + discretization_->v(i, j - 1) = settings_.NoSlipVelTop[1]; + discretization_->g(i, j - 1) = discretization_->v(i, j - 1); + break; case Mask::DOMAIN_RIGHT_NOSLIP: - discretization_->u(i-1, j) = settings_.NoSlipVelRight[0]; - discretization_->f(i-1, j) = discretization_->u(i-1, j); - discretization_->v(i, j) = 2 * settings_.NoSlipVelRight[1] - discretization_->v(i-1, j); + discretization_->u(i - 1, j) = settings_.NoSlipVelRight[0]; + discretization_->f(i - 1, j) = discretization_->u(i - 1, j); + discretization_->v(i, j) = 2 * settings_.NoSlipVelRight[1] - discretization_->v(i - 1, j); + break; case Mask::DOMAIN_BOTTOM_NOSLIP: discretization_->u(i, j) = 2 * settings_.NoSlipVelBottom[0] - discretization_->u(i, j + 1); discretization_->v(i, j) = settings_.NoSlipVelBottom[1]; discretization_->g(i, j) = discretization_->v(i, j); + break; case Mask::DOMAIN_LEFT_PRESSURE: break; case Mask::DOMAIN_TOP_PRESSURE: @@ -127,8 +142,8 @@ void Boundary::setVelocityDomainBC(){ } } - -void Boundary::setVelocityObstacleBC(){ +void Boundary::setVelocityObstacleBC() +{ for (int idx : ObstacleBoundaryCells_) { int i = idx % mask_->size()[0]; @@ -136,49 +151,57 @@ void Boundary::setVelocityObstacleBC(){ switch ((*mask_)(i, j)) { case Mask::OBSTACLE_BORDER_LEFT: - discretization_->v(i,j) = -discretization_->v(i-1,j); - discretization_->u(i-1,j) = 0.0; - discretization_->f(i-1,j) = discretization_->u(i-1,j); + discretization_->v(i, j) = -discretization_->v(i - 1, j); + discretization_->u(i - 1, j) = 0.0; + discretization_->f(i - 1, j) = discretization_->u(i - 1, j); + break; case Mask::OBSTACLE_BORDER_TOP: - discretization_->u(i,j) = -discretization_->u(i,j+1); - discretization_->v(i,j) = 0.0; - discretization_->g(i,j) = discretization_->v(i,j); + discretization_->u(i, j) = -discretization_->u(i, j + 1); + discretization_->v(i, j) = 0.0; + discretization_->g(i, j) = discretization_->v(i, j); + break; case Mask::OBSTACLE_CORNER_TOP_LEFT: - discretization_->u(i-1,j) = 0.0; - discretization_->f(i-1,j) = discretization_->u(i-1,j); - discretization_->v(i,j) = 0.0; - discretization_->g(i,j) = discretization_->v(i,j); - discretization_->u(i,j) = -discretization_->u(i,j+1); - discretization_->v(i,j-1) = -discretization_->v(i-1,j-1); + discretization_->u(i - 1, j) = 0.0; + discretization_->f(i - 1, j) = discretization_->u(i - 1, j); + discretization_->v(i, j) = 0.0; + discretization_->g(i, j) = discretization_->v(i, j); + discretization_->u(i, j) = -discretization_->u(i, j + 1); + discretization_->v(i, j - 1) = -discretization_->v(i - 1, j - 1); + break; case Mask::OBSTACLE_BORDER_RIGHT: - discretization_->v(i,j) = -discretization_->v(i+1,j); - discretization_->u(i,j) = 0.0; - discretization_->f(i,j) = discretization_->u(i,j); + discretization_->v(i, j) = -discretization_->v(i + 1, j); + discretization_->u(i, j) = 0.0; + discretization_->f(i, j) = discretization_->u(i, j); + break; case Mask::OBSTACLE_CORNER_TOP_RIGHT: - discretization_->u(i,j) = 0.0; - discretization_->f(i,j) = discretization_->u(i,j); - discretization_->v(i,j) = 0.0; - discretization_->g(i,j) = discretization_->v(i,j); - discretization_->u(i-1,j) = -discretization_->u(i-1,j+1); - discretization_->v(i,j-1) = -discretization_->v(i-1,j-1); + discretization_->u(i, j) = 0.0; + discretization_->f(i, j) = discretization_->u(i, j); + discretization_->v(i, j) = 0.0; + discretization_->g(i, j) = discretization_->v(i, j); + discretization_->u(i - 1, j) = -discretization_->u(i - 1, j + 1); + discretization_->v(i, j - 1) = -discretization_->v(i + 1, j - 1); + break; case Mask::OBSTACLE_BORDER_BOTTOM: - discretization_->u(i,j) = -discretization_->u(i,j-1); - discretization_->v(i,j-1) = 0.0; - discretization_->g(i,j-1) = 0.0; + discretization_->u(i, j) = -discretization_->u(i, j - 1); + discretization_->v(i, j - 1) = 0.0; + discretization_->g(i, j - 1) = 0.0; + break; case Mask::OBSTACLE_CORNER_BOTTOM_RIGHT: - discretization_->u(i,j) = 0.0; - discretization_->f(i,j) = discretization_->u(i,j); - discretization_->v(i,j-1) = 0.0; - discretization_->g(i,j-1) = discretization_->v(i,j-1); - discretization_->u(i-1,j) = -discretization_->u(i-1,j-1); - discretization_->v(i,j) = -discretization_->v(i+1,j); + discretization_->u(i, j) = 0.0; + discretization_->f(i, j) = discretization_->u(i, j); + discretization_->v(i, j - 1) = 0.0; + discretization_->g(i, j - 1) = discretization_->v(i, j - 1); + discretization_->u(i - 1, j) = -discretization_->u(i - 1, j - 1); + discretization_->v(i, j) = -discretization_->v(i + 1, j); + break; case Mask::OBSTACLE_CORNER_BOTTOM_LEFT: - discretization_->u(i-1,j) = 0.0; - discretization_->f(i-1,j) = discretization_->u(i,j); - discretization_->v(i,j-1) = 0.0; - discretization_->g(i,j-1) = discretization_->v(i,j-1); - discretization_->u(i,j) = -discretization_->u(i,j-1); - discretization_->v(i,j) = -discretization_->v(i-1,j); + discretization_->u(i - 1, j) = 0.0; + discretization_->f(i - 1, j) = discretization_->u(i, j); + discretization_->v(i, j - 1) = 0.0; + discretization_->g(i, j - 1) = discretization_->v(i, j - 1); + discretization_->u(i, j) = -discretization_->u(i, j - 1); + discretization_->v(i, j) = -discretization_->v(i - 1, j); + break; } } -} +} \ No newline at end of file diff --git a/src/boundary/boundary.h b/src/boundary/boundary.h index cd0ee5f2..04e91de6 100644 --- a/src/boundary/boundary.h +++ b/src/boundary/boundary.h @@ -15,19 +15,24 @@ class Boundary void createBoundaryCellsLists(); std::shared_ptr mask_; - private: void setPressureDomainBC(); void setPressureObstacleBC(); + void setPressureBoundaryObstacle(int i, int j); + + void setVelocityDomainBC(); void setVelocityObstacleBC(); + void setVelocityBoundaryObstacleU(int i, int j); + void setVelocityBoundaryObstacleV(int i, int j); + std::shared_ptr discretization_; Settings settings_; std::vector boundaryCells_; - std::vector DomainBoundaryCells_; std::vector ObstacleBoundaryCells_; + }; \ No newline at end of file diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index 3d87e860..21c42c50 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -1,6 +1,6 @@ #include "mask.h" -Mask::Mask(Settings settings) : settings_(settings) +Mask::Mask( Settings settings) : settings_(settings) { if (settings_.createDomainfromBitmap) createMaskFromPNGBitMap(); @@ -16,9 +16,9 @@ Mask::Mask(Settings settings) : settings_(settings) setDomainBC(); setObstacleBC(); + printMask(); } - int &Mask::operator()(int i, int j) { assert(i >= 0 && i < size_[0] && j >= 0 && j < size_[1]); @@ -38,12 +38,9 @@ std::array Mask::size() const void Mask::resetMask() { - for (int i = 0; i < size_[0]; i++) - { - for (int j = 0; j < size_[1]; j++) - { - if (!isObstacle(i, j)) - { + for (int i = 0; i < size_[0]; i++) { + for (int j = 0; j < size_[1]; j++) { + if (!isObstacle(i, j)) { data_[i + j * size_[0]] = AIR; } } @@ -60,63 +57,57 @@ void Mask::updateMaskBoundaries() if (Mask::isFluid(i, j)) { - data_[idx] = 1 * Mask::isNotAir(i - 1, j) + 2 * Mask::isNotAir(i, j + 1) + 4 * Mask::isNotAir(i + 1, j) + 8 * Mask::isNotAir(i, j - 1); + data_[idx] = 1 * Mask::isNotAir(i - 1, j) + + 2 * Mask::isNotAir(i, j + 1) + + 4 * Mask::isNotAir(i + 1, j) + + 8 * Mask::isNotAir(i, j - 1); + } } } } + + + bool Mask::isFluid(int i, int j) const -{ - if (i < 0 || i >= size_[0] || j < 0 || j >= size_[1]) - { - return false; - } - else - { - return (data_[i + j * size_[0]] < FLUID_TYPE); - } -} + { + if (i < 0 || i >= size_[0] || j < 0 || j >= size_[1]){ + return false; + } else { + return (data_[i + j * size_[0]] < FLUID_TYPE); + } + } bool Mask::isObstacle(int i, int j) const -{ - return (data_[i + j * size_[0]] >= OBSTACLE); -} + { + return (data_[i + j * size_[0]] >= OBSTACLE); + } bool Mask::isFluidBorder(int i, int j) const -{ - return data_[i + j * size_[0]] < FLUID; -} + { + return data_[i + j * size_[0]] < FLUID; + } bool Mask::isBorder(int i, int j) const -{ - return isFluidBorder(i, j) || isObstacle(i, j); -} + { + return isFluidBorder(i, j) || isObstacle(i, j); + } bool Mask::isAir(int i, int j) const -{ - return (data_[i + j * size_[0]] == AIR); -} + { + return (data_[i + j * size_[0]] == AIR); + } bool Mask::isNotAir(int i, int j) const -{ - if (i < 0 || i >= size_[0] || j < 0 || j >= size_[1]) - { - return true; - } - else - { - return (data_[i + j * size_[0]] != AIR); - } -} - -bool Mask::isDomainBoundary(int i, int j) const{ - return (*this)(i,j)>200; -} - -bool Mask::isObstacleBoundary(int i, int j) const{ - return ((*this)(i,j)>100 && (*this)(i,j)<200); -} + { + if (i < 0 || i >= size_[0] || j < 0 || j >= size_[1]) + { + return true; + } else { + return (data_[i + j * size_[0]] != AIR); + } + } int Mask::getNumberOfFluidCells() const { @@ -134,9 +125,13 @@ int Mask::getNumberOfFluidCells() const return numFluidCells; } -// ************************ -// P R I M I T I V E S -// ************************ +bool Mask::isDomainBoundary(int i, int j) const{ + return (*this)(i,j)>200; +} + +bool Mask::isObstacleBoundary(int i, int j) const{ + return ((*this)(i,j)>100 && (*this)(i,j)<200); +} void Mask::makeRectangularObstacle() { @@ -323,60 +318,19 @@ void Mask::setObstacleBC() } } -// ****************************** -// P R I N T I N G -// ****************************** -void Mask::printMask() const -{ - for (int j = size_[1] - 1; j >= 0; j--) - { - for (int i = 0; i < size_[0]; i++) - { - if (data_[i + j * size_[0]] == AIR) - { - std::cout << " "; - } - else - { - std::cout << std::setw(3) << std::setfill('0') << data_[i + j * size_[0]] << " "; - } + +void Mask::printMask() const{ + for (int j = size_[1] - 1; j >= 0; j--){ + for (int i = 0; i < size_[0]; i++){ + if (data_[i + j * size_[0]] == AIR){ + std::cout << " "; + } else { + std::cout << std::setw(3) << std::setfill('0') << data_[i + j * size_[0]] << " "; + } + } + std::cout << std::endl; } - std::cout << std::endl; - } } -// void Mask::createBitmap() const{ -// std::ofstream file("output.bmp", std::ios::binary); -// int width = size_[0]; -// int height = size_[1]; -// std::vector pixels = data_; - -// // Bitmap header -// unsigned char header[54] = { -// 0x42, 0x4D, 0, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 40, 0, -// 0, 0, static_cast(width), static_cast(width >> 8), static_cast(width >> 16), static_cast(width >> 24), -// static_cast(height), static_cast(height >> 8), static_cast(height >> 16), static_cast(height >> 24), -// 1, 0, 24, 0 -// }; - -// file.write(reinterpret_cast(header), sizeof(header)); - -// // Bitmap data -// int rowSize = (3 width + 3) & ~3; // Ensure each row is a multiple of 4 bytes -// unsigned char padding[3] = {0, 0, 0}; - -// for (int y = height - 1; y >= 0; --y) { -// for (int x = 0; x < width; ++x) { -// unsigned char pixel[3] = { -// pixels[y * width + x], -// pixels[y * width + x], -// pixels[y * width + x] -// }; -// file.write(reinterpret_cast(pixel), sizeof(pixel)); -// } -// file.write(reinterpret_cast(padding), rowSize - 3 * width); -// } - -// file.close(); -// } + diff --git a/src/boundary/mask.h b/src/boundary/mask.h index a85bd4b9..07e1ba71 100644 --- a/src/boundary/mask.h +++ b/src/boundary/mask.h @@ -6,15 +6,14 @@ #include #include +#include #include -#include #include #include "../settings_parser/settings.h" - - -class Mask{ - public: +class Mask +{ +public: /** * @brief constructor. * @@ -22,62 +21,58 @@ class Mask{ */ Mask(Settings settings); + // TODO: it is weird but if we would use `char` instead of int, we would use less memory + enum CellType + { + DROPLET = 0, + FLUID = 15, -//TODO: it is weird but if we would use `char` instead of int, we would use less memory - -enum CellType{ - DROPLET = 0, - FLUID = 15, - - FLUID_SINGLE_LEFT = 1, - FLUID_SINGLE_TOP = 2, - FLUID_SINGLE_RIGHT = 4, - FLUID_SINGLE_BOTTOM = 8, - - FLUID_CORNER_BOTTOM_LEFT = 6, - FLUID_CORNER_TOP_LEFT = 12, - FLUID_CORNER_TOP_RIGHT = 9, - FLUID_CORNER_BOTTOM_RIGHT = 3, + FLUID_SINGLE_LEFT = 1, + FLUID_SINGLE_TOP = 2, + FLUID_SINGLE_RIGHT = 4, + FLUID_SINGLE_BOTTOM = 8, - FLUID_COLUMN_HORIZONTAL = 5, - FLUID_COLUMN_VERTICAL = 10, + FLUID_CORNER_BOTTOM_LEFT = 6, + FLUID_CORNER_TOP_LEFT = 12, + FLUID_CORNER_TOP_RIGHT = 9, + FLUID_CORNER_BOTTOM_RIGHT = 3, - FLUID_BORDER_LEFT = 14, - FLUID_BORDER_TOP = 13, - FLUID_BORDER_RIGHT = 11, - FLUID_BORDER_BOTTOM = 7, + FLUID_COLUMN_HORIZONTAL = 5, + FLUID_COLUMN_VERTICAL = 10, - FLUID_TYPE = 50, - AIR = 64, + FLUID_BORDER_LEFT = 14, + FLUID_BORDER_TOP = 13, + FLUID_BORDER_RIGHT = 11, + FLUID_BORDER_BOTTOM = 7, - OBSTACLE = 99, - OBSTACLE_INSIDE = 100, + FLUID_TYPE = 50, + AIR = 64, - OBSTACLE_BORDER_LEFT = 101, - OBSTACLE_BORDER_TOP = 102, - OBSTACLE_CORNER_TOP_LEFT = 103, - OBSTACLE_BORDER_RIGHT = 104, - OBSTACLE_CORNER_TOP_RIGHT = 106, - OBSTACLE_BORDER_BOTTOM = 108, - OBSTACLE_CORNER_BOTTOM_LEFT = 109, - OBSTACLE_CORNER_BOTTOM_RIGHT = 112, + OBSTACLE = 99, + OBSTACLE_INSIDE = 100, + OBSTACLE_BORDER_LEFT = 101, + OBSTACLE_BORDER_TOP = 102, + OBSTACLE_CORNER_TOP_LEFT = 103, + OBSTACLE_BORDER_RIGHT = 104, + OBSTACLE_CORNER_TOP_RIGHT = 106, + OBSTACLE_BORDER_BOTTOM = 108, + OBSTACLE_CORNER_BOTTOM_LEFT = 109, + OBSTACLE_CORNER_BOTTOM_RIGHT = 112, + DOMAIN_BOUNDARY = 200, - DOMAIN_BOUNDARY = 200, + DOMAIN_LEFT_NOSLIP = 201, + DOMAIN_TOP_NOSLIP = 202, + DOMAIN_RIGHT_NOSLIP = 203, + DOMAIN_BOTTOM_NOSLIP = 204, - DOMAIN_LEFT_NOSLIP = 201, - DOMAIN_TOP_NOSLIP = 202, - DOMAIN_RIGHT_NOSLIP = 203, - DOMAIN_BOTTOM_NOSLIP = 204, - - DOMAIN_LEFT_PRESSURE = 205, - DOMAIN_TOP_PRESSURE = 206, - DOMAIN_RIGHT_PRESSURE = 207, - DOMAIN_BOTTOM_PRESSURE = 208, -}; - + DOMAIN_LEFT_PRESSURE = 205, + DOMAIN_TOP_PRESSURE = 206, + DOMAIN_RIGHT_PRESSURE = 207, + DOMAIN_BOTTOM_PRESSURE = 208, + }; /** * @brief set array value. @@ -102,34 +97,32 @@ enum CellType{ */ std::array size() const; - /** * @brief sets all not obstacle cells to air - * + * */ void resetMask(); /** * @brief update boundary of mask after the `moveParticles` step - * + * * TODO: efficiency: only update `isFluidBorder` */ void updateMaskBoundaries(); - /** * @brief Cell at (i,j) is fluid or not - * + * * @param i index in x direction * @param j index in y direction - * + * * If i and j are out of bond returns false */ bool isFluid(int i, int j) const; /** * @brief Cell at (i,j) is an obstacle or not - * + * * @param i index in x direction * @param j index in y direction */ @@ -137,7 +130,7 @@ enum CellType{ /** * @brief Cell at (i,j) is a fluid border cell or not - * + * * @param i index in x direction * @param j index in y direction */ @@ -145,57 +138,59 @@ enum CellType{ /** * @brief Cell at (i,j) is border cell (fluid or obstacle) or not - * + * * @param i index in x direction * @param j index in y direction */ bool isBorder(int i, int j) const; - /** * @brief Cell at (i,j) is a air cell or not - * + * * @param i index in x direction * @param j index in y direction - * + * * If i and j are out of bond returns false */ bool isAir(int i, int j) const; /** * @brief Cell at (i,j) is not a air cell or not - * + * * @param i index in x direction * @param j index in y direction - * + * * If i and j are out of bond returns true */ bool isNotAir(int i, int j) const; /** * @brief number of fluid cells - * + * * not efficient but is only used once in the creation of the fluid tracer - * + * */ int getNumberOfFluidCells() const; - - // ****************************** // P R I M I T I V E S // ****************************** /** * @brief creates an obstacle at the given position - * - * assumes + * + * assumes * * that the obstacle is within the boundary and sets the boundaries of the obstacle to its * according value - * + * * @param obstaclePosition_ position of lower left corner * @param obstacleSize_ length and width of the rectangle */ + + // ****************************** + // P R I N T I N G + // ****************************** + void makeRectangularObstacle(); void createMaskFromPNGBitMap(); @@ -205,23 +200,13 @@ enum CellType{ void setDomainBC(); void setObstacleBC(); - - - // ****************************** - // P R I N T I N G - // ****************************** - - void printMask() const; - // void createBitmap() const; - - protected: std::array size_; //!< size of array in x and y direction - std::vector data_; //!< storage array values, in row-major order - std::vector boundary_list; //!< stores the indices of the boundary cells + std::vector data_; //!< storage array values, in row-major order + std::vector boundary_list; //!< stores the indices of the boundary cells Settings settings_; int forbiddenObstacleFluidCombinations[7] = {105,107,110,111,113,114,115}; }; \ No newline at end of file diff --git a/src/computation.cpp b/src/computation.cpp index 315ba024..03b10b5f 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -1,4 +1,5 @@ #include "computation.h" +#include "surface/fluid_tracer.h" void Computation::initialize(int argc, char *argv[]) { @@ -23,6 +24,7 @@ void Computation::initialize(int argc, char *argv[]) discretization_ = std::make_shared(settings_.nCells, meshWidth_); } + // create boundary and tracer mask_ = std::make_shared(settings_); std::vector traceX = {1.8}; @@ -54,7 +56,7 @@ void Computation::runSimulation() { double currentTime = 0.; do - { + { applyBoundaryValues(); computeTimeStepWidth(currentTime); computePreliminaryVelocities(); @@ -76,6 +78,7 @@ void Computation::runSimulation() void Computation::applyBoundaryValues() { + // set Dirichlet BC boundary_->setVelocityBoundaryValues(); } @@ -102,30 +105,30 @@ void Computation::computeTimeStepWidth(double currentTime) void Computation::computePreliminaryVelocities() { - // Compute F + // F for (int i = discretization_->fIBegin(); i < discretization_->fIEnd(); i++) { for (int j = discretization_->fJBegin(); j < discretization_->fJEnd(); j++) { - if (mask_->isFluid(i, j)) + if ((*mask_)(i, j) == 15 && (*mask_)(i + 1, j) == 15) { double diffusion = 1 / settings_.re * (discretization_->computeD2uDx2(i, j) + discretization_->computeD2uDy2(i, j)); double convection = -discretization_->computeDu2Dx(i, j) - discretization_->computeDuvDy(i, j); - discretization_->f(i, j) = discretization_->u(i, j) + dt_ * (diffusion + convection + settings_.g[0]); + discretization_->f(i, j) = discretization_->u(i, j) + dt_ * (diffusion + convection + settings_.g[0]); } } } - // Compute G + // G for (int i = discretization_->gIBegin(); i < discretization_->gIEnd(); i++) { for (int j = discretization_->gJBegin(); j < discretization_->gJEnd(); j++) { - if (mask_->isFluid(i, j)) + if ((*mask_)(i, j) == 15 && (*mask_)(i, j + 1) == 15) { - double diffusion = 1 / settings_.re * (discretization_->computeD2vDx2(i, j) + discretization_->computeD2vDy2(i, j)); - double convection = -discretization_->computeDv2Dy(i, j) - discretization_->computeDuvDx(i, j); - discretization_->g(i, j) = discretization_->v(i, j) + dt_ * (diffusion + convection + settings_.g[1]); + double diffusion = 1 / settings_.re * (discretization_->computeD2vDx2(i, j) + discretization_->computeD2vDy2(i, j)); + double convection = -discretization_->computeDv2Dy(i, j) - discretization_->computeDuvDx(i, j); + discretization_->g(i, j) = discretization_->v(i, j) + dt_ * (diffusion + convection + settings_.g[1]); } } } @@ -133,15 +136,19 @@ void Computation::computePreliminaryVelocities() void Computation::computeRightHandSide() { + + // Interior + for (int i = discretization_->rhsIBegin(); i < discretization_->rhsIEnd(); i++) { for (int j = discretization_->rhsJBegin(); j < discretization_->rhsJEnd(); j++) - { - if (mask_->isFluid(i, j)) + { + if ((*mask_)(i, j) == 15) { - double dF = (1 / discretization_->dx()) * (discretization_->f(i, j) - discretization_->f(i - 1, j)); - double dG = (1 / discretization_->dy()) * (discretization_->g(i, j) - discretization_->g(i, j - 1)); - discretization_->rhs(i, j) = (1 / dt_) * (dF + dG); + double dF = (1 / discretization_->dx()) * (discretization_->f(i, j) - discretization_->f(i - 1, j)); + double dG = (1 / discretization_->dy()) * (discretization_->g(i, j) - discretization_->g(i, j - 1)); + discretization_->rhs(i, j) = (1 / dt_) * (dF + dG); + } } } @@ -154,23 +161,22 @@ void Computation::computePressure() void Computation::computeVelocities() { - // Compute u - for (int i = discretization_->uIBegin(); i < discretization_->uIEnd(); i++) + for (int i = discretization_->uIBegin() + 1; i < discretization_->uIEnd() - 1; i++) { - for (int j = discretization_->uJBegin(); j < discretization_->uJEnd(); j++) + for (int j = discretization_->uJBegin() + 1; j < discretization_->uJEnd() - 1; j++) { - if (mask_->isFluid(i, j)) + if ((*mask_)(i, j) == 15 && (*mask_)(i + 1, j) == 15) discretization_->u(i, j) = discretization_->f(i, j) - dt_ * discretization_->computeDpDx(i, j); } } - // Compute v for (int i = discretization_->vIBegin() + 1; i < discretization_->vIEnd() - 1; i++) { for (int j = discretization_->vJBegin() + 1; j < discretization_->vJEnd() - 1; j++) { - if (mask_->isFluid(i, j)) - discretization_->v(i, j) = discretization_->g(i, j) - dt_ * discretization_->computeDpDy(i, j); + if ((*mask_)(i, j) == 15 && (*mask_)(i, j + 1) == 15){ + discretization_->v(i, j) = discretization_->g(i, j) - dt_ * discretization_->computeDpDy(i, j); + } } } } diff --git a/src/solver/gauss_seidel.cpp b/src/solver/gauss_seidel.cpp index f01d71ad..dc0be3ce 100644 --- a/src/solver/gauss_seidel.cpp +++ b/src/solver/gauss_seidel.cpp @@ -21,11 +21,10 @@ void GaussSeidel::solve() { for (int j = j_beg; j < j_end; j++) { - if (boundary_->mask_->isFluid(i,j)){ - double p_x = 1 / dx2 * (discretization_->p(i + 1, j) + discretization_->p(i - 1, j)); - double p_y = 1 / dy2 * (discretization_->p(i, j + 1) + discretization_->p(i, j - 1)); - - discretization_->p(i, j) = d_fac * (p_x + p_y - discretization_->rhs(i, j)); + if(boundary_->mask_->isFluid(i,j)){ + double p_x = 1 / dx2 * (discretization_->p(i + 1, j) + discretization_->p(i - 1, j)); + double p_y = 1 / dy2 * (discretization_->p(i, j + 1) + discretization_->p(i, j - 1)); + discretization_->p(i, j) = d_fac * (p_x + p_y - discretization_->rhs(i, j)); } } } diff --git a/src/solver/pressure_solver.cpp b/src/solver/pressure_solver.cpp index 3f43de47..1d054c5c 100644 --- a/src/solver/pressure_solver.cpp +++ b/src/solver/pressure_solver.cpp @@ -46,14 +46,12 @@ double PressureSolver::calculateResiduum() { for (int j = j_beg; j < j_end; j++) { - // if (mask_->isNotFluid(i, j)) - // { - // continue; - // } - pxx = (discretization_->p(i - 1, j) - 2 * discretization_->p(i, j) + discretization_->p(i + 1, j)) / dx2; - pyy = (discretization_->p(i, j - 1) - 2 * discretization_->p(i, j) + discretization_->p(i, j + 1)) / dy2; - res_current_point = pxx + pyy - discretization_->rhs(i, j); - sum_of_squares += pow(res_current_point, 2); + if(boundary_->mask_->isFluid(i,j)){ + pxx = (discretization_->p(i - 1, j) - 2 * discretization_->p(i, j) + discretization_->p(i + 1, j)) / dx2; + pyy = (discretization_->p(i, j - 1) - 2 * discretization_->p(i, j) + discretization_->p(i, j + 1)) / dy2; + res_current_point = pxx + pyy - discretization_->rhs(i, j); + sum_of_squares += pow(res_current_point, 2); + } } } return sqrt(sum_of_squares / N); diff --git a/src/solver/sor.cpp b/src/solver/sor.cpp index e466df50..6fbbb14e 100644 --- a/src/solver/sor.cpp +++ b/src/solver/sor.cpp @@ -23,7 +23,8 @@ void SOR::solve() { for (int j = j_beg; j < j_end; j++) { - if (boundary_->mask_->isFluid(i,j)){ + if (boundary_->mask_->isFluid(i, j)) + { p_x = 1 / dx2 * (discretization_->p(i + 1, j) + discretization_->p(i - 1, j)); p_y = 1 / dy2 * (discretization_->p(i, j + 1) + discretization_->p(i, j - 1)); discretization_->p(i, j) = (1 - omega_) * discretization_->p(i, j) + omega_ * (d_fac * (p_x + p_y - discretization_->rhs(i, j))); @@ -31,7 +32,6 @@ void SOR::solve() } } setBoundaryValues(); - // Compute the residual with new values res = calculateResiduum(); n++; } while (n < maximumNumberOfIterations_ && res > epsilon_); From 355d0d4cc73ffb26fcd7e4d27fa779d2bb9982db Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Sun, 4 Feb 2024 11:05:30 +0100 Subject: [PATCH 27/67] nothing new --- input/settings_debug.txt | 10 +++++----- src/computation.cpp | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/input/settings_debug.txt b/input/settings_debug.txt index 9eb0d0cd..caff9594 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -39,12 +39,12 @@ PressureLeft = 100.0 # Create Rectangular object in domain -createRectangularObject = true +createRectangularObject = false -obstaclePositionX = 0.5 -obstaclePositionY = 0.5 -obstacleDimensionX = 0.5 -obstacleDimensionY = 0.5 +obstaclePositionX = 0.8 +obstaclePositionY = 0.8 +obstacleDimensionX = 0.4 +obstacleDimensionY = 0.4 # Create domain from PNGBitmap diff --git a/src/computation.cpp b/src/computation.cpp index 03b10b5f..f142a2ac 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -110,7 +110,7 @@ void Computation::computePreliminaryVelocities() { for (int j = discretization_->fJBegin(); j < discretization_->fJEnd(); j++) { - if ((*mask_)(i, j) == 15 && (*mask_)(i + 1, j) == 15) + if ((*mask_)(i, j) == Mask::FLUID && (*mask_)(i + 1, j) == Mask::FLUID) { double diffusion = 1 / settings_.re * (discretization_->computeD2uDx2(i, j) + discretization_->computeD2uDy2(i, j)); double convection = -discretization_->computeDu2Dx(i, j) - discretization_->computeDuvDy(i, j); @@ -124,7 +124,7 @@ void Computation::computePreliminaryVelocities() { for (int j = discretization_->gJBegin(); j < discretization_->gJEnd(); j++) { - if ((*mask_)(i, j) == 15 && (*mask_)(i, j + 1) == 15) + if ((*mask_)(i, j) == Mask::FLUID && (*mask_)(i, j + 1) == Mask::FLUID) { double diffusion = 1 / settings_.re * (discretization_->computeD2vDx2(i, j) + discretization_->computeD2vDy2(i, j)); double convection = -discretization_->computeDv2Dy(i, j) - discretization_->computeDuvDx(i, j); From 389628b9803d99e937400b2e6d9f87036ca8df6d Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Sun, 4 Feb 2024 14:23:09 +0100 Subject: [PATCH 28/67] finally functional --- input/settings_debug.txt | 26 +++++++++++++------------- src/boundary/boundary.cpp | 20 ++++++++++++++++++++ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/input/settings_debug.txt b/input/settings_debug.txt index caff9594..2ca10728 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -4,8 +4,8 @@ # Problem description physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 -endTime = 10.0 # duration of the simulation -re = 1000 # Reynolds number +endTime = 0.1 # duration of the simulation +re = 10000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity gY = 0.0 @@ -13,9 +13,9 @@ gY = 0.0 # Boundary Conditions Type BCTop = NoSlip -BCRight = NoSlip +BCRight = Pressure BCBottom = NoSlip -BCLeft = NoSlip +BCLeft = Pressure # NoSlip boundary conditions @@ -33,7 +33,7 @@ NoSlipVelLeftY = 0 # Pressure BoundaryConditions PressureTop = 0 -PressureRight = 10.0 +PressureRight = 0.0 PressureBottom = 0 PressureLeft = 100.0 @@ -41,19 +41,19 @@ PressureLeft = 100.0 createRectangularObject = false -obstaclePositionX = 0.8 -obstaclePositionY = 0.8 -obstacleDimensionX = 0.4 -obstacleDimensionY = 0.4 +obstaclePositionX = 0.5 +obstaclePositionY = 0.5 +obstacleDimensionX = 0.5 +obstacleDimensionY = 0.5 # Create domain from PNGBitmap -createDomainfromBitmap = false +createDomainfromBitmap = true pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/legal_water.png # Discretization parameters -nCellsX = 20 # number of cells in x and y direction -nCellsY = 20 +nCellsX = 10 # number of cells in x and y direction +nCellsY = 10 useDonorCell = true # if donor cell discretization should be used, possible values: true false alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences tau = 0.5 # safety factor for time step width @@ -63,4 +63,4 @@ maximumDt = 0.1 # maximum values for time step width pressureSolver = SOR # which pressure solver to use, possible values: GaussSeidel SOR CG omega = 1.6 # overrelaxation factor, only for SOR solver epsilon = 1e-5 # tolerance for 2-norm of residual -maximumNumberOfIterations = 1e4 # maximum number of iterations in the solver +maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 195f7ff2..0caf5051 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -49,12 +49,16 @@ void Boundary::setPressureDomainBC() discretization_->p(i, j) = discretization_->p(i, j + 1); break; case Mask::DOMAIN_LEFT_PRESSURE: + discretization_->p(i, j) = settings_.PressureLeft; break; case Mask::DOMAIN_TOP_PRESSURE: + discretization_->p(i, j) = settings_.PressureTop; break; case Mask::DOMAIN_RIGHT_PRESSURE: + discretization_->p(i, j) = settings_.PressureRight; break; case Mask::DOMAIN_BOTTOM_PRESSURE: + discretization_->p(i, j) = settings_.PressureBottom; break; } } @@ -131,12 +135,28 @@ void Boundary::setVelocityDomainBC() discretization_->g(i, j) = discretization_->v(i, j); break; case Mask::DOMAIN_LEFT_PRESSURE: + discretization_->u(i, j) = discretization_->u(i+1, j); + discretization_->f(i, j) = discretization_->u(i, j); + discretization_->v(i, j) = discretization_->v(i+1, j); + discretization_->g(i, j) = discretization_->v(i, j); break; case Mask::DOMAIN_TOP_PRESSURE: + discretization_->u(i, j) = discretization_->u(i, j-1); + discretization_->f(i, j) = discretization_->u(i, j); + discretization_->v(i, j) = discretization_->v(i, j-1); + discretization_->g(i, j) = discretization_->v(i, j); break; case Mask::DOMAIN_RIGHT_PRESSURE: + discretization_->u(i, j) = discretization_->u(i-1, j); + discretization_->f(i, j) = discretization_->u(i, j); + discretization_->v(i, j) = discretization_->v(i-1, j); + discretization_->g(i, j) = discretization_->v(i, j); break; case Mask::DOMAIN_BOTTOM_PRESSURE: + discretization_->u(i, j) = discretization_->u(i, j+1); + discretization_->f(i, j) = discretization_->u(i, j); + discretization_->v(i, j) = discretization_->v(i, j+1); + discretization_->g(i, j) = discretization_->v(i, j); break; } } From a11035949912d69bd753c37efc5063d976c3f58d Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Sun, 4 Feb 2024 15:23:32 +0100 Subject: [PATCH 29/67] [Mask][Boundary Pressure] purged and Ctrl+C & Ctrl+V --- .vscode/settings.json | 3 +- input/settings_debug.txt | 6 +- src/boundary/boundary.cpp | 105 ++++++++++++++++++++++++++++++++++- src/boundary/boundary.h | 12 ++-- src/boundary/mask.cpp | 69 ++++++++++------------- src/boundary/mask.h | 31 ++--------- src/computation.cpp | 4 +- src/surface/fluid_tracer.cpp | 2 +- tests/test_mask.cpp | 2 +- 9 files changed, 149 insertions(+), 85 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index d9e2a74f..5d28c582 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -72,6 +72,7 @@ "typeindex": "cpp", "typeinfo": "cpp", "variant": "cpp", - "any": "cpp" + "any": "cpp", + "*.ipp": "cpp" } } diff --git a/input/settings_debug.txt b/input/settings_debug.txt index 2ca10728..23c6a77e 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -4,7 +4,7 @@ # Problem description physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 -endTime = 0.1 # duration of the simulation +endTime = 10.0 # duration of the simulation re = 10000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity gY = 0.0 @@ -39,7 +39,7 @@ PressureLeft = 100.0 # Create Rectangular object in domain -createRectangularObject = false +createRectangularObject = true obstaclePositionX = 0.5 obstaclePositionY = 0.5 @@ -48,7 +48,7 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap -createDomainfromBitmap = true +createDomainfromBitmap = false pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/legal_water.png # Discretization parameters diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 0caf5051..aa8c2fe0 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -13,16 +13,20 @@ void Boundary::createBoundaryCellsLists() { for (int j = 0; j < mask_->size()[1]; j++) { + int idx = i + j * mask_->size()[0]; if (mask_->isDomainBoundary(i, j)) - DomainBoundaryCells_.push_back(i + j * mask_->size()[0]); + DomainBoundaryCells_.push_back(idx); if (mask_->isObstacleBoundary(i, j)) - ObstacleBoundaryCells_.push_back(i + j * mask_->size()[0]); + ObstacleBoundaryCells_.push_back(idx); + if (mask_->isFluidBoundary(i, j)) + FluidBoundaryCells_.push_back(idx); } } } void Boundary::setPressureBoundaryValues() { + setPressureSurfaceBC(); setPressureDomainBC(); setPressureObstacleBC(); } @@ -100,6 +104,92 @@ void Boundary::setPressureObstacleBC() } } +void Boundary::setPressureSurfaceBC() +{ + double dx = discretization_->dx(); + double dy = discretization_->dy(); + + for (int idx : FluidBoundaryCells_) + { + int i = idx % mask_->size()[0]; + int j = idx / mask_->size()[0]; + + + + // u and v must be updated before p + switch((*mask_)(i, j)){ + case Mask::FLUID_BORDER_LEFT: + discretization_->p(i, j) = 2/settings_.re*(discretization_->u(i, j) - discretization_->u(i - 1, j))/dx; + break; + case Mask::FLUID_BORDER_TOP: + discretization_->p(i, j) = 2/settings_.re*(discretization_->v(i, j) - discretization_->v(i, j - 1))/dy; + break; + case Mask::FLUID_BORDER_RIGHT: + discretization_->p(i, j) = 2/settings_.re*(discretization_->u(i, j) - discretization_->u(i - 1, j))/dx; + break; + case Mask::FLUID_BORDER_BOTTOM: + discretization_->p(i, j) = 2/settings_.re*(discretization_->v(i, j) - discretization_->v(i, j - 1))/dy; + break; + case Mask::FLUID_CORNER_TOP_LEFT: + discretization_->p(i, j) = -1/(2 * settings_.re) * ( + 1/(2*dy) * (discretization_->u(i, j) + discretization_->u(i - 1, j) + +discretization_->u(i, j - 1) - discretization_->u(i - 1, j - 1)) + + 1/(2*dx) * (discretization_->v(i, j) + discretization_->v(i, j - 1) + +discretization_->v(i - 1, j) - discretization_->v(i - 1, j - 1)) + ); + break; + case Mask::FLUID_CORNER_TOP_RIGHT: + discretization_->p(i, j) = 1/(2 * settings_.re) * ( + 1/(2*dy) * (discretization_->u(i, j) + discretization_->u(i - 1, j) + +discretization_->u(i, j - 1) - discretization_->u(i - 1, j - 1)) + + 1/(2*dx) * (discretization_->v(i, j) + discretization_->v(i, j - 1) + +discretization_->v(i - 1, j) - discretization_->v(i - 1, j - 1)) + ); + break; + case Mask::FLUID_CORNER_BOTTOM_RIGHT: + discretization_->p(i, j) =-1/(2 * settings_.re) * ( + 1/(2*dy) * (discretization_->u(i, j) + discretization_->u(i - 1, j) + +discretization_->u(i, j - 1) - discretization_->u(i - 1, j - 1)) + + 1/(2*dx) * (discretization_->v(i, j) + discretization_->v(i, j - 1) + +discretization_->v(i - 1, j) - discretization_->v(i - 1, j - 1)) + ); + break; + case Mask::FLUID_CORNER_BOTTOM_LEFT: + discretization_->p(i, j) = 1/(2 * settings_.re) * ( + 1/(2*dy) * (discretization_->u(i, j) + discretization_->u(i - 1, j) + +discretization_->u(i, j - 1) - discretization_->u(i - 1, j - 1)) + + 1/(2*dy) * (discretization_->v(i, j) + discretization_->v(i, j - 1) + +discretization_->v(i - 1, j) - discretization_->v(i - 1, j - 1)) + ); + break; + case Mask::FLUID_COLUMN_VERTICAL: + discretization_->p(i, j) = 2/settings_.re * (discretization_->u(i, j) - discretization_->u(i - 1, j))/dx; + break; + case Mask::FLUID_COLUMN_HORIZONTAL: + discretization_->p(i, j) = 2/settings_.re * (discretization_->v(i, j) - discretization_->v(i, j - 1))/dy; + break; + case Mask::FLUID_SINGLE_LEFT: + discretization_->p(i, j) = 0; + break; + case Mask::FLUID_SINGLE_TOP: + discretization_->p(i, j) = 0; + break; + case Mask::FLUID_SINGLE_RIGHT: + discretization_->p(i, j) = 0; + break; + case Mask::FLUID_SINGLE_BOTTOM: + discretization_->p(i, j) = 0; + break; + case Mask::FLUID_DROPLET: + discretization_->p(i, j) = 0; + break; + + + ///////////////////////// + } +} +} + void Boundary::setVelocityBoundaryValues() { setVelocityDomainBC(); @@ -224,4 +314,13 @@ void Boundary::setVelocityObstacleBC() break; } } -} \ No newline at end of file +} + + +// bool Boundary::doCalculateF(int i, int j){ + +// } + +// bool Boundary::doCalcuteG(int i, int j){ + +// } diff --git a/src/boundary/boundary.h b/src/boundary/boundary.h index 04e91de6..628e0d40 100644 --- a/src/boundary/boundary.h +++ b/src/boundary/boundary.h @@ -12,27 +12,27 @@ class Boundary Boundary(std::shared_ptr mask, std::shared_ptr discretization, Settings settings); void setPressureBoundaryValues(); void setVelocityBoundaryValues(); - void createBoundaryCellsLists(); std::shared_ptr mask_; private: + void createBoundaryCellsLists(); + + // Set Pressure void setPressureDomainBC(); void setPressureObstacleBC(); - - void setPressureBoundaryObstacle(int i, int j); + void setPressureSurfaceBC(); + // Set Velocity void setVelocityDomainBC(); void setVelocityObstacleBC(); - void setVelocityBoundaryObstacleU(int i, int j); - void setVelocityBoundaryObstacleV(int i, int j); std::shared_ptr discretization_; Settings settings_; - std::vector boundaryCells_; std::vector DomainBoundaryCells_; std::vector ObstacleBoundaryCells_; + std::vector FluidBoundaryCells_; }; \ No newline at end of file diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index 21c42c50..ec775f4e 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -16,6 +16,7 @@ Mask::Mask( Settings settings) : settings_(settings) setDomainBC(); setObstacleBC(); + setFluidBC(); printMask(); } @@ -47,29 +48,24 @@ void Mask::resetMask() } } -void Mask::updateMaskBoundaries() +void Mask::setFluidBC() { - for (int i = 0; i < size_[0]; i++) - { - for (int j = 0; j < size_[1]; j++) - { + for (int i = 0; i < size_[0]; i++) { + for (int j = 0; j < size_[1]; j++) { int idx = i + j * size_[0]; if (Mask::isFluid(i, j)) { - data_[idx] = 1 * Mask::isNotAir(i - 1, j) - + 2 * Mask::isNotAir(i, j + 1) - + 4 * Mask::isNotAir(i + 1, j) - + 8 * Mask::isNotAir(i, j - 1); - + data_[idx] = 1 * !Mask::isAir(i - 1, j) + + 2 * !Mask::isAir(i, j + 1) + + 4 * !Mask::isAir(i + 1, j) + + 8 * !Mask::isAir(i, j - 1); } } } } - - bool Mask::isFluid(int i, int j) const { if (i < 0 || i >= size_[0] || j < 0 || j >= size_[1]){ @@ -84,40 +80,18 @@ bool Mask::isObstacle(int i, int j) const return (data_[i + j * size_[0]] >= OBSTACLE); } -bool Mask::isFluidBorder(int i, int j) const - { - return data_[i + j * size_[0]] < FLUID; - } - -bool Mask::isBorder(int i, int j) const - { - return isFluidBorder(i, j) || isObstacle(i, j); - } bool Mask::isAir(int i, int j) const { return (data_[i + j * size_[0]] == AIR); } -bool Mask::isNotAir(int i, int j) const - { - if (i < 0 || i >= size_[0] || j < 0 || j >= size_[1]) - { - return true; - } else { - return (data_[i + j * size_[0]] != AIR); - } - } -int Mask::getNumberOfFluidCells() const -{ +int Mask::getNumberOfFluidCells() const { int numFluidCells = 0; - for (int i = 0; i < size_[0]; i++) - { - for (int j = 0; j < size_[1]; j++) - { - if (isFluid(i, j)) - { + for (int i = 0; i < size_[0]; i++) { + for (int j = 0; j < size_[1]; j++) { + if (isFluid(i, j)) { numFluidCells++; } } @@ -126,13 +100,19 @@ int Mask::getNumberOfFluidCells() const } bool Mask::isDomainBoundary(int i, int j) const{ - return (*this)(i,j)>200; + return (*this)(i,j)>Mask::DOMAIN_BOUNDARY; } bool Mask::isObstacleBoundary(int i, int j) const{ - return ((*this)(i,j)>100 && (*this)(i,j)<200); + return ((*this)(i,j)>Mask::OBSTACLE_INSIDE && + (*this)(i,j)(settings_); - std::vector traceX = {1.8}; - std::vector traceY = {1.8}; + // std::vector traceX = {1.8}; + // std::vector traceY = {1.8}; boundary_ = std::make_shared(mask_, discretization_, settings_); diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index 77d29c3f..5b32e87b 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -95,7 +95,7 @@ void FluidTracer::moveParticles(double dt) { (*mask_)(idx_x, idx_y) = Mask::FLUID; } - mask_->updateMaskBoundaries(); + mask_->setFluidBC(); } int FluidTracer::val2CellX(double xVal){ diff --git a/tests/test_mask.cpp b/tests/test_mask.cpp index b47fe157..6eb44ffc 100644 --- a/tests/test_mask.cpp +++ b/tests/test_mask.cpp @@ -64,7 +64,7 @@ TEST(Mask, updateMaskBoundaries){ mask(3,3) = Mask::AIR; - mask.updateMaskBoundaries(); + mask.setFluidBC(); EXPECT_EQ(mask(3,2), Mask::FLUID_BORDER_TOP); EXPECT_EQ(mask(4,2), Mask::FLUID); EXPECT_EQ(mask(4,3), Mask::FLUID_BORDER_LEFT); From c75e621ab0ac3d43d296a7ffc198f19655f3b8bc Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Sun, 4 Feb 2024 16:11:55 +0100 Subject: [PATCH 30/67] [calculate F or G] --- src/boundary/boundary.cpp | 22 ++++++--- src/boundary/boundary.h | 4 ++ src/boundary/mask.cpp | 95 +++++++++++++++++++-------------------- src/boundary/mask.h | 44 +++++++----------- src/computation.cpp | 12 +++-- 5 files changed, 84 insertions(+), 93 deletions(-) diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index aa8c2fe0..6635948b 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -108,7 +108,7 @@ void Boundary::setPressureSurfaceBC() { double dx = discretization_->dx(); double dy = discretization_->dy(); - + for (int idx : FluidBoundaryCells_) { int i = idx % mask_->size()[0]; @@ -317,10 +317,18 @@ void Boundary::setVelocityObstacleBC() } -// bool Boundary::doCalculateF(int i, int j){ - -// } - -// bool Boundary::doCalcuteG(int i, int j){ +bool Boundary::doCalculateF(int i, int j) const { + if (mask_->isFluid(i, j) && mask_->isFluid(i + 1, j)){ + return true; + } else { + return false; + } +} -// } +bool Boundary::doCalculateG(int i, int j) const { + if (mask_->isFluid(i, j) && mask_->isFluid(i, j + 1)){ + return true; + } else { + return false; + } +} diff --git a/src/boundary/boundary.h b/src/boundary/boundary.h index 628e0d40..ea6d00a4 100644 --- a/src/boundary/boundary.h +++ b/src/boundary/boundary.h @@ -14,6 +14,10 @@ class Boundary void setVelocityBoundaryValues(); std::shared_ptr mask_; + + bool doCalculateF(int i, int j) const; + bool doCalculateG(int i, int j) const; + private: void createBoundaryCellsLists(); diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index ec775f4e..ec23490b 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -7,6 +7,7 @@ Mask::Mask( Settings settings) : settings_(settings) else { assert(settings_.nCells[0] > 0 && settings_.nCells[1] > 0); + size_ = {settings_.nCells[0] + 2, settings_.nCells[1] + 2}; data_.resize(size_[0] * size_[1], FLUID); } @@ -14,31 +15,27 @@ Mask::Mask( Settings settings) : settings_(settings) if (settings_.createRectangularObject) makeRectangularObstacle(); + setFluidBC(); setDomainBC(); setObstacleBC(); - setFluidBC(); printMask(); } -int &Mask::operator()(int i, int j) -{ +int &Mask::operator()(int i, int j) { assert(i >= 0 && i < size_[0] && j >= 0 && j < size_[1]); return data_[i + j * size_[0]]; } -int Mask::operator()(int i, int j) const -{ +int Mask::operator()(int i, int j) const { assert(i >= 0 && i < size_[0] && j >= 0 && j < size_[1]); return data_[i + j * size_[0]]; } -std::array Mask::size() const -{ +std::array Mask::size() const { return size_; } -void Mask::resetMask() -{ +void Mask::resetMask() { for (int i = 0; i < size_[0]; i++) { for (int j = 0; j < size_[1]; j++) { if (!isObstacle(i, j)) { @@ -48,44 +45,36 @@ void Mask::resetMask() } } -void Mask::setFluidBC() -{ - for (int i = 0; i < size_[0]; i++) { - for (int j = 0; j < size_[1]; j++) { - int idx = i + j * size_[0]; - - if (Mask::isFluid(i, j)) - { - data_[idx] = 1 * !Mask::isAir(i - 1, j) - + 2 * !Mask::isAir(i, j + 1) - + 4 * !Mask::isAir(i + 1, j) - + 8 * !Mask::isAir(i, j - 1); - } - } - } -} - - -bool Mask::isFluid(int i, int j) const - { - if (i < 0 || i >= size_[0] || j < 0 || j >= size_[1]){ - return false; - } else { +// Primitive type +bool Mask::isFluid(int i, int j) const { return (data_[i + j * size_[0]] < FLUID_TYPE); - } } -bool Mask::isObstacle(int i, int j) const - { +bool Mask::isObstacle(int i, int j) const { return (data_[i + j * size_[0]] >= OBSTACLE); } - -bool Mask::isAir(int i, int j) const - { +bool Mask::isAir(int i, int j) const { return (data_[i + j * size_[0]] == AIR); } +// Boundary type +bool Mask::isDomainBoundary(int i, int j) const{ + return (*this)(i,j)>Mask::DOMAIN_BOUNDARY; +} + +bool Mask::isObstacleBoundary(int i, int j) const{ + return ((*this)(i,j)>Mask::OBSTACLE_INSIDE && + (*this)(i,j)Mask::DOMAIN_BOUNDARY; -} - -bool Mask::isObstacleBoundary(int i, int j) const{ - return ((*this)(i,j)>Mask::OBSTACLE_INSIDE && - (*this)(i,j)fJBegin(); j < discretization_->fJEnd(); j++) { - if ((*mask_)(i, j) == Mask::FLUID && (*mask_)(i + 1, j) == Mask::FLUID) + if (boundary_->doCalculateF(i, j)) { double diffusion = 1 / settings_.re * (discretization_->computeD2uDx2(i, j) + discretization_->computeD2uDy2(i, j)); double convection = -discretization_->computeDu2Dx(i, j) - discretization_->computeDuvDy(i, j); @@ -124,7 +124,7 @@ void Computation::computePreliminaryVelocities() { for (int j = discretization_->gJBegin(); j < discretization_->gJEnd(); j++) { - if ((*mask_)(i, j) == Mask::FLUID && (*mask_)(i, j + 1) == Mask::FLUID) + if (boundary_->doCalculateG(i, j)) { double diffusion = 1 / settings_.re * (discretization_->computeD2vDx2(i, j) + discretization_->computeD2vDy2(i, j)); double convection = -discretization_->computeDv2Dy(i, j) - discretization_->computeDuvDx(i, j); @@ -137,13 +137,11 @@ void Computation::computePreliminaryVelocities() void Computation::computeRightHandSide() { - // Interior - for (int i = discretization_->rhsIBegin(); i < discretization_->rhsIEnd(); i++) { for (int j = discretization_->rhsJBegin(); j < discretization_->rhsJEnd(); j++) { - if ((*mask_)(i, j) == 15) + if (mask_->isInnerFluid(i, j)) { double dF = (1 / discretization_->dx()) * (discretization_->f(i, j) - discretization_->f(i - 1, j)); double dG = (1 / discretization_->dy()) * (discretization_->g(i, j) - discretization_->g(i, j - 1)); @@ -165,7 +163,7 @@ void Computation::computeVelocities() { for (int j = discretization_->uJBegin() + 1; j < discretization_->uJEnd() - 1; j++) { - if ((*mask_)(i, j) == 15 && (*mask_)(i + 1, j) == 15) + if (boundary_->doCalculateF(i, j)) discretization_->u(i, j) = discretization_->f(i, j) - dt_ * discretization_->computeDpDx(i, j); } } @@ -174,7 +172,7 @@ void Computation::computeVelocities() { for (int j = discretization_->vJBegin() + 1; j < discretization_->vJEnd() - 1; j++) { - if ((*mask_)(i, j) == 15 && (*mask_)(i, j + 1) == 15){ + if (boundary_->doCalculateG(i, j)){ discretization_->v(i, j) = discretization_->g(i, j) - dt_ * discretization_->computeDpDy(i, j); } } From 3b10e918bd4c544db76110731008e00b31b2b985 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Sun, 4 Feb 2024 16:27:42 +0100 Subject: [PATCH 31/67] [Test][PNG does complain -> of minor importance for now] --- CMakeLists.txt | 2 +- tests/discrectization_tests.md | 35 -- tests/test_boundary.cpp | 14 +- tests/test_fluid_tracer.cpp | 734 ++++++++++++++++----------------- tests/test_mask.cpp | 45 +- 5 files changed, 399 insertions(+), 431 deletions(-) delete mode 100644 tests/discrectization_tests.md diff --git a/CMakeLists.txt b/CMakeLists.txt index 72ac5c8a..88055bf0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,4 +2,4 @@ cmake_minimum_required(VERSION 3.8) project(numsim) add_subdirectory(src) -#add_subdirectory(tests) \ No newline at end of file +# add_subdirectory(tests) \ No newline at end of file diff --git a/tests/discrectization_tests.md b/tests/discrectization_tests.md deleted file mode 100644 index 2807e809..00000000 --- a/tests/discrectization_tests.md +++ /dev/null @@ -1,35 +0,0 @@ -# Tests for the Domain of Discretization - - -## Array2d - -### Constructor - -### Getter - -### Setter - -### Special Values -* Nan -* Null -* double limits - - -## FieldVariable - - -## Staggered Grid - - -## Discretization - - -## DonorCell -As a grid we use -![grid](media/docGrid.svg) - -TODO: -Here I want to draw in the calculations I do in the test files (but Inkscape is striking in the moment) -![grid_with_annotation](media/docGrid_convection.svg) - -## CentralDifferences \ No newline at end of file diff --git a/tests/test_boundary.cpp b/tests/test_boundary.cpp index b0bb90b7..1e3fc104 100644 --- a/tests/test_boundary.cpp +++ b/tests/test_boundary.cpp @@ -3,12 +3,16 @@ #include "../src/discretization/central_differences.h" TEST(Boundary, BoundaryCellsWithoutObstacle) { - std::array n_cells = {4,3}; - std::array meshWidth = {1.0, 1.0}; - std::shared_ptr mask = std::make_shared(n_cells); - std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); Settings settings; + settings.nCells = {10, 10}; + settings.obstaclePosition = {0.45, 0.45}; + settings.obstacleDimension = {0.1, 0.1}; + settings.physicalSize = {1.0, 1.0}; + std::array meshWidth = {settings.physicalSize[0] / settings.nCells[0], settings.physicalSize[1] / settings.nCells[1]}; + + std::shared_ptr mask = std::make_shared(settings); + std::shared_ptr discretization = std::make_shared(settings.nCells, meshWidth); + Boundary boundary(mask, discretization, settings); - EXPECT_EQ(boundary.getNumberOfBoundaryCells(), 18); }; diff --git a/tests/test_fluid_tracer.cpp b/tests/test_fluid_tracer.cpp index f03a9809..5ec7bbb1 100644 --- a/tests/test_fluid_tracer.cpp +++ b/tests/test_fluid_tracer.cpp @@ -1,379 +1,379 @@ -#include -#include "../src/surface/fluid_tracer.h" -#include "../src/discretization/central_differences.h" - -// Experimental stuff -#include - -TEST(FluidTracer, NumberParticlesSingleCell){ - /* - Test for a single cell (with 8 boundary cells) how many particles are placed - */ - std::array n_cells = {1, 1}; - std::array meshWidth = {1.0, 1.0}; - std::shared_ptr mask = std::make_shared(n_cells); - std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); - int numParticlesPerCell = 1; - FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); - EXPECT_GE(fluid_tracer.getNumberOfParticles(), numParticlesPerCell); - - int numParticlesPerCell2 = 9; - FluidTracer fluid_tracer2(numParticlesPerCell2, discretization, mask); - EXPECT_GE(fluid_tracer2.getNumberOfParticles(), numParticlesPerCell2); - - int numParticlesPerCell3 = 17; - FluidTracer fluid_tracer3(numParticlesPerCell3, discretization, mask); - EXPECT_GE(fluid_tracer3.getNumberOfParticles(), numParticlesPerCell3); - - int numParticlesPerCell4 = 100; - FluidTracer fluid_tracer4(numParticlesPerCell4, discretization, mask); - EXPECT_GE(fluid_tracer4.getNumberOfParticles(), numParticlesPerCell4); - EXPECT_GE(fluid_tracer4.getNumberOfParticles(), fluid_tracer3.getNumberOfParticles()); - EXPECT_LE(fluid_tracer4.getNumberOfParticles(), 2 * numParticlesPerCell4); -}; - -TEST(FluidTracer, DistributionSingleCell){ - /* - Test for a single cell (with 8 boundary cells) how many particles are placed - */ - std::array n_cells = {1, 1}; - std::array meshWidth = {1.0, 1.0}; - std::shared_ptr mask = std::make_shared(n_cells); - std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); - int numParticlesPerCell = 1; - FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); - EXPECT_NEAR(fluid_tracer.getParticlePosition(0)[0], 0.5, 0.001); - EXPECT_NEAR(fluid_tracer.getParticlePosition(0)[1], 0.5, 0.001); - - int numParticlesPerCell2 = 9; - FluidTracer fluid_tracer2(numParticlesPerCell2, discretization, mask); - EXPECT_NEAR(fluid_tracer2.getParticlePosition(0)[0], 0.166667, 0.001); - EXPECT_NEAR(fluid_tracer2.getParticlePosition(0)[1], 0.166667, 0.001); - EXPECT_NEAR(fluid_tracer2.getParticlePosition(1)[0], 0.5, 0.001); - EXPECT_NEAR(fluid_tracer2.getParticlePosition(1)[1], 0.166667, 0.001); - EXPECT_NEAR(fluid_tracer2.getParticlePosition(4)[0], 0.5, 0.001); - EXPECT_NEAR(fluid_tracer2.getParticlePosition(4)[1], 0.5, 0.001); - EXPECT_NEAR(fluid_tracer2.getParticlePosition(8)[0], 0.833333, 0.001); - EXPECT_NEAR(fluid_tracer2.getParticlePosition(8)[1], 0.833333, 0.001); - - int numParticlesPerCell3 = 17; - FluidTracer fluid_tracer3(numParticlesPerCell3, discretization, mask); - EXPECT_NEAR(fluid_tracer3.getParticlePosition(0)[0], 0.125, 0.1); - EXPECT_NEAR(fluid_tracer3.getParticlePosition(0)[1], 0.1, 0.1); - EXPECT_NEAR(fluid_tracer3.getParticlePosition(1)[0], 0.375, 0.1); - EXPECT_NEAR(fluid_tracer3.getParticlePosition(1)[1], 0.1, 0.1); - -} - -TEST(FluidTracer, GridSingleCellUnevenDxDy){ - std::array n_cells = {1, 1}; - std::array meshWidth1 = {1.0, 0.5}; - std::shared_ptr mask = std::make_shared(n_cells); - std::shared_ptr discretization = std::make_shared(n_cells, meshWidth1); - int numParticlesPerCell = 16; - FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); -} - - -TEST(FluidTracer, val2CellXAndY){ - std::array n_cells = {1, 1}; - std::array meshWidth = {1.0, 1.0}; - std::shared_ptr mask = std::make_shared(n_cells); - std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); - int numParticlesPerCell = 9; - FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); - EXPECT_EQ(fluid_tracer.val2CellX(0.5), 1); - EXPECT_EQ(fluid_tracer.val2CellX(0.0), 1); - EXPECT_EQ(fluid_tracer.val2CellX(-0.5), 0); - EXPECT_EQ(fluid_tracer.val2CellX(1.5), 2); - - EXPECT_EQ(fluid_tracer.val2CellY(0.5), 1); - EXPECT_EQ(fluid_tracer.val2CellY(0.0), 1); - EXPECT_EQ(fluid_tracer.val2CellY(-0.5), 0); - EXPECT_EQ(fluid_tracer.val2CellY(1.5), 2); -} - -TEST(FluidTracer, moveParticles_1Cell_1Particle_WithoutCollision){ - // u(0,2) ----- u(1,2) - // : : - // v(0,1) |____v(1,1)_____| v(2,1) - // | | - // u(0,1) ----- u(1,1) - // | | - // v(0,0) |____v(1,0)_____| v(2,0) - // : : - // u(0,0) ----- u(1,0) - // +// #include +// #include "../src/surface/fluid_tracer.h" +// #include "../src/discretization/central_differences.h" + +// // Experimental stuff +// #include + +// TEST(FluidTracer, NumberParticlesSingleCell){ +// /* +// Test for a single cell (with 8 boundary cells) how many particles are placed +// */ +// std::array n_cells = {1, 1}; +// std::array meshWidth = {1.0, 1.0}; +// std::shared_ptr mask = std::make_shared(n_cells); +// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); +// int numParticlesPerCell = 1; +// FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); +// EXPECT_GE(fluid_tracer.getNumberOfParticles(), numParticlesPerCell); + +// int numParticlesPerCell2 = 9; +// FluidTracer fluid_tracer2(numParticlesPerCell2, discretization, mask); +// EXPECT_GE(fluid_tracer2.getNumberOfParticles(), numParticlesPerCell2); + +// int numParticlesPerCell3 = 17; +// FluidTracer fluid_tracer3(numParticlesPerCell3, discretization, mask); +// EXPECT_GE(fluid_tracer3.getNumberOfParticles(), numParticlesPerCell3); + +// int numParticlesPerCell4 = 100; +// FluidTracer fluid_tracer4(numParticlesPerCell4, discretization, mask); +// EXPECT_GE(fluid_tracer4.getNumberOfParticles(), numParticlesPerCell4); +// EXPECT_GE(fluid_tracer4.getNumberOfParticles(), fluid_tracer3.getNumberOfParticles()); +// EXPECT_LE(fluid_tracer4.getNumberOfParticles(), 2 * numParticlesPerCell4); +// }; + +// TEST(FluidTracer, DistributionSingleCell){ +// /* +// Test for a single cell (with 8 boundary cells) how many particles are placed +// */ +// std::array n_cells = {1, 1}; +// std::array meshWidth = {1.0, 1.0}; +// std::shared_ptr mask = std::make_shared(n_cells); +// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); +// int numParticlesPerCell = 1; +// FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); +// EXPECT_NEAR(fluid_tracer.getParticlePosition(0)[0], 0.5, 0.001); +// EXPECT_NEAR(fluid_tracer.getParticlePosition(0)[1], 0.5, 0.001); + +// int numParticlesPerCell2 = 9; +// FluidTracer fluid_tracer2(numParticlesPerCell2, discretization, mask); +// EXPECT_NEAR(fluid_tracer2.getParticlePosition(0)[0], 0.166667, 0.001); +// EXPECT_NEAR(fluid_tracer2.getParticlePosition(0)[1], 0.166667, 0.001); +// EXPECT_NEAR(fluid_tracer2.getParticlePosition(1)[0], 0.5, 0.001); +// EXPECT_NEAR(fluid_tracer2.getParticlePosition(1)[1], 0.166667, 0.001); +// EXPECT_NEAR(fluid_tracer2.getParticlePosition(4)[0], 0.5, 0.001); +// EXPECT_NEAR(fluid_tracer2.getParticlePosition(4)[1], 0.5, 0.001); +// EXPECT_NEAR(fluid_tracer2.getParticlePosition(8)[0], 0.833333, 0.001); +// EXPECT_NEAR(fluid_tracer2.getParticlePosition(8)[1], 0.833333, 0.001); + +// int numParticlesPerCell3 = 17; +// FluidTracer fluid_tracer3(numParticlesPerCell3, discretization, mask); +// EXPECT_NEAR(fluid_tracer3.getParticlePosition(0)[0], 0.125, 0.1); +// EXPECT_NEAR(fluid_tracer3.getParticlePosition(0)[1], 0.1, 0.1); +// EXPECT_NEAR(fluid_tracer3.getParticlePosition(1)[0], 0.375, 0.1); +// EXPECT_NEAR(fluid_tracer3.getParticlePosition(1)[1], 0.1, 0.1); + +// } + +// TEST(FluidTracer, GridSingleCellUnevenDxDy){ +// std::array n_cells = {1, 1}; +// std::array meshWidth1 = {1.0, 0.5}; +// std::shared_ptr mask = std::make_shared(n_cells); +// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth1); +// int numParticlesPerCell = 16; +// FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); +// } + + +// TEST(FluidTracer, val2CellXAndY){ +// std::array n_cells = {1, 1}; +// std::array meshWidth = {1.0, 1.0}; +// std::shared_ptr mask = std::make_shared(n_cells); +// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); +// int numParticlesPerCell = 9; +// FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); +// EXPECT_EQ(fluid_tracer.val2CellX(0.5), 1); +// EXPECT_EQ(fluid_tracer.val2CellX(0.0), 1); +// EXPECT_EQ(fluid_tracer.val2CellX(-0.5), 0); +// EXPECT_EQ(fluid_tracer.val2CellX(1.5), 2); + +// EXPECT_EQ(fluid_tracer.val2CellY(0.5), 1); +// EXPECT_EQ(fluid_tracer.val2CellY(0.0), 1); +// EXPECT_EQ(fluid_tracer.val2CellY(-0.5), 0); +// EXPECT_EQ(fluid_tracer.val2CellY(1.5), 2); +// } + +// TEST(FluidTracer, moveParticles_1Cell_1Particle_WithoutCollision){ +// // u(0,2) ----- u(1,2) +// // : : +// // v(0,1) |____v(1,1)_____| v(2,1) +// // | | +// // u(0,1) ----- u(1,1) +// // | | +// // v(0,0) |____v(1,0)_____| v(2,0) +// // : : +// // u(0,0) ----- u(1,0) +// // - std::array n_cells = {1, 1}; - std::array meshWidth = {1.0, 1.0}; - std::shared_ptr mask = std::make_shared(n_cells); - std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); +// std::array n_cells = {1, 1}; +// std::array meshWidth = {1.0, 1.0}; +// std::shared_ptr mask = std::make_shared(n_cells); +// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); - std::array velocitiesU = {-1, -0.1, -0.01, 0, 0.01, 0.1, 1}; - std::array velocitiesV = {-1, -0.1, -0.01, 0, 0.01, 0.1, 1}; +// std::array velocitiesU = {-1, -0.1, -0.01, 0, 0.01, 0.1, 1}; +// std::array velocitiesV = {-1, -0.1, -0.01, 0, 0.01, 0.1, 1}; - // Checks 49 Cases - for (int idx_u = 0; idx_u < velocitiesU.size(); idx_u++){ - for (int idx_v = 0; idx_v < velocitiesV.size(); idx_v++){ - - // Set all velocities to the same value - discretization->u(0,0) = velocitiesU[idx_u]; - discretization->u(1,0) = velocitiesU[idx_u]; - discretization->u(0,1) = velocitiesU[idx_u]; - discretization->u(1,1) = velocitiesU[idx_u]; - discretization->u(0,2) = velocitiesU[idx_u]; - discretization->u(1,2) = velocitiesU[idx_u]; - - discretization->v(0,0) = velocitiesV[idx_v]; - discretization->v(1,0) = velocitiesV[idx_v]; - discretization->v(2,0) = velocitiesV[idx_v]; - discretization->v(0,1) = velocitiesV[idx_v]; - discretization->v(1,1) = velocitiesV[idx_v]; - discretization->v(2,1) = velocitiesV[idx_v]; - - // Initialize Fluid tracer with single particle - int numParticlesPerCell = 1; - FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); - double old_pos_x = fluid_tracer.getParticlePosition(0)[0]; - double old_pos_y = fluid_tracer.getParticlePosition(0)[1]; - EXPECT_EQ(fluid_tracer.getNumberOfParticles(), 1); - EXPECT_EQ(old_pos_x, 0.5); - EXPECT_EQ(old_pos_y, 0.5); - - - // Update particle according to velocity - - double dt = 0.1; // - fluid_tracer.moveParticles(dt); - EXPECT_EQ(fluid_tracer.getParticlePosition(0)[0], old_pos_x + dt * velocitiesU[idx_u]); - EXPECT_EQ(fluid_tracer.getParticlePosition(0)[1], old_pos_y + dt * velocitiesV[idx_v]); - } - } -} - - -TEST(FluidTracer, moveParticles_1Cell_1Particle_WithCollision){ - // u(0,2) ----- u(1,2) - // : : - // v(0,1) |____v(1,1)_____| v(2,1) - // | | - // u(0,1) ----- u(1,1) - // | | - // v(0,0) |____v(1,0)_____| v(2,0) - // : : - // u(0,0) ----- u(1,0) - // - - // TODO: check obstacle edges +// // Checks 49 Cases +// for (int idx_u = 0; idx_u < velocitiesU.size(); idx_u++){ +// for (int idx_v = 0; idx_v < velocitiesV.size(); idx_v++){ + +// // Set all velocities to the same value +// discretization->u(0,0) = velocitiesU[idx_u]; +// discretization->u(1,0) = velocitiesU[idx_u]; +// discretization->u(0,1) = velocitiesU[idx_u]; +// discretization->u(1,1) = velocitiesU[idx_u]; +// discretization->u(0,2) = velocitiesU[idx_u]; +// discretization->u(1,2) = velocitiesU[idx_u]; + +// discretization->v(0,0) = velocitiesV[idx_v]; +// discretization->v(1,0) = velocitiesV[idx_v]; +// discretization->v(2,0) = velocitiesV[idx_v]; +// discretization->v(0,1) = velocitiesV[idx_v]; +// discretization->v(1,1) = velocitiesV[idx_v]; +// discretization->v(2,1) = velocitiesV[idx_v]; + +// // Initialize Fluid tracer with single particle +// int numParticlesPerCell = 1; +// FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); +// double old_pos_x = fluid_tracer.getParticlePosition(0)[0]; +// double old_pos_y = fluid_tracer.getParticlePosition(0)[1]; +// EXPECT_EQ(fluid_tracer.getNumberOfParticles(), 1); +// EXPECT_EQ(old_pos_x, 0.5); +// EXPECT_EQ(old_pos_y, 0.5); + + +// // Update particle according to velocity + +// double dt = 0.1; // +// fluid_tracer.moveParticles(dt); +// EXPECT_EQ(fluid_tracer.getParticlePosition(0)[0], old_pos_x + dt * velocitiesU[idx_u]); +// EXPECT_EQ(fluid_tracer.getParticlePosition(0)[1], old_pos_y + dt * velocitiesV[idx_v]); +// } +// } +// } + + +// TEST(FluidTracer, moveParticles_1Cell_1Particle_WithCollision){ +// // u(0,2) ----- u(1,2) +// // : : +// // v(0,1) |____v(1,1)_____| v(2,1) +// // | | +// // u(0,1) ----- u(1,1) +// // | | +// // v(0,0) |____v(1,0)_____| v(2,0) +// // : : +// // u(0,0) ----- u(1,0) +// // + +// // TODO: check obstacle edges - std::array n_cells = {1, 1}; - std::array meshWidth = {1.0, 1.0}; - std::shared_ptr mask = std::make_shared(n_cells); - std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); - - std::array velocitiesU = {-6, -1, 1, 6}; - std::array velocitiesV = {-6, -1, 1, 6}; - // std::array velocitiesU = {8}; - // std::array velocitiesV = {1}; +// std::array n_cells = {1, 1}; +// std::array meshWidth = {1.0, 1.0}; +// std::shared_ptr mask = std::make_shared(n_cells); +// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); + +// std::array velocitiesU = {-6, -1, 1, 6}; +// std::array velocitiesV = {-6, -1, 1, 6}; +// // std::array velocitiesU = {8}; +// // std::array velocitiesV = {1}; -// Checks 16 Cases --> 0°, 27°, 45°, 63°, 90°, ... - for (int idx_u = 0; idx_u < velocitiesU.size(); idx_u++){ - for (int idx_v = 0; idx_v < velocitiesV.size(); idx_v++){ - - // Set all velocities to the same value - discretization->u(0,0) = velocitiesU[idx_u]; - discretization->u(1,0) = velocitiesU[idx_u]; - discretization->u(0,1) = velocitiesU[idx_u]; - discretization->u(1,1) = velocitiesU[idx_u]; - discretization->u(0,2) = velocitiesU[idx_u]; - discretization->u(1,2) = velocitiesU[idx_u]; - - discretization->v(0,0) = velocitiesV[idx_v]; - discretization->v(1,0) = velocitiesV[idx_v]; - discretization->v(2,0) = velocitiesV[idx_v]; - discretization->v(0,1) = velocitiesV[idx_v]; - discretization->v(1,1) = velocitiesV[idx_v]; - discretization->v(2,1) = velocitiesV[idx_v]; - - - // Initialize Fluid tracer with single particle - int numParticlesPerCell = 1; - FluidTracer fluidTracer(numParticlesPerCell, discretization, mask); - double old_pos_x = fluidTracer.getParticlePosition(0)[0]; - double old_pos_y = fluidTracer.getParticlePosition(0)[1]; - EXPECT_EQ(fluidTracer.getNumberOfParticles(), 1); - EXPECT_EQ(old_pos_x, 0.5); - EXPECT_EQ(old_pos_y, 0.5); +// // Checks 16 Cases --> 0°, 27°, 45°, 63°, 90°, ... +// for (int idx_u = 0; idx_u < velocitiesU.size(); idx_u++){ +// for (int idx_v = 0; idx_v < velocitiesV.size(); idx_v++){ + +// // Set all velocities to the same value +// discretization->u(0,0) = velocitiesU[idx_u]; +// discretization->u(1,0) = velocitiesU[idx_u]; +// discretization->u(0,1) = velocitiesU[idx_u]; +// discretization->u(1,1) = velocitiesU[idx_u]; +// discretization->u(0,2) = velocitiesU[idx_u]; +// discretization->u(1,2) = velocitiesU[idx_u]; + +// discretization->v(0,0) = velocitiesV[idx_v]; +// discretization->v(1,0) = velocitiesV[idx_v]; +// discretization->v(2,0) = velocitiesV[idx_v]; +// discretization->v(0,1) = velocitiesV[idx_v]; +// discretization->v(1,1) = velocitiesV[idx_v]; +// discretization->v(2,1) = velocitiesV[idx_v]; + + +// // Initialize Fluid tracer with single particle +// int numParticlesPerCell = 1; +// FluidTracer fluidTracer(numParticlesPerCell, discretization, mask); +// double old_pos_x = fluidTracer.getParticlePosition(0)[0]; +// double old_pos_y = fluidTracer.getParticlePosition(0)[1]; +// EXPECT_EQ(fluidTracer.getNumberOfParticles(), 1); +// EXPECT_EQ(old_pos_x, 0.5); +// EXPECT_EQ(old_pos_y, 0.5); - // Update particle - - double dt = 0.1; - fluidTracer.moveParticles(dt); - - // Particle is still in the box - EXPECT_GE(fluidTracer.getParticlePosition(0)[0], 0.0); - EXPECT_LE(fluidTracer.getParticlePosition(0)[0], 1.0); - EXPECT_GE(fluidTracer.getParticlePosition(0)[1], 0.0); - EXPECT_LE(fluidTracer.getParticlePosition(0)[1], 1.0); - - - // SPECIAL CASE - // if (idx_u == 3 && idx_v == 2){ - // // Particles position is - // double new_pos_x = 0.75; - // double new_pos_y = 0.875; - // EXPECT_EQ(fluid_tracer.getParticlePosition(0)[0], new_pos_x); - // EXPECT_EQ(fluid_tracer.getParticlePosition(0)[1], new_pos_y); - // } +// // Update particle + +// double dt = 0.1; +// fluidTracer.moveParticles(dt); + +// // Particle is still in the box +// EXPECT_GE(fluidTracer.getParticlePosition(0)[0], 0.0); +// EXPECT_LE(fluidTracer.getParticlePosition(0)[0], 1.0); +// EXPECT_GE(fluidTracer.getParticlePosition(0)[1], 0.0); +// EXPECT_LE(fluidTracer.getParticlePosition(0)[1], 1.0); + + +// // SPECIAL CASE +// // if (idx_u == 3 && idx_v == 2){ +// // // Particles position is +// // double new_pos_x = 0.75; +// // double new_pos_y = 0.875; +// // EXPECT_EQ(fluid_tracer.getParticlePosition(0)[0], new_pos_x); +// // EXPECT_EQ(fluid_tracer.getParticlePosition(0)[1], new_pos_y); +// // } - } - } -} - - -TEST(FluidTracer, moveParticlesInLargeGrid){ - // Flow Field like this: - // - // Right Down - // Up Left - // - // Or larger - // - // R R R D D D - // R R R D D D - // R R R D D D - // U U U L L L - // U U U L L L - // U U U L L L - - std::array n_cells = {9, 9}; - - - std::array meshWidth = {1.0/n_cells[0], 1.0/n_cells[1]}; - std::shared_ptr mask = std::make_shared(n_cells); - std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); - - std::vector x = {0.1, 0.1, 0.9, 0.9, 0.25, 0.75, 0.25, 0.75}; - std::vector y = {0.1, 0.9, 0.1, 0.9, 0.25, 0.25, 0.75, 0.75}; - - FluidTracer fluidTracer(x, y, discretization, mask); - - - // Wirbel - for (int i = 0; i < n_cells[0]; i++){ - for (int j = 0; j < n_cells[1]; j++){ - if (i > n_cells[0]/2){ - if (j > n_cells[1]/2){ - discretization->v(i,j) = -1; - } else { - discretization->u(i,j) = -1; - } - } else { - if (j > n_cells[1]/2){ - discretization->u(i,j) = 1; - } else { - discretization->v(i,j) = 1; - } - } - } - } - - - double dt = 0.1; - for (int k = 0; k < 100; k++){ - fluidTracer.moveParticles(dt); - - // does a cool animation - - - // mask->printMask(); - // std::cout << "\033[2J\033[1;1H"; - // usleep(500000); - - // 1st particle is still in the box - EXPECT_GE(fluidTracer.getParticlePosition(0)[0], 0.0); - EXPECT_LE(fluidTracer.getParticlePosition(0)[0], 1.0); - EXPECT_GE(fluidTracer.getParticlePosition(0)[1], 0.0); - EXPECT_LE(fluidTracer.getParticlePosition(0)[1], 1.0); - } - -} - -TEST(FluidTracer, moveDistributedParticlesInLargeGrid){ - // Flow Field like this: - // - // Right Down - // Up Left - // - // Or larger - // - // R R R D D D - // R R R D D D - // R R R D D D - // U U U L L L - // U U U L L L - // U U U L L L - - std::array n_cells = {5, 5}; - - - std::array meshWidth = {1.0/n_cells[0], 1.0/n_cells[1]}; - - std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); - std::shared_ptr mask = std::make_shared(n_cells); - mask->printMask(); - - FluidTracer fluidTracer(1, discretization, mask); - - double vel = meshWidth[0]; - for (int i = 0; i < n_cells[0]; i++){ - for (int j = 0; j < n_cells[1] + 1; j++){ - // Flow to right - discretization->u(i,j) = vel; - // Wirbel - // if (i > n_cells[0]/2){ - // if (j > n_cells[1]/2){ - // discretization->v(i,j) = -vel; - // } else { - // discretization->u(i,j) = -vel; - // } - // } else { - // if (j > n_cells[1]/2){ - // discretization->u(i,j) = vel; - // } else { - // discretization->v(i,j) = vel; - // } - // } - } - } - - double dt = 0.5; - for (int k = 0; k < 1; k++){ - fluidTracer.moveParticles(dt); - - // does a cool animation - // mask->printMask(); - // std::cout << "\033[2J\033[1;1H"; - // usleep(1000000); - - // Particle is still in the box - EXPECT_GE(fluidTracer.getParticlePosition(0)[0], 0.0); - EXPECT_LE(fluidTracer.getParticlePosition(0)[0], 1.0); - EXPECT_GE(fluidTracer.getParticlePosition(0)[1], 0.0); - EXPECT_LE(fluidTracer.getParticlePosition(0)[1], 1.0); - } - -} - - - - -// ----------------------------------------------------------------- -// --- T E S T U P D A T E M A S K B O U N D A R I E S --- -// ----------------------------------------------------------------- +// } +// } +// } + + +// TEST(FluidTracer, moveParticlesInLargeGrid){ +// // Flow Field like this: +// // +// // Right Down +// // Up Left +// // +// // Or larger +// // +// // R R R D D D +// // R R R D D D +// // R R R D D D +// // U U U L L L +// // U U U L L L +// // U U U L L L + +// std::array n_cells = {9, 9}; + + +// std::array meshWidth = {1.0/n_cells[0], 1.0/n_cells[1]}; +// std::shared_ptr mask = std::make_shared(n_cells); +// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); + +// std::vector x = {0.1, 0.1, 0.9, 0.9, 0.25, 0.75, 0.25, 0.75}; +// std::vector y = {0.1, 0.9, 0.1, 0.9, 0.25, 0.25, 0.75, 0.75}; + +// FluidTracer fluidTracer(x, y, discretization, mask); + + +// // Wirbel +// for (int i = 0; i < n_cells[0]; i++){ +// for (int j = 0; j < n_cells[1]; j++){ +// if (i > n_cells[0]/2){ +// if (j > n_cells[1]/2){ +// discretization->v(i,j) = -1; +// } else { +// discretization->u(i,j) = -1; +// } +// } else { +// if (j > n_cells[1]/2){ +// discretization->u(i,j) = 1; +// } else { +// discretization->v(i,j) = 1; +// } +// } +// } +// } + + +// double dt = 0.1; +// for (int k = 0; k < 100; k++){ +// fluidTracer.moveParticles(dt); + +// // does a cool animation + + +// // mask->printMask(); +// // std::cout << "\033[2J\033[1;1H"; +// // usleep(500000); + +// // 1st particle is still in the box +// EXPECT_GE(fluidTracer.getParticlePosition(0)[0], 0.0); +// EXPECT_LE(fluidTracer.getParticlePosition(0)[0], 1.0); +// EXPECT_GE(fluidTracer.getParticlePosition(0)[1], 0.0); +// EXPECT_LE(fluidTracer.getParticlePosition(0)[1], 1.0); +// } + +// } + +// TEST(FluidTracer, moveDistributedParticlesInLargeGrid){ +// // Flow Field like this: +// // +// // Right Down +// // Up Left +// // +// // Or larger +// // +// // R R R D D D +// // R R R D D D +// // R R R D D D +// // U U U L L L +// // U U U L L L +// // U U U L L L + +// std::array n_cells = {5, 5}; + + +// std::array meshWidth = {1.0/n_cells[0], 1.0/n_cells[1]}; + +// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); +// std::shared_ptr mask = std::make_shared(n_cells); +// mask->printMask(); + +// FluidTracer fluidTracer(1, discretization, mask); + +// double vel = meshWidth[0]; +// for (int i = 0; i < n_cells[0]; i++){ +// for (int j = 0; j < n_cells[1] + 1; j++){ +// // Flow to right +// discretization->u(i,j) = vel; +// // Wirbel +// // if (i > n_cells[0]/2){ +// // if (j > n_cells[1]/2){ +// // discretization->v(i,j) = -vel; +// // } else { +// // discretization->u(i,j) = -vel; +// // } +// // } else { +// // if (j > n_cells[1]/2){ +// // discretization->u(i,j) = vel; +// // } else { +// // discretization->v(i,j) = vel; +// // } +// // } +// } +// } + +// double dt = 0.5; +// for (int k = 0; k < 1; k++){ +// fluidTracer.moveParticles(dt); + +// // does a cool animation +// // mask->printMask(); +// // std::cout << "\033[2J\033[1;1H"; +// // usleep(1000000); + +// // Particle is still in the box +// EXPECT_GE(fluidTracer.getParticlePosition(0)[0], 0.0); +// EXPECT_LE(fluidTracer.getParticlePosition(0)[0], 1.0); +// EXPECT_GE(fluidTracer.getParticlePosition(0)[1], 0.0); +// EXPECT_LE(fluidTracer.getParticlePosition(0)[1], 1.0); +// } + +// } + + + + +// // ----------------------------------------------------------------- +// // --- T E S T U P D A T E M A S K B O U N D A R I E S --- +// // ----------------------------------------------------------------- diff --git a/tests/test_mask.cpp b/tests/test_mask.cpp index 6eb44ffc..98ba5fab 100644 --- a/tests/test_mask.cpp +++ b/tests/test_mask.cpp @@ -2,8 +2,9 @@ #include "../src/boundary/mask.h" TEST(Mask, ConstructorInitAllInnerCellsAsFluid){ - std::array size = {3,3}; - Mask mask(size); + Settings settings; + settings.nCells = {3,3}; + Mask mask(settings); for (int i = 1; i < 4; i++){ for (int j = 1; j < 4; j++){ EXPECT_EQ(mask(i,j), Mask::FLUID); @@ -12,23 +13,26 @@ TEST(Mask, ConstructorInitAllInnerCellsAsFluid){ }; TEST(Mask, SetOriginToAir){ - std::array size = {3,3}; - Mask mask(size); + Settings settings; + settings.nCells = {3,3}; + Mask mask(settings); mask(0,0) = Mask::AIR; EXPECT_EQ(mask(0,0), Mask::AIR); }; TEST(Mask, isFluid){ - std::array size = {3,3}; - Mask mask(size); + Settings settings; + settings.nCells = {3,3}; + Mask mask(settings); mask(0,0) = Mask::AIR; EXPECT_FALSE(mask.isFluid(0,0)); EXPECT_TRUE(mask.isFluid(1,1)); }; TEST(Mask, isObstacle){ - std::array size = {5,5}; - Mask mask(size); + Settings settings; + settings.nCells = {5, 5}; + Mask mask(settings); mask(1,1) = Mask::AIR; mask(3,3) = Mask::OBSTACLE; EXPECT_TRUE(mask.isObstacle(0,0)); @@ -51,8 +55,9 @@ TEST(Mask, updateMaskBoundaries){ // O - Obstacle // F - Fluid // A - Air - std::array size = {5,5}; - Mask mask(size); + Settings settings; + settings.nCells = {5, 5}; + Mask mask(settings); mask(1,5) = Mask::AIR; mask(2,5) = Mask::AIR; mask(3,5) = Mask::AIR; @@ -91,23 +96,17 @@ TEST(Mask, makeSmallRectangularObstacleCenter){ // O - Obstacle // F - Fluid // A - Air - std::array size = {10,10}; - Mask mask(size); - // std::array meshWidth = {1.0, 1.0}; - // std::array physicalSize = {1.0, 1.0}; + Settings settings; + settings.nCells = {10, 10}; + settings.obstaclePosition = {0.45, 0.45}; + settings.obstacleDimension = {0.1, 0.1}; + settings.physicalSize = {1.0, 1.0}; - std::array physicalSize = {1.0, 1.0}; - std::array obstaclePosition = {0.45, 0.45}; - std::array obstacleSize = {0.1, 0.1}; - - mask.makeRectangularObstacle(physicalSize, obstaclePosition, obstacleSize); + Mask mask(settings); + mask.makeRectangularObstacle(); EXPECT_EQ(mask(5,5), Mask::OBSTACLE_CORNER_BOTTOM_LEFT); EXPECT_EQ(mask(5,6), Mask::OBSTACLE_CORNER_TOP_LEFT); EXPECT_EQ(mask(6,5), Mask::OBSTACLE_CORNER_BOTTOM_RIGHT); EXPECT_EQ(mask(6,6), Mask::OBSTACLE_CORNER_TOP_RIGHT); - - - mask.printMask(); }; - From 394f7dde06502bf479766f3db0fbd5619a6fbae1 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Sun, 4 Feb 2024 16:43:01 +0100 Subject: [PATCH 32/67] [Velocity for Surfaces] needs testing --- src/boundary/boundary.cpp | 261 +++++++++++++++++++++++++++++++++++++- src/boundary/boundary.h | 1 + src/computation.cpp | 2 + 3 files changed, 260 insertions(+), 4 deletions(-) diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 6635948b..092b668c 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -115,7 +115,6 @@ void Boundary::setPressureSurfaceBC() int j = idx / mask_->size()[0]; - // u and v must be updated before p switch((*mask_)(i, j)){ case Mask::FLUID_BORDER_LEFT: @@ -184,14 +183,13 @@ void Boundary::setPressureSurfaceBC() discretization_->p(i, j) = 0; break; - - ///////////////////////// + } } } -} void Boundary::setVelocityBoundaryValues() { + setVelocitySurfaceBC(); setVelocityDomainBC(); setVelocityObstacleBC(); } @@ -316,6 +314,261 @@ void Boundary::setVelocityObstacleBC() } } +void Boundary::setVelocitySurfaceBC(){ + + double dxByDy = discretization_->dx() / discretization_->dy(); + double dyByDx = discretization_->dy() / discretization_->dx(); + // Should the dt update step happen here? Then per loop only one execution is allowed + double dt = 1; + + for (int idx : FluidBoundaryCells_) + { + int i = idx % mask_->size()[0]; + int j = idx / mask_->size()[0]; + + // should be solved in the following order: + // from left to right (increasing i) + // from bottom to top (increasing j) + + + switch ((*mask_)(i, j)) { + case Mask::FLUID_BORDER_LEFT: + // u + discretization_->u(i - 1, j) = discretization_->u(i, j) + + dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); + + // v + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + break; + + case Mask::FLUID_BORDER_TOP: + // v + discretization_->v(i, j) = discretization_->v(i, j - 1) + + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); + + // u + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) + - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + break; + case Mask::FLUID_BORDER_RIGHT: + // u + discretization_->u(i, j) = discretization_->u(i - 1, j) + - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); + + // v + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) + + dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + break; + case Mask::FLUID_BORDER_BOTTOM: + // v + discretization_->v(i, j - 1) = discretization_->v(i, j) + + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); + + // u + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); + break; + case Mask::FLUID_CORNER_TOP_LEFT: + // u + discretization_->u(i - 1, j) = discretization_->u(i, j); + // v + discretization_->v(i, j) = discretization_->v(i, j - 1); + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + if (mask_->isAir(i - 1, j + 1)) + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); // chain, u(i, j) is equvivalent + discretization_->v(i - 1, j) = discretization_->v(i, j); + break; + case Mask::FLUID_CORNER_TOP_RIGHT: + // u + discretization_->u(i, j) = discretization_->u(i - 1, j); + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) + - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + // v + discretization_->v(i, j) = discretization_->v(i, j - 1); + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) + - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + if (mask_->isAir(i + 1, j + 1)){ + discretization_->u(i, j + 1) = discretization_->u(i, j); + discretization_->v(i + 1, j) = discretization_->v(i, j); + } break; + case Mask::FLUID_CORNER_BOTTOM_RIGHT: + // u + discretization_->u(i, j) = discretization_->u(i - 1, j); + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); + // v + discretization_->v(i, j - 1) = discretization_->v(i, j); + if (mask_->isAir(i + 1, j - 1)){ + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); + discretization_->u(i, j - 1) = discretization_->u(i, j); + } break; + case Mask::FLUID_CORNER_BOTTOM_LEFT: + // u + discretization_->u(i - 1, j) = discretization_->u(i, j); + // v + discretization_->v(i, j - 1) = discretization_->v(i, j); + if (mask_->isAir(i - 1, j - 1)) + { + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); + + } break; + case Mask::FLUID_COLUMN_HORIZONTAL: + // v + discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; + discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; + // u + if (mask_->isAir(i - 1, j + 1)){ + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) + - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + } + if (mask_->isAir(i - 1, j - 1)){ + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); + } + break; + case Mask::FLUID_COLUMN_VERTICAL: + // u + discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; + discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; + + if (mask_->isAir(i - 1, j - 1)){ + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + } + if (mask_->isAir(i + 1, j - 1)){ + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) + - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + } + break; + case Mask::FLUID_SINGLE_LEFT: + // v + discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; + discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; + // u + discretization_->u(i - 1, j) = discretization_->u(i, j) + + dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); + // others + if (mask_->isAir(i - 1, j + 1)){ + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); + discretization_->v(i - 1, j) = discretization_->v(i, j); + } + if (mask_->isAir(i - 1, j - 1)){ + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); + } + break; + case Mask::FLUID_SINGLE_TOP: + // u + discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; + discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; + // v + discretization_->v(i, j) = discretization_->v(i, j - 1) + - dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); + // others + if (mask_->isAir(i - 1, j + 1)){ + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); + discretization_->v(i - 1, j) = discretization_->v(i, j); + } + if (mask_->isAir(i + 1, j + 1)){ + discretization_->u(i, j + 1) = discretization_->u(i, j); + discretization_->v(i + 1, j) = discretization_->v(i, j); + } + + // Tangential stress condition + if (mask_->isAir(i - 1, j - 1)){ + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + } + if (mask_->isAir(i + 1, j - 1)){ + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) + - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + } + break; + case Mask::FLUID_SINGLE_RIGHT: + // v + discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; + discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; + + // u + discretization_->u(i, j) = discretization_->u(i - 1, j) + - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); + // others + if (mask_->isAir(i + 1, j + 1)){ + discretization_->u(i, j + 1) = discretization_->u(i, j); + discretization_->v(i + 1, j) = discretization_->v(i, j); + } + if (mask_->isAir(i + 1, j - 1)){ + discretization_->u(i + 1, j - 1) = discretization_->u(i, j); + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); + } + + // Tangential stress condition + if (mask_->isAir(i - 1, j - 1)){ + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); + } + if (mask_->isAir(i - 1, j + 1)){ + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) + - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + } + + break; + case Mask::FLUID_SINGLE_BOTTOM: + // u + discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; + discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; + // v + discretization_->v(i, j - 1) = discretization_->v(i, j) + + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); + // others + if (mask_->isAir(i - 1, j - 1)){ + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); + } + if (mask_->isAir(i + 1, j - 1)){ + discretization_->u(i, j - 1) = discretization_->u(i, j); + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); + } + case Mask::FLUID_DROPLET: + // u + discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; + discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; + // v + discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; + discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; + + // others + if (mask_->isAir(i - 1, j - 1)){ + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); + } + if (mask_->isAir(i - 1, j + 1)){ + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); + discretization_->v(i - 1, j) = discretization_->v(i, j); + } + if (mask_->isAir(i + 1, j + 1)){ + discretization_->u(i, j + 1) = discretization_->u(i, j); + discretization_->v(i + 1, j) = discretization_->v(i, j); + } + if (mask_->isAir(i + 1, j - 1)){ + discretization_->u(i, j - 1) = discretization_->u(i, j); + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); + } + break; + default: + break; + } + + + } +} + + + + bool Boundary::doCalculateF(int i, int j) const { if (mask_->isFluid(i, j) && mask_->isFluid(i + 1, j)){ diff --git a/src/boundary/boundary.h b/src/boundary/boundary.h index ea6d00a4..f040d1d2 100644 --- a/src/boundary/boundary.h +++ b/src/boundary/boundary.h @@ -30,6 +30,7 @@ class Boundary // Set Velocity void setVelocityDomainBC(); void setVelocityObstacleBC(); + void setVelocitySurfaceBC(); std::shared_ptr discretization_; diff --git a/src/computation.cpp b/src/computation.cpp index 5668853d..e72b05ec 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -26,6 +26,8 @@ void Computation::initialize(int argc, char *argv[]) // create boundary and tracer mask_ = std::make_shared(settings_); + // TODO: read particles per cell from settings file + fluidTracer_ = std::make_shared(100, discretization_, mask_); // std::vector traceX = {1.8}; // std::vector traceY = {1.8}; From 1c832c3d67a7f9085a8e41674203ae9ac52cec30 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Sun, 4 Feb 2024 17:35:10 +0100 Subject: [PATCH 33/67] Tests included --- CMakeLists.txt | 2 +- build.sh | 2 +- tests/CMakeLists.txt | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 88055bf0..9fa651df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,4 +2,4 @@ cmake_minimum_required(VERSION 3.8) project(numsim) add_subdirectory(src) -# add_subdirectory(tests) \ No newline at end of file +add_subdirectory(tests) \ No newline at end of file diff --git a/build.sh b/build.sh index 20a2ddf2..9e289e28 100755 --- a/build.sh +++ b/build.sh @@ -36,6 +36,6 @@ cd .. # cd .. # run tests -# build/tests/run_tests +build/tests/run_tests # zip -r submission.zip src/ CMakeLists.txt \ No newline at end of file diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index ca09ff51..164ed72d 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -28,7 +28,11 @@ add_executable(run_tests ../src/boundary/boundary.cpp ../src/surface/fluid_tracer.cpp ) -target_link_libraries(run_tests gtest gtest_main) + + +find_package(PNG REQUIRED) + +target_link_libraries(run_tests gtest gtest_main ${PNG_LIBRARIES}) # Set the version of the C++ standard to use, we use C++17, published in 2014 set(CMAKE_CXX_STANDARD 17) From 6f11c8ee322ee1a97ddb96bfaee71f497b657219 Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Sun, 4 Feb 2024 18:02:40 +0100 Subject: [PATCH 34/67] first interation of displaying mask in paraview --- .vscode/settings.json | 6 +- input/settings_debug.txt | 16 ++-- src/computation.cpp | 20 +++-- src/output_writer/output_writer_paraview.cpp | 82 +++++++++++++++++--- src/output_writer/output_writer_paraview.h | 5 +- src/storage/array2D.h | 1 + 6 files changed, 99 insertions(+), 31 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index d9e2a74f..ade6bf12 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,5 @@ { "editor.formatOnSave": true, - "files.associations": { "*.json": "jsonc", "cctype": "cpp", @@ -72,6 +71,7 @@ "typeindex": "cpp", "typeinfo": "cpp", "variant": "cpp", - "any": "cpp" + "any": "cpp", + "*.txx": "cpp" } -} +} \ No newline at end of file diff --git a/input/settings_debug.txt b/input/settings_debug.txt index 2ca10728..610df9a0 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -4,8 +4,8 @@ # Problem description physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 -endTime = 0.1 # duration of the simulation -re = 10000 # Reynolds number +endTime = 0.03 # duration of the simulation +re = 1000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity gY = 0.0 @@ -13,9 +13,9 @@ gY = 0.0 # Boundary Conditions Type BCTop = NoSlip -BCRight = Pressure +BCRight = NoSlip BCBottom = NoSlip -BCLeft = Pressure +BCLeft = NoSlip # NoSlip boundary conditions @@ -48,12 +48,12 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap -createDomainfromBitmap = true -pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/legal_water.png +createDomainfromBitmap = false +pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/aerodynamic_obstacle.png # Discretization parameters -nCellsX = 10 # number of cells in x and y direction -nCellsY = 10 +nCellsX = 20 # number of cells in x and y direction +nCellsY = 20 useDonorCell = true # if donor cell discretization should be used, possible values: true false alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences tau = 0.5 # safety factor for time step width diff --git a/src/computation.cpp b/src/computation.cpp index f142a2ac..4c03336d 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -12,21 +12,25 @@ void Computation::initialize(int argc, char *argv[]) settings_.printSettings(); #endif - std::array meshWidth_ = {settings_.physicalSize[0] / settings_.nCells[0], - settings_.physicalSize[1] / settings_.nCells[1]}; + // create boundary and tracer + mask_ = std::make_shared(settings_); + + std::array n_Cells = {mask_->size()[0]-2, mask_->size()[1]-2}; + + std::cout << n_Cells[0] << " " << n_Cells[1] << "\n"; + + std::array meshWidth_ = {(n_Cells[0]/10.0) / n_Cells[0], + (n_Cells[1]/10.0) / n_Cells[1]}; if (settings_.useDonorCell) { - discretization_ = std::make_shared(settings_.nCells, meshWidth_, settings_.alpha); + discretization_ = std::make_shared(n_Cells, meshWidth_, settings_.alpha); } else { - discretization_ = std::make_shared(settings_.nCells, meshWidth_); + discretization_ = std::make_shared(n_Cells, meshWidth_); } - // create boundary and tracer - mask_ = std::make_shared(settings_); - std::vector traceX = {1.8}; std::vector traceY = {1.8}; @@ -48,7 +52,7 @@ void Computation::initialize(int argc, char *argv[]) boundary_); } - outputWriterParaview_ = std::make_unique(discretization_); + outputWriterParaview_ = std::make_unique(discretization_, mask_); outputWriterText_ = std::make_unique(discretization_); } diff --git a/src/output_writer/output_writer_paraview.cpp b/src/output_writer/output_writer_paraview.cpp index f98a0041..2cce1f43 100644 --- a/src/output_writer/output_writer_paraview.cpp +++ b/src/output_writer/output_writer_paraview.cpp @@ -1,6 +1,6 @@ #include "output_writer_paraview.h" -OutputWriterParaview::OutputWriterParaview(std::shared_ptr discretization) : OutputWriter(discretization) +OutputWriterParaview::OutputWriterParaview(std::shared_ptr discretization, std::shared_ptr mask) : OutputWriter(discretization), mask_(mask) { // Create a vtkWriter_ vtkWriter_ = vtkSmartPointer::New(); @@ -23,48 +23,108 @@ void OutputWriterParaview::writeFile(double currentTime) dataSet->SetOrigin(0, 0, 0); // set spacing of mesh - const double dx = discretization_->meshWidth()[0]; - const double dy = discretization_->meshWidth()[1]; + const double dx = discretization_->meshWidth()[0] * (1 / 2.0); + const double dy = discretization_->meshWidth()[1] * (1 / 2.0); const double dz = 1; dataSet->SetSpacing(dx, dy, dz); // set number of points in each dimension, 1 cell in z direction std::array nCells = discretization_->nCells(); + int n_cells_x = nCells[0] * 2 + 1; + int n_cells_y = nCells[1] * 2 + 1; // we want to have points at each corner of each cell - dataSet->SetDimensions(nCells[0] + 1, nCells[1] + 1, 1); + dataSet->SetDimensions(n_cells_x, n_cells_y, 1); // add pressure field variable // --------------------------- vtkSmartPointer arrayPressure = vtkDoubleArray::New(); + vtkSmartPointer arrayMask = vtkDoubleArray::New(); // the pressure is a scalar which means the number of components is 1 arrayPressure->SetNumberOfComponents(1); + arrayMask->SetNumberOfComponents(1); // Set the number of pressure values and allocate memory for it. We already know the number, it has to be the same as there are nodes in the mesh. arrayPressure->SetNumberOfTuples(dataSet->GetNumberOfPoints()); + arrayMask->SetNumberOfTuples(dataSet->GetNumberOfPoints()); arrayPressure->SetName("pressure"); + arrayMask->SetName("mask"); // loop over the nodes of the mesh and assign the interpolated p values in the vtk data structure // we only consider the cells that are the actual computational domain, not the helper values in the "halo" // index for the vtk data structure, will be incremented in the inner loop + int index_ = 0; + for (int j = 0; j < n_cells_y; j++) + { + for (int i = 0; i < n_cells_x; i++, index_++) + { + const double x = i * dx; + const double y = j * dy; + arrayPressure->SetValue(index_, discretization_->p().interpolateAt(x, y)); + } + } + + int OBSTACLE = 2; + int FLUID = 1; + int index = 0; - for (int j = 0; j < nCells[1] + 1; j++) + + for (int j = 1; j < n_cells_y; j++) { - for (int i = 0; i < nCells[0] + 1; i++, index++) + for (int i = 1; i < n_cells_x; i++, index++) { const double x = i * dx; const double y = j * dy; - arrayPressure->SetValue(index, discretization_->p().interpolateAt(x, y)); + + if (std::fmod(x, discretization_->meshWidth()[0]) == 0 && std::fmod(y, discretization_->meshWidth()[1]) == 0) + { + int i_bottom_left = i / 2 - 1; + int j_bootom_left = j / 2 - 1; + if (mask_->isObstacle(i_bottom_left, j_bootom_left) || mask_->isObstacle(i_bottom_left + 1, j_bootom_left) || mask_->isObstacle(i_bottom_left, j_bootom_left + 1) || mask_->isObstacle(i_bottom_left + 1, j_bootom_left + 1)) + arrayMask->SetValue(index, OBSTACLE); + else + arrayMask->SetValue(index, FLUID); + } + else if (std::fmod(x, discretization_->meshWidth()[0]) != 0 && std::fmod(y, discretization_->meshWidth()[1]) != 0) + { + int i_new = (i - 1) / 2; + int j_new = (j - 1) / 2; + if (mask_->isObstacle(i_new, j_new)) + arrayMask->SetValue(index, OBSTACLE); + else + arrayMask->SetValue(index, FLUID); + } + else if (std::fmod(x, discretization_->meshWidth()[0]) != 0 && std::fmod(y, discretization_->meshWidth()[1]) == 0) + { + int i_bottom = (i - 1) / 2; + int j_bottom = j / 2 - 1; + if (mask_->isObstacle(i_bottom, j_bottom) || mask_->isObstacle(i_bottom, j_bottom + 1)) + arrayMask->SetValue(index, OBSTACLE); + else + arrayMask->SetValue(index, FLUID); + } + else if (std::fmod(x, discretization_->meshWidth()[0]) == 0 && std::fmod(y, discretization_->meshWidth()[1]) != 0) + { + int i_left = i / 2 - 1; + int j_left = (j - 1) / 2; + if (mask_->isObstacle(i_left, j_left) || mask_->isObstacle(i_left + 1, j_left)) + arrayMask->SetValue(index, OBSTACLE); + else + arrayMask->SetValue(index, FLUID); + } + else + std::cout << "YOU stupid\n"; } } // now, we should have added as many values as there are points in the vtk data structure - assert(index == dataSet->GetNumberOfPoints()); + // assert(index == dataSet->GetNumberOfPoints()); // add the field variable to the data set dataSet->GetPointData()->AddArray(arrayPressure); + dataSet->GetPointData()->AddArray(arrayMask); // add velocity field variable // --------------------------- @@ -82,11 +142,11 @@ void OutputWriterParaview::writeFile(double currentTime) // loop over the mesh where p is defined and assign the values in the vtk data structure // index for the vtk data structure index = 0; - for (int j = 0; j < nCells[1] + 1; j++) + for (int j = 0; j < n_cells_y; j++) { const double y = j * dy; - for (int i = 0; i < nCells[0] + 1; i++, index++) + for (int i = 0; i < n_cells_x; i++, index++) { const double x = i * dx; @@ -99,7 +159,7 @@ void OutputWriterParaview::writeFile(double currentTime) } } // now, we should have added as many values as there are points in the vtk data structure - assert(index == dataSet->GetNumberOfPoints()); + // assert(index == dataSet->GetNumberOfPoints()); // add the field variable to the data set dataSet->GetPointData()->AddArray(arrayVelocity); diff --git a/src/output_writer/output_writer_paraview.h b/src/output_writer/output_writer_paraview.h index 9a343584..0465f18e 100644 --- a/src/output_writer/output_writer_paraview.h +++ b/src/output_writer/output_writer_paraview.h @@ -7,9 +7,11 @@ #include #include #include +#include #include #include +#include "../boundary/mask.h" /** * @class OutputWriterParaview @@ -27,7 +29,7 @@ class OutputWriterParaview : public OutputWriter * * @param discretization shared pointer to the discretization object that will contain all the data to be written to the file */ - OutputWriterParaview(std::shared_ptr discretization); + OutputWriterParaview(std::shared_ptr discretization, std::shared_ptr mask); /** * @brief Write current velocities to file, filename is output_.vti @@ -38,4 +40,5 @@ class OutputWriterParaview : public OutputWriter private: vtkSmartPointer vtkWriter_; //!< vtk writer to write ImageData + std::shared_ptr mask_; }; diff --git a/src/storage/array2D.h b/src/storage/array2D.h index aa4929d5..a7a9c31d 100644 --- a/src/storage/array2D.h +++ b/src/storage/array2D.h @@ -4,6 +4,7 @@ #include #include + /** * @class Array2D * @brief This class represents a 2D array of double values. From de7ea7d75fc633613ff9fb1695f0ea21a89796cc Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Sun, 4 Feb 2024 18:23:54 +0100 Subject: [PATCH 35/67] [FluidTracer][Test passing] --- build.sh | 2 +- src/boundary/mask.cpp | 1 - src/surface/fluid_tracer.cpp | 544 ++++++++++++++----------- src/surface/fluid_tracer.h | 12 +- tests/test_fluid_tracer.cpp | 757 ++++++++++++++++++----------------- tests/test_mask.cpp | 4 +- 6 files changed, 712 insertions(+), 608 deletions(-) diff --git a/build.sh b/build.sh index 9e289e28..f6976ced 100755 --- a/build.sh +++ b/build.sh @@ -17,7 +17,7 @@ fi make install -j4 -./numsim ../input/settings_debug.txt +# ./numsim ../input/settings_debug.txt diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index ec23490b..e5435506 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -18,7 +18,6 @@ Mask::Mask( Settings settings) : settings_(settings) setFluidBC(); setDomainBC(); setObstacleBC(); - printMask(); } int &Mask::operator()(int i, int j) { diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index 5b32e87b..4fcf5c90 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -22,11 +22,11 @@ FluidTracer::FluidTracer(int numParticlesPerCell, discretization_ = discretization; mask_ = mask; - seedRelationDyDx_ = discretization_->dy()/ discretization_->dx(); n_x = static_cast(std::ceil(std::sqrt(numParticlesPerCell/seedRelationDyDx_))); n_y = static_cast(std::ceil(n_x * seedRelationDyDx_)); - + std::cout << "n_x " << n_x << " n_y " << n_y << std::endl; + numParticlesPerCell_ = n_x * n_y; numParticles_ = numParticlesPerCell_ * mask_->getNumberOfFluidCells(); @@ -57,7 +57,6 @@ void FluidTracer::initializeFluidCell(int i, int j, int idx) { y_[idx] = cell_y + ((0.5 + l) * discretization_->dy()) / n_y; idx++; - } } } @@ -79,23 +78,8 @@ int FluidTracer::getNumberOfParticles() const { return numParticles_; } - -void FluidTracer::moveParticles(double dt) { - // Cells without particle are air or obstacle - mask_->resetMask(); - - for (int i = 0; i < numParticles_; i++) { - double vel_x = discretization_->u().interpolateAt(x_[i], y_[i]); - double vel_y = discretization_->v().interpolateAt(x_[i], y_[i]); - updateParticle(i, dt, vel_x, vel_y); - - // Update mask - int idx_x = val2CellX(x_[i]); - int idx_y = val2CellY(y_[i]); - (*mask_)(idx_x, idx_y) = Mask::FLUID; - } - - mask_->setFluidBC(); +std::array FluidTracer::cellOfParticle(int i){ + return {val2CellX(x_[i]), val2CellY(y_[i])}; } int FluidTracer::val2CellX(double xVal){ @@ -111,296 +95,384 @@ std::array FluidTracer::getParticlePosition(int i) const { } -void FluidTracer::updateParticle(int i, double dt, double vel_x, double vel_y) { - - double step_x = dt * vel_x; - double step_y = dt * vel_y; +void FluidTracer::moveParticles(double dt) { + // Cells without particle are air or obstacle + mask_->resetMask(); + for (int i = 0; i < numParticles_; i++) { + + std::array vel = {discretization_->u().interpolateAt(x_[i], y_[i]), + discretization_->v().interpolateAt(x_[i], y_[i])}; + std::array idx = cellOfParticle(i); + std::array newIdx = updateParticle(i, idx, dt, vel); + + // Safety feature -> can be removed for speed up + if (!mask_->isObstacle(newIdx[0], newIdx[1])){ + (*mask_)(newIdx[0], newIdx[1]) = Mask::FLUID; + } + } + mask_->setFluidBC(); +} - // Check for Collision with obstacle - int idxNextCellX = val2CellX(x_[i] + step_x); - int idxNextCellY = val2CellY(y_[i] + step_y); - if (mask_->isObstacle(idxNextCellX, idxNextCellY)) { - int idx_x = val2CellX(x_[i]); - int idx_y = val2CellY(y_[i]); - - // x - Border - double leftBorder = discretization_->dx()*(idx_x - 1); // -1 because idx starts at 0 with outer cell -dx - double rightBorder = discretization_->dx()*(idx_x); - // y - Border - double lowerBorder = discretization_->dy()*(idx_y - 1); - double topBorder = discretization_->dy()*(idx_y); +std::array FluidTracer::updateParticle(int i, std::array idx, double dt, std::array vel) { + + double newPos_x = x_[i] + dt * vel[0]; + double newPos_y = y_[i] + dt * vel[1]; + + // x - Border + double leftBorder = discretization_->dx()*(idx[0] - 1); // -1 because idx starts at 0 with outer cell -dx + double rightBorder = discretization_->dx()*idx[0]; + bool inCellX = leftBorder < newPos_x && newPos_x < rightBorder; + + // y - Border + double lowerBorder = discretization_->dy()*(idx[1] - 1); + double topBorder = discretization_->dy()*idx[1]; + bool inCellY = lowerBorder < newPos_y && newPos_y < topBorder; + + if (inCellX && inCellY) { + x_[i] = newPos_x; + y_[i] = newPos_y; + return idx; + + } else { // distance and time to border double dist_x, dt_x, dist_y, dt_y; double dtBeforeCollision; - double new_vel_x = vel_x; - double new_vel_y = vel_y; - - - // Note: ZERO_DIVISON is no problem, because then dt is pos_inf, which is always larger and therefore the other case is taken - - // Uses CFL condition --> accelerate? - - // TODO: CORNER: double equality rounding errors? + std::array newIdx = idx; + std::array newVel = vel; + // if any collision + double eps = 1e-10; + if (dt < eps){ + return newIdx; + } - // Summary: - // 1. `dt_x`: Calculate time till collision with x-Border (depending on direction of `vel_x` ) - // 2. `dt_y`: Calculate time till collision with y-Border (depending on direction of `vel_y` ) - // 3. Check which collision of the two possible happens first - // - // --> assign `dtBeforeCollision`, `new_vel_x` and `new_vel_y` accordingly - - - if (vel_x >= 0) { + // Checks DIRECTION then COLLISION + // U: + if (vel[0] >= 0) { dist_x = rightBorder - x_[i]; - dt_x = dist_x/vel_x; + dt_x = dist_x/vel[0]; - if (vel_y >= 0) { + if (vel[1] >= 0) { // direction TOP_RIGHT dist_y = topBorder - y_[i]; - dt_y = dist_y/vel_y; - - if (dt_x >= dt_y) { + dt_y = dist_y/vel[1]; + + if (dt_y < dt_x) { // collision TOP - if (mask_->isObstacle(idx_x, idx_y + 1)){ - new_vel_y = -vel_y; + if (mask_->isObstacle(idx[0], idx[1] + 1)){ + newVel[1] = -vel[1]; + } else { + newIdx[1] += 1; } dtBeforeCollision = dt_y; - } - if (dt_x <= dt_y){ + } else { // collision RIGHT - if (mask_->isObstacle(idx_x, idx_y + 1)){ - new_vel_x = -vel_x; + if (mask_->isObstacle(idx[0] + 1, idx[1])){ //TODO: change + newVel[0] = -vel[0]; + } else { + newIdx[0] += 1; } dtBeforeCollision = dt_x; } - } else if (vel_y < 0){ + } else if (vel[1] < 0){ // direction BOTTOM_RIGHT dist_y = lowerBorder - y_[i]; - dt_y = dist_y/vel_y; // -- = + + dt_y = dist_y/vel[1]; // -- = + - if (dt_x >= dt_y) { + if (dt_y < dt_x) { // collision BOTTOM - if (mask_->isObstacle(idx_x, idx_y - 1)){ - new_vel_y = -vel_y; + if (mask_->isObstacle(idx[0], idx[1] - 1)){ + newVel[1] = -vel[1]; + } else { + newIdx[1] -= 1; } dtBeforeCollision = dt_y; - } - if (dt_x <= dt_y){ + } else { // collision RIGHT - if (mask_->isObstacle(idx_x, idx_y + 1)){ - new_vel_x = -vel_x; + if (mask_->isObstacle(idx[0] + 1, idx[1])){ // TODO: change + newVel[0] = -vel[0]; + } else { + newIdx[0] += 1; } dtBeforeCollision = dt_x; } } - } else if (vel_x < 0){ + // U + } else if (vel[0] < 0){ dist_x = leftBorder - x_[i]; - dt_x = dist_x/vel_x; // -- = + + dt_x = dist_x/vel[0]; // -- = + - if (vel_y >= 0) { + if (vel[1] >= 0) { // direction TOP_LEFT dist_y = topBorder - y_[i]; - dt_y = dist_y/vel_y; - - if (dt_x >= dt_y) { + dt_y = dist_y/vel[1]; + + if (dt_y < dt_x) { // collision TOP - if (mask_->isObstacle(idx_x, idx_y + 1)){ - new_vel_y = -vel_y; + if (mask_->isObstacle(idx[0], idx[1] + 1)){ + newVel[1] = -vel[1]; + } else { + newIdx[1] += 1; } dtBeforeCollision = dt_y; - } - if (dt_x <= dt_y){ + } else { // collision LEFT - if (mask_->isObstacle(idx_x, idx_y - 1)){ - new_vel_x = -vel_x; + if (mask_->isObstacle(idx[0] - 1, idx[1])){ // TODO: change + newVel[0] = -vel[0]; + } else { + newIdx[0] -= 1; } dtBeforeCollision = dt_x; } - } else if (vel_y < 0){ + } else if (vel[1] < 0){ // direction BOTTOM_LEFT dist_y = lowerBorder - y_[i]; - dt_y = dist_y/vel_y; // -- = + - - if (dt_x <= dt_y) { + dt_y = dist_y/vel[1]; // -- = + + + if (dt_y < dt_x) { // collision BOTTOM - if (mask_->isObstacle(idx_x, idx_y - 1)){ - new_vel_y = -vel_y; + if (mask_->isObstacle(idx[0], idx[1] - 1)){ + newVel[1] = -vel[1]; + } else { + newIdx[1] -= 1; } - dtBeforeCollision = dt_x; - } - if (dt_x >= dt_y){ + dtBeforeCollision = dt_y; + } else { // collision LEFT - if (mask_->isObstacle(idx_x, idx_y - 1)){ - new_vel_x = -vel_x; + if (mask_->isObstacle(idx[0] - 1, idx[1])){ //TODO: change + newVel[0] = -vel[0]; + } else { + newIdx[0] -= 1; } - dtBeforeCollision = dt_y; + dtBeforeCollision = dt_x; } } } - x_[i] += dtBeforeCollision * vel_x; - y_[i] += dtBeforeCollision * vel_y; + // Bugfix for Floating Point Error + if (dt_x < eps || dt_y < eps){ + dtBeforeCollision = eps; + } + + // Happens if it was outside of cell but flies into the cell + if (dt < dtBeforeCollision) { + x_[i] += dt * vel[0]; + y_[i] += dt * vel[1]; + return newIdx; + } - // dtBeforeCollision is always smaller - // the maximum depth of recursion is 1 - updateParticle(i, dt - dtBeforeCollision, new_vel_x, new_vel_y); - } else { + x_[i] += dtBeforeCollision * vel[0]; + y_[i] += dtBeforeCollision * vel[1]; + double newDt = dt - dtBeforeCollision; - x_[i] += step_x; - y_[i] += step_y; + if (newDt < eps){ + return newIdx; + } + return updateParticle(i, newIdx, newDt, newVel); } } -// ONLY FOR TESTING PURPOSES -// void FluidTracer::updateParticle(int i, double dt, double vel_x, double vel_y) { -// double step_x = dt * vel_x; -// double step_y = dt * vel_y; -// // Check for Collision with obstacle -// int idxNextCellX = val2CellX(x_[i] + step_x); -// int idxNextCellY = val2CellY(y_[i] + step_y); -// if (mask_->isObstacle(idxNextCellX, idxNextCellY)) { -// int idx_x = val2CellX(x_[i]); -// int idx_y = val2CellY(y_[i]); - -// // x - Border -// double leftBorder = discretization_->dx()*(idx_x - 1); // -1 because idx starts at 0 with outer cell -dx -// double rightBorder = discretization_->dx()*(idx_x); +////////////////////////////////////////////////////// + +// ONLY FOR TESTING PURPOSES + +std::array FluidTracer::moveParticles(double dt, std::array vel) { + // Cells without particle are air or obstacle + mask_->resetMask(); + + for (int i = 0; i < numParticles_; i++) { + std::array idx1 = cellOfParticle(i); + std::cout << " x: " << std::fixed << std::setprecision(3) << x_[0] + << " y: " << std::fixed << std::setprecision(3) << y_[0] << std::endl; + std::cout << "v_x: " << vel[0] << " v_y: " << vel[1] << std::endl; + vel = updateParticle(i, idx1, dt, vel, 0); + + // Update mask + std::array idx = cellOfParticle(i); + if (!mask_->isObstacle(idx[0], idx[1])){ + (*mask_)(idx[0], idx[1]) = Mask::FLUID; + } + } -// // y - Border -// double lowerBorder = discretization_->dy()*(idx_y - 1); -// double topBorder = discretization_->dy()*(idx_y); + mask_->setFluidBC(); + return vel; +} -// // distance and time to border -// double dist_x, dt_x, dist_y, dt_y; -// double dtBeforeCollision; -// double new_vel_x = vel_x; -// double new_vel_y = vel_y; -// // Note: ZERO_DIVISON is no problem, because then dt is pos_inf, which is always larger and therefore the other case is taken +std::array FluidTracer::updateParticle(int i, std::array idx, double dt, std::array vel, int depth) { + // std::cout << "depth: " << depth << "time " << dt << std::endl; + if (depth > 2){ + std::cout << "----------------------------------" << std::endl; + return vel; + } + double newPos_x = x_[i] + dt * vel[0]; + double newPos_y = y_[i] + dt * vel[1]; + + // x - Border + double leftBorder = discretization_->dx()*(idx[0] - 1); // -1 because idx starts at 0 with outer cell -dx + double rightBorder = discretization_->dx()*idx[0]; + bool inCellX = leftBorder < newPos_x && newPos_x < rightBorder; + + // y - Border + double lowerBorder = discretization_->dy()*(idx[1] - 1); + double topBorder = discretization_->dy()*idx[1]; + bool inCellY = lowerBorder < newPos_y && newPos_y < topBorder; + + if (inCellX && inCellY) { + x_[i] = newPos_x; + y_[i] = newPos_y; + return vel; + + } else { + // distance and time to border + double dist_x, dt_x, dist_y, dt_y; + double dtBeforeCollision; -// // Uses CFL condition --> accelerate? - -// // TODO: CORNER: double equality rounding errors? + std::array newIdx = idx; + std::array newVel = vel; + // if any collision + double eps = 1e-10; + if (dt < eps){ + return vel; + } -// // Summary: -// // 1. `dt_x`: Calculate time till collision with x-Border (depending on direction of `vel_x` ) -// // 2. `dt_y`: Calculate time till collision with y-Border (depending on direction of `vel_y` ) -// // 3. Check which collision of the two possible happens first -// // -// // --> assign `dtBeforeCollision`, `new_vel_x` and `new_vel_y` accordingly + // Note: ZERO_VELOCITY is no problem, because then dt is pos_inf, which is always larger + // Checks DIRECTION then COLLISION + // U: + if (vel[0] >= 0) { + dist_x = rightBorder - x_[i]; + dt_x = dist_x/vel[0]; -// if (vel_x >= 0) { -// dist_x = rightBorder - x_[i]; -// dt_x = dist_x/vel_x; + if (vel[1] >= 0) { + // direction TOP_RIGHT + dist_y = topBorder - y_[i]; + dt_y = dist_y/vel[1]; -// if (vel_y >= 0) { -// // direction TOP_RIGHT -// dist_y = topBorder - y_[i]; -// dt_y = dist_y/vel_y; - -// if (dt_x >= dt_y) { -// // collision TOP -// if (mask_->isObstacle(idx_x, idx_y + 1)){ -// new_vel_y = -vel_y; -// } -// dtBeforeCollision = dt_y; -// } -// if (dt_x <= dt_y){ -// // collision RIGHT -// if (mask_->isObstacle(idx_x, idx_y + 1)){ -// new_vel_x = -vel_x; -// } -// dtBeforeCollision = dt_x; -// } -// } else if (vel_y < 0){ -// // direction BOTTOM_RIGHT -// dist_y = lowerBorder - y_[i]; -// dt_y = dist_y/vel_y; // -- = + - -// if (dt_x >= dt_y) { -// // collision BOTTOM -// if (mask_->isObstacle(idx_x, idx_y - 1)){ -// new_vel_y = -vel_y; -// } -// dtBeforeCollision = dt_y; -// } -// if (dt_x <= dt_y){ -// // collision RIGHT -// if (mask_->isObstacle(idx_x, idx_y + 1)){ -// new_vel_x = -vel_x; -// } -// dtBeforeCollision = dt_x; -// } -// } -// } else if (vel_x < 0){ -// dist_x = leftBorder - x_[i]; -// dt_x = dist_x/vel_x; // -- = + - -// if (vel_y >= 0) { -// // direction TOP_LEFT -// dist_y = topBorder - y_[i]; -// dt_y = dist_y/vel_y; - -// if (dt_x >= dt_y) { -// // collision TOP -// if (mask_->isObstacle(idx_x, idx_y + 1)){ -// new_vel_y = -vel_y; -// } -// dtBeforeCollision = dt_y; -// } -// if (dt_x <= dt_y){ -// // collision LEFT -// if (mask_->isObstacle(idx_x, idx_y - 1)){ -// new_vel_x = -vel_x; -// } -// dtBeforeCollision = dt_x; -// } -// } else if (vel_y < 0){ -// // direction BOTTOM_LEFT -// dist_y = lowerBorder - y_[i]; -// dt_y = dist_y/vel_y; // -- = + + if (dt_y < dt_x) { + // collision TOP + if (mask_->isObstacle(idx[0], idx[1] + 1)){ + newVel[1] = -vel[1]; + } else { + newIdx[1] += 1; + } + dtBeforeCollision = dt_y; + } else { + // collision RIGHT + if (mask_->isObstacle(idx[0] + 1, idx[1])){ //TODO: change + newVel[0] = -vel[0]; + } else { + newIdx[0] += 1; + } + dtBeforeCollision = dt_x; + } + } else if (vel[1] < 0){ + // direction BOTTOM_RIGHT + dist_y = lowerBorder - y_[i]; + dt_y = dist_y/vel[1]; // -- = + -// if (dt_x <= dt_y) { -// // collision BOTTOM -// if (mask_->isObstacle(idx_x, idx_y - 1)){ -// new_vel_y = -vel_y; -// } -// dtBeforeCollision = dt_x; -// } -// if (dt_x >= dt_y){ -// // collision LEFT -// if (mask_->isObstacle(idx_x, idx_y - 1)){ -// new_vel_x = -vel_x; -// } -// dtBeforeCollision = dt_y; -// } -// } -// } -// x_[i] += dtBeforeCollision * vel_x; -// y_[i] += dtBeforeCollision * vel_y; - -// // dtBeforeCollision is always smaller -// // the maximum depth of recursion is 1 -// updateParticle(i, dt - dtBeforeCollision, new_vel_x, new_vel_y); -// } else { - -// x_[i] += step_x; -// y_[i] += step_y; -// } -// } \ No newline at end of file + if (dt_y < dt_x) { + // collision BOTTOM + if (mask_->isObstacle(idx[0], idx[1] - 1)){ + newVel[1] = -vel[1]; + } else { + newIdx[1] -= 1; + } + dtBeforeCollision = dt_y; + } else { + // collision RIGHT + if (mask_->isObstacle(idx[0] + 1, idx[1])){ // TODO: change + newVel[0] = -vel[0]; + } else { + newIdx[0] += 1; + } + dtBeforeCollision = dt_x; + } + } + // U + } else if (vel[0] < 0){ + dist_x = leftBorder - x_[i]; + dt_x = dist_x/vel[0]; // -- = + + + if (vel[1] >= 0) { + // direction TOP_LEFT + dist_y = topBorder - y_[i]; + dt_y = dist_y/vel[1]; + + if (dt_y < dt_x) { + // collision TOP + if (mask_->isObstacle(idx[0], idx[1] + 1)){ + newVel[1] = -vel[1]; + } else { + newIdx[1] += 1; + } + dtBeforeCollision = dt_y; + } else { + // collision LEFT + if (mask_->isObstacle(idx[0] - 1, idx[1])){ // TODO: change + newVel[0] = -vel[0]; + } else { + newIdx[0] -= 1; + } + dtBeforeCollision = dt_x; + } + } else if (vel[1] < 0){ + // direction BOTTOM_LEFT + dist_y = lowerBorder - y_[i]; + dt_y = dist_y/vel[1]; // -- = + + + if (dt_y < dt_x) { + // collision BOTTOM + if (mask_->isObstacle(idx[0], idx[1] - 1)){ + newVel[1] = -vel[1]; + } else { + newIdx[1] -= 1; + } + dtBeforeCollision = dt_y; + } else { + // collision LEFT + if (mask_->isObstacle(idx[0] - 1, idx[1])){ //TODO: change + newVel[0] = -vel[0]; + } else { + newIdx[0] -= 1; + } + dtBeforeCollision = dt_x; + } + } + } + // Bugfix for Floating Point Error + if (dt_x < eps || dt_y < eps){ + dtBeforeCollision = eps; + } + + // Happens if it was outside of cell but flies into the cell + if (dt < dtBeforeCollision) { + x_[i] += dt * vel[0]; + y_[i] += dt * vel[1]; + return vel; + } + + x_[i] += dtBeforeCollision * vel[0]; + y_[i] += dtBeforeCollision * vel[1]; + double newDt = dt - dtBeforeCollision; + + if (newDt < eps){ + return newVel; + } + return updateParticle(i, newIdx, newDt, newVel, depth + 1); + } +} \ No newline at end of file diff --git a/src/surface/fluid_tracer.h b/src/surface/fluid_tracer.h index df43547e..3f3a2f8e 100644 --- a/src/surface/fluid_tracer.h +++ b/src/surface/fluid_tracer.h @@ -55,9 +55,17 @@ class FluidTracer { */ std::array getParticlePosition(int i) const; + std::array cellOfParticle(int i); int val2CellX(double xVal); int val2CellY(double yVal); + + + // Only test + std::array updateParticle(int i, std::array idx, double dt, std::array vel, int depth); + std::array moveParticles(double dt, std::array vel); + + private: /** * @brief initializes a single cell according to nx, ny and numParticlesPerCell_ @@ -68,7 +76,7 @@ class FluidTracer { */ void initializeFluidCell(int i, int j, int idx); - void updateParticle(int i, double dt, double vel_x, double vel_y); + std::array updateParticle(int i, std::array, double dt, std::array vel); int numParticles_; @@ -81,4 +89,6 @@ class FluidTracer { std::shared_ptr mask_; std::vector x_; std::vector y_; + + }; \ No newline at end of file diff --git a/tests/test_fluid_tracer.cpp b/tests/test_fluid_tracer.cpp index 5ec7bbb1..5f7170f8 100644 --- a/tests/test_fluid_tracer.cpp +++ b/tests/test_fluid_tracer.cpp @@ -1,379 +1,400 @@ -// #include -// #include "../src/surface/fluid_tracer.h" -// #include "../src/discretization/central_differences.h" - -// // Experimental stuff -// #include - -// TEST(FluidTracer, NumberParticlesSingleCell){ -// /* -// Test for a single cell (with 8 boundary cells) how many particles are placed -// */ -// std::array n_cells = {1, 1}; -// std::array meshWidth = {1.0, 1.0}; -// std::shared_ptr mask = std::make_shared(n_cells); -// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); -// int numParticlesPerCell = 1; -// FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); -// EXPECT_GE(fluid_tracer.getNumberOfParticles(), numParticlesPerCell); - -// int numParticlesPerCell2 = 9; -// FluidTracer fluid_tracer2(numParticlesPerCell2, discretization, mask); -// EXPECT_GE(fluid_tracer2.getNumberOfParticles(), numParticlesPerCell2); - -// int numParticlesPerCell3 = 17; -// FluidTracer fluid_tracer3(numParticlesPerCell3, discretization, mask); -// EXPECT_GE(fluid_tracer3.getNumberOfParticles(), numParticlesPerCell3); - -// int numParticlesPerCell4 = 100; -// FluidTracer fluid_tracer4(numParticlesPerCell4, discretization, mask); -// EXPECT_GE(fluid_tracer4.getNumberOfParticles(), numParticlesPerCell4); -// EXPECT_GE(fluid_tracer4.getNumberOfParticles(), fluid_tracer3.getNumberOfParticles()); -// EXPECT_LE(fluid_tracer4.getNumberOfParticles(), 2 * numParticlesPerCell4); -// }; - -// TEST(FluidTracer, DistributionSingleCell){ -// /* -// Test for a single cell (with 8 boundary cells) how many particles are placed -// */ -// std::array n_cells = {1, 1}; -// std::array meshWidth = {1.0, 1.0}; -// std::shared_ptr mask = std::make_shared(n_cells); -// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); -// int numParticlesPerCell = 1; -// FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); -// EXPECT_NEAR(fluid_tracer.getParticlePosition(0)[0], 0.5, 0.001); -// EXPECT_NEAR(fluid_tracer.getParticlePosition(0)[1], 0.5, 0.001); - -// int numParticlesPerCell2 = 9; -// FluidTracer fluid_tracer2(numParticlesPerCell2, discretization, mask); -// EXPECT_NEAR(fluid_tracer2.getParticlePosition(0)[0], 0.166667, 0.001); -// EXPECT_NEAR(fluid_tracer2.getParticlePosition(0)[1], 0.166667, 0.001); -// EXPECT_NEAR(fluid_tracer2.getParticlePosition(1)[0], 0.5, 0.001); -// EXPECT_NEAR(fluid_tracer2.getParticlePosition(1)[1], 0.166667, 0.001); -// EXPECT_NEAR(fluid_tracer2.getParticlePosition(4)[0], 0.5, 0.001); -// EXPECT_NEAR(fluid_tracer2.getParticlePosition(4)[1], 0.5, 0.001); -// EXPECT_NEAR(fluid_tracer2.getParticlePosition(8)[0], 0.833333, 0.001); -// EXPECT_NEAR(fluid_tracer2.getParticlePosition(8)[1], 0.833333, 0.001); - -// int numParticlesPerCell3 = 17; -// FluidTracer fluid_tracer3(numParticlesPerCell3, discretization, mask); -// EXPECT_NEAR(fluid_tracer3.getParticlePosition(0)[0], 0.125, 0.1); -// EXPECT_NEAR(fluid_tracer3.getParticlePosition(0)[1], 0.1, 0.1); -// EXPECT_NEAR(fluid_tracer3.getParticlePosition(1)[0], 0.375, 0.1); -// EXPECT_NEAR(fluid_tracer3.getParticlePosition(1)[1], 0.1, 0.1); - -// } - -// TEST(FluidTracer, GridSingleCellUnevenDxDy){ -// std::array n_cells = {1, 1}; -// std::array meshWidth1 = {1.0, 0.5}; -// std::shared_ptr mask = std::make_shared(n_cells); -// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth1); -// int numParticlesPerCell = 16; -// FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); -// } - - -// TEST(FluidTracer, val2CellXAndY){ -// std::array n_cells = {1, 1}; -// std::array meshWidth = {1.0, 1.0}; -// std::shared_ptr mask = std::make_shared(n_cells); -// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); -// int numParticlesPerCell = 9; -// FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); -// EXPECT_EQ(fluid_tracer.val2CellX(0.5), 1); -// EXPECT_EQ(fluid_tracer.val2CellX(0.0), 1); -// EXPECT_EQ(fluid_tracer.val2CellX(-0.5), 0); -// EXPECT_EQ(fluid_tracer.val2CellX(1.5), 2); - -// EXPECT_EQ(fluid_tracer.val2CellY(0.5), 1); -// EXPECT_EQ(fluid_tracer.val2CellY(0.0), 1); -// EXPECT_EQ(fluid_tracer.val2CellY(-0.5), 0); -// EXPECT_EQ(fluid_tracer.val2CellY(1.5), 2); -// } - -// TEST(FluidTracer, moveParticles_1Cell_1Particle_WithoutCollision){ -// // u(0,2) ----- u(1,2) -// // : : -// // v(0,1) |____v(1,1)_____| v(2,1) -// // | | -// // u(0,1) ----- u(1,1) -// // | | -// // v(0,0) |____v(1,0)_____| v(2,0) -// // : : -// // u(0,0) ----- u(1,0) -// // +#include +#include "../src/surface/fluid_tracer.h" +#include "../src/discretization/central_differences.h" + +// Experimental stuff +#include + +TEST(FluidTracer, NumberParticlesSingleCell){ + /* + Test for a single cell (with 8 boundary cells) how many particles are placed + */ + Settings settings; + settings.nCells = {1, 1}; + settings.physicalSize = {1.0, 1.0}; + std::array meshWidth = {1.0, 1.0}; + + std::shared_ptr mask = std::make_shared(settings); + std::shared_ptr discretization = std::make_shared(settings.nCells, meshWidth); + + + int numParticlesPerCell = 1; + FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); + EXPECT_GE(fluid_tracer.getNumberOfParticles(), numParticlesPerCell); + + int numParticlesPerCell2 = 9; + FluidTracer fluid_tracer2(numParticlesPerCell2, discretization, mask); + EXPECT_GE(fluid_tracer2.getNumberOfParticles(), numParticlesPerCell2); + + int numParticlesPerCell3 = 17; + FluidTracer fluid_tracer3(numParticlesPerCell3, discretization, mask); + EXPECT_GE(fluid_tracer3.getNumberOfParticles(), numParticlesPerCell3); + + int numParticlesPerCell4 = 100; + FluidTracer fluid_tracer4(numParticlesPerCell4, discretization, mask); + EXPECT_GE(fluid_tracer4.getNumberOfParticles(), numParticlesPerCell4); + EXPECT_GE(fluid_tracer4.getNumberOfParticles(), fluid_tracer3.getNumberOfParticles()); + EXPECT_LE(fluid_tracer4.getNumberOfParticles(), 2 * numParticlesPerCell4); +}; + +TEST(FluidTracer, DistributionSingleCell){ + /* + Test for a single cell (with 8 boundary cells) how many particles are placed + */ + Settings settings; + settings.nCells = {1, 1}; + settings.physicalSize = {1.0, 1.0}; + std::array meshWidth = {1.0, 1.0}; + + std::shared_ptr mask = std::make_shared(settings); + std::shared_ptr discretization = std::make_shared(settings.nCells, meshWidth); + + + int numParticlesPerCell = 1; + FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); + EXPECT_NEAR(fluid_tracer.getParticlePosition(0)[0], 0.5, 0.001); + EXPECT_NEAR(fluid_tracer.getParticlePosition(0)[1], 0.5, 0.001); + + int numParticlesPerCell2 = 9; + FluidTracer fluid_tracer2(numParticlesPerCell2, discretization, mask); + EXPECT_NEAR(fluid_tracer2.getParticlePosition(0)[0], 0.166667, 0.001); + EXPECT_NEAR(fluid_tracer2.getParticlePosition(0)[1], 0.166667, 0.001); + EXPECT_NEAR(fluid_tracer2.getParticlePosition(1)[0], 0.5, 0.001); + EXPECT_NEAR(fluid_tracer2.getParticlePosition(1)[1], 0.166667, 0.001); + EXPECT_NEAR(fluid_tracer2.getParticlePosition(4)[0], 0.5, 0.001); + EXPECT_NEAR(fluid_tracer2.getParticlePosition(4)[1], 0.5, 0.001); + EXPECT_NEAR(fluid_tracer2.getParticlePosition(8)[0], 0.833333, 0.001); + EXPECT_NEAR(fluid_tracer2.getParticlePosition(8)[1], 0.833333, 0.001); + + int numParticlesPerCell3 = 17; + FluidTracer fluid_tracer3(numParticlesPerCell3, discretization, mask); + EXPECT_NEAR(fluid_tracer3.getParticlePosition(0)[0], 0.125, 0.1); + EXPECT_NEAR(fluid_tracer3.getParticlePosition(0)[1], 0.1, 0.1); + EXPECT_NEAR(fluid_tracer3.getParticlePosition(1)[0], 0.375, 0.1); + EXPECT_NEAR(fluid_tracer3.getParticlePosition(1)[1], 0.1, 0.1); + +} + + +TEST(FluidTracer, val2CellXAndY){ + Settings settings; + settings.nCells = {1, 1}; + settings.physicalSize = {1.0, 1.0}; + std::array meshWidth = {1.0, 1.0}; + + std::shared_ptr mask = std::make_shared(settings); + std::shared_ptr discretization = std::make_shared(settings.nCells, meshWidth); + + FluidTracer fluid_tracer(1, discretization, mask); + + EXPECT_EQ(fluid_tracer.val2CellX(0.5), 1); + EXPECT_EQ(fluid_tracer.val2CellX(0.0), 1); + EXPECT_EQ(fluid_tracer.val2CellX(-0.5), 0); + EXPECT_EQ(fluid_tracer.val2CellX(1.5), 2); + + EXPECT_EQ(fluid_tracer.val2CellY(0.5), 1); + EXPECT_EQ(fluid_tracer.val2CellY(0.0), 1); + EXPECT_EQ(fluid_tracer.val2CellY(-0.5), 0); + EXPECT_EQ(fluid_tracer.val2CellY(1.5), 2); +} + +TEST(FluidTracer, moveParticles_1Cell_1Particle_WithoutCollision){ + // u(0,2) ----- u(1,2) + // : : + // v(0,1) |____v(1,1)_____| v(2,1) + // | | + // u(0,1) ----- u(1,1) + // | | + // v(0,0) |____v(1,0)_____| v(2,0) + // : : + // u(0,0) ----- u(1,0) + // -// std::array n_cells = {1, 1}; -// std::array meshWidth = {1.0, 1.0}; -// std::shared_ptr mask = std::make_shared(n_cells); -// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); - -// std::array velocitiesU = {-1, -0.1, -0.01, 0, 0.01, 0.1, 1}; -// std::array velocitiesV = {-1, -0.1, -0.01, 0, 0.01, 0.1, 1}; + Settings settings; + settings.nCells = {1, 1}; + settings.physicalSize = {1.0, 1.0}; + std::array meshWidth = {1.0, 1.0}; + + std::shared_ptr mask = std::make_shared(settings); + std::shared_ptr discretization = std::make_shared(settings.nCells, meshWidth); + int numParticlesPerCell = 1; + FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); + + std::array velocitiesU = {-1, -0.1, -0.01, 0, 0.01, 0.1, 1}; + std::array velocitiesV = {-1, -0.1, -0.01, 0, 0.01, 0.1, 1}; -// // Checks 49 Cases -// for (int idx_u = 0; idx_u < velocitiesU.size(); idx_u++){ -// for (int idx_v = 0; idx_v < velocitiesV.size(); idx_v++){ - -// // Set all velocities to the same value -// discretization->u(0,0) = velocitiesU[idx_u]; -// discretization->u(1,0) = velocitiesU[idx_u]; -// discretization->u(0,1) = velocitiesU[idx_u]; -// discretization->u(1,1) = velocitiesU[idx_u]; -// discretization->u(0,2) = velocitiesU[idx_u]; -// discretization->u(1,2) = velocitiesU[idx_u]; - -// discretization->v(0,0) = velocitiesV[idx_v]; -// discretization->v(1,0) = velocitiesV[idx_v]; -// discretization->v(2,0) = velocitiesV[idx_v]; -// discretization->v(0,1) = velocitiesV[idx_v]; -// discretization->v(1,1) = velocitiesV[idx_v]; -// discretization->v(2,1) = velocitiesV[idx_v]; - -// // Initialize Fluid tracer with single particle -// int numParticlesPerCell = 1; -// FluidTracer fluid_tracer(numParticlesPerCell, discretization, mask); -// double old_pos_x = fluid_tracer.getParticlePosition(0)[0]; -// double old_pos_y = fluid_tracer.getParticlePosition(0)[1]; -// EXPECT_EQ(fluid_tracer.getNumberOfParticles(), 1); -// EXPECT_EQ(old_pos_x, 0.5); -// EXPECT_EQ(old_pos_y, 0.5); - - -// // Update particle according to velocity - -// double dt = 0.1; // -// fluid_tracer.moveParticles(dt); -// EXPECT_EQ(fluid_tracer.getParticlePosition(0)[0], old_pos_x + dt * velocitiesU[idx_u]); -// EXPECT_EQ(fluid_tracer.getParticlePosition(0)[1], old_pos_y + dt * velocitiesV[idx_v]); -// } -// } -// } - - -// TEST(FluidTracer, moveParticles_1Cell_1Particle_WithCollision){ -// // u(0,2) ----- u(1,2) -// // : : -// // v(0,1) |____v(1,1)_____| v(2,1) -// // | | -// // u(0,1) ----- u(1,1) -// // | | -// // v(0,0) |____v(1,0)_____| v(2,0) -// // : : -// // u(0,0) ----- u(1,0) -// // - -// // TODO: check obstacle edges + // Checks 49 Cases + for (int idx_u = 0; idx_u < velocitiesU.size(); idx_u++){ + for (int idx_v = 0; idx_v < velocitiesV.size(); idx_v++){ + + // Set all velocities to the same value + discretization->u(0,0) = velocitiesU[idx_u]; + discretization->u(1,0) = velocitiesU[idx_u]; + discretization->u(0,1) = velocitiesU[idx_u]; + discretization->u(1,1) = velocitiesU[idx_u]; + discretization->u(0,2) = velocitiesU[idx_u]; + discretization->u(1,2) = velocitiesU[idx_u]; + + discretization->v(0,0) = velocitiesV[idx_v]; + discretization->v(1,0) = velocitiesV[idx_v]; + discretization->v(2,0) = velocitiesV[idx_v]; + discretization->v(0,1) = velocitiesV[idx_v]; + discretization->v(1,1) = velocitiesV[idx_v]; + discretization->v(2,1) = velocitiesV[idx_v]; + + // Initialize Fluid tracer with single particle + FluidTracer fluid_tracer(1, discretization, mask); + + double old_pos_x = fluid_tracer.getParticlePosition(0)[0]; + double old_pos_y = fluid_tracer.getParticlePosition(0)[1]; + EXPECT_EQ(fluid_tracer.getNumberOfParticles(), 1); + EXPECT_EQ(old_pos_x, 0.5); + EXPECT_EQ(old_pos_y, 0.5); + + // Update particle according to velocity + + double dt = 0.1; // + fluid_tracer.moveParticles(dt); + EXPECT_EQ(fluid_tracer.getParticlePosition(0)[0], old_pos_x + dt * velocitiesU[idx_u]); + EXPECT_EQ(fluid_tracer.getParticlePosition(0)[1], old_pos_y + dt * velocitiesV[idx_v]); + } + } +} + + +TEST(FluidTracer, moveParticles_1Cell_1Particle_WithCollision){ + // u(0,2) ----- u(1,2) + // : : + // v(0,1) |____v(1,1)_____| v(2,1) + // | | + // u(0,1) ----- u(1,1) + // | | + // v(0,0) |____v(1,0)_____| v(2,0) + // : : + // u(0,0) ----- u(1,0) + // + + // TODO: check obstacle edges -// std::array n_cells = {1, 1}; -// std::array meshWidth = {1.0, 1.0}; -// std::shared_ptr mask = std::make_shared(n_cells); -// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); - -// std::array velocitiesU = {-6, -1, 1, 6}; -// std::array velocitiesV = {-6, -1, 1, 6}; -// // std::array velocitiesU = {8}; -// // std::array velocitiesV = {1}; + Settings settings; + settings.nCells = {1, 1}; + settings.physicalSize = {1.0, 1.0}; + std::array meshWidth = {1.0, 1.0}; + + std::shared_ptr mask = std::make_shared(settings); + std::shared_ptr discretization = std::make_shared(settings.nCells, meshWidth); + + std::array velocitiesU = {-6, -1, 1, 6}; + std::array velocitiesV = {-6, -1, 1, 6}; + // std::array velocitiesU = {8}; + // std::array velocitiesV = {1}; -// // Checks 16 Cases --> 0°, 27°, 45°, 63°, 90°, ... -// for (int idx_u = 0; idx_u < velocitiesU.size(); idx_u++){ -// for (int idx_v = 0; idx_v < velocitiesV.size(); idx_v++){ - -// // Set all velocities to the same value -// discretization->u(0,0) = velocitiesU[idx_u]; -// discretization->u(1,0) = velocitiesU[idx_u]; -// discretization->u(0,1) = velocitiesU[idx_u]; -// discretization->u(1,1) = velocitiesU[idx_u]; -// discretization->u(0,2) = velocitiesU[idx_u]; -// discretization->u(1,2) = velocitiesU[idx_u]; - -// discretization->v(0,0) = velocitiesV[idx_v]; -// discretization->v(1,0) = velocitiesV[idx_v]; -// discretization->v(2,0) = velocitiesV[idx_v]; -// discretization->v(0,1) = velocitiesV[idx_v]; -// discretization->v(1,1) = velocitiesV[idx_v]; -// discretization->v(2,1) = velocitiesV[idx_v]; - - -// // Initialize Fluid tracer with single particle -// int numParticlesPerCell = 1; -// FluidTracer fluidTracer(numParticlesPerCell, discretization, mask); -// double old_pos_x = fluidTracer.getParticlePosition(0)[0]; -// double old_pos_y = fluidTracer.getParticlePosition(0)[1]; -// EXPECT_EQ(fluidTracer.getNumberOfParticles(), 1); -// EXPECT_EQ(old_pos_x, 0.5); -// EXPECT_EQ(old_pos_y, 0.5); +// Checks 16 Cases --> 0°, 27°, 45°, 63°, 90°, ... + for (int idx_u = 0; idx_u < velocitiesU.size(); idx_u++){ + for (int idx_v = 0; idx_v < velocitiesV.size(); idx_v++){ + + // Set all velocities to the same value + discretization->u(0,0) = velocitiesU[idx_u]; + discretization->u(1,0) = velocitiesU[idx_u]; + discretization->u(0,1) = velocitiesU[idx_u]; + discretization->u(1,1) = velocitiesU[idx_u]; + discretization->u(0,2) = velocitiesU[idx_u]; + discretization->u(1,2) = velocitiesU[idx_u]; + + discretization->v(0,0) = velocitiesV[idx_v]; + discretization->v(1,0) = velocitiesV[idx_v]; + discretization->v(2,0) = velocitiesV[idx_v]; + discretization->v(0,1) = velocitiesV[idx_v]; + discretization->v(1,1) = velocitiesV[idx_v]; + discretization->v(2,1) = velocitiesV[idx_v]; + + + // Initialize Fluid tracer with single particle + FluidTracer fluidTracer(1, discretization, mask); + + double old_pos_x = fluidTracer.getParticlePosition(0)[0]; + double old_pos_y = fluidTracer.getParticlePosition(0)[1]; + EXPECT_EQ(fluidTracer.getNumberOfParticles(), 1); + EXPECT_EQ(old_pos_x, 0.5); + EXPECT_EQ(old_pos_y, 0.5); + // Update particle + double dt = 0.1; + fluidTracer.moveParticles(dt); + + // Particle is still in the box + EXPECT_GE(fluidTracer.getParticlePosition(0)[0], 0.0); + EXPECT_LE(fluidTracer.getParticlePosition(0)[0], 1.0); + EXPECT_GE(fluidTracer.getParticlePosition(0)[1], 0.0); + EXPECT_LE(fluidTracer.getParticlePosition(0)[1], 1.0); + + + // CHECK A SPECIAL CASE + // if (idx_u == 3 && idx_v == 2){ + // // Particles position is + // double new_pos_x = 0.75; + // double new_pos_y = 0.875; + // EXPECT_EQ(fluid_tracer.getParticlePosition(0)[0], new_pos_x); + // EXPECT_EQ(fluid_tracer.getParticlePosition(0)[1], new_pos_y); + // } + } + } +} + + +TEST(FluidTracer, moveParticlesInLargeGrid){ + // Flow Field like this: + // + // Right Down + // Up Left + // + // Or larger + // + // R R R D D D + // R R R D D D + // R R R D D D + // U U U L L L + // U U U L L L + // U U U L L L + + Settings settings; + settings.nCells = {9, 9}; + settings.physicalSize = {1.0, 1.0}; + std::array meshWidth = {settings.physicalSize[0] / settings.nCells[0], settings.physicalSize[1] / settings.nCells[1]}; + + std::shared_ptr mask = std::make_shared(settings); + std::shared_ptr discretization = std::make_shared(settings.nCells, meshWidth); + + std::vector x = {0.1, 0.1, 0.9, 0.9, 0.25, 0.75, 0.25, 0.75}; + std::vector y = {0.1, 0.9, 0.1, 0.9, 0.25, 0.25, 0.75, 0.75}; + FluidTracer fluidTracer(x, y, discretization, mask); + + + // Create an interesting flow-field: Wirbel + for (int i = 0; i < settings.nCells[0]; i++){ + for (int j = 0; j < settings.nCells[1]; j++){ + if (i > settings.nCells[0]/2){ + if (j > settings.nCells[1]/2){ + discretization->v(i,j) = -1; + } else { + discretization->u(i,j) = -1; + } + } else { + if (j > settings.nCells[1]/2){ + discretization->u(i,j) = 1; + } else { + discretization->v(i,j) = 1; + } + } + } + } + // Move particles for 100 steps + double dt = 0.1; + for (int k = 0; k < 100; k++){ + fluidTracer.moveParticles(dt); + + + // particles are still in the box + for (int i = 0; i < fluidTracer.getNumberOfParticles(); i++){ + EXPECT_GE(fluidTracer.getParticlePosition(i)[0], 0.0); + EXPECT_LE(fluidTracer.getParticlePosition(i)[0], 1.0); + EXPECT_GE(fluidTracer.getParticlePosition(i)[1], 0.0); + EXPECT_LE(fluidTracer.getParticlePosition(i)[1], 1.0); + } + } + +} + +TEST(FluidTracer, moveDistributedParticlesInLargeGrid){ + // Flow Field like this: + // + // Right Down + // Up Left + // + // Or larger + // + // R R R D D D + // R R R D D D + // R R R D D D + // U U U L L L + // U U U L L L + // U U U L L L + + Settings settings; + settings.nCells = {9, 9}; + settings.physicalSize = {1.0, 1.0}; + std::array meshWidth = {settings.physicalSize[0] / settings.nCells[0], settings.physicalSize[1] / settings.nCells[1]}; + std::shared_ptr mask = std::make_shared(settings); + std::shared_ptr discretization = std::make_shared(settings.nCells, meshWidth); + + FluidTracer fluidTracer(1, discretization, mask); + double vel = meshWidth[0]; + for (int i = 0; i < settings.nCells[0]; i++){ + for (int j = 0; j < settings.nCells[1] + 1; j++){ + // Flow to the right + discretization->u(i,j) = vel; + } + } + + double dt = 0.5; + for (int k = 0; k < 1; k++){ + fluidTracer.moveParticles(dt); + mask->printMask(); + + + // particles are still in the box + for (int i = 0; i < fluidTracer.getNumberOfParticles(); i++){ + EXPECT_GE(fluidTracer.getParticlePosition(i)[0], 0.0); + EXPECT_LE(fluidTracer.getParticlePosition(i)[0], 1.0); + EXPECT_GE(fluidTracer.getParticlePosition(i)[1], 0.0); + EXPECT_LE(fluidTracer.getParticlePosition(i)[1], 1.0); + } + + } + +} + +// Benötigt Test Methode mit return velocity +TEST(FluidTracer, DVDLogoBounceOff){ + + Settings settings; + settings.nCells = {10, 10}; + settings.obstaclePosition = {0.45, 0.45}; + settings.obstacleDimension = {0.1, 0.1}; + settings.physicalSize = {1.0, 1.0}; + std::array meshWidth = {settings.physicalSize[0] / settings.nCells[0], settings.physicalSize[1] / settings.nCells[1]}; + + std::shared_ptr mask = std::make_shared(settings); + std::shared_ptr discretization = std::make_shared(settings.nCells, meshWidth); + + mask->makeRectangularObstacle(); + mask->setObstacleBC(); + + // Initial values + std::array vel = {0.35*meshWidth[0], -0.5 * meshWidth[1]}; + double dt = 1; + std::vector x = {0.5}; + std::vector y = {0.2}; + + FluidTracer fluidTracer(x, y, discretization, mask); + + + for (int k = 0; k < 100; k++){ + + + mask->printMask(); + std::cout << k << " "; + vel = fluidTracer.moveParticles(dt, vel); + std::cout << "\033[2J\033[1;1H"; + usleep(10000); + } +} -// // Update particle - -// double dt = 0.1; -// fluidTracer.moveParticles(dt); - -// // Particle is still in the box -// EXPECT_GE(fluidTracer.getParticlePosition(0)[0], 0.0); -// EXPECT_LE(fluidTracer.getParticlePosition(0)[0], 1.0); -// EXPECT_GE(fluidTracer.getParticlePosition(0)[1], 0.0); -// EXPECT_LE(fluidTracer.getParticlePosition(0)[1], 1.0); - - -// // SPECIAL CASE -// // if (idx_u == 3 && idx_v == 2){ -// // // Particles position is -// // double new_pos_x = 0.75; -// // double new_pos_y = 0.875; -// // EXPECT_EQ(fluid_tracer.getParticlePosition(0)[0], new_pos_x); -// // EXPECT_EQ(fluid_tracer.getParticlePosition(0)[1], new_pos_y); -// // } -// } -// } -// } - - -// TEST(FluidTracer, moveParticlesInLargeGrid){ -// // Flow Field like this: -// // -// // Right Down -// // Up Left -// // -// // Or larger -// // -// // R R R D D D -// // R R R D D D -// // R R R D D D -// // U U U L L L -// // U U U L L L -// // U U U L L L - -// std::array n_cells = {9, 9}; - - -// std::array meshWidth = {1.0/n_cells[0], 1.0/n_cells[1]}; -// std::shared_ptr mask = std::make_shared(n_cells); -// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); - -// std::vector x = {0.1, 0.1, 0.9, 0.9, 0.25, 0.75, 0.25, 0.75}; -// std::vector y = {0.1, 0.9, 0.1, 0.9, 0.25, 0.25, 0.75, 0.75}; - -// FluidTracer fluidTracer(x, y, discretization, mask); - - -// // Wirbel -// for (int i = 0; i < n_cells[0]; i++){ -// for (int j = 0; j < n_cells[1]; j++){ -// if (i > n_cells[0]/2){ -// if (j > n_cells[1]/2){ -// discretization->v(i,j) = -1; -// } else { -// discretization->u(i,j) = -1; -// } -// } else { -// if (j > n_cells[1]/2){ -// discretization->u(i,j) = 1; -// } else { -// discretization->v(i,j) = 1; -// } -// } -// } -// } - - -// double dt = 0.1; -// for (int k = 0; k < 100; k++){ -// fluidTracer.moveParticles(dt); - -// // does a cool animation - - -// // mask->printMask(); -// // std::cout << "\033[2J\033[1;1H"; -// // usleep(500000); - -// // 1st particle is still in the box -// EXPECT_GE(fluidTracer.getParticlePosition(0)[0], 0.0); -// EXPECT_LE(fluidTracer.getParticlePosition(0)[0], 1.0); -// EXPECT_GE(fluidTracer.getParticlePosition(0)[1], 0.0); -// EXPECT_LE(fluidTracer.getParticlePosition(0)[1], 1.0); -// } - -// } - -// TEST(FluidTracer, moveDistributedParticlesInLargeGrid){ -// // Flow Field like this: -// // -// // Right Down -// // Up Left -// // -// // Or larger -// // -// // R R R D D D -// // R R R D D D -// // R R R D D D -// // U U U L L L -// // U U U L L L -// // U U U L L L - -// std::array n_cells = {5, 5}; - - -// std::array meshWidth = {1.0/n_cells[0], 1.0/n_cells[1]}; - -// std::shared_ptr discretization = std::make_shared(n_cells, meshWidth); -// std::shared_ptr mask = std::make_shared(n_cells); -// mask->printMask(); - -// FluidTracer fluidTracer(1, discretization, mask); - -// double vel = meshWidth[0]; -// for (int i = 0; i < n_cells[0]; i++){ -// for (int j = 0; j < n_cells[1] + 1; j++){ -// // Flow to right -// discretization->u(i,j) = vel; -// // Wirbel -// // if (i > n_cells[0]/2){ -// // if (j > n_cells[1]/2){ -// // discretization->v(i,j) = -vel; -// // } else { -// // discretization->u(i,j) = -vel; -// // } -// // } else { -// // if (j > n_cells[1]/2){ -// // discretization->u(i,j) = vel; -// // } else { -// // discretization->v(i,j) = vel; -// // } -// // } -// } -// } - -// double dt = 0.5; -// for (int k = 0; k < 1; k++){ -// fluidTracer.moveParticles(dt); - -// // does a cool animation -// // mask->printMask(); -// // std::cout << "\033[2J\033[1;1H"; -// // usleep(1000000); - -// // Particle is still in the box -// EXPECT_GE(fluidTracer.getParticlePosition(0)[0], 0.0); -// EXPECT_LE(fluidTracer.getParticlePosition(0)[0], 1.0); -// EXPECT_GE(fluidTracer.getParticlePosition(0)[1], 0.0); -// EXPECT_LE(fluidTracer.getParticlePosition(0)[1], 1.0); -// } - -// } - - - - -// // ----------------------------------------------------------------- -// // --- T E S T U P D A T E M A S K B O U N D A R I E S --- -// // ----------------------------------------------------------------- +// ----------------------------------------------------------------- +// --- T E S T U P D A T E M A S K B O U N D A R I E S --- +// ----------------------------------------------------------------- diff --git a/tests/test_mask.cpp b/tests/test_mask.cpp index 98ba5fab..735f9a6a 100644 --- a/tests/test_mask.cpp +++ b/tests/test_mask.cpp @@ -98,12 +98,14 @@ TEST(Mask, makeSmallRectangularObstacleCenter){ // A - Air Settings settings; settings.nCells = {10, 10}; + settings.physicalSize = {1.0, 1.0}; settings.obstaclePosition = {0.45, 0.45}; settings.obstacleDimension = {0.1, 0.1}; - settings.physicalSize = {1.0, 1.0}; Mask mask(settings); mask.makeRectangularObstacle(); + mask.setObstacleBC(); + mask.printMask(); EXPECT_EQ(mask(5,5), Mask::OBSTACLE_CORNER_BOTTOM_LEFT); EXPECT_EQ(mask(5,6), Mask::OBSTACLE_CORNER_TOP_LEFT); From fda7597b917fc0d6502dd90105859264b42e7b5e Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Sun, 4 Feb 2024 18:51:54 +0100 Subject: [PATCH 36/67] error checking --- input/settings_debug.txt | 4 +- src/output_writer/output_writer_paraview.cpp | 56 +++++++++++++------- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/input/settings_debug.txt b/input/settings_debug.txt index 610df9a0..2934e384 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -52,8 +52,8 @@ createDomainfromBitmap = false pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/aerodynamic_obstacle.png # Discretization parameters -nCellsX = 20 # number of cells in x and y direction -nCellsY = 20 +nCellsX = 3 # number of cells in x and y direction +nCellsY = 3 useDonorCell = true # if donor cell discretization should be used, possible values: true false alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences tau = 0.5 # safety factor for time step width diff --git a/src/output_writer/output_writer_paraview.cpp b/src/output_writer/output_writer_paraview.cpp index 2cce1f43..4148254a 100644 --- a/src/output_writer/output_writer_paraview.cpp +++ b/src/output_writer/output_writer_paraview.cpp @@ -71,48 +71,68 @@ void OutputWriterParaview::writeFile(double currentTime) int index = 0; - for (int j = 1; j < n_cells_y; j++) + for (int j = 0; j < n_cells_y; j++) { - for (int i = 1; i < n_cells_x; i++, index++) + for (int i = 0; i < n_cells_x; i++, index++) { const double x = i * dx; const double y = j * dy; + // vertex if (std::fmod(x, discretization_->meshWidth()[0]) == 0 && std::fmod(y, discretization_->meshWidth()[1]) == 0) { - int i_bottom_left = i / 2 - 1; - int j_bootom_left = j / 2 - 1; - if (mask_->isObstacle(i_bottom_left, j_bootom_left) || mask_->isObstacle(i_bottom_left + 1, j_bootom_left) || mask_->isObstacle(i_bottom_left, j_bootom_left + 1) || mask_->isObstacle(i_bottom_left + 1, j_bootom_left + 1)) + int i_bottom_left = i / 2; + int j_bootom_left = j / 2; + if (mask_->isObstacle(i_bottom_left, j_bootom_left) || mask_->isObstacle(i_bottom_left + 1, j_bootom_left) || mask_->isObstacle(i_bottom_left, j_bootom_left + 1) || mask_->isObstacle(i_bottom_left + 1, j_bootom_left + 1)){ arrayMask->SetValue(index, OBSTACLE); - else + std::cout << i << " " << j << " set obstacle in 1\n"; + } + else{ arrayMask->SetValue(index, FLUID); + std::cout << i << " " << j << " set Fluid in 1\n"; + } } + // middle else if (std::fmod(x, discretization_->meshWidth()[0]) != 0 && std::fmod(y, discretization_->meshWidth()[1]) != 0) { - int i_new = (i - 1) / 2; - int j_new = (j - 1) / 2; - if (mask_->isObstacle(i_new, j_new)) + int i_new = ((i - 1) / 2)+1; + int j_new = ((j - 1) / 2)+1; + if (mask_->isObstacle(i_new, j_new)){ arrayMask->SetValue(index, OBSTACLE); - else + std::cout << i << " " << j << " set obstacle in 2\n"; + } + else{ arrayMask->SetValue(index, FLUID); + std::cout << i << " " << j << " set Fluid in 2\n"; + } } + // horizontal else if (std::fmod(x, discretization_->meshWidth()[0]) != 0 && std::fmod(y, discretization_->meshWidth()[1]) == 0) { - int i_bottom = (i - 1) / 2; - int j_bottom = j / 2 - 1; - if (mask_->isObstacle(i_bottom, j_bottom) || mask_->isObstacle(i_bottom, j_bottom + 1)) + int i_bottom = ((i - 1) / 2)+1; + int j_bottom = j / 2; + if (mask_->isObstacle(i_bottom, j_bottom) || mask_->isObstacle(i_bottom, j_bottom + 1)){ arrayMask->SetValue(index, OBSTACLE); - else + std::cout << i << " " << j << " set obstacle in 3\n"; + } + else{ arrayMask->SetValue(index, FLUID); + std::cout << i << " " << j << " set Fluid in 3\n"; + } } + // vertical else if (std::fmod(x, discretization_->meshWidth()[0]) == 0 && std::fmod(y, discretization_->meshWidth()[1]) != 0) { - int i_left = i / 2 - 1; - int j_left = (j - 1) / 2; - if (mask_->isObstacle(i_left, j_left) || mask_->isObstacle(i_left + 1, j_left)) + int i_left = i / 2; + int j_left = ((j - 1) / 2)+1; + if (mask_->isObstacle(i_left, j_left) || mask_->isObstacle(i_left + 1, j_left)){ arrayMask->SetValue(index, OBSTACLE); - else + std::cout << i << " " << j << " set obstacle in 4\n"; + } + else{ arrayMask->SetValue(index, FLUID); + std::cout << i << " " << j << " set Fluid in 4\n"; + } } else std::cout << "YOU stupid\n"; From 9ad540c3a442ce1afd40fa635c93992defd61c2b Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Sun, 4 Feb 2024 19:13:23 +0100 Subject: [PATCH 37/67] juhuuu --- src/output_writer/output_writer_paraview.cpp | 31 +++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/output_writer/output_writer_paraview.cpp b/src/output_writer/output_writer_paraview.cpp index 4148254a..fd3669df 100644 --- a/src/output_writer/output_writer_paraview.cpp +++ b/src/output_writer/output_writer_paraview.cpp @@ -70,7 +70,6 @@ void OutputWriterParaview::writeFile(double currentTime) int FLUID = 1; int index = 0; - for (int j = 0; j < n_cells_y; j++) { for (int i = 0; i < n_cells_x; i++, index++) @@ -78,64 +77,68 @@ void OutputWriterParaview::writeFile(double currentTime) const double x = i * dx; const double y = j * dy; + // vertex - if (std::fmod(x, discretization_->meshWidth()[0]) == 0 && std::fmod(y, discretization_->meshWidth()[1]) == 0) + if ((i%2) == 0 && (j%2) == 0) { + std::cout << i << " " << j << " as vertex\n"; int i_bottom_left = i / 2; int j_bootom_left = j / 2; if (mask_->isObstacle(i_bottom_left, j_bootom_left) || mask_->isObstacle(i_bottom_left + 1, j_bootom_left) || mask_->isObstacle(i_bottom_left, j_bootom_left + 1) || mask_->isObstacle(i_bottom_left + 1, j_bootom_left + 1)){ arrayMask->SetValue(index, OBSTACLE); - std::cout << i << " " << j << " set obstacle in 1\n"; + // std::cout << i << " " << j << " set obstacle in 1\n"; } else{ arrayMask->SetValue(index, FLUID); - std::cout << i << " " << j << " set Fluid in 1\n"; + // std::cout << i << " " << j << " set Fluid in 1\n"; } } // middle - else if (std::fmod(x, discretization_->meshWidth()[0]) != 0 && std::fmod(y, discretization_->meshWidth()[1]) != 0) + else if ( (i%2) != 0 && (j%2) != 0) { + std::cout << i << " " << j << " as middle\n"; int i_new = ((i - 1) / 2)+1; int j_new = ((j - 1) / 2)+1; if (mask_->isObstacle(i_new, j_new)){ arrayMask->SetValue(index, OBSTACLE); - std::cout << i << " " << j << " set obstacle in 2\n"; + // std::cout << i << " " << j << " set obstacle in 2\n"; } else{ arrayMask->SetValue(index, FLUID); - std::cout << i << " " << j << " set Fluid in 2\n"; + // std::cout << i << " " << j << " set Fluid in 2\n"; } } // horizontal - else if (std::fmod(x, discretization_->meshWidth()[0]) != 0 && std::fmod(y, discretization_->meshWidth()[1]) == 0) + else if ((i%2) != 0 && (j%2) == 0) { + std::cout << i << " " << j << " as horizontal\n"; int i_bottom = ((i - 1) / 2)+1; int j_bottom = j / 2; if (mask_->isObstacle(i_bottom, j_bottom) || mask_->isObstacle(i_bottom, j_bottom + 1)){ arrayMask->SetValue(index, OBSTACLE); - std::cout << i << " " << j << " set obstacle in 3\n"; + // std::cout << i << " " << j << " set obstacle in 3\n"; } else{ arrayMask->SetValue(index, FLUID); - std::cout << i << " " << j << " set Fluid in 3\n"; } } // vertical - else if (std::fmod(x, discretization_->meshWidth()[0]) == 0 && std::fmod(y, discretization_->meshWidth()[1]) != 0) + else if ((i%2) == 0 && (j%2) != 0) { + std::cout << i << " " << j << " as vertical\n"; int i_left = i / 2; int j_left = ((j - 1) / 2)+1; if (mask_->isObstacle(i_left, j_left) || mask_->isObstacle(i_left + 1, j_left)){ arrayMask->SetValue(index, OBSTACLE); - std::cout << i << " " << j << " set obstacle in 4\n"; + // std::cout << i << " " << j << " set obstacle in 4\n"; } else{ arrayMask->SetValue(index, FLUID); - std::cout << i << " " << j << " set Fluid in 4\n"; + // std::cout << i << " " << j << " set Fluid in 4\n"; } } else - std::cout << "YOU stupid\n"; + std::cout << i << " " << j << " Nothing done\n"; } } From 20f331fd6badd9b00879ad87cfbb7b0833504c0d Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Sun, 4 Feb 2024 19:53:02 +0100 Subject: [PATCH 38/67] fluidTracer seams to work AND doesnt destroy everything --- build.sh | 2 +- input/settings_debug.txt | 14 +++++++------- src/computation.cpp | 21 ++++++++++++++++++++- src/surface/fluid_tracer.cpp | 1 - tests/test_computation.cpp | 22 ++++++++++++++++++++++ 5 files changed, 50 insertions(+), 10 deletions(-) create mode 100644 tests/test_computation.cpp diff --git a/build.sh b/build.sh index f6976ced..9e289e28 100755 --- a/build.sh +++ b/build.sh @@ -17,7 +17,7 @@ fi make install -j4 -# ./numsim ../input/settings_debug.txt +./numsim ../input/settings_debug.txt diff --git a/input/settings_debug.txt b/input/settings_debug.txt index 23c6a77e..d2be2825 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -5,7 +5,7 @@ physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 endTime = 10.0 # duration of the simulation -re = 10000 # Reynolds number +re = 1000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity gY = 0.0 @@ -13,9 +13,9 @@ gY = 0.0 # Boundary Conditions Type BCTop = NoSlip -BCRight = Pressure +BCRight = NoSlip BCBottom = NoSlip -BCLeft = Pressure +BCLeft = NoSlip # NoSlip boundary conditions @@ -41,8 +41,8 @@ PressureLeft = 100.0 createRectangularObject = true -obstaclePositionX = 0.5 -obstaclePositionY = 0.5 +obstaclePositionX = 0.75 +obstaclePositionY = 0.75 obstacleDimensionX = 0.5 obstacleDimensionY = 0.5 @@ -52,8 +52,8 @@ createDomainfromBitmap = false pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/legal_water.png # Discretization parameters -nCellsX = 10 # number of cells in x and y direction -nCellsY = 10 +nCellsX = 20 # number of cells in x and y direction +nCellsY = 20 useDonorCell = true # if donor cell discretization should be used, possible values: true false alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences tau = 0.5 # safety factor for time step width diff --git a/src/computation.cpp b/src/computation.cpp index e72b05ec..eed75e75 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -1,6 +1,8 @@ #include "computation.h" #include "surface/fluid_tracer.h" +#include + void Computation::initialize(int argc, char *argv[]) { @@ -57,14 +59,31 @@ void Computation::initialize(int argc, char *argv[]) void Computation::runSimulation() { double currentTime = 0.; + + applyBoundaryValues(); do { - applyBoundaryValues(); + + // fluidTracer_->createParticles(0.1, 1.4); + fluidTracer_->createAndKillParticles(dt_); + + std::cout << "Particles: " << fluidTracer_->getNumberOfParticles() << std::endl; + mask_->printMask(); + usleep(100000); + std::cout << "\033[2J\033[1;1H"; + + computeTimeStepWidth(currentTime); computePreliminaryVelocities(); computeRightHandSide(); computePressure(); computeVelocities(); + + applyBoundaryValues(); + // fluidTracer_->moveParticles(dt_); + // applyBoundaryValues(); + + currentTime += dt_; outputWriterParaview_->writeFile(currentTime); diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index 4fcf5c90..81344f79 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -25,7 +25,6 @@ FluidTracer::FluidTracer(int numParticlesPerCell, seedRelationDyDx_ = discretization_->dy()/ discretization_->dx(); n_x = static_cast(std::ceil(std::sqrt(numParticlesPerCell/seedRelationDyDx_))); n_y = static_cast(std::ceil(n_x * seedRelationDyDx_)); - std::cout << "n_x " << n_x << " n_y " << n_y << std::endl; numParticlesPerCell_ = n_x * n_y; numParticles_ = numParticlesPerCell_ * mask_->getNumberOfFluidCells(); diff --git a/tests/test_computation.cpp b/tests/test_computation.cpp new file mode 100644 index 00000000..c5444efd --- /dev/null +++ b/tests/test_computation.cpp @@ -0,0 +1,22 @@ +#include +#include "../src/computation.h" + + +// TEST(Computation, Initialize){ +// Computation comp; +// char* argv[] = {"test", "../input/settings.txt"}; +// comp.initialize(2, argv); +// } + + +// std::cout << fluidTracer_->getNumberOfParticles() << std::endl; +// int particleInDomain = 0; +// int fluidCells = 0; +// for (int i = 0; i < fluidTracer_->getNumberOfParticles(); i++) +// { +// particleInDomain += fluidTracer_->getParticlePosition(i)[0] > 1.9 +// && fluidTracer_->getParticlePosition(i)[0] < settings_.physicalSize[0] +// && fluidTracer_->getParticlePosition(i)[1] > 0.0 +// && fluidTracer_->getParticlePosition(i)[1] < settings_.physicalSize[1]; +// } +// std::cout << particleInDomain << std::endl; \ No newline at end of file From 509e160057c2d2b2c5d9b27e3a7369db57c185c0 Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Sun, 4 Feb 2024 19:53:28 +0100 Subject: [PATCH 39/67] working mask in paraview --- input/settings_debug.txt | 8 ++++---- src/output_writer/output_writer_paraview.cpp | 17 ----------------- 2 files changed, 4 insertions(+), 21 deletions(-) diff --git a/input/settings_debug.txt b/input/settings_debug.txt index 2934e384..8f5dc42d 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -4,7 +4,7 @@ # Problem description physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 -endTime = 0.03 # duration of the simulation +endTime = 10.0 # duration of the simulation re = 1000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity gY = 0.0 @@ -13,9 +13,9 @@ gY = 0.0 # Boundary Conditions Type BCTop = NoSlip -BCRight = NoSlip +BCRight = Pressure BCBottom = NoSlip -BCLeft = NoSlip +BCLeft = Pressure # NoSlip boundary conditions @@ -48,7 +48,7 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap -createDomainfromBitmap = false +createDomainfromBitmap = true pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/aerodynamic_obstacle.png # Discretization parameters diff --git a/src/output_writer/output_writer_paraview.cpp b/src/output_writer/output_writer_paraview.cpp index fd3669df..37e6bb44 100644 --- a/src/output_writer/output_writer_paraview.cpp +++ b/src/output_writer/output_writer_paraview.cpp @@ -74,49 +74,37 @@ void OutputWriterParaview::writeFile(double currentTime) { for (int i = 0; i < n_cells_x; i++, index++) { - const double x = i * dx; - const double y = j * dy; - - // vertex if ((i%2) == 0 && (j%2) == 0) { - std::cout << i << " " << j << " as vertex\n"; int i_bottom_left = i / 2; int j_bootom_left = j / 2; if (mask_->isObstacle(i_bottom_left, j_bootom_left) || mask_->isObstacle(i_bottom_left + 1, j_bootom_left) || mask_->isObstacle(i_bottom_left, j_bootom_left + 1) || mask_->isObstacle(i_bottom_left + 1, j_bootom_left + 1)){ arrayMask->SetValue(index, OBSTACLE); - // std::cout << i << " " << j << " set obstacle in 1\n"; } else{ arrayMask->SetValue(index, FLUID); - // std::cout << i << " " << j << " set Fluid in 1\n"; } } // middle else if ( (i%2) != 0 && (j%2) != 0) { - std::cout << i << " " << j << " as middle\n"; int i_new = ((i - 1) / 2)+1; int j_new = ((j - 1) / 2)+1; if (mask_->isObstacle(i_new, j_new)){ arrayMask->SetValue(index, OBSTACLE); - // std::cout << i << " " << j << " set obstacle in 2\n"; } else{ arrayMask->SetValue(index, FLUID); - // std::cout << i << " " << j << " set Fluid in 2\n"; } } // horizontal else if ((i%2) != 0 && (j%2) == 0) { - std::cout << i << " " << j << " as horizontal\n"; int i_bottom = ((i - 1) / 2)+1; int j_bottom = j / 2; if (mask_->isObstacle(i_bottom, j_bottom) || mask_->isObstacle(i_bottom, j_bottom + 1)){ arrayMask->SetValue(index, OBSTACLE); - // std::cout << i << " " << j << " set obstacle in 3\n"; } else{ arrayMask->SetValue(index, FLUID); @@ -125,20 +113,15 @@ void OutputWriterParaview::writeFile(double currentTime) // vertical else if ((i%2) == 0 && (j%2) != 0) { - std::cout << i << " " << j << " as vertical\n"; int i_left = i / 2; int j_left = ((j - 1) / 2)+1; if (mask_->isObstacle(i_left, j_left) || mask_->isObstacle(i_left + 1, j_left)){ arrayMask->SetValue(index, OBSTACLE); - // std::cout << i << " " << j << " set obstacle in 4\n"; } else{ arrayMask->SetValue(index, FLUID); - // std::cout << i << " " << j << " set Fluid in 4\n"; } } - else - std::cout << i << " " << j << " Nothing done\n"; } } From 49dddec888b24e53f44ee8301a72d2b3f3b219c4 Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Sun, 4 Feb 2024 20:21:14 +0100 Subject: [PATCH 40/67] working again --- input/settings_debug.txt | 12 ++++++------ src/computation.cpp | 13 ++++++------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/input/settings_debug.txt b/input/settings_debug.txt index 11fe88d1..a2c69958 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -13,14 +13,14 @@ gY = 0.0 # Boundary Conditions Type BCTop = NoSlip -BCRight = NoSlip +BCRight = Pressure BCBottom = NoSlip -BCLeft = NoSlip +BCLeft = Pressure # NoSlip boundary conditions -NoSlipVelTopX = 1 +NoSlipVelTopX = 0 NoSlipVelTopY = 0 NoSlipVelRightX = 0 NoSlipVelRightY = 0 @@ -39,7 +39,7 @@ PressureLeft = 100.0 # Create Rectangular object in domain -createRectangularObject = true +createRectangularObject = false obstaclePositionX = 0.75 obstaclePositionY = 0.75 @@ -48,8 +48,8 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap -createDomainfromBitmap = false -pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/legal_water.png +createDomainfromBitmap = true +pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/aerodynamic_obstacle.png # Discretization parameters nCellsX = 20 # number of cells in x and y direction diff --git a/src/computation.cpp b/src/computation.cpp index 06418df8..65960859 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -33,8 +33,7 @@ void Computation::initialize(int argc, char *argv[]) discretization_ = std::make_shared(n_Cells, meshWidth_); } - // create boundary and tracer - mask_ = std::make_shared(settings_); + // create boundary and trace // TODO: read particles per cell from settings file fluidTracer_ = std::make_shared(100, discretization_, mask_); @@ -73,12 +72,12 @@ void Computation::runSimulation() { // fluidTracer_->createParticles(0.1, 1.4); - fluidTracer_->createAndKillParticles(dt_); + //fluidTracer_->createAndKillParticles(dt_); - std::cout << "Particles: " << fluidTracer_->getNumberOfParticles() << std::endl; - mask_->printMask(); - usleep(100000); - std::cout << "\033[2J\033[1;1H"; + // std::cout << "Particles: " << fluidTracer_->getNumberOfParticles() << std::endl; + // //mask_->printMask(); + // usleep(100000); + // std::cout << "\033[2J\033[1;1H"; computeTimeStepWidth(currentTime); From d3570e21071b695d7e276d41dbf04738d055df9d Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Sun, 4 Feb 2024 20:38:54 +0100 Subject: [PATCH 41/67] first iteration of implementing air into outputwriter --- input/settings_debug.txt | 2 +- src/output_writer/output_writer_paraview.cpp | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/input/settings_debug.txt b/input/settings_debug.txt index a2c69958..3e2dfa46 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -49,7 +49,7 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap createDomainfromBitmap = true -pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/aerodynamic_obstacle.png +pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/air_water_obstacle.png # Discretization parameters nCellsX = 20 # number of cells in x and y direction diff --git a/src/output_writer/output_writer_paraview.cpp b/src/output_writer/output_writer_paraview.cpp index 37e6bb44..edd84983 100644 --- a/src/output_writer/output_writer_paraview.cpp +++ b/src/output_writer/output_writer_paraview.cpp @@ -68,6 +68,7 @@ void OutputWriterParaview::writeFile(double currentTime) int OBSTACLE = 2; int FLUID = 1; + int AIR = 3; int index = 0; for (int j = 0; j < n_cells_y; j++) @@ -82,6 +83,9 @@ void OutputWriterParaview::writeFile(double currentTime) if (mask_->isObstacle(i_bottom_left, j_bootom_left) || mask_->isObstacle(i_bottom_left + 1, j_bootom_left) || mask_->isObstacle(i_bottom_left, j_bootom_left + 1) || mask_->isObstacle(i_bottom_left + 1, j_bootom_left + 1)){ arrayMask->SetValue(index, OBSTACLE); } + else if (mask_->isAir(i_bottom_left, j_bootom_left) && mask_->isAir(i_bottom_left + 1, j_bootom_left) && mask_->isAir(i_bottom_left, j_bootom_left + 1) && mask_->isAir(i_bottom_left + 1, j_bootom_left + 1)){ + arrayMask->SetValue(index, AIR); + } else{ arrayMask->SetValue(index, FLUID); } @@ -94,7 +98,9 @@ void OutputWriterParaview::writeFile(double currentTime) if (mask_->isObstacle(i_new, j_new)){ arrayMask->SetValue(index, OBSTACLE); } - else{ + else if (mask_->isAir(i_new, j_new)) { + arrayMask->SetValue(index, AIR); + } else { arrayMask->SetValue(index, FLUID); } } @@ -106,7 +112,9 @@ void OutputWriterParaview::writeFile(double currentTime) if (mask_->isObstacle(i_bottom, j_bottom) || mask_->isObstacle(i_bottom, j_bottom + 1)){ arrayMask->SetValue(index, OBSTACLE); } - else{ + else if (mask_->isAir(i_bottom, j_bottom) && mask_->isAir(i_bottom, j_bottom + 1)){ + arrayMask->SetValue(index, AIR); + } else { arrayMask->SetValue(index, FLUID); } } @@ -118,7 +126,9 @@ void OutputWriterParaview::writeFile(double currentTime) if (mask_->isObstacle(i_left, j_left) || mask_->isObstacle(i_left + 1, j_left)){ arrayMask->SetValue(index, OBSTACLE); } - else{ + else if (mask_->isAir(i_left, j_left) || mask_->isAir(i_left + 1, j_left)){ + arrayMask->SetValue(index, AIR); + } else { arrayMask->SetValue(index, FLUID); } } From 582490a003f635cfeb1682f45b4d010765742d90 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Sun, 4 Feb 2024 21:39:21 +0100 Subject: [PATCH 42/67] path and fluid tracker --- build.sh | 2 +- documentation/html/annotated.html | 105 + documentation/html/array2D_8h_source.html | 122 + documentation/html/bc_s.png | Bin 0 -> 676 bytes documentation/html/bc_sd.png | Bin 0 -> 635 bytes documentation/html/boundary_8h_source.html | 139 + .../html/central__differences_8h_source.html | 119 + documentation/html/classArray2D-members.html | 92 + documentation/html/classArray2D.html | 238 ++ documentation/html/classArray2D.png | Bin 0 -> 455 bytes documentation/html/classBoundary-members.html | 92 + documentation/html/classBoundary.html | 116 + .../html/classCentralDifferences-members.html | 148 + .../html/classCentralDifferences.html | 558 ++++ .../html/classCentralDifferences.png | Bin 0 -> 799 bytes .../html/classComputation-members.html | 88 + documentation/html/classComputation.html | 147 + .../html/classDiscretization-members.html | 147 + documentation/html/classDiscretization.html | 555 ++++ documentation/html/classDiscretization.png | Bin 0 -> 1039 bytes .../html/classDonorCell-members.html | 148 + documentation/html/classDonorCell.html | 565 ++++ documentation/html/classDonorCell.png | Bin 0 -> 690 bytes .../html/classFieldVariable-members.html | 95 + documentation/html/classFieldVariable.html | 250 ++ documentation/html/classFieldVariable.png | Bin 0 -> 454 bytes .../html/classFluidTracer-members.html | 97 + documentation/html/classFluidTracer.html | 233 ++ .../html/classGaussSeidel-members.html | 101 + documentation/html/classGaussSeidel.html | 253 ++ documentation/html/classGaussSeidel.png | Bin 0 -> 502 bytes documentation/html/classMask-members.html | 148 + documentation/html/classMask.html | 464 +++ .../html/classOutputWriter-members.html | 90 + documentation/html/classOutputWriter.html | 194 ++ documentation/html/classOutputWriter.png | Bin 0 -> 884 bytes .../classOutputWriterParaview-members.html | 91 + .../html/classOutputWriterParaview.html | 207 ++ .../html/classOutputWriterParaview.png | Bin 0 -> 611 bytes .../html/classOutputWriterText-members.html | 91 + documentation/html/classOutputWriterText.html | 195 ++ documentation/html/classOutputWriterText.png | Bin 0 -> 534 bytes .../html/classPressureSolver-members.html | 100 + documentation/html/classPressureSolver.html | 286 ++ documentation/html/classPressureSolver.png | Bin 0 -> 675 bytes documentation/html/classSOR-members.html | 101 + documentation/html/classSOR.html | 260 ++ documentation/html/classSOR.png | Bin 0 -> 441 bytes .../html/classStaggeredGrid-members.html | 136 + documentation/html/classStaggeredGrid.html | 354 +++ documentation/html/classStaggeredGrid.png | Bin 0 -> 1049 bytes documentation/html/classes.html | 119 + documentation/html/clipboard.js | 61 + documentation/html/closed.png | Bin 0 -> 132 bytes documentation/html/computation_8h_source.html | 158 + .../dir_041db6ad6a3d44280e40e5af409429cb.html | 97 + .../dir_2725064ac5d6db7b2425ad4e379e8748.html | 95 + .../dir_29398f723566cb24cda620b0fb0566c4.html | 93 + .../dir_452baf35e1d7639c9f2a5ece4ec85855.html | 95 + .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 110 + .../dir_93b0d6a552827721ec9247642283aaa7.html | 93 + .../dir_b0b9c4b8ebed4a07d44b9aa635c19fe7.html | 97 + .../dir_e7c1ed2d2d4c4bb5d8a9744d9e98c346.html | 99 + .../html/discretization_8h_source.html | 137 + documentation/html/doc.svg | 12 + documentation/html/docd.svg | 12 + documentation/html/donor__cell_8h_source.html | 123 + documentation/html/doxygen.css | 2080 ++++++++++++++ documentation/html/doxygen.svg | 28 + documentation/html/dynsections.js | 194 ++ .../html/field__variable_8h_source.html | 121 + documentation/html/files.html | 112 + .../html/fluid__tracer_8h_source.html | 160 ++ documentation/html/folderclosed.svg | 11 + documentation/html/folderclosedd.svg | 11 + documentation/html/folderopen.svg | 17 + documentation/html/folderopend.svg | 12 + documentation/html/functions.html | 288 ++ documentation/html/functions_func.html | 224 ++ documentation/html/functions_vars.html | 202 ++ .../html/gauss__seidel_8h_source.html | 113 + documentation/html/hierarchy.html | 105 + documentation/html/index.html | 83 + documentation/html/jquery.js | 91 + documentation/html/mask_8h_source.html | 228 ++ documentation/html/menu.js | 134 + documentation/html/menudata.js | 90 + documentation/html/minus.svg | 8 + documentation/html/minusd.svg | 8 + documentation/html/nav_f.png | Bin 0 -> 153 bytes documentation/html/nav_fd.png | Bin 0 -> 169 bytes documentation/html/nav_g.png | Bin 0 -> 95 bytes documentation/html/nav_h.png | Bin 0 -> 98 bytes documentation/html/nav_hd.png | Bin 0 -> 114 bytes documentation/html/open.png | Bin 0 -> 123 bytes .../html/output__writer_8h_source.html | 118 + .../output__writer__paraview_8h_source.html | 124 + .../html/output__writer__text_8h_source.html | 116 + documentation/html/plus.svg | 9 + documentation/html/plusd.svg | 9 + .../html/pressure__solver_8h_source.html | 148 + documentation/html/search/all_0.js | 5 + documentation/html/search/all_1.js | 6 + documentation/html/search/all_10.js | 4 + documentation/html/search/all_11.js | 10 + documentation/html/search/all_12.js | 10 + documentation/html/search/all_13.js | 5 + documentation/html/search/all_2.js | 19 + documentation/html/search/all_3.js | 10 + documentation/html/search/all_4.js | 6 + documentation/html/search/all_5.js | 13 + documentation/html/search/all_6.js | 13 + documentation/html/search/all_7.js | 11 + documentation/html/search/all_8.js | 5 + documentation/html/search/all_9.js | 5 + documentation/html/search/all_a.js | 10 + documentation/html/search/all_b.js | 9 + documentation/html/search/all_c.js | 10 + documentation/html/search/all_d.js | 18 + documentation/html/search/all_e.js | 13 + documentation/html/search/all_f.js | 11 + documentation/html/search/classes_0.js | 4 + documentation/html/search/classes_1.js | 4 + documentation/html/search/classes_2.js | 5 + documentation/html/search/classes_3.js | 5 + documentation/html/search/classes_4.js | 5 + documentation/html/search/classes_5.js | 4 + documentation/html/search/classes_6.js | 4 + documentation/html/search/classes_7.js | 4 + documentation/html/search/classes_8.js | 6 + documentation/html/search/classes_9.js | 4 + documentation/html/search/classes_a.js | 6 + documentation/html/search/close.svg | 18 + documentation/html/search/functions_0.js | 4 + documentation/html/search/functions_1.js | 16 + documentation/html/search/functions_2.js | 7 + documentation/html/search/functions_3.js | 10 + documentation/html/search/functions_4.js | 12 + documentation/html/search/functions_5.js | 8 + documentation/html/search/functions_6.js | 4 + documentation/html/search/functions_7.js | 6 + documentation/html/search/functions_8.js | 4 + documentation/html/search/functions_9.js | 6 + documentation/html/search/functions_a.js | 10 + documentation/html/search/functions_b.js | 11 + documentation/html/search/functions_c.js | 9 + documentation/html/search/functions_d.js | 8 + documentation/html/search/functions_e.js | 8 + documentation/html/search/functions_f.js | 5 + documentation/html/search/mag.svg | 24 + documentation/html/search/mag_d.svg | 24 + documentation/html/search/mag_sel.svg | 31 + documentation/html/search/mag_seld.svg | 31 + documentation/html/search/search.css | 291 ++ documentation/html/search/search.js | 694 +++++ documentation/html/search/searchdata.js | 24 + documentation/html/search/variables_0.js | 4 + documentation/html/search/variables_1.js | 5 + documentation/html/search/variables_10.js | 5 + documentation/html/search/variables_11.js | 5 + documentation/html/search/variables_2.js | 5 + documentation/html/search/variables_3.js | 6 + documentation/html/search/variables_4.js | 6 + documentation/html/search/variables_5.js | 5 + documentation/html/search/variables_6.js | 5 + documentation/html/search/variables_7.js | 6 + documentation/html/search/variables_8.js | 5 + documentation/html/search/variables_9.js | 7 + documentation/html/search/variables_a.js | 9 + documentation/html/search/variables_b.js | 6 + documentation/html/search/variables_c.js | 12 + documentation/html/search/variables_d.js | 5 + documentation/html/search/variables_e.js | 4 + documentation/html/search/variables_f.js | 4 + documentation/html/settings_8h_source.html | 202 ++ documentation/html/sor_8h_source.html | 117 + documentation/html/splitbar.png | Bin 0 -> 314 bytes documentation/html/splitbard.png | Bin 0 -> 282 bytes .../html/staggered__grid_8h_source.html | 219 ++ .../html/structSettings-members.html | 120 + documentation/html/structSettings.html | 326 +++ ...structSettings_1_1LineContent-members.html | 93 + .../html/structSettings_1_1LineContent.html | 116 + documentation/html/sync_off.png | Bin 0 -> 853 bytes documentation/html/sync_on.png | Bin 0 -> 845 bytes documentation/html/tab_a.png | Bin 0 -> 142 bytes documentation/html/tab_ad.png | Bin 0 -> 135 bytes documentation/html/tab_b.png | Bin 0 -> 169 bytes documentation/html/tab_bd.png | Bin 0 -> 173 bytes documentation/html/tab_h.png | Bin 0 -> 177 bytes documentation/html/tab_hd.png | Bin 0 -> 180 bytes documentation/html/tab_s.png | Bin 0 -> 184 bytes documentation/html/tab_sd.png | Bin 0 -> 188 bytes documentation/html/tabs.css | 1 + documentation/latex/Makefile | 27 + documentation/latex/annotated.tex | 21 + documentation/latex/array2D_8h_source.tex | 52 + documentation/latex/boundary_8h_source.tex | 49 + .../latex/central__differences_8h_source.tex | 45 + documentation/latex/classArray2D.eps | 197 ++ documentation/latex/classArray2D.pdf | Bin 0 -> 4942 bytes documentation/latex/classArray2D.tex | 104 + documentation/latex/classBoundary.tex | 32 + .../latex/classCentralDifferences.eps | 203 ++ .../latex/classCentralDifferences.pdf | Bin 0 -> 5704 bytes .../latex/classCentralDifferences.tex | 244 ++ documentation/latex/classComputation.tex | 50 + documentation/latex/classDiscretization.eps | 209 ++ documentation/latex/classDiscretization.pdf | Bin 0 -> 5766 bytes documentation/latex/classDiscretization.tex | 245 ++ documentation/latex/classDonorCell.eps | 203 ++ documentation/latex/classDonorCell.pdf | Bin 0 -> 5600 bytes documentation/latex/classDonorCell.tex | 246 ++ documentation/latex/classFieldVariable.eps | 197 ++ documentation/latex/classFieldVariable.pdf | Bin 0 -> 4939 bytes documentation/latex/classFieldVariable.tex | 110 + documentation/latex/classFluidTracer.tex | 101 + documentation/latex/classGaussSeidel.eps | 197 ++ documentation/latex/classGaussSeidel.pdf | Bin 0 -> 5020 bytes documentation/latex/classGaussSeidel.tex | 111 + documentation/latex/classMask.tex | 248 ++ documentation/latex/classOutputWriter.eps | 203 ++ documentation/latex/classOutputWriter.pdf | Bin 0 -> 5206 bytes documentation/latex/classOutputWriter.tex | 84 + .../latex/classOutputWriterParaview.eps | 197 ++ .../latex/classOutputWriterParaview.pdf | Bin 0 -> 4909 bytes .../latex/classOutputWriterParaview.tex | 88 + documentation/latex/classOutputWriterText.eps | 197 ++ documentation/latex/classOutputWriterText.pdf | Bin 0 -> 4610 bytes documentation/latex/classOutputWriterText.tex | 85 + documentation/latex/classPressureSolver.eps | 203 ++ documentation/latex/classPressureSolver.pdf | Bin 0 -> 5338 bytes documentation/latex/classPressureSolver.tex | 130 + documentation/latex/classSOR.eps | 197 ++ documentation/latex/classSOR.pdf | Bin 0 -> 4725 bytes documentation/latex/classSOR.tex | 113 + documentation/latex/classStaggeredGrid.eps | 209 ++ documentation/latex/classStaggeredGrid.pdf | Bin 0 -> 5761 bytes documentation/latex/classStaggeredGrid.tex | 203 ++ documentation/latex/computation_8h_source.tex | 94 + .../latex/discretization_8h_source.tex | 66 + documentation/latex/donor__cell_8h_source.tex | 50 + documentation/latex/doxygen.sty | 694 +++++ documentation/latex/etoc_doxygen.sty | 2178 ++++++++++++++ .../latex/field__variable_8h_source.tex | 51 + documentation/latex/files.tex | 20 + .../latex/fluid__tracer_8h_source.tex | 95 + .../latex/gauss__seidel_8h_source.tex | 34 + documentation/latex/hierarchy.tex | 31 + documentation/latex/longtable_doxygen.sty | 456 +++ documentation/latex/mask_8h_source.tex | 172 ++ .../latex/output__writer_8h_source.tex | 38 + .../output__writer__paraview_8h_source.tex | 47 + .../latex/output__writer__text_8h_source.tex | 41 + .../latex/pressure__solver_8h_source.tex | 70 + documentation/latex/refman.tex | 262 ++ documentation/latex/settings_8h_source.tex | 98 + documentation/latex/sor_8h_source.tex | 39 + .../latex/staggered__grid_8h_source.tex | 180 ++ documentation/latex/structSettings.tex | 175 ++ .../latex/structSettings_1_1LineContent.tex | 31 + documentation/latex/tabu_doxygen.sty | 2557 +++++++++++++++++ input/settings_debug.txt | 10 +- src/computation.cpp | 10 +- 264 files changed, 28467 insertions(+), 11 deletions(-) create mode 100644 documentation/html/annotated.html create mode 100644 documentation/html/array2D_8h_source.html create mode 100644 documentation/html/bc_s.png create mode 100644 documentation/html/bc_sd.png create mode 100644 documentation/html/boundary_8h_source.html create mode 100644 documentation/html/central__differences_8h_source.html create mode 100644 documentation/html/classArray2D-members.html create mode 100644 documentation/html/classArray2D.html create mode 100644 documentation/html/classArray2D.png create mode 100644 documentation/html/classBoundary-members.html create mode 100644 documentation/html/classBoundary.html create mode 100644 documentation/html/classCentralDifferences-members.html create mode 100644 documentation/html/classCentralDifferences.html create mode 100644 documentation/html/classCentralDifferences.png create mode 100644 documentation/html/classComputation-members.html create mode 100644 documentation/html/classComputation.html create mode 100644 documentation/html/classDiscretization-members.html create mode 100644 documentation/html/classDiscretization.html create mode 100644 documentation/html/classDiscretization.png create mode 100644 documentation/html/classDonorCell-members.html create mode 100644 documentation/html/classDonorCell.html create mode 100644 documentation/html/classDonorCell.png create mode 100644 documentation/html/classFieldVariable-members.html create mode 100644 documentation/html/classFieldVariable.html create mode 100644 documentation/html/classFieldVariable.png create mode 100644 documentation/html/classFluidTracer-members.html create mode 100644 documentation/html/classFluidTracer.html create mode 100644 documentation/html/classGaussSeidel-members.html create mode 100644 documentation/html/classGaussSeidel.html create mode 100644 documentation/html/classGaussSeidel.png create mode 100644 documentation/html/classMask-members.html create mode 100644 documentation/html/classMask.html create mode 100644 documentation/html/classOutputWriter-members.html create mode 100644 documentation/html/classOutputWriter.html create mode 100644 documentation/html/classOutputWriter.png create mode 100644 documentation/html/classOutputWriterParaview-members.html create mode 100644 documentation/html/classOutputWriterParaview.html create mode 100644 documentation/html/classOutputWriterParaview.png create mode 100644 documentation/html/classOutputWriterText-members.html create mode 100644 documentation/html/classOutputWriterText.html create mode 100644 documentation/html/classOutputWriterText.png create mode 100644 documentation/html/classPressureSolver-members.html create mode 100644 documentation/html/classPressureSolver.html create mode 100644 documentation/html/classPressureSolver.png create mode 100644 documentation/html/classSOR-members.html create mode 100644 documentation/html/classSOR.html create mode 100644 documentation/html/classSOR.png create mode 100644 documentation/html/classStaggeredGrid-members.html create mode 100644 documentation/html/classStaggeredGrid.html create mode 100644 documentation/html/classStaggeredGrid.png create mode 100644 documentation/html/classes.html create mode 100644 documentation/html/clipboard.js create mode 100644 documentation/html/closed.png create mode 100644 documentation/html/computation_8h_source.html create mode 100644 documentation/html/dir_041db6ad6a3d44280e40e5af409429cb.html create mode 100644 documentation/html/dir_2725064ac5d6db7b2425ad4e379e8748.html create mode 100644 documentation/html/dir_29398f723566cb24cda620b0fb0566c4.html create mode 100644 documentation/html/dir_452baf35e1d7639c9f2a5ece4ec85855.html create mode 100644 documentation/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html create mode 100644 documentation/html/dir_93b0d6a552827721ec9247642283aaa7.html create mode 100644 documentation/html/dir_b0b9c4b8ebed4a07d44b9aa635c19fe7.html create mode 100644 documentation/html/dir_e7c1ed2d2d4c4bb5d8a9744d9e98c346.html create mode 100644 documentation/html/discretization_8h_source.html create mode 100644 documentation/html/doc.svg create mode 100644 documentation/html/docd.svg create mode 100644 documentation/html/donor__cell_8h_source.html create mode 100644 documentation/html/doxygen.css create mode 100644 documentation/html/doxygen.svg create mode 100644 documentation/html/dynsections.js create mode 100644 documentation/html/field__variable_8h_source.html create mode 100644 documentation/html/files.html create mode 100644 documentation/html/fluid__tracer_8h_source.html create mode 100644 documentation/html/folderclosed.svg create mode 100644 documentation/html/folderclosedd.svg create mode 100644 documentation/html/folderopen.svg create mode 100644 documentation/html/folderopend.svg create mode 100644 documentation/html/functions.html create mode 100644 documentation/html/functions_func.html create mode 100644 documentation/html/functions_vars.html create mode 100644 documentation/html/gauss__seidel_8h_source.html create mode 100644 documentation/html/hierarchy.html create mode 100644 documentation/html/index.html create mode 100644 documentation/html/jquery.js create mode 100644 documentation/html/mask_8h_source.html create mode 100644 documentation/html/menu.js create mode 100644 documentation/html/menudata.js create mode 100644 documentation/html/minus.svg create mode 100644 documentation/html/minusd.svg create mode 100644 documentation/html/nav_f.png create mode 100644 documentation/html/nav_fd.png create mode 100644 documentation/html/nav_g.png create mode 100644 documentation/html/nav_h.png create mode 100644 documentation/html/nav_hd.png create mode 100644 documentation/html/open.png create mode 100644 documentation/html/output__writer_8h_source.html create mode 100644 documentation/html/output__writer__paraview_8h_source.html create mode 100644 documentation/html/output__writer__text_8h_source.html create mode 100644 documentation/html/plus.svg create mode 100644 documentation/html/plusd.svg create mode 100644 documentation/html/pressure__solver_8h_source.html create mode 100644 documentation/html/search/all_0.js create mode 100644 documentation/html/search/all_1.js create mode 100644 documentation/html/search/all_10.js create mode 100644 documentation/html/search/all_11.js create mode 100644 documentation/html/search/all_12.js create mode 100644 documentation/html/search/all_13.js create mode 100644 documentation/html/search/all_2.js create mode 100644 documentation/html/search/all_3.js create mode 100644 documentation/html/search/all_4.js create mode 100644 documentation/html/search/all_5.js create mode 100644 documentation/html/search/all_6.js create mode 100644 documentation/html/search/all_7.js create mode 100644 documentation/html/search/all_8.js create mode 100644 documentation/html/search/all_9.js create mode 100644 documentation/html/search/all_a.js create mode 100644 documentation/html/search/all_b.js create mode 100644 documentation/html/search/all_c.js create mode 100644 documentation/html/search/all_d.js create mode 100644 documentation/html/search/all_e.js create mode 100644 documentation/html/search/all_f.js create mode 100644 documentation/html/search/classes_0.js create mode 100644 documentation/html/search/classes_1.js create mode 100644 documentation/html/search/classes_2.js create mode 100644 documentation/html/search/classes_3.js create mode 100644 documentation/html/search/classes_4.js create mode 100644 documentation/html/search/classes_5.js create mode 100644 documentation/html/search/classes_6.js create mode 100644 documentation/html/search/classes_7.js create mode 100644 documentation/html/search/classes_8.js create mode 100644 documentation/html/search/classes_9.js create mode 100644 documentation/html/search/classes_a.js create mode 100644 documentation/html/search/close.svg create mode 100644 documentation/html/search/functions_0.js create mode 100644 documentation/html/search/functions_1.js create mode 100644 documentation/html/search/functions_2.js create mode 100644 documentation/html/search/functions_3.js create mode 100644 documentation/html/search/functions_4.js create mode 100644 documentation/html/search/functions_5.js create mode 100644 documentation/html/search/functions_6.js create mode 100644 documentation/html/search/functions_7.js create mode 100644 documentation/html/search/functions_8.js create mode 100644 documentation/html/search/functions_9.js create mode 100644 documentation/html/search/functions_a.js create mode 100644 documentation/html/search/functions_b.js create mode 100644 documentation/html/search/functions_c.js create mode 100644 documentation/html/search/functions_d.js create mode 100644 documentation/html/search/functions_e.js create mode 100644 documentation/html/search/functions_f.js create mode 100644 documentation/html/search/mag.svg create mode 100644 documentation/html/search/mag_d.svg create mode 100644 documentation/html/search/mag_sel.svg create mode 100644 documentation/html/search/mag_seld.svg create mode 100644 documentation/html/search/search.css create mode 100644 documentation/html/search/search.js create mode 100644 documentation/html/search/searchdata.js create mode 100644 documentation/html/search/variables_0.js create mode 100644 documentation/html/search/variables_1.js create mode 100644 documentation/html/search/variables_10.js create mode 100644 documentation/html/search/variables_11.js create mode 100644 documentation/html/search/variables_2.js create mode 100644 documentation/html/search/variables_3.js create mode 100644 documentation/html/search/variables_4.js create mode 100644 documentation/html/search/variables_5.js create mode 100644 documentation/html/search/variables_6.js create mode 100644 documentation/html/search/variables_7.js create mode 100644 documentation/html/search/variables_8.js create mode 100644 documentation/html/search/variables_9.js create mode 100644 documentation/html/search/variables_a.js create mode 100644 documentation/html/search/variables_b.js create mode 100644 documentation/html/search/variables_c.js create mode 100644 documentation/html/search/variables_d.js create mode 100644 documentation/html/search/variables_e.js create mode 100644 documentation/html/search/variables_f.js create mode 100644 documentation/html/settings_8h_source.html create mode 100644 documentation/html/sor_8h_source.html create mode 100644 documentation/html/splitbar.png create mode 100644 documentation/html/splitbard.png create mode 100644 documentation/html/staggered__grid_8h_source.html create mode 100644 documentation/html/structSettings-members.html create mode 100644 documentation/html/structSettings.html create mode 100644 documentation/html/structSettings_1_1LineContent-members.html create mode 100644 documentation/html/structSettings_1_1LineContent.html create mode 100644 documentation/html/sync_off.png create mode 100644 documentation/html/sync_on.png create mode 100644 documentation/html/tab_a.png create mode 100644 documentation/html/tab_ad.png create mode 100644 documentation/html/tab_b.png create mode 100644 documentation/html/tab_bd.png create mode 100644 documentation/html/tab_h.png create mode 100644 documentation/html/tab_hd.png create mode 100644 documentation/html/tab_s.png create mode 100644 documentation/html/tab_sd.png create mode 100644 documentation/html/tabs.css create mode 100644 documentation/latex/Makefile create mode 100644 documentation/latex/annotated.tex create mode 100644 documentation/latex/array2D_8h_source.tex create mode 100644 documentation/latex/boundary_8h_source.tex create mode 100644 documentation/latex/central__differences_8h_source.tex create mode 100644 documentation/latex/classArray2D.eps create mode 100644 documentation/latex/classArray2D.pdf create mode 100644 documentation/latex/classArray2D.tex create mode 100644 documentation/latex/classBoundary.tex create mode 100644 documentation/latex/classCentralDifferences.eps create mode 100644 documentation/latex/classCentralDifferences.pdf create mode 100644 documentation/latex/classCentralDifferences.tex create mode 100644 documentation/latex/classComputation.tex create mode 100644 documentation/latex/classDiscretization.eps create mode 100644 documentation/latex/classDiscretization.pdf create mode 100644 documentation/latex/classDiscretization.tex create mode 100644 documentation/latex/classDonorCell.eps create mode 100644 documentation/latex/classDonorCell.pdf create mode 100644 documentation/latex/classDonorCell.tex create mode 100644 documentation/latex/classFieldVariable.eps create mode 100644 documentation/latex/classFieldVariable.pdf create mode 100644 documentation/latex/classFieldVariable.tex create mode 100644 documentation/latex/classFluidTracer.tex create mode 100644 documentation/latex/classGaussSeidel.eps create mode 100644 documentation/latex/classGaussSeidel.pdf create mode 100644 documentation/latex/classGaussSeidel.tex create mode 100644 documentation/latex/classMask.tex create mode 100644 documentation/latex/classOutputWriter.eps create mode 100644 documentation/latex/classOutputWriter.pdf create mode 100644 documentation/latex/classOutputWriter.tex create mode 100644 documentation/latex/classOutputWriterParaview.eps create mode 100644 documentation/latex/classOutputWriterParaview.pdf create mode 100644 documentation/latex/classOutputWriterParaview.tex create mode 100644 documentation/latex/classOutputWriterText.eps create mode 100644 documentation/latex/classOutputWriterText.pdf create mode 100644 documentation/latex/classOutputWriterText.tex create mode 100644 documentation/latex/classPressureSolver.eps create mode 100644 documentation/latex/classPressureSolver.pdf create mode 100644 documentation/latex/classPressureSolver.tex create mode 100644 documentation/latex/classSOR.eps create mode 100644 documentation/latex/classSOR.pdf create mode 100644 documentation/latex/classSOR.tex create mode 100644 documentation/latex/classStaggeredGrid.eps create mode 100644 documentation/latex/classStaggeredGrid.pdf create mode 100644 documentation/latex/classStaggeredGrid.tex create mode 100644 documentation/latex/computation_8h_source.tex create mode 100644 documentation/latex/discretization_8h_source.tex create mode 100644 documentation/latex/donor__cell_8h_source.tex create mode 100644 documentation/latex/doxygen.sty create mode 100644 documentation/latex/etoc_doxygen.sty create mode 100644 documentation/latex/field__variable_8h_source.tex create mode 100644 documentation/latex/files.tex create mode 100644 documentation/latex/fluid__tracer_8h_source.tex create mode 100644 documentation/latex/gauss__seidel_8h_source.tex create mode 100644 documentation/latex/hierarchy.tex create mode 100644 documentation/latex/longtable_doxygen.sty create mode 100644 documentation/latex/mask_8h_source.tex create mode 100644 documentation/latex/output__writer_8h_source.tex create mode 100644 documentation/latex/output__writer__paraview_8h_source.tex create mode 100644 documentation/latex/output__writer__text_8h_source.tex create mode 100644 documentation/latex/pressure__solver_8h_source.tex create mode 100644 documentation/latex/refman.tex create mode 100644 documentation/latex/settings_8h_source.tex create mode 100644 documentation/latex/sor_8h_source.tex create mode 100644 documentation/latex/staggered__grid_8h_source.tex create mode 100644 documentation/latex/structSettings.tex create mode 100644 documentation/latex/structSettings_1_1LineContent.tex create mode 100644 documentation/latex/tabu_doxygen.sty diff --git a/build.sh b/build.sh index 9e289e28..20a2ddf2 100755 --- a/build.sh +++ b/build.sh @@ -36,6 +36,6 @@ cd .. # cd .. # run tests -build/tests/run_tests +# build/tests/run_tests # zip -r submission.zip src/ CMakeLists.txt \ No newline at end of file diff --git a/documentation/html/annotated.html b/documentation/html/annotated.html new file mode 100644 index 00000000..07ee10af --- /dev/null +++ b/documentation/html/annotated.html @@ -0,0 +1,105 @@ + + + + + + + +NumSim: Class List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class List
+
+
+
Here are the classes, structs, unions and interfaces with brief descriptions:
+
[detail level 12]
+ + + + + + + + + + + + + + + + + + +
 CArray2DThis class represents a 2D array of double values
 CBoundary
 CCentralDifferencesDiscretizes the problem using the central differences scheme
 CComputationComputation of Simulation
 CDiscretizationComputes derivatives included in governing equations
 CDonorCellDiscretizes the problem using the donor cell scheme
 CFieldVariableDiscretization of a scalar function
 CFluidTracer
 CGaussSeidelStandard Gauss-Seidel solver
 CMask
 COutputWriterInteface class for writing simulation data output
 COutputWriterParaviewWrite *.vti files that can be viewed with ParaView
 COutputWriterTextWrite *.txt files that are useful for debugging
 CPressureSolverSolves the Poisson problem for the pressure
 CSettingsAll settings that parametrize a simulation run
 CLineContentContains the content of a single line in a file
 CSORSuccessive over-relaxation solver
 CStaggeredGridCreate field variables and define limits for the indices
+
+
+ +
+ + diff --git a/documentation/html/array2D_8h_source.html b/documentation/html/array2D_8h_source.html new file mode 100644 index 00000000..6ef5be35 --- /dev/null +++ b/documentation/html/array2D_8h_source.html @@ -0,0 +1,122 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/storage/array2D.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
array2D.h
+
+
+
1#pragma once
+
2
+
3#include <vector>
+
4#include <array>
+
5#include <cassert>
+
6
+
7
+
+ +
16{
+
17public:
+
23 Array2D(std::array<int, 2> size);
+
24
+
32 double &operator()(int i, int j);
+
33
+
41 double operator()(int i, int j) const;
+
42
+
46 std::array<int, 2> size() const;
+
47
+
48protected:
+
49 const std::array<int, 2> size_;
+
50 std::vector<double> data_;
+
51};
+
+
This class represents a 2D array of double values.
Definition array2D.h:16
+
Array2D(std::array< int, 2 > size)
constructor.
Definition array2D.cpp:3
+
const std::array< int, 2 > size_
size of array in x and y direction
Definition array2D.h:49
+
double & operator()(int i, int j)
set array value. Overloads the () operator
Definition array2D.cpp:9
+
std::array< int, 2 > size() const
get size of array in x and y direction
Definition array2D.cpp:33
+
std::vector< double > data_
storage array values, in row-major order
Definition array2D.h:50
+
+ + + + diff --git a/documentation/html/bc_s.png b/documentation/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/documentation/html/bc_sd.png b/documentation/html/bc_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..31ca888dc71049713b35c351933a8d0f36180bf1 GIT binary patch literal 635 zcmV->0)+jEP)Jwi0r1~gdSq#w{Bu1q z`craw(p2!hu$4C_$Oc3X(sI6e=9QSTwPt{G) z=htT&^~&c~L2~e{r5_5SYe7#Is-$ln>~Kd%$F#tC65?{LvQ}8O`A~RBB0N~`2M+waajO;5>3B&-viHGJeEK2TQOiPRa zfDKyqwMc4wfaEh4jt>H`nW_Zidwk@Bowp`}(VUaj-pSI(-1L>FJVsX}Yl9~JsqgsZ zUD9(rMwf23Gez6KPa|wwInZodP-2}9@fK0Ga_9{8SOjU&4l`pH4@qlQp83>>HT$xW zER^U>)MyV%t(Lu=`d=Y?{k1@}&r7ZGkFQ%z%N+sE9BtYjovzxyxCPxN6&@wLK{soQ zSmkj$aLI}miuE^p@~4}mg9OjDfGEkgY4~^XzLRUBB*O{+&vq<3v(E%+k_i%=`~j%{ Vj14gnt9}3g002ovPDHLkV1n!oC4m3{ literal 0 HcmV?d00001 diff --git a/documentation/html/boundary_8h_source.html b/documentation/html/boundary_8h_source.html new file mode 100644 index 00000000..b64504fc --- /dev/null +++ b/documentation/html/boundary_8h_source.html @@ -0,0 +1,139 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/boundary/boundary.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
boundary.h
+
+
+
1#pragma once
+
2
+
3#include "mask.h"
+
4#include "../discretization/discretization.h"
+
5#include "../settings_parser/settings.h"
+
6#include <vector>
+
7#include <memory>
+
8
+
+ +
10{
+
11 public:
+
12 Boundary(std::shared_ptr<Mask> mask, std::shared_ptr<Discretization> discretization, Settings settings);
+
13 void setPressureBoundaryValues();
+
14 void setVelocityBoundaryValues();
+
15 std::shared_ptr<Mask> mask_;
+
16
+
17
+
18 bool doCalculateF(int i, int j) const;
+
19 bool doCalculateG(int i, int j) const;
+
20
+
21 private:
+
22 void createBoundaryCellsLists();
+
23
+
24 // Set Pressure
+
25 void setPressureDomainBC();
+
26 void setPressureObstacleBC();
+
27 void setPressureSurfaceBC();
+
28
+
29
+
30 // Set Velocity
+
31 void setVelocityDomainBC();
+
32 void setVelocityObstacleBC();
+
33 void setVelocitySurfaceBC();
+
34
+
35
+
36 std::shared_ptr<Discretization> discretization_;
+
37 Settings settings_;
+
38
+
39 std::vector<int> DomainBoundaryCells_;
+
40 std::vector<int> ObstacleBoundaryCells_;
+
41 std::vector<int> FluidBoundaryCells_;
+
42
+
43};
+
+
Definition boundary.h:10
+
All settings that parametrize a simulation run.
Definition settings.h:14
+
+ + + + diff --git a/documentation/html/central__differences_8h_source.html b/documentation/html/central__differences_8h_source.html new file mode 100644 index 00000000..ef22486b --- /dev/null +++ b/documentation/html/central__differences_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/central_differences.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
central_differences.h
+
+
+
1#pragma once
+
2
+
3#include <array>
+
4#include <vector>
+
5#include "discretization.h"
+
6
+
+ +
15{
+
16public:
+
23 CentralDifferences(std::array<int, 2> nCells, std::array<double, 2> meshWidth);
+
24
+
29 double computeDu2Dx(int i, int j) const override;
+
34 double computeDv2Dy(int i, int j) const override;
+
39 double computeDuvDx(int i, int j) const override;
+
44 double computeDuvDy(int i, int j) const override;
+
45};
+
+
Discretizes the problem using the central differences scheme.
Definition central_differences.h:15
+
double computeDuvDy(int i, int j) const override
Calculate first derivative of u*v with respect to y with the central differences Scheme.
Definition central_differences.cpp:32
+
double computeDv2Dy(int i, int j) const override
Calculate first derivative of v^2 with respect to y with the central differences Scheme.
Definition central_differences.cpp:14
+
double computeDuvDx(int i, int j) const override
Calculate first derivative of u*v with respect to x with the central differences Scheme.
Definition central_differences.cpp:21
+
CentralDifferences(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
Constructor.
Definition central_differences.cpp:3
+
double computeDu2Dx(int i, int j) const override
Calculate first derivative of u^2 with respect to x with the central differences Scheme.
Definition central_differences.cpp:7
+
Computes derivatives included in governing equations.
Definition discretization.h:16
+
const std::array< double, 2 > meshWidth() const
Get the length of a single cell in x and y directions.
Definition staggered_grid.cpp:14
+
const std::array< int, 2 > nCells() const
Get number of cells in x and y directions.
Definition staggered_grid.cpp:19
+
+ + + + diff --git a/documentation/html/classArray2D-members.html b/documentation/html/classArray2D-members.html new file mode 100644 index 00000000..b1ed0030 --- /dev/null +++ b/documentation/html/classArray2D-members.html @@ -0,0 +1,92 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Array2D Member List
+
+
+ +

This is the complete list of members for Array2D, including all inherited members.

+ + + + + + + +
Array2D(std::array< int, 2 > size)Array2D
data_Array2Dprotected
operator()(int i, int j)Array2D
operator()(int i, int j) constArray2D
size() constArray2D
size_Array2Dprotected
+ + + + diff --git a/documentation/html/classArray2D.html b/documentation/html/classArray2D.html new file mode 100644 index 00000000..614b3f4f --- /dev/null +++ b/documentation/html/classArray2D.html @@ -0,0 +1,238 @@ + + + + + + + +NumSim: Array2D Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
+ +

This class represents a 2D array of double values. + More...

+ +

#include <array2D.h>

+
+Inheritance diagram for Array2D:
+
+
+ + +FieldVariable + +
+ + + + + + + + + + + + + + +

+Public Member Functions

 Array2D (std::array< int, 2 > size)
 constructor.
 
double & operator() (int i, int j)
 set array value. Overloads the () operator
 
double operator() (int i, int j) const
 get array value. Overloads the () operator
 
+std::array< int, 2 > size () const
 get size of array in x and y direction
 
+ + + + + + + +

+Protected Attributes

+const std::array< int, 2 > size_
 size of array in x and y direction
 
+std::vector< double > data_
 storage array values, in row-major order
 
+

Detailed Description

+

This class represents a 2D array of double values.

+

Internally they are stored consecutively in memory. The entries can be accessed by two indices i,j.

+

Constructor & Destructor Documentation

+ +

◆ Array2D()

+ +
+
+ + + + + + + + +
Array2D::Array2D (std::array< int, 2 > size)
+
+ +

constructor.

+
Parameters
+ + +
sizesize of array in x and y direction
+
+
+ +
+
+

Member Function Documentation

+ +

◆ operator()() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
double & Array2D::operator() (int i,
int j 
)
+
+ +

set array value. Overloads the () operator

+
Parameters
+ + + +
iindex in x direction
jindex in y direction
+
+
+ +
+
+ +

◆ operator()() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
double Array2D::operator() (int i,
int j 
) const
+
+ +

get array value. Overloads the () operator

+
Parameters
+ + + +
iindex in x direction
jindex in y direction
+
+
+ +
+
+
The documentation for this class was generated from the following files:
    +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/storage/array2D.h
  • +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/storage/array2D.cpp
  • +
+
+ + + + diff --git a/documentation/html/classArray2D.png b/documentation/html/classArray2D.png new file mode 100644 index 0000000000000000000000000000000000000000..c9e0e4f3fd8ffc5a396c96d152a76113e65387ee GIT binary patch literal 455 zcmV;&0XY7NP)vTJr#LVva2S`&=)l0h|Ns9}lGCUF000SeQchC<|NsC0|NsC0Hv*f~0003} zNkl3lJRwZB0`v_l|O)%RuKKLkI# z@4R;3x?WYa(H)q^WJe8ezX3deUGE#8V4|HV6Qw zbpXH)?E)XiCh{)u$=yTV2L8aRFtC9Eppk(M3;?wZY+wMWW#In;77>}%AtEv<2s88h zGVm{g$$ic~ZG}-<%R9|92X?{C%#|L%y}%LpyLYLFk?&%F-#N!&Jp>l-)xH&=hgi9Wmh0y_zJswp> xK80T>i@<#cRl&^srVMOgX69Nu!6G6X^aayqN|$%m@09=m002ovPDHLkV1h~+$&>&9 literal 0 HcmV?d00001 diff --git a/documentation/html/classBoundary-members.html b/documentation/html/classBoundary-members.html new file mode 100644 index 00000000..6b5ee1fb --- /dev/null +++ b/documentation/html/classBoundary-members.html @@ -0,0 +1,92 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Boundary Member List
+
+
+ +

This is the complete list of members for Boundary, including all inherited members.

+ + + + + + + +
Boundary(std::shared_ptr< Mask > mask, std::shared_ptr< Discretization > discretization, Settings settings) (defined in Boundary)Boundary
doCalculateF(int i, int j) const (defined in Boundary)Boundary
doCalculateG(int i, int j) const (defined in Boundary)Boundary
mask_ (defined in Boundary)Boundary
setPressureBoundaryValues() (defined in Boundary)Boundary
setVelocityBoundaryValues() (defined in Boundary)Boundary
+ + + + diff --git a/documentation/html/classBoundary.html b/documentation/html/classBoundary.html new file mode 100644 index 00000000..3bd66f7b --- /dev/null +++ b/documentation/html/classBoundary.html @@ -0,0 +1,116 @@ + + + + + + + +NumSim: Boundary Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+ +
Boundary Class Reference
+
+
+ + + + + + + + + + + + +

+Public Member Functions

Boundary (std::shared_ptr< Mask > mask, std::shared_ptr< Discretization > discretization, Settings settings)
 
+void setPressureBoundaryValues ()
 
+void setVelocityBoundaryValues ()
 
+bool doCalculateF (int i, int j) const
 
+bool doCalculateG (int i, int j) const
 
+ + + +

+Public Attributes

+std::shared_ptr< Maskmask_
 
+
The documentation for this class was generated from the following files:
    +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/boundary/boundary.h
  • +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/boundary/boundary.cpp
  • +
+
+ + + + diff --git a/documentation/html/classCentralDifferences-members.html b/documentation/html/classCentralDifferences-members.html new file mode 100644 index 00000000..66f6e3a4 --- /dev/null +++ b/documentation/html/classCentralDifferences-members.html @@ -0,0 +1,148 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
CentralDifferences Member List
+
+
+ +

This is the complete list of members for CentralDifferences, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CentralDifferences(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)CentralDifferences
computeD2uDx2(int i, int j) constDiscretizationvirtual
computeD2uDy2(int i, int j) constDiscretizationvirtual
computeD2vDx2(int i, int j) constDiscretizationvirtual
computeD2vDy2(int i, int j) constDiscretizationvirtual
computeDpDx(int i, int j) constDiscretizationvirtual
computeDpDy(int i, int j) constDiscretizationvirtual
computeDu2Dx(int i, int j) const overrideCentralDifferencesvirtual
computeDuvDx(int i, int j) const overrideCentralDifferencesvirtual
computeDuvDy(int i, int j) const overrideCentralDifferencesvirtual
computeDv2Dy(int i, int j) const overrideCentralDifferencesvirtual
Discretization(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)Discretization
dx() constStaggeredGrid
dy() constStaggeredGrid
f(int i, int j)StaggeredGrid
f_StaggeredGridprotected
fIBegin() constStaggeredGrid
fIEnd() constStaggeredGrid
fJBegin() constStaggeredGrid
fJEnd() constStaggeredGrid
g(int i, int j)StaggeredGrid
g_StaggeredGridprotected
gIBegin() constStaggeredGrid
gIEnd() constStaggeredGrid
gJBegin() constStaggeredGrid
gJEnd() constStaggeredGrid
meshWidth() constStaggeredGrid
meshWidth_StaggeredGridprotected
nCells() constStaggeredGrid
nCells_StaggeredGridprotected
p() constStaggeredGrid
p(int i, int j) constStaggeredGrid
p(int i, int j)StaggeredGrid
p_StaggeredGridprotected
pIBegin() constStaggeredGrid
pIEnd() constStaggeredGrid
pJBegin() constStaggeredGrid
pJEnd() constStaggeredGrid
rhs() constStaggeredGrid
rhs(int i, int j)StaggeredGrid
rhs_StaggeredGridprotected
rhsIBegin() constStaggeredGrid
rhsIEnd() constStaggeredGrid
rhsJBegin() constStaggeredGrid
rhsJEnd() constStaggeredGrid
StaggeredGrid(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)StaggeredGrid
u() constStaggeredGrid
u(int i, int j) constStaggeredGrid
u(int i, int j)StaggeredGrid
u_StaggeredGridprotected
uIBegin() constStaggeredGrid
uIEnd() constStaggeredGrid
uJBegin() constStaggeredGrid
uJEnd() constStaggeredGrid
v() constStaggeredGrid
v(int i, int j) constStaggeredGrid
v(int i, int j)StaggeredGrid
v_StaggeredGridprotected
vIBegin() constStaggeredGrid
vIEnd() constStaggeredGrid
vJBegin() constStaggeredGrid
vJEnd() constStaggeredGrid
+ + + + diff --git a/documentation/html/classCentralDifferences.html b/documentation/html/classCentralDifferences.html new file mode 100644 index 00000000..31a53c1b --- /dev/null +++ b/documentation/html/classCentralDifferences.html @@ -0,0 +1,558 @@ + + + + + + + +NumSim: CentralDifferences Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+ +
CentralDifferences Class Reference
+
+
+ +

Discretizes the problem using the central differences scheme. + More...

+ +

#include <central_differences.h>

+
+Inheritance diagram for CentralDifferences:
+
+
+ + +Discretization +StaggeredGrid + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 CentralDifferences (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
 Constructor.
 
double computeDu2Dx (int i, int j) const override
 Calculate first derivative of u^2 with respect to x with the central differences Scheme.
 
double computeDv2Dy (int i, int j) const override
 Calculate first derivative of v^2 with respect to y with the central differences Scheme.
 
double computeDuvDx (int i, int j) const override
 Calculate first derivative of u*v with respect to x with the central differences Scheme.
 
double computeDuvDy (int i, int j) const override
 Calculate first derivative of u*v with respect to y with the central differences Scheme.
 
- Public Member Functions inherited from Discretization
 Discretization (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
 Constructor.
 
+virtual double computeD2uDx2 (int i, int j) const
 Calculate second derivative of u with respect to x.
 
+virtual double computeD2uDy2 (int i, int j) const
 Calculate second derivative of u with respect to y.
 
+virtual double computeD2vDx2 (int i, int j) const
 Calculate second derivative of v with respect to x.
 
+virtual double computeD2vDy2 (int i, int j) const
 Calculate second derivative of v with respect to y.
 
+virtual double computeDpDx (int i, int j) const
 Calculate first derivative of p with respect to x.
 
+virtual double computeDpDy (int i, int j) const
 Calculate first derivative of p with respect to y.
 
- Public Member Functions inherited from StaggeredGrid
 StaggeredGrid (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
 Constructor.
 
+const std::array< double, 2 > meshWidth () const
 Get the length of a single cell in x and y directions.
 
+const std::array< int, 2 > nCells () const
 Get number of cells in x and y directions.
 
+const FieldVariableu () const
 Get a reference to the field variable u.
 
+const FieldVariablev () const
 Get a reference to the field variable v.
 
+const FieldVariablep () const
 Get a reference to the field variable p.
 
+const FieldVariablerhs () const
 Get a reference to the field variable rhs.
 
+double u (int i, int j) const
 Access value of u in element (i,j), declared constant.
 
+double & u (int i, int j)
 Access value of u in element (i,j)
 
+double v (int i, int j) const
 Access value of v in element (i,j), declared constant.
 
+double & v (int i, int j)
 Access value of v in element (i,j)
 
+double p (int i, int j) const
 Access value of p in element (i,j), declared constant.
 
+double & p (int i, int j)
 Access value of p in element (i,j)
 
+double & f (int i, int j)
 Access value of f in element (i,j)
 
+double & g (int i, int j)
 Access value of g in element (i,j)
 
+double & rhs (int i, int j)
 Access value of rhs in element (i,j)
 
+double dx () const
 Get the mesh width in x-direction.
 
+double dy () const
 Get the mesh width in y-direction.
 
+int uIBegin () const
 first valid index for u in x direction
 
+int uIEnd () const
 one after last valid index for u in x direction
 
+int uJBegin () const
 first valid index for u in y direction
 
+int uJEnd () const
 one after last valid index for u in y direction
 
+int vIBegin () const
 first valid index for v in x direction
 
+int vIEnd () const
 one after last valid index for v in x direction
 
+int vJBegin () const
 first valid index for v in y direction
 
+int vJEnd () const
 one after last valid index for v in y direction
 
+int pIBegin () const
 first valid index for p in x direction
 
+int pIEnd () const
 one after last valid index for p in x direction
 
+int pJBegin () const
 first valid index for p in y direction
 
+int pJEnd () const
 one after last valid index for p in y direction
 
+int fIBegin () const
 first valid index for f in x direction
 
+int fIEnd () const
 one after last valid index for f in x direction
 
+int fJBegin () const
 first valid index for f in y direction
 
+int fJEnd () const
 one after last valid index for f in y direction
 
+int gIBegin () const
 first valid index for g in x direction
 
+int gIEnd () const
 one after last valid index for g in x direction
 
+int gJBegin () const
 first valid index for g in y direction
 
+int gJEnd () const
 one after last valid index for g in y direction
 
+int rhsIBegin () const
 first valid index for rhs in x direction
 
+int rhsIEnd () const
 one after last valid index for rhs in x direction
 
+int rhsJBegin () const
 first valid index for rhs in y direction
 
+int rhsJEnd () const
 one after last valid index for rhs in y direction
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Attributes inherited from StaggeredGrid
+const std::array< int, 2 > nCells_
 array containing number of cells in x and y directions
 
+const std::array< double, 2 > meshWidth_
 array containing the sizes of cell edges in x and y directions
 
+FieldVariable u_
 instance of the field variable u
 
+FieldVariable v_
 instance of the field variable v
 
+FieldVariable p_
 instance of the field variable p
 
+FieldVariable f_
 instance of the field variable f
 
+FieldVariable g_
 instance of the field variable g
 
+FieldVariable rhs_
 instance of the field variable rhs
 
+

Detailed Description

+

Discretizes the problem using the central differences scheme.

+

Implements the first derivatives of u^2, v^2 and u*v according to the central differences scheme

+

Constructor & Destructor Documentation

+ +

◆ CentralDifferences()

+ +
+
+ + + + + + + + + + + + + + + + + + +
CentralDifferences::CentralDifferences (std::array< int, 2 > nCells,
std::array< double, 2 > meshWidth 
)
+
+ +

Constructor.

+
Parameters
+ + + +
nCellsarray containing number of cells in x and y directions
meshWidtharray containing the length of a single cell in x and y directions
+
+
+ +
+
+

Member Function Documentation

+ +

◆ computeDu2Dx()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
double CentralDifferences::computeDu2Dx (int i,
int j 
) const
+
+overridevirtual
+
+ +

Calculate first derivative of u^2 with respect to x with the central differences Scheme.

+ +

Implements Discretization.

+ +
+
+ +

◆ computeDuvDx()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
double CentralDifferences::computeDuvDx (int i,
int j 
) const
+
+overridevirtual
+
+ +

Calculate first derivative of u*v with respect to x with the central differences Scheme.

+ +

Implements Discretization.

+ +
+
+ +

◆ computeDuvDy()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
double CentralDifferences::computeDuvDy (int i,
int j 
) const
+
+overridevirtual
+
+ +

Calculate first derivative of u*v with respect to y with the central differences Scheme.

+ +

Implements Discretization.

+ +
+
+ +

◆ computeDv2Dy()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
double CentralDifferences::computeDv2Dy (int i,
int j 
) const
+
+overridevirtual
+
+ +

Calculate first derivative of v^2 with respect to y with the central differences Scheme.

+ +

Implements Discretization.

+ +
+
+
The documentation for this class was generated from the following files:
    +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/central_differences.h
  • +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/central_differences.cpp
  • +
+
+ + + + diff --git a/documentation/html/classCentralDifferences.png b/documentation/html/classCentralDifferences.png new file mode 100644 index 0000000000000000000000000000000000000000..047955ca06d1a3cca14ed0fcc1092b365f8bddea GIT binary patch literal 799 zcmeAS@N?(olHy`uVBq!ia0vp^666=m0OW&#In(Sb3=B-GJY5_^Dj46+&F(v_z|+$1 z*j4jiIA6|&r_p4s*NQFcj9R5Wu%~VMEq<@s-tmLV&mBG9lOBJKj@e$ftxe^9_I$Z% z&m63MCs(Wd=#ZX1@6yC8{_}U|+t%csooHsJSZ}MSyls9K>&ZtiuUdXOEcxxvu1?GI z!XaHU>L;CS<6r*P-L%@x+dOmaEU!%!zv|9Ko{M?9`$D*I)NjR;PU~x~+GO~ITuTwy zUb^44F0`q5PRhra{reBDJN{_e{80NJW@oP7tA1bSx#_~uc*aRJ{^mRN^SV{;U%vZ! zSyml;_Wyp5PmF(^*L}Zdug~x!gqy+Vg37y1XBhn-t-GQ5Ao5QA^Yq6|2bhiY7<#4` zGA8Wl;bwT88p9x=4-~DC6lXYgdIv*6Fp9UcW470R zj4yor?(oTE#%(XI-QU;uY{nGl#CNyezkSSSZks8*aDG=*`=kE4tNBHttityFD;G|> zt^en*mH3^-+g!6`e+g~hu+nQ;u=(phirc5Yj(J|gd;h_!@7q5Wf6IRR{O*BU=ktp_ zi?@iZ`^g~*)O9TPv!Ql+^Ko%3ETRWbw_)J*S)T}^{v+`+|GLbcAxrB#k + + + + + + +NumSim: Member List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Computation Member List
+
+
+ +

This is the complete list of members for Computation, including all inherited members.

+ + + +
initialize(int argc, char *argv[])Computation
runSimulation()Computation
+ + + + diff --git a/documentation/html/classComputation.html b/documentation/html/classComputation.html new file mode 100644 index 00000000..df94b70e --- /dev/null +++ b/documentation/html/classComputation.html @@ -0,0 +1,147 @@ + + + + + + + +NumSim: Computation Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+ +
Computation Class Reference
+
+
+ +

Computation of Simulation. + More...

+ +

#include <computation.h>

+ + + + + + + + +

+Public Member Functions

void initialize (int argc, char *argv[])
 Initialize the simulation with settings from .txt file.
 
+void runSimulation ()
 run the whole simulation until t_end
 
+

Detailed Description

+

Computation of Simulation.

+

Combines discretization, pressure solver and outputwriter

+

Member Function Documentation

+ +

◆ initialize()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void Computation::initialize (int argc,
char * argv[] 
)
+
+ +

Initialize the simulation with settings from .txt file.

+
Parameters
+ + + +
argccounts of CLI commands
argvvalues of CLI commands, expect settings.txt filename
+
+
+ +
+
+
The documentation for this class was generated from the following files:
    +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/computation.h
  • +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/computation.cpp
  • +
+
+ + + + diff --git a/documentation/html/classDiscretization-members.html b/documentation/html/classDiscretization-members.html new file mode 100644 index 00000000..6971d969 --- /dev/null +++ b/documentation/html/classDiscretization-members.html @@ -0,0 +1,147 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Discretization Member List
+
+
+ +

This is the complete list of members for Discretization, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
computeD2uDx2(int i, int j) constDiscretizationvirtual
computeD2uDy2(int i, int j) constDiscretizationvirtual
computeD2vDx2(int i, int j) constDiscretizationvirtual
computeD2vDy2(int i, int j) constDiscretizationvirtual
computeDpDx(int i, int j) constDiscretizationvirtual
computeDpDy(int i, int j) constDiscretizationvirtual
computeDu2Dx(int i, int j) const =0Discretizationpure virtual
computeDuvDx(int i, int j) const =0Discretizationpure virtual
computeDuvDy(int i, int j) const =0Discretizationpure virtual
computeDv2Dy(int i, int j) const =0Discretizationpure virtual
Discretization(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)Discretization
dx() constStaggeredGrid
dy() constStaggeredGrid
f(int i, int j)StaggeredGrid
f_StaggeredGridprotected
fIBegin() constStaggeredGrid
fIEnd() constStaggeredGrid
fJBegin() constStaggeredGrid
fJEnd() constStaggeredGrid
g(int i, int j)StaggeredGrid
g_StaggeredGridprotected
gIBegin() constStaggeredGrid
gIEnd() constStaggeredGrid
gJBegin() constStaggeredGrid
gJEnd() constStaggeredGrid
meshWidth() constStaggeredGrid
meshWidth_StaggeredGridprotected
nCells() constStaggeredGrid
nCells_StaggeredGridprotected
p() constStaggeredGrid
p(int i, int j) constStaggeredGrid
p(int i, int j)StaggeredGrid
p_StaggeredGridprotected
pIBegin() constStaggeredGrid
pIEnd() constStaggeredGrid
pJBegin() constStaggeredGrid
pJEnd() constStaggeredGrid
rhs() constStaggeredGrid
rhs(int i, int j)StaggeredGrid
rhs_StaggeredGridprotected
rhsIBegin() constStaggeredGrid
rhsIEnd() constStaggeredGrid
rhsJBegin() constStaggeredGrid
rhsJEnd() constStaggeredGrid
StaggeredGrid(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)StaggeredGrid
u() constStaggeredGrid
u(int i, int j) constStaggeredGrid
u(int i, int j)StaggeredGrid
u_StaggeredGridprotected
uIBegin() constStaggeredGrid
uIEnd() constStaggeredGrid
uJBegin() constStaggeredGrid
uJEnd() constStaggeredGrid
v() constStaggeredGrid
v(int i, int j) constStaggeredGrid
v(int i, int j)StaggeredGrid
v_StaggeredGridprotected
vIBegin() constStaggeredGrid
vIEnd() constStaggeredGrid
vJBegin() constStaggeredGrid
vJEnd() constStaggeredGrid
+ + + + diff --git a/documentation/html/classDiscretization.html b/documentation/html/classDiscretization.html new file mode 100644 index 00000000..8130fcd8 --- /dev/null +++ b/documentation/html/classDiscretization.html @@ -0,0 +1,555 @@ + + + + + + + +NumSim: Discretization Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+ +
Discretization Class Referenceabstract
+
+
+ +

Computes derivatives included in governing equations. + More...

+ +

#include <discretization.h>

+
+Inheritance diagram for Discretization:
+
+
+ + +StaggeredGrid +CentralDifferences +DonorCell + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Discretization (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
 Constructor.
 
virtual double computeDu2Dx (int i, int j) const =0
 Calculate first derivative of u^2 with respect to x.
 
virtual double computeDv2Dy (int i, int j) const =0
 Calculate first derivative of v^2 with respect to y.
 
virtual double computeDuvDx (int i, int j) const =0
 Calculate first derivative of u*v with respect to x.
 
virtual double computeDuvDy (int i, int j) const =0
 Calculate first derivative of u*v with respect to y.
 
+virtual double computeD2uDx2 (int i, int j) const
 Calculate second derivative of u with respect to x.
 
+virtual double computeD2uDy2 (int i, int j) const
 Calculate second derivative of u with respect to y.
 
+virtual double computeD2vDx2 (int i, int j) const
 Calculate second derivative of v with respect to x.
 
+virtual double computeD2vDy2 (int i, int j) const
 Calculate second derivative of v with respect to y.
 
+virtual double computeDpDx (int i, int j) const
 Calculate first derivative of p with respect to x.
 
+virtual double computeDpDy (int i, int j) const
 Calculate first derivative of p with respect to y.
 
- Public Member Functions inherited from StaggeredGrid
 StaggeredGrid (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
 Constructor.
 
+const std::array< double, 2 > meshWidth () const
 Get the length of a single cell in x and y directions.
 
+const std::array< int, 2 > nCells () const
 Get number of cells in x and y directions.
 
+const FieldVariableu () const
 Get a reference to the field variable u.
 
+const FieldVariablev () const
 Get a reference to the field variable v.
 
+const FieldVariablep () const
 Get a reference to the field variable p.
 
+const FieldVariablerhs () const
 Get a reference to the field variable rhs.
 
+double u (int i, int j) const
 Access value of u in element (i,j), declared constant.
 
+double & u (int i, int j)
 Access value of u in element (i,j)
 
+double v (int i, int j) const
 Access value of v in element (i,j), declared constant.
 
+double & v (int i, int j)
 Access value of v in element (i,j)
 
+double p (int i, int j) const
 Access value of p in element (i,j), declared constant.
 
+double & p (int i, int j)
 Access value of p in element (i,j)
 
+double & f (int i, int j)
 Access value of f in element (i,j)
 
+double & g (int i, int j)
 Access value of g in element (i,j)
 
+double & rhs (int i, int j)
 Access value of rhs in element (i,j)
 
+double dx () const
 Get the mesh width in x-direction.
 
+double dy () const
 Get the mesh width in y-direction.
 
+int uIBegin () const
 first valid index for u in x direction
 
+int uIEnd () const
 one after last valid index for u in x direction
 
+int uJBegin () const
 first valid index for u in y direction
 
+int uJEnd () const
 one after last valid index for u in y direction
 
+int vIBegin () const
 first valid index for v in x direction
 
+int vIEnd () const
 one after last valid index for v in x direction
 
+int vJBegin () const
 first valid index for v in y direction
 
+int vJEnd () const
 one after last valid index for v in y direction
 
+int pIBegin () const
 first valid index for p in x direction
 
+int pIEnd () const
 one after last valid index for p in x direction
 
+int pJBegin () const
 first valid index for p in y direction
 
+int pJEnd () const
 one after last valid index for p in y direction
 
+int fIBegin () const
 first valid index for f in x direction
 
+int fIEnd () const
 one after last valid index for f in x direction
 
+int fJBegin () const
 first valid index for f in y direction
 
+int fJEnd () const
 one after last valid index for f in y direction
 
+int gIBegin () const
 first valid index for g in x direction
 
+int gIEnd () const
 one after last valid index for g in x direction
 
+int gJBegin () const
 first valid index for g in y direction
 
+int gJEnd () const
 one after last valid index for g in y direction
 
+int rhsIBegin () const
 first valid index for rhs in x direction
 
+int rhsIEnd () const
 one after last valid index for rhs in x direction
 
+int rhsJBegin () const
 first valid index for rhs in y direction
 
+int rhsJEnd () const
 one after last valid index for rhs in y direction
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Attributes inherited from StaggeredGrid
+const std::array< int, 2 > nCells_
 array containing number of cells in x and y directions
 
+const std::array< double, 2 > meshWidth_
 array containing the sizes of cell edges in x and y directions
 
+FieldVariable u_
 instance of the field variable u
 
+FieldVariable v_
 instance of the field variable v
 
+FieldVariable p_
 instance of the field variable p
 
+FieldVariable f_
 instance of the field variable f
 
+FieldVariable g_
 instance of the field variable g
 
+FieldVariable rhs_
 instance of the field variable rhs
 
+

Detailed Description

+

Computes derivatives included in governing equations.

+

Interface for the discretization. Computes the needed derivatives to solve the Poisson and continuity equations.

+

Constructor & Destructor Documentation

+ +

◆ Discretization()

+ +
+
+ + + + + + + + + + + + + + + + + + +
Discretization::Discretization (std::array< int, 2 > nCells,
std::array< double, 2 > meshWidth 
)
+
+ +

Constructor.

+
Parameters
+ + + +
nCellsarray containing number of cells in x and y directions
meshWidtharray containing the length of a single cell in x and y directions
+
+
+ +
+
+

Member Function Documentation

+ +

◆ computeDu2Dx()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
virtual double Discretization::computeDu2Dx (int i,
int j 
) const
+
+pure virtual
+
+ +

Calculate first derivative of u^2 with respect to x.

+ +

Implemented in CentralDifferences, and DonorCell.

+ +
+
+ +

◆ computeDuvDx()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
virtual double Discretization::computeDuvDx (int i,
int j 
) const
+
+pure virtual
+
+ +

Calculate first derivative of u*v with respect to x.

+ +

Implemented in CentralDifferences, and DonorCell.

+ +
+
+ +

◆ computeDuvDy()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
virtual double Discretization::computeDuvDy (int i,
int j 
) const
+
+pure virtual
+
+ +

Calculate first derivative of u*v with respect to y.

+ +

Implemented in CentralDifferences, and DonorCell.

+ +
+
+ +

◆ computeDv2Dy()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
virtual double Discretization::computeDv2Dy (int i,
int j 
) const
+
+pure virtual
+
+ +

Calculate first derivative of v^2 with respect to y.

+ +

Implemented in CentralDifferences, and DonorCell.

+ +
+
+
The documentation for this class was generated from the following files:
    +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/discretization.h
  • +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/discretization.cpp
  • +
+
+ + + + diff --git a/documentation/html/classDiscretization.png b/documentation/html/classDiscretization.png new file mode 100644 index 0000000000000000000000000000000000000000..d491366f744153de2fc8baf4dd88ade26458eea9 GIT binary patch literal 1039 zcmeAS@N?(olHy`uVBq!ia0vp^KY+M{gBeKv)x8GdNC)_Yxc>kDAIN<1=4)yHq2(3^ zngtTm&%8Kr-~doOc+%w+KsnBmAirP+ARi3OnPy*MU|^o*>Eakt!T5IW>!LLZ0&KVY zwYtC8KYD!E@n%XsyNS=KI1Z*uMm_b6c1kS*S_}cx6+Dj?7B*Pz*r6hN_$cG63BvE& z_HUf9k9tg{IPS}k6rbr@2yuf*w**;W4him zzv|1E%2(J|32qm-zwWKB&R5-a{l2g5`F=Yj$a0HG6Nbsj~+<=g)kQr(oj7hvFVjc_)tipn68fNnOcDRaaW*>3IS*0wbYG;$z;A$xB+CPk(rSBR5O7 z{#aDn6qUbcxF6kSR(&a$IlnM;(ii64Kh%^n_ZvN0R#`NC$@EHBo81PU&#b;wy58xT zbuV`Nn`b7+qi(0qncco^X)Q0)<>E{$k^CYnQRd#>wQ{Vc3$K&^DU*(r?kNo>G;QukndW+4TFLpln z2%2`L{Eo|7PuXBL`?}+A9dFFfKVGlAI{*HQKWBa(-LIhMd9=bYX41a?Ztoz+m^;7# rQ2+bP0l+XkKjGpu- literal 0 HcmV?d00001 diff --git a/documentation/html/classDonorCell-members.html b/documentation/html/classDonorCell-members.html new file mode 100644 index 00000000..01049bd1 --- /dev/null +++ b/documentation/html/classDonorCell-members.html @@ -0,0 +1,148 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
DonorCell Member List
+
+
+ +

This is the complete list of members for DonorCell, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
computeD2uDx2(int i, int j) constDiscretizationvirtual
computeD2uDy2(int i, int j) constDiscretizationvirtual
computeD2vDx2(int i, int j) constDiscretizationvirtual
computeD2vDy2(int i, int j) constDiscretizationvirtual
computeDpDx(int i, int j) constDiscretizationvirtual
computeDpDy(int i, int j) constDiscretizationvirtual
computeDu2Dx(int i, int j) const overrideDonorCellvirtual
computeDuvDx(int i, int j) const overrideDonorCellvirtual
computeDuvDy(int i, int j) const overrideDonorCellvirtual
computeDv2Dy(int i, int j) const overrideDonorCellvirtual
Discretization(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)Discretization
DonorCell(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth, double alpha)DonorCell
dx() constStaggeredGrid
dy() constStaggeredGrid
f(int i, int j)StaggeredGrid
f_StaggeredGridprotected
fIBegin() constStaggeredGrid
fIEnd() constStaggeredGrid
fJBegin() constStaggeredGrid
fJEnd() constStaggeredGrid
g(int i, int j)StaggeredGrid
g_StaggeredGridprotected
gIBegin() constStaggeredGrid
gIEnd() constStaggeredGrid
gJBegin() constStaggeredGrid
gJEnd() constStaggeredGrid
meshWidth() constStaggeredGrid
meshWidth_StaggeredGridprotected
nCells() constStaggeredGrid
nCells_StaggeredGridprotected
p() constStaggeredGrid
p(int i, int j) constStaggeredGrid
p(int i, int j)StaggeredGrid
p_StaggeredGridprotected
pIBegin() constStaggeredGrid
pIEnd() constStaggeredGrid
pJBegin() constStaggeredGrid
pJEnd() constStaggeredGrid
rhs() constStaggeredGrid
rhs(int i, int j)StaggeredGrid
rhs_StaggeredGridprotected
rhsIBegin() constStaggeredGrid
rhsIEnd() constStaggeredGrid
rhsJBegin() constStaggeredGrid
rhsJEnd() constStaggeredGrid
StaggeredGrid(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)StaggeredGrid
u() constStaggeredGrid
u(int i, int j) constStaggeredGrid
u(int i, int j)StaggeredGrid
u_StaggeredGridprotected
uIBegin() constStaggeredGrid
uIEnd() constStaggeredGrid
uJBegin() constStaggeredGrid
uJEnd() constStaggeredGrid
v() constStaggeredGrid
v(int i, int j) constStaggeredGrid
v(int i, int j)StaggeredGrid
v_StaggeredGridprotected
vIBegin() constStaggeredGrid
vIEnd() constStaggeredGrid
vJBegin() constStaggeredGrid
vJEnd() constStaggeredGrid
+ + + + diff --git a/documentation/html/classDonorCell.html b/documentation/html/classDonorCell.html new file mode 100644 index 00000000..7e6db599 --- /dev/null +++ b/documentation/html/classDonorCell.html @@ -0,0 +1,565 @@ + + + + + + + +NumSim: DonorCell Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+ +
DonorCell Class Reference
+
+
+ +

Discretizes the problem using the donor cell scheme. + More...

+ +

#include <donor_cell.h>

+
+Inheritance diagram for DonorCell:
+
+
+ + +Discretization +StaggeredGrid + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 DonorCell (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth, double alpha)
 Constructor.
 
double computeDu2Dx (int i, int j) const override
 Calculate first derivative of u^2 with respect to x with the donor cell Scheme.
 
double computeDv2Dy (int i, int j) const override
 Calculate first derivative of v^2 with respect to y with the donor cell Scheme.
 
double computeDuvDx (int i, int j) const override
 Calculate first derivative of u*v with respect to x with the donor cell Scheme.
 
double computeDuvDy (int i, int j) const override
 Calculate first derivative of u*v with respect to y with the donor cell Scheme.
 
- Public Member Functions inherited from Discretization
 Discretization (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
 Constructor.
 
+virtual double computeD2uDx2 (int i, int j) const
 Calculate second derivative of u with respect to x.
 
+virtual double computeD2uDy2 (int i, int j) const
 Calculate second derivative of u with respect to y.
 
+virtual double computeD2vDx2 (int i, int j) const
 Calculate second derivative of v with respect to x.
 
+virtual double computeD2vDy2 (int i, int j) const
 Calculate second derivative of v with respect to y.
 
+virtual double computeDpDx (int i, int j) const
 Calculate first derivative of p with respect to x.
 
+virtual double computeDpDy (int i, int j) const
 Calculate first derivative of p with respect to y.
 
- Public Member Functions inherited from StaggeredGrid
 StaggeredGrid (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
 Constructor.
 
+const std::array< double, 2 > meshWidth () const
 Get the length of a single cell in x and y directions.
 
+const std::array< int, 2 > nCells () const
 Get number of cells in x and y directions.
 
+const FieldVariableu () const
 Get a reference to the field variable u.
 
+const FieldVariablev () const
 Get a reference to the field variable v.
 
+const FieldVariablep () const
 Get a reference to the field variable p.
 
+const FieldVariablerhs () const
 Get a reference to the field variable rhs.
 
+double u (int i, int j) const
 Access value of u in element (i,j), declared constant.
 
+double & u (int i, int j)
 Access value of u in element (i,j)
 
+double v (int i, int j) const
 Access value of v in element (i,j), declared constant.
 
+double & v (int i, int j)
 Access value of v in element (i,j)
 
+double p (int i, int j) const
 Access value of p in element (i,j), declared constant.
 
+double & p (int i, int j)
 Access value of p in element (i,j)
 
+double & f (int i, int j)
 Access value of f in element (i,j)
 
+double & g (int i, int j)
 Access value of g in element (i,j)
 
+double & rhs (int i, int j)
 Access value of rhs in element (i,j)
 
+double dx () const
 Get the mesh width in x-direction.
 
+double dy () const
 Get the mesh width in y-direction.
 
+int uIBegin () const
 first valid index for u in x direction
 
+int uIEnd () const
 one after last valid index for u in x direction
 
+int uJBegin () const
 first valid index for u in y direction
 
+int uJEnd () const
 one after last valid index for u in y direction
 
+int vIBegin () const
 first valid index for v in x direction
 
+int vIEnd () const
 one after last valid index for v in x direction
 
+int vJBegin () const
 first valid index for v in y direction
 
+int vJEnd () const
 one after last valid index for v in y direction
 
+int pIBegin () const
 first valid index for p in x direction
 
+int pIEnd () const
 one after last valid index for p in x direction
 
+int pJBegin () const
 first valid index for p in y direction
 
+int pJEnd () const
 one after last valid index for p in y direction
 
+int fIBegin () const
 first valid index for f in x direction
 
+int fIEnd () const
 one after last valid index for f in x direction
 
+int fJBegin () const
 first valid index for f in y direction
 
+int fJEnd () const
 one after last valid index for f in y direction
 
+int gIBegin () const
 first valid index for g in x direction
 
+int gIEnd () const
 one after last valid index for g in x direction
 
+int gJBegin () const
 first valid index for g in y direction
 
+int gJEnd () const
 one after last valid index for g in y direction
 
+int rhsIBegin () const
 first valid index for rhs in x direction
 
+int rhsIEnd () const
 one after last valid index for rhs in x direction
 
+int rhsJBegin () const
 first valid index for rhs in y direction
 
+int rhsJEnd () const
 one after last valid index for rhs in y direction
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Protected Attributes inherited from StaggeredGrid
+const std::array< int, 2 > nCells_
 array containing number of cells in x and y directions
 
+const std::array< double, 2 > meshWidth_
 array containing the sizes of cell edges in x and y directions
 
+FieldVariable u_
 instance of the field variable u
 
+FieldVariable v_
 instance of the field variable v
 
+FieldVariable p_
 instance of the field variable p
 
+FieldVariable f_
 instance of the field variable f
 
+FieldVariable g_
 instance of the field variable g
 
+FieldVariable rhs_
 instance of the field variable rhs
 
+

Detailed Description

+

Discretizes the problem using the donor cell scheme.

+

Implements the first derivatives of u^2, v^2 and u*v according to the donor cell scheme

+

Constructor & Destructor Documentation

+ +

◆ DonorCell()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
DonorCell::DonorCell (std::array< int, 2 > nCells,
std::array< double, 2 > meshWidth,
double alpha 
)
+
+ +

Constructor.

+
Parameters
+ + + + +
nCellsarray containing number of cells in x and y directions
meshWidtharray containing the length of a single cell in x and y directions
alphaweight factor between central differences and donor cell schemes
+
+
+ +
+
+

Member Function Documentation

+ +

◆ computeDu2Dx()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
double DonorCell::computeDu2Dx (int i,
int j 
) const
+
+overridevirtual
+
+ +

Calculate first derivative of u^2 with respect to x with the donor cell Scheme.

+ +

Implements Discretization.

+ +
+
+ +

◆ computeDuvDx()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
double DonorCell::computeDuvDx (int i,
int j 
) const
+
+overridevirtual
+
+ +

Calculate first derivative of u*v with respect to x with the donor cell Scheme.

+ +

Implements Discretization.

+ +
+
+ +

◆ computeDuvDy()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
double DonorCell::computeDuvDy (int i,
int j 
) const
+
+overridevirtual
+
+ +

Calculate first derivative of u*v with respect to y with the donor cell Scheme.

+ +

Implements Discretization.

+ +
+
+ +

◆ computeDv2Dy()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
double DonorCell::computeDv2Dy (int i,
int j 
) const
+
+overridevirtual
+
+ +

Calculate first derivative of v^2 with respect to y with the donor cell Scheme.

+ +

Implements Discretization.

+ +
+
+
The documentation for this class was generated from the following files:
    +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/donor_cell.h
  • +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/donor_cell.cpp
  • +
+
+ + + + diff --git a/documentation/html/classDonorCell.png b/documentation/html/classDonorCell.png new file mode 100644 index 0000000000000000000000000000000000000000..20dde334a1660559f4a7d4aaf585c66f6d93b870 GIT binary patch literal 690 zcmeAS@N?(olHy`uVBq!ia0vp^aX{R`!3-oLv)AMSDd_;85ZC|z{{xvX-h3_XKeXJ! zK(jz%`k5C84jcfA2T!`Z0w~8>666=m0OW&#In(Sb3=B-Ro-U3d6^w7^zAaj9z{A?# zpDwZYzi|8k`4b5jCxz{tymFF`*|t45oZjX?nX_5`gvv|T7oL|M2l0_U;YyMK53usUYl=g?wbecM+b*(UzT-_vAtqI?uw@i0sdaq~nD(smb zzxLc;g}`1n^V+psdqd6%)?8g39{*b_;akM(tA5+>1{uuzkp3(39ec0Uh0>a+?^_ML z&a5d4*&pW7dwqTVtm;WJ68}9sK1rJY%2xCIBw4=uy=KKtx&IS9FFktv)$;ipHU^tS zMh5$uucsfq`hInNng9OH{|;-be_==vtYR?Wuw{^Fkz?R-;%8u6$j;Dwfw|$}{Y%f0 zyw>|`OYJv4PpLJ<&tIOr5b}TOtr`0xi!N^8d!=~GEqlBAc;v5t zug|agJFoL|z;4N)(#7G&-}PHQyK-fP{HD_Ra~$J^j3mBXF#a1LkkxDEGr4&EeBGUD z&rjTC-n;I1@Kc$oh3n?*4JmmVQ8npLs+0dDwuS1R%=NYBEO#?9_(w1t;E(^iX~(bH zudDA~e!u4bhf|!k3=wE$(N>gPdi-=w2s+b9b>7awBPxKs|$~lzEaYI_5PZw=KmP;B$HTk Tq?ZW;Qx}7$tDnm{r-UW|1!Yj+ literal 0 HcmV?d00001 diff --git a/documentation/html/classFieldVariable-members.html b/documentation/html/classFieldVariable-members.html new file mode 100644 index 00000000..a9dcfae0 --- /dev/null +++ b/documentation/html/classFieldVariable-members.html @@ -0,0 +1,95 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
FieldVariable Member List
+
+
+ +

This is the complete list of members for FieldVariable, including all inherited members.

+ + + + + + + + + + +
Array2D(std::array< int, 2 > size)Array2D
data_Array2Dprotected
FieldVariable(std::array< int, 2 > size, std::array< double, 2 > origin, std::array< double, 2 > meshWidth)FieldVariable
findAbsMax() constFieldVariable
interpolateAt(double x, double y) constFieldVariable
operator()(int i, int j)Array2D
operator()(int i, int j) constArray2D
size() constArray2D
size_Array2Dprotected
+ + + + diff --git a/documentation/html/classFieldVariable.html b/documentation/html/classFieldVariable.html new file mode 100644 index 00000000..d0847d24 --- /dev/null +++ b/documentation/html/classFieldVariable.html @@ -0,0 +1,250 @@ + + + + + + + +NumSim: FieldVariable Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+ +
FieldVariable Class Reference
+
+
+ +

Discretization of a scalar function. + More...

+ +

#include <field_variable.h>

+
+Inheritance diagram for FieldVariable:
+
+
+ + +Array2D + +
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 FieldVariable (std::array< int, 2 > size, std::array< double, 2 > origin, std::array< double, 2 > meshWidth)
 Constructor.
 
double interpolateAt (double x, double y) const
 Interpolates value of field variable in domain using x and y coordinates.
 
double findAbsMax () const
 Find point in Array2D of Fieldvariable with maximum value.
 
- Public Member Functions inherited from Array2D
 Array2D (std::array< int, 2 > size)
 constructor.
 
double & operator() (int i, int j)
 set array value. Overloads the () operator
 
double operator() (int i, int j) const
 get array value. Overloads the () operator
 
+std::array< int, 2 > size () const
 get size of array in x and y direction
 
+ + + + + + + + +

+Additional Inherited Members

- Protected Attributes inherited from Array2D
+const std::array< int, 2 > size_
 size of array in x and y direction
 
+std::vector< double > data_
 storage array values, in row-major order
 
+

Detailed Description

+

Discretization of a scalar function.

+

A field variable is the discretization of a scalar function f(x) with x in the computational domain. More specifically, a scalar value is stored at discrete nodes/points. The nodes are arranged in an equidistant mesh with specified mesh width.

+

Constructor & Destructor Documentation

+ +

◆ FieldVariable()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
FieldVariable::FieldVariable (std::array< int, 2 > size,
std::array< double, 2 > origin,
std::array< double, 2 > meshWidth 
)
+
+ +

Constructor.

+
Parameters
+ + + + +
sizenumber of cells in x and y direction
originorgin of Fieldvariable relative to domain origin
meshwidthmesh width in x and y direction
+
+
+ +
+
+

Member Function Documentation

+ +

◆ findAbsMax()

+ +
+
+ + + + + + + +
double FieldVariable::findAbsMax () const
+
+ +

Find point in Array2D of Fieldvariable with maximum value.

+

Finds maximum by iterating through all values in FielVariable

+ +
+
+ +

◆ interpolateAt()

+ +
+
+ + + + + + + + + + + + + + + + + + +
double FieldVariable::interpolateAt (double x,
double y 
) const
+
+ +

Interpolates value of field variable in domain using x and y coordinates.

+

Interpolates by using bilinear interpolation.

+
Parameters
+ + + +
xx postion of point to interpolate
yy postion of point to interpolate
+
+
+ +
+
+
The documentation for this class was generated from the following files:
    +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/storage/field_variable.h
  • +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/storage/field_variable.cpp
  • +
+
+ + + + diff --git a/documentation/html/classFieldVariable.png b/documentation/html/classFieldVariable.png new file mode 100644 index 0000000000000000000000000000000000000000..39c18d0f1b691be9faa9372616fc41ecf7fc3d45 GIT binary patch literal 454 zcmV;%0XhDOP)vTJr#LVva2S`&=)l0h|Ns9}lGCUF000SeQchC<|NsC0|NsC0Hv*f~0003| zNkl`s*4$)%wb>B7(iI9gc13fh$(Z#%W@grP^X7aT{E)j0e#-T~%?}5M z5Q2dK;ITFUu#gpa+l2w3u5@+C7jHTzR6pn?SjsnhE`AZ^l zQdvGyx{0&L3b?QMe6QwTRa}m-T5$N>xKwT%a9*ES(bZDG!w%FPE_vKGh60{@JnM>@ wo+jERh@VMUh={yX4tB7JNH0q;5s`tu0C3Dm#*)<23jhEB07*qoM6N<$g7tvVw*UYD literal 0 HcmV?d00001 diff --git a/documentation/html/classFluidTracer-members.html b/documentation/html/classFluidTracer-members.html new file mode 100644 index 00000000..d7949e5c --- /dev/null +++ b/documentation/html/classFluidTracer-members.html @@ -0,0 +1,97 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
FluidTracer Member List
+
+
+ +

This is the complete list of members for FluidTracer, including all inherited members.

+ + + + + + + + + + + + +
cellOfParticle(int i) (defined in FluidTracer)FluidTracer
createParticles(double positionSourceX, double positionSourceY)FluidTracer
FluidTracer(int numParticlesperCell, std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask) (defined in FluidTracer)FluidTracer
FluidTracer(std::vector< double > x, std::vector< double > y, std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask) (defined in FluidTracer)FluidTracer
getNumberOfParticles() constFluidTracer
getParticlePosition(int i) constFluidTracer
moveParticles(double dt)FluidTracer
moveParticles(double dt, std::array< double, 2 > vel) (defined in FluidTracer)FluidTracer
updateParticle(int i, std::array< int, 2 > idx, double dt, std::array< double, 2 > vel, int depth) (defined in FluidTracer)FluidTracer
val2CellX(double xVal) (defined in FluidTracer)FluidTracer
val2CellY(double yVal) (defined in FluidTracer)FluidTracer
+ + + + diff --git a/documentation/html/classFluidTracer.html b/documentation/html/classFluidTracer.html new file mode 100644 index 00000000..619e2467 --- /dev/null +++ b/documentation/html/classFluidTracer.html @@ -0,0 +1,233 @@ + + + + + + + +NumSim: FluidTracer Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+ +
FluidTracer Class Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

FluidTracer (int numParticlesperCell, std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask)
 
FluidTracer (std::vector< double > x, std::vector< double > y, std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask)
 
void moveParticles (double dt)
 Update the position of the particles according to the velocity field and sets mask accordingly.
 
void createParticles (double positionSourceX, double positionSourceY)
 can be used to create a source cell for particles
 
int getNumberOfParticles () const
 Get the Number Of Particles object.
 
std::array< double, 2 > getParticlePosition (int i) const
 Get the Particle Position, index starts at 0.
 
+std::array< int, 2 > cellOfParticle (int i)
 
+int val2CellX (double xVal)
 
+int val2CellY (double yVal)
 
+std::array< double, 2 > updateParticle (int i, std::array< int, 2 > idx, double dt, std::array< double, 2 > vel, int depth)
 
+std::array< double, 2 > moveParticles (double dt, std::array< double, 2 > vel)
 
+

Member Function Documentation

+ +

◆ createParticles()

+ +
+
+ + + + + + + + + + + + + + + + + + +
void FluidTracer::createParticles (double positionSourceX,
double positionSourceY 
)
+
+ +

can be used to create a source cell for particles

+

fills the cell homogenously with particles by cell

+ +
+
+ +

◆ getNumberOfParticles()

+ +
+
+ + + + + + + +
int FluidTracer::getNumberOfParticles () const
+
+ +

Get the Number Of Particles object.

+
Returns
int
+ +
+
+ +

◆ getParticlePosition()

+ +
+
+ + + + + + + + +
std::array< double, 2 > FluidTracer::getParticlePosition (int i) const
+
+ +

Get the Particle Position, index starts at 0.

+
Parameters
+ + +
i
+
+
+
Returns
std::array<double, 2>
+ +
+
+ +

◆ moveParticles()

+ +
+
+ + + + + + + + +
void FluidTracer::moveParticles (double dt)
+
+ +

Update the position of the particles according to the velocity field and sets mask accordingly.

+

get the velocity field $u$ and $v$ Checks for collision with border or obstacle and reflects the particle at this position Update the mask where there are new Air or Fluid cells

+
Parameters
+ + +
dt
+
+
+ +
+
+
The documentation for this class was generated from the following files:
    +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/surface/fluid_tracer.h
  • +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/surface/fluid_tracer.cpp
  • +
+
+ + + + diff --git a/documentation/html/classGaussSeidel-members.html b/documentation/html/classGaussSeidel-members.html new file mode 100644 index 00000000..ece7c0c4 --- /dev/null +++ b/documentation/html/classGaussSeidel-members.html @@ -0,0 +1,101 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
GaussSeidel Member List
+
+
+ +

This is the complete list of members for GaussSeidel, including all inherited members.

+ + + + + + + + + + + + + + + + +
boundary_PressureSolverprotected
calculateResiduum()PressureSolverprotected
discretization_PressureSolverprotected
dx2 (defined in PressureSolver)PressureSolver
dy2PressureSolver
epsilon_PressureSolverprotected
GaussSeidel(const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)GaussSeidel
i_begPressureSolverprotected
i_endPressureSolverprotected
j_begPressureSolverprotected
j_endPressureSolverprotected
maximumNumberOfIterations_PressureSolverprotected
PressureSolver(std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)PressureSolver
setBoundaryValues()PressureSolverprotected
solve() overrideGaussSeidelvirtual
+ + + + diff --git a/documentation/html/classGaussSeidel.html b/documentation/html/classGaussSeidel.html new file mode 100644 index 00000000..1f8d0ed0 --- /dev/null +++ b/documentation/html/classGaussSeidel.html @@ -0,0 +1,253 @@ + + + + + + + +NumSim: GaussSeidel Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+ +
GaussSeidel Class Reference
+
+
+ +

Standard Gauss-Seidel solver. + More...

+ +

#include <gauss_seidel.h>

+
+Inheritance diagram for GaussSeidel:
+
+
+ + +PressureSolver + +
+ + + + + + + + + + + + +

+Public Member Functions

 GaussSeidel (const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
 Constructor.
 
void solve () override
 override function that starts solver.
 
- Public Member Functions inherited from PressureSolver
 PressureSolver (std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
 Constructor.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from PressureSolver
+double dx2
 
+double dy2
 squared mesh widths
 
- Protected Member Functions inherited from PressureSolver
void setBoundaryValues ()
 Set the Boundary Values.
 
+double calculateResiduum ()
 calculate residuum of current time step
 
- Protected Attributes inherited from PressureSolver
+int i_beg
 begin of loop for rhs in x direction
 
+int i_end
 end of loop for rhs in x direction
 
+int j_beg
 begin of loop for rhs in y direction
 
+int j_end
 end of loop for rhs in y direction
 
+std::shared_ptr< Discretizationdiscretization_
 object holding the needed field variables for rhs and p
 
+std::shared_ptr< Boundaryboundary_
 object managing boundary for obstacle and surface tension
 
+double epsilon_
 tolerance for the solver
 
+int maximumNumberOfIterations_
 maximum number of iterations
 
+

Detailed Description

+

Standard Gauss-Seidel solver.

+

Constructor & Destructor Documentation

+ +

◆ GaussSeidel()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
GaussSeidel::GaussSeidel (const std::shared_ptr< Discretization > & data,
double epsilon,
int maximumNumberOfIterations,
std::shared_ptr< Boundaryboundary 
)
+
+ +

Constructor.

+
Parameters
+ + + + +
datainstance of Discretization holding the needed field variables for rhs and p
epsilontolerance for the solver
maximumNumberOfIterationsmaximum of iteration
+
+
+ +
+
+

Member Function Documentation

+ +

◆ solve()

+ +
+
+ + + + + +
+ + + + + + + +
void GaussSeidel::solve ()
+
+overridevirtual
+
+ +

override function that starts solver.

+ +

Implements PressureSolver.

+ +
+
+
The documentation for this class was generated from the following files:
    +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/gauss_seidel.h
  • +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/gauss_seidel.cpp
  • +
+
+ + + + diff --git a/documentation/html/classGaussSeidel.png b/documentation/html/classGaussSeidel.png new file mode 100644 index 0000000000000000000000000000000000000000..9e4343d96a3cf9222d8ea21fcd5152dba5a1bd44 GIT binary patch literal 502 zcmVvTJr#LVva2S`&=)l0h|Ns9}lGCUF000SeQchC<|NsC0|NsC0Hv*f~0004j zNklO-DKSIBE0NqV`EGZ5RZImPB$Ri?|T<*}G@V73e()of%t{B+KtcYE*n zOq#Uo8l>^4ev<>puv~RFxdNkd^-bcJ?!sR~+-bV(^7Ov(BgD1BbBK|CIM4vn_Rl-W zpu4tf2`tm)-gk6!yz9SK6P^@Aim zSMSJQ>l+_EfZSiaq>LSBAdUB)ZqZ}u{n0xt-@5ttkZiBFGBVIjbzVtzj3K4uKCsz? zha9}`cal*xuq{{N7stMO4GBW}?EFlV@nH+W?&=F%)2(?QkLygi9w)M&%p=;DYyX}6 sxVt3jm$e|06xM=BQdn0(%*-b13+#APiE!I&tN;K207*qoM6N<$f|&&HtN;K2 literal 0 HcmV?d00001 diff --git a/documentation/html/classMask-members.html b/documentation/html/classMask-members.html new file mode 100644 index 00000000..14541cdb --- /dev/null +++ b/documentation/html/classMask-members.html @@ -0,0 +1,148 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Mask Member List
+
+
+ +

This is the complete list of members for Mask, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AIR enum value (defined in Mask)Mask
boundary_listMaskprotected
CellType enum name (defined in Mask)Mask
createMaskFromPNGBitMap() (defined in Mask)Mask
data_Maskprotected
DOMAIN_BOTTOM_NOSLIP enum value (defined in Mask)Mask
DOMAIN_BOTTOM_PRESSURE enum value (defined in Mask)Mask
DOMAIN_BOUNDARY enum value (defined in Mask)Mask
DOMAIN_LEFT_NOSLIP enum value (defined in Mask)Mask
DOMAIN_LEFT_PRESSURE enum value (defined in Mask)Mask
DOMAIN_RIGHT_NOSLIP enum value (defined in Mask)Mask
DOMAIN_RIGHT_PRESSURE enum value (defined in Mask)Mask
DOMAIN_TOP_NOSLIP enum value (defined in Mask)Mask
DOMAIN_TOP_PRESSURE enum value (defined in Mask)Mask
FLUID enum value (defined in Mask)Mask
FLUID_BORDER_BOTTOM enum value (defined in Mask)Mask
FLUID_BORDER_LEFT enum value (defined in Mask)Mask
FLUID_BORDER_RIGHT enum value (defined in Mask)Mask
FLUID_BORDER_TOP enum value (defined in Mask)Mask
FLUID_COLUMN_HORIZONTAL enum value (defined in Mask)Mask
FLUID_COLUMN_VERTICAL enum value (defined in Mask)Mask
FLUID_CORNER_BOTTOM_LEFT enum value (defined in Mask)Mask
FLUID_CORNER_BOTTOM_RIGHT enum value (defined in Mask)Mask
FLUID_CORNER_TOP_LEFT enum value (defined in Mask)Mask
FLUID_CORNER_TOP_RIGHT enum value (defined in Mask)Mask
FLUID_DROPLET enum value (defined in Mask)Mask
FLUID_SINGLE_BOTTOM enum value (defined in Mask)Mask
FLUID_SINGLE_LEFT enum value (defined in Mask)Mask
FLUID_SINGLE_RIGHT enum value (defined in Mask)Mask
FLUID_SINGLE_TOP enum value (defined in Mask)Mask
FLUID_TYPE enum value (defined in Mask)Mask
forbiddenObstacleFluidCombinations (defined in Mask)Maskprotected
getNumberOfFluidCells() constMask
isAir(int i, int j) constMask
isDomainBoundary(int i, int j) const (defined in Mask)Mask
isFluid(int i, int j) constMask
isFluidBoundary(int i, int j) const (defined in Mask)Mask
isInnerFluid(int i, int j) const (defined in Mask)Mask
isObstacle(int i, int j) constMask
isObstacleBoundary(int i, int j) const (defined in Mask)Mask
makeRectangularObstacle() (defined in Mask)Mask
Mask(Settings settings)Mask
OBSTACLE enum value (defined in Mask)Mask
OBSTACLE_BORDER_BOTTOM enum value (defined in Mask)Mask
OBSTACLE_BORDER_LEFT enum value (defined in Mask)Mask
OBSTACLE_BORDER_RIGHT enum value (defined in Mask)Mask
OBSTACLE_BORDER_TOP enum value (defined in Mask)Mask
OBSTACLE_CORNER_BOTTOM_LEFT enum value (defined in Mask)Mask
OBSTACLE_CORNER_BOTTOM_RIGHT enum value (defined in Mask)Mask
OBSTACLE_CORNER_TOP_LEFT enum value (defined in Mask)Mask
OBSTACLE_CORNER_TOP_RIGHT enum value (defined in Mask)Mask
OBSTACLE_INSIDE enum value (defined in Mask)Mask
operator()(int i, int j)Mask
operator()(int i, int j) constMask
printMask() const (defined in Mask)Mask
resetMask()Mask
setDomainBC() (defined in Mask)Mask
setFluidBC() (defined in Mask)Mask
setObstacleBC() (defined in Mask)Mask
settings_ (defined in Mask)Maskprotected
size() constMask
size_Maskprotected
+ + + + diff --git a/documentation/html/classMask.html b/documentation/html/classMask.html new file mode 100644 index 00000000..e946a812 --- /dev/null +++ b/documentation/html/classMask.html @@ -0,0 +1,464 @@ + + + + + + + +NumSim: Mask Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
+ + + + +

+Public Types

enum  CellType {
+  FLUID_DROPLET = 0 +, FLUID_SINGLE_LEFT = 1 +, FLUID_SINGLE_TOP = 2 +, FLUID_SINGLE_RIGHT = 4 +,
+  FLUID_SINGLE_BOTTOM = 8 +, FLUID_CORNER_BOTTOM_LEFT = 6 +, FLUID_CORNER_TOP_LEFT = 12 +, FLUID_CORNER_TOP_RIGHT = 9 +,
+  FLUID_CORNER_BOTTOM_RIGHT = 3 +, FLUID_COLUMN_HORIZONTAL = 5 +, FLUID_COLUMN_VERTICAL = 10 +, FLUID_BORDER_LEFT = 14 +,
+  FLUID_BORDER_TOP = 13 +, FLUID_BORDER_RIGHT = 11 +, FLUID_BORDER_BOTTOM = 7 +, FLUID = 15 +,
+  FLUID_TYPE = 50 +, AIR = 64 +, OBSTACLE = 99 +, OBSTACLE_INSIDE = 100 +,
+  OBSTACLE_BORDER_LEFT = 101 +, OBSTACLE_BORDER_TOP = 102 +, OBSTACLE_CORNER_TOP_LEFT = 103 +, OBSTACLE_BORDER_RIGHT = 104 +,
+  OBSTACLE_CORNER_TOP_RIGHT = 106 +, OBSTACLE_BORDER_BOTTOM = 108 +, OBSTACLE_CORNER_BOTTOM_LEFT = 109 +, OBSTACLE_CORNER_BOTTOM_RIGHT = 112 +,
+  DOMAIN_BOUNDARY = 200 +, DOMAIN_LEFT_NOSLIP = 201 +, DOMAIN_TOP_NOSLIP = 202 +, DOMAIN_RIGHT_NOSLIP = 203 +,
+  DOMAIN_BOTTOM_NOSLIP = 204 +, DOMAIN_LEFT_PRESSURE = 205 +, DOMAIN_TOP_PRESSURE = 206 +, DOMAIN_RIGHT_PRESSURE = 207 +,
+  DOMAIN_BOTTOM_PRESSURE = 208 +
+ }
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 Mask (Settings settings)
 constructor.
 
int & operator() (int i, int j)
 set array value. Overloads the () operator
 
int operator() (int i, int j) const
 get array value. Overloads the () operator
 
+std::array< int, 2 > size () const
 get size of array in x and y direction
 
+void resetMask ()
 sets all not obstacle cells to air
 
bool isFluid (int i, int j) const
 Cell at (i,j) is fluid or not.
 
bool isObstacle (int i, int j) const
 True if Cell at (i,j) is either obstacle or boundary.
 
bool isAir (int i, int j) const
 Cell at (i,j) is a air cell or not.
 
+bool isInnerFluid (int i, int j) const
 
+bool isDomainBoundary (int i, int j) const
 
+bool isObstacleBoundary (int i, int j) const
 
+bool isFluidBoundary (int i, int j) const
 
int getNumberOfFluidCells () const
 number of fluid cells
 
+void makeRectangularObstacle ()
 
+void createMaskFromPNGBitMap ()
 
+void setDomainBC ()
 
+void setObstacleBC ()
 
+void setFluidBC ()
 
+void printMask () const
 
+ + + + + + + + + + + + + + +

+Protected Attributes

+std::array< int, 2 > size_
 size of array in x and y direction
 
+std::vector< int > data_
 storage array values, in row-major order
 
+std::vector< int > boundary_list
 stores the indices of the boundary cells
 
+Settings settings_
 
+int forbiddenObstacleFluidCombinations [7] = {105,107,110,111,113,114,115}
 
+

Constructor & Destructor Documentation

+ +

◆ Mask()

+ +
+
+ + + + + + + + +
Mask::Mask (Settings settings)
+
+ +

constructor.

+
Parameters
+ + +
sizesize of array in x and y direction
+
+
+ +
+
+

Member Function Documentation

+ +

◆ getNumberOfFluidCells()

+ +
+
+ + + + + + + +
int Mask::getNumberOfFluidCells () const
+
+ +

number of fluid cells

+

not efficient but is only used once in the creation of the fluid tracer

+ +
+
+ +

◆ isAir()

+ +
+
+ + + + + + + + + + + + + + + + + + +
bool Mask::isAir (int i,
int j 
) const
+
+ +

Cell at (i,j) is a air cell or not.

+
Parameters
+ + + +
iindex in x direction
jindex in y direction
+
+
+

If i and j are out of bond returns false

+ +
+
+ +

◆ isFluid()

+ +
+
+ + + + + + + + + + + + + + + + + + +
bool Mask::isFluid (int i,
int j 
) const
+
+ +

Cell at (i,j) is fluid or not.

+
Parameters
+ + + +
iindex in x direction
jindex in y direction
+
+
+

If i and j are out of bond returns false

+ +
+
+ +

◆ isObstacle()

+ +
+
+ + + + + + + + + + + + + + + + + + +
bool Mask::isObstacle (int i,
int j 
) const
+
+ +

True if Cell at (i,j) is either obstacle or boundary.

+
Parameters
+ + + +
iindex in x direction
jindex in y direction
+
+
+ +
+
+ +

◆ operator()() [1/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
int & Mask::operator() (int i,
int j 
)
+
+ +

set array value. Overloads the () operator

+
Parameters
+ + + +
iindex in x direction
jindex in y direction
+
+
+ +
+
+ +

◆ operator()() [2/2]

+ +
+
+ + + + + + + + + + + + + + + + + + +
int Mask::operator() (int i,
int j 
) const
+
+ +

get array value. Overloads the () operator

+
Parameters
+ + + +
iindex in x direction
jindex in y direction
+
+
+ +
+
+
The documentation for this class was generated from the following files:
    +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/boundary/mask.h
  • +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/boundary/mask.cpp
  • +
+
+ + + + diff --git a/documentation/html/classOutputWriter-members.html b/documentation/html/classOutputWriter-members.html new file mode 100644 index 00000000..a07d193b --- /dev/null +++ b/documentation/html/classOutputWriter-members.html @@ -0,0 +1,90 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
OutputWriter Member List
+
+
+ +

This is the complete list of members for OutputWriter, including all inherited members.

+ + + + + +
discretization_OutputWriterprotected
fileNo_OutputWriterprotected
OutputWriter(std::shared_ptr< Discretization > discretization)OutputWriter
writeFile(double currentTime)=0OutputWriterpure virtual
+ + + + diff --git a/documentation/html/classOutputWriter.html b/documentation/html/classOutputWriter.html new file mode 100644 index 00000000..7bb4f4f6 --- /dev/null +++ b/documentation/html/classOutputWriter.html @@ -0,0 +1,194 @@ + + + + + + + +NumSim: OutputWriter Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+ +
OutputWriter Class Referenceabstract
+
+
+ +

Inteface class for writing simulation data output. + More...

+ +

#include <output_writer.h>

+
+Inheritance diagram for OutputWriter:
+
+
+ + +OutputWriterParaview +OutputWriterText + +
+ + + + + + + + +

+Public Member Functions

 OutputWriter (std::shared_ptr< Discretization > discretization)
 Constructor.
 
virtual void writeFile (double currentTime)=0
 Write current velocities to file.
 
+ + + + + + + +

+Protected Attributes

+std::shared_ptr< Discretizationdiscretization_
 shared pointer, discretization object containing data to be written to file
 
+int fileNo_
 a counter that increments for every file written to disk
 
+

Detailed Description

+

Inteface class for writing simulation data output.

+

Constructor & Destructor Documentation

+ +

◆ OutputWriter()

+ +
+
+ + + + + + + + +
OutputWriter::OutputWriter (std::shared_ptr< Discretizationdiscretization)
+
+ +

Constructor.

+
Parameters
+ + +
discretizationdiscretization object containing data to be written to file
+
+
+ +
+
+

Member Function Documentation

+ +

◆ writeFile()

+ +
+
+ + + + + +
+ + + + + + + + +
virtual void OutputWriter::writeFile (double currentTime)
+
+pure virtual
+
+ +

Write current velocities to file.

+

Filename is output_<fileNo_>.vti

+
Parameters
+ + +
currentTimecurrent time of simulation
+
+
+ +

Implemented in OutputWriterParaview, and OutputWriterText.

+ +
+
+
The documentation for this class was generated from the following files:
    +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer.h
  • +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer.cpp
  • +
+
+ + + + diff --git a/documentation/html/classOutputWriter.png b/documentation/html/classOutputWriter.png new file mode 100644 index 0000000000000000000000000000000000000000..8c067052c2fdcc564b3d4ff58012906745de570c GIT binary patch literal 884 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y!~12~w06FES8t zp%Uy zGk)zmHG_HUyq$-xB*oFLY0rt|k?J*(YlqhmHrI*Z#S>y`AWZStR% zW##OCy3}o3?R1#)?A&^D<-O4zJSXTZ&_A3EKOEc|SQe;XWpL?9-o?n_VagyFpLU7& zfbL4R2Yi}r3My9_T9!yPObB5Xn3Tof6vXS`v5Jwy)09DRC7Z&N&sTaLTg>BWFfQ0P zeJ+MHUcDemnMr|~OaDySI3=j=1gEjqq%Xg(WU0LT?rAznWKx!jrpi^1AdgiOmrU?F z`{8T&)GOz+6S~%hEZh}zy<27L9nHH7pLMY4|NJU>Ofxr2?`h~#Tjl#nqRs< z?wnQW6`Rm|-u9aPbI$zr+xqWr$zT4lX_mO~ny~m_Jx|^Kt6v(w`ravt>)p4vIpOm6 zzj>8=mp%Ku~vvT$o+1x zaqrg!|`8Ot4}rXIZ8*#oaWkT$>4FO;(?w0*P6)|{+uldJ4r zZs$(mc2T}A?y!5|D&~#5q-VW;ZJpKUX|QAAG(Q#7`Ch#$TaTEjzN{!)F>%SX{j(B4 zVHKk6smOoTzopr E0Fh&y9smFU literal 0 HcmV?d00001 diff --git a/documentation/html/classOutputWriterParaview-members.html b/documentation/html/classOutputWriterParaview-members.html new file mode 100644 index 00000000..458d93be --- /dev/null +++ b/documentation/html/classOutputWriterParaview-members.html @@ -0,0 +1,91 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
OutputWriterParaview Member List
+
+
+ +

This is the complete list of members for OutputWriterParaview, including all inherited members.

+ + + + + + +
discretization_OutputWriterprotected
fileNo_OutputWriterprotected
OutputWriter(std::shared_ptr< Discretization > discretization)OutputWriter
OutputWriterParaview(std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask)OutputWriterParaview
writeFile(double currentTime)OutputWriterParaviewvirtual
+ + + + diff --git a/documentation/html/classOutputWriterParaview.html b/documentation/html/classOutputWriterParaview.html new file mode 100644 index 00000000..863b4e64 --- /dev/null +++ b/documentation/html/classOutputWriterParaview.html @@ -0,0 +1,207 @@ + + + + + + + +NumSim: OutputWriterParaview Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+ +
OutputWriterParaview Class Reference
+
+
+ +

Write *.vti files that can be viewed with ParaView. + More...

+ +

#include <output_writer_paraview.h>

+
+Inheritance diagram for OutputWriterParaview:
+
+
+ + +OutputWriter + +
+ + + + + + + + + + + + +

+Public Member Functions

 OutputWriterParaview (std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask)
 Constructor.
 
void writeFile (double currentTime)
 Write current velocities to file, filename is output_<count>.vti.
 
- Public Member Functions inherited from OutputWriter
 OutputWriter (std::shared_ptr< Discretization > discretization)
 Constructor.
 
+ + + + + + + + +

+Additional Inherited Members

- Protected Attributes inherited from OutputWriter
+std::shared_ptr< Discretizationdiscretization_
 shared pointer, discretization object containing data to be written to file
 
+int fileNo_
 a counter that increments for every file written to disk
 
+

Detailed Description

+

Write *.vti files that can be viewed with ParaView.

+

The mesh that can be visualized in ParaView corresponds to the mesh of the computational domain. All values are given for the nodes of the mesh, i.e., the corners of each cell. This means, values will be interpolated because the values are stored at positions given by the staggered grid.

+

Constructor & Destructor Documentation

+ +

◆ OutputWriterParaview()

+ +
+
+ + + + + + + + + + + + + + + + + + +
OutputWriterParaview::OutputWriterParaview (std::shared_ptr< Discretizationdiscretization,
std::shared_ptr< Maskmask 
)
+
+ +

Constructor.

+
Parameters
+ + +
discretizationshared pointer to the discretization object that will contain all the data to be written to the file
+
+
+ +
+
+

Member Function Documentation

+ +

◆ writeFile()

+ +
+
+ + + + + +
+ + + + + + + + +
void OutputWriterParaview::writeFile (double currentTime)
+
+virtual
+
+ +

Write current velocities to file, filename is output_<count>.vti.

+
Parameters
+ + +
currentTimecurrent time in simulation
+
+
+ +

Implements OutputWriter.

+ +
+
+
The documentation for this class was generated from the following files:
    +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer_paraview.h
  • +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer_paraview.cpp
  • +
+
+ + + + diff --git a/documentation/html/classOutputWriterParaview.png b/documentation/html/classOutputWriterParaview.png new file mode 100644 index 0000000000000000000000000000000000000000..b855af00854c54a33e2348e52457f01c4aab678a GIT binary patch literal 611 zcmeAS@N?(olHy`uVBq!ia0vp^9Y7qw!3-q7a-LNJQqloFA+G=b{|7Q(y!l$%e`vXd zfo6fk^fNCG95?_J51w>+1yGK&B*-tA0mugfbEer>7#JAedAc};R4~4s`?_znfk3mY za%kOu^?R2XB-w8i-I{kd!*uG|RF6Z`Q`-I=HSxX7am;1X{`V}3nO*{umU$~Y{nx!+ z#rOLGnP^!jmCCc>4syzEiR&9=OqEXt$1_B--MMF`f4=5UTr9KTGP4=gSC+0h@A>J9 zeuK@HIb|PrP5$`p;q%p>wLIh_rYF9=&^Y1A_kZUVyl4Ga@t9G$Jy@RkW9B!@O)+zu zYw}zVl`om*zIv9J1yg6J^Q8N~j_SYOU#sl#X{K5O@S&ezt2^e^`^VSwCT~`S|WDG{l0R*TA@(4cKJ8$1xlrT$~V{WtyWWUKU~LF6mUap zQssPyjfW2+h0Eh;;ZM7kE}MQuu|s8N{insVfsX(AUi;(}Ag$auCFm5xKPJY~0+}0< SI + + + + + + +NumSim: Member List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
OutputWriterText Member List
+
+
+ +

This is the complete list of members for OutputWriterText, including all inherited members.

+ + + + + + +
discretization_OutputWriterprotected
fileNo_OutputWriterprotected
OutputWriter(std::shared_ptr< Discretization > discretization)OutputWriterText
writeFile(double currentTime)OutputWriterTextvirtual
writePressureFile()OutputWriterText
+ + + + diff --git a/documentation/html/classOutputWriterText.html b/documentation/html/classOutputWriterText.html new file mode 100644 index 00000000..78445375 --- /dev/null +++ b/documentation/html/classOutputWriterText.html @@ -0,0 +1,195 @@ + + + + + + + +NumSim: OutputWriterText Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+ +
OutputWriterText Class Reference
+
+
+ +

Write *.txt files that are useful for debugging. + More...

+ +

#include <output_writer_text.h>

+
+Inheritance diagram for OutputWriterText:
+
+
+ + +OutputWriter + +
+ + + + + + + + + + + + + + + +

+Public Member Functions

void writeFile (double currentTime)
 Write current velocities to file.
 
void writePressureFile ()
 Write only current values of pressure to file.
 
OutputWriter (std::shared_ptr< Discretization > discretization)
 Default constructor.
 
- Public Member Functions inherited from OutputWriter
 OutputWriter (std::shared_ptr< Discretization > discretization)
 Constructor.
 
+ + + + + + + + +

+Additional Inherited Members

- Protected Attributes inherited from OutputWriter
+std::shared_ptr< Discretizationdiscretization_
 shared pointer, discretization object containing data to be written to file
 
+int fileNo_
 a counter that increments for every file written to disk
 
+

Detailed Description

+

Write *.txt files that are useful for debugging.

+

All values are written to the file as they are stored in the field variables, no interpolation takes place.

+

Member Function Documentation

+ +

◆ writeFile()

+ +
+
+ + + + + +
+ + + + + + + + +
void OutputWriterText::writeFile (double currentTime)
+
+virtual
+
+ +

Write current velocities to file.

+

Filename is output_<count>.vti

+
Parameters
+ + +
currentTimecurrent time of simulation
+
+
+ +

Implements OutputWriter.

+ +
+
+ +

◆ writePressureFile()

+ +
+
+ + + + + + + +
void OutputWriterText::writePressureFile ()
+
+ +

Write only current values of pressure to file.

+

Filename is pressure_<count>.txt

+ +
+
+
The documentation for this class was generated from the following files:
    +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer_text.h
  • +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer_text.cpp
  • +
+
+ + + + diff --git a/documentation/html/classOutputWriterText.png b/documentation/html/classOutputWriterText.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb73cca6234b65ec1dd053aa25f1cba6f2c682c GIT binary patch literal 534 zcmV+x0_pvUP)vTJr#LVva2S`&=)l0h|Ns9}lGCUF000SeQchC<|NsC0|NsC0Hv*f~0004@ zNkl5QK*zY3Bd`;wvtcm14Aqp~)SF(K5U|?7H?dVvKQ)5J_@|7K$VX z^mSBtUcO6m*Pcf5ikwA~2kN4>HE!V*RBswd*LtYDeo zuAsJ-A8)?p+jlp0BD{=hjS@;((4a`N(cP$AQ1_zT>6?6hfZ89meOLL{G3t}3+;?TA zRx7X?J(RCNlHBX+zs1QnLy~9u-zbtC)IyQufaaoNjB$zp;B!3yV28n(i}HH-WBL4!$cZwOWDI=%IWCy1P4ETY-|)>fS$+e~6N#`?OG!G@!Yt5JH%u YAFnW1BtDjmU;qFB07*qoM6N<$g7_EsVgLXD literal 0 HcmV?d00001 diff --git a/documentation/html/classPressureSolver-members.html b/documentation/html/classPressureSolver-members.html new file mode 100644 index 00000000..16f89391 --- /dev/null +++ b/documentation/html/classPressureSolver-members.html @@ -0,0 +1,100 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
PressureSolver Member List
+
+
+ +

This is the complete list of members for PressureSolver, including all inherited members.

+ + + + + + + + + + + + + + + +
boundary_PressureSolverprotected
calculateResiduum()PressureSolverprotected
discretization_PressureSolverprotected
dx2 (defined in PressureSolver)PressureSolver
dy2PressureSolver
epsilon_PressureSolverprotected
i_begPressureSolverprotected
i_endPressureSolverprotected
j_begPressureSolverprotected
j_endPressureSolverprotected
maximumNumberOfIterations_PressureSolverprotected
PressureSolver(std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)PressureSolver
setBoundaryValues()PressureSolverprotected
solve()=0PressureSolverpure virtual
+ + + + diff --git a/documentation/html/classPressureSolver.html b/documentation/html/classPressureSolver.html new file mode 100644 index 00000000..4b96bb3d --- /dev/null +++ b/documentation/html/classPressureSolver.html @@ -0,0 +1,286 @@ + + + + + + + +NumSim: PressureSolver Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
+ +

Solves the Poisson problem for the pressure. + More...

+ +

#include <pressure_solver.h>

+
+Inheritance diagram for PressureSolver:
+
+
+ + +GaussSeidel +SOR + +
+ + + + + + + + +

+Public Member Functions

 PressureSolver (std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
 Constructor.
 
virtual void solve ()=0
 virtual function that starts solver.
 
+ + + + + + +

+Public Attributes

+double dx2
 
+double dy2
 squared mesh widths
 
+ + + + + + + +

+Protected Member Functions

void setBoundaryValues ()
 Set the Boundary Values.
 
+double calculateResiduum ()
 calculate residuum of current time step
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Attributes

+int i_beg
 begin of loop for rhs in x direction
 
+int i_end
 end of loop for rhs in x direction
 
+int j_beg
 begin of loop for rhs in y direction
 
+int j_end
 end of loop for rhs in y direction
 
+std::shared_ptr< Discretizationdiscretization_
 object holding the needed field variables for rhs and p
 
+std::shared_ptr< Boundaryboundary_
 object managing boundary for obstacle and surface tension
 
+double epsilon_
 tolerance for the solver
 
+int maximumNumberOfIterations_
 maximum number of iterations
 
+

Detailed Description

+

Solves the Poisson problem for the pressure.

+

Interface for the pressure solver. It computes the pressure field variable such that the continuity equation is fulfilled.

+

Constructor & Destructor Documentation

+ +

◆ PressureSolver()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PressureSolver::PressureSolver (std::shared_ptr< Discretizationdiscretization,
double epsilon,
int maximumNumberOfIterations,
std::shared_ptr< Boundaryboundary 
)
+
+ +

Constructor.

+
Parameters
+ + + + + +
discretizationinstance of Discretization holding the needed field variables for rhs and p
epsilontolerance for the solver
maximumNumberOfIterationsmaximum of iteration
boundaryobject managing boundary for obstacle and surface tension
+
+
+ +
+
+

Member Function Documentation

+ +

◆ setBoundaryValues()

+ +
+
+ + + + + +
+ + + + + + + +
void PressureSolver::setBoundaryValues ()
+
+protected
+
+ +

Set the Boundary Values.

+

Account for homogenous Neuman BC Has to be called every iteration

+ +
+
+ +

◆ solve()

+ +
+
+ + + + + +
+ + + + + + + +
virtual void PressureSolver::solve ()
+
+pure virtual
+
+ +

virtual function that starts solver.

+ +

Implemented in GaussSeidel, and SOR.

+ +
+
+
The documentation for this class was generated from the following files:
    +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/pressure_solver.h
  • +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/pressure_solver.cpp
  • +
+
+ + + + diff --git a/documentation/html/classPressureSolver.png b/documentation/html/classPressureSolver.png new file mode 100644 index 0000000000000000000000000000000000000000..c4c751c264dc13283a3b381339d7aaa6caf83ff6 GIT binary patch literal 675 zcmeAS@N?(olHy`uVBq!ia0vp^mw-5cgBeIh+uvRcq@)9ULR|m<{|{uoc=NTi|Il&^ z1I+@7>1SRXIB)=1df`A*p zeCN#X^^bPvMzUy75|@cT$#-EbJr!SEeT-h`7LOp%Il7^O}Q(@3*0lCjzouRJ-rn7=<3oXqAPcuUvlNm&$MT=WA191 zvL=fyO}Hl4d#x`hGWA)|t(6tqi{;Yt&RyTNO#JqzZm+bo^oK|eYSErK^DD@OEdqyb zGWeWjD$rfGe2dQX;$8DD^D zE0r(3{WX7E`Tn4~gYVD2{dIgnoQAEOqUZS={T2b5`xB~_J=fpV5>?)P-dpW#m}HPk zOUcSx?Ne5LwRh9x&D;A#`K76E=$a*8E7U*sg`KLr&9^yXepsfkb(q|#r~CYG9Ej5r zd+=|{+#}idf_JQmJ*Iu{*McOGNnhCYr@We(A6<5T$I9B~rwHq)$ literal 0 HcmV?d00001 diff --git a/documentation/html/classSOR-members.html b/documentation/html/classSOR-members.html new file mode 100644 index 00000000..98ccee2b --- /dev/null +++ b/documentation/html/classSOR-members.html @@ -0,0 +1,101 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
SOR Member List
+
+
+ +

This is the complete list of members for SOR, including all inherited members.

+ + + + + + + + + + + + + + + + +
boundary_PressureSolverprotected
calculateResiduum()PressureSolverprotected
discretization_PressureSolverprotected
dx2 (defined in PressureSolver)PressureSolver
dy2PressureSolver
epsilon_PressureSolverprotected
i_begPressureSolverprotected
i_endPressureSolverprotected
j_begPressureSolverprotected
j_endPressureSolverprotected
maximumNumberOfIterations_PressureSolverprotected
PressureSolver(std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)PressureSolver
setBoundaryValues()PressureSolverprotected
solve() overrideSORvirtual
SOR(const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary, double omega)SOR
+ + + + diff --git a/documentation/html/classSOR.html b/documentation/html/classSOR.html new file mode 100644 index 00000000..9def3f81 --- /dev/null +++ b/documentation/html/classSOR.html @@ -0,0 +1,260 @@ + + + + + + + +NumSim: SOR Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+ +
SOR Class Reference
+
+
+ +

Successive over-relaxation solver. + More...

+ +

#include <sor.h>

+
+Inheritance diagram for SOR:
+
+
+ + +PressureSolver + +
+ + + + + + + + + + + + +

+Public Member Functions

 SOR (const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary, double omega)
 Constructor.
 
void solve () override
 override function that starts solver.
 
- Public Member Functions inherited from PressureSolver
 PressureSolver (std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
 Constructor.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Additional Inherited Members

- Public Attributes inherited from PressureSolver
+double dx2
 
+double dy2
 squared mesh widths
 
- Protected Member Functions inherited from PressureSolver
void setBoundaryValues ()
 Set the Boundary Values.
 
+double calculateResiduum ()
 calculate residuum of current time step
 
- Protected Attributes inherited from PressureSolver
+int i_beg
 begin of loop for rhs in x direction
 
+int i_end
 end of loop for rhs in x direction
 
+int j_beg
 begin of loop for rhs in y direction
 
+int j_end
 end of loop for rhs in y direction
 
+std::shared_ptr< Discretizationdiscretization_
 object holding the needed field variables for rhs and p
 
+std::shared_ptr< Boundaryboundary_
 object managing boundary for obstacle and surface tension
 
+double epsilon_
 tolerance for the solver
 
+int maximumNumberOfIterations_
 maximum number of iterations
 
+

Detailed Description

+

Successive over-relaxation solver.

+

Constructor & Destructor Documentation

+ +

◆ SOR()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SOR::SOR (const std::shared_ptr< Discretization > & data,
double epsilon,
int maximumNumberOfIterations,
std::shared_ptr< Boundaryboundary,
double omega 
)
+
+ +

Constructor.

+
Parameters
+ + + + + +
datainstance of Discretization holding the needed field variables for rhs and p
epsilontolerance for the solver
maximumNumberOfIterationsmaximum of iteration
omegarelaxation factor
+
+
+ +
+
+

Member Function Documentation

+ +

◆ solve()

+ +
+
+ + + + + +
+ + + + + + + +
void SOR::solve ()
+
+overridevirtual
+
+ +

override function that starts solver.

+ +

Implements PressureSolver.

+ +
+
+
The documentation for this class was generated from the following files:
    +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/sor.h
  • +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/sor.cpp
  • +
+
+ + + + diff --git a/documentation/html/classSOR.png b/documentation/html/classSOR.png new file mode 100644 index 0000000000000000000000000000000000000000..78abfb4799f77e7cea02bd428cd48ca3c484962c GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^DL@>+!3-pCTvxaYq@)9ULR|m<{|{uoc=NTi|Il&^ z1I+@7>1SRXIB)c)B=-R4~4s`!?^e0*~u@ z{h*Tj|2wDW@Gvc1Y0PUWzh3=0C?%h1 zZaIOcfAu@H`3GL?xTW-RdETYfDyVt(B{PkG9xaU136_uCI)~aYOHIZc4agvQ;bEM+UZLHHoC*3u?zscp3+f`8^ zh7ZC*3 + + + + + + +NumSim: Member List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
StaggeredGrid Member List
+
+
+ +

This is the complete list of members for StaggeredGrid, including all inherited members.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
dx() constStaggeredGrid
dy() constStaggeredGrid
f(int i, int j)StaggeredGrid
f_StaggeredGridprotected
fIBegin() constStaggeredGrid
fIEnd() constStaggeredGrid
fJBegin() constStaggeredGrid
fJEnd() constStaggeredGrid
g(int i, int j)StaggeredGrid
g_StaggeredGridprotected
gIBegin() constStaggeredGrid
gIEnd() constStaggeredGrid
gJBegin() constStaggeredGrid
gJEnd() constStaggeredGrid
meshWidth() constStaggeredGrid
meshWidth_StaggeredGridprotected
nCells() constStaggeredGrid
nCells_StaggeredGridprotected
p() constStaggeredGrid
p(int i, int j) constStaggeredGrid
p(int i, int j)StaggeredGrid
p_StaggeredGridprotected
pIBegin() constStaggeredGrid
pIEnd() constStaggeredGrid
pJBegin() constStaggeredGrid
pJEnd() constStaggeredGrid
rhs() constStaggeredGrid
rhs(int i, int j)StaggeredGrid
rhs_StaggeredGridprotected
rhsIBegin() constStaggeredGrid
rhsIEnd() constStaggeredGrid
rhsJBegin() constStaggeredGrid
rhsJEnd() constStaggeredGrid
StaggeredGrid(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)StaggeredGrid
u() constStaggeredGrid
u(int i, int j) constStaggeredGrid
u(int i, int j)StaggeredGrid
u_StaggeredGridprotected
uIBegin() constStaggeredGrid
uIEnd() constStaggeredGrid
uJBegin() constStaggeredGrid
uJEnd() constStaggeredGrid
v() constStaggeredGrid
v(int i, int j) constStaggeredGrid
v(int i, int j)StaggeredGrid
v_StaggeredGridprotected
vIBegin() constStaggeredGrid
vIEnd() constStaggeredGrid
vJBegin() constStaggeredGrid
vJEnd() constStaggeredGrid
+ + + + diff --git a/documentation/html/classStaggeredGrid.html b/documentation/html/classStaggeredGrid.html new file mode 100644 index 00000000..83166a46 --- /dev/null +++ b/documentation/html/classStaggeredGrid.html @@ -0,0 +1,354 @@ + + + + + + + +NumSim: StaggeredGrid Class Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+ +
StaggeredGrid Class Reference
+
+
+ +

Create field variables and define limits for the indices. + More...

+ +

#include <staggered_grid.h>

+
+Inheritance diagram for StaggeredGrid:
+
+
+ + +Discretization +CentralDifferences +DonorCell + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Public Member Functions

 StaggeredGrid (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
 Constructor.
 
+const std::array< double, 2 > meshWidth () const
 Get the length of a single cell in x and y directions.
 
+const std::array< int, 2 > nCells () const
 Get number of cells in x and y directions.
 
+const FieldVariableu () const
 Get a reference to the field variable u.
 
+const FieldVariablev () const
 Get a reference to the field variable v.
 
+const FieldVariablep () const
 Get a reference to the field variable p.
 
+const FieldVariablerhs () const
 Get a reference to the field variable rhs.
 
+double u (int i, int j) const
 Access value of u in element (i,j), declared constant.
 
+double & u (int i, int j)
 Access value of u in element (i,j)
 
+double v (int i, int j) const
 Access value of v in element (i,j), declared constant.
 
+double & v (int i, int j)
 Access value of v in element (i,j)
 
+double p (int i, int j) const
 Access value of p in element (i,j), declared constant.
 
+double & p (int i, int j)
 Access value of p in element (i,j)
 
+double & f (int i, int j)
 Access value of f in element (i,j)
 
+double & g (int i, int j)
 Access value of g in element (i,j)
 
+double & rhs (int i, int j)
 Access value of rhs in element (i,j)
 
+double dx () const
 Get the mesh width in x-direction.
 
+double dy () const
 Get the mesh width in y-direction.
 
+int uIBegin () const
 first valid index for u in x direction
 
+int uIEnd () const
 one after last valid index for u in x direction
 
+int uJBegin () const
 first valid index for u in y direction
 
+int uJEnd () const
 one after last valid index for u in y direction
 
+int vIBegin () const
 first valid index for v in x direction
 
+int vIEnd () const
 one after last valid index for v in x direction
 
+int vJBegin () const
 first valid index for v in y direction
 
+int vJEnd () const
 one after last valid index for v in y direction
 
+int pIBegin () const
 first valid index for p in x direction
 
+int pIEnd () const
 one after last valid index for p in x direction
 
+int pJBegin () const
 first valid index for p in y direction
 
+int pJEnd () const
 one after last valid index for p in y direction
 
+int fIBegin () const
 first valid index for f in x direction
 
+int fIEnd () const
 one after last valid index for f in x direction
 
+int fJBegin () const
 first valid index for f in y direction
 
+int fJEnd () const
 one after last valid index for f in y direction
 
+int gIBegin () const
 first valid index for g in x direction
 
+int gIEnd () const
 one after last valid index for g in x direction
 
+int gJBegin () const
 first valid index for g in y direction
 
+int gJEnd () const
 one after last valid index for g in y direction
 
+int rhsIBegin () const
 first valid index for rhs in x direction
 
+int rhsIEnd () const
 one after last valid index for rhs in x direction
 
+int rhsJBegin () const
 first valid index for rhs in y direction
 
+int rhsJEnd () const
 one after last valid index for rhs in y direction
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Protected Attributes

+const std::array< int, 2 > nCells_
 array containing number of cells in x and y directions
 
+const std::array< double, 2 > meshWidth_
 array containing the sizes of cell edges in x and y directions
 
+FieldVariable u_
 instance of the field variable u
 
+FieldVariable v_
 instance of the field variable v
 
+FieldVariable p_
 instance of the field variable p
 
+FieldVariable f_
 instance of the field variable f
 
+FieldVariable g_
 instance of the field variable g
 
+FieldVariable rhs_
 instance of the field variable rhs
 
+

Detailed Description

+

Create field variables and define limits for the indices.

+

Create the necessary u, v, p, f, g, rhs field variables and define the first valid index for each of the field variables, as well as the (one after) last valid index

+

Constructor & Destructor Documentation

+ +

◆ StaggeredGrid()

+ +
+
+ + + + + + + + + + + + + + + + + + +
StaggeredGrid::StaggeredGrid (std::array< int, 2 > nCells,
std::array< double, 2 > meshWidth 
)
+
+ +

Constructor.

+
Parameters
+ + + +
nCellsarray containing number of cells in x and y directions
meshWidtharray containing the length of a single cell in x and y directions
+
+
+ +
+
+
The documentation for this class was generated from the following files:
    +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/staggered_grid.h
  • +
  • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/staggered_grid.cpp
  • +
+
+ + + + diff --git a/documentation/html/classStaggeredGrid.png b/documentation/html/classStaggeredGrid.png new file mode 100644 index 0000000000000000000000000000000000000000..372a826c21c16a55ad438007dec0da6cc630b22d GIT binary patch literal 1049 zcmeAS@N?(olHy`uVBq!ia0vp^KY+M{gBeKv)x8GdNC)_Yxc>kDAIN<1=4)yHq2(3^ zngtTm&%8Kr-~doOc+%w+KsnBmAirP+ARi3OnPy*MU|?S2>Eakt!T5IW>q)B>1lVr( zYh~a2-|24>$L3sCY%MVT<|gLuhAljg;~Tb1v?XRRI7G7^#(r$izdjF$pW_)=3saNav zrMzFd-@ifK`f*yCq~40NXYM`Ld9;5{gz@I*7H9kN8UISY4{qHx^X74m!UnUJ9Wx_M zon#j99yZ|NWw6jycIf}2W!E=%)_1MCkMAz;iT-%v6+^AyBL-U%@N(s)Q{qy5G?$7q zW_V9p0tv8~NvnWH8v-i!YC{dMkd`4G|KH*Nv$SZW_NBi~4x4{@$N5*! zg{Lq1@7ck;Me&I0N^mR+Oka`(iq;^nm5dC_Q(0b2j5~UKWANv=qx$!1XO(NqManMF z2L_Wm0zdHSd2F$bbphkqa-AcLT0)N)bb$fd1vG^ls7MKzHkt(3S9kzzQ2KmdRO%En38+y~&r`JU(c!25lZ^Our`IpfD}MdO_$t?8m6z%B z1n$decz!?e+h_HpCGt0pnoD~A4izXryLq>Y?OEeTM_WCMt}i@q{3!3rpLcDk=Fcs! z-LiYU_2;E+Th=>1sM7Oof8_d6b)T1U{QRnjKirRAA9(#hci#4wb9S(49{+l#N~V3k zO5B{v>a=Y?%8zV*q);8c$HFeZCf+7Kvh2=1q5aP~7yq~xB@$oMy;}arb-wp4zmy-f zr+Nj={M2_p=MMA2I*+pL*7L6Zd)&8w*46qs_tL+%JO33<|MTvQ-ookgls#R!?iY%0 z)hj(C`R9l1clN~kee(Z1*X*lZeA;-r`2Ut2Dxr@#3q60?fI@)tBQO%WKw>IKq`Q_+ i396k_;iY-?x%__hDNh>;QdR>qF@vY8pUXO@geCw>hW{)8 literal 0 HcmV?d00001 diff --git a/documentation/html/classes.html b/documentation/html/classes.html new file mode 100644 index 00000000..7297e602 --- /dev/null +++ b/documentation/html/classes.html @@ -0,0 +1,119 @@ + + + + + + + +NumSim: Class Index + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Index
+
+ + + + + diff --git a/documentation/html/clipboard.js b/documentation/html/clipboard.js new file mode 100644 index 00000000..42c1fb0e --- /dev/null +++ b/documentation/html/clipboard.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Copy to clipboard" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +$(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + $(clipboard_div).click(function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/documentation/html/closed.png b/documentation/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/documentation/html/computation_8h_source.html b/documentation/html/computation_8h_source.html new file mode 100644 index 00000000..5f7e6871 --- /dev/null +++ b/documentation/html/computation_8h_source.html @@ -0,0 +1,158 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/computation.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
computation.h
+
+
+
1#pragma once
+
2
+
3#include "discretization/discretization.h"
+
4#include "discretization/donor_cell.h"
+
5#include "discretization/central_differences.h"
+
6
+
7#include "solver/pressure_solver.h"
+
8#include "solver/sor.h"
+
9#include "solver/gauss_seidel.h"
+
10
+
11#include "output_writer/output_writer_paraview.h"
+
12#include "output_writer/output_writer_text.h"
+
13#include "settings_parser/settings.h"
+
14
+
15#include "boundary/boundary.h"
+
16#include "boundary/mask.h"
+
17#include "surface/fluid_tracer.h"
+
18#include <unistd.h>
+
19
+
20#include <cmath>
+
21#include <algorithm>
+
22#include <iostream>
+
23
+
+ +
31{
+
32public:
+
39 void initialize(int argc, char *argv[]);
+
40
+
45 void runSimulation();
+
46
+
47
+
48
+
49private:
+
55 void computeTimeStepWidth(double currentTime);
+
56
+
60 void applyBoundaryValues();
+
61
+
65 void computePreliminaryVelocities();
+
66
+
70 void computeRightHandSide();
+
71
+
75 void computePressure();
+
76
+
81 void computeVelocities();
+
82
+
83 Settings settings_;
+
84 std::shared_ptr<Discretization> discretization_;
+
85
+
86 std::shared_ptr<Mask> mask_;
+
87 std::shared_ptr<Boundary> boundary_;
+
88 std::shared_ptr<FluidTracer> fluidTracer_;
+
89
+
90 std::unique_ptr<PressureSolver> pressureSolver_;
+
91 std::unique_ptr<OutputWriterParaview> outputWriterParaview_;
+
92 std::unique_ptr<OutputWriterText> outputWriterText_;
+
93 std::array<double, 2> meshWidth_;
+
94 double dt_;
+
95};
+
+
96
+
97
+
Computation of Simulation.
Definition computation.h:31
+
void initialize(int argc, char *argv[])
Initialize the simulation with settings from .txt file.
Definition computation.cpp:6
+
void runSimulation()
run the whole simulation until t_end
Definition computation.cpp:66
+
All settings that parametrize a simulation run.
Definition settings.h:14
+
+ + + + diff --git a/documentation/html/dir_041db6ad6a3d44280e40e5af409429cb.html b/documentation/html/dir_041db6ad6a3d44280e40e5af409429cb.html new file mode 100644 index 00000000..c8aa3abe --- /dev/null +++ b/documentation/html/dir_041db6ad6a3d44280e40e5af409429cb.html @@ -0,0 +1,97 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver Directory Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
solver Directory Reference
+
+
+ + + + + + + + +

+Files

 gauss_seidel.h
 
 pressure_solver.h
 
 sor.h
 
+
+ + + + diff --git a/documentation/html/dir_2725064ac5d6db7b2425ad4e379e8748.html b/documentation/html/dir_2725064ac5d6db7b2425ad4e379e8748.html new file mode 100644 index 00000000..89c7df26 --- /dev/null +++ b/documentation/html/dir_2725064ac5d6db7b2425ad4e379e8748.html @@ -0,0 +1,95 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/boundary Directory Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
boundary Directory Reference
+
+
+ + + + + + +

+Files

 boundary.h
 
 mask.h
 
+
+ + + + diff --git a/documentation/html/dir_29398f723566cb24cda620b0fb0566c4.html b/documentation/html/dir_29398f723566cb24cda620b0fb0566c4.html new file mode 100644 index 00000000..bcdc2882 --- /dev/null +++ b/documentation/html/dir_29398f723566cb24cda620b0fb0566c4.html @@ -0,0 +1,93 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/settings_parser Directory Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
settings_parser Directory Reference
+
+
+ + + + +

+Files

 settings.h
 
+
+ + + + diff --git a/documentation/html/dir_452baf35e1d7639c9f2a5ece4ec85855.html b/documentation/html/dir_452baf35e1d7639c9f2a5ece4ec85855.html new file mode 100644 index 00000000..c29b95f2 --- /dev/null +++ b/documentation/html/dir_452baf35e1d7639c9f2a5ece4ec85855.html @@ -0,0 +1,95 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/storage Directory Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
storage Directory Reference
+
+
+ + + + + + +

+Files

 array2D.h
 
 field_variable.h
 
+
+ + + + diff --git a/documentation/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/documentation/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 00000000..95f70267 --- /dev/null +++ b/documentation/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,110 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src Directory Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
src Directory Reference
+
+
+ + + + + + + + + + + + + + + + +

+Directories

 boundary
 
 discretization
 
 output_writer
 
 settings_parser
 
 solver
 
 storage
 
 surface
 
+ + + +

+Files

 computation.h
 
+
+ + + + diff --git a/documentation/html/dir_93b0d6a552827721ec9247642283aaa7.html b/documentation/html/dir_93b0d6a552827721ec9247642283aaa7.html new file mode 100644 index 00000000..c6de8009 --- /dev/null +++ b/documentation/html/dir_93b0d6a552827721ec9247642283aaa7.html @@ -0,0 +1,93 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/surface Directory Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
surface Directory Reference
+
+
+ + + + +

+Files

 fluid_tracer.h
 
+
+ + + + diff --git a/documentation/html/dir_b0b9c4b8ebed4a07d44b9aa635c19fe7.html b/documentation/html/dir_b0b9c4b8ebed4a07d44b9aa635c19fe7.html new file mode 100644 index 00000000..01cf9faf --- /dev/null +++ b/documentation/html/dir_b0b9c4b8ebed4a07d44b9aa635c19fe7.html @@ -0,0 +1,97 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer Directory Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
output_writer Directory Reference
+
+
+ + + + + + + + +

+Files

 output_writer.h
 
 output_writer_paraview.h
 
 output_writer_text.h
 
+
+ + + + diff --git a/documentation/html/dir_e7c1ed2d2d4c4bb5d8a9744d9e98c346.html b/documentation/html/dir_e7c1ed2d2d4c4bb5d8a9744d9e98c346.html new file mode 100644 index 00000000..0e3dd74c --- /dev/null +++ b/documentation/html/dir_e7c1ed2d2d4c4bb5d8a9744d9e98c346.html @@ -0,0 +1,99 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization Directory Reference + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
discretization Directory Reference
+
+
+ + + + + + + + + + +

+Files

 central_differences.h
 
 discretization.h
 
 donor_cell.h
 
 staggered_grid.h
 
+
+ + + + diff --git a/documentation/html/discretization_8h_source.html b/documentation/html/discretization_8h_source.html new file mode 100644 index 00000000..db3706f1 --- /dev/null +++ b/documentation/html/discretization_8h_source.html @@ -0,0 +1,137 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/discretization.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
discretization.h
+
+
+
1#pragma once
+
2
+
3#include <array>
+
4#include <vector>
+
5#include "staggered_grid.h"
+
6
+
+ +
16{
+
17public:
+
24 Discretization(std::array<int, 2> nCells, std::array<double, 2> meshWidth);
+
25
+
29 virtual double computeDu2Dx(int i, int j) const = 0;
+
33 virtual double computeDv2Dy(int i, int j) const = 0;
+
34
+
38 virtual double computeDuvDx(int i, int j) const = 0;
+
42 virtual double computeDuvDy(int i, int j) const = 0;
+
43
+
47 virtual double computeD2uDx2(int i, int j) const;
+
51 virtual double computeD2uDy2(int i, int j) const;
+
55 virtual double computeD2vDx2(int i, int j) const;
+
59 virtual double computeD2vDy2(int i, int j) const;
+
60
+
64 virtual double computeDpDx(int i, int j) const;
+
68 virtual double computeDpDy(int i, int j) const;
+
69
+
70
+
71};
+
+
72
+
Computes derivatives included in governing equations.
Definition discretization.h:16
+
virtual double computeDuvDy(int i, int j) const =0
Calculate first derivative of u*v with respect to y.
+
virtual double computeD2uDy2(int i, int j) const
Calculate second derivative of u with respect to y.
Definition discretization.cpp:12
+
Discretization(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
Constructor.
Definition discretization.cpp:3
+
virtual double computeD2vDx2(int i, int j) const
Calculate second derivative of v with respect to x.
Definition discretization.cpp:17
+
virtual double computeD2vDy2(int i, int j) const
Calculate second derivative of v with respect to y.
Definition discretization.cpp:22
+
virtual double computeD2uDx2(int i, int j) const
Calculate second derivative of u with respect to x.
Definition discretization.cpp:7
+
virtual double computeDv2Dy(int i, int j) const =0
Calculate first derivative of v^2 with respect to y.
+
virtual double computeDpDy(int i, int j) const
Calculate first derivative of p with respect to y.
Definition discretization.cpp:32
+
virtual double computeDuvDx(int i, int j) const =0
Calculate first derivative of u*v with respect to x.
+
virtual double computeDu2Dx(int i, int j) const =0
Calculate first derivative of u^2 with respect to x.
+
virtual double computeDpDx(int i, int j) const
Calculate first derivative of p with respect to x.
Definition discretization.cpp:27
+
Create field variables and define limits for the indices.
Definition staggered_grid.h:15
+
const std::array< double, 2 > meshWidth() const
Get the length of a single cell in x and y directions.
Definition staggered_grid.cpp:14
+
const std::array< int, 2 > nCells() const
Get number of cells in x and y directions.
Definition staggered_grid.cpp:19
+
+ + + + diff --git a/documentation/html/doc.svg b/documentation/html/doc.svg new file mode 100644 index 00000000..0b928a53 --- /dev/null +++ b/documentation/html/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/documentation/html/docd.svg b/documentation/html/docd.svg new file mode 100644 index 00000000..ac18b275 --- /dev/null +++ b/documentation/html/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/documentation/html/donor__cell_8h_source.html b/documentation/html/donor__cell_8h_source.html new file mode 100644 index 00000000..21200449 --- /dev/null +++ b/documentation/html/donor__cell_8h_source.html @@ -0,0 +1,123 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/donor_cell.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
donor_cell.h
+
+
+
1#pragma once
+
2
+
3#include <array>
+
4#include <vector>
+
5#include <cmath>
+
6#include "discretization.h"
+
7
+
+ +
16{
+
17public:
+
25 DonorCell(std::array<int, 2> nCells, std::array<double, 2> meshWidth, double alpha);
+
26
+
31 double computeDu2Dx(int i, int j) const override;
+
36 double computeDv2Dy(int i, int j) const override;
+
41 double computeDuvDx(int i, int j) const override;
+
46 double computeDuvDy(int i, int j) const override;
+
47
+
48private:
+
49 const double alpha_;
+
50};
+
+
Computes derivatives included in governing equations.
Definition discretization.h:16
+
Discretizes the problem using the donor cell scheme.
Definition donor_cell.h:16
+
double computeDv2Dy(int i, int j) const override
Calculate first derivative of v^2 with respect to y with the donor cell Scheme.
Definition donor_cell.cpp:49
+
double computeDu2Dx(int i, int j) const override
Calculate first derivative of u^2 with respect to x with the donor cell Scheme.
Definition donor_cell.cpp:36
+
double computeDuvDy(int i, int j) const override
Calculate first derivative of u*v with respect to y with the donor cell Scheme.
Definition donor_cell.cpp:22
+
DonorCell(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth, double alpha)
Constructor.
Definition donor_cell.cpp:3
+
double computeDuvDx(int i, int j) const override
Calculate first derivative of u*v with respect to x with the donor cell Scheme.
Definition donor_cell.cpp:8
+
const std::array< double, 2 > meshWidth() const
Get the length of a single cell in x and y directions.
Definition staggered_grid.cpp:14
+
const std::array< int, 2 > nCells() const
Get number of cells in x and y directions.
Definition staggered_grid.cpp:19
+
+ + + + diff --git a/documentation/html/doxygen.css b/documentation/html/doxygen.css new file mode 100644 index 00000000..9193852a --- /dev/null +++ b/documentation/html/doxygen.css @@ -0,0 +1,2080 @@ +/* The standard CSS for doxygen 1.10.0*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--fragment-copy-ok-color: #2EC82E; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--fragment-copy-ok-color: #0EA80E; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; + overflow-y: hidden; + position: relative; + min-height: 28px; + margin: 4px 4px 4px 2px; + padding: 2px 2px 3px 2px; + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + border-radius : 2px; + color: var(--fragment-foreground-color); +} + +pre.fragment { + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: var(--font-family-monospace); +} + +.clipboard { + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; + overflow: auto; + fill: var(--fragment-foreground-color); + justify-content: center; + align-items: center; + cursor: pointer; +} + +.clipboard.success { + border: 1px solid var(--fragment-foreground-color); + border-radius: 4px; +} + +.fragment:hover .clipboard, .clipboard.success { + opacity: .28; +} + +.clipboard:hover, .clipboard.success { + opacity: 1 !important; +} + +.clipboard:active:not([class~=success]) svg { + transform: scale(.91); +} + +.clipboard.success svg { + fill: var(--fragment-copy-ok-color); +} + +.clipboard.success { + border-color: var(--fragment-copy-ok-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/documentation/html/doxygen.svg b/documentation/html/doxygen.svg new file mode 100644 index 00000000..79a76354 --- /dev/null +++ b/documentation/html/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/html/dynsections.js b/documentation/html/dynsections.js new file mode 100644 index 00000000..8f493264 --- /dev/null +++ b/documentation/html/dynsections.js @@ -0,0 +1,194 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +let dynsection = { + + // helper function + updateStripes : function() { + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); + }, + + toggleVisibility : function(linkObj) { + const base = $(linkObj).attr('id'); + const summary = $('#'+base+'-summary'); + const content = $('#'+base+'-content'); + const trigger = $('#'+base+'-trigger'); + const src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; + }, + + toggleLevel : function(level) { + $('table.directory tr').each(function() { + const l = this.id.split('_').length-1; + const i = $('#img'+this.id.substring(3)); + const a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + const id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = $(this).attr('data-start'); + const end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + const line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',codefold.plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); + }, +}; +/* @license-end */ diff --git a/documentation/html/field__variable_8h_source.html b/documentation/html/field__variable_8h_source.html new file mode 100644 index 00000000..1b64e744 --- /dev/null +++ b/documentation/html/field__variable_8h_source.html @@ -0,0 +1,121 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/storage/field_variable.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
field_variable.h
+
+
+
1#pragma once
+
2
+
3#include <array>
+
4#include <vector>
+
5#include <cmath>
+
6#include <iostream>
+
7#include "array2D.h"
+
8
+
+
17class FieldVariable : public Array2D
+
18{
+
19public:
+
27 FieldVariable(std::array<int, 2> size, std::array<double, 2> origin, std::array<double, 2> meshWidth);
+
28
+
37 double interpolateAt(double x, double y) const;
+
38
+
44 double findAbsMax() const;
+
45
+
46private:
+
47 const std::array<double, 2> origin_;
+
48 const std::array<double, 2> meshWidth_;
+
49};
+
+
This class represents a 2D array of double values.
Definition array2D.h:16
+
std::array< int, 2 > size() const
get size of array in x and y direction
Definition array2D.cpp:33
+
Discretization of a scalar function.
Definition field_variable.h:18
+
double interpolateAt(double x, double y) const
Interpolates value of field variable in domain using x and y coordinates.
Definition field_variable.cpp:12
+
double findAbsMax() const
Find point in Array2D of Fieldvariable with maximum value.
Definition field_variable.cpp:55
+
FieldVariable(std::array< int, 2 > size, std::array< double, 2 > origin, std::array< double, 2 > meshWidth)
Constructor.
Definition field_variable.cpp:4
+
+ + + + diff --git a/documentation/html/files.html b/documentation/html/files.html new file mode 100644 index 00000000..af63bf73 --- /dev/null +++ b/documentation/html/files.html @@ -0,0 +1,112 @@ + + + + + + + +NumSim: File List + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+
[detail level 123]
+ + + + + + + + + + + + + + + + + + + + + + + + + +
  src
  boundary
 boundary.h
 mask.h
  discretization
 central_differences.h
 discretization.h
 donor_cell.h
 staggered_grid.h
  output_writer
 output_writer.h
 output_writer_paraview.h
 output_writer_text.h
  settings_parser
 settings.h
  solver
 gauss_seidel.h
 pressure_solver.h
 sor.h
  storage
 array2D.h
 field_variable.h
  surface
 fluid_tracer.h
 computation.h
+
+
+ + + + diff --git a/documentation/html/fluid__tracer_8h_source.html b/documentation/html/fluid__tracer_8h_source.html new file mode 100644 index 00000000..4ea31da6 --- /dev/null +++ b/documentation/html/fluid__tracer_8h_source.html @@ -0,0 +1,160 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/surface/fluid_tracer.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
fluid_tracer.h
+
+
+
1#pragma once
+
2
+
3#include <iostream>
+
4#include <memory>
+
5#include <cmath>
+
6#include <cassert>
+
7
+
8#include "../discretization/discretization.h"
+
9#include "../boundary/boundary.h"
+
10
+
11
+
+ +
13 public:
+
14 FluidTracer(int numParticlesperCell,
+
15 std::shared_ptr<Discretization> discretization,
+
16 std::shared_ptr<Mask> mask);
+
17
+
18 // Mainly for testing purposes
+
19 FluidTracer(std::vector<double> x, std::vector<double> y,
+
20 std::shared_ptr<Discretization> discretization,
+
21 std::shared_ptr<Mask> mask);
+
22
+
32 void moveParticles(double dt);
+
33
+
40 void createParticles(double positionSourceX, double positionSourceY);
+
41
+
47 int getNumberOfParticles() const;
+
48
+
49
+
56 std::array<double, 2> getParticlePosition(int i) const;
+
57
+
58 std::array<int, 2> cellOfParticle(int i);
+
59 int val2CellX(double xVal);
+
60 int val2CellY(double yVal);
+
61
+
62
+
63
+
64 // Only test
+
65 std::array<double, 2> updateParticle(int i, std::array<int, 2> idx, double dt, std::array<double,2> vel, int depth);
+
66 std::array<double, 2> moveParticles(double dt, std::array<double, 2> vel);
+
67
+
68
+
69 private:
+
77 void initializeFluidCell(int i, int j, int idx);
+
78
+
79 std::array<int, 2> updateParticle(int i, std::array<int, 2>, double dt, std::array<double,2> vel);
+
80
+
81
+
82 int numParticles_;
+
83 int numParticlesPerCell_; // <! is usually because of ceil larger then numParticlesPerCell>
+
84 double seedRelationDyDx_;
+
85 int n_x;
+
86 int n_y;
+
87
+
88 std::shared_ptr<Discretization> discretization_;
+
89 std::shared_ptr<Mask> mask_;
+
90 std::vector<double> x_;
+
91 std::vector<double> y_;
+
92
+
93
+
94};
+
+
Definition fluid_tracer.h:12
+
std::array< double, 2 > getParticlePosition(int i) const
Get the Particle Position, index starts at 0.
Definition fluid_tracer.cpp:92
+
void moveParticles(double dt)
Update the position of the particles according to the velocity field and sets mask accordingly.
Definition fluid_tracer.cpp:97
+
void createParticles(double positionSourceX, double positionSourceY)
can be used to create a source cell for particles
Definition fluid_tracer.cpp:64
+
int getNumberOfParticles() const
Get the Number Of Particles object.
Definition fluid_tracer.cpp:76
+
+ + + + diff --git a/documentation/html/folderclosed.svg b/documentation/html/folderclosed.svg new file mode 100644 index 00000000..b04bed2e --- /dev/null +++ b/documentation/html/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/documentation/html/folderclosedd.svg b/documentation/html/folderclosedd.svg new file mode 100644 index 00000000..52f0166a --- /dev/null +++ b/documentation/html/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/documentation/html/folderopen.svg b/documentation/html/folderopen.svg new file mode 100644 index 00000000..f6896dd2 --- /dev/null +++ b/documentation/html/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/documentation/html/folderopend.svg b/documentation/html/folderopend.svg new file mode 100644 index 00000000..2d1f06e7 --- /dev/null +++ b/documentation/html/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/documentation/html/functions.html b/documentation/html/functions.html new file mode 100644 index 00000000..7d966189 --- /dev/null +++ b/documentation/html/functions.html @@ -0,0 +1,288 @@ + + + + + + + +NumSim: Class Members + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented class members with links to the class documentation for each member:
+ +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- j -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- v -

+ + +

- w -

+
+ + + + diff --git a/documentation/html/functions_func.html b/documentation/html/functions_func.html new file mode 100644 index 00000000..93a25a37 --- /dev/null +++ b/documentation/html/functions_func.html @@ -0,0 +1,224 @@ + + + + + + + +NumSim: Class Members - Functions + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented functions with links to the class documentation for each member:
+ +

- a -

+ + +

- c -

+ + +

- d -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- u -

+ + +

- v -

+ + +

- w -

+
+ + + + diff --git a/documentation/html/functions_vars.html b/documentation/html/functions_vars.html new file mode 100644 index 00000000..6387eaf5 --- /dev/null +++ b/documentation/html/functions_vars.html @@ -0,0 +1,202 @@ + + + + + + + +NumSim: Class Members - Variables + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented variables with links to the class documentation for each member:
+ +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- g -

+ + +

- i -

+ + +

- j -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- v -

+
+ + + + diff --git a/documentation/html/gauss__seidel_8h_source.html b/documentation/html/gauss__seidel_8h_source.html new file mode 100644 index 00000000..53f54613 --- /dev/null +++ b/documentation/html/gauss__seidel_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/gauss_seidel.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
gauss_seidel.h
+
+
+
1#pragma once
+
2
+
3#include "pressure_solver.h"
+
4#include <iostream>
+
5
+
+ +
12{
+
13
+
14public:
+
22 GaussSeidel(const std::shared_ptr<Discretization> &data,
+
23 double epsilon,
+
24 int maximumNumberOfIterations,
+
25 std::shared_ptr<Boundary> boundary);
+
30 void solve() override;
+
31};
+
+
Standard Gauss-Seidel solver.
Definition gauss_seidel.h:12
+
void solve() override
override function that starts solver.
Definition gauss_seidel.cpp:10
+
GaussSeidel(const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
Constructor.
Definition gauss_seidel.cpp:3
+
Solves the Poisson problem for the pressure.
Definition pressure_solver.h:21
+
+ + + + diff --git a/documentation/html/hierarchy.html b/documentation/html/hierarchy.html new file mode 100644 index 00000000..f9bcc7fb --- /dev/null +++ b/documentation/html/hierarchy.html @@ -0,0 +1,105 @@ + + + + + + + +NumSim: Class Hierarchy + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Class Hierarchy
+
+
+
This inheritance list is sorted roughly, but not completely, alphabetically:
+
[detail level 123]
+ + + + + + + + + + + + + + + + + + +
 CArray2DThis class represents a 2D array of double values
 CFieldVariableDiscretization of a scalar function
 CBoundary
 CComputationComputation of Simulation
 CFluidTracer
 CSettings::LineContentContains the content of a single line in a file
 CMask
 COutputWriterInteface class for writing simulation data output
 COutputWriterParaviewWrite *.vti files that can be viewed with ParaView
 COutputWriterTextWrite *.txt files that are useful for debugging
 CPressureSolverSolves the Poisson problem for the pressure
 CGaussSeidelStandard Gauss-Seidel solver
 CSORSuccessive over-relaxation solver
 CSettingsAll settings that parametrize a simulation run
 CStaggeredGridCreate field variables and define limits for the indices
 CDiscretizationComputes derivatives included in governing equations
 CCentralDifferencesDiscretizes the problem using the central differences scheme
 CDonorCellDiscretizes the problem using the donor cell scheme
+
+
+ + + + diff --git a/documentation/html/index.html b/documentation/html/index.html new file mode 100644 index 00000000..ea3c2329 --- /dev/null +++ b/documentation/html/index.html @@ -0,0 +1,83 @@ + + + + + + + +NumSim: Main Page + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
NumSim Documentation
+
+
+
+ + + + diff --git a/documentation/html/jquery.js b/documentation/html/jquery.js new file mode 100644 index 00000000..0ac00e20 --- /dev/null +++ b/documentation/html/jquery.js @@ -0,0 +1,91 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$});/*! + Cookie helper functions + Copyright (c) 2023 Dimitri van Heesch + Released under MIT license. +*/ +let Cookie = { + cookie_namespace: 'doxygen_', + + readSetting(cookie,defVal) { + if (window.chrome) { + const val = localStorage.getItem(this.cookie_namespace+cookie) || + sessionStorage.getItem(this.cookie_namespace+cookie); + if (val) return val; + } else { + let myCookie = this.cookie_namespace+cookie+"="; + if (document.cookie) { + const index = document.cookie.indexOf(myCookie); + if (index != -1) { + const valStart = index + myCookie.length; + let valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + return document.cookie.substring(valStart, valEnd); + } + } + } + return defVal; + }, + + writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete + if (window.chrome) { + if (days==0) { + sessionStorage.setItem(this.cookie_namespace+cookie,val); + } else { + localStorage.setItem(this.cookie_namespace+cookie,val); + } + } else { + let date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; + document.cookie = this.cookie_namespace + cookie + "=" + + val + "; SameSite=Lax;" + expiration + "path=/"; + } + }, + + eraseSetting(cookie) { + if (window.chrome) { + if (localStorage.getItem(this.cookie_namespace+cookie)) { + localStorage.removeItem(this.cookie_namespace+cookie); + } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { + sessionStorage.removeItem(this.cookie_namespace+cookie); + } + } else { + this.writeSetting(cookie,'',-1); + } + }, +} diff --git a/documentation/html/mask_8h_source.html b/documentation/html/mask_8h_source.html new file mode 100644 index 00000000..cca6e1bf --- /dev/null +++ b/documentation/html/mask_8h_source.html @@ -0,0 +1,228 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/boundary/mask.h Source File + + + + + + + + + + +
+
+ + + + + + +
+
NumSim 1.0 +
+
Numerical Simulation of fluid-flow
+
+
+ + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
mask.h
+
+
+
1#pragma once
+
2
+
3#include <vector>
+
4#include <array>
+
5#include <cassert>
+
6#include <cmath>
+
7
+
8#include <iostream>
+
9#include <iomanip>
+
10#include <png.h>
+
11#include <fstream>
+
12#include "../settings_parser/settings.h"
+
13
+
+
14class Mask
+
15{
+
16public:
+
22 Mask(Settings settings);
+
23
+
24 // TODO: it is weird but if we would use `char` instead of int, we would use less memory
+
25
+
26 enum CellType
+
27 {
+
28 FLUID_DROPLET = 0,
+
29
+
30 FLUID_SINGLE_LEFT = 1,
+
31 FLUID_SINGLE_TOP = 2,
+
32 FLUID_SINGLE_RIGHT = 4,
+
33 FLUID_SINGLE_BOTTOM = 8,
+
34
+
35 FLUID_CORNER_BOTTOM_LEFT = 6,
+
36 FLUID_CORNER_TOP_LEFT = 12,
+
37 FLUID_CORNER_TOP_RIGHT = 9,
+
38 FLUID_CORNER_BOTTOM_RIGHT = 3,
+
39
+
40 FLUID_COLUMN_HORIZONTAL = 5,
+
41 FLUID_COLUMN_VERTICAL = 10,
+
42
+
43 FLUID_BORDER_LEFT = 14,
+
44 FLUID_BORDER_TOP = 13,
+
45 FLUID_BORDER_RIGHT = 11,
+
46 FLUID_BORDER_BOTTOM = 7,
+
47
+
48 FLUID = 15,
+
49 FLUID_TYPE = 50,
+
50 AIR = 64,
+
51
+
52 OBSTACLE = 99,
+
53 OBSTACLE_INSIDE = 100,
+
54
+
55 OBSTACLE_BORDER_LEFT = 101,
+
56 OBSTACLE_BORDER_TOP = 102,
+
57 OBSTACLE_CORNER_TOP_LEFT = 103,
+
58 OBSTACLE_BORDER_RIGHT = 104,
+
59 OBSTACLE_CORNER_TOP_RIGHT = 106,
+
60 OBSTACLE_BORDER_BOTTOM = 108,
+
61 OBSTACLE_CORNER_BOTTOM_LEFT = 109,
+
62 OBSTACLE_CORNER_BOTTOM_RIGHT = 112,
+
63
+
64 DOMAIN_BOUNDARY = 200,
+
65
+
66 DOMAIN_LEFT_NOSLIP = 201,
+
67 DOMAIN_TOP_NOSLIP = 202,
+
68 DOMAIN_RIGHT_NOSLIP = 203,
+
69 DOMAIN_BOTTOM_NOSLIP = 204,
+
70
+
71 DOMAIN_LEFT_PRESSURE = 205,
+
72 DOMAIN_TOP_PRESSURE = 206,
+
73 DOMAIN_RIGHT_PRESSURE = 207,
+
74 DOMAIN_BOTTOM_PRESSURE = 208,
+
75 };
+
76
+
84 int &operator()(int i, int j);
+
85
+
93 int operator()(int i, int j) const;
+
94
+
98 std::array<int, 2> size() const;
+
99
+
104 void resetMask();
+
105
+
106 // ********************************************************
+
107 // R E Q U E S T S
+
108
+
117 bool isFluid(int i, int j) const;
+
118
+
125 bool isObstacle(int i, int j) const;
+
126
+
127
+
136 bool isAir(int i, int j) const;
+
137 bool isInnerFluid(int i, int j) const;
+
138
+
139
+
140 bool isDomainBoundary(int i, int j) const;
+
141 bool isObstacleBoundary(int i, int j) const;
+
142 bool isFluidBoundary(int i, int j) const;
+
143
+
144
+
151 int getNumberOfFluidCells() const;
+
152
+
153 // For initialization
+
154 void makeRectangularObstacle();
+
155 void createMaskFromPNGBitMap();
+
156
+
157
+
158
+
159
+
160 // Sets Enums for Boundary Types from type FLUID, AIR, OBSTACLE, DOMAIN
+
161 // - uses `settings` and neighbours
+
162 void setDomainBC();
+
163 void setObstacleBC();
+
164 void setFluidBC();
+
165
+
166 void printMask() const;
+
167
+
168
+
169protected:
+
170 std::array<int, 2> size_;
+
171 std::vector<int> data_;
+
172 std::vector<int> boundary_list;
+
173 Settings settings_;
+
174 int forbiddenObstacleFluidCombinations[7] = {105,107,110,111,113,114,115};
+
175};
+
+
Definition mask.h:15
+
int getNumberOfFluidCells() const
number of fluid cells
Definition mask.cpp:78
+
std::vector< int > boundary_list
stores the indices of the boundary cells
Definition mask.h:172
+
bool isObstacle(int i, int j) const
True if Cell at (i,j) is either obstacle or boundary.
Definition mask.cpp:52
+
Mask(Settings settings)
constructor.
Definition mask.cpp:3
+
int & operator()(int i, int j)
set array value. Overloads the () operator
Definition mask.cpp:23
+
bool isAir(int i, int j) const
Cell at (i,j) is a air cell or not.
Definition mask.cpp:56
+
std::array< int, 2 > size_
size of array in x and y direction
Definition mask.h:170
+
bool isFluid(int i, int j) const
Cell at (i,j) is fluid or not.
Definition mask.cpp:48
+
std::array< int, 2 > size() const
get size of array in x and y direction
Definition mask.cpp:33
+
void resetMask()
sets all not obstacle cells to air
Definition mask.cpp:37
+
std::vector< int > data_
storage array values, in row-major order
Definition mask.h:171
+
All settings that parametrize a simulation run.
Definition settings.h:14
+
+ + + + diff --git a/documentation/html/menu.js b/documentation/html/menu.js new file mode 100644 index 00000000..717761d0 --- /dev/null +++ b/documentation/html/menu.js @@ -0,0 +1,134 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + let result=''; + if ('children' in data) { + result+='
    '; + for (let i in data.children) { + let url; + const link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + let searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
 '+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + const $mainMenuState = $('#main-menu-state'); + let prevWidth = 0; + if ($mainMenuState.length) { + const initResizableIfExists = function() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function() { + const $menu = $('#main-menu'); + let options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = () => $menu.css('display', 'block'); + $menu.hide().slideDown(options); + } else { + options['complete'] = () => $menu.css('display', 'none'); + $menu.show().slideUp(options); + } + }); + // set default menu visibility + const resetState = function() { + const $menu = $('#main-menu'); + const newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/documentation/html/menudata.js b/documentation/html/menudata.js new file mode 100644 index 00000000..bc89ec05 --- /dev/null +++ b/documentation/html/menudata.js @@ -0,0 +1,90 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"hierarchy.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions.html#index_b"}, +{text:"c",url:"functions.html#index_c"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"f",url:"functions.html#index_f"}, +{text:"g",url:"functions.html#index_g"}, +{text:"i",url:"functions.html#index_i"}, +{text:"j",url:"functions.html#index_j"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"u",url:"functions.html#index_u"}, +{text:"v",url:"functions.html#index_v"}, +{text:"w",url:"functions.html#index_w"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"a",url:"functions_func.html#index_a"}, +{text:"c",url:"functions_func.html#index_c"}, +{text:"d",url:"functions_func.html#index_d"}, +{text:"f",url:"functions_func.html#index_f"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"i",url:"functions_func.html#index_i"}, +{text:"l",url:"functions_func.html#index_l"}, +{text:"m",url:"functions_func.html#index_m"}, +{text:"n",url:"functions_func.html#index_n"}, +{text:"o",url:"functions_func.html#index_o"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"u",url:"functions_func.html#index_u"}, +{text:"v",url:"functions_func.html#index_v"}, +{text:"w",url:"functions_func.html#index_w"}]}, +{text:"Variables",url:"functions_vars.html",children:[ +{text:"a",url:"functions_vars.html#index_a"}, +{text:"b",url:"functions_vars.html#index_b"}, +{text:"c",url:"functions_vars.html#index_c"}, +{text:"d",url:"functions_vars.html#index_d"}, +{text:"e",url:"functions_vars.html#index_e"}, +{text:"f",url:"functions_vars.html#index_f"}, +{text:"g",url:"functions_vars.html#index_g"}, +{text:"i",url:"functions_vars.html#index_i"}, +{text:"j",url:"functions_vars.html#index_j"}, +{text:"m",url:"functions_vars.html#index_m"}, +{text:"n",url:"functions_vars.html#index_n"}, +{text:"o",url:"functions_vars.html#index_o"}, +{text:"p",url:"functions_vars.html#index_p"}, +{text:"r",url:"functions_vars.html#index_r"}, +{text:"s",url:"functions_vars.html#index_s"}, +{text:"t",url:"functions_vars.html#index_t"}, +{text:"u",url:"functions_vars.html#index_u"}, +{text:"v",url:"functions_vars.html#index_v"}]}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}]}]} diff --git a/documentation/html/minus.svg b/documentation/html/minus.svg new file mode 100644 index 00000000..f70d0c1a --- /dev/null +++ b/documentation/html/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/documentation/html/minusd.svg b/documentation/html/minusd.svg new file mode 100644 index 00000000..5f8e8796 --- /dev/null +++ b/documentation/html/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/documentation/html/nav_f.png b/documentation/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/documentation/html/nav_fd.png b/documentation/html/nav_fd.png new file mode 100644 index 0000000000000000000000000000000000000000..032fbdd4c54f54fa9a2e6423b94ef4b2ebdfaceb GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQU#tajv*C{Z|C~*H7f|XvG1G8 zt7aS*L7xwMeS}!z6R#{C5tIw-s~AJ==F^i}x3XyJseHR@yF& zerFf(Zf;Dd{+(0lDIROL@Sj-Ju2JQ8&-n%4%q?>|^bShc&lR?}7HeMo@BDl5N(aHY Uj$gdr1MOz;boFyt=akR{0D!zeaR2}S literal 0 HcmV?d00001 diff --git a/documentation/html/nav_g.png b/documentation/html/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL6W-eg#Jd_@e6*DPn)w;=|1H}Zvm9l6xXXB%>yL=NQU;mg M>FVdQ&MBb@0Bdt1Qvd(} literal 0 HcmV?d00001 diff --git a/documentation/html/open.png b/documentation/html/open.png new file mode 100644 index 0000000000000000000000000000000000000000..30f75c7efe2dd0c9e956e35b69777a02751f048b GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    output_writer.h
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include "../discretization/discretization.h"
    +
    4
    +
    5#include <memory>
    +
    6#include <iostream>
    +
    7#include <cstring>
    +
    8
    +
    + +
    14{
    +
    15public:
    +
    21 OutputWriter(std::shared_ptr<Discretization> discretization);
    +
    22
    +
    30 virtual void writeFile(double currentTime) = 0;
    +
    31
    +
    32protected:
    +
    33 std::shared_ptr<Discretization> discretization_;
    +
    34 int fileNo_;
    +
    35};
    +
    +
    Inteface class for writing simulation data output.
    Definition output_writer.h:14
    +
    std::shared_ptr< Discretization > discretization_
    shared pointer, discretization object containing data to be written to file
    Definition output_writer.h:33
    +
    OutputWriter(std::shared_ptr< Discretization > discretization)
    Constructor.
    Definition output_writer.cpp:3
    +
    int fileNo_
    a counter that increments for every file written to disk
    Definition output_writer.h:34
    +
    virtual void writeFile(double currentTime)=0
    Write current velocities to file.
    +
    + + + + diff --git a/documentation/html/output__writer__paraview_8h_source.html b/documentation/html/output__writer__paraview_8h_source.html new file mode 100644 index 00000000..64c9ea10 --- /dev/null +++ b/documentation/html/output__writer__paraview_8h_source.html @@ -0,0 +1,124 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer_paraview.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    output_writer_paraview.h
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include "output_writer.h"
    +
    4
    +
    5#include <vtkSmartPointer.h>
    +
    6#include <vtkXMLImageDataWriter.h>
    +
    7#include <vtkImageData.h>
    +
    8#include <vtkDoubleArray.h>
    +
    9#include <vtkPointData.h>
    +
    10#include <cmath>
    +
    11
    +
    12#include <memory>
    +
    13#include <iostream>
    +
    14#include "../boundary/mask.h"
    +
    15
    +
    + +
    25{
    +
    26public:
    +
    32 OutputWriterParaview(std::shared_ptr<Discretization> discretization, std::shared_ptr<Mask> mask);
    +
    33
    +
    39 void writeFile(double currentTime);
    +
    40
    +
    41private:
    +
    42 vtkSmartPointer<vtkXMLImageDataWriter> vtkWriter_;
    +
    43 std::shared_ptr<Mask> mask_;
    +
    44};
    +
    +
    Write *.vti files that can be viewed with ParaView.
    Definition output_writer_paraview.h:25
    +
    OutputWriterParaview(std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask)
    Constructor.
    Definition output_writer_paraview.cpp:3
    +
    void writeFile(double currentTime)
    Write current velocities to file, filename is output_<count>.vti.
    Definition output_writer_paraview.cpp:9
    +
    Inteface class for writing simulation data output.
    Definition output_writer.h:14
    +
    + + + + diff --git a/documentation/html/output__writer__text_8h_source.html b/documentation/html/output__writer__text_8h_source.html new file mode 100644 index 00000000..db57ed16 --- /dev/null +++ b/documentation/html/output__writer__text_8h_source.html @@ -0,0 +1,116 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer_text.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    output_writer_text.h
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include "output_writer.h"
    +
    4#include <iostream>
    +
    5#include <fstream>
    +
    6#include <sstream>
    +
    7#include <iomanip>
    +
    8
    +
    + +
    17{
    +
    18public:
    + +
    23
    +
    31 void writeFile(double currentTime);
    +
    32
    +
    38 void writePressureFile();
    +
    39};
    +
    +
    Write *.txt files that are useful for debugging.
    Definition output_writer_text.h:17
    +
    void writeFile(double currentTime)
    Write current velocities to file.
    Definition output_writer_text.cpp:3
    +
    void writePressureFile()
    Write only current values of pressure to file.
    Definition output_writer_text.cpp:177
    +
    Inteface class for writing simulation data output.
    Definition output_writer.h:14
    +
    OutputWriter(std::shared_ptr< Discretization > discretization)
    Constructor.
    Definition output_writer.cpp:3
    +
    + + + + diff --git a/documentation/html/plus.svg b/documentation/html/plus.svg new file mode 100644 index 00000000..07520165 --- /dev/null +++ b/documentation/html/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/documentation/html/plusd.svg b/documentation/html/plusd.svg new file mode 100644 index 00000000..0c65bfe9 --- /dev/null +++ b/documentation/html/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/documentation/html/pressure__solver_8h_source.html b/documentation/html/pressure__solver_8h_source.html new file mode 100644 index 00000000..13213ceb --- /dev/null +++ b/documentation/html/pressure__solver_8h_source.html @@ -0,0 +1,148 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/pressure_solver.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    pressure_solver.h
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include <math.h>
    +
    4#include <iostream>
    +
    5#include <memory>
    +
    6
    +
    7#include "../storage/field_variable.h"
    +
    8#include "../discretization/discretization.h"
    +
    9#include "../boundary/boundary.h"
    +
    10
    +
    11
    +
    + +
    21{
    +
    22public:
    +
    31 PressureSolver(std::shared_ptr<Discretization> discretization,
    +
    32 double epsilon,
    +
    33 int maximumNumberOfIterations,
    +
    34 std::shared_ptr<Boundary> boundary);
    +
    35
    +
    40 virtual void solve() = 0;
    +
    41
    +
    42 double dx2, dy2;
    +
    43
    +
    44protected:
    +
    51 void setBoundaryValues();
    +
    52
    +
    56 double calculateResiduum();
    +
    57
    +
    58 int i_beg;
    +
    59 int i_end;
    +
    60 int j_beg;
    +
    61 int j_end;
    +
    62
    +
    63 std::shared_ptr<Discretization> discretization_;
    +
    64 std::shared_ptr<Boundary> boundary_;
    +
    65
    +
    66 double epsilon_;
    +
    67
    + +
    69};
    +
    +
    Solves the Poisson problem for the pressure.
    Definition pressure_solver.h:21
    +
    std::shared_ptr< Boundary > boundary_
    object managing boundary for obstacle and surface tension
    Definition pressure_solver.h:64
    +
    PressureSolver(std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
    Constructor.
    Definition pressure_solver.cpp:5
    +
    double epsilon_
    tolerance for the solver
    Definition pressure_solver.h:66
    +
    double dy2
    squared mesh widths
    Definition pressure_solver.h:42
    +
    int i_end
    end of loop for rhs in x direction
    Definition pressure_solver.h:59
    +
    void setBoundaryValues()
    Set the Boundary Values.
    Definition pressure_solver.cpp:28
    +
    virtual void solve()=0
    virtual function that starts solver.
    +
    int j_beg
    begin of loop for rhs in y direction
    Definition pressure_solver.h:60
    +
    int j_end
    end of loop for rhs in y direction
    Definition pressure_solver.h:61
    +
    int i_beg
    begin of loop for rhs in x direction
    Definition pressure_solver.h:58
    +
    int maximumNumberOfIterations_
    maximum number of iterations
    Definition pressure_solver.h:68
    +
    std::shared_ptr< Discretization > discretization_
    object holding the needed field variables for rhs and p
    Definition pressure_solver.h:63
    +
    double calculateResiduum()
    calculate residuum of current time step
    Definition pressure_solver.cpp:33
    +
    + + + + diff --git a/documentation/html/search/all_0.js b/documentation/html/search/all_0.js new file mode 100644 index 00000000..d432d029 --- /dev/null +++ b/documentation/html/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['alpha_0',['alpha',['../structSettings.html#a8b3721d24a5417caa0f2ad6f5eb85782',1,'Settings']]], + ['array2d_1',['array2d',['../classArray2D.html',1,'Array2D'],['../classArray2D.html#a16521417dfdf67ec694bfb7747df9000',1,'Array2D::Array2D()']]] +]; diff --git a/documentation/html/search/all_1.js b/documentation/html/search/all_1.js new file mode 100644 index 00000000..77069907 --- /dev/null +++ b/documentation/html/search/all_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['boundary_0',['Boundary',['../classBoundary.html',1,'']]], + ['boundary_5f_1',['boundary_',['../classPressureSolver.html#a0b17b46580d259e4bb3a05486bc06a60',1,'PressureSolver']]], + ['boundary_5flist_2',['boundary_list',['../classMask.html#a3c5a51f6d03bb4a5e1742537a22ec441',1,'Mask']]] +]; diff --git a/documentation/html/search/all_10.js b/documentation/html/search/all_10.js new file mode 100644 index 00000000..b7e0cc14 --- /dev/null +++ b/documentation/html/search/all_10.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['tau_0',['tau',['../structSettings.html#adaa611dc8c075474d40d7149afd310d1',1,'Settings']]] +]; diff --git a/documentation/html/search/all_11.js b/documentation/html/search/all_11.js new file mode 100644 index 00000000..3e53abf5 --- /dev/null +++ b/documentation/html/search/all_11.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['u_0',['u',['../classStaggeredGrid.html#a87cee12621c641ab143a8b1a61b2ef7e',1,'StaggeredGrid::u() const'],['../classStaggeredGrid.html#a0324ce4d1fe2343d8aa9514e460cc556',1,'StaggeredGrid::u(int i, int j) const'],['../classStaggeredGrid.html#a0ed62d6752b6b2b3ead5f654b515cd12',1,'StaggeredGrid::u(int i, int j)']]], + ['u_5f_1',['u_',['../classStaggeredGrid.html#adcef36b4ce8cc6843a2b6f603b62c763',1,'StaggeredGrid']]], + ['uibegin_2',['uIBegin',['../classStaggeredGrid.html#a31e2d3a0b6e03685380810a7c2f323e1',1,'StaggeredGrid']]], + ['uiend_3',['uIEnd',['../classStaggeredGrid.html#a641e473d72e1d02ba3de1c16e9d0d332',1,'StaggeredGrid']]], + ['ujbegin_4',['uJBegin',['../classStaggeredGrid.html#a9b0e97704e1871441a8e713ecaa2cff5',1,'StaggeredGrid']]], + ['ujend_5',['uJEnd',['../classStaggeredGrid.html#a3393aa91b17054d2d700de308ae25632',1,'StaggeredGrid']]], + ['usedonorcell_6',['useDonorCell',['../structSettings.html#a05bd5ffa1e1b48f5dc99878538596db3',1,'Settings']]] +]; diff --git a/documentation/html/search/all_12.js b/documentation/html/search/all_12.js new file mode 100644 index 00000000..72fb9675 --- /dev/null +++ b/documentation/html/search/all_12.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['v_0',['v',['../classStaggeredGrid.html#a26e478abba632554652c9e05a279d1ca',1,'StaggeredGrid::v() const'],['../classStaggeredGrid.html#ac052d8803ff950aee04b86ac026c516b',1,'StaggeredGrid::v(int i, int j) const'],['../classStaggeredGrid.html#a7746f703f32c2f20a4c77246eebac697',1,'StaggeredGrid::v(int i, int j)']]], + ['v_5f_1',['v_',['../classStaggeredGrid.html#a20ec43568fe937b194561e21a0b84ad9',1,'StaggeredGrid']]], + ['value_2',['value',['../structSettings_1_1LineContent.html#a0bb96393366f2e5035379ab5b99d3ab2',1,'Settings::LineContent']]], + ['vibegin_3',['vIBegin',['../classStaggeredGrid.html#ace7bf8cb1d279131739d5d12de302d09',1,'StaggeredGrid']]], + ['viend_4',['vIEnd',['../classStaggeredGrid.html#aa5a44aa088b5a7923fa952af1ecb5778',1,'StaggeredGrid']]], + ['vjbegin_5',['vJBegin',['../classStaggeredGrid.html#a7f8468d672411c0e3a5eeb67788fc826',1,'StaggeredGrid']]], + ['vjend_6',['vJEnd',['../classStaggeredGrid.html#ab67e8d9d8d76d34fb02d4d644f0b3795',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/all_13.js b/documentation/html/search/all_13.js new file mode 100644 index 00000000..9578483c --- /dev/null +++ b/documentation/html/search/all_13.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['writefile_0',['writefile',['../classOutputWriter.html#ac625c204affdc05919388a3549c2e945',1,'OutputWriter::writeFile()'],['../classOutputWriterParaview.html#a9e203b63d0e2f26ad53d18ee1821c6bb',1,'OutputWriterParaview::writeFile()'],['../classOutputWriterText.html#a25a12ea2524fc34e9acb19ef1f4c7431',1,'OutputWriterText::writeFile(double currentTime)']]], + ['writepressurefile_1',['writePressureFile',['../classOutputWriterText.html#a3480b58a23fd158f16d0ef9c1b67cbfd',1,'OutputWriterText']]] +]; diff --git a/documentation/html/search/all_2.js b/documentation/html/search/all_2.js new file mode 100644 index 00000000..969f7b9c --- /dev/null +++ b/documentation/html/search/all_2.js @@ -0,0 +1,19 @@ +var searchData= +[ + ['calculateresiduum_0',['calculateResiduum',['../classPressureSolver.html#afc51f4315c483988aeec327a16c5bb90',1,'PressureSolver']]], + ['centraldifferences_1',['centraldifferences',['../classCentralDifferences.html#ab055731e615298f745364c54f86fc191',1,'CentralDifferences::CentralDifferences()'],['../classCentralDifferences.html',1,'CentralDifferences']]], + ['computation_2',['Computation',['../classComputation.html',1,'']]], + ['computed2udx2_3',['computeD2uDx2',['../classDiscretization.html#a6986501b0b5c96699ff3ac843c1a6ca2',1,'Discretization']]], + ['computed2udy2_4',['computeD2uDy2',['../classDiscretization.html#a446aabc55a9fb4b5cb2f476babc532f9',1,'Discretization']]], + ['computed2vdx2_5',['computeD2vDx2',['../classDiscretization.html#a5119047788a34eadf37480e913bdc8ea',1,'Discretization']]], + ['computed2vdy2_6',['computeD2vDy2',['../classDiscretization.html#a56678582a049b1b141621e41afff1438',1,'Discretization']]], + ['computedpdx_7',['computeDpDx',['../classDiscretization.html#aed3ad75ad6e647d14f118a12652c01b2',1,'Discretization']]], + ['computedpdy_8',['computeDpDy',['../classDiscretization.html#a859f4dc33f0ea91f5e6537be09ce4999',1,'Discretization']]], + ['computedu2dx_9',['computedu2dx',['../classDonorCell.html#a265bdaf46ed8ba46a42ef0cb03807175',1,'DonorCell::computeDu2Dx()'],['../classDiscretization.html#acca6bf193e0e91f645d292527299254b',1,'Discretization::computeDu2Dx()'],['../classCentralDifferences.html#adb4502f473cc047a433db596146672e4',1,'CentralDifferences::computeDu2Dx(int i, int j) const override']]], + ['computeduvdx_10',['computeduvdx',['../classCentralDifferences.html#a9bd7ac3bfd709991525ec57de10ed2e1',1,'CentralDifferences::computeDuvDx()'],['../classDiscretization.html#ab1c2aa237e13e7c4c9edd429de656795',1,'Discretization::computeDuvDx()'],['../classDonorCell.html#ae41b5f85743ca7f148bd829561bd9cb5',1,'DonorCell::computeDuvDx()']]], + ['computeduvdy_11',['computeduvdy',['../classCentralDifferences.html#a4184367de8d48e678edfb078a19fc0a4',1,'CentralDifferences::computeDuvDy()'],['../classDiscretization.html#a0bab86aef10a72e01b4f8102a3c91f84',1,'Discretization::computeDuvDy()'],['../classDonorCell.html#a285562312f08efde26afd160174d2843',1,'DonorCell::computeDuvDy()']]], + ['computedv2dy_12',['computedv2dy',['../classCentralDifferences.html#a66eb9b800b9a9ac6f81fc719a42eb0ee',1,'CentralDifferences::computeDv2Dy()'],['../classDiscretization.html#a69ba136ab7f8c09d805afca159cab428',1,'Discretization::computeDv2Dy()'],['../classDonorCell.html#a01dcfb7fcf356d5ee412107a30c26fb3',1,'DonorCell::computeDv2Dy()']]], + ['createdomainfrombitmap_13',['createDomainfromBitmap',['../structSettings.html#a6300ad5a809cdaf480f4553c3e3dbf7c',1,'Settings']]], + ['createparticles_14',['createParticles',['../classFluidTracer.html#ace163e1fe040acbd4c3122f082b08eea',1,'FluidTracer']]], + ['createrectangularobject_15',['createRectangularObject',['../structSettings.html#a9e871c2bbb7d1b0131eac1f30f4f7788',1,'Settings']]] +]; diff --git a/documentation/html/search/all_3.js b/documentation/html/search/all_3.js new file mode 100644 index 00000000..a977fb79 --- /dev/null +++ b/documentation/html/search/all_3.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['data_5f_0',['data_',['../classMask.html#acdb73aee935b502fecc8de6bf1e32a09',1,'Mask::data_'],['../classArray2D.html#af1572f75d219caab4b2372a98341b991',1,'Array2D::data_']]], + ['discretization_1',['discretization',['../classDiscretization.html',1,'Discretization'],['../classDiscretization.html#a4fb8cc9823938e7c2dec329b906a462c',1,'Discretization::Discretization()']]], + ['discretization_5f_2',['discretization_',['../classOutputWriter.html#a0587b2dc160a9b1393411433dfc23b68',1,'OutputWriter::discretization_'],['../classPressureSolver.html#af579ecebaaa8b11914293ef18af5fdc6',1,'PressureSolver::discretization_']]], + ['donorcell_3',['donorcell',['../classDonorCell.html',1,'DonorCell'],['../classDonorCell.html#a4896ad035a5ac50c85e2b66d442a5312',1,'DonorCell::DonorCell()']]], + ['dx_4',['dx',['../classStaggeredGrid.html#aec8490affea703cdd73b1febaed68968',1,'StaggeredGrid']]], + ['dy_5',['dy',['../classStaggeredGrid.html#abde2da10e0c130fb0f206de64c9b4956',1,'StaggeredGrid']]], + ['dy2_6',['dy2',['../classPressureSolver.html#a25b7ff50bdaea53d1b5c7a5cf735c5b5',1,'PressureSolver']]] +]; diff --git a/documentation/html/search/all_4.js b/documentation/html/search/all_4.js new file mode 100644 index 00000000..9909aa46 --- /dev/null +++ b/documentation/html/search/all_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['endtime_0',['endTime',['../structSettings.html#a73cd9110793ede99e9ebe409e5e115fd',1,'Settings']]], + ['epsilon_1',['epsilon',['../structSettings.html#aa02bd91d026d9ded9e36004b41b068b1',1,'Settings']]], + ['epsilon_5f_2',['epsilon_',['../classPressureSolver.html#a22b723f3b3ba54e47f36cfc2b9576749',1,'PressureSolver']]] +]; diff --git a/documentation/html/search/all_5.js b/documentation/html/search/all_5.js new file mode 100644 index 00000000..e03e6103 --- /dev/null +++ b/documentation/html/search/all_5.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['f_0',['f',['../classStaggeredGrid.html#adb05c59512dc8993367e4beddba05785',1,'StaggeredGrid']]], + ['f_5f_1',['f_',['../classStaggeredGrid.html#a94933ac0c6e0d2a794f46c7a97d72f75',1,'StaggeredGrid']]], + ['fibegin_2',['fIBegin',['../classStaggeredGrid.html#a5cc368f9ede58a3cb689705df998f750',1,'StaggeredGrid']]], + ['fieldvariable_3',['fieldvariable',['../classFieldVariable.html',1,'FieldVariable'],['../classFieldVariable.html#aa0985778bc6331b74904a03c3ef67a98',1,'FieldVariable::FieldVariable()']]], + ['fiend_4',['fIEnd',['../classStaggeredGrid.html#a8162b849231354ba73aacb085b5cd665',1,'StaggeredGrid']]], + ['fileno_5f_5',['fileNo_',['../classOutputWriter.html#a69d167e2526407602dce26ca7a2b9248',1,'OutputWriter']]], + ['findabsmax_6',['findAbsMax',['../classFieldVariable.html#a55168fd422c70c8386ba311909427cf7',1,'FieldVariable']]], + ['fjbegin_7',['fJBegin',['../classStaggeredGrid.html#ab92aca90331200d0cc7bc0c0a857b4ef',1,'StaggeredGrid']]], + ['fjend_8',['fJEnd',['../classStaggeredGrid.html#a7ac43ac86231987bc0bf6565589d52e1',1,'StaggeredGrid']]], + ['fluidtracer_9',['FluidTracer',['../classFluidTracer.html',1,'']]] +]; diff --git a/documentation/html/search/all_6.js b/documentation/html/search/all_6.js new file mode 100644 index 00000000..0bdb7c3e --- /dev/null +++ b/documentation/html/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['g_0',['g',['../structSettings.html#a1a21237c7f5b7585e5a3545c7d4a4e8c',1,'Settings::g'],['../classStaggeredGrid.html#aaf849bec40f7fa7c68823038f0877341',1,'StaggeredGrid::g(int i, int j)']]], + ['g_5f_1',['g_',['../classStaggeredGrid.html#a5f5c88f603d4e503cba4c44ed43de46a',1,'StaggeredGrid']]], + ['gaussseidel_2',['gaussseidel',['../classGaussSeidel.html',1,'GaussSeidel'],['../classGaussSeidel.html#af31cc1ace2d616ebb8e0592c06865b9c',1,'GaussSeidel::GaussSeidel()']]], + ['getnumberoffluidcells_3',['getNumberOfFluidCells',['../classMask.html#a3471a6026ce7eab118f660557a8abac6',1,'Mask']]], + ['getnumberofparticles_4',['getNumberOfParticles',['../classFluidTracer.html#adc687a4988f532e21e13c9aa0591d658',1,'FluidTracer']]], + ['getparticleposition_5',['getParticlePosition',['../classFluidTracer.html#a37ee0325d6af08be6eba8b073162342e',1,'FluidTracer']]], + ['gibegin_6',['gIBegin',['../classStaggeredGrid.html#a061fb6d6948cdc3054171dd60842a8c3',1,'StaggeredGrid']]], + ['giend_7',['gIEnd',['../classStaggeredGrid.html#aebc76693e5dd61db521d6763236bf664',1,'StaggeredGrid']]], + ['gjbegin_8',['gJBegin',['../classStaggeredGrid.html#a18ca3a121787b19c18886b0945aca2e3',1,'StaggeredGrid']]], + ['gjend_9',['gJEnd',['../classStaggeredGrid.html#a7a29456e1bce9efffa27de0b41957b50',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/all_7.js b/documentation/html/search/all_7.js new file mode 100644 index 00000000..041d41cf --- /dev/null +++ b/documentation/html/search/all_7.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['i_5fbeg_0',['i_beg',['../classPressureSolver.html#af3ac2e53c6f49b9a362415a89595a7f0',1,'PressureSolver']]], + ['i_5fend_1',['i_end',['../classPressureSolver.html#a41b263980e55591d1ffdc4837c252a61',1,'PressureSolver']]], + ['initialize_2',['initialize',['../classComputation.html#a4a344479797b15bd5c9ed2f262657339',1,'Computation']]], + ['interpolateat_3',['interpolateAt',['../classFieldVariable.html#a2949624f1d2d7e29872f743db0b1d83b',1,'FieldVariable']]], + ['isair_4',['isAir',['../classMask.html#a7eb34f789ef96c622ab93718d5278d77',1,'Mask']]], + ['iscontent_5',['isContent',['../structSettings_1_1LineContent.html#aa2af8a274c468eb68c61cd93171748e5',1,'Settings::LineContent']]], + ['isfluid_6',['isFluid',['../classMask.html#aadacef52f95b796920864b8519d0594b',1,'Mask']]], + ['isobstacle_7',['isObstacle',['../classMask.html#a53e4e7c0b29234856cbee33386cc5c18',1,'Mask']]] +]; diff --git a/documentation/html/search/all_8.js b/documentation/html/search/all_8.js new file mode 100644 index 00000000..92030a3a --- /dev/null +++ b/documentation/html/search/all_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['j_5fbeg_0',['j_beg',['../classPressureSolver.html#aa309af30e5e63e09b77900091e562235',1,'PressureSolver']]], + ['j_5fend_1',['j_end',['../classPressureSolver.html#ac2402794034dd74073700998ee2860bf',1,'PressureSolver']]] +]; diff --git a/documentation/html/search/all_9.js b/documentation/html/search/all_9.js new file mode 100644 index 00000000..e7fbc954 --- /dev/null +++ b/documentation/html/search/all_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['linecontent_0',['LineContent',['../structSettings_1_1LineContent.html',1,'Settings']]], + ['loadfromfile_1',['loadFromFile',['../structSettings.html#a55f95e3b6e7379bef4f8399a2cd670cc',1,'Settings']]] +]; diff --git a/documentation/html/search/all_a.js b/documentation/html/search/all_a.js new file mode 100644 index 00000000..6dd04671 --- /dev/null +++ b/documentation/html/search/all_a.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['mask_0',['mask',['../classMask.html',1,'Mask'],['../classMask.html#a5d65d3a108a79864bc69994f5e56f6c3',1,'Mask::Mask()']]], + ['maximumdt_1',['maximumDt',['../structSettings.html#a988b93fdeb6c91932043b3f746b45e86',1,'Settings']]], + ['maximumnumberofiterations_2',['maximumNumberOfIterations',['../structSettings.html#ac118e1c6052e35fb0ee38547a85d84ba',1,'Settings']]], + ['maximumnumberofiterations_5f_3',['maximumNumberOfIterations_',['../classPressureSolver.html#af3b02d29bf1b21ad8b7e6edf8c2f4e87',1,'PressureSolver']]], + ['meshwidth_4',['meshWidth',['../classStaggeredGrid.html#a330856d4efe952771daf0753ef84068e',1,'StaggeredGrid']]], + ['meshwidth_5f_5',['meshWidth_',['../classStaggeredGrid.html#a9603c3334440aab082dda48947e5ce6e',1,'StaggeredGrid']]], + ['moveparticles_6',['moveParticles',['../classFluidTracer.html#aba4d452f26e9276b91256dd251789b90',1,'FluidTracer']]] +]; diff --git a/documentation/html/search/all_b.js b/documentation/html/search/all_b.js new file mode 100644 index 00000000..ad7092d3 --- /dev/null +++ b/documentation/html/search/all_b.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ncells_0',['ncells',['../structSettings.html#a43a0d2ee903496bfb86693a43a891a69',1,'Settings::nCells'],['../classStaggeredGrid.html#af37816ccb2c46e4a514dedac261897bf',1,'StaggeredGrid::nCells() const']]], + ['ncells_5f_1',['nCells_',['../classStaggeredGrid.html#acacffb5739539d9015c986080bb5ed44',1,'StaggeredGrid']]], + ['noslipvelbottom_2',['NoSlipVelBottom',['../structSettings.html#a13e254a0439df7f7bd24ffe4f919a1a4',1,'Settings']]], + ['noslipvelleft_3',['NoSlipVelLeft',['../structSettings.html#aafaec8c10a728a0f115f3bed43a1c478',1,'Settings']]], + ['noslipvelright_4',['NoSlipVelRight',['../structSettings.html#a2508aa084fe48e78d72b06e67c5a2006',1,'Settings']]], + ['noslipveltop_5',['NoSlipVelTop',['../structSettings.html#a8887591c6c157d7006051aa95896c284',1,'Settings']]] +]; diff --git a/documentation/html/search/all_c.js b/documentation/html/search/all_c.js new file mode 100644 index 00000000..ca1e1d6e --- /dev/null +++ b/documentation/html/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['obstacledimension_0',['obstacleDimension',['../structSettings.html#ae23782f18cddfea58cb843e98cb5854f',1,'Settings']]], + ['obstacleposition_1',['obstaclePosition',['../structSettings.html#aff5a1563289e354946a164fd80da5bf6',1,'Settings']]], + ['omega_2',['omega',['../structSettings.html#af5ac13128e8c442ba45eedfab06ba14c',1,'Settings']]], + ['operator_28_29_3',['operator()',['../classMask.html#a6d612f1ac2185304b3ad7432d90dcd2b',1,'Mask::operator()(int i, int j)'],['../classMask.html#a154acb41f2695c2a6ace82b5ebccbb1c',1,'Mask::operator()(int i, int j) const'],['../classArray2D.html#a9d49e5544f4acf51a57dcbb0ed1bb0f8',1,'Array2D::operator()(int i, int j)'],['../classArray2D.html#af745718ec25b815051de2d0c3c94e0d2',1,'Array2D::operator()(int i, int j) const']]], + ['outputwriter_4',['outputwriter',['../classOutputWriter.html',1,'OutputWriter'],['../classOutputWriter.html#a4f3180552b8102c27e087357b9cdd1f7',1,'OutputWriter::OutputWriter()'],['../classOutputWriterText.html#a4f3180552b8102c27e087357b9cdd1f7',1,'OutputWriterText::OutputWriter()']]], + ['outputwriterparaview_5',['outputwriterparaview',['../classOutputWriterParaview.html',1,'OutputWriterParaview'],['../classOutputWriterParaview.html#a7a599c2694986563c801806234eb07d7',1,'OutputWriterParaview::OutputWriterParaview()']]], + ['outputwritertext_6',['OutputWriterText',['../classOutputWriterText.html',1,'']]] +]; diff --git a/documentation/html/search/all_d.js b/documentation/html/search/all_d.js new file mode 100644 index 00000000..93bfc8f1 --- /dev/null +++ b/documentation/html/search/all_d.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['p_0',['p',['../classStaggeredGrid.html#aafe6e0bb3509f6aad272b94f74e7ffec',1,'StaggeredGrid::p() const'],['../classStaggeredGrid.html#aa6a5d99d9b4fbd9bd9cfa6ec071918f9',1,'StaggeredGrid::p(int i, int j) const'],['../classStaggeredGrid.html#aa09a4ca67141589bae153797fbc4f3c5',1,'StaggeredGrid::p(int i, int j)']]], + ['p_5f_1',['p_',['../classStaggeredGrid.html#a2ea3c93dd401ac06461ade9a74e76459',1,'StaggeredGrid']]], + ['parametername_2',['parameterName',['../structSettings_1_1LineContent.html#a2fa37c56a8ebe361c95b8332fa0262d3',1,'Settings::LineContent']]], + ['pathtobitmap_3',['pathToBitmap',['../structSettings.html#a398d6490c8731b9b74115abc34700086',1,'Settings']]], + ['physicalsize_4',['physicalSize',['../structSettings.html#a372a1549c306b12ca7bb0ed84f8a4cef',1,'Settings']]], + ['pibegin_5',['pIBegin',['../classStaggeredGrid.html#a9922c955707f2a31a4a27d1d696f002e',1,'StaggeredGrid']]], + ['piend_6',['pIEnd',['../classStaggeredGrid.html#a34f16fdf87971fe84ffc3c84722bb2c7',1,'StaggeredGrid']]], + ['pjbegin_7',['pJBegin',['../classStaggeredGrid.html#ae4c9ba16c5635dc1ffaa264fbcc3e034',1,'StaggeredGrid']]], + ['pjend_8',['pJEnd',['../classStaggeredGrid.html#ad9928ee522eedb7d7fd48ca0b92f2795',1,'StaggeredGrid']]], + ['pressurebottom_9',['PressureBottom',['../structSettings.html#acae74bcd333251c982ea347b8eb52017',1,'Settings']]], + ['pressureleft_10',['PressureLeft',['../structSettings.html#a55f2fbdeb4d9c25bc679bd1fd42f1da7',1,'Settings']]], + ['pressureright_11',['PressureRight',['../structSettings.html#a8e7d49e95d30c9390fc5039f9326df32',1,'Settings']]], + ['pressuresolver_12',['pressuresolver',['../classPressureSolver.html',1,'PressureSolver'],['../structSettings.html#a888e2fca33db512d4e200b49f1f618f7',1,'Settings::pressureSolver'],['../classPressureSolver.html#a10803d8c3d7f3810fc0ba059acf04058',1,'PressureSolver::PressureSolver()']]], + ['pressuretop_13',['PressureTop',['../structSettings.html#a5c8295a86e29ac27579058f07242e78c',1,'Settings']]], + ['printsettings_14',['printSettings',['../structSettings.html#a68ce38117dcef2cbdd3bd17f127b3078',1,'Settings']]] +]; diff --git a/documentation/html/search/all_e.js b/documentation/html/search/all_e.js new file mode 100644 index 00000000..033d4072 --- /dev/null +++ b/documentation/html/search/all_e.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['re_0',['re',['../structSettings.html#a8b8330dfa04fe849291d68eacbc8dfec',1,'Settings']]], + ['readsingleline_1',['readSingleLine',['../structSettings.html#a6dbc25f91b99664976cd4a0a8af153c9',1,'Settings']]], + ['resetmask_2',['resetMask',['../classMask.html#ac30997cdd83faef98290733acb325cf8',1,'Mask']]], + ['rhs_3',['rhs',['../classStaggeredGrid.html#a3f36422a02b9b18d1577d61e406f08cf',1,'StaggeredGrid::rhs() const'],['../classStaggeredGrid.html#a761ea51f1e8fd1290b3adfe09942b0d3',1,'StaggeredGrid::rhs(int i, int j)']]], + ['rhs_5f_4',['rhs_',['../classStaggeredGrid.html#a496206955162452a0629a7742fe92a84',1,'StaggeredGrid']]], + ['rhsibegin_5',['rhsIBegin',['../classStaggeredGrid.html#ad5c16b00d9dbf0f115e1ded81203edce',1,'StaggeredGrid']]], + ['rhsiend_6',['rhsIEnd',['../classStaggeredGrid.html#ae11e8842fdd508b914dc8f24b09b36a9',1,'StaggeredGrid']]], + ['rhsjbegin_7',['rhsJBegin',['../classStaggeredGrid.html#a28c36939e3d3cc8df76e7aa91f0e0804',1,'StaggeredGrid']]], + ['rhsjend_8',['rhsJEnd',['../classStaggeredGrid.html#a953ec890a986473bffe87ea26dfcd782',1,'StaggeredGrid']]], + ['runsimulation_9',['runSimulation',['../classComputation.html#ad20ce6e82ec9a918e6ac03840bc688d5',1,'Computation']]] +]; diff --git a/documentation/html/search/all_f.js b/documentation/html/search/all_f.js new file mode 100644 index 00000000..e5618e81 --- /dev/null +++ b/documentation/html/search/all_f.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['setboundaryvalues_0',['setBoundaryValues',['../classPressureSolver.html#a458c383fcacaf54c1a333a271049ca93',1,'PressureSolver']]], + ['setparameter_1',['setParameter',['../structSettings.html#a588f30eb8d791c03ec811360386bff0d',1,'Settings']]], + ['settings_2',['Settings',['../structSettings.html',1,'']]], + ['size_3',['size',['../classMask.html#aafa0857af35b02ba6070e76f82d51c7b',1,'Mask::size()'],['../classArray2D.html#accf87be860645d6c50d6ba6fa39ec6f9',1,'Array2D::size()']]], + ['size_5f_4',['size_',['../classMask.html#a84bff46271e16eb8639c1831403c1bb9',1,'Mask::size_'],['../classArray2D.html#a75bc7a1ff6f218c38f6ab94ec34e9472',1,'Array2D::size_']]], + ['solve_5',['solve',['../classGaussSeidel.html#a6f0eb0c6938a64f8ded186f88170a04b',1,'GaussSeidel::solve()'],['../classPressureSolver.html#a504ac61a1317650e0eb70d6a93212ca0',1,'PressureSolver::solve()'],['../classSOR.html#a860992d85d8aacf114a3a02b5831f728',1,'SOR::solve()']]], + ['sor_6',['sor',['../classSOR.html',1,'SOR'],['../classSOR.html#a357cfea8935f4b2dfee06f2d8e1461a8',1,'SOR::SOR()']]], + ['staggeredgrid_7',['staggeredgrid',['../classStaggeredGrid.html',1,'StaggeredGrid'],['../classStaggeredGrid.html#aec0990b64c559b1690f21b48fb2d13b1',1,'StaggeredGrid::StaggeredGrid()']]] +]; diff --git a/documentation/html/search/classes_0.js b/documentation/html/search/classes_0.js new file mode 100644 index 00000000..a18a1a26 --- /dev/null +++ b/documentation/html/search/classes_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['array2d_0',['Array2D',['../classArray2D.html',1,'']]] +]; diff --git a/documentation/html/search/classes_1.js b/documentation/html/search/classes_1.js new file mode 100644 index 00000000..e067cded --- /dev/null +++ b/documentation/html/search/classes_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['boundary_0',['Boundary',['../classBoundary.html',1,'']]] +]; diff --git a/documentation/html/search/classes_2.js b/documentation/html/search/classes_2.js new file mode 100644 index 00000000..665d9deb --- /dev/null +++ b/documentation/html/search/classes_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['centraldifferences_0',['CentralDifferences',['../classCentralDifferences.html',1,'']]], + ['computation_1',['Computation',['../classComputation.html',1,'']]] +]; diff --git a/documentation/html/search/classes_3.js b/documentation/html/search/classes_3.js new file mode 100644 index 00000000..6c1d2569 --- /dev/null +++ b/documentation/html/search/classes_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['discretization_0',['Discretization',['../classDiscretization.html',1,'']]], + ['donorcell_1',['DonorCell',['../classDonorCell.html',1,'']]] +]; diff --git a/documentation/html/search/classes_4.js b/documentation/html/search/classes_4.js new file mode 100644 index 00000000..f09b5865 --- /dev/null +++ b/documentation/html/search/classes_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['fieldvariable_0',['FieldVariable',['../classFieldVariable.html',1,'']]], + ['fluidtracer_1',['FluidTracer',['../classFluidTracer.html',1,'']]] +]; diff --git a/documentation/html/search/classes_5.js b/documentation/html/search/classes_5.js new file mode 100644 index 00000000..461456be --- /dev/null +++ b/documentation/html/search/classes_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['gaussseidel_0',['GaussSeidel',['../classGaussSeidel.html',1,'']]] +]; diff --git a/documentation/html/search/classes_6.js b/documentation/html/search/classes_6.js new file mode 100644 index 00000000..a14c2b1e --- /dev/null +++ b/documentation/html/search/classes_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['linecontent_0',['LineContent',['../structSettings_1_1LineContent.html',1,'Settings']]] +]; diff --git a/documentation/html/search/classes_7.js b/documentation/html/search/classes_7.js new file mode 100644 index 00000000..e15d664e --- /dev/null +++ b/documentation/html/search/classes_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['mask_0',['Mask',['../classMask.html',1,'']]] +]; diff --git a/documentation/html/search/classes_8.js b/documentation/html/search/classes_8.js new file mode 100644 index 00000000..780dc018 --- /dev/null +++ b/documentation/html/search/classes_8.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['outputwriter_0',['OutputWriter',['../classOutputWriter.html',1,'']]], + ['outputwriterparaview_1',['OutputWriterParaview',['../classOutputWriterParaview.html',1,'']]], + ['outputwritertext_2',['OutputWriterText',['../classOutputWriterText.html',1,'']]] +]; diff --git a/documentation/html/search/classes_9.js b/documentation/html/search/classes_9.js new file mode 100644 index 00000000..b1ff3b09 --- /dev/null +++ b/documentation/html/search/classes_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['pressuresolver_0',['PressureSolver',['../classPressureSolver.html',1,'']]] +]; diff --git a/documentation/html/search/classes_a.js b/documentation/html/search/classes_a.js new file mode 100644 index 00000000..5f84540d --- /dev/null +++ b/documentation/html/search/classes_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['settings_0',['Settings',['../structSettings.html',1,'']]], + ['sor_1',['SOR',['../classSOR.html',1,'']]], + ['staggeredgrid_2',['StaggeredGrid',['../classStaggeredGrid.html',1,'']]] +]; diff --git a/documentation/html/search/close.svg b/documentation/html/search/close.svg new file mode 100644 index 00000000..337d6cc1 --- /dev/null +++ b/documentation/html/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/documentation/html/search/functions_0.js b/documentation/html/search/functions_0.js new file mode 100644 index 00000000..b31bc990 --- /dev/null +++ b/documentation/html/search/functions_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['array2d_0',['Array2D',['../classArray2D.html#a16521417dfdf67ec694bfb7747df9000',1,'Array2D']]] +]; diff --git a/documentation/html/search/functions_1.js b/documentation/html/search/functions_1.js new file mode 100644 index 00000000..6da961b1 --- /dev/null +++ b/documentation/html/search/functions_1.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['calculateresiduum_0',['calculateResiduum',['../classPressureSolver.html#afc51f4315c483988aeec327a16c5bb90',1,'PressureSolver']]], + ['centraldifferences_1',['CentralDifferences',['../classCentralDifferences.html#ab055731e615298f745364c54f86fc191',1,'CentralDifferences']]], + ['computed2udx2_2',['computeD2uDx2',['../classDiscretization.html#a6986501b0b5c96699ff3ac843c1a6ca2',1,'Discretization']]], + ['computed2udy2_3',['computeD2uDy2',['../classDiscretization.html#a446aabc55a9fb4b5cb2f476babc532f9',1,'Discretization']]], + ['computed2vdx2_4',['computeD2vDx2',['../classDiscretization.html#a5119047788a34eadf37480e913bdc8ea',1,'Discretization']]], + ['computed2vdy2_5',['computeD2vDy2',['../classDiscretization.html#a56678582a049b1b141621e41afff1438',1,'Discretization']]], + ['computedpdx_6',['computeDpDx',['../classDiscretization.html#aed3ad75ad6e647d14f118a12652c01b2',1,'Discretization']]], + ['computedpdy_7',['computeDpDy',['../classDiscretization.html#a859f4dc33f0ea91f5e6537be09ce4999',1,'Discretization']]], + ['computedu2dx_8',['computedu2dx',['../classDonorCell.html#a265bdaf46ed8ba46a42ef0cb03807175',1,'DonorCell::computeDu2Dx()'],['../classDiscretization.html#acca6bf193e0e91f645d292527299254b',1,'Discretization::computeDu2Dx()'],['../classCentralDifferences.html#adb4502f473cc047a433db596146672e4',1,'CentralDifferences::computeDu2Dx(int i, int j) const override']]], + ['computeduvdx_9',['computeduvdx',['../classCentralDifferences.html#a9bd7ac3bfd709991525ec57de10ed2e1',1,'CentralDifferences::computeDuvDx()'],['../classDiscretization.html#ab1c2aa237e13e7c4c9edd429de656795',1,'Discretization::computeDuvDx()'],['../classDonorCell.html#ae41b5f85743ca7f148bd829561bd9cb5',1,'DonorCell::computeDuvDx()']]], + ['computeduvdy_10',['computeduvdy',['../classCentralDifferences.html#a4184367de8d48e678edfb078a19fc0a4',1,'CentralDifferences::computeDuvDy()'],['../classDiscretization.html#a0bab86aef10a72e01b4f8102a3c91f84',1,'Discretization::computeDuvDy()'],['../classDonorCell.html#a285562312f08efde26afd160174d2843',1,'DonorCell::computeDuvDy()']]], + ['computedv2dy_11',['computedv2dy',['../classCentralDifferences.html#a66eb9b800b9a9ac6f81fc719a42eb0ee',1,'CentralDifferences::computeDv2Dy()'],['../classDiscretization.html#a69ba136ab7f8c09d805afca159cab428',1,'Discretization::computeDv2Dy()'],['../classDonorCell.html#a01dcfb7fcf356d5ee412107a30c26fb3',1,'DonorCell::computeDv2Dy()']]], + ['createparticles_12',['createParticles',['../classFluidTracer.html#ace163e1fe040acbd4c3122f082b08eea',1,'FluidTracer']]] +]; diff --git a/documentation/html/search/functions_2.js b/documentation/html/search/functions_2.js new file mode 100644 index 00000000..b6980f71 --- /dev/null +++ b/documentation/html/search/functions_2.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['discretization_0',['Discretization',['../classDiscretization.html#a4fb8cc9823938e7c2dec329b906a462c',1,'Discretization']]], + ['donorcell_1',['DonorCell',['../classDonorCell.html#a4896ad035a5ac50c85e2b66d442a5312',1,'DonorCell']]], + ['dx_2',['dx',['../classStaggeredGrid.html#aec8490affea703cdd73b1febaed68968',1,'StaggeredGrid']]], + ['dy_3',['dy',['../classStaggeredGrid.html#abde2da10e0c130fb0f206de64c9b4956',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/functions_3.js b/documentation/html/search/functions_3.js new file mode 100644 index 00000000..b8771a06 --- /dev/null +++ b/documentation/html/search/functions_3.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['f_0',['f',['../classStaggeredGrid.html#adb05c59512dc8993367e4beddba05785',1,'StaggeredGrid']]], + ['fibegin_1',['fIBegin',['../classStaggeredGrid.html#a5cc368f9ede58a3cb689705df998f750',1,'StaggeredGrid']]], + ['fieldvariable_2',['FieldVariable',['../classFieldVariable.html#aa0985778bc6331b74904a03c3ef67a98',1,'FieldVariable']]], + ['fiend_3',['fIEnd',['../classStaggeredGrid.html#a8162b849231354ba73aacb085b5cd665',1,'StaggeredGrid']]], + ['findabsmax_4',['findAbsMax',['../classFieldVariable.html#a55168fd422c70c8386ba311909427cf7',1,'FieldVariable']]], + ['fjbegin_5',['fJBegin',['../classStaggeredGrid.html#ab92aca90331200d0cc7bc0c0a857b4ef',1,'StaggeredGrid']]], + ['fjend_6',['fJEnd',['../classStaggeredGrid.html#a7ac43ac86231987bc0bf6565589d52e1',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/functions_4.js b/documentation/html/search/functions_4.js new file mode 100644 index 00000000..59e6fbba --- /dev/null +++ b/documentation/html/search/functions_4.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['g_0',['g',['../classStaggeredGrid.html#aaf849bec40f7fa7c68823038f0877341',1,'StaggeredGrid']]], + ['gaussseidel_1',['GaussSeidel',['../classGaussSeidel.html#af31cc1ace2d616ebb8e0592c06865b9c',1,'GaussSeidel']]], + ['getnumberoffluidcells_2',['getNumberOfFluidCells',['../classMask.html#a3471a6026ce7eab118f660557a8abac6',1,'Mask']]], + ['getnumberofparticles_3',['getNumberOfParticles',['../classFluidTracer.html#adc687a4988f532e21e13c9aa0591d658',1,'FluidTracer']]], + ['getparticleposition_4',['getParticlePosition',['../classFluidTracer.html#a37ee0325d6af08be6eba8b073162342e',1,'FluidTracer']]], + ['gibegin_5',['gIBegin',['../classStaggeredGrid.html#a061fb6d6948cdc3054171dd60842a8c3',1,'StaggeredGrid']]], + ['giend_6',['gIEnd',['../classStaggeredGrid.html#aebc76693e5dd61db521d6763236bf664',1,'StaggeredGrid']]], + ['gjbegin_7',['gJBegin',['../classStaggeredGrid.html#a18ca3a121787b19c18886b0945aca2e3',1,'StaggeredGrid']]], + ['gjend_8',['gJEnd',['../classStaggeredGrid.html#a7a29456e1bce9efffa27de0b41957b50',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/functions_5.js b/documentation/html/search/functions_5.js new file mode 100644 index 00000000..92857a86 --- /dev/null +++ b/documentation/html/search/functions_5.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['initialize_0',['initialize',['../classComputation.html#a4a344479797b15bd5c9ed2f262657339',1,'Computation']]], + ['interpolateat_1',['interpolateAt',['../classFieldVariable.html#a2949624f1d2d7e29872f743db0b1d83b',1,'FieldVariable']]], + ['isair_2',['isAir',['../classMask.html#a7eb34f789ef96c622ab93718d5278d77',1,'Mask']]], + ['isfluid_3',['isFluid',['../classMask.html#aadacef52f95b796920864b8519d0594b',1,'Mask']]], + ['isobstacle_4',['isObstacle',['../classMask.html#a53e4e7c0b29234856cbee33386cc5c18',1,'Mask']]] +]; diff --git a/documentation/html/search/functions_6.js b/documentation/html/search/functions_6.js new file mode 100644 index 00000000..73effe35 --- /dev/null +++ b/documentation/html/search/functions_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['loadfromfile_0',['loadFromFile',['../structSettings.html#a55f95e3b6e7379bef4f8399a2cd670cc',1,'Settings']]] +]; diff --git a/documentation/html/search/functions_7.js b/documentation/html/search/functions_7.js new file mode 100644 index 00000000..028ffad4 --- /dev/null +++ b/documentation/html/search/functions_7.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['mask_0',['Mask',['../classMask.html#a5d65d3a108a79864bc69994f5e56f6c3',1,'Mask']]], + ['meshwidth_1',['meshWidth',['../classStaggeredGrid.html#a330856d4efe952771daf0753ef84068e',1,'StaggeredGrid']]], + ['moveparticles_2',['moveParticles',['../classFluidTracer.html#aba4d452f26e9276b91256dd251789b90',1,'FluidTracer']]] +]; diff --git a/documentation/html/search/functions_8.js b/documentation/html/search/functions_8.js new file mode 100644 index 00000000..92b377ad --- /dev/null +++ b/documentation/html/search/functions_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ncells_0',['nCells',['../classStaggeredGrid.html#af37816ccb2c46e4a514dedac261897bf',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/functions_9.js b/documentation/html/search/functions_9.js new file mode 100644 index 00000000..d4da1e44 --- /dev/null +++ b/documentation/html/search/functions_9.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['operator_28_29_0',['operator()',['../classMask.html#a6d612f1ac2185304b3ad7432d90dcd2b',1,'Mask::operator()(int i, int j)'],['../classMask.html#a154acb41f2695c2a6ace82b5ebccbb1c',1,'Mask::operator()(int i, int j) const'],['../classArray2D.html#a9d49e5544f4acf51a57dcbb0ed1bb0f8',1,'Array2D::operator()(int i, int j)'],['../classArray2D.html#af745718ec25b815051de2d0c3c94e0d2',1,'Array2D::operator()(int i, int j) const']]], + ['outputwriter_1',['outputwriter',['../classOutputWriter.html#a4f3180552b8102c27e087357b9cdd1f7',1,'OutputWriter::OutputWriter()'],['../classOutputWriterText.html#a4f3180552b8102c27e087357b9cdd1f7',1,'OutputWriterText::OutputWriter()']]], + ['outputwriterparaview_2',['OutputWriterParaview',['../classOutputWriterParaview.html#a7a599c2694986563c801806234eb07d7',1,'OutputWriterParaview']]] +]; diff --git a/documentation/html/search/functions_a.js b/documentation/html/search/functions_a.js new file mode 100644 index 00000000..c90bef05 --- /dev/null +++ b/documentation/html/search/functions_a.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['p_0',['p',['../classStaggeredGrid.html#aafe6e0bb3509f6aad272b94f74e7ffec',1,'StaggeredGrid::p() const'],['../classStaggeredGrid.html#aa6a5d99d9b4fbd9bd9cfa6ec071918f9',1,'StaggeredGrid::p(int i, int j) const'],['../classStaggeredGrid.html#aa09a4ca67141589bae153797fbc4f3c5',1,'StaggeredGrid::p(int i, int j)']]], + ['pibegin_1',['pIBegin',['../classStaggeredGrid.html#a9922c955707f2a31a4a27d1d696f002e',1,'StaggeredGrid']]], + ['piend_2',['pIEnd',['../classStaggeredGrid.html#a34f16fdf87971fe84ffc3c84722bb2c7',1,'StaggeredGrid']]], + ['pjbegin_3',['pJBegin',['../classStaggeredGrid.html#ae4c9ba16c5635dc1ffaa264fbcc3e034',1,'StaggeredGrid']]], + ['pjend_4',['pJEnd',['../classStaggeredGrid.html#ad9928ee522eedb7d7fd48ca0b92f2795',1,'StaggeredGrid']]], + ['pressuresolver_5',['PressureSolver',['../classPressureSolver.html#a10803d8c3d7f3810fc0ba059acf04058',1,'PressureSolver']]], + ['printsettings_6',['printSettings',['../structSettings.html#a68ce38117dcef2cbdd3bd17f127b3078',1,'Settings']]] +]; diff --git a/documentation/html/search/functions_b.js b/documentation/html/search/functions_b.js new file mode 100644 index 00000000..4e64c4dc --- /dev/null +++ b/documentation/html/search/functions_b.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['readsingleline_0',['readSingleLine',['../structSettings.html#a6dbc25f91b99664976cd4a0a8af153c9',1,'Settings']]], + ['resetmask_1',['resetMask',['../classMask.html#ac30997cdd83faef98290733acb325cf8',1,'Mask']]], + ['rhs_2',['rhs',['../classStaggeredGrid.html#a3f36422a02b9b18d1577d61e406f08cf',1,'StaggeredGrid::rhs() const'],['../classStaggeredGrid.html#a761ea51f1e8fd1290b3adfe09942b0d3',1,'StaggeredGrid::rhs(int i, int j)']]], + ['rhsibegin_3',['rhsIBegin',['../classStaggeredGrid.html#ad5c16b00d9dbf0f115e1ded81203edce',1,'StaggeredGrid']]], + ['rhsiend_4',['rhsIEnd',['../classStaggeredGrid.html#ae11e8842fdd508b914dc8f24b09b36a9',1,'StaggeredGrid']]], + ['rhsjbegin_5',['rhsJBegin',['../classStaggeredGrid.html#a28c36939e3d3cc8df76e7aa91f0e0804',1,'StaggeredGrid']]], + ['rhsjend_6',['rhsJEnd',['../classStaggeredGrid.html#a953ec890a986473bffe87ea26dfcd782',1,'StaggeredGrid']]], + ['runsimulation_7',['runSimulation',['../classComputation.html#ad20ce6e82ec9a918e6ac03840bc688d5',1,'Computation']]] +]; diff --git a/documentation/html/search/functions_c.js b/documentation/html/search/functions_c.js new file mode 100644 index 00000000..8ac7307e --- /dev/null +++ b/documentation/html/search/functions_c.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['setboundaryvalues_0',['setBoundaryValues',['../classPressureSolver.html#a458c383fcacaf54c1a333a271049ca93',1,'PressureSolver']]], + ['setparameter_1',['setParameter',['../structSettings.html#a588f30eb8d791c03ec811360386bff0d',1,'Settings']]], + ['size_2',['size',['../classMask.html#aafa0857af35b02ba6070e76f82d51c7b',1,'Mask::size()'],['../classArray2D.html#accf87be860645d6c50d6ba6fa39ec6f9',1,'Array2D::size()']]], + ['solve_3',['solve',['../classGaussSeidel.html#a6f0eb0c6938a64f8ded186f88170a04b',1,'GaussSeidel::solve()'],['../classPressureSolver.html#a504ac61a1317650e0eb70d6a93212ca0',1,'PressureSolver::solve()'],['../classSOR.html#a860992d85d8aacf114a3a02b5831f728',1,'SOR::solve() override']]], + ['sor_4',['SOR',['../classSOR.html#a357cfea8935f4b2dfee06f2d8e1461a8',1,'SOR']]], + ['staggeredgrid_5',['StaggeredGrid',['../classStaggeredGrid.html#aec0990b64c559b1690f21b48fb2d13b1',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/functions_d.js b/documentation/html/search/functions_d.js new file mode 100644 index 00000000..3c653a05 --- /dev/null +++ b/documentation/html/search/functions_d.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['u_0',['u',['../classStaggeredGrid.html#a87cee12621c641ab143a8b1a61b2ef7e',1,'StaggeredGrid::u() const'],['../classStaggeredGrid.html#a0324ce4d1fe2343d8aa9514e460cc556',1,'StaggeredGrid::u(int i, int j) const'],['../classStaggeredGrid.html#a0ed62d6752b6b2b3ead5f654b515cd12',1,'StaggeredGrid::u(int i, int j)']]], + ['uibegin_1',['uIBegin',['../classStaggeredGrid.html#a31e2d3a0b6e03685380810a7c2f323e1',1,'StaggeredGrid']]], + ['uiend_2',['uIEnd',['../classStaggeredGrid.html#a641e473d72e1d02ba3de1c16e9d0d332',1,'StaggeredGrid']]], + ['ujbegin_3',['uJBegin',['../classStaggeredGrid.html#a9b0e97704e1871441a8e713ecaa2cff5',1,'StaggeredGrid']]], + ['ujend_4',['uJEnd',['../classStaggeredGrid.html#a3393aa91b17054d2d700de308ae25632',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/functions_e.js b/documentation/html/search/functions_e.js new file mode 100644 index 00000000..8b908be9 --- /dev/null +++ b/documentation/html/search/functions_e.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['v_0',['v',['../classStaggeredGrid.html#a26e478abba632554652c9e05a279d1ca',1,'StaggeredGrid::v() const'],['../classStaggeredGrid.html#ac052d8803ff950aee04b86ac026c516b',1,'StaggeredGrid::v(int i, int j) const'],['../classStaggeredGrid.html#a7746f703f32c2f20a4c77246eebac697',1,'StaggeredGrid::v(int i, int j)']]], + ['vibegin_1',['vIBegin',['../classStaggeredGrid.html#ace7bf8cb1d279131739d5d12de302d09',1,'StaggeredGrid']]], + ['viend_2',['vIEnd',['../classStaggeredGrid.html#aa5a44aa088b5a7923fa952af1ecb5778',1,'StaggeredGrid']]], + ['vjbegin_3',['vJBegin',['../classStaggeredGrid.html#a7f8468d672411c0e3a5eeb67788fc826',1,'StaggeredGrid']]], + ['vjend_4',['vJEnd',['../classStaggeredGrid.html#ab67e8d9d8d76d34fb02d4d644f0b3795',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/functions_f.js b/documentation/html/search/functions_f.js new file mode 100644 index 00000000..9578483c --- /dev/null +++ b/documentation/html/search/functions_f.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['writefile_0',['writefile',['../classOutputWriter.html#ac625c204affdc05919388a3549c2e945',1,'OutputWriter::writeFile()'],['../classOutputWriterParaview.html#a9e203b63d0e2f26ad53d18ee1821c6bb',1,'OutputWriterParaview::writeFile()'],['../classOutputWriterText.html#a25a12ea2524fc34e9acb19ef1f4c7431',1,'OutputWriterText::writeFile(double currentTime)']]], + ['writepressurefile_1',['writePressureFile',['../classOutputWriterText.html#a3480b58a23fd158f16d0ef9c1b67cbfd',1,'OutputWriterText']]] +]; diff --git a/documentation/html/search/mag.svg b/documentation/html/search/mag.svg new file mode 100644 index 00000000..ffb6cf0d --- /dev/null +++ b/documentation/html/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/documentation/html/search/mag_d.svg b/documentation/html/search/mag_d.svg new file mode 100644 index 00000000..4122773f --- /dev/null +++ b/documentation/html/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/documentation/html/search/mag_sel.svg b/documentation/html/search/mag_sel.svg new file mode 100644 index 00000000..553dba87 --- /dev/null +++ b/documentation/html/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/documentation/html/search/mag_seld.svg b/documentation/html/search/mag_seld.svg new file mode 100644 index 00000000..c906f84c --- /dev/null +++ b/documentation/html/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/documentation/html/search/search.css b/documentation/html/search/search.css new file mode 100644 index 00000000..19f76f9d --- /dev/null +++ b/documentation/html/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/documentation/html/search/search.js b/documentation/html/search/search.js new file mode 100644 index 00000000..666af01e --- /dev/null +++ b/documentation/html/search/search.js @@ -0,0 +1,694 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +const SEARCH_COOKIE_NAME = ''+'search_grp'; + +const searchResults = new SearchResults(); + +/* A class handling everything associated with the search panel. + + Parameters: + name - The name of the global variable that will be + storing this instance. Is needed to be able to set timeouts. + resultPath - path to use for external files +*/ +function SearchBox(name, resultsPath, extension) { + if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } + if (!extension || extension == "") { extension = ".html"; } + + function getXPos(item) { + let x = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + x += item.offsetLeft; + item = item.offsetParent; + } + } + return x; + } + + function getYPos(item) { + let y = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + y += item.offsetTop; + item = item.offsetParent; + } + } + return y; + } + + // ---------- Instance variables + this.name = name; + this.resultsPath = resultsPath; + this.keyTimeout = 0; + this.keyTimeoutLength = 500; + this.closeSelectionTimeout = 300; + this.lastSearchValue = ""; + this.lastResultsPage = ""; + this.hideTimeout = 0; + this.searchIndex = 0; + this.searchActive = false; + this.extension = extension; + + // ----------- DOM Elements + + this.DOMSearchField = () => document.getElementById("MSearchField"); + this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); + this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); + this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); + this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); + this.DOMSearchClose = () => document.getElementById("MSearchClose"); + this.DOMSearchBox = () => document.getElementById("MSearchBox"); + + // ------------ Event Handlers + + // Called when focus is added or removed from the search field. + this.OnSearchFieldFocus = function(isActive) { + this.Activate(isActive); + } + + this.OnSearchSelectShow = function() { + const searchSelectWindow = this.DOMSearchSelectWindow(); + const searchField = this.DOMSearchSelect(); + + const left = getXPos(searchField); + const top = getYPos(searchField) + searchField.offsetHeight; + + // show search selection popup + searchSelectWindow.style.display='block'; + searchSelectWindow.style.left = left + 'px'; + searchSelectWindow.style.top = top + 'px'; + + // stop selection hide timer + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + this.hideTimeout=0; + } + return false; // to avoid "image drag" default event + } + + this.OnSearchSelectHide = function() { + this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), + this.closeSelectionTimeout); + } + + // Called when the content of the search field is changed. + this.OnSearchFieldChange = function(evt) { + if (this.keyTimeout) { // kill running timer + clearTimeout(this.keyTimeout); + this.keyTimeout = 0; + } + + const e = evt ? evt : window.event; // for IE + if (e.keyCode==40 || e.keyCode==13) { + if (e.shiftKey==1) { + this.OnSearchSelectShow(); + const win=this.DOMSearchSelectWindow(); + for (let i=0;i do a search + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) { // Up + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } else if (e.keyCode==13 || e.keyCode==27) { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() { + this.keyTimeout = 0; + + // strip leading whitespace + const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + const code = searchValue.toLowerCase().charCodeAt(0); + let idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair + idxChar = searchValue.substr(0, 2); + } + + let jsFile; + let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) { + const hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + const loadJS = function(url, impl, loc) { + const scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + const domSearchBox = this.DOMSearchBox(); + const domPopupSearchResults = this.DOMPopupSearchResults(); + const domSearchClose = this.DOMSearchClose(); + const resultsPath = this.resultsPath; + + const handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') { + domSearchClose.style.display = 'inline-block'; + let left = getXPos(domSearchBox) + 150; + let top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + const maxWidth = document.body.clientWidth; + const maxHeight = document.body.clientHeight; + let width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + let height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } else if (!isActive) { // directly remove the panel + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults() { + + function convertToId(search) { + let result = ''; + for (let i=0;i. + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) { + const parentElement = document.getElementById(id); + let element = parentElement.firstChild; + + while (element && element!=parentElement) { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { + element = element.firstChild; + } else if (element.nextSibling) { + element = element.nextSibling; + } else { + do { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) { + const element = this.FindChildElement(id); + if (element) { + if (element.style.display == 'block') { + element.style.display = 'none'; + } else { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) { + if (!search) { // get search word from URL + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + const resultRows = document.getElementsByTagName("div"); + let matches = 0; + + let i = 0; + while (i < resultRows.length) { + const row = resultRows.item(i); + if (row.className == "SRResult") { + let rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) { + row.style.display = 'block'; + matches++; + } else { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) { // no results + document.getElementById("NoMatches").style.display='block'; + } else { // at least one result + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) { + if (e.type == "keydown") { + this.repeatOn = false; + this.lastKey = e.keyCode; + } else if (e.type == "keypress") { + if (!this.repeatOn) { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } else if (e.type == "keyup") { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + const newIndex = itemIndex-1; + let focusItem = this.NavPrev(newIndex); + if (focusItem) { + let child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') { // children visible + let n=0; + let tmpElem; + for (;;) { // search for last child + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) { + focusItem = tmpElem; + } else { // found it! + break; + } + n++; + } + } + } + if (focusItem) { + focusItem.focus(); + } else { // return focus to search field + document.getElementById("MSearchField").focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = itemIndex+1; + let focusItem; + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') { // children visible + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } else if (this.lastKey==39) { // Right + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } else if (this.lastKey==37) { // Left + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + if (childIndex>0) { + const newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } else { // already at first child, jump to parent + document.getElementById('Item'+itemIndex).focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = childIndex+1; + let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) { // last child, jump to parent next parent + elem = this.NavNext(itemIndex+1); + } + if (elem) { + elem.focus(); + } + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } +} + +function createResults(resultsPath) { + + function setKeyActions(elem,action) { + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); + } + + function setClassAttr(elem,attr) { + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); + } + + const results = document.getElementById("SRResults"); + results.innerHTML = ''; + searchData.forEach((elem,index) => { + const id = elem[0]; + const srResult = document.createElement('div'); + srResult.setAttribute('id','SR_'+id); + setClassAttr(srResult,'SRResult'); + const srEntry = document.createElement('div'); + setClassAttr(srEntry,'SREntry'); + const srLink = document.createElement('a'); + srLink.setAttribute('id','Item'+index); + setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); + setClassAttr(srLink,'SRSymbol'); + srLink.innerHTML = elem[1][0]; + srEntry.appendChild(srLink); + if (elem[1].length==2) { // single result + srLink.setAttribute('href',resultsPath+elem[1][1][0]); + srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); + if (elem[1][1][1]) { + srLink.setAttribute('target','_parent'); + } else { + srLink.setAttribute('target','_blank'); + } + const srScope = document.createElement('span'); + setClassAttr(srScope,'SRScope'); + srScope.innerHTML = elem[1][1][2]; + srEntry.appendChild(srScope); + } else { // multiple results + srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); + const srChildren = document.createElement('div'); + setClassAttr(srChildren,'SRChildren'); + for (let c=0; c + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/settings_parser/settings.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    settings.h
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include <iostream>
    +
    4#include <array>
    +
    5#include <fstream>
    +
    6#include <iostream>
    +
    7#include <functional>
    +
    8
    +
    + +
    14{
    +
    15 std::array<int, 2> nCells;
    +
    16 std::array<double, 2> physicalSize;
    +
    17 double re = 1000;
    +
    18 double endTime = 10.0;
    +
    19 double tau = 0.5;
    +
    20 double maximumDt = 0.1;
    +
    21
    +
    22 std::array<double, 2> g{0., 0.};
    +
    23
    +
    24 bool useDonorCell = false;
    +
    25 double alpha = 0.5;
    +
    26
    +
    27 // Boundary Conditions Type
    +
    28 std::string BCTop = "NoSlip";
    +
    29 std::string BCRight = "NoSlip";
    +
    30 std::string BCBottom = "NoSlip";
    +
    31 std::string BCLeft = "NoSlip";
    +
    32
    +
    33 // NoSlip boundary conditions
    +
    34 std::array<double, 2> NoSlipVelTop;
    +
    35 std::array<double, 2> NoSlipVelRight;
    +
    36 std::array<double, 2> NoSlipVelBottom;
    +
    37 std::array<double, 2> NoSlipVelLeft;
    +
    38
    +
    39 // Pressure boundary conditions
    +
    40 double PressureTop;
    + + +
    43 double PressureLeft;
    +
    44
    +
    45 // Create rectangular obstacle in domain
    + +
    47
    +
    48 // Create domain from PNGBitmap
    + +
    50 std::string pathToBitmap;
    +
    51
    +
    52 std::array<double, 2> obstaclePosition;
    +
    53 std::array<double, 2> obstacleDimension;
    +
    54
    +
    55 std::string pressureSolver = "SOR";
    +
    56 double omega = 1.0;
    +
    57 double epsilon = 1e-5;
    + +
    59
    +
    65 void loadFromFile(std::string filename);
    +
    66
    +
    70 void printSettings();
    +
    71
    +
    + +
    77 {
    +
    78 std::string parameterName;
    +
    79 std::string value;
    +
    80 bool isContent;
    +
    81 };
    +
    +
    82
    +
    88 LineContent readSingleLine(std::string line);
    +
    89
    +
    90 // sets the parameter to the corresponding value
    +
    97 void setParameter(std::string parameterName, std::string value);
    +
    98};
    +
    +
    Contains the content of a single line in a file.
    Definition settings.h:77
    +
    std::string value
    value of the parameter
    Definition settings.h:79
    +
    std::string parameterName
    Name of parameter.
    Definition settings.h:78
    +
    bool isContent
    whether line is readable parameter or comment
    Definition settings.h:80
    +
    All settings that parametrize a simulation run.
    Definition settings.h:14
    +
    bool useDonorCell
    if the donor cell scheme schould be used
    Definition settings.h:24
    +
    std::array< double, 2 > NoSlipVelBottom
    prescribed values of u,v at bottom of domain
    Definition settings.h:36
    +
    std::array< double, 2 > g
    external forces
    Definition settings.h:22
    +
    std::array< double, 2 > NoSlipVelRight
    prescribed values of u,v at right of domain
    Definition settings.h:35
    +
    std::array< double, 2 > physicalSize
    physical size of the domain
    Definition settings.h:16
    +
    std::string pathToBitmap
    path to bitmap
    Definition settings.h:50
    +
    std::array< int, 2 > nCells
    number of cells in x and y direction
    Definition settings.h:15
    +
    double PressureLeft
    prescribed pressure BC left of domain
    Definition settings.h:43
    +
    void loadFromFile(std::string filename)
    Parse a text file with settings.
    Definition settings.cpp:3
    +
    void setParameter(std::string parameterName, std::string value)
    Sets the parameter to the corresponding value.
    Definition settings.cpp:99
    +
    double PressureTop
    prescribed pressure BC top of domain
    Definition settings.h:40
    +
    bool createDomainfromBitmap
    wheter domain should be created from bitmap
    Definition settings.h:49
    +
    void printSettings()
    Print all setting to terminal.
    Definition settings.cpp:40
    +
    LineContent readSingleLine(std::string line)
    Reads one line of the settings file.
    Definition settings.cpp:53
    +
    double endTime
    end time of the simulation
    Definition settings.h:18
    +
    std::array< double, 2 > NoSlipVelTop
    prescribed values of u,v at top of domain
    Definition settings.h:34
    +
    std::string pressureSolver
    which pressure solver to use, "GaussSeidel" or "SOR"
    Definition settings.h:55
    +
    double alpha
    factor for donor-cell scheme
    Definition settings.h:25
    +
    double re
    reynolds number
    Definition settings.h:17
    +
    double PressureRight
    prescribed pressure BC right of domain
    Definition settings.h:41
    +
    double maximumDt
    maximum time step width
    Definition settings.h:20
    +
    bool createRectangularObject
    wheter a rectangular object in domain should be created
    Definition settings.h:46
    +
    double epsilon
    tolerance for the residual in the pressure solver
    Definition settings.h:57
    +
    std::array< double, 2 > NoSlipVelLeft
    prescribed values of u,v at left of domain
    Definition settings.h:37
    +
    int maximumNumberOfIterations
    maximum number of iterations in the solver
    Definition settings.h:58
    +
    double PressureBottom
    prescribed pressure BC bottom of domain
    Definition settings.h:42
    +
    double tau
    safety factor for time step width
    Definition settings.h:19
    +
    std::array< double, 2 > obstacleDimension
    x and y dimension of rectangular object
    Definition settings.h:53
    +
    double omega
    overrelaxation factor
    Definition settings.h:56
    +
    std::array< double, 2 > obstaclePosition
    x and y position of rectangular object
    Definition settings.h:52
    +
    + + + + diff --git a/documentation/html/sor_8h_source.html b/documentation/html/sor_8h_source.html new file mode 100644 index 00000000..5a403483 --- /dev/null +++ b/documentation/html/sor_8h_source.html @@ -0,0 +1,117 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/sor.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    sor.h
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include "pressure_solver.h"
    +
    4
    +
    +
    10class SOR : public PressureSolver
    +
    11{
    +
    12
    +
    13public:
    +
    22 SOR(const std::shared_ptr<Discretization> &data,
    +
    23 double epsilon,
    +
    24 int maximumNumberOfIterations,
    +
    25 std::shared_ptr<Boundary> boundary,
    +
    26 double omega);
    +
    27
    +
    32 void solve() override;
    +
    33
    +
    34private:
    +
    35 double omega_;
    +
    36};
    +
    +
    Solves the Poisson problem for the pressure.
    Definition pressure_solver.h:21
    +
    Successive over-relaxation solver.
    Definition sor.h:11
    +
    SOR(const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary, double omega)
    Constructor.
    Definition sor.cpp:4
    +
    void solve() override
    override function that starts solver.
    Definition sor.cpp:12
    +
    + + + + diff --git a/documentation/html/splitbar.png b/documentation/html/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/documentation/html/splitbard.png b/documentation/html/splitbard.png new file mode 100644 index 0000000000000000000000000000000000000000..8367416d757fd7b6dc4272b6432dc75a75abd068 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf@VhhFKy35^fiT zT~&lUj3=cDh^%3HDY9k5CEku}PHXNoNC(_$U3XPb&Q*ME25pT;2(*BOgAf<+R$lzakPG`kF31()Fx{L5Wrac|GQzjeE= zueY1`Ze{#x<8=S|`~MgGetGce)#vN&|J{Cd^tS%;tBYTo?+^d68<#n_Y_xx`J||4O V@QB{^CqU0Kc)I$ztaD0e0svEzbJzd? literal 0 HcmV?d00001 diff --git a/documentation/html/staggered__grid_8h_source.html b/documentation/html/staggered__grid_8h_source.html new file mode 100644 index 00000000..ca9858fa --- /dev/null +++ b/documentation/html/staggered__grid_8h_source.html @@ -0,0 +1,219 @@ + + + + + + + +NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/staggered_grid.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    staggered_grid.h
    +
    +
    +
    1#include <array>
    +
    2#include <vector>
    +
    3#include <iostream>
    +
    4#include "../storage/field_variable.h"
    +
    5
    +
    + +
    15{
    +
    16public:
    +
    23 StaggeredGrid(std::array<int, 2> nCells, std::array<double, 2> meshWidth);
    +
    24
    +
    28 const std::array<double, 2> meshWidth() const;
    +
    32 const std::array<int, 2> nCells() const;
    +
    33
    +
    37 const FieldVariable &u() const;
    +
    41 const FieldVariable &v() const;
    +
    45 const FieldVariable &p() const;
    +
    49 const FieldVariable &rhs() const;
    +
    50
    +
    54 double u(int i, int j) const;
    +
    58 double &u(int i, int j);
    +
    59
    +
    63 double v(int i, int j) const;
    +
    67 double &v(int i, int j);
    +
    68
    +
    72 double p(int i, int j) const;
    +
    76 double &p(int i, int j);
    +
    77
    +
    81 double &f(int i, int j);
    +
    85 double &g(int i, int j);
    +
    89 double &rhs(int i, int j);
    +
    90
    +
    94 double dx() const;
    +
    98 double dy() const;
    +
    99
    +
    103 int uIBegin() const;
    +
    107 int uIEnd() const;
    +
    108
    +
    112 int uJBegin() const;
    +
    116 int uJEnd() const;
    +
    117
    +
    121 int vIBegin() const;
    +
    125 int vIEnd() const;
    +
    126
    +
    130 int vJBegin() const;
    +
    134 int vJEnd() const;
    +
    135
    +
    139 int pIBegin() const;
    +
    143 int pIEnd() const;
    +
    144
    +
    148 int pJBegin() const;
    +
    152 int pJEnd() const;
    +
    153
    +
    157 int fIBegin() const;
    +
    161 int fIEnd() const;
    +
    162
    +
    166 int fJBegin() const;
    +
    170 int fJEnd() const;
    +
    171
    +
    175 int gIBegin() const;
    +
    179 int gIEnd() const;
    +
    180
    +
    184 int gJBegin() const;
    +
    188 int gJEnd() const;
    +
    189
    +
    193 int rhsIBegin() const;
    +
    197 int rhsIEnd() const;
    +
    198
    +
    202 int rhsJBegin() const;
    +
    206 int rhsJEnd() const;
    +
    207
    +
    208protected:
    +
    209 const std::array<int, 2> nCells_;
    +
    210 const std::array<double, 2> meshWidth_;
    + + + + + + +
    217};
    +
    +
    Discretization of a scalar function.
    Definition field_variable.h:18
    +
    Create field variables and define limits for the indices.
    Definition staggered_grid.h:15
    +
    int gIBegin() const
    first valid index for g in x direction
    Definition staggered_grid.cpp:159
    +
    int gJBegin() const
    first valid index for g in y direction
    Definition staggered_grid.cpp:169
    +
    FieldVariable v_
    instance of the field variable v
    Definition staggered_grid.h:212
    +
    const FieldVariable & v() const
    Get a reference to the field variable v.
    Definition staggered_grid.cpp:29
    +
    int rhsJBegin() const
    first valid index for rhs in y direction
    Definition staggered_grid.cpp:209
    +
    FieldVariable p_
    instance of the field variable p
    Definition staggered_grid.h:213
    +
    int uIBegin() const
    first valid index for u in x direction
    Definition staggered_grid.cpp:99
    +
    const std::array< double, 2 > meshWidth() const
    Get the length of a single cell in x and y directions.
    Definition staggered_grid.cpp:14
    +
    int uJEnd() const
    one after last valid index for u in y direction
    Definition staggered_grid.cpp:114
    +
    int pIEnd() const
    one after last valid index for p in x direction
    Definition staggered_grid.cpp:184
    +
    const FieldVariable & rhs() const
    Get a reference to the field variable rhs.
    Definition staggered_grid.cpp:39
    +
    FieldVariable rhs_
    instance of the field variable rhs
    Definition staggered_grid.h:216
    +
    int fIBegin() const
    first valid index for f in x direction
    Definition staggered_grid.cpp:119
    +
    FieldVariable g_
    instance of the field variable g
    Definition staggered_grid.h:215
    +
    int uIEnd() const
    one after last valid index for u in x direction
    Definition staggered_grid.cpp:104
    +
    int gJEnd() const
    one after last valid index for g in y direction
    Definition staggered_grid.cpp:174
    +
    int fJEnd() const
    one after last valid index for f in y direction
    Definition staggered_grid.cpp:134
    +
    int vJBegin() const
    first valid index for v in y direction
    Definition staggered_grid.cpp:149
    +
    int fIEnd() const
    one after last valid index for f in x direction
    Definition staggered_grid.cpp:124
    +
    const FieldVariable & u() const
    Get a reference to the field variable u.
    Definition staggered_grid.cpp:24
    +
    FieldVariable f_
    instance of the field variable f
    Definition staggered_grid.h:214
    +
    int rhsJEnd() const
    one after last valid index for rhs in y direction
    Definition staggered_grid.cpp:214
    +
    const std::array< double, 2 > meshWidth_
    array containing the sizes of cell edges in x and y directions
    Definition staggered_grid.h:210
    +
    int pIBegin() const
    first valid index for p in x direction
    Definition staggered_grid.cpp:179
    +
    int uJBegin() const
    first valid index for u in y direction
    Definition staggered_grid.cpp:109
    +
    int vIEnd() const
    one after last valid index for v in x direction
    Definition staggered_grid.cpp:144
    +
    double & g(int i, int j)
    Access value of g in element (i,j)
    Definition staggered_grid.cpp:79
    +
    const FieldVariable & p() const
    Get a reference to the field variable p.
    Definition staggered_grid.cpp:34
    +
    int vJEnd() const
    one after last valid index for v in y direction
    Definition staggered_grid.cpp:154
    +
    int fJBegin() const
    first valid index for f in y direction
    Definition staggered_grid.cpp:129
    +
    double dy() const
    Get the mesh width in y-direction.
    Definition staggered_grid.cpp:94
    +
    const std::array< int, 2 > nCells_
    array containing number of cells in x and y directions
    Definition staggered_grid.h:209
    +
    int vIBegin() const
    first valid index for v in x direction
    Definition staggered_grid.cpp:139
    +
    int rhsIBegin() const
    first valid index for rhs in x direction
    Definition staggered_grid.cpp:199
    +
    int pJEnd() const
    one after last valid index for p in y direction
    Definition staggered_grid.cpp:194
    +
    double & f(int i, int j)
    Access value of f in element (i,j)
    Definition staggered_grid.cpp:74
    +
    FieldVariable u_
    instance of the field variable u
    Definition staggered_grid.h:211
    +
    int rhsIEnd() const
    one after last valid index for rhs in x direction
    Definition staggered_grid.cpp:204
    +
    int pJBegin() const
    first valid index for p in y direction
    Definition staggered_grid.cpp:189
    +
    int gIEnd() const
    one after last valid index for g in x direction
    Definition staggered_grid.cpp:164
    +
    StaggeredGrid(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
    Constructor.
    Definition staggered_grid.cpp:3
    +
    double dx() const
    Get the mesh width in x-direction.
    Definition staggered_grid.cpp:89
    +
    const std::array< int, 2 > nCells() const
    Get number of cells in x and y directions.
    Definition staggered_grid.cpp:19
    +
    + + + + diff --git a/documentation/html/structSettings-members.html b/documentation/html/structSettings-members.html new file mode 100644 index 00000000..c9be4e3f --- /dev/null +++ b/documentation/html/structSettings-members.html @@ -0,0 +1,120 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    Settings Member List
    +
    + + + + + diff --git a/documentation/html/structSettings.html b/documentation/html/structSettings.html new file mode 100644 index 00000000..b0244700 --- /dev/null +++ b/documentation/html/structSettings.html @@ -0,0 +1,326 @@ + + + + + + + +NumSim: Settings Struct Reference + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    Settings Struct Reference
    +
    +
    + +

    All settings that parametrize a simulation run. + More...

    + +

    #include <settings.h>

    + + + + + +

    +Classes

    struct  LineContent
     Contains the content of a single line in a file. More...
     
    + + + + + + + + + + + + + +

    +Public Member Functions

    void loadFromFile (std::string filename)
     Parse a text file with settings.
     
    +void printSettings ()
     Print all setting to terminal.
     
    LineContent readSingleLine (std::string line)
     Reads one line of the settings file.
     
    void setParameter (std::string parameterName, std::string value)
     Sets the parameter to the corresponding value.
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +std::array< int, 2 > nCells
     number of cells in x and y direction
     
    +std::array< double, 2 > physicalSize
     physical size of the domain
     
    +double re = 1000
     reynolds number
     
    +double endTime = 10.0
     end time of the simulation
     
    +double tau = 0.5
     safety factor for time step width
     
    +double maximumDt = 0.1
     maximum time step width
     
    +std::array< double, 2 > g {0., 0.}
     external forces
     
    +bool useDonorCell = false
     if the donor cell scheme schould be used
     
    +double alpha = 0.5
     factor for donor-cell scheme
     
    +std::string BCTop = "NoSlip"
     
    +std::string BCRight = "NoSlip"
     
    +std::string BCBottom = "NoSlip"
     
    +std::string BCLeft = "NoSlip"
     
    +std::array< double, 2 > NoSlipVelTop
     prescribed values of u,v at top of domain
     
    +std::array< double, 2 > NoSlipVelRight
     prescribed values of u,v at right of domain
     
    +std::array< double, 2 > NoSlipVelBottom
     prescribed values of u,v at bottom of domain
     
    +std::array< double, 2 > NoSlipVelLeft
     prescribed values of u,v at left of domain
     
    +double PressureTop
     prescribed pressure BC top of domain
     
    +double PressureRight
     prescribed pressure BC right of domain
     
    +double PressureBottom
     prescribed pressure BC bottom of domain
     
    +double PressureLeft
     prescribed pressure BC left of domain
     
    +bool createRectangularObject = false
     wheter a rectangular object in domain should be created
     
    +bool createDomainfromBitmap = false
     wheter domain should be created from bitmap
     
    +std::string pathToBitmap
     path to bitmap
     
    +std::array< double, 2 > obstaclePosition
     x and y position of rectangular object
     
    +std::array< double, 2 > obstacleDimension
     x and y dimension of rectangular object
     
    +std::string pressureSolver = "SOR"
     which pressure solver to use, "GaussSeidel" or "SOR"
     
    +double omega = 1.0
     overrelaxation factor
     
    +double epsilon = 1e-5
     tolerance for the residual in the pressure solver
     
    +int maximumNumberOfIterations = 1e5
     maximum number of iterations in the solver
     
    +

    Detailed Description

    +

    All settings that parametrize a simulation run.

    +

    Member Function Documentation

    + +

    ◆ loadFromFile()

    + +
    +
    + + + + + + + + +
    void Settings::loadFromFile (std::string filename)
    +
    + +

    Parse a text file with settings.

    +

    Each line contains "<parameterName> = <value>"

    + +
    +
    + +

    ◆ readSingleLine()

    + +
    +
    + + + + + + + + +
    Settings::LineContent Settings::readSingleLine (std::string line)
    +
    + +

    Reads one line of the settings file.

    +
    Parameters
    + + +
    lineline of file to read
    +
    +
    + +
    +
    + +

    ◆ setParameter()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Settings::setParameter (std::string parameterName,
    std::string value 
    )
    +
    + +

    Sets the parameter to the corresponding value.

    +
    Parameters
    + + + +
    parameterNameparamter name
    valueof parameter
    +
    +
    + +
    +
    +
    The documentation for this struct was generated from the following files:
      +
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/settings_parser/settings.h
    • +
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/settings_parser/settings.cpp
    • +
    +
    + + + + diff --git a/documentation/html/structSettings_1_1LineContent-members.html b/documentation/html/structSettings_1_1LineContent-members.html new file mode 100644 index 00000000..bed13298 --- /dev/null +++ b/documentation/html/structSettings_1_1LineContent-members.html @@ -0,0 +1,93 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    Settings::LineContent Member List
    +
    +
    + +

    This is the complete list of members for Settings::LineContent, including all inherited members.

    + + + + +
    isContentSettings::LineContent
    parameterNameSettings::LineContent
    valueSettings::LineContent
    + + + + diff --git a/documentation/html/structSettings_1_1LineContent.html b/documentation/html/structSettings_1_1LineContent.html new file mode 100644 index 00000000..6a33cf57 --- /dev/null +++ b/documentation/html/structSettings_1_1LineContent.html @@ -0,0 +1,116 @@ + + + + + + + +NumSim: Settings::LineContent Struct Reference + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    Settings::LineContent Struct Reference
    +
    +
    + +

    Contains the content of a single line in a file. + More...

    + +

    #include <settings.h>

    + + + + + + + + + + + +

    +Public Attributes

    +std::string parameterName
     Name of parameter.
     
    +std::string value
     value of the parameter
     
    +bool isContent
     whether line is readable parameter or comment
     
    +

    Detailed Description

    +

    Contains the content of a single line in a file.

    +

    The documentation for this struct was generated from the following file:
      +
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/settings_parser/settings.h
    • +
    +
    + + + + diff --git a/documentation/html/sync_off.png b/documentation/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/documentation/html/sync_on.png b/documentation/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/documentation/html/tab_a.png b/documentation/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/documentation/html/tab_ad.png b/documentation/html/tab_ad.png new file mode 100644 index 0000000000000000000000000000000000000000..e34850acfc24be58da6d2fd1ccc6b29cc84fe34d GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QhuH;jv*C{Z|5d*H3V=pKi{In zd2jxLclDRPylmD}^l7{QOtL{vUjO{-WqItb5sQp2h-99b8^^Scr-=2mblCdZuUm?4 jzOJvgvt3{(cjKLW5(A@0qPS@<&}0TrS3j3^P6y&q2{!U5bk+Tso_B!YCpDh>v z{CM*1U8YvQRyBUHt^Ju0W_sq-?;9@_4equ-bavTs=gk796zopr0EBT&m;e9( literal 0 HcmV?d00001 diff --git a/documentation/html/tab_s.png b/documentation/html/tab_s.png new file mode 100644 index 0000000000000000000000000000000000000000..ab478c95b67371d700a20869f7de1ddd73522d50 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QuUrLjv*C{Z|^p8HaRdjTwH7) zC?wLlL}}I{)n%R&r+1}IGmDnq;&J#%V6)9VsYhS`O^BVBQlxOUep0c$RENLq#g8A$ z)z7%K_bI&n@J+X_=x}fJoEKed-$<>=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/documentation/html/tab_sd.png b/documentation/html/tab_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..757a565ced4730f85c833fb2547d8e199ae68f19 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qq7(&jv*C{Z|_!fH5o7*c=%9% zcILh!EA=pAQKdx-Cdiev=v{eg{8Ht<{e8_NAN~b=)%W>-WDCE0PyDHGemi$BoXwcK z{>e9^za6*c1ilttWw&V+U;WCPlV9{LdC~Ey%_H(qj`xgfES(4Yz5jSTZfCt`4E$0YRsR*S^mTCR^;V&sxC8{l_Cp7w8-YPgg&ebxsLQ00$vXK>z>% literal 0 HcmV?d00001 diff --git a/documentation/html/tabs.css b/documentation/html/tabs.css new file mode 100644 index 00000000..71c8a470 --- /dev/null +++ b/documentation/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} \ No newline at end of file diff --git a/documentation/latex/Makefile b/documentation/latex/Makefile new file mode 100644 index 00000000..7f829721 --- /dev/null +++ b/documentation/latex/Makefile @@ -0,0 +1,27 @@ +LATEX_CMD?=pdflatex +MKIDX_CMD?=makeindex +BIBTEX_CMD?=bibtex +LATEX_COUNT?=8 +MANUAL_FILE?=refman + +all: $(MANUAL_FILE).pdf + +pdf: $(MANUAL_FILE).pdf + +$(MANUAL_FILE).pdf: clean $(MANUAL_FILE).tex + $(LATEX_CMD) $(MANUAL_FILE) + $(MKIDX_CMD) $(MANUAL_FILE).idx + $(LATEX_CMD) $(MANUAL_FILE) + latex_count=$(LATEX_COUNT) ; \ + while grep -E -s 'Rerun (LaTeX|to get cross-references right|to get bibliographical references right)' $(MANUAL_FILE).log && [ $$latex_count -gt 0 ] ;\ + do \ + echo "Rerunning latex...." ;\ + $(LATEX_CMD) $(MANUAL_FILE) ;\ + latex_count=`expr $$latex_count - 1` ;\ + done + $(MKIDX_CMD) $(MANUAL_FILE).idx + $(LATEX_CMD) $(MANUAL_FILE) + + +clean: + rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl $(MANUAL_FILE).pdf diff --git a/documentation/latex/annotated.tex b/documentation/latex/annotated.tex new file mode 100644 index 00000000..56bc5a85 --- /dev/null +++ b/documentation/latex/annotated.tex @@ -0,0 +1,21 @@ +\doxysection{Class List} +Here are the classes, structs, unions and interfaces with brief descriptions\+:\begin{DoxyCompactList} +\item\contentsline{section}{\mbox{\hyperlink{classArray2D}{Array2D}} \\*This class represents a 2D array of double values }{\pageref{classArray2D}}{} +\item\contentsline{section}{\mbox{\hyperlink{classBoundary}{Boundary}} }{\pageref{classBoundary}}{} +\item\contentsline{section}{\mbox{\hyperlink{classCentralDifferences}{Central\+Differences}} \\*Discretizes the problem using the central differences scheme }{\pageref{classCentralDifferences}}{} +\item\contentsline{section}{\mbox{\hyperlink{classComputation}{Computation}} \\*\doxylink{classComputation}{Computation} of Simulation }{\pageref{classComputation}}{} +\item\contentsline{section}{\mbox{\hyperlink{classDiscretization}{Discretization}} \\*Computes derivatives included in governing equations }{\pageref{classDiscretization}}{} +\item\contentsline{section}{\mbox{\hyperlink{classDonorCell}{Donor\+Cell}} \\*Discretizes the problem using the donor cell scheme }{\pageref{classDonorCell}}{} +\item\contentsline{section}{\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \\*\doxylink{classDiscretization}{Discretization} of a scalar function }{\pageref{classFieldVariable}}{} +\item\contentsline{section}{\mbox{\hyperlink{classFluidTracer}{Fluid\+Tracer}} }{\pageref{classFluidTracer}}{} +\item\contentsline{section}{\mbox{\hyperlink{classGaussSeidel}{Gauss\+Seidel}} \\*Standard Gauss-\/\+Seidel solver }{\pageref{classGaussSeidel}}{} +\item\contentsline{section}{\mbox{\hyperlink{structSettings_1_1LineContent}{Settings\+::\+Line\+Content}} \\*Contains the content of a single line in a file }{\pageref{structSettings_1_1LineContent}}{} +\item\contentsline{section}{\mbox{\hyperlink{classMask}{Mask}} }{\pageref{classMask}}{} +\item\contentsline{section}{\mbox{\hyperlink{classOutputWriter}{Output\+Writer}} \\*Inteface class for writing simulation data output }{\pageref{classOutputWriter}}{} +\item\contentsline{section}{\mbox{\hyperlink{classOutputWriterParaview}{Output\+Writer\+Paraview}} \\*Write \texorpdfstring{$\ast$}{*}.vti files that can be viewed with Para\+View }{\pageref{classOutputWriterParaview}}{} +\item\contentsline{section}{\mbox{\hyperlink{classOutputWriterText}{Output\+Writer\+Text}} \\*Write \texorpdfstring{$\ast$}{*}.txt files that are useful for debugging }{\pageref{classOutputWriterText}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}} \\*Solves the Poisson problem for the pressure }{\pageref{classPressureSolver}}{} +\item\contentsline{section}{\mbox{\hyperlink{structSettings}{Settings}} \\*All settings that parametrize a simulation run }{\pageref{structSettings}}{} +\item\contentsline{section}{\mbox{\hyperlink{classSOR}{SOR}} \\*Successive over-\/relaxation solver }{\pageref{classSOR}}{} +\item\contentsline{section}{\mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}} \\*Create field variables and define limits for the indices }{\pageref{classStaggeredGrid}}{} +\end{DoxyCompactList} diff --git a/documentation/latex/array2D_8h_source.tex b/documentation/latex/array2D_8h_source.tex new file mode 100644 index 00000000..c9d800f0 --- /dev/null +++ b/documentation/latex/array2D_8h_source.tex @@ -0,0 +1,52 @@ +\doxysection{array2\+D.\+h} +\hypertarget{array2D_8h_source}{}\label{array2D_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/storage/array2D.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/storage/array2D.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ } +\DoxyCodeLine{00007\ } + + + + + + +\DoxyCodeLine{00015\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classArray2D}{Array2D}}} +\DoxyCodeLine{00016\ \{} +\DoxyCodeLine{00017\ \textcolor{keyword}{public}:} + + + + +\DoxyCodeLine{00023\ \ \ \ \ \mbox{\hyperlink{classArray2D_a16521417dfdf67ec694bfb7747df9000}{Array2D}}(std::array\ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}});} +\DoxyCodeLine{00024\ } + + + + + + +\DoxyCodeLine{00032\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8}{operator()}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} +\DoxyCodeLine{00033\ } + + + + + + +\DoxyCodeLine{00041\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8}{operator()}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00042\ } + + +\DoxyCodeLine{00046\ \ \ \ \ std::array\ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00047\ } +\DoxyCodeLine{00048\ \textcolor{keyword}{protected}:} +\DoxyCodeLine{00049\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ \mbox{\hyperlink{classArray2D_a75bc7a1ff6f218c38f6ab94ec34e9472}{size\_}};\ } +\DoxyCodeLine{00050\ \ \ \ \ std::vector\ \mbox{\hyperlink{classArray2D_af1572f75d219caab4b2372a98341b991}{data\_}};\ \ \ \ \ \ } +\DoxyCodeLine{00051\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/boundary_8h_source.tex b/documentation/latex/boundary_8h_source.tex new file mode 100644 index 00000000..23d0a248 --- /dev/null +++ b/documentation/latex/boundary_8h_source.tex @@ -0,0 +1,49 @@ +\doxysection{boundary.\+h} +\hypertarget{boundary_8h_source}{}\label{boundary_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/boundary/boundary.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/boundary/boundary.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}mask.h"{}}} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ "{}../discretization/discretization.h"{}}} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ "{}../settings\_parser/settings.h"{}}} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00008\ } +\DoxyCodeLine{00009\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classBoundary}{Boundary}}} +\DoxyCodeLine{00010\ \{} +\DoxyCodeLine{00011\ \ \ \ \ \textcolor{keyword}{public}:} +\DoxyCodeLine{00012\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classBoundary}{Boundary}}(std::shared\_ptr\ mask,\ std::shared\_ptr\ discretization,\ \mbox{\hyperlink{structSettings}{Settings}}\ settings);} +\DoxyCodeLine{00013\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ setPressureBoundaryValues();} +\DoxyCodeLine{00014\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ setVelocityBoundaryValues();} +\DoxyCodeLine{00015\ \ \ \ \ \ \ \ \ std::shared\_ptr\ mask\_;} +\DoxyCodeLine{00016\ } +\DoxyCodeLine{00017\ } +\DoxyCodeLine{00018\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{bool}\ doCalculateF(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00019\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{bool}\ doCalculateG(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00020\ } +\DoxyCodeLine{00021\ \ \ \ \ \textcolor{keyword}{private}:} +\DoxyCodeLine{00022\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ createBoundaryCellsLists();} +\DoxyCodeLine{00023\ } +\DoxyCodeLine{00024\ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ Set\ Pressure}} +\DoxyCodeLine{00025\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ setPressureDomainBC();} +\DoxyCodeLine{00026\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ setPressureObstacleBC();} +\DoxyCodeLine{00027\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ setPressureSurfaceBC();} +\DoxyCodeLine{00028\ } +\DoxyCodeLine{00029\ } +\DoxyCodeLine{00030\ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ Set\ Velocity}} +\DoxyCodeLine{00031\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ setVelocityDomainBC();} +\DoxyCodeLine{00032\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ setVelocityObstacleBC();} +\DoxyCodeLine{00033\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ setVelocitySurfaceBC();} +\DoxyCodeLine{00034\ } +\DoxyCodeLine{00035\ } +\DoxyCodeLine{00036\ \ \ \ \ \ \ \ \ std::shared\_ptr\ discretization\_;} +\DoxyCodeLine{00037\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{structSettings}{Settings}}\ settings\_;} +\DoxyCodeLine{00038\ } +\DoxyCodeLine{00039\ \ \ \ \ \ \ \ \ std::vector\ DomainBoundaryCells\_;} +\DoxyCodeLine{00040\ \ \ \ \ \ \ \ \ std::vector\ ObstacleBoundaryCells\_;} +\DoxyCodeLine{00041\ \ \ \ \ \ \ \ \ std::vector\ FluidBoundaryCells\_;} +\DoxyCodeLine{00042\ } +\DoxyCodeLine{00043\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/central__differences_8h_source.tex b/documentation/latex/central__differences_8h_source.tex new file mode 100644 index 00000000..5026194d --- /dev/null +++ b/documentation/latex/central__differences_8h_source.tex @@ -0,0 +1,45 @@ +\doxysection{central\+\_\+differences.\+h} +\hypertarget{central__differences_8h_source}{}\label{central__differences_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/discretization/central\_differences.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/discretization/central\_differences.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ "{}discretization.h"{}}} +\DoxyCodeLine{00006\ } + + + + + + +\DoxyCodeLine{00014\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classCentralDifferences}{CentralDifferences}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classDiscretization}{Discretization}}} +\DoxyCodeLine{00015\ \{} +\DoxyCodeLine{00016\ \textcolor{keyword}{public}:} + + + + + +\DoxyCodeLine{00023\ \ \ \ \ \mbox{\hyperlink{classCentralDifferences_ab055731e615298f745364c54f86fc191}{CentralDifferences}}(std::array\ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{nCells}},\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{meshWidth}});} +\DoxyCodeLine{00024\ } + + + +\DoxyCodeLine{00029\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classCentralDifferences_adb4502f473cc047a433db596146672e4}{computeDu2Dx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} + + + +\DoxyCodeLine{00034\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classCentralDifferences_a66eb9b800b9a9ac6f81fc719a42eb0ee}{computeDv2Dy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} + + + +\DoxyCodeLine{00039\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classCentralDifferences_a9bd7ac3bfd709991525ec57de10ed2e1}{computeDuvDx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} + + + +\DoxyCodeLine{00044\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classCentralDifferences_a4184367de8d48e678edfb078a19fc0a4}{computeDuvDy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} +\DoxyCodeLine{00045\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/classArray2D.eps b/documentation/latex/classArray2D.eps new file mode 100644 index 00000000..fc8663d7 --- /dev/null +++ b/documentation/latex/classArray2D.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 416.666656 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.200000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(Array2D) cw +(FieldVariable) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (Array2D) 0.000000 1.000000 box + (FieldVariable) 0.000000 0.000000 box + +% ----- relations ----- + +solid +1 0.000000 0.250000 out +solid +0 0.000000 0.750000 in diff --git a/documentation/latex/classArray2D.pdf b/documentation/latex/classArray2D.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8d4720cd77a5651c38a162ee8ba5580d35c94bf8 GIT binary patch literal 4942 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 literal 0 HcmV?d00001 diff --git a/documentation/latex/classArray2D.tex b/documentation/latex/classArray2D.tex new file mode 100644 index 00000000..f5841f69 --- /dev/null +++ b/documentation/latex/classArray2D.tex @@ -0,0 +1,104 @@ +\doxysection{Array2D Class Reference} +\hypertarget{classArray2D}{}\label{classArray2D}\index{Array2D@{Array2D}} + + +This class represents a 2D array of double values. + + + + +{\ttfamily \#include $<$array2\+D.\+h$>$} + +Inheritance diagram for Array2D\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classArray2D} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classArray2D_a16521417dfdf67ec694bfb7747df9000}{Array2D}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}}) +\begin{DoxyCompactList}\small\item\em constructor. \end{DoxyCompactList}\item +double \& \mbox{\hyperlink{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8}{operator()}} (int i, int j) +\begin{DoxyCompactList}\small\item\em set array value. Overloads the () operator \end{DoxyCompactList}\item +double \mbox{\hyperlink{classArray2D_af745718ec25b815051de2d0c3c94e0d2}{operator()}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em get array value. Overloads the () operator \end{DoxyCompactList}\item +\Hypertarget{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}\label{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9} +std\+::array$<$ int, 2 $>$ {\bfseries size} () const +\begin{DoxyCompactList}\small\item\em get size of array in x and y direction \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classArray2D_a75bc7a1ff6f218c38f6ab94ec34e9472}\label{classArray2D_a75bc7a1ff6f218c38f6ab94ec34e9472} +const std\+::array$<$ int, 2 $>$ {\bfseries size\+\_\+} +\begin{DoxyCompactList}\small\item\em size of array in x and y direction \end{DoxyCompactList}\item +\Hypertarget{classArray2D_af1572f75d219caab4b2372a98341b991}\label{classArray2D_af1572f75d219caab4b2372a98341b991} +std\+::vector$<$ double $>$ {\bfseries data\+\_\+} +\begin{DoxyCompactList}\small\item\em storage array values, in row-\/major order \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +This class represents a 2D array of double values. + +Internally they are stored consecutively in memory. The entries can be accessed by two indices i,j. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classArray2D_a16521417dfdf67ec694bfb7747df9000}\label{classArray2D_a16521417dfdf67ec694bfb7747df9000} +\index{Array2D@{Array2D}!Array2D@{Array2D}} +\index{Array2D@{Array2D}!Array2D@{Array2D}} +\doxysubsubsection{\texorpdfstring{Array2D()}{Array2D()}} +{\footnotesize\ttfamily Array2\+D\+::\+Array2D (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{size }\end{DoxyParamCaption})} + + + +constructor. + + +\begin{DoxyParams}{Parameters} +{\em size} & size of array in x and y direction \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8}\label{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8} +\index{Array2D@{Array2D}!operator()@{operator()}} +\index{operator()@{operator()}!Array2D@{Array2D}} +\doxysubsubsection{\texorpdfstring{operator()()}{operator()()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily double \& Array2\+D\+::operator() (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption})} + + + +set array value. Overloads the () operator + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction \\ +\hline +\end{DoxyParams} +\Hypertarget{classArray2D_af745718ec25b815051de2d0c3c94e0d2}\label{classArray2D_af745718ec25b815051de2d0c3c94e0d2} +\index{Array2D@{Array2D}!operator()@{operator()}} +\index{operator()@{operator()}!Array2D@{Array2D}} +\doxysubsubsection{\texorpdfstring{operator()()}{operator()()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily double Array2\+D\+::operator() (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} + + + +get array value. Overloads the () operator + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/storage/array2\+D.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/storage/array2\+D.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classBoundary.tex b/documentation/latex/classBoundary.tex new file mode 100644 index 00000000..c6e7cc36 --- /dev/null +++ b/documentation/latex/classBoundary.tex @@ -0,0 +1,32 @@ +\doxysection{Boundary Class Reference} +\hypertarget{classBoundary}{}\label{classBoundary}\index{Boundary@{Boundary}} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classBoundary_a4c78a28ad0839810f15229382f642cf1}\label{classBoundary_a4c78a28ad0839810f15229382f642cf1} +{\bfseries Boundary} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$ mask, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, \mbox{\hyperlink{structSettings}{Settings}} settings) +\item +\Hypertarget{classBoundary_a77c90b2a43220ce9796d098158e4376d}\label{classBoundary_a77c90b2a43220ce9796d098158e4376d} +void {\bfseries set\+Pressure\+Boundary\+Values} () +\item +\Hypertarget{classBoundary_ab7e15ee44237de051ff8347f2f9c770b}\label{classBoundary_ab7e15ee44237de051ff8347f2f9c770b} +void {\bfseries set\+Velocity\+Boundary\+Values} () +\item +\Hypertarget{classBoundary_ac76b887d65491d38c093ca50333697a9}\label{classBoundary_ac76b887d65491d38c093ca50333697a9} +bool {\bfseries do\+CalculateF} (int i, int j) const +\item +\Hypertarget{classBoundary_aacf325c02e71925b7847d7189282b5c1}\label{classBoundary_aacf325c02e71925b7847d7189282b5c1} +bool {\bfseries do\+CalculateG} (int i, int j) const +\end{DoxyCompactItemize} +\doxysubsubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classBoundary_a25d33b12fbdf312cf319713ff88b3d38}\label{classBoundary_a25d33b12fbdf312cf319713ff88b3d38} +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$ {\bfseries mask\+\_\+} +\end{DoxyCompactItemize} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/boundary/boundary.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/boundary/boundary.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classCentralDifferences.eps b/documentation/latex/classCentralDifferences.eps new file mode 100644 index 00000000..04ccd50f --- /dev/null +++ b/documentation/latex/classCentralDifferences.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 472.440948 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.058333 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(CentralDifferences) cw +(Discretization) cw +(StaggeredGrid) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (CentralDifferences) 0.000000 0.000000 box + (Discretization) 0.000000 1.000000 box + (StaggeredGrid) 0.000000 2.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in +solid +0 0.000000 1.000000 out +solid +1 0.000000 2.000000 in diff --git a/documentation/latex/classCentralDifferences.pdf b/documentation/latex/classCentralDifferences.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fea4467cff42527c159abee031aa3b33deb6d608 GIT binary patch literal 5704 zcmb^#XIN9&5>{O?DpFJg#l3=TY~iLik{~32lmrO@L2Mzpfk>Lk4NVjm#e%x-+La=@ zc8UrpHh3x`f(21lTnl1X6i^TgqP%khsO#JJc7MD}Ip<6}b7tnucV=9s3cLvDUBI2RXRO{`WXMU`3&8;UYOgn1A_9_-=mB?hA?aH>a0uoswldPw+Fz{uCCb$~ch zsZyc|0Z1&O;sRk1!65Jo_2qkUb#g_VUWp>jX;>(OC5>GJyfbc0X>YUR;)#( zC^A(Vg&3S+kyZnUaWsesX(Q+2I2^bqW=0xSYVrj;W+9?pR3 z5vdv%pOLw?T2w|Hbgm^KZPZVT=Z%UJ<#$>?IaGS8$QV(>E+P$Bv8Q6Z@Ro8=-^MYo zrrmnKaNe8Yr^5qg7rQzvj#a-ocX)r(MlV^5pW(x#Bb!f+6&F3KN(x~XArn1V+%LATw#(9YW*(;_>q9kKyTXe!j*-d@=U$|^;Qyg9RAgSbf z0%4nFdutpSw%PvDxgd9teA3zMYonQ$H*EK-oN@2;;UnvRaU-{~r}$|fUmP@S`A6HQ zo)w}~>*%Tjk8Z8aSXcHb_Ey_Dah25)==y-jl$#EbX$_rWtfm4|PWnLnlbYD=yg>6+ z?prUhSTEpQhTBD_^!C)!Uw4ey;y8ZK%;|-}Z3Eut)ZRff@*X#U8Rk07Vc1Avl5jmB z>KCs{5_AZR`5YD^a;4N$8xKVg0h$KFhsq$kQmHd>0Ix?hC`7?rkAuaCL2J~@5CaH` zsd}v}7(pXo5R(urLE=$Bjzt#4G7*EIfcanv*bNXCOkx}W^{9c#>kcl!3iNWRVBp882(pRjc&#XP1d?_kbX`^~Y^r$LCP^lbXAQHy#_1>6zJ%KG| z;20S8i(=Ta2k9v_AlP|e@326T$a|thsYVP0u~seBn9eCc3^Kh^hidf@6BA-m$AkfP zQ0fgRKU%7X=nObO+A}AS$?!C#9E~YF-O^t`fp!~cB z*#yPn1#=eZi@C5pddy`CC(K@7>|!#8NUBEun+ZKZ(1DmEkV#C4L1aO6CS@j;SU?J; zka4hwL52k%fPzqx>ZTydsA#Zc&~Y%f35LU1aj-9l0Hw@B6Qx2RA`T8l5p^g;A_6+0 z(qI7RF4( z@uuTosh9#}gM)t+Hl}rtA-WUf*ZC1>^tJi;y$O{}Vv%{gFR4=!BMF}7P*V5H{6I%P z$7qS51z}y=|Dcaif@aW4U#?DroYGEGCtKOf8t~Z5CShrxF%DCplODE^g&;e+T--0H zwj*PD(8QbeQAO;W!?Eo%uD`07kr5u#G5=Ghq4e;Zx0xkxi+#_?Y&_QPd@|a1Khq%H zJBcP@&+F>*#79rT&nxU}>0b@8*$h!GU z)SCF{vnSuT*{OcnHJ&ndg>U#Le>*t*@ec=HcWKMrr(}%xUEh&h^~2EnL&K-<58HY; zc&!6m{W|$>ox3DsT;Pfe@7iy5UHRmmlmeaHRWR7YeoK1cean58D{XCDq~rS@T4^z6 zVPKNy66^WPj|rHEvMih|twyd8o>fE+JhVE@`vsH~udo>6DVj01YYJWH^rL;h`jinv zt~y`+&GV`AMXUN94#-`(Q8&Td-Y=d2o+)|wGG2isbamv8KZt2^_TWSV8}uHL3D zI?TUvH=|%fdF0Kb!aen~`%<4C%&ga5zm@jETznOleP8Do5Tw3)k+ZYS&-rJ+*VYcR zhb=fGnH8CODm?#>>iagwnSyP$;eFpN{T^Rj>wARb6H?vp{MqufmqjjZq{UICn-`z_ z^=-~J>y^9vpFI0RA&Xpd<7E`b=D_xH6vd-1TLC+ z`o78aT6N%{fSpU7eS0lcJcvx^QL?ykcD?Lr~DQ zbD&?@!xcA)yAEv4zrX9Chpu3TV_BrFde!;rA=lf)?;ISA?YCQhY=OP6?037Cba_X_ z)7^WmF4;8hOSzr0BWd%H!MhR-8(l7B3^=`w?@V8E%#zDJHA~cdKEHCw_)?OO`~%(P z*j+hk?#ZKT*+D^}RgBg@qEhLyVBSksdJ8iotc8)-)S5YPOVbHI*VfCM&BBkC>2K6w;4RV<05+MnL^&S}^U2e;cTn$giw`rKBuoy2-Ayu!>s^z`DI zB0Iat5xA0zLhYN;NhyzckDon?UFafK8v8j|6twQ|2pj5A_EXAmVc|*25!b#csn6f^ zkNO>9Fc`IrjlJ)F^WiB0j#F8=ljCr7dczE)GD@gP;{V=Psm7?Tx8*5yqb=-cscr=l8 zk1M+2nUw@JD1Iy7(PyMBg+Io^V&Rgf#haQr&AHU&6K_1wuPh4v-C{u?t(G=e)5+0w zmA*I|PbYgHvCscL?6uC?CZj1|^ISekXuN#=-hdf5sxC#l92<5%aOb38*V@L%cJCvX zdal0B+3wgi+3sHDndw#f;wqjPXT`sFJg#ktLo+|o>4)!++KaBf8icGFz`TP5iRSSp zJzVCl;8y7C5@!4CbLq&NP+zyvhB9eccFt|9>igwIH#R7^XIBd0GoGB0$(`-wu_MsB zk)Q(8+n@KP{+%+v9WA!*xmYj2hrib+xtuHUK}ZA-OPMr8E<}MC{;Pr>`6)b72jm?O0+vS(1Xk43H^U}&*NQ+%Cyea z*B>$Jf76Dp61E+?v@GwmNKJdP!LDlk!SpTZV!uB?@+gz+EDk>X;{vZ&P{XXNsk=VZ z4(NdDJ1dkiEAq~M_fwAN$nsMEJuAx&-*ikpnv$BR<;JA-n zp4?|!j?WhCss873!t|2<`nA{l#{TlY2@?kNK5j^43gz?ThT|TulgeTc6pBQmlo~F+ z<;1`6kW$XYPooKmLLDE8R!&LOBf*Ixi7YWj#**XRc{q-{6x1;YAzrE@C`@Ii0Rrzn zt`lDz;O&GF#IxhoIyHFeL-A^r#=wr};!P}UFvq|!9x{=jF&Qsh2C*Vo=g_3j`}JJ{m=JY#5GmxN7xLFp0%t z!9+4lCKCV!!H}RqrSSxf!5QplQbZZ{nN4GGHR+% z{$@L1%fH?ZIG{&u4xnKRL5-kD5Pk|A6%?%CA_pdI@kLPoRxYh(a{oo0uqj5F8jY<5%bWhbNcngu?%QcC{J{ zCX9|P(8`QzP<{9cxOk&cDQ8n?3Od4I$q9o%TB$?Kk&7~wC%z)Xg@Ppj{i z7mUp772Lz|nbm~CSU)rTg{A{QTr<);70j#w$* zlN@{Rc{n55dZ-lzGwg#&*SxUU*h$M0<;21WE>Wy-5*4!(I_-X0rkR|EN~+1gEYM`8i@+( z-ao^LOwdmF7Di`*#=tjpWb%K)=nT+|`G$_g1TBw0!$@S%uJ{H!-ed;v?D2dgJ~L_q=|i literal 0 HcmV?d00001 diff --git a/documentation/latex/classCentralDifferences.tex b/documentation/latex/classCentralDifferences.tex new file mode 100644 index 00000000..45083819 --- /dev/null +++ b/documentation/latex/classCentralDifferences.tex @@ -0,0 +1,244 @@ +\doxysection{Central\+Differences Class Reference} +\hypertarget{classCentralDifferences}{}\label{classCentralDifferences}\index{CentralDifferences@{CentralDifferences}} + + +Discretizes the problem using the central differences scheme. + + + + +{\ttfamily \#include $<$central\+\_\+differences.\+h$>$} + +Inheritance diagram for Central\+Differences\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classCentralDifferences} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classCentralDifferences_ab055731e615298f745364c54f86fc191}{Central\+Differences}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classCentralDifferences_adb4502f473cc047a433db596146672e4}{compute\+Du2\+Dx}} (int i, int j) const override +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x with the central differences Scheme. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classCentralDifferences_a66eb9b800b9a9ac6f81fc719a42eb0ee}{compute\+Dv2\+Dy}} (int i, int j) const override +\begin{DoxyCompactList}\small\item\em Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y with the central differences Scheme. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classCentralDifferences_a9bd7ac3bfd709991525ec57de10ed2e1}{compute\+Duv\+Dx}} (int i, int j) const override +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x with the central differences Scheme. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classCentralDifferences_a4184367de8d48e678edfb078a19fc0a4}{compute\+Duv\+Dy}} (int i, int j) const override +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y with the central differences Scheme. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classDiscretization}{Discretization}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c}{Discretization}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+D2u\+Dx2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to x. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+D2u\+Dy2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to y. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+D2v\+Dx2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to x. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+D2v\+Dy2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to y. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+Dp\+Dx} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to x. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+Dp\+Dy} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to y. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}{Staggered\+Grid}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width} () const +\begin{DoxyCompactList}\small\item\em Get the length of a single cell in x and y directions. \end{DoxyCompactList}\item +const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells} () const +\begin{DoxyCompactList}\small\item\em Get number of cells in x and y directions. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries u} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable u. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries v} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable v. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries p} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable p. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries rhs} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable rhs. \end{DoxyCompactList}\item +double {\bfseries u} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries u} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j) \end{DoxyCompactList}\item +double {\bfseries v} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries v} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j) \end{DoxyCompactList}\item +double {\bfseries p} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries p} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries f} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of f in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries g} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of g in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries rhs} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of rhs in element (i,j) \end{DoxyCompactList}\item +double {\bfseries dx} () const +\begin{DoxyCompactList}\small\item\em Get the mesh width in x-\/direction. \end{DoxyCompactList}\item +double {\bfseries dy} () const +\begin{DoxyCompactList}\small\item\em Get the mesh width in y-\/direction. \end{DoxyCompactList}\item +int {\bfseries u\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for u in x direction \end{DoxyCompactList}\item +int {\bfseries u\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for u in x direction \end{DoxyCompactList}\item +int {\bfseries u\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for u in y direction \end{DoxyCompactList}\item +int {\bfseries u\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for u in y direction \end{DoxyCompactList}\item +int {\bfseries v\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for v in x direction \end{DoxyCompactList}\item +int {\bfseries v\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for v in x direction \end{DoxyCompactList}\item +int {\bfseries v\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for v in y direction \end{DoxyCompactList}\item +int {\bfseries v\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for v in y direction \end{DoxyCompactList}\item +int {\bfseries p\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for p in x direction \end{DoxyCompactList}\item +int {\bfseries p\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for p in x direction \end{DoxyCompactList}\item +int {\bfseries p\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for p in y direction \end{DoxyCompactList}\item +int {\bfseries p\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for p in y direction \end{DoxyCompactList}\item +int {\bfseries f\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for f in x direction \end{DoxyCompactList}\item +int {\bfseries f\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for f in x direction \end{DoxyCompactList}\item +int {\bfseries f\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for f in y direction \end{DoxyCompactList}\item +int {\bfseries f\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for f in y direction \end{DoxyCompactList}\item +int {\bfseries g\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for g in x direction \end{DoxyCompactList}\item +int {\bfseries g\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for g in x direction \end{DoxyCompactList}\item +int {\bfseries g\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for g in y direction \end{DoxyCompactList}\item +int {\bfseries g\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for g in y direction \end{DoxyCompactList}\item +int {\bfseries rhs\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries rhs\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries rhs\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for rhs in y direction \end{DoxyCompactList}\item +int {\bfseries rhs\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in y direction \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Additional Inherited Members} +\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} +\begin{DoxyCompactItemize} +\item +const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells\+\_\+} +\begin{DoxyCompactList}\small\item\em array containing number of cells in x and y directions \end{DoxyCompactList}\item +const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width\+\_\+} +\begin{DoxyCompactList}\small\item\em array containing the sizes of cell edges in x and y directions \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries u\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable u \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries v\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable v \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries p\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable p \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries f\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable f \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries g\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable g \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries rhs\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable rhs \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Discretizes the problem using the central differences scheme. + +Implements the first derivatives of u\texorpdfstring{$^\wedge$}{\string^}2, v\texorpdfstring{$^\wedge$}{\string^}2 and u\texorpdfstring{$\ast$}{*}v according to the central differences scheme + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classCentralDifferences_ab055731e615298f745364c54f86fc191}\label{classCentralDifferences_ab055731e615298f745364c54f86fc191} +\index{CentralDifferences@{CentralDifferences}!CentralDifferences@{CentralDifferences}} +\index{CentralDifferences@{CentralDifferences}!CentralDifferences@{CentralDifferences}} +\doxysubsubsection{\texorpdfstring{CentralDifferences()}{CentralDifferences()}} +{\footnotesize\ttfamily Central\+Differences\+::\+Central\+Differences (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{n\+Cells, }\item[{std\+::array$<$ double, 2 $>$}]{mesh\+Width }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em n\+Cells} & array containing number of cells in x and y directions \\ +\hline +{\em mesh\+Width} & array containing the length of a single cell in x and y directions \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classCentralDifferences_adb4502f473cc047a433db596146672e4}\label{classCentralDifferences_adb4502f473cc047a433db596146672e4} +\index{CentralDifferences@{CentralDifferences}!computeDu2Dx@{computeDu2Dx}} +\index{computeDu2Dx@{computeDu2Dx}!CentralDifferences@{CentralDifferences}} +\doxysubsubsection{\texorpdfstring{computeDu2Dx()}{computeDu2Dx()}} +{\footnotesize\ttfamily double Central\+Differences\+::compute\+Du2\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x with the central differences Scheme. + + + +Implements \mbox{\hyperlink{classDiscretization_acca6bf193e0e91f645d292527299254b}{Discretization}}. + +\Hypertarget{classCentralDifferences_a9bd7ac3bfd709991525ec57de10ed2e1}\label{classCentralDifferences_a9bd7ac3bfd709991525ec57de10ed2e1} +\index{CentralDifferences@{CentralDifferences}!computeDuvDx@{computeDuvDx}} +\index{computeDuvDx@{computeDuvDx}!CentralDifferences@{CentralDifferences}} +\doxysubsubsection{\texorpdfstring{computeDuvDx()}{computeDuvDx()}} +{\footnotesize\ttfamily double Central\+Differences\+::compute\+Duv\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x with the central differences Scheme. + + + +Implements \mbox{\hyperlink{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795}{Discretization}}. + +\Hypertarget{classCentralDifferences_a4184367de8d48e678edfb078a19fc0a4}\label{classCentralDifferences_a4184367de8d48e678edfb078a19fc0a4} +\index{CentralDifferences@{CentralDifferences}!computeDuvDy@{computeDuvDy}} +\index{computeDuvDy@{computeDuvDy}!CentralDifferences@{CentralDifferences}} +\doxysubsubsection{\texorpdfstring{computeDuvDy()}{computeDuvDy()}} +{\footnotesize\ttfamily double Central\+Differences\+::compute\+Duv\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y with the central differences Scheme. + + + +Implements \mbox{\hyperlink{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84}{Discretization}}. + +\Hypertarget{classCentralDifferences_a66eb9b800b9a9ac6f81fc719a42eb0ee}\label{classCentralDifferences_a66eb9b800b9a9ac6f81fc719a42eb0ee} +\index{CentralDifferences@{CentralDifferences}!computeDv2Dy@{computeDv2Dy}} +\index{computeDv2Dy@{computeDv2Dy}!CentralDifferences@{CentralDifferences}} +\doxysubsubsection{\texorpdfstring{computeDv2Dy()}{computeDv2Dy()}} +{\footnotesize\ttfamily double Central\+Differences\+::compute\+Dv2\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y with the central differences Scheme. + + + +Implements \mbox{\hyperlink{classDiscretization_a69ba136ab7f8c09d805afca159cab428}{Discretization}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/central\+\_\+differences.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/central\+\_\+differences.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classComputation.tex b/documentation/latex/classComputation.tex new file mode 100644 index 00000000..b2f5d250 --- /dev/null +++ b/documentation/latex/classComputation.tex @@ -0,0 +1,50 @@ +\doxysection{Computation Class Reference} +\hypertarget{classComputation}{}\label{classComputation}\index{Computation@{Computation}} + + +\doxylink{classComputation}{Computation} of Simulation. + + + + +{\ttfamily \#include $<$computation.\+h$>$} + +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +void \mbox{\hyperlink{classComputation_a4a344479797b15bd5c9ed2f262657339}{initialize}} (int argc, char \texorpdfstring{$\ast$}{*}argv\mbox{[}$\,$\mbox{]}) +\begin{DoxyCompactList}\small\item\em Initialize the simulation with settings from .txt file. \end{DoxyCompactList}\item +\Hypertarget{classComputation_ad20ce6e82ec9a918e6ac03840bc688d5}\label{classComputation_ad20ce6e82ec9a918e6ac03840bc688d5} +void {\bfseries run\+Simulation} () +\begin{DoxyCompactList}\small\item\em run the whole simulation until t\+\_\+end \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\doxylink{classComputation}{Computation} of Simulation. + +Combines discretization, pressure solver and outputwriter + +\doxysubsection{Member Function Documentation} +\Hypertarget{classComputation_a4a344479797b15bd5c9ed2f262657339}\label{classComputation_a4a344479797b15bd5c9ed2f262657339} +\index{Computation@{Computation}!initialize@{initialize}} +\index{initialize@{initialize}!Computation@{Computation}} +\doxysubsubsection{\texorpdfstring{initialize()}{initialize()}} +{\footnotesize\ttfamily void Computation\+::initialize (\begin{DoxyParamCaption}\item[{int}]{argc, }\item[{char \texorpdfstring{$\ast$}{*}}]{argv\mbox{[}$\,$\mbox{]} }\end{DoxyParamCaption})} + + + +Initialize the simulation with settings from .txt file. + + +\begin{DoxyParams}{Parameters} +{\em argc} & counts of CLI commands \\ +\hline +{\em argv} & values of CLI commands, expect settings.\+txt filename \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/computation.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/computation.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classDiscretization.eps b/documentation/latex/classDiscretization.eps new file mode 100644 index 00000000..486eee2b --- /dev/null +++ b/documentation/latex/classDiscretization.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 236.220474 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.116667 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(Discretization) cw +(StaggeredGrid) cw +(CentralDifferences) cw +(DonorCell) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (Discretization) 0.500000 1.000000 box + (StaggeredGrid) 0.500000 2.000000 box + (CentralDifferences) 0.000000 0.000000 box + (DonorCell) 1.000000 0.000000 box + +% ----- relations ----- + +solid +0 0.500000 1.000000 out +solid +1 0.500000 2.000000 in +solid +1 0.500000 0.250000 out +solid +0.000000 1.000000 1.000000 conn +solid +0 0.000000 0.750000 in +solid +0 1.000000 0.750000 in diff --git a/documentation/latex/classDiscretization.pdf b/documentation/latex/classDiscretization.pdf new file mode 100644 index 0000000000000000000000000000000000000000..084eb9cc38316928d083658f1479b7fea56c644e GIT binary patch literal 5766 zcmb^#d0bOR6Ff00AgBn6eS#P~!pj{JlOQAk5fUUsj)G`NULcaoAX{Zxm2KMa1&$3!t|3``SOg$FaL}?d;6#{C37=Cf}Pta--o~ z%3rSDiF0xB)x>FKQdFtcu%KuIM3@f|k1qr~+%TvOe4o03Py+|m8-XynKpln1Jyohd0X>bVR;)#( zC^AzTjToF^kyZnUaWsesX`|-h*lgGz(L|#$5FJ3oFwg}>^bqW=0xWz)rj;XHF3y1J z5vdxNkd+-I3@9ZIIsG)`k;NGQm&tD{GTp5@2If|&1?s))eW!OOX5}jxC&y0XoKIQ) zv92(Cmn2PGcF2QqbfzBveV?h4x8=DT0!}0(zgg4ATIt-H=N`SCe+Y`1JZwZLk9?@? zZb4^lQQ5xE$ZZuo!?x6=Pa_WYQy$(F_P%TiT<;pREXUy}&RVV*-kw%4@(yA_HJjDv zI@Bj|K*zd4#N3w|6GZxPxT3RtVqZ@PNo{+^P7thFXC8m7J?`7)I6-*H&qa?v+}B;R z%}kqn_t`}AMfe*dze}QoZZebMl5W)cWd#1Ps4L9tmFV^DF{AdTJXHo#_r}d8TyETu zP1{;;s0(G!%ZY)AV}d7AODtI{vO_|SG@!Q3zUPRO8EeA2#zoksKM9M#%^ACecgl7D zyhxbYcAr%hyst3FZIs|`$b_?DCrR_$+x-$%yRP;*)VA)&%T`-AFLbQ*D;G2--xED= z-hEH{lJpq2oKe)j{_d-Div|T2N>g&&eta=0=}5{Z>D$g}D&4XL$^5>p?Q~ni+#`|C z2R|A7=wyXjabDBqqj5ZG3^?n5preR-&^LQ?(V6y5ack8s3(W*^xHLo~?{OlSVUEY# zjg3?)1=jRR!G!cW4f_Y#G*bNXCieel9^{9c#>kdu8 z3iNW>lBp882(ig0xPpmzhJSi$wX`_2Z^r$LCP^lbXAQHy# z<=&WjJ=a3az%elFXT`8(57J9&K(O<`-k|{^k@sYYQjHi0Vy#-LF`bi-7-V{-4%O-* zcT9*$9TNuFL8&*Oycnq-qBCHBY0sQQCc`00IT~XKhv;+$#2}LaBk|LS&3k@u-6M^L z`S7bhfPzZJ?1cTte1?q_3dJ-B9%Nuj^^O=G{F$U;G!%E{CyH+AfE)NvpaI!Hsfh+^ zYCJUt<)<~sMJN_8n6pTq&4umJV=hxTVfOlL7n3nWQZ@45Oy~uI4#XUROmc@9L?%Rc zr_9FE5=g)lG7k1M$gto8P!LK|-E>459RrpOIu6D*!EhKW4)z5RppnFoP5VVx`=h)Xxy8KTd&I_vch6JlK#jxoH_dTUH0jB#lFADY&_TO zemd57zq>*D(-fMBHNUIxQy)DAKfkb_wO_e&d5s10!rHW)KF^+45nKCuXsh3cOFD;% z{l~GVlXXdp)tZEu^Cj0KRY<=$v21Ey0m2;)3YY}uIosx_-1(h z@UU<9hi*9BN3VR#=Q%7?A9>cv#ZX6MXk0ITlWq)}xmR&nuz^A6XUZ{Srz}P*_-bi6X{#O{WW; zCfN6{OCM!*!}-Q8uV>Cztm}3a)Yyb=q6MFaKaJz5&Yy)HwPFs_$K4?{1yp z{QZo!VGeUfr2Ha@jLJA0mj7F2z0FB?{x;jNe(jk9@Ws`>$JjozD*InNU$*>JkxMIS zQS_Nji%NcccVOGF6}baT&VN(LBv;*jmCPO-R26<}tSF`__;7*w8^;8@Lgq*f1g6!s5apH!pO^r3~DpIXiA4rLvi_8=KzM@W0)8f6{R>Ql7JF>UnePfIjXc z-`8(`W@ht;uIcp%@32$c7{7)Y&qfa^ZIInf>Ill=Ju<(3%g$nZK<0qqOHSF>3_EpD zGy0W7K-%oun{F+Qqrdmsy*+VK!%piokK)xs>P9tnOidoT&CjRQO?_t7B@ugYpIUTX z;-=_Jgs{PN8Q05R7*8JUZdd_47wT%*KY(_t}w=a}Sf_R^@HCNmnGTDx4h% zFI#(w!7u3AJ$Odxqh)u9dk$^MuitanQ&$k-SQ=%kUU{+7>Q<|`-NC{5rnY55GwgkR z|J0kw*LH?K%l*mvs!hYb^xE{D$(yW(?nyLkaJif{=-f7*Gkx(1OAhC3q^Rj){-wne z&yalNALuS8?#W5>N{+8#1qKFJFj{_#&Y;VJxUZO7o84!HHZu|%Te1glZal>b^N-m0 zYs{7%rNw)%&e!}zTi|PZNS1zV>xVsC(Q(ULQwgJ1^M77?Sm3*AWT@V+#;hcrTQFJ8 zvCLZJTGYCy^_!HBSE4`Gj48ekmFTLoZ%@h-d7QAN2A*&YbluxhxSolNNt?H}g+&#B38@ zch5ia?8@pQJG-b+xYJjJ+P7nq)1PpkJbxUw&_%2?_II!-XxZNpI^47LyY!L5!V=0c zw|?mvFWwG}{uN;`7}bmoBet#xIDDZcYB1Y;O#X$Yg-fVezxh7Qn7Y0^s;oto*Kb0r z|G;-;5sfdDqmEa!OPXjkig)eVnM03RGUohZ9>6Caop$It5_3~O!g~BAQR;;aRW2bN zwa*rfC6XR+M7OPwfV-vgSAa&{F+Yj|Cih_T&NC}`- z(}rp~*}ASXFV82?$==88^9O{s>4w>4HRfwx$j1nc*KR!+6mh%aYK+T?5f=k?PYH6X zZg^t%J}T2|RV{mmW7jmh2bX^NwnATA!4>1Ic@Iv;w=Q;Q;w3tLGvK(r=*H_I$m&7v zcacEReD0J-OFR^ua(&H$IX?SbI`Ssf)oie#Oj)x1K&^FUeOb}%^$O1U6+-wIFZSrv z&Nt-oqtKevg=@$(^xv*J#A;ymZJJ5&2FXiNQgwX8KT>9;}N z8s~k3tFp%zo8=9647Htn*ODhytw5(gzh=PB+&ud5W^VAJ1nMWtPI}upf!qwM=QzC~3JH8)zZ}-aBp&i?oS?3qs zJm8-=xy0(a@Dc6Ym<^UYV)213_JwQFI?slImV49up5(5$)|nAJEpOt7#kFM4X)lFn z$=s@w+tcm`)o;C|O3ZZ%-wRJ_n{~1E&CLFfgHyC`Gncl>H<`WVE?rK+_MNB(N>C$)QdteANx`>kby`LW?tuLU-mynB1HqGIqH*7|Mc`zs_P@867E|HEA0w<{Kr_RE#xzO-f_%0>la?um^ZCz*1DvYwfBw- zb8@UMvpvQyP3^nwfX`;^ss873!t|2<^0n9d#{T@i2^ISHK5j^43gy$|hV7A{lgeTd z6pBKkl^PDd`P9#NNGa#wLuf*xP{%`Jl+zRSNKm3kB1?>wG39seF|ZOicoPc?%rP*GhfE}BEC(MdoC%>? zttwWDLS#3l8;L-oOo0@7@IH;#>SH028yycs>g5WS7?d>K0>O%dk3mr#3x?z4qE(Rcg911udn6W@9CO66uJqPbI(;xDQ(HhY1(gb3< z(P(Z&Jlu1xf7lM#^6T3H2lS}T1~e=os1Xzk_@H~hB@@Y10+CE0QYB;}i_ByZ>63{h z7Lmw?|3V3z1z35Y$pD%T|AO@k$}d>8dI@kLm#}oX@Oc))Duaz0qp!)FTbMQu^QqH2#6m*2aloJ$DQA7fXq+k+=;3JUeWFnPJ zQjn*WBtVN6~CB3;Hm)^!JjTN7YF^HzW<+~&)Ey)L=HY4 z%T0gFj#w$*lN@{RqwCkN<3vz*Vs-?V9=iyxd=_?#h*+o)$xPD)!V`&jKn5<_KTt?8 zKf8YNV6SMc-nHk700`(0#sI)XF1M%qlAuQvpcOzOxnmd1{BQofqKK=`gOa{$@zrYw&(46@*j6|gVjgCa2eT9w$8aaRA zrIY@q3+Qxwp);zNg8E$#TA~mfq)bGB4Io&o)q)liR?tJRuSTJTFjs$} + +Inheritance diagram for Discretization\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classDiscretization} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c}{Discretization}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +virtual double \mbox{\hyperlink{classDiscretization_acca6bf193e0e91f645d292527299254b}{compute\+Du2\+Dx}} (int i, int j) const =0 +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x. \end{DoxyCompactList}\item +virtual double \mbox{\hyperlink{classDiscretization_a69ba136ab7f8c09d805afca159cab428}{compute\+Dv2\+Dy}} (int i, int j) const =0 +\begin{DoxyCompactList}\small\item\em Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y. \end{DoxyCompactList}\item +virtual double \mbox{\hyperlink{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795}{compute\+Duv\+Dx}} (int i, int j) const =0 +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x. \end{DoxyCompactList}\item +virtual double \mbox{\hyperlink{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84}{compute\+Duv\+Dy}} (int i, int j) const =0 +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y. \end{DoxyCompactList}\item +\Hypertarget{classDiscretization_a6986501b0b5c96699ff3ac843c1a6ca2}\label{classDiscretization_a6986501b0b5c96699ff3ac843c1a6ca2} +virtual double {\bfseries compute\+D2u\+Dx2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to x. \end{DoxyCompactList}\item +\Hypertarget{classDiscretization_a446aabc55a9fb4b5cb2f476babc532f9}\label{classDiscretization_a446aabc55a9fb4b5cb2f476babc532f9} +virtual double {\bfseries compute\+D2u\+Dy2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to y. \end{DoxyCompactList}\item +\Hypertarget{classDiscretization_a5119047788a34eadf37480e913bdc8ea}\label{classDiscretization_a5119047788a34eadf37480e913bdc8ea} +virtual double {\bfseries compute\+D2v\+Dx2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to x. \end{DoxyCompactList}\item +\Hypertarget{classDiscretization_a56678582a049b1b141621e41afff1438}\label{classDiscretization_a56678582a049b1b141621e41afff1438} +virtual double {\bfseries compute\+D2v\+Dy2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to y. \end{DoxyCompactList}\item +\Hypertarget{classDiscretization_aed3ad75ad6e647d14f118a12652c01b2}\label{classDiscretization_aed3ad75ad6e647d14f118a12652c01b2} +virtual double {\bfseries compute\+Dp\+Dx} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to x. \end{DoxyCompactList}\item +\Hypertarget{classDiscretization_a859f4dc33f0ea91f5e6537be09ce4999}\label{classDiscretization_a859f4dc33f0ea91f5e6537be09ce4999} +virtual double {\bfseries compute\+Dp\+Dy} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to y. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}{Staggered\+Grid}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width} () const +\begin{DoxyCompactList}\small\item\em Get the length of a single cell in x and y directions. \end{DoxyCompactList}\item +const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells} () const +\begin{DoxyCompactList}\small\item\em Get number of cells in x and y directions. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries u} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable u. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries v} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable v. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries p} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable p. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries rhs} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable rhs. \end{DoxyCompactList}\item +double {\bfseries u} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries u} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j) \end{DoxyCompactList}\item +double {\bfseries v} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries v} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j) \end{DoxyCompactList}\item +double {\bfseries p} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries p} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries f} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of f in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries g} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of g in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries rhs} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of rhs in element (i,j) \end{DoxyCompactList}\item +double {\bfseries dx} () const +\begin{DoxyCompactList}\small\item\em Get the mesh width in x-\/direction. \end{DoxyCompactList}\item +double {\bfseries dy} () const +\begin{DoxyCompactList}\small\item\em Get the mesh width in y-\/direction. \end{DoxyCompactList}\item +int {\bfseries u\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for u in x direction \end{DoxyCompactList}\item +int {\bfseries u\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for u in x direction \end{DoxyCompactList}\item +int {\bfseries u\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for u in y direction \end{DoxyCompactList}\item +int {\bfseries u\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for u in y direction \end{DoxyCompactList}\item +int {\bfseries v\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for v in x direction \end{DoxyCompactList}\item +int {\bfseries v\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for v in x direction \end{DoxyCompactList}\item +int {\bfseries v\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for v in y direction \end{DoxyCompactList}\item +int {\bfseries v\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for v in y direction \end{DoxyCompactList}\item +int {\bfseries p\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for p in x direction \end{DoxyCompactList}\item +int {\bfseries p\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for p in x direction \end{DoxyCompactList}\item +int {\bfseries p\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for p in y direction \end{DoxyCompactList}\item +int {\bfseries p\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for p in y direction \end{DoxyCompactList}\item +int {\bfseries f\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for f in x direction \end{DoxyCompactList}\item +int {\bfseries f\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for f in x direction \end{DoxyCompactList}\item +int {\bfseries f\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for f in y direction \end{DoxyCompactList}\item +int {\bfseries f\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for f in y direction \end{DoxyCompactList}\item +int {\bfseries g\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for g in x direction \end{DoxyCompactList}\item +int {\bfseries g\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for g in x direction \end{DoxyCompactList}\item +int {\bfseries g\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for g in y direction \end{DoxyCompactList}\item +int {\bfseries g\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for g in y direction \end{DoxyCompactList}\item +int {\bfseries rhs\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries rhs\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries rhs\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for rhs in y direction \end{DoxyCompactList}\item +int {\bfseries rhs\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in y direction \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Additional Inherited Members} +\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} +\begin{DoxyCompactItemize} +\item +const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells\+\_\+} +\begin{DoxyCompactList}\small\item\em array containing number of cells in x and y directions \end{DoxyCompactList}\item +const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width\+\_\+} +\begin{DoxyCompactList}\small\item\em array containing the sizes of cell edges in x and y directions \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries u\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable u \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries v\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable v \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries p\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable p \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries f\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable f \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries g\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable g \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries rhs\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable rhs \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Computes derivatives included in governing equations. + +Interface for the discretization. Computes the needed derivatives to solve the Poisson and continuity equations. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c}\label{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c} +\index{Discretization@{Discretization}!Discretization@{Discretization}} +\index{Discretization@{Discretization}!Discretization@{Discretization}} +\doxysubsubsection{\texorpdfstring{Discretization()}{Discretization()}} +{\footnotesize\ttfamily Discretization\+::\+Discretization (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{n\+Cells, }\item[{std\+::array$<$ double, 2 $>$}]{mesh\+Width }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em n\+Cells} & array containing number of cells in x and y directions \\ +\hline +{\em mesh\+Width} & array containing the length of a single cell in x and y directions \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classDiscretization_acca6bf193e0e91f645d292527299254b}\label{classDiscretization_acca6bf193e0e91f645d292527299254b} +\index{Discretization@{Discretization}!computeDu2Dx@{computeDu2Dx}} +\index{computeDu2Dx@{computeDu2Dx}!Discretization@{Discretization}} +\doxysubsubsection{\texorpdfstring{computeDu2Dx()}{computeDu2Dx()}} +{\footnotesize\ttfamily virtual double Discretization\+::compute\+Du2\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [pure virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x. + + + +Implemented in \mbox{\hyperlink{classCentralDifferences_adb4502f473cc047a433db596146672e4}{Central\+Differences}}, and \mbox{\hyperlink{classDonorCell_a265bdaf46ed8ba46a42ef0cb03807175}{Donor\+Cell}}. + +\Hypertarget{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795}\label{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795} +\index{Discretization@{Discretization}!computeDuvDx@{computeDuvDx}} +\index{computeDuvDx@{computeDuvDx}!Discretization@{Discretization}} +\doxysubsubsection{\texorpdfstring{computeDuvDx()}{computeDuvDx()}} +{\footnotesize\ttfamily virtual double Discretization\+::compute\+Duv\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [pure virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x. + + + +Implemented in \mbox{\hyperlink{classCentralDifferences_a9bd7ac3bfd709991525ec57de10ed2e1}{Central\+Differences}}, and \mbox{\hyperlink{classDonorCell_ae41b5f85743ca7f148bd829561bd9cb5}{Donor\+Cell}}. + +\Hypertarget{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84}\label{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84} +\index{Discretization@{Discretization}!computeDuvDy@{computeDuvDy}} +\index{computeDuvDy@{computeDuvDy}!Discretization@{Discretization}} +\doxysubsubsection{\texorpdfstring{computeDuvDy()}{computeDuvDy()}} +{\footnotesize\ttfamily virtual double Discretization\+::compute\+Duv\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [pure virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y. + + + +Implemented in \mbox{\hyperlink{classCentralDifferences_a4184367de8d48e678edfb078a19fc0a4}{Central\+Differences}}, and \mbox{\hyperlink{classDonorCell_a285562312f08efde26afd160174d2843}{Donor\+Cell}}. + +\Hypertarget{classDiscretization_a69ba136ab7f8c09d805afca159cab428}\label{classDiscretization_a69ba136ab7f8c09d805afca159cab428} +\index{Discretization@{Discretization}!computeDv2Dy@{computeDv2Dy}} +\index{computeDv2Dy@{computeDv2Dy}!Discretization@{Discretization}} +\doxysubsubsection{\texorpdfstring{computeDv2Dy()}{computeDv2Dy()}} +{\footnotesize\ttfamily virtual double Discretization\+::compute\+Dv2\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [pure virtual]}} + + + +Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y. + + + +Implemented in \mbox{\hyperlink{classCentralDifferences_a66eb9b800b9a9ac6f81fc719a42eb0ee}{Central\+Differences}}, and \mbox{\hyperlink{classDonorCell_a01dcfb7fcf356d5ee412107a30c26fb3}{Donor\+Cell}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/discretization.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/discretization.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classDonorCell.eps b/documentation/latex/classDonorCell.eps new file mode 100644 index 00000000..b2ede092 --- /dev/null +++ b/documentation/latex/classDonorCell.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 588.235291 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 0.850000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(DonorCell) cw +(Discretization) cw +(StaggeredGrid) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (DonorCell) 0.000000 0.000000 box + (Discretization) 0.000000 1.000000 box + (StaggeredGrid) 0.000000 2.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in +solid +0 0.000000 1.000000 out +solid +1 0.000000 2.000000 in diff --git a/documentation/latex/classDonorCell.pdf b/documentation/latex/classDonorCell.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ad49977a93e718b23c3f8ea852c0dd173a8544f3 GIT binary patch literal 5600 zcmb_AX;@QN(~4*{w#W-Ah)b_f8mfkSvxi865ds1RS)zc58j_n3$wuxC1Q2mUPy`V{ zQ3MrHDXtXjhJuO~L=h3eYC#lnUn*+R*Y!I$EZWxRYk$0#<(xBTX3m_MIrGenqrZnI zh3d>CIaWVjQ%G`j^wz{^r4n4J)o>vN22r9RiY!RrDGUUo-wc1j%pf6{O%;gUr-9L3 ztJVSJ2&GDi$4y6LP!$g_gD9AXaF(~bkf)Q$WA#cL1&|pATxY;Nl`53y1}MR~K|-vC)KdlBJlb8?!X(JYpTwUSms78TDLM#9Ygn=wLs)t}t6(I3IrCJ%v z=aVp8k4n@e&tv5|vib%c4hA5sFJ>US0Fx4~2cW=_B)Vy+ zQV|K3Y!(S74k7jkQWES9?5~sxGzt|8AtX2mN7b_+Dgy9CN(=+{G3gwlF~Md?4;uyx zEC>Su7j}Z(VGq~~4uU1H6qdm#tbmoU3f90{SPx?`4#)psx(pF^>3}o1_Gd0*TKA}- zI~aZ*3xPbJE6=?*c+#i{htK~MCbOf&LBVz_>Zu)@c^2p-#)QIq2R1941j4Z+@-LRK zk1w-N9b7o)yD64dnjv>Rtp+bS;GMcWYRbM%{REJiaN_z2sap^IK~oFIHeBRvZwlQj z4Spq2Cr#JY&8Ao0YrF9_?9uzKMO(C$-`%37LEe{NY;|(aEwi7KwH7M4_OalF!_nlj zBSP2IvyBand9TOZ_MS3h+{>4da|b)eZ{PQ7Z6|vgE9DtK>Ux@Y!@X19Q+AGfSZI)Hd(+jo7eIgvS}(Q)IbsnJjQ0iK17>W|^`KI$Z^ z7`*Xslj=Y0?)vz^+Pt$O3R^k9 zeQ;_1uY$++U6xTR{ZId<9(qeKZRNy{Z)=)E&rEWt&$GEFi1$bkcP75Rc7;_^@L~CS zhccUBvpmkJna^(xCl$2k7o-KM#Ro$}hbHvndd)j_DX?+iDgUrHnvp}5x5uT^cA6La zXQgM9Mn?Ih^vi05+dU7B5d}YPJ?FahkDbNq?A6(|!Ghr2iRVkk>%=7yA#*%8tWdt# z?z^~r+r?9Rqcfk>`?u1^(XdW4SFNF+{MqSyzM1Uji~dWGXn1$h=Jf#9Jo{X`p(oQ2 zgX-$tqK-rSQ4>eay0Iko)G!m=zoK8N;rg+nGJ7WCG!!Do3waB zS*=y0r8+%%^sN;yFD?7cJ$Z>`y%}fRf7_Gq4{rZx>})W2E{czOwr}+}m)Pc>jI-qy z7CYRQ)eP9$TK}IZ-)2~x&w68fZ%AHI^sr}}{8pT3SvU82T~x-@@AfZpez?POv0JQY zb&K7j_oEjM+_IAFuoIw&x+rAc;tHZAZ^wC%X{tWENq{%J$};kG$pjp<{3YW$)zum*-O$YBM7*F(T>itT6}810vgoR=0hXk~x{YK^w}22{dZ|{U*K7>JB>B9W33i0?>7@=jLsb(7-e5NbvL}Jw5aGp zBx@=BY{Z0OhefKICRWSYj$q%i?16#z^Y;AIHoxJ&TOwiS>1?}2>3MB;dCzSri5-VF z{Pt?clx@wnV#|()j|PPf7gkB!%S%Mpt=nt|omxeqjz5|nr&iaAD0gBTe7?VyAjJ$HZG?_*T^9>g5= zBWELXZq{^VZ`KVq zb025_rmku7n)n5V(-XR~uT0?Yja*Wp$QvEzbtq}%aEt>xu1(Ka_jviY111>{SamwT zY>Mqdx|%(`s()SW{P^ZbJhLUfgPghHd~h+dzhg!2HvgfAS8J=>E;|}o9~tP0Fhw5H z|BU~U&L^~rRS9bf&ZS5+OO_pU6UGI(`eCBXd9%&aS~tMO6*YQxD>iobaAoYo7EDbk zJLxkxexhOJq`AVO`5T+6TMsHDzS(wkS_O$+jK+>;^-Z;gqX;k~`VJVCN$Z{v+S2Mkr`542t?i80%gR6a%L=N9_X z#k~I5^B@bA&*^u}TThnl%{f%zyJsNJX0^*PIHq8x>)^$DM`5$k7jN>0}jVmq-D5t!sz3et%`TYpGg=3EfZa8DuAS$t=MR5pM9kurxBA-g7kP$k z)UG|HIxzXo{pO}^!E1vV>wFD2#fygCvA!HKD@gHT_lj@MrpF)7s%@HQyfJJ^CExgB z!!mZ~yM)K>4a)__5p%}g&p(3bXgl&AxCU&P`R$;K{=XOaeZW>-b+u8d#i^lTGr49* zZ1BhoUky8IT?Kfq-pXX)0x$vi4Bt$g5HxZ%I==8os#MRBHlSrdb9Ev~{ zN)3Dl{mW*6I~7 z)y2gHMrbgNMgbTUEKY+souumSkc!S%q53rZ%LL5k{mWH0~ekXNJ@!@Ele$iuFOTy8bvd7g&=?eiMnM>28p5Tya1r)Igvvz_SNJcO zz*vCP9hC2&oc|Z3pJ9GRs@02u3HcscW1IrjbRS~E?AdUI2{nFp&wqJyiB2T?|L?9= z6V627aXqwBgBsKc-X1)%!Jw3J=`4<%jZ$S4c|-(4p;F~86a;(}x?IjgTv$@@C;7KV zkV*UG&>8e9le@{JFsed{BQanHDiA~_<;t~swFCzauhW4t#ncpnfj5x(u3!^a;wqGH za%O=F@1CfXgj;b{5{-gKHd17$Tw+k+WWKvff?-5K)vY|0lHWZs5yGFCfti#rpH|<^ zF9?n9W!yv2M{3$4Nc#xBU>6ezJT+h=0YgmK*{RQhy{xr* zr=BMQAfWRW2>?Iv`8{0{qaKxmqMb@35nkH;K`bVd&V=MpFO0(mEdt_$G`%n;LjM~K z;ZQ+u+SS-+0`3ua24eH=O!>BYiXtw+rhPW{P2BR`T6XGv; zbT;iXnQ^@Y)Y^K`Y=qz-WjqRW0KtJ;EocQ1#Ww_dYvfvpFeT_pd3!)%t_-%2#bncj yE=(5}Dw9R!u$e-diwA?@!4cA!R4V_UF~W&16NXFlxJmI$8o~yxT;U8)(*FUHMo!-V literal 0 HcmV?d00001 diff --git a/documentation/latex/classDonorCell.tex b/documentation/latex/classDonorCell.tex new file mode 100644 index 00000000..02e099c1 --- /dev/null +++ b/documentation/latex/classDonorCell.tex @@ -0,0 +1,246 @@ +\doxysection{Donor\+Cell Class Reference} +\hypertarget{classDonorCell}{}\label{classDonorCell}\index{DonorCell@{DonorCell}} + + +Discretizes the problem using the donor cell scheme. + + + + +{\ttfamily \#include $<$donor\+\_\+cell.\+h$>$} + +Inheritance diagram for Donor\+Cell\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classDonorCell} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classDonorCell_a4896ad035a5ac50c85e2b66d442a5312}{Donor\+Cell}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}, double alpha) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classDonorCell_a265bdaf46ed8ba46a42ef0cb03807175}{compute\+Du2\+Dx}} (int i, int j) const override +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x with the donor cell Scheme. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classDonorCell_a01dcfb7fcf356d5ee412107a30c26fb3}{compute\+Dv2\+Dy}} (int i, int j) const override +\begin{DoxyCompactList}\small\item\em Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y with the donor cell Scheme. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classDonorCell_ae41b5f85743ca7f148bd829561bd9cb5}{compute\+Duv\+Dx}} (int i, int j) const override +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x with the donor cell Scheme. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classDonorCell_a285562312f08efde26afd160174d2843}{compute\+Duv\+Dy}} (int i, int j) const override +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y with the donor cell Scheme. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classDiscretization}{Discretization}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c}{Discretization}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+D2u\+Dx2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to x. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+D2u\+Dy2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to y. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+D2v\+Dx2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to x. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+D2v\+Dy2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to y. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+Dp\+Dx} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to x. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+Dp\+Dy} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to y. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}{Staggered\+Grid}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width} () const +\begin{DoxyCompactList}\small\item\em Get the length of a single cell in x and y directions. \end{DoxyCompactList}\item +const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells} () const +\begin{DoxyCompactList}\small\item\em Get number of cells in x and y directions. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries u} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable u. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries v} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable v. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries p} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable p. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries rhs} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable rhs. \end{DoxyCompactList}\item +double {\bfseries u} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries u} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j) \end{DoxyCompactList}\item +double {\bfseries v} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries v} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j) \end{DoxyCompactList}\item +double {\bfseries p} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries p} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries f} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of f in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries g} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of g in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries rhs} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of rhs in element (i,j) \end{DoxyCompactList}\item +double {\bfseries dx} () const +\begin{DoxyCompactList}\small\item\em Get the mesh width in x-\/direction. \end{DoxyCompactList}\item +double {\bfseries dy} () const +\begin{DoxyCompactList}\small\item\em Get the mesh width in y-\/direction. \end{DoxyCompactList}\item +int {\bfseries u\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for u in x direction \end{DoxyCompactList}\item +int {\bfseries u\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for u in x direction \end{DoxyCompactList}\item +int {\bfseries u\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for u in y direction \end{DoxyCompactList}\item +int {\bfseries u\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for u in y direction \end{DoxyCompactList}\item +int {\bfseries v\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for v in x direction \end{DoxyCompactList}\item +int {\bfseries v\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for v in x direction \end{DoxyCompactList}\item +int {\bfseries v\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for v in y direction \end{DoxyCompactList}\item +int {\bfseries v\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for v in y direction \end{DoxyCompactList}\item +int {\bfseries p\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for p in x direction \end{DoxyCompactList}\item +int {\bfseries p\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for p in x direction \end{DoxyCompactList}\item +int {\bfseries p\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for p in y direction \end{DoxyCompactList}\item +int {\bfseries p\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for p in y direction \end{DoxyCompactList}\item +int {\bfseries f\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for f in x direction \end{DoxyCompactList}\item +int {\bfseries f\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for f in x direction \end{DoxyCompactList}\item +int {\bfseries f\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for f in y direction \end{DoxyCompactList}\item +int {\bfseries f\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for f in y direction \end{DoxyCompactList}\item +int {\bfseries g\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for g in x direction \end{DoxyCompactList}\item +int {\bfseries g\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for g in x direction \end{DoxyCompactList}\item +int {\bfseries g\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for g in y direction \end{DoxyCompactList}\item +int {\bfseries g\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for g in y direction \end{DoxyCompactList}\item +int {\bfseries rhs\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries rhs\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries rhs\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for rhs in y direction \end{DoxyCompactList}\item +int {\bfseries rhs\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in y direction \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Additional Inherited Members} +\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} +\begin{DoxyCompactItemize} +\item +const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells\+\_\+} +\begin{DoxyCompactList}\small\item\em array containing number of cells in x and y directions \end{DoxyCompactList}\item +const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width\+\_\+} +\begin{DoxyCompactList}\small\item\em array containing the sizes of cell edges in x and y directions \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries u\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable u \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries v\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable v \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries p\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable p \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries f\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable f \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries g\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable g \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries rhs\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable rhs \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Discretizes the problem using the donor cell scheme. + +Implements the first derivatives of u\texorpdfstring{$^\wedge$}{\string^}2, v\texorpdfstring{$^\wedge$}{\string^}2 and u\texorpdfstring{$\ast$}{*}v according to the donor cell scheme + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classDonorCell_a4896ad035a5ac50c85e2b66d442a5312}\label{classDonorCell_a4896ad035a5ac50c85e2b66d442a5312} +\index{DonorCell@{DonorCell}!DonorCell@{DonorCell}} +\index{DonorCell@{DonorCell}!DonorCell@{DonorCell}} +\doxysubsubsection{\texorpdfstring{DonorCell()}{DonorCell()}} +{\footnotesize\ttfamily Donor\+Cell\+::\+Donor\+Cell (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{n\+Cells, }\item[{std\+::array$<$ double, 2 $>$}]{mesh\+Width, }\item[{double}]{alpha }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em n\+Cells} & array containing number of cells in x and y directions \\ +\hline +{\em mesh\+Width} & array containing the length of a single cell in x and y directions \\ +\hline +{\em alpha} & weight factor between central differences and donor cell schemes \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classDonorCell_a265bdaf46ed8ba46a42ef0cb03807175}\label{classDonorCell_a265bdaf46ed8ba46a42ef0cb03807175} +\index{DonorCell@{DonorCell}!computeDu2Dx@{computeDu2Dx}} +\index{computeDu2Dx@{computeDu2Dx}!DonorCell@{DonorCell}} +\doxysubsubsection{\texorpdfstring{computeDu2Dx()}{computeDu2Dx()}} +{\footnotesize\ttfamily double Donor\+Cell\+::compute\+Du2\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x with the donor cell Scheme. + + + +Implements \mbox{\hyperlink{classDiscretization_acca6bf193e0e91f645d292527299254b}{Discretization}}. + +\Hypertarget{classDonorCell_ae41b5f85743ca7f148bd829561bd9cb5}\label{classDonorCell_ae41b5f85743ca7f148bd829561bd9cb5} +\index{DonorCell@{DonorCell}!computeDuvDx@{computeDuvDx}} +\index{computeDuvDx@{computeDuvDx}!DonorCell@{DonorCell}} +\doxysubsubsection{\texorpdfstring{computeDuvDx()}{computeDuvDx()}} +{\footnotesize\ttfamily double Donor\+Cell\+::compute\+Duv\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x with the donor cell Scheme. + + + +Implements \mbox{\hyperlink{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795}{Discretization}}. + +\Hypertarget{classDonorCell_a285562312f08efde26afd160174d2843}\label{classDonorCell_a285562312f08efde26afd160174d2843} +\index{DonorCell@{DonorCell}!computeDuvDy@{computeDuvDy}} +\index{computeDuvDy@{computeDuvDy}!DonorCell@{DonorCell}} +\doxysubsubsection{\texorpdfstring{computeDuvDy()}{computeDuvDy()}} +{\footnotesize\ttfamily double Donor\+Cell\+::compute\+Duv\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y with the donor cell Scheme. + + + +Implements \mbox{\hyperlink{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84}{Discretization}}. + +\Hypertarget{classDonorCell_a01dcfb7fcf356d5ee412107a30c26fb3}\label{classDonorCell_a01dcfb7fcf356d5ee412107a30c26fb3} +\index{DonorCell@{DonorCell}!computeDv2Dy@{computeDv2Dy}} +\index{computeDv2Dy@{computeDv2Dy}!DonorCell@{DonorCell}} +\doxysubsubsection{\texorpdfstring{computeDv2Dy()}{computeDv2Dy()}} +{\footnotesize\ttfamily double Donor\+Cell\+::compute\+Dv2\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y with the donor cell Scheme. + + + +Implements \mbox{\hyperlink{classDiscretization_a69ba136ab7f8c09d805afca159cab428}{Discretization}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/donor\+\_\+cell.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/donor\+\_\+cell.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classFieldVariable.eps b/documentation/latex/classFieldVariable.eps new file mode 100644 index 00000000..0a27d91c --- /dev/null +++ b/documentation/latex/classFieldVariable.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 416.666656 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.200000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(FieldVariable) cw +(Array2D) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (FieldVariable) 0.000000 0.000000 box + (Array2D) 0.000000 1.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in diff --git a/documentation/latex/classFieldVariable.pdf b/documentation/latex/classFieldVariable.pdf new file mode 100644 index 0000000000000000000000000000000000000000..88b42a4a104c8c25571fe3fe94b2848e9c106a2d GIT binary patch literal 4939 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 + +Inheritance diagram for Field\+Variable\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classFieldVariable} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classFieldVariable_aa0985778bc6331b74904a03c3ef67a98}{Field\+Variable}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}}, std\+::array$<$ double, 2 $>$ origin, std\+::array$<$ double, 2 $>$ mesh\+Width) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classFieldVariable_a2949624f1d2d7e29872f743db0b1d83b}{interpolate\+At}} (double x, double y) const +\begin{DoxyCompactList}\small\item\em Interpolates value of field variable in domain using x and y coordinates. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classFieldVariable_a55168fd422c70c8386ba311909427cf7}{find\+Abs\+Max}} () const +\begin{DoxyCompactList}\small\item\em Find point in \doxylink{classArray2D}{Array2D} of Fieldvariable with maximum value. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classArray2D}{Array2D}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classArray2D_a16521417dfdf67ec694bfb7747df9000}{Array2D}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}}) +\begin{DoxyCompactList}\small\item\em constructor. \end{DoxyCompactList}\item +double \& \mbox{\hyperlink{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8}{operator()}} (int i, int j) +\begin{DoxyCompactList}\small\item\em set array value. Overloads the () operator \end{DoxyCompactList}\item +double \mbox{\hyperlink{classArray2D_af745718ec25b815051de2d0c3c94e0d2}{operator()}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em get array value. Overloads the () operator \end{DoxyCompactList}\item +std\+::array$<$ int, 2 $>$ {\bfseries size} () const +\begin{DoxyCompactList}\small\item\em get size of array in x and y direction \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Additional Inherited Members} +\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classArray2D}{Array2D}}} +\begin{DoxyCompactItemize} +\item +const std\+::array$<$ int, 2 $>$ {\bfseries size\+\_\+} +\begin{DoxyCompactList}\small\item\em size of array in x and y direction \end{DoxyCompactList}\item +std\+::vector$<$ double $>$ {\bfseries data\+\_\+} +\begin{DoxyCompactList}\small\item\em storage array values, in row-\/major order \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\doxylink{classDiscretization}{Discretization} of a scalar function. + +A field variable is the discretization of a scalar function f(x) with x in the computational domain. More specifically, a scalar value is stored at discrete nodes/points. The nodes are arranged in an equidistant mesh with specified mesh width. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classFieldVariable_aa0985778bc6331b74904a03c3ef67a98}\label{classFieldVariable_aa0985778bc6331b74904a03c3ef67a98} +\index{FieldVariable@{FieldVariable}!FieldVariable@{FieldVariable}} +\index{FieldVariable@{FieldVariable}!FieldVariable@{FieldVariable}} +\doxysubsubsection{\texorpdfstring{FieldVariable()}{FieldVariable()}} +{\footnotesize\ttfamily Field\+Variable\+::\+Field\+Variable (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{size, }\item[{std\+::array$<$ double, 2 $>$}]{origin, }\item[{std\+::array$<$ double, 2 $>$}]{mesh\+Width }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em size} & number of cells in x and y direction \\ +\hline +{\em origin} & orgin of Fieldvariable relative to domain origin \\ +\hline +{\em meshwidth} & mesh width in x and y direction \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classFieldVariable_a55168fd422c70c8386ba311909427cf7}\label{classFieldVariable_a55168fd422c70c8386ba311909427cf7} +\index{FieldVariable@{FieldVariable}!findAbsMax@{findAbsMax}} +\index{findAbsMax@{findAbsMax}!FieldVariable@{FieldVariable}} +\doxysubsubsection{\texorpdfstring{findAbsMax()}{findAbsMax()}} +{\footnotesize\ttfamily double Field\+Variable\+::find\+Abs\+Max (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const} + + + +Find point in \doxylink{classArray2D}{Array2D} of Fieldvariable with maximum value. + +Finds maximum by iterating through all values in Fiel\+Variable \Hypertarget{classFieldVariable_a2949624f1d2d7e29872f743db0b1d83b}\label{classFieldVariable_a2949624f1d2d7e29872f743db0b1d83b} +\index{FieldVariable@{FieldVariable}!interpolateAt@{interpolateAt}} +\index{interpolateAt@{interpolateAt}!FieldVariable@{FieldVariable}} +\doxysubsubsection{\texorpdfstring{interpolateAt()}{interpolateAt()}} +{\footnotesize\ttfamily double Field\+Variable\+::interpolate\+At (\begin{DoxyParamCaption}\item[{double}]{x, }\item[{double}]{y }\end{DoxyParamCaption}) const} + + + +Interpolates value of field variable in domain using x and y coordinates. + +Interpolates by using bilinear interpolation. + + +\begin{DoxyParams}{Parameters} +{\em x} & x postion of point to interpolate \\ +\hline +{\em y} & y postion of point to interpolate \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/storage/field\+\_\+variable.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/storage/field\+\_\+variable.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classFluidTracer.tex b/documentation/latex/classFluidTracer.tex new file mode 100644 index 00000000..7d7c7b28 --- /dev/null +++ b/documentation/latex/classFluidTracer.tex @@ -0,0 +1,101 @@ +\doxysection{Fluid\+Tracer Class Reference} +\hypertarget{classFluidTracer}{}\label{classFluidTracer}\index{FluidTracer@{FluidTracer}} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classFluidTracer_a0a1c9fde640a129696e5c47869948939}\label{classFluidTracer_a0a1c9fde640a129696e5c47869948939} +{\bfseries Fluid\+Tracer} (int num\+Particlesper\+Cell, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$ mask) +\item +\Hypertarget{classFluidTracer_ad7f2ef5ef8d806b87c6478e85159a873}\label{classFluidTracer_ad7f2ef5ef8d806b87c6478e85159a873} +{\bfseries Fluid\+Tracer} (std\+::vector$<$ double $>$ x, std\+::vector$<$ double $>$ y, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$ mask) +\item +void \mbox{\hyperlink{classFluidTracer_aba4d452f26e9276b91256dd251789b90}{move\+Particles}} (double dt) +\begin{DoxyCompactList}\small\item\em Update the position of the particles according to the velocity field and sets mask accordingly. \end{DoxyCompactList}\item +void \mbox{\hyperlink{classFluidTracer_ace163e1fe040acbd4c3122f082b08eea}{create\+Particles}} (double position\+SourceX, double position\+SourceY) +\begin{DoxyCompactList}\small\item\em can be used to create a source cell for particles \end{DoxyCompactList}\item +int \mbox{\hyperlink{classFluidTracer_adc687a4988f532e21e13c9aa0591d658}{get\+Number\+Of\+Particles}} () const +\begin{DoxyCompactList}\small\item\em Get the Number Of Particles object. \end{DoxyCompactList}\item +std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classFluidTracer_a37ee0325d6af08be6eba8b073162342e}{get\+Particle\+Position}} (int i) const +\begin{DoxyCompactList}\small\item\em Get the Particle Position, index starts at 0. \end{DoxyCompactList}\item +\Hypertarget{classFluidTracer_a0a9c3c092d01327d636ef39b8dd36ed8}\label{classFluidTracer_a0a9c3c092d01327d636ef39b8dd36ed8} +std\+::array$<$ int, 2 $>$ {\bfseries cell\+Of\+Particle} (int i) +\item +\Hypertarget{classFluidTracer_a052e1ab909459100cd6a6cd8e9064ba6}\label{classFluidTracer_a052e1ab909459100cd6a6cd8e9064ba6} +int {\bfseries val2\+CellX} (double x\+Val) +\item +\Hypertarget{classFluidTracer_a7bc97a7586fa8d900a6269e77c9ccba1}\label{classFluidTracer_a7bc97a7586fa8d900a6269e77c9ccba1} +int {\bfseries val2\+CellY} (double y\+Val) +\item +\Hypertarget{classFluidTracer_a8306a4cff0036da1fcf695713f9f4226}\label{classFluidTracer_a8306a4cff0036da1fcf695713f9f4226} +std\+::array$<$ double, 2 $>$ {\bfseries update\+Particle} (int i, std\+::array$<$ int, 2 $>$ idx, double dt, std\+::array$<$ double, 2 $>$ vel, int depth) +\item +\Hypertarget{classFluidTracer_acdaf955221e204e107513b0e29738d53}\label{classFluidTracer_acdaf955221e204e107513b0e29738d53} +std\+::array$<$ double, 2 $>$ {\bfseries move\+Particles} (double dt, std\+::array$<$ double, 2 $>$ vel) +\end{DoxyCompactItemize} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classFluidTracer_ace163e1fe040acbd4c3122f082b08eea}\label{classFluidTracer_ace163e1fe040acbd4c3122f082b08eea} +\index{FluidTracer@{FluidTracer}!createParticles@{createParticles}} +\index{createParticles@{createParticles}!FluidTracer@{FluidTracer}} +\doxysubsubsection{\texorpdfstring{createParticles()}{createParticles()}} +{\footnotesize\ttfamily void Fluid\+Tracer\+::create\+Particles (\begin{DoxyParamCaption}\item[{double}]{position\+SourceX, }\item[{double}]{position\+SourceY }\end{DoxyParamCaption})} + + + +can be used to create a source cell for particles + +fills the cell homogenously with particles by cell \Hypertarget{classFluidTracer_adc687a4988f532e21e13c9aa0591d658}\label{classFluidTracer_adc687a4988f532e21e13c9aa0591d658} +\index{FluidTracer@{FluidTracer}!getNumberOfParticles@{getNumberOfParticles}} +\index{getNumberOfParticles@{getNumberOfParticles}!FluidTracer@{FluidTracer}} +\doxysubsubsection{\texorpdfstring{getNumberOfParticles()}{getNumberOfParticles()}} +{\footnotesize\ttfamily int Fluid\+Tracer\+::get\+Number\+Of\+Particles (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const} + + + +Get the Number Of Particles object. + +\begin{DoxyReturn}{Returns} +int +\end{DoxyReturn} +\Hypertarget{classFluidTracer_a37ee0325d6af08be6eba8b073162342e}\label{classFluidTracer_a37ee0325d6af08be6eba8b073162342e} +\index{FluidTracer@{FluidTracer}!getParticlePosition@{getParticlePosition}} +\index{getParticlePosition@{getParticlePosition}!FluidTracer@{FluidTracer}} +\doxysubsubsection{\texorpdfstring{getParticlePosition()}{getParticlePosition()}} +{\footnotesize\ttfamily std\+::array$<$ double, 2 $>$ Fluid\+Tracer\+::get\+Particle\+Position (\begin{DoxyParamCaption}\item[{int}]{i }\end{DoxyParamCaption}) const} + + + +Get the Particle Position, index starts at 0. + + +\begin{DoxyParams}{Parameters} +{\em i} & \\ +\hline +\end{DoxyParams} +\begin{DoxyReturn}{Returns} +std\+::array$<$double, 2$>$ +\end{DoxyReturn} +\Hypertarget{classFluidTracer_aba4d452f26e9276b91256dd251789b90}\label{classFluidTracer_aba4d452f26e9276b91256dd251789b90} +\index{FluidTracer@{FluidTracer}!moveParticles@{moveParticles}} +\index{moveParticles@{moveParticles}!FluidTracer@{FluidTracer}} +\doxysubsubsection{\texorpdfstring{moveParticles()}{moveParticles()}} +{\footnotesize\ttfamily void Fluid\+Tracer\+::move\+Particles (\begin{DoxyParamCaption}\item[{double}]{dt }\end{DoxyParamCaption})} + + + +Update the position of the particles according to the velocity field and sets mask accordingly. + +get the velocity field \$u\$ and \$v\$ Checks for collision with border or obstacle and reflects the particle at this position Update the mask where there are new Air or Fluid cells + + +\begin{DoxyParams}{Parameters} +{\em dt} & \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/surface/fluid\+\_\+tracer.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/surface/fluid\+\_\+tracer.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classGaussSeidel.eps b/documentation/latex/classGaussSeidel.eps new file mode 100644 index 00000000..3e8f9980 --- /dev/null +++ b/documentation/latex/classGaussSeidel.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 370.370361 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.350000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(GaussSeidel) cw +(PressureSolver) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (GaussSeidel) 0.000000 0.000000 box + (PressureSolver) 0.000000 1.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in diff --git a/documentation/latex/classGaussSeidel.pdf b/documentation/latex/classGaussSeidel.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2d57d158b42bb270dadbe93e7d3b8ecc698935a7 GIT binary patch literal 5020 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 literal 0 HcmV?d00001 diff --git a/documentation/latex/classGaussSeidel.tex b/documentation/latex/classGaussSeidel.tex new file mode 100644 index 00000000..d30b36f9 --- /dev/null +++ b/documentation/latex/classGaussSeidel.tex @@ -0,0 +1,111 @@ +\doxysection{Gauss\+Seidel Class Reference} +\hypertarget{classGaussSeidel}{}\label{classGaussSeidel}\index{GaussSeidel@{GaussSeidel}} + + +Standard Gauss-\/\+Seidel solver. + + + + +{\ttfamily \#include $<$gauss\+\_\+seidel.\+h$>$} + +Inheritance diagram for Gauss\+Seidel\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classGaussSeidel} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classGaussSeidel_af31cc1ace2d616ebb8e0592c06865b9c}{Gauss\+Seidel}} (const std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ \&data, double epsilon, int maximum\+Number\+Of\+Iterations, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ boundary) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +void \mbox{\hyperlink{classGaussSeidel_a6f0eb0c6938a64f8ded186f88170a04b}{solve}} () override +\begin{DoxyCompactList}\small\item\em override function that starts solver. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058}{Pressure\+Solver}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, double epsilon, int maximum\+Number\+Of\+Iterations, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ boundary) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Additional Inherited Members} +\doxysubsection*{Public Attributes inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} +\begin{DoxyCompactItemize} +\item +double {\bfseries dx2} +\item +double {\bfseries dy2} +\begin{DoxyCompactList}\small\item\em squared mesh widths \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Protected Member Functions inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} +\begin{DoxyCompactItemize} +\item +void \mbox{\hyperlink{classPressureSolver_a458c383fcacaf54c1a333a271049ca93}{set\+Boundary\+Values}} () +\begin{DoxyCompactList}\small\item\em Set the \doxylink{classBoundary}{Boundary} Values. \end{DoxyCompactList}\item +double {\bfseries calculate\+Residuum} () +\begin{DoxyCompactList}\small\item\em calculate residuum of current time step \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} +\begin{DoxyCompactItemize} +\item +int {\bfseries i\+\_\+beg} +\begin{DoxyCompactList}\small\item\em begin of loop for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries i\+\_\+end} +\begin{DoxyCompactList}\small\item\em end of loop for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries j\+\_\+beg} +\begin{DoxyCompactList}\small\item\em begin of loop for rhs in y direction \end{DoxyCompactList}\item +int {\bfseries j\+\_\+end} +\begin{DoxyCompactList}\small\item\em end of loop for rhs in y direction \end{DoxyCompactList}\item +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} +\begin{DoxyCompactList}\small\item\em object holding the needed field variables for rhs and p \end{DoxyCompactList}\item +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ {\bfseries boundary\+\_\+} +\begin{DoxyCompactList}\small\item\em object managing boundary for obstacle and surface tension \end{DoxyCompactList}\item +double {\bfseries epsilon\+\_\+} +\begin{DoxyCompactList}\small\item\em tolerance for the solver \end{DoxyCompactList}\item +int {\bfseries maximum\+Number\+Of\+Iterations\+\_\+} +\begin{DoxyCompactList}\small\item\em maximum number of iterations \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Standard Gauss-\/\+Seidel solver. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classGaussSeidel_af31cc1ace2d616ebb8e0592c06865b9c}\label{classGaussSeidel_af31cc1ace2d616ebb8e0592c06865b9c} +\index{GaussSeidel@{GaussSeidel}!GaussSeidel@{GaussSeidel}} +\index{GaussSeidel@{GaussSeidel}!GaussSeidel@{GaussSeidel}} +\doxysubsubsection{\texorpdfstring{GaussSeidel()}{GaussSeidel()}} +{\footnotesize\ttfamily Gauss\+Seidel\+::\+Gauss\+Seidel (\begin{DoxyParamCaption}\item[{const std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ \&}]{data, }\item[{double}]{epsilon, }\item[{int}]{maximum\+Number\+Of\+Iterations, }\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$}]{boundary }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em data} & instance of \doxylink{classDiscretization}{Discretization} holding the needed field variables for rhs and p \\ +\hline +{\em epsilon} & tolerance for the solver \\ +\hline +{\em maximum\+Number\+Of\+Iterations} & maximum of iteration \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classGaussSeidel_a6f0eb0c6938a64f8ded186f88170a04b}\label{classGaussSeidel_a6f0eb0c6938a64f8ded186f88170a04b} +\index{GaussSeidel@{GaussSeidel}!solve@{solve}} +\index{solve@{solve}!GaussSeidel@{GaussSeidel}} +\doxysubsubsection{\texorpdfstring{solve()}{solve()}} +{\footnotesize\ttfamily void Gauss\+Seidel\+::solve (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +override function that starts solver. + + + +Implements \mbox{\hyperlink{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0}{Pressure\+Solver}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/gauss\+\_\+seidel.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/gauss\+\_\+seidel.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classMask.tex b/documentation/latex/classMask.tex new file mode 100644 index 00000000..fd7e65db --- /dev/null +++ b/documentation/latex/classMask.tex @@ -0,0 +1,248 @@ +\doxysection{Mask Class Reference} +\hypertarget{classMask}{}\label{classMask}\index{Mask@{Mask}} +\doxysubsubsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classMask_ad74a26afe88ebadafebd733837f3252a}\label{classMask_ad74a26afe88ebadafebd733837f3252a} +enum {\bfseries Cell\+Type} \{ \newline +{\bfseries FLUID\+\_\+\+DROPLET} = 0 +, {\bfseries FLUID\+\_\+\+SINGLE\+\_\+\+LEFT} = 1 +, {\bfseries FLUID\+\_\+\+SINGLE\+\_\+\+TOP} = 2 +, {\bfseries FLUID\+\_\+\+SINGLE\+\_\+\+RIGHT} = 4 +, \newline +{\bfseries FLUID\+\_\+\+SINGLE\+\_\+\+BOTTOM} = 8 +, {\bfseries FLUID\+\_\+\+CORNER\+\_\+\+BOTTOM\+\_\+\+LEFT} = 6 +, {\bfseries FLUID\+\_\+\+CORNER\+\_\+\+TOP\+\_\+\+LEFT} = 12 +, {\bfseries FLUID\+\_\+\+CORNER\+\_\+\+TOP\+\_\+\+RIGHT} = 9 +, \newline +{\bfseries FLUID\+\_\+\+CORNER\+\_\+\+BOTTOM\+\_\+\+RIGHT} = 3 +, {\bfseries FLUID\+\_\+\+COLUMN\+\_\+\+HORIZONTAL} = 5 +, {\bfseries FLUID\+\_\+\+COLUMN\+\_\+\+VERTICAL} = 10 +, {\bfseries FLUID\+\_\+\+BORDER\+\_\+\+LEFT} = 14 +, \newline +{\bfseries FLUID\+\_\+\+BORDER\+\_\+\+TOP} = 13 +, {\bfseries FLUID\+\_\+\+BORDER\+\_\+\+RIGHT} = 11 +, {\bfseries FLUID\+\_\+\+BORDER\+\_\+\+BOTTOM} = 7 +, {\bfseries FLUID} = 15 +, \newline +{\bfseries FLUID\+\_\+\+TYPE} = 50 +, {\bfseries AIR} = 64 +, {\bfseries OBSTACLE} = 99 +, {\bfseries OBSTACLE\+\_\+\+INSIDE} = 100 +, \newline +{\bfseries OBSTACLE\+\_\+\+BORDER\+\_\+\+LEFT} = 101 +, {\bfseries OBSTACLE\+\_\+\+BORDER\+\_\+\+TOP} = 102 +, {\bfseries OBSTACLE\+\_\+\+CORNER\+\_\+\+TOP\+\_\+\+LEFT} = 103 +, {\bfseries OBSTACLE\+\_\+\+BORDER\+\_\+\+RIGHT} = 104 +, \newline +{\bfseries OBSTACLE\+\_\+\+CORNER\+\_\+\+TOP\+\_\+\+RIGHT} = 106 +, {\bfseries OBSTACLE\+\_\+\+BORDER\+\_\+\+BOTTOM} = 108 +, {\bfseries OBSTACLE\+\_\+\+CORNER\+\_\+\+BOTTOM\+\_\+\+LEFT} = 109 +, {\bfseries OBSTACLE\+\_\+\+CORNER\+\_\+\+BOTTOM\+\_\+\+RIGHT} = 112 +, \newline +{\bfseries DOMAIN\+\_\+\+BOUNDARY} = 200 +, {\bfseries DOMAIN\+\_\+\+LEFT\+\_\+\+NOSLIP} = 201 +, {\bfseries DOMAIN\+\_\+\+TOP\+\_\+\+NOSLIP} = 202 +, {\bfseries DOMAIN\+\_\+\+RIGHT\+\_\+\+NOSLIP} = 203 +, \newline +{\bfseries DOMAIN\+\_\+\+BOTTOM\+\_\+\+NOSLIP} = 204 +, {\bfseries DOMAIN\+\_\+\+LEFT\+\_\+\+PRESSURE} = 205 +, {\bfseries DOMAIN\+\_\+\+TOP\+\_\+\+PRESSURE} = 206 +, {\bfseries DOMAIN\+\_\+\+RIGHT\+\_\+\+PRESSURE} = 207 +, \newline +{\bfseries DOMAIN\+\_\+\+BOTTOM\+\_\+\+PRESSURE} = 208 + \} +\end{DoxyCompactItemize} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classMask_a5d65d3a108a79864bc69994f5e56f6c3}{Mask}} (\mbox{\hyperlink{structSettings}{Settings}} settings) +\begin{DoxyCompactList}\small\item\em constructor. \end{DoxyCompactList}\item +int \& \mbox{\hyperlink{classMask_a6d612f1ac2185304b3ad7432d90dcd2b}{operator()}} (int i, int j) +\begin{DoxyCompactList}\small\item\em set array value. Overloads the () operator \end{DoxyCompactList}\item +int \mbox{\hyperlink{classMask_a154acb41f2695c2a6ace82b5ebccbb1c}{operator()}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em get array value. Overloads the () operator \end{DoxyCompactList}\item +\Hypertarget{classMask_aafa0857af35b02ba6070e76f82d51c7b}\label{classMask_aafa0857af35b02ba6070e76f82d51c7b} +std\+::array$<$ int, 2 $>$ {\bfseries size} () const +\begin{DoxyCompactList}\small\item\em get size of array in x and y direction \end{DoxyCompactList}\item +\Hypertarget{classMask_ac30997cdd83faef98290733acb325cf8}\label{classMask_ac30997cdd83faef98290733acb325cf8} +void {\bfseries reset\+Mask} () +\begin{DoxyCompactList}\small\item\em sets all not obstacle cells to air \end{DoxyCompactList}\item +bool \mbox{\hyperlink{classMask_aadacef52f95b796920864b8519d0594b}{is\+Fluid}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Cell at (i,j) is fluid or not. \end{DoxyCompactList}\item +bool \mbox{\hyperlink{classMask_a53e4e7c0b29234856cbee33386cc5c18}{is\+Obstacle}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em True if Cell at (i,j) is either obstacle or boundary. \end{DoxyCompactList}\item +bool \mbox{\hyperlink{classMask_a7eb34f789ef96c622ab93718d5278d77}{is\+Air}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Cell at (i,j) is a air cell or not. \end{DoxyCompactList}\item +\Hypertarget{classMask_a5f3d53087eb5a1d9427716804e280751}\label{classMask_a5f3d53087eb5a1d9427716804e280751} +bool {\bfseries is\+Inner\+Fluid} (int i, int j) const +\item +\Hypertarget{classMask_a9f76177c70d7cab7f268c8fd9a102e73}\label{classMask_a9f76177c70d7cab7f268c8fd9a102e73} +bool {\bfseries is\+Domain\+Boundary} (int i, int j) const +\item +\Hypertarget{classMask_ada8b2531a4a16703f145fd6f708f21ff}\label{classMask_ada8b2531a4a16703f145fd6f708f21ff} +bool {\bfseries is\+Obstacle\+Boundary} (int i, int j) const +\item +\Hypertarget{classMask_a2ffcf2b70edede392422ea692e49d313}\label{classMask_a2ffcf2b70edede392422ea692e49d313} +bool {\bfseries is\+Fluid\+Boundary} (int i, int j) const +\item +int \mbox{\hyperlink{classMask_a3471a6026ce7eab118f660557a8abac6}{get\+Number\+Of\+Fluid\+Cells}} () const +\begin{DoxyCompactList}\small\item\em number of fluid cells \end{DoxyCompactList}\item +\Hypertarget{classMask_a75a1750221e41c1b34f80d4d352163ac}\label{classMask_a75a1750221e41c1b34f80d4d352163ac} +void {\bfseries make\+Rectangular\+Obstacle} () +\item +\Hypertarget{classMask_ad69aefd91f740d6758cdedf0df8c8ca6}\label{classMask_ad69aefd91f740d6758cdedf0df8c8ca6} +void {\bfseries create\+Mask\+From\+PNGBit\+Map} () +\item +\Hypertarget{classMask_aacf4d2cfe1362df85ed08fd3b0fc6d6b}\label{classMask_aacf4d2cfe1362df85ed08fd3b0fc6d6b} +void {\bfseries set\+Domain\+BC} () +\item +\Hypertarget{classMask_a644a84aca88442b72b5cd87ee80f1724}\label{classMask_a644a84aca88442b72b5cd87ee80f1724} +void {\bfseries set\+Obstacle\+BC} () +\item +\Hypertarget{classMask_a41bf0aa100e2554eaea3ab29a999c0ee}\label{classMask_a41bf0aa100e2554eaea3ab29a999c0ee} +void {\bfseries set\+Fluid\+BC} () +\item +\Hypertarget{classMask_a372d2a81ff261f126b11fdfcfd2f845e}\label{classMask_a372d2a81ff261f126b11fdfcfd2f845e} +void {\bfseries print\+Mask} () const +\end{DoxyCompactItemize} +\doxysubsubsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classMask_a84bff46271e16eb8639c1831403c1bb9}\label{classMask_a84bff46271e16eb8639c1831403c1bb9} +std\+::array$<$ int, 2 $>$ {\bfseries size\+\_\+} +\begin{DoxyCompactList}\small\item\em size of array in x and y direction \end{DoxyCompactList}\item +\Hypertarget{classMask_acdb73aee935b502fecc8de6bf1e32a09}\label{classMask_acdb73aee935b502fecc8de6bf1e32a09} +std\+::vector$<$ int $>$ {\bfseries data\+\_\+} +\begin{DoxyCompactList}\small\item\em storage array values, in row-\/major order \end{DoxyCompactList}\item +\Hypertarget{classMask_a3c5a51f6d03bb4a5e1742537a22ec441}\label{classMask_a3c5a51f6d03bb4a5e1742537a22ec441} +std\+::vector$<$ int $>$ {\bfseries boundary\+\_\+list} +\begin{DoxyCompactList}\small\item\em stores the indices of the boundary cells \end{DoxyCompactList}\item +\Hypertarget{classMask_acb8b165d56689722fd836569e066fdd4}\label{classMask_acb8b165d56689722fd836569e066fdd4} +\mbox{\hyperlink{structSettings}{Settings}} {\bfseries settings\+\_\+} +\item +\Hypertarget{classMask_abe4f6f251b0517f01d0f58f9042d3af4}\label{classMask_abe4f6f251b0517f01d0f58f9042d3af4} +int {\bfseries forbidden\+Obstacle\+Fluid\+Combinations} \mbox{[}7\mbox{]} = \{105,107,110,111,113,114,115\} +\end{DoxyCompactItemize} + + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classMask_a5d65d3a108a79864bc69994f5e56f6c3}\label{classMask_a5d65d3a108a79864bc69994f5e56f6c3} +\index{Mask@{Mask}!Mask@{Mask}} +\index{Mask@{Mask}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{Mask()}{Mask()}} +{\footnotesize\ttfamily Mask\+::\+Mask (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{structSettings}{Settings}}}]{settings }\end{DoxyParamCaption})} + + + +constructor. + + +\begin{DoxyParams}{Parameters} +{\em size} & size of array in x and y direction \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classMask_a3471a6026ce7eab118f660557a8abac6}\label{classMask_a3471a6026ce7eab118f660557a8abac6} +\index{Mask@{Mask}!getNumberOfFluidCells@{getNumberOfFluidCells}} +\index{getNumberOfFluidCells@{getNumberOfFluidCells}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{getNumberOfFluidCells()}{getNumberOfFluidCells()}} +{\footnotesize\ttfamily int Mask\+::get\+Number\+Of\+Fluid\+Cells (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const} + + + +number of fluid cells + +not efficient but is only used once in the creation of the fluid tracer \Hypertarget{classMask_a7eb34f789ef96c622ab93718d5278d77}\label{classMask_a7eb34f789ef96c622ab93718d5278d77} +\index{Mask@{Mask}!isAir@{isAir}} +\index{isAir@{isAir}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{isAir()}{isAir()}} +{\footnotesize\ttfamily bool Mask\+::is\+Air (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} + + + +Cell at (i,j) is a air cell or not. + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction\\ +\hline +\end{DoxyParams} +If i and j are out of bond returns false \Hypertarget{classMask_aadacef52f95b796920864b8519d0594b}\label{classMask_aadacef52f95b796920864b8519d0594b} +\index{Mask@{Mask}!isFluid@{isFluid}} +\index{isFluid@{isFluid}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{isFluid()}{isFluid()}} +{\footnotesize\ttfamily bool Mask\+::is\+Fluid (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} + + + +Cell at (i,j) is fluid or not. + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction\\ +\hline +\end{DoxyParams} +If i and j are out of bond returns false \Hypertarget{classMask_a53e4e7c0b29234856cbee33386cc5c18}\label{classMask_a53e4e7c0b29234856cbee33386cc5c18} +\index{Mask@{Mask}!isObstacle@{isObstacle}} +\index{isObstacle@{isObstacle}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{isObstacle()}{isObstacle()}} +{\footnotesize\ttfamily bool Mask\+::is\+Obstacle (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} + + + +True if Cell at (i,j) is either obstacle or boundary. + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction \\ +\hline +\end{DoxyParams} +\Hypertarget{classMask_a6d612f1ac2185304b3ad7432d90dcd2b}\label{classMask_a6d612f1ac2185304b3ad7432d90dcd2b} +\index{Mask@{Mask}!operator()@{operator()}} +\index{operator()@{operator()}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{operator()()}{operator()()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily int \& Mask\+::operator() (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption})} + + + +set array value. Overloads the () operator + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction \\ +\hline +\end{DoxyParams} +\Hypertarget{classMask_a154acb41f2695c2a6ace82b5ebccbb1c}\label{classMask_a154acb41f2695c2a6ace82b5ebccbb1c} +\index{Mask@{Mask}!operator()@{operator()}} +\index{operator()@{operator()}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{operator()()}{operator()()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily int Mask\+::operator() (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} + + + +get array value. Overloads the () operator + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/boundary/mask.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/boundary/mask.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classOutputWriter.eps b/documentation/latex/classOutputWriter.eps new file mode 100644 index 00000000..b542206f --- /dev/null +++ b/documentation/latex/classOutputWriter.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 138.888885 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.600000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(OutputWriter) cw +(OutputWriterParaview) cw +(OutputWriterText) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (OutputWriter) 0.500000 1.000000 box + (OutputWriterParaview) 0.000000 0.000000 box + (OutputWriterText) 1.000000 0.000000 box + +% ----- relations ----- + +solid +1 0.500000 0.250000 out +solid +0.000000 1.000000 1.000000 conn +solid +0 0.000000 0.750000 in +solid +0 1.000000 0.750000 in diff --git a/documentation/latex/classOutputWriter.pdf b/documentation/latex/classOutputWriter.pdf new file mode 100644 index 0000000000000000000000000000000000000000..763b8b367d4b3d60d4636492694b4f4b21502aec GIT binary patch literal 5206 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 + +Inheritance diagram for Output\+Writer\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classOutputWriter} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}{Output\+Writer}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +virtual void \mbox{\hyperlink{classOutputWriter_ac625c204affdc05919388a3549c2e945}{write\+File}} (double current\+Time)=0 +\begin{DoxyCompactList}\small\item\em Write current velocities to file. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classOutputWriter_a0587b2dc160a9b1393411433dfc23b68}\label{classOutputWriter_a0587b2dc160a9b1393411433dfc23b68} +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} +\begin{DoxyCompactList}\small\item\em shared pointer, discretization object containing data to be written to file \end{DoxyCompactList}\item +\Hypertarget{classOutputWriter_a69d167e2526407602dce26ca7a2b9248}\label{classOutputWriter_a69d167e2526407602dce26ca7a2b9248} +int {\bfseries file\+No\+\_\+} +\begin{DoxyCompactList}\small\item\em a counter that increments for every file written to disk \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Inteface class for writing simulation data output. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}\label{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7} +\index{OutputWriter@{OutputWriter}!OutputWriter@{OutputWriter}} +\index{OutputWriter@{OutputWriter}!OutputWriter@{OutputWriter}} +\doxysubsubsection{\texorpdfstring{OutputWriter()}{OutputWriter()}} +{\footnotesize\ttfamily Output\+Writer\+::\+Output\+Writer (\begin{DoxyParamCaption}\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$}]{discretization }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em discretization} & discretization object containing data to be written to file \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classOutputWriter_ac625c204affdc05919388a3549c2e945}\label{classOutputWriter_ac625c204affdc05919388a3549c2e945} +\index{OutputWriter@{OutputWriter}!writeFile@{writeFile}} +\index{writeFile@{writeFile}!OutputWriter@{OutputWriter}} +\doxysubsubsection{\texorpdfstring{writeFile()}{writeFile()}} +{\footnotesize\ttfamily virtual void Output\+Writer\+::write\+File (\begin{DoxyParamCaption}\item[{double}]{current\+Time }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}} + + + +Write current velocities to file. + +Filename is output\+\_\+$<$file\+No\+\_\+$>$.\+vti + + +\begin{DoxyParams}{Parameters} +{\em current\+Time} & current time of simulation \\ +\hline +\end{DoxyParams} + + +Implemented in \mbox{\hyperlink{classOutputWriterParaview_a9e203b63d0e2f26ad53d18ee1821c6bb}{Output\+Writer\+Paraview}}, and \mbox{\hyperlink{classOutputWriterText_a25a12ea2524fc34e9acb19ef1f4c7431}{Output\+Writer\+Text}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classOutputWriterParaview.eps b/documentation/latex/classOutputWriterParaview.eps new file mode 100644 index 00000000..f7ed431b --- /dev/null +++ b/documentation/latex/classOutputWriterParaview.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 277.777771 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.800000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(OutputWriterParaview) cw +(OutputWriter) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (OutputWriterParaview) 0.000000 0.000000 box + (OutputWriter) 0.000000 1.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in diff --git a/documentation/latex/classOutputWriterParaview.pdf b/documentation/latex/classOutputWriterParaview.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c931c49e80453687d59e1460a92dda7e97ea4b04 GIT binary patch literal 4909 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 literal 0 HcmV?d00001 diff --git a/documentation/latex/classOutputWriterParaview.tex b/documentation/latex/classOutputWriterParaview.tex new file mode 100644 index 00000000..d23f68aa --- /dev/null +++ b/documentation/latex/classOutputWriterParaview.tex @@ -0,0 +1,88 @@ +\doxysection{Output\+Writer\+Paraview Class Reference} +\hypertarget{classOutputWriterParaview}{}\label{classOutputWriterParaview}\index{OutputWriterParaview@{OutputWriterParaview}} + + +Write \texorpdfstring{$\ast$}{*}.vti files that can be viewed with Para\+View. + + + + +{\ttfamily \#include $<$output\+\_\+writer\+\_\+paraview.\+h$>$} + +Inheritance diagram for Output\+Writer\+Paraview\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classOutputWriterParaview} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classOutputWriterParaview_a7a599c2694986563c801806234eb07d7}{Output\+Writer\+Paraview}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$ mask) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +void \mbox{\hyperlink{classOutputWriterParaview_a9e203b63d0e2f26ad53d18ee1821c6bb}{write\+File}} (double current\+Time) +\begin{DoxyCompactList}\small\item\em Write current velocities to file, filename is output\+\_\+$<$count$>$.\+vti. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classOutputWriter}{Output\+Writer}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}{Output\+Writer}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Additional Inherited Members} +\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classOutputWriter}{Output\+Writer}}} +\begin{DoxyCompactItemize} +\item +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} +\begin{DoxyCompactList}\small\item\em shared pointer, discretization object containing data to be written to file \end{DoxyCompactList}\item +int {\bfseries file\+No\+\_\+} +\begin{DoxyCompactList}\small\item\em a counter that increments for every file written to disk \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Write \texorpdfstring{$\ast$}{*}.vti files that can be viewed with Para\+View. + +The mesh that can be visualized in Para\+View corresponds to the mesh of the computational domain. All values are given for the nodes of the mesh, i.\+e., the corners of each cell. This means, values will be interpolated because the values are stored at positions given by the staggered grid. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classOutputWriterParaview_a7a599c2694986563c801806234eb07d7}\label{classOutputWriterParaview_a7a599c2694986563c801806234eb07d7} +\index{OutputWriterParaview@{OutputWriterParaview}!OutputWriterParaview@{OutputWriterParaview}} +\index{OutputWriterParaview@{OutputWriterParaview}!OutputWriterParaview@{OutputWriterParaview}} +\doxysubsubsection{\texorpdfstring{OutputWriterParaview()}{OutputWriterParaview()}} +{\footnotesize\ttfamily Output\+Writer\+Paraview\+::\+Output\+Writer\+Paraview (\begin{DoxyParamCaption}\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$}]{discretization, }\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$}]{mask }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em discretization} & shared pointer to the discretization object that will contain all the data to be written to the file \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classOutputWriterParaview_a9e203b63d0e2f26ad53d18ee1821c6bb}\label{classOutputWriterParaview_a9e203b63d0e2f26ad53d18ee1821c6bb} +\index{OutputWriterParaview@{OutputWriterParaview}!writeFile@{writeFile}} +\index{writeFile@{writeFile}!OutputWriterParaview@{OutputWriterParaview}} +\doxysubsubsection{\texorpdfstring{writeFile()}{writeFile()}} +{\footnotesize\ttfamily void Output\+Writer\+Paraview\+::write\+File (\begin{DoxyParamCaption}\item[{double}]{current\+Time }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}} + + + +Write current velocities to file, filename is output\+\_\+$<$count$>$.\+vti. + + +\begin{DoxyParams}{Parameters} +{\em current\+Time} & current time in simulation \\ +\hline +\end{DoxyParams} + + +Implements \mbox{\hyperlink{classOutputWriter_ac625c204affdc05919388a3549c2e945}{Output\+Writer}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer\+\_\+paraview.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer\+\_\+paraview.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classOutputWriterText.eps b/documentation/latex/classOutputWriterText.eps new file mode 100644 index 00000000..3d9f5696 --- /dev/null +++ b/documentation/latex/classOutputWriterText.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 350.877197 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.425000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(OutputWriterText) cw +(OutputWriter) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (OutputWriterText) 0.000000 0.000000 box + (OutputWriter) 0.000000 1.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in diff --git a/documentation/latex/classOutputWriterText.pdf b/documentation/latex/classOutputWriterText.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c1590e04fc57066ea49a1215b3468def2b8f4aeb GIT binary patch literal 4610 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 literal 0 HcmV?d00001 diff --git a/documentation/latex/classOutputWriterText.tex b/documentation/latex/classOutputWriterText.tex new file mode 100644 index 00000000..7df94ff3 --- /dev/null +++ b/documentation/latex/classOutputWriterText.tex @@ -0,0 +1,85 @@ +\doxysection{Output\+Writer\+Text Class Reference} +\hypertarget{classOutputWriterText}{}\label{classOutputWriterText}\index{OutputWriterText@{OutputWriterText}} + + +Write \texorpdfstring{$\ast$}{*}.txt files that are useful for debugging. + + + + +{\ttfamily \#include $<$output\+\_\+writer\+\_\+text.\+h$>$} + +Inheritance diagram for Output\+Writer\+Text\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classOutputWriterText} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +void \mbox{\hyperlink{classOutputWriterText_a25a12ea2524fc34e9acb19ef1f4c7431}{write\+File}} (double current\+Time) +\begin{DoxyCompactList}\small\item\em Write current velocities to file. \end{DoxyCompactList}\item +void \mbox{\hyperlink{classOutputWriterText_a3480b58a23fd158f16d0ef9c1b67cbfd}{write\+Pressure\+File}} () +\begin{DoxyCompactList}\small\item\em Write only current values of pressure to file. \end{DoxyCompactList}\item +\Hypertarget{classOutputWriterText_a4f3180552b8102c27e087357b9cdd1f7}\label{classOutputWriterText_a4f3180552b8102c27e087357b9cdd1f7} +{\bfseries Output\+Writer} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization) +\begin{DoxyCompactList}\small\item\em Default constructor. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classOutputWriter}{Output\+Writer}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}{Output\+Writer}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Additional Inherited Members} +\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classOutputWriter}{Output\+Writer}}} +\begin{DoxyCompactItemize} +\item +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} +\begin{DoxyCompactList}\small\item\em shared pointer, discretization object containing data to be written to file \end{DoxyCompactList}\item +int {\bfseries file\+No\+\_\+} +\begin{DoxyCompactList}\small\item\em a counter that increments for every file written to disk \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Write \texorpdfstring{$\ast$}{*}.txt files that are useful for debugging. + +All values are written to the file as they are stored in the field variables, no interpolation takes place. + +\doxysubsection{Member Function Documentation} +\Hypertarget{classOutputWriterText_a25a12ea2524fc34e9acb19ef1f4c7431}\label{classOutputWriterText_a25a12ea2524fc34e9acb19ef1f4c7431} +\index{OutputWriterText@{OutputWriterText}!writeFile@{writeFile}} +\index{writeFile@{writeFile}!OutputWriterText@{OutputWriterText}} +\doxysubsubsection{\texorpdfstring{writeFile()}{writeFile()}} +{\footnotesize\ttfamily void Output\+Writer\+Text\+::write\+File (\begin{DoxyParamCaption}\item[{double}]{current\+Time }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}} + + + +Write current velocities to file. + +Filename is output\+\_\+$<$count$>$.\+vti + + +\begin{DoxyParams}{Parameters} +{\em current\+Time} & current time of simulation \\ +\hline +\end{DoxyParams} + + +Implements \mbox{\hyperlink{classOutputWriter_ac625c204affdc05919388a3549c2e945}{Output\+Writer}}. + +\Hypertarget{classOutputWriterText_a3480b58a23fd158f16d0ef9c1b67cbfd}\label{classOutputWriterText_a3480b58a23fd158f16d0ef9c1b67cbfd} +\index{OutputWriterText@{OutputWriterText}!writePressureFile@{writePressureFile}} +\index{writePressureFile@{writePressureFile}!OutputWriterText@{OutputWriterText}} +\doxysubsubsection{\texorpdfstring{writePressureFile()}{writePressureFile()}} +{\footnotesize\ttfamily void Output\+Writer\+Text\+::write\+Pressure\+File (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} + + + +Write only current values of pressure to file. + +Filename is pressure\+\_\+$<$count$>$.\+txt + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer\+\_\+text.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer\+\_\+text.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classPressureSolver.eps b/documentation/latex/classPressureSolver.eps new file mode 100644 index 00000000..d140d710 --- /dev/null +++ b/documentation/latex/classPressureSolver.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 185.185181 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.700000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PressureSolver) cw +(GaussSeidel) cw +(SOR) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PressureSolver) 0.500000 1.000000 box + (GaussSeidel) 0.000000 0.000000 box + (SOR) 1.000000 0.000000 box + +% ----- relations ----- + +solid +1 0.500000 0.250000 out +solid +0.000000 1.000000 1.000000 conn +solid +0 0.000000 0.750000 in +solid +0 1.000000 0.750000 in diff --git a/documentation/latex/classPressureSolver.pdf b/documentation/latex/classPressureSolver.pdf new file mode 100644 index 0000000000000000000000000000000000000000..93d429195579bdf935a200dfa551a2d888f11a1a GIT binary patch literal 5338 zcmb^#X;>52*0xwBDk?5mMHo>CC}AcWSxA7808#;wfFO$+l1T_;BbktZA_|I9MMa9c zA}Y9*B8nCTi-6)*6%e>4$QaDgz0q!W10_TzhVH4>>oE5}d(nW@J#ddx?zK)D`(6Ra!r4hiuK z^c7BqHChz>>%el70FhCskI|u6kQn2V5d?s`=RRr`rsHB-JrE}GR>q(bou|p+O=Us+$Z4s#SoPK!*@W9TP|3aA1E_CBtGNR{#lyfi4)Tgwh7o(Iw;5@ z(Z_9jhj`6*<3c}Vlqo&$xV0^D8@>FX@_GK!t^iN*x!Sb{7p8BoI(scgXVJtAo;1Jd z;V6B^5lT$Rsf~g*k3{7Z_4{Kjcjda4!q?YU%zypl`zK25 z+!YFe-`3Abyjz|N4=iB&6ldnt+%ZJVak#wWomWG+OQ2u*uhNuhIjbI9 zZwhOwYHnG^zxQE&Zh6WA28h+RdFERReF#IVM0=k{-i?5$+7! z1^Amvr4xEUw2yuYNz$M&?nO8NmB>Y2Y9kbh05ly01er;9A+w?h0Ix+=7(~ULNq~b< zom#IIqdMT`Agx*~M6pO1L>UB!phgUkR1BZ?AiYF76yFc*KielP!fRTHT#4#P!D^*QW!k3z)rqxo4W`yY zOk9Xb9TNuFL9W$d{8*6|Vvu2fQO}r6X2M}|2^Oo1gcuYGVCw$|AOt!c_nE6J1L_|2 z$M=m12t=dd7V7p@?-+q73|x_qZ{SHli$GK=6{0fnedE3bKj0~E6*!A>l?*7P;;D4< zzB$MQ7#`gG=r)j45z%%Y3weY1@G!CHmitGxngBS=4a%EDZ@tgp% zADK!fBQyfc(~0p&0~ioDBF%JEE{g?IhARQa*THdsn*jR(Z_C9zl}v#`2muyisB$($ zMgUoWT&Dv&GFcd+&;c^MM+(gqOmKIAfOUj@;hAs{91II#5iEgGSPm;-HLQhoupUly zGHnGG2Puiro4~^LBghqKVP5nW_wG) z4>MMIRYgh5U(J%tI&e2|TVv>k=rF<8-!HdIvrHOnzGlh@XsxH^bPMz8UNIxg2b&>Y zD=JRqdJi0ZEn?mbLupa$Pt8T;N23e3aW}AzUOjMC-eq|BPB-^u%EN`NZ@RM0Qq6hm zcDF8R#}3;{($Ynii;w^6mBGl4 zajGJoJ9{E?HGR-M%j+4-ikj^&gpHBPr04jIA6pMPb#9#6*-FeWxA$(^bfqrzmcZ#; z?t_PZyI*Wo%!l(^+$~_pJ^am|GvXvgpzm zygfy2j_IUQ@~q-D*9N4zPH&$3IEIlo8nld4?{4V!Qp0%`4_jYCEck@+s^*M)j?{#iXi;Bv)o>w@2%ae=N*~mGI ziM6_9sA9Ll&{&pcyU0C7UGb=T5uBbGd1(C$i$@mY+0SeMX_F?ft1o zhWkU3!!BFFjr}`q#{baxTl)ZY{>JJ8qP zULK9rF4l$6&yRL=Oexv#Wq#z~FFWJ>m4PLNUWd>ru~{pJHcUEvDem~tI)hQ{#EpDfS1nmQ zP3}nD+qik5w+gi}`-a$+@lEI8;^3f%B_*Bjm~LFUuPXU6trz#(Nbu}HAZ#ARXxKu<sR6L=2Lf8zJE1LFmz=Hzcf&idV_&{C7Zvzt<&K-rD5*tyt#+g40+YH;%ke=ujxzWruKv%>8cIeE18FS!CvS>5}Ee^APp+Jg7&`%6y{ zqW3CCWDQ@N8tsX$xW8>q)TGS^j)pe2o5Ak810u1|X8jJc=-7gvHZ=xbwf4-bi>@6j zv|4CZ?3#t$>NLu3E15sMe(=WHwxwa>C3#DAXsar_yre!WO(y*HUvm_c!j+ABDJ!gM zWYn&Ragf#6pn+$OmK_hBQZkz1*Y%u?O&wwGR-9F%zCHc4CvT0!@zB#~i=sVCHy=>F zy_~+k)UESYdUE9BHxs5#EQFb%kNl|ntEpd>Zc0wrm@@Ur(a1sdkyqt+&Ykc4#j+zi z%{gV`$UkE*PghRe>rH>Ghi(=WZYG^?kNwNCI1x-{^tD6xTFwPSUd z^59n2ML`Ac_l_N$2YtAkJnQEumz<;1jxT6#UXXmhJ=n!Ita0wLm8bblKQ8W?nfB6I|o@HFPn0B-og*N58w88ezbdT%C>heImJrW6`HVqY(S3O z^5Er1<8{GJ<`-2zssig@vwgRX`Eq6sds)&f&n*`F8@u8bSKd75K+6vyK3MR+V}kq2 zyw+XGm9`^KRSw8C99xH%nxB@#rb@7X4bxjAe*AKW2l)4WwkcF<-)EcSVbqAk@hAqx zpfb6NOMF&dNrdDQE-{QAfCOmxXsmpCvKAF42Zo4~e=8j{r1 z2EEh6~Om&8&T2OTv)Y^E6?BYrUBDE4JI~bJY-2%akON_-Z4I73H27`-%>Y~=l zU^0uvf)NT#p^yLtNtdL;L`ITIHyNyFQbZo!$EMP`m~?UxtCg@k945OUaPLCB6(DG3 zA$(y`j9QOz?d*D_fY$V{#Q+45Lj~IdBQ|IyBziHbAP;6itS+L$CmRo#o2D0>hb7&l|Teg4Cpi!=cN|9kIB zB_2#T9b2Fl>y@CO_7iZ4dc9o2rn)kv43sP(Nn>IV5}7Pzkr42ZL{cWok|0!;NJROk zPLPQE^w8+F3RAdA#4xHr@g;S@4`iT-M9h||wMr2N0$!s51-K8p2%(ZfpDmP$Y-u&G(@S zyj&S9FA9^!WC3|zUWkB3;k#12X*|CB-%~{6w=X(Oq{U2zr?F_@D%0M3rVruYVyn@q literal 0 HcmV?d00001 diff --git a/documentation/latex/classPressureSolver.tex b/documentation/latex/classPressureSolver.tex new file mode 100644 index 00000000..a49141fc --- /dev/null +++ b/documentation/latex/classPressureSolver.tex @@ -0,0 +1,130 @@ +\doxysection{Pressure\+Solver Class Reference} +\hypertarget{classPressureSolver}{}\label{classPressureSolver}\index{PressureSolver@{PressureSolver}} + + +Solves the Poisson problem for the pressure. + + + + +{\ttfamily \#include $<$pressure\+\_\+solver.\+h$>$} + +Inheritance diagram for Pressure\+Solver\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classPressureSolver} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058}{Pressure\+Solver}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, double epsilon, int maximum\+Number\+Of\+Iterations, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ boundary) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +virtual void \mbox{\hyperlink{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0}{solve}} ()=0 +\begin{DoxyCompactList}\small\item\em virtual function that starts solver. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classPressureSolver_a3c97c6f37cf2bdb3985f90afa6923f93}\label{classPressureSolver_a3c97c6f37cf2bdb3985f90afa6923f93} +double {\bfseries dx2} +\item +\Hypertarget{classPressureSolver_a25b7ff50bdaea53d1b5c7a5cf735c5b5}\label{classPressureSolver_a25b7ff50bdaea53d1b5c7a5cf735c5b5} +double {\bfseries dy2} +\begin{DoxyCompactList}\small\item\em squared mesh widths \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Protected Member Functions} +\begin{DoxyCompactItemize} +\item +void \mbox{\hyperlink{classPressureSolver_a458c383fcacaf54c1a333a271049ca93}{set\+Boundary\+Values}} () +\begin{DoxyCompactList}\small\item\em Set the \doxylink{classBoundary}{Boundary} Values. \end{DoxyCompactList}\item +\Hypertarget{classPressureSolver_afc51f4315c483988aeec327a16c5bb90}\label{classPressureSolver_afc51f4315c483988aeec327a16c5bb90} +double {\bfseries calculate\+Residuum} () +\begin{DoxyCompactList}\small\item\em calculate residuum of current time step \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classPressureSolver_af3ac2e53c6f49b9a362415a89595a7f0}\label{classPressureSolver_af3ac2e53c6f49b9a362415a89595a7f0} +int {\bfseries i\+\_\+beg} +\begin{DoxyCompactList}\small\item\em begin of loop for rhs in x direction \end{DoxyCompactList}\item +\Hypertarget{classPressureSolver_a41b263980e55591d1ffdc4837c252a61}\label{classPressureSolver_a41b263980e55591d1ffdc4837c252a61} +int {\bfseries i\+\_\+end} +\begin{DoxyCompactList}\small\item\em end of loop for rhs in x direction \end{DoxyCompactList}\item +\Hypertarget{classPressureSolver_aa309af30e5e63e09b77900091e562235}\label{classPressureSolver_aa309af30e5e63e09b77900091e562235} +int {\bfseries j\+\_\+beg} +\begin{DoxyCompactList}\small\item\em begin of loop for rhs in y direction \end{DoxyCompactList}\item +\Hypertarget{classPressureSolver_ac2402794034dd74073700998ee2860bf}\label{classPressureSolver_ac2402794034dd74073700998ee2860bf} +int {\bfseries j\+\_\+end} +\begin{DoxyCompactList}\small\item\em end of loop for rhs in y direction \end{DoxyCompactList}\item +\Hypertarget{classPressureSolver_af579ecebaaa8b11914293ef18af5fdc6}\label{classPressureSolver_af579ecebaaa8b11914293ef18af5fdc6} +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} +\begin{DoxyCompactList}\small\item\em object holding the needed field variables for rhs and p \end{DoxyCompactList}\item +\Hypertarget{classPressureSolver_a0b17b46580d259e4bb3a05486bc06a60}\label{classPressureSolver_a0b17b46580d259e4bb3a05486bc06a60} +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ {\bfseries boundary\+\_\+} +\begin{DoxyCompactList}\small\item\em object managing boundary for obstacle and surface tension \end{DoxyCompactList}\item +\Hypertarget{classPressureSolver_a22b723f3b3ba54e47f36cfc2b9576749}\label{classPressureSolver_a22b723f3b3ba54e47f36cfc2b9576749} +double {\bfseries epsilon\+\_\+} +\begin{DoxyCompactList}\small\item\em tolerance for the solver \end{DoxyCompactList}\item +\Hypertarget{classPressureSolver_af3b02d29bf1b21ad8b7e6edf8c2f4e87}\label{classPressureSolver_af3b02d29bf1b21ad8b7e6edf8c2f4e87} +int {\bfseries maximum\+Number\+Of\+Iterations\+\_\+} +\begin{DoxyCompactList}\small\item\em maximum number of iterations \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Solves the Poisson problem for the pressure. + +Interface for the pressure solver. It computes the pressure field variable such that the continuity equation is fulfilled. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058}\label{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058} +\index{PressureSolver@{PressureSolver}!PressureSolver@{PressureSolver}} +\index{PressureSolver@{PressureSolver}!PressureSolver@{PressureSolver}} +\doxysubsubsection{\texorpdfstring{PressureSolver()}{PressureSolver()}} +{\footnotesize\ttfamily Pressure\+Solver\+::\+Pressure\+Solver (\begin{DoxyParamCaption}\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$}]{discretization, }\item[{double}]{epsilon, }\item[{int}]{maximum\+Number\+Of\+Iterations, }\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$}]{boundary }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em discretization} & instance of \doxylink{classDiscretization}{Discretization} holding the needed field variables for rhs and p \\ +\hline +{\em epsilon} & tolerance for the solver \\ +\hline +{\em maximum\+Number\+Of\+Iterations} & maximum of iteration \\ +\hline +{\em boundary} & object managing boundary for obstacle and surface tension \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classPressureSolver_a458c383fcacaf54c1a333a271049ca93}\label{classPressureSolver_a458c383fcacaf54c1a333a271049ca93} +\index{PressureSolver@{PressureSolver}!setBoundaryValues@{setBoundaryValues}} +\index{setBoundaryValues@{setBoundaryValues}!PressureSolver@{PressureSolver}} +\doxysubsubsection{\texorpdfstring{setBoundaryValues()}{setBoundaryValues()}} +{\footnotesize\ttfamily void Pressure\+Solver\+::set\+Boundary\+Values (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [protected]}} + + + +Set the \doxylink{classBoundary}{Boundary} Values. + +Account for homogenous Neuman BC Has to be called every iteration \Hypertarget{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0}\label{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0} +\index{PressureSolver@{PressureSolver}!solve@{solve}} +\index{solve@{solve}!PressureSolver@{PressureSolver}} +\doxysubsubsection{\texorpdfstring{solve()}{solve()}} +{\footnotesize\ttfamily virtual void Pressure\+Solver\+::solve (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}} + + + +virtual function that starts solver. + + + +Implemented in \mbox{\hyperlink{classGaussSeidel_a6f0eb0c6938a64f8ded186f88170a04b}{Gauss\+Seidel}}, and \mbox{\hyperlink{classSOR_a860992d85d8aacf114a3a02b5831f728}{SOR}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/pressure\+\_\+solver.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/pressure\+\_\+solver.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classSOR.eps b/documentation/latex/classSOR.eps new file mode 100644 index 00000000..3f4e542f --- /dev/null +++ b/documentation/latex/classSOR.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 370.370361 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.350000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(SOR) cw +(PressureSolver) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (SOR) 0.000000 0.000000 box + (PressureSolver) 0.000000 1.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in diff --git a/documentation/latex/classSOR.pdf b/documentation/latex/classSOR.pdf new file mode 100644 index 0000000000000000000000000000000000000000..368cf44a76641b7d5f8f66fa9725fb24291a87e8 GIT binary patch literal 4725 zcmb^#cU%)^+d%$!-+LhpZNIPmqk;VHeV_N)( zMw5}wh#;mBCMjSBaVTZzc$FelYSkOkY(|;@kZ3z?wbNln6Cn)(lt8W~G&WWhHCp2h zTWtjRr+_$pB%ZFZCr|{f*3nWFK>( zS?PH>Uq(iCN8iqVCdgvVl`5uRm2K>9 z@|ZqL^G>nn3%`mV)uS=(hGbju$WcR*d@p{m^+Ata$h$}87bLG9{<2S$KQ_D9!nA67 zZq}L;PnxhL4fTIWD?Z6%9jgtVM^4|pLzA4?9TgTePv0w;oqEJ$?2PiImR-GqCr+4h ze@DviIk~}?zPh|;K;|b6i&OHSc3b$By2!%D!6ui;2SZ^T2$bSNGH$9xbrt`G^}3Ma9^xs9;U z5EsB>Sa1wMk#?Jopg=IxHd3b{=y(|90tCkr=`=uRA_|Ee$RHT70&D>}1u;R4VF8d+ z4TfK9Pys2>19B)rLGW0ko`T|8jG8g5Nf6**2OQB(q-Z;-lTv}xxQR?`W8qXalAv)t zIDt@xptEd7J!eA22w6hrv_mmw>pTp>DT1*F9L?GBAw@}9RJ*Z2X$pFUv zXomwBj!p+S5`^(UhouhlqHr_uznl^R(g6DB6$)4|BZoNy)GSy9qH5I1Er})qLRhedCd}g@6aiF`Mv4L!IXnqr zd~m3Ba^VTUhH*PcOkX$}R>Lu{1}0z=Ou{ypg6;4$KZgm-MaBi(fU%u|@7OzyZ@peR z-!4Fh&Ms55T}LPn5z1uk7tg9?SrMAFcTPOqP;+DD0yC?DkfMujP+m9JxLniXU-#VCwPBS>Z+1 zX{YR`>vou$v&66RMn7&@{p6Iq-^QME*7^E>z>OQ#bN-4uBUO_xUG*bZJWkCQpk4M3 zC@QMVsoK%^a6*>>JFlN;-1yE)HewZf!>KkYfTdNf8Y_r!iXWSZf9?B2q>^>bc5 zeL1fAljrVpepo)>Jp!fXrC8=BGYs1-Z zjrq~zT7qc{+I`*5&DAbT1XY>&Vg2*HuKB`^m$AWx&3Vl=8GG(-b8Gf0?scfT_U6bq z&y8Epj5p45-PCJ~B%`1>%60yk@LOGHOKbLPZ$w-=b87s1CmSS7Ig5H!4xErfjjdh9 z(JH8|M~p`oqg{8t%$qlL$^|;@p6Ny(*_yo{`V1D;-8_3T(wJg&t9?4C{^9E4v$>w> zi<>J>HJ zy!ctxJh$9h&WM>Ra(GHYkA1!Sw2Zj(@=??I>({R>=sjeabCdsMXbX7 zSea*ee#VBc50q_j4GrEJSAXGZ($2f_KdE$^cgz|ITaRBr^do+tBm89RNOiPj-l)tA z=hvd+2l?lHWV|qlF3j}ao z6ZUVIQKtwF?)RV6nID%_F3Z_8Ve-*cQ$HI9o%?3_)R=oG4^Ar%>T;&O%b`)lYVBn8 zL?|~=Kf<>_9vCiKeq$K-o5mr*uG$ApsV_WIXI7oxdH!(5m2p$&J}9sz4{RYkzY1QF znpr+~r}k{@i5+JHAY`|_VnzjkMLlh>di)un;e6L%NBU-4?n`(bf$ zxBR}ldgYQ}@vrGSCSc+0(#+_SzZVPM8aj7@rnKom)%Kg)((;lIg#MZk`Xs1l&iBt! z@_IHF-pZ;k`}yLtRk4riUA0k_drPkW`nfha`@AlBNOpaqM|Wkm>R#xzKVH1OXwA!- z?duhILGAX4mCXk{!)4E=Hfy@E?}vQxpy15rvV{jOuH93#XX(^F+H>ay?JQn?ctO=D zRoG&zhx?J{cU`_bH6{GOvU7eG$+$Ro*8C;PhG8y4SI@I}Z5vWwz@1o`aDRT$pqad8kwt_(^K9?~M6Z*O*TQm9r(N z@Yg=3+UV0?JYA$Fj(L5t-W~&+WCs4ZCWT7PKQnrIc z0@e%|Wf!(X#r{60MeESqhhfbMlcw|H~@n~WmsrDonxWAfjoyIMr}Kpg$i)! z6rdx`uu%)60SMeCsI46UQwGEc#uG?8E%owpasgArU$X%RfDad#2UZf$KkDr|!X{;p zR!2ailSqng?WZ7d0G}U#uwkcNe#a^B-D{TO%X?zwKr-lS~YrL`mxGX3$-!lv1|cZq!S-0+B&Tpn8rWApzl_s6os@ zz=xwl1$-T<7onJ5^iPAJ*R|_mwcAXNbkpl#!bC74DG&z~D5BR%45ZDB(;(rkR?yu! zCRG?@16vjd4rwE8B4mzamYe9-g~`aImBfTw5~b{Pj-D{!b`#B(DNHy;F`a0u^Grrr z>%u_@cQ6Ah9TPs%*2+&qq_#13QnZsgju_H*g1?B10|ZJ9ga~dgWEl(kmp=a2}0Ay8X6#^!@8{^aG7G<3~{ROd<42*L(vpwRvX zBbJG?Z+isWSd%tiXNdp^_&Fd60Q_V!=g63DBMe~5K`|DSrL7-Gz~^)MkO69g37LtC z`9PL77!MVI3Gj6oA`pW??+qAV0KD-A48y=Y^ahO210&`eFcBY&60gI+wDV^fBJ5AP zpjK(%CINf^!7(HW=3-`kfnb%zKtfC?!HBL>Lh*rI zB_$} + +Inheritance diagram for SOR\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classSOR} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classSOR_a357cfea8935f4b2dfee06f2d8e1461a8}{SOR}} (const std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ \&data, double epsilon, int maximum\+Number\+Of\+Iterations, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ boundary, double omega) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +void \mbox{\hyperlink{classSOR_a860992d85d8aacf114a3a02b5831f728}{solve}} () override +\begin{DoxyCompactList}\small\item\em override function that starts solver. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058}{Pressure\+Solver}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, double epsilon, int maximum\+Number\+Of\+Iterations, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ boundary) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Additional Inherited Members} +\doxysubsection*{Public Attributes inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} +\begin{DoxyCompactItemize} +\item +double {\bfseries dx2} +\item +double {\bfseries dy2} +\begin{DoxyCompactList}\small\item\em squared mesh widths \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Protected Member Functions inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} +\begin{DoxyCompactItemize} +\item +void \mbox{\hyperlink{classPressureSolver_a458c383fcacaf54c1a333a271049ca93}{set\+Boundary\+Values}} () +\begin{DoxyCompactList}\small\item\em Set the \doxylink{classBoundary}{Boundary} Values. \end{DoxyCompactList}\item +double {\bfseries calculate\+Residuum} () +\begin{DoxyCompactList}\small\item\em calculate residuum of current time step \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} +\begin{DoxyCompactItemize} +\item +int {\bfseries i\+\_\+beg} +\begin{DoxyCompactList}\small\item\em begin of loop for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries i\+\_\+end} +\begin{DoxyCompactList}\small\item\em end of loop for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries j\+\_\+beg} +\begin{DoxyCompactList}\small\item\em begin of loop for rhs in y direction \end{DoxyCompactList}\item +int {\bfseries j\+\_\+end} +\begin{DoxyCompactList}\small\item\em end of loop for rhs in y direction \end{DoxyCompactList}\item +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} +\begin{DoxyCompactList}\small\item\em object holding the needed field variables for rhs and p \end{DoxyCompactList}\item +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ {\bfseries boundary\+\_\+} +\begin{DoxyCompactList}\small\item\em object managing boundary for obstacle and surface tension \end{DoxyCompactList}\item +double {\bfseries epsilon\+\_\+} +\begin{DoxyCompactList}\small\item\em tolerance for the solver \end{DoxyCompactList}\item +int {\bfseries maximum\+Number\+Of\+Iterations\+\_\+} +\begin{DoxyCompactList}\small\item\em maximum number of iterations \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Successive over-\/relaxation solver. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classSOR_a357cfea8935f4b2dfee06f2d8e1461a8}\label{classSOR_a357cfea8935f4b2dfee06f2d8e1461a8} +\index{SOR@{SOR}!SOR@{SOR}} +\index{SOR@{SOR}!SOR@{SOR}} +\doxysubsubsection{\texorpdfstring{SOR()}{SOR()}} +{\footnotesize\ttfamily SOR\+::\+SOR (\begin{DoxyParamCaption}\item[{const std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ \&}]{data, }\item[{double}]{epsilon, }\item[{int}]{maximum\+Number\+Of\+Iterations, }\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$}]{boundary, }\item[{double}]{omega }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em data} & instance of \doxylink{classDiscretization}{Discretization} holding the needed field variables for rhs and p \\ +\hline +{\em epsilon} & tolerance for the solver \\ +\hline +{\em maximum\+Number\+Of\+Iterations} & maximum of iteration \\ +\hline +{\em omega} & relaxation factor \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classSOR_a860992d85d8aacf114a3a02b5831f728}\label{classSOR_a860992d85d8aacf114a3a02b5831f728} +\index{SOR@{SOR}!solve@{solve}} +\index{solve@{solve}!SOR@{SOR}} +\doxysubsubsection{\texorpdfstring{solve()}{solve()}} +{\footnotesize\ttfamily void SOR\+::solve (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +override function that starts solver. + + + +Implements \mbox{\hyperlink{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0}{Pressure\+Solver}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/sor.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/sor.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classStaggeredGrid.eps b/documentation/latex/classStaggeredGrid.eps new file mode 100644 index 00000000..67d46456 --- /dev/null +++ b/documentation/latex/classStaggeredGrid.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 236.220474 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.116667 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(StaggeredGrid) cw +(Discretization) cw +(CentralDifferences) cw +(DonorCell) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (StaggeredGrid) 0.500000 2.000000 box + (Discretization) 0.500000 1.000000 box + (CentralDifferences) 0.000000 0.000000 box + (DonorCell) 1.000000 0.000000 box + +% ----- relations ----- + +solid +1 0.500000 1.250000 out +solid +0 0.500000 1.750000 in +solid +1 0.500000 0.250000 out +solid +0.000000 1.000000 1.000000 conn +solid +0 0.000000 0.750000 in +solid +0 1.000000 0.750000 in diff --git a/documentation/latex/classStaggeredGrid.pdf b/documentation/latex/classStaggeredGrid.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d6c223284ab3b32012da18da4907a61286041944 GIT binary patch literal 5761 zcmb_Adt6N0_fg0o>7j?$Q8L1G<~_}5CNN*I98cf+{p>78I+82y-BUOyuS3BLt%$IK(SV*+3XX(DQu41GqkHtxTS%Q=kZd1RGGT0rgcV5w<7b1pA77#Nq&fpU4^3 z>Jad&2iwW`k|dEKMvtH&Qj|?15&@`d?W<9vdN!&v0AVs8RSY8YQY!xj^fI6tp$3(p zNQfjB(L2KejT#W+Xb=(7#LUKdc)&r3Iu?zC=l~*wfi5VbgJ54JVBsNBjSS&%aC%gS zNL09_%q-DmK`GI)&aAx>Kj-~| zX{ur$QA!EDp?v-q*J#~go7}T8@&-nH$;w?prpc1(@soeG@115S9C{Zqr<#QI_Kz~l z7P(Z|5`_ug@wdb5o0wy3>Snlg+Fzewes>D5&uz57T|>=DS3yH%qj=;y?)eiTTS6b1 z{<6c0xWs$0`E$I3+oHASb}SEY;{^`A(kUFBwAX!uX?>AK#J2k=I+8cEL0(#1JkxGw z>!mtjYgXUhrT50G2Bi|Re6}?z4^FG+U7JiiP=QEprP|jl$vL4B)n}A`x$a>XMr+MADyR8j(xB>LR)fZr01@yy*G7CTU%a!)8g*U2QRN*@#ieA>#thW z9zOrgEN|+ph$}a3nA;1jw=H8foStmw%WAl1Q>iLE>r!#&_}NzxPh|8r5eM7OzcOQP z*WH^K^U-wGT~^Wj;4`ZpXK!?SIs4kc{85}6>O4Xj+_nX`5K+sz{Rd{4&oNJ9BbDNg z>jqK3g@bsm7J;!~f%%9`A@SBEK~Y42rh&L4Q|NAF@(din>ku^xQLvc7!9ql@G3ca- z9z;`!P9qf|XcP>B8G^+~5(>z%kc5~Stfhy$Q*H86QyQ3+Uq9*|KH zJp>0TWO^tHhp8#V&47Re1CU7ij+OM4wVRVGK_yB}Y>$X;Rrv@ikpT=u!Wh2a8&j|Q zMhF==28R8n7`E(2dQ0>Ob{^O_B3K~sogh}I5IsStQAyOsbMg?qRHx9Q8Xe@02{Ec; z!~i=ebb6El&mX6pI(kS)^~~!uIGkmoc0$dwsKu(HH`W3i-cG=naAn#2kT4a)%g1CPa6q%)l}d z$h{OY4))SZvETzx5K0oQKca|@14{-S2VJXU*kP+QtsC2NvTm*u69L$AzupcafC9o8h!3ZpeV_^lXgw?PH*1>uh zg_B*4$H8(q1;_>m|1NBd>uy7IW!CQ#E70hB^KpAJF`2|9b2#5}t~g#Sn(BC}=GS?_ zBc_aq6Z4u8=FPl%Q-c`Iq@8}VdL`tvvV=O>(kimN){r?bC$3D` zC$zdFb6V(xyAH8Mto=t5-cG;$SNZhJ$oP(VU$XS4kG^}Kb?SX_z&WXv*KfJcMh4`$ z>m|QWqzPDaI!&MX=_vR)N6ah(%bm+>%$XO~EzIuy{6!V9)zni{{UJ*HX^1drw1+=g zJ8y|fofLPz%9KOGbIfw*WSL~`sobtA zI?BENFtcz&SU%I65Z%Ok}~Im33Ap-Fe%sBhA{E_Qe-h2ORV83#;sN@qF3JH$^V3q{XqPH!m(( z`+ooSAsKu6m7E`Sgh{Tt^Crb(fT$|!_DDh8>+nN`z21&UvP(%-KN(q18=2Eozo2n! zmbv+b{%+prz)R`4@iTYaMoOh2(i@xK*YKw8d^G+z87a?RJ?VTe%i!MbLqF7Qd2V9$ zMf>_MTi?h(IB|iEQ=ShSSlTFkFt0ZI=DvP&4F@1L|RK9D^6m zxPQ~FrD@nN-nlu+;~RHcF7zy3GqBeFb;qQXLE8iUO5IeaS6>o%4Cs9yU7x%;_7Wj- zKyCWuP*dwi|1k3--G_+fwx=yTQ`hGWeIlpG4K17wQLObBh-hGY;4# zU)X=7F#D4{Xjb;hmRHpqg@z4t>>*}T2E@$>XyPfMyUvk2N%{~(?czv|*S3r>^id??$GiJ>@)o(U7pfMW`_JaWpS%$?J%)@hV-EHk5y)gmTQyEG_-z zyMD2^5C(%$&DdzWEhG5Qg_f8B9=(PaTzI`;88!3Ifco@F8_HwKT9o-_V_Spzy)T>I z^ipAeyrNzFnpPu!-=4K}&@l_f%yYehdBmfW4_-&&Zt83;$6OMmUf5XWGPUFW^Ti{H zq{nQ*9q;TE=#hL^*-q18))ek&bMpmDo)>R=?eY2mb@_xl^}39r@LT5dgK5>YLF!K) z+RoFj&L`2yzQ-I2`bM;AhgfAc6{ugzhVu>AZa?ln{Z7TzIF}Q)7lU&rirlIjpW1zh zS?ay|zQ>Lcos;bzUphCfLRVbD5#lVlk54AHE^&O#O?Dd9_qc=L#$N-GHT~TmAfbXe zoQY4CdCJ-4x|+E&{r0(Ziq z(VEl+TOSBE+3sMPdV6%PG=JLgVqkJu!bvZj*Q|DDYM;4nsh_WwwT907v%jy}dEbDl ztTDwV`8FdWtS3CM;7XJksQ-&=dIvv~lT#XMiAA#G!byYayfgmxyKMq@*4<2dG=AZh zd6$QL{`^_OYa=Jw5G*78f)i(?Pn8@wpmS)iq&o!jBiJML8)%)joF@~>b zjGVgEr+n|SP4bPUvm+kXK0bsFz2y)nv3qr_n0YtrokdcwV>VR943lT4wvA?GF}8O0 zF{`|%w@N(7T$LWkjq2E1(e&V1Bqe#YV?sh^{G{De^5u=c9jJO^X}->7#Qh@|Pe!)M!;(hDZZ z?@TvK$#z=vSJ}>@0~5Ctg}zp*luE^=+3Q=JQuj5juhAd(6E@F(?{MRb`_ItV`(0}wzC1so5|SfCV>8Kj7gjrR))g8bq%dbF!FftYSIni~-h zcc1GYwga~O`F6ko-D-OP8Wtba2=ci+&^X|biDW8)NG1@eVlt6MX0nKk2}BZ$Nc4bz zpajkWtX$Av0R4u4!TKHLcdQzn7`Twb(Z%^%1~h;|&Idj76cl%NYnsMv%wE5D6rboJk;pk3gZ25h{g$} + +Inheritance diagram for Staggered\+Grid\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classStaggeredGrid} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}{Staggered\+Grid}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}\label{classStaggeredGrid_a330856d4efe952771daf0753ef84068e} +const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width} () const +\begin{DoxyCompactList}\small\item\em Get the length of a single cell in x and y directions. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}\label{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf} +const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells} () const +\begin{DoxyCompactList}\small\item\em Get number of cells in x and y directions. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a87cee12621c641ab143a8b1a61b2ef7e}\label{classStaggeredGrid_a87cee12621c641ab143a8b1a61b2ef7e} +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries u} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable u. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a26e478abba632554652c9e05a279d1ca}\label{classStaggeredGrid_a26e478abba632554652c9e05a279d1ca} +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries v} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable v. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_aafe6e0bb3509f6aad272b94f74e7ffec}\label{classStaggeredGrid_aafe6e0bb3509f6aad272b94f74e7ffec} +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries p} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable p. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a3f36422a02b9b18d1577d61e406f08cf}\label{classStaggeredGrid_a3f36422a02b9b18d1577d61e406f08cf} +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries rhs} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable rhs. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a0324ce4d1fe2343d8aa9514e460cc556}\label{classStaggeredGrid_a0324ce4d1fe2343d8aa9514e460cc556} +double {\bfseries u} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j), declared constant. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a0ed62d6752b6b2b3ead5f654b515cd12}\label{classStaggeredGrid_a0ed62d6752b6b2b3ead5f654b515cd12} +double \& {\bfseries u} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j) \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_ac052d8803ff950aee04b86ac026c516b}\label{classStaggeredGrid_ac052d8803ff950aee04b86ac026c516b} +double {\bfseries v} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j), declared constant. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a7746f703f32c2f20a4c77246eebac697}\label{classStaggeredGrid_a7746f703f32c2f20a4c77246eebac697} +double \& {\bfseries v} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j) \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_aa6a5d99d9b4fbd9bd9cfa6ec071918f9}\label{classStaggeredGrid_aa6a5d99d9b4fbd9bd9cfa6ec071918f9} +double {\bfseries p} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j), declared constant. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_aa09a4ca67141589bae153797fbc4f3c5}\label{classStaggeredGrid_aa09a4ca67141589bae153797fbc4f3c5} +double \& {\bfseries p} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j) \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_adb05c59512dc8993367e4beddba05785}\label{classStaggeredGrid_adb05c59512dc8993367e4beddba05785} +double \& {\bfseries f} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of f in element (i,j) \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_aaf849bec40f7fa7c68823038f0877341}\label{classStaggeredGrid_aaf849bec40f7fa7c68823038f0877341} +double \& {\bfseries g} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of g in element (i,j) \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a761ea51f1e8fd1290b3adfe09942b0d3}\label{classStaggeredGrid_a761ea51f1e8fd1290b3adfe09942b0d3} +double \& {\bfseries rhs} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of rhs in element (i,j) \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_aec8490affea703cdd73b1febaed68968}\label{classStaggeredGrid_aec8490affea703cdd73b1febaed68968} +double {\bfseries dx} () const +\begin{DoxyCompactList}\small\item\em Get the mesh width in x-\/direction. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_abde2da10e0c130fb0f206de64c9b4956}\label{classStaggeredGrid_abde2da10e0c130fb0f206de64c9b4956} +double {\bfseries dy} () const +\begin{DoxyCompactList}\small\item\em Get the mesh width in y-\/direction. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a31e2d3a0b6e03685380810a7c2f323e1}\label{classStaggeredGrid_a31e2d3a0b6e03685380810a7c2f323e1} +int {\bfseries u\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for u in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a641e473d72e1d02ba3de1c16e9d0d332}\label{classStaggeredGrid_a641e473d72e1d02ba3de1c16e9d0d332} +int {\bfseries u\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for u in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a9b0e97704e1871441a8e713ecaa2cff5}\label{classStaggeredGrid_a9b0e97704e1871441a8e713ecaa2cff5} +int {\bfseries u\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for u in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a3393aa91b17054d2d700de308ae25632}\label{classStaggeredGrid_a3393aa91b17054d2d700de308ae25632} +int {\bfseries u\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for u in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_ace7bf8cb1d279131739d5d12de302d09}\label{classStaggeredGrid_ace7bf8cb1d279131739d5d12de302d09} +int {\bfseries v\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for v in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_aa5a44aa088b5a7923fa952af1ecb5778}\label{classStaggeredGrid_aa5a44aa088b5a7923fa952af1ecb5778} +int {\bfseries v\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for v in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a7f8468d672411c0e3a5eeb67788fc826}\label{classStaggeredGrid_a7f8468d672411c0e3a5eeb67788fc826} +int {\bfseries v\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for v in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_ab67e8d9d8d76d34fb02d4d644f0b3795}\label{classStaggeredGrid_ab67e8d9d8d76d34fb02d4d644f0b3795} +int {\bfseries v\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for v in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a9922c955707f2a31a4a27d1d696f002e}\label{classStaggeredGrid_a9922c955707f2a31a4a27d1d696f002e} +int {\bfseries p\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for p in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a34f16fdf87971fe84ffc3c84722bb2c7}\label{classStaggeredGrid_a34f16fdf87971fe84ffc3c84722bb2c7} +int {\bfseries p\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for p in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_ae4c9ba16c5635dc1ffaa264fbcc3e034}\label{classStaggeredGrid_ae4c9ba16c5635dc1ffaa264fbcc3e034} +int {\bfseries p\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for p in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_ad9928ee522eedb7d7fd48ca0b92f2795}\label{classStaggeredGrid_ad9928ee522eedb7d7fd48ca0b92f2795} +int {\bfseries p\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for p in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a5cc368f9ede58a3cb689705df998f750}\label{classStaggeredGrid_a5cc368f9ede58a3cb689705df998f750} +int {\bfseries f\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for f in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a8162b849231354ba73aacb085b5cd665}\label{classStaggeredGrid_a8162b849231354ba73aacb085b5cd665} +int {\bfseries f\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for f in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_ab92aca90331200d0cc7bc0c0a857b4ef}\label{classStaggeredGrid_ab92aca90331200d0cc7bc0c0a857b4ef} +int {\bfseries f\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for f in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a7ac43ac86231987bc0bf6565589d52e1}\label{classStaggeredGrid_a7ac43ac86231987bc0bf6565589d52e1} +int {\bfseries f\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for f in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a061fb6d6948cdc3054171dd60842a8c3}\label{classStaggeredGrid_a061fb6d6948cdc3054171dd60842a8c3} +int {\bfseries g\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for g in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_aebc76693e5dd61db521d6763236bf664}\label{classStaggeredGrid_aebc76693e5dd61db521d6763236bf664} +int {\bfseries g\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for g in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a18ca3a121787b19c18886b0945aca2e3}\label{classStaggeredGrid_a18ca3a121787b19c18886b0945aca2e3} +int {\bfseries g\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for g in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a7a29456e1bce9efffa27de0b41957b50}\label{classStaggeredGrid_a7a29456e1bce9efffa27de0b41957b50} +int {\bfseries g\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for g in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_ad5c16b00d9dbf0f115e1ded81203edce}\label{classStaggeredGrid_ad5c16b00d9dbf0f115e1ded81203edce} +int {\bfseries rhs\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for rhs in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_ae11e8842fdd508b914dc8f24b09b36a9}\label{classStaggeredGrid_ae11e8842fdd508b914dc8f24b09b36a9} +int {\bfseries rhs\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a28c36939e3d3cc8df76e7aa91f0e0804}\label{classStaggeredGrid_a28c36939e3d3cc8df76e7aa91f0e0804} +int {\bfseries rhs\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for rhs in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a953ec890a986473bffe87ea26dfcd782}\label{classStaggeredGrid_a953ec890a986473bffe87ea26dfcd782} +int {\bfseries rhs\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in y direction \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classStaggeredGrid_acacffb5739539d9015c986080bb5ed44}\label{classStaggeredGrid_acacffb5739539d9015c986080bb5ed44} +const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells\+\_\+} +\begin{DoxyCompactList}\small\item\em array containing number of cells in x and y directions \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a9603c3334440aab082dda48947e5ce6e}\label{classStaggeredGrid_a9603c3334440aab082dda48947e5ce6e} +const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width\+\_\+} +\begin{DoxyCompactList}\small\item\em array containing the sizes of cell edges in x and y directions \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_adcef36b4ce8cc6843a2b6f603b62c763}\label{classStaggeredGrid_adcef36b4ce8cc6843a2b6f603b62c763} +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries u\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable u \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a20ec43568fe937b194561e21a0b84ad9}\label{classStaggeredGrid_a20ec43568fe937b194561e21a0b84ad9} +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries v\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable v \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a2ea3c93dd401ac06461ade9a74e76459}\label{classStaggeredGrid_a2ea3c93dd401ac06461ade9a74e76459} +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries p\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable p \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a94933ac0c6e0d2a794f46c7a97d72f75}\label{classStaggeredGrid_a94933ac0c6e0d2a794f46c7a97d72f75} +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries f\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable f \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a5f5c88f603d4e503cba4c44ed43de46a}\label{classStaggeredGrid_a5f5c88f603d4e503cba4c44ed43de46a} +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries g\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable g \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a496206955162452a0629a7742fe92a84}\label{classStaggeredGrid_a496206955162452a0629a7742fe92a84} +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries rhs\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable rhs \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Create field variables and define limits for the indices. + +Create the necessary u, v, p, f, g, rhs field variables and define the first valid index for each of the field variables, as well as the (one after) last valid index + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}\label{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1} +\index{StaggeredGrid@{StaggeredGrid}!StaggeredGrid@{StaggeredGrid}} +\index{StaggeredGrid@{StaggeredGrid}!StaggeredGrid@{StaggeredGrid}} +\doxysubsubsection{\texorpdfstring{StaggeredGrid()}{StaggeredGrid()}} +{\footnotesize\ttfamily Staggered\+Grid\+::\+Staggered\+Grid (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{n\+Cells, }\item[{std\+::array$<$ double, 2 $>$}]{mesh\+Width }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em n\+Cells} & array containing number of cells in x and y directions \\ +\hline +{\em mesh\+Width} & array containing the length of a single cell in x and y directions \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/staggered\+\_\+grid.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/staggered\+\_\+grid.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/computation_8h_source.tex b/documentation/latex/computation_8h_source.tex new file mode 100644 index 00000000..88a761bf --- /dev/null +++ b/documentation/latex/computation_8h_source.tex @@ -0,0 +1,94 @@ +\doxysection{computation.\+h} +\hypertarget{computation_8h_source}{}\label{computation_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/computation.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/computation.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}discretization/discretization.h"{}}} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ "{}discretization/donor\_cell.h"{}}} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ "{}discretization/central\_differences.h"{}}} +\DoxyCodeLine{00006\ } +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ "{}solver/pressure\_solver.h"{}}} +\DoxyCodeLine{00008\ \textcolor{preprocessor}{\#include\ "{}solver/sor.h"{}}} +\DoxyCodeLine{00009\ \textcolor{preprocessor}{\#include\ "{}solver/gauss\_seidel.h"{}}} +\DoxyCodeLine{00010\ } +\DoxyCodeLine{00011\ \textcolor{preprocessor}{\#include\ "{}output\_writer/output\_writer\_paraview.h"{}}} +\DoxyCodeLine{00012\ \textcolor{preprocessor}{\#include\ "{}output\_writer/output\_writer\_text.h"{}}} +\DoxyCodeLine{00013\ \textcolor{preprocessor}{\#include\ "{}settings\_parser/settings.h"{}}} +\DoxyCodeLine{00014\ } +\DoxyCodeLine{00015\ \textcolor{preprocessor}{\#include\ "{}boundary/boundary.h"{}}} +\DoxyCodeLine{00016\ \textcolor{preprocessor}{\#include\ "{}boundary/mask.h"{}}} +\DoxyCodeLine{00017\ \textcolor{preprocessor}{\#include\ "{}surface/fluid\_tracer.h"{}}} +\DoxyCodeLine{00018\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00019\ } +\DoxyCodeLine{00020\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00021\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00022\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00023\ } + + + + + +\DoxyCodeLine{00030\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classComputation}{Computation}}} +\DoxyCodeLine{00031\ \{} +\DoxyCodeLine{00032\ \textcolor{keyword}{public}:} + + + + + +\DoxyCodeLine{00039\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classComputation_a4a344479797b15bd5c9ed2f262657339}{initialize}}(\textcolor{keywordtype}{int}\ argc,\ \textcolor{keywordtype}{char}\ *argv[]);} +\DoxyCodeLine{00040\ } + + + +\DoxyCodeLine{00045\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classComputation_ad20ce6e82ec9a918e6ac03840bc688d5}{runSimulation}}();} +\DoxyCodeLine{00046\ } +\DoxyCodeLine{00047\ } +\DoxyCodeLine{00048\ } +\DoxyCodeLine{00049\ \textcolor{keyword}{private}:} + + + + +\DoxyCodeLine{00055\ \ \ \ \ \textcolor{keywordtype}{void}\ computeTimeStepWidth(\textcolor{keywordtype}{double}\ currentTime);} +\DoxyCodeLine{00056\ } + + +\DoxyCodeLine{00060\ \ \ \ \ \textcolor{keywordtype}{void}\ applyBoundaryValues();} +\DoxyCodeLine{00061\ } + + +\DoxyCodeLine{00065\ \ \ \ \ \textcolor{keywordtype}{void}\ computePreliminaryVelocities();} +\DoxyCodeLine{00066\ } + + +\DoxyCodeLine{00070\ \ \ \ \ \textcolor{keywordtype}{void}\ computeRightHandSide();} +\DoxyCodeLine{00071\ } + + +\DoxyCodeLine{00075\ \ \ \ \ \textcolor{keywordtype}{void}\ computePressure();} +\DoxyCodeLine{00076\ } + + + +\DoxyCodeLine{00081\ \ \ \ \ \textcolor{keywordtype}{void}\ computeVelocities();} +\DoxyCodeLine{00082\ } +\DoxyCodeLine{00083\ \ \ \ \ \mbox{\hyperlink{structSettings}{Settings}}\ settings\_;} +\DoxyCodeLine{00084\ \ \ \ \ std::shared\_ptr\ discretization\_;\ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00085\ } +\DoxyCodeLine{00086\ \ \ \ \ std::shared\_ptr\ mask\_;} +\DoxyCodeLine{00087\ \ \ \ \ std::shared\_ptr\ boundary\_;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00088\ \ \ \ \ std::shared\_ptr\ fluidTracer\_;} +\DoxyCodeLine{00089\ } +\DoxyCodeLine{00090\ \ \ \ \ std::unique\_ptr\ pressureSolver\_;\ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00091\ \ \ \ \ std::unique\_ptr\ outputWriterParaview\_;\ } +\DoxyCodeLine{00092\ \ \ \ \ std::unique\_ptr\ outputWriterText\_;\ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00093\ \ \ \ \ std::array\ meshWidth\_;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00094\ \ \ \ \ \textcolor{keywordtype}{double}\ dt\_;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00095\ \};} +\DoxyCodeLine{00096\ } +\DoxyCodeLine{00097\ } + +\end{DoxyCode} diff --git a/documentation/latex/discretization_8h_source.tex b/documentation/latex/discretization_8h_source.tex new file mode 100644 index 00000000..bfbb7467 --- /dev/null +++ b/documentation/latex/discretization_8h_source.tex @@ -0,0 +1,66 @@ +\doxysection{discretization.\+h} +\hypertarget{discretization_8h_source}{}\label{discretization_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/discretization/discretization.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/discretization/discretization.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ "{}staggered\_grid.h"{}}} +\DoxyCodeLine{00006\ } + + + + + + + +\DoxyCodeLine{00015\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classDiscretization}{Discretization}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classStaggeredGrid}{StaggeredGrid}}} +\DoxyCodeLine{00016\ \{} +\DoxyCodeLine{00017\ \textcolor{keyword}{public}:} + + + + + +\DoxyCodeLine{00024\ \ \ \ \ \mbox{\hyperlink{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c}{Discretization}}(std::array\ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{nCells}},\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{meshWidth}});} +\DoxyCodeLine{00025\ } + + +\DoxyCodeLine{00029\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_acca6bf193e0e91f645d292527299254b}{computeDu2Dx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const}\ =\ 0;} + + +\DoxyCodeLine{00033\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a69ba136ab7f8c09d805afca159cab428}{computeDv2Dy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const}\ =\ 0;} +\DoxyCodeLine{00034\ } + + +\DoxyCodeLine{00038\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795}{computeDuvDx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const}\ =\ 0;} + + +\DoxyCodeLine{00042\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84}{computeDuvDy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const}\ =\ 0;} +\DoxyCodeLine{00043\ } + + +\DoxyCodeLine{00047\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a6986501b0b5c96699ff3ac843c1a6ca2}{computeD2uDx2}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00051\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a446aabc55a9fb4b5cb2f476babc532f9}{computeD2uDy2}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00055\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a5119047788a34eadf37480e913bdc8ea}{computeD2vDx2}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00059\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a56678582a049b1b141621e41afff1438}{computeD2vDy2}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00060\ } + + +\DoxyCodeLine{00064\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_aed3ad75ad6e647d14f118a12652c01b2}{computeDpDx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00068\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a859f4dc33f0ea91f5e6537be09ce4999}{computeDpDy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00069\ } +\DoxyCodeLine{00070\ } +\DoxyCodeLine{00071\ \};} +\DoxyCodeLine{00072\ } + +\end{DoxyCode} diff --git a/documentation/latex/donor__cell_8h_source.tex b/documentation/latex/donor__cell_8h_source.tex new file mode 100644 index 00000000..d6492030 --- /dev/null +++ b/documentation/latex/donor__cell_8h_source.tex @@ -0,0 +1,50 @@ +\doxysection{donor\+\_\+cell.\+h} +\hypertarget{donor__cell_8h_source}{}\label{donor__cell_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/discretization/donor\_cell.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/discretization/donor\_cell.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ "{}discretization.h"{}}} +\DoxyCodeLine{00007\ } + + + + + + +\DoxyCodeLine{00015\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classDonorCell}{DonorCell}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classDiscretization}{Discretization}}} +\DoxyCodeLine{00016\ \{} +\DoxyCodeLine{00017\ \textcolor{keyword}{public}:} + + + + + + +\DoxyCodeLine{00025\ \ \ \ \ \mbox{\hyperlink{classDonorCell_a4896ad035a5ac50c85e2b66d442a5312}{DonorCell}}(std::array\ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{nCells}},\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{meshWidth}},\ \textcolor{keywordtype}{double}\ alpha);} +\DoxyCodeLine{00026\ } + + + +\DoxyCodeLine{00031\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDonorCell_a265bdaf46ed8ba46a42ef0cb03807175}{computeDu2Dx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} + + + +\DoxyCodeLine{00036\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDonorCell_a01dcfb7fcf356d5ee412107a30c26fb3}{computeDv2Dy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} + + + +\DoxyCodeLine{00041\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDonorCell_ae41b5f85743ca7f148bd829561bd9cb5}{computeDuvDx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} + + + +\DoxyCodeLine{00046\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDonorCell_a285562312f08efde26afd160174d2843}{computeDuvDy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} +\DoxyCodeLine{00047\ } +\DoxyCodeLine{00048\ \textcolor{keyword}{private}:} +\DoxyCodeLine{00049\ \ \ \ \ \textcolor{keyword}{const}\ \textcolor{keywordtype}{double}\ alpha\_;\ } +\DoxyCodeLine{00050\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/doxygen.sty b/documentation/latex/doxygen.sty new file mode 100644 index 00000000..4bfc17fa --- /dev/null +++ b/documentation/latex/doxygen.sty @@ -0,0 +1,694 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{doxygen} + +% Packages used by this style file +\RequirePackage{alltt} +%%\RequirePackage{array} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package +\RequirePackage{calc} +\RequirePackage{float} +%%\RequirePackage{ifthen} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package +\RequirePackage{verbatim} +\RequirePackage[table]{xcolor} +\RequirePackage{longtable_doxygen} +\RequirePackage{tabu_doxygen} +\RequirePackage{fancyvrb} +\RequirePackage{tabularx} +\RequirePackage{multicol} +\RequirePackage{multirow} +\RequirePackage{hanging} +\RequirePackage{ifpdf} +\RequirePackage{adjustbox} +\RequirePackage{amssymb} +\RequirePackage{stackengine} +\RequirePackage{enumitem} +\RequirePackage{alphalph} +\RequirePackage[normalem]{ulem} % for strikeout, but don't modify emphasis + +%---------- Internal commands used in this style file ---------------- + +\newcommand{\ensurespace}[1]{% + \begingroup% + \setlength{\dimen@}{#1}% + \vskip\z@\@plus\dimen@% + \penalty -100\vskip\z@\@plus -\dimen@% + \vskip\dimen@% + \penalty 9999% + \vskip -\dimen@% + \vskip\z@skip% hide the previous |\vskip| from |\addvspace| + \endgroup% +} + +\newcommand{\DoxyHorRuler}[1]{% + \setlength{\parskip}{0ex plus 0ex minus 0ex}% + \ifthenelse{#1=0}% + {% + \hrule% + }% + {% + \hrulefilll% + }% +} +\newcommand{\DoxyLabelFont}{} +\newcommand{\entrylabel}[1]{% + {% + \parbox[b]{\labelwidth-4pt}{% + \makebox[0pt][l]{\DoxyLabelFont#1}% + \vspace{1.5\baselineskip}% + }% + }% +} + +\newenvironment{DoxyDesc}[1]{% + \ensurespace{4\baselineskip}% + \begin{list}{}{% + \settowidth{\labelwidth}{20pt}% + %\setlength{\parsep}{0pt}% + \setlength{\itemsep}{0pt}% + \setlength{\leftmargin}{\labelwidth+\labelsep}% + \renewcommand{\makelabel}{\entrylabel}% + }% + \item[#1]% +}{% + \end{list}% +} + +\newsavebox{\xrefbox} +\newlength{\xreflength} +\newcommand{\xreflabel}[1]{% + \sbox{\xrefbox}{#1}% + \setlength{\xreflength}{\wd\xrefbox}% + \ifthenelse{\xreflength>\labelwidth}{% + \begin{minipage}{\textwidth}% + \setlength{\parindent}{0pt}% + \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}% + \end{minipage}% + }{% + \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}% + }% +} + +%---------- Commands used by doxygen LaTeX output generator ---------- + +% Used by
     ... 
    +\newenvironment{DoxyPre}{% + \small% + \begin{alltt}% +}{% + \end{alltt}% + \normalsize% +} +% Necessary for redefining not defined characters, i.e. "Replacement Character" in tex output. +\newlength{\CodeWidthChar} +\newlength{\CodeHeightChar} +\settowidth{\CodeWidthChar}{?} +\settoheight{\CodeHeightChar}{?} +% Necessary for hanging indent +\newlength{\DoxyCodeWidth} + +\newcommand\DoxyCodeLine[1]{ + \ifthenelse{\equal{\detokenize{#1}}{}} + { + \vspace*{\baselineskip} + } + { + \hangpara{\DoxyCodeWidth}{1}{#1}\par + } +} + +\newcommand\NiceSpace{% + \discretionary{}{\kern\fontdimen2\font}{\kern\fontdimen2\font}% +} + +% Used by @code ... @endcode +\newenvironment{DoxyCode}[1]{% + \par% + \scriptsize% + \normalfont\ttfamily% + \rightskip0pt plus 1fil% + \settowidth{\DoxyCodeWidth}{000000}% + \settowidth{\CodeWidthChar}{?}% + \settoheight{\CodeHeightChar}{?}% + \setlength{\parskip}{0ex plus 0ex minus 0ex}% + \ifthenelse{\equal{#1}{0}} + { + {\lccode`~32 \lowercase{\global\let~}\NiceSpace}\obeyspaces% + } + { + {\lccode`~32 \lowercase{\global\let~}}\obeyspaces% + } + +}{% + \normalfont% + \normalsize% + \settowidth{\CodeWidthChar}{?}% + \settoheight{\CodeHeightChar}{?}% +} + +% Redefining not defined characters, i.e. "Replacement Character" in tex output. +\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{% + \textcolor{white}{\sffamily\bfseries\small ?}}{% + \rotatebox{45}{$\blacksquare$}}}} + +% Used by @example, @include, @includelineno and @dontinclude +\newenvironment{DoxyCodeInclude}[1]{% + \DoxyCode{#1}% +}{% + \endDoxyCode% +} + +% Used by @verbatim ... @endverbatim +\newenvironment{DoxyVerb}{% + \par% + \footnotesize% + \verbatim% +}{% + \endverbatim% + \normalsize% +} + +% Used by @verbinclude +\newenvironment{DoxyVerbInclude}{% + \DoxyVerb% +}{% + \endDoxyVerb% +} + +% Used by numbered lists (using '-#' or
      ...
    ) +\setlistdepth{12} +\newlist{DoxyEnumerate}{enumerate}{12} +\setlist[DoxyEnumerate,1]{label=\arabic*.} +\setlist[DoxyEnumerate,2]{label=(\enumalphalphcnt*)} +\setlist[DoxyEnumerate,3]{label=\roman*.} +\setlist[DoxyEnumerate,4]{label=\enumAlphAlphcnt*.} +\setlist[DoxyEnumerate,5]{label=\arabic*.} +\setlist[DoxyEnumerate,6]{label=(\enumalphalphcnt*)} +\setlist[DoxyEnumerate,7]{label=\roman*.} +\setlist[DoxyEnumerate,8]{label=\enumAlphAlphcnt*.} +\setlist[DoxyEnumerate,9]{label=\arabic*.} +\setlist[DoxyEnumerate,10]{label=(\enumalphalphcnt*)} +\setlist[DoxyEnumerate,11]{label=\roman*.} +\setlist[DoxyEnumerate,12]{label=\enumAlphAlphcnt*.} + +% Used by bullet lists (using '-', @li, @arg, or
      ...
    ) +\setlistdepth{12} +\newlist{DoxyItemize}{itemize}{12} +\setlist[DoxyItemize]{label=\textperiodcentered} + +\setlist[DoxyItemize,1]{label=\textbullet} +\setlist[DoxyItemize,2]{label=\normalfont\bfseries \textendash} +\setlist[DoxyItemize,3]{label=\textasteriskcentered} +\setlist[DoxyItemize,4]{label=\textperiodcentered} + +% Used by description lists (using
    ...
    ) +\newenvironment{DoxyDescription}{% + \description% +}{% + \enddescription% +} + +% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc +% (only if caption is specified) +\newenvironment{DoxyImage}{% + \begin{figure}[H]% + \centering% +}{% + \end{figure}% +} + +% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc +% (only if no caption is specified) +\newenvironment{DoxyImageNoCaption}{% + \begin{center}% +}{% + \end{center}% +} + +% Used by @image +% (only if inline is specified) +\newenvironment{DoxyInlineImage}{% +}{% +} + +% Used by @attention +\newenvironment{DoxyAttention}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @author and @authors +\newenvironment{DoxyAuthor}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @date +\newenvironment{DoxyDate}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @invariant +\newenvironment{DoxyInvariant}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @note +\newenvironment{DoxyNote}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @post +\newenvironment{DoxyPostcond}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @pre +\newenvironment{DoxyPrecond}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @copyright +\newenvironment{DoxyCopyright}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @remark +\newenvironment{DoxyRemark}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @return and @returns +\newenvironment{DoxyReturn}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @since +\newenvironment{DoxySince}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @see +\newenvironment{DoxySeeAlso}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @version +\newenvironment{DoxyVersion}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @warning +\newenvironment{DoxyWarning}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @par and @paragraph +\newenvironment{DoxyParagraph}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by parameter lists +\newenvironment{DoxyParams}[2][]{% + \tabulinesep=1mm% + \par% + \ifthenelse{\equal{#1}{}}% + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description + {\ifthenelse{\equal{#1}{1}}% + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc + } + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for fields of simple structs +\newenvironment{DoxyFields}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}% + \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for fields simple class style enums +\newenvironment{DoxyEnumFields}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for parameters within a detailed function description +\newenvironment{DoxyParamCaption}{% + \renewcommand{\item}[2][]{\\ \hspace*{2.0cm} ##1 {\em ##2}}% +}{% +} + +% Used by return value lists +\newenvironment{DoxyRetVals}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used by exception lists +\newenvironment{DoxyExceptions}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used by template parameter lists +\newenvironment{DoxyTemplParams}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for member lists +\newenvironment{DoxyCompactItemize}{% + \begin{itemize}% + \setlength{\itemsep}{-3pt}% + \setlength{\parsep}{0pt}% + \setlength{\topsep}{0pt}% + \setlength{\partopsep}{0pt}% +}{% + \end{itemize}% +} + +% Used for member descriptions +\newenvironment{DoxyCompactList}{% + \begin{list}{}{% + \setlength{\leftmargin}{0.5cm}% + \setlength{\itemsep}{0pt}% + \setlength{\parsep}{0pt}% + \setlength{\topsep}{0pt}% + \renewcommand{\makelabel}{\hfill}% + }% +}{% + \end{list}% +} + +% Used for reference lists (@bug, @deprecated, @todo, etc.) +\newenvironment{DoxyRefList}{% + \begin{list}{}{% + \setlength{\labelwidth}{10pt}% + \setlength{\leftmargin}{\labelwidth}% + \addtolength{\leftmargin}{\labelsep}% + \renewcommand{\makelabel}{\xreflabel}% + }% +}{% + \end{list}% +} + +% Used by @bug, @deprecated, @todo, etc. +\newenvironment{DoxyRefDesc}[1]{% + \begin{list}{}{% + \renewcommand\makelabel[1]{\textbf{##1}}% + \settowidth\labelwidth{\makelabel{#1}}% + \setlength\leftmargin{\labelwidth+\labelsep}% + }% +}{% + \end{list}% +} + +% Used by parameter lists and simple sections +\newenvironment{Desc} +{\begin{list}{}{% + \settowidth{\labelwidth}{20pt}% + \setlength{\parsep}{0pt}% + \setlength{\itemsep}{0pt}% + \setlength{\leftmargin}{\labelwidth+\labelsep}% + \renewcommand{\makelabel}{\entrylabel}% + } +}{% + \end{list}% +} + +% Used by tables +\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}% +\newenvironment{TabularC}[1]% +{\tabulinesep=1mm +\begin{longtabu*}spread 0pt [c]{*#1{|X[-1]}|}}% +{\end{longtabu*}\par}% + +\newenvironment{TabularNC}[1]% +{\begin{tabu}spread 0pt [l]{*#1{|X[-1]}|}}% +{\end{tabu}\par}% + +% Used for member group headers +\newenvironment{Indent}{% + \begin{list}{}{% + \setlength{\leftmargin}{0.5cm}% + }% + \item[]\ignorespaces% +}{% + \unskip% + \end{list}% +} + +% Used when hyperlinks are turned on +\newcommand{\doxylink}[2]{% + \mbox{\hyperlink{#1}{#2}}% +} + +% Used when hyperlinks are turned on +% Third argument is the SectionType, see the doxygen internal +% documentation for the values (relevant: Page ... Subsubsection). +\newcommand{\doxysectlink}[3]{% + \mbox{\hyperlink{#1}{#2}}% +} +% Used when hyperlinks are turned off +\newcommand{\doxyref}[3]{% + \textbf{#1} (\textnormal{#2}\,\pageref{#3})% +} + +% Used when hyperlinks are turned off +% Fourth argument is the SectionType, see the doxygen internal +% documentation for the values (relevant: Page ... Subsubsection). +\newcommand{\doxysectref}[4]{% + \textbf{#1} (\textnormal{#2}\,\pageref{#3})% +} + +% Used to link to a table when hyperlinks are turned on +\newcommand{\doxytablelink}[2]{% + \ref{#1}% +} + +% Used to link to a table when hyperlinks are turned off +\newcommand{\doxytableref}[3]{% + \ref{#3}% +} + +% Used by @addindex +\newcommand{\lcurly}{\{} +\newcommand{\rcurly}{\}} + +% Colors used for syntax highlighting +\definecolor{comment}{rgb}{0.5,0.0,0.0} +\definecolor{keyword}{rgb}{0.0,0.5,0.0} +\definecolor{keywordtype}{rgb}{0.38,0.25,0.125} +\definecolor{keywordflow}{rgb}{0.88,0.5,0.0} +\definecolor{preprocessor}{rgb}{0.5,0.38,0.125} +\definecolor{stringliteral}{rgb}{0.0,0.125,0.25} +\definecolor{charliteral}{rgb}{0.0,0.5,0.5} +\definecolor{xmlcdata}{rgb}{0.0,0.0,0.0} +\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0} +\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43} +\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0} +\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0} + +% Color used for table heading +\newcommand{\tableheadbgcolor}{lightgray}% + +% Version of hypertarget with correct landing location +\newcommand{\Hypertarget}[1]{\Hy@raisedlink{\hypertarget{#1}{}}} + +% possibility to have sections etc. be within the margins +% unfortunately had to copy part of book.cls and add \raggedright +\makeatletter +\newcounter{subsubsubsection}[subsubsection] +\newcounter{subsubsubsubsection}[subsubsubsection] +\newcounter{subsubsubsubsubsection}[subsubsubsubsection] +\newcounter{subsubsubsubsubsubsection}[subsubsubsubsubsection] +\renewcommand{\thesubsubsubsection}{\thesubsubsection.\arabic{subsubsubsection}} +\renewcommand{\thesubsubsubsubsection}{\thesubsubsubsection.\arabic{subsubsubsubsection}} +\renewcommand{\thesubsubsubsubsubsection}{\thesubsubsubsubsection.\arabic{subsubsubsubsubsection}} +\renewcommand{\thesubsubsubsubsubsubsection}{\thesubsubsubsubsubsection.\arabic{subsubsubsubsubsubsection}} +\newcommand{\subsubsubsectionmark}[1]{} +\newcommand{\subsubsubsubsectionmark}[1]{} +\newcommand{\subsubsubsubsubsectionmark}[1]{} +\newcommand{\subsubsubsubsubsubsectionmark}[1]{} +\def\toclevel@subsubsubsection{4} +\def\toclevel@subsubsubsubsection{5} +\def\toclevel@subsubsubsubsubsection{6} +\def\toclevel@subsubsubsubsubsubsection{7} +\def\toclevel@paragraph{8} +\def\toclevel@subparagraph{9} + +\newcommand\doxysection{\@startsection {section}{1}{\z@}% + {-3.5ex \@plus -1ex \@minus -.2ex}% + {2.3ex \@plus.2ex}% + {\raggedright\normalfont\Large\bfseries}} +\newcommand\doxysubsection{\@startsection{subsection}{2}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\large\bfseries}} +\newcommand\doxysubsubsection{\@startsection{subsubsection}{3}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxysubsubsubsection{\@startsection{subsubsubsection}{4}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxysubsubsubsubsection{\@startsection{subsubsubsubsection}{5}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxysubsubsubsubsubsection{\@startsection{subsubsubsubsubsection}{6}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxysubsubsubsubsubsubsection{\@startsection{subsubsubsubsubsubsection}{7}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxyparagraph{\@startsection{paragraph}{8}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxysubparagraph{\@startsection{subparagraph}{9}{\parindent}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} + +\newcommand\l@subsubsubsection{\@dottedtocline{4}{6.1em}{7.8em}} +\newcommand\l@subsubsubsubsection{\@dottedtocline{5}{6.1em}{9.4em}} +\newcommand\l@subsubsubsubsubsection{\@dottedtocline{6}{6.1em}{11em}} +\newcommand\l@subsubsubsubsubsubsection{\@dottedtocline{7}{6.1em}{12.6em}} +\renewcommand\l@paragraph{\@dottedtocline{8}{6.1em}{14.2em}} +\renewcommand\l@subparagraph{\@dottedtocline{9}{6.1em}{15.8em}} +\makeatother +% the sectsty doesn't look to be maintained but gives, in our case, some warning like: +% LaTeX Warning: Command \underline has changed. +% Check if current package is valid. +% unfortunately had to copy the relevant part +\newcommand*{\doxypartfont} [1] + {\gdef\SS@partnumberfont{\SS@sectid{0}\SS@nopart\SS@makeulinepartchap#1} + \gdef\SS@parttitlefont{\SS@sectid{0}\SS@titlepart\SS@makeulinepartchap#1}} +\newcommand*{\doxychapterfont} [1] + {\gdef\SS@chapnumfont{\SS@sectid{1}\SS@nopart\SS@makeulinepartchap#1} + \gdef\SS@chaptitlefont{\SS@sectid{1}\SS@titlepart\SS@makeulinepartchap#1}} +\newcommand*{\doxysectionfont} [1] + {\gdef\SS@sectfont{\SS@sectid{2}\SS@rr\SS@makeulinesect#1}} +\newcommand*{\doxysubsectionfont} [1] + {\gdef\SS@subsectfont{\SS@sectid{3}\SS@rr\SS@makeulinesect#1}} +\newcommand*{\doxysubsubsectionfont} [1] + {\gdef\SS@subsubsectfont{\SS@sectid{4}\SS@rr\SS@makeulinesect#1}} +\newcommand*{\doxyparagraphfont} [1] + {\gdef\SS@parafont{\SS@sectid{5}\SS@rr\SS@makeulinesect#1}} +\newcommand*{\doxysubparagraphfont} [1] + {\gdef\SS@subparafont{\SS@sectid{6}\SS@rr\SS@makeulinesect#1}} +\newcommand*{\doxyminisecfont} [1] + {\gdef\SS@minisecfont{\SS@sectid{7}\SS@rr\SS@makeulinepartchap#1}} +\newcommand*{\doxyallsectionsfont} [1] {\doxypartfont{#1}% + \doxychapterfont{#1}% + \doxysectionfont{#1}% + \doxysubsectionfont{#1}% + \doxysubsubsectionfont{#1}% + \doxyparagraphfont{#1}% + \doxysubparagraphfont{#1}% + \doxyminisecfont{#1}}% +% Define caption that is also suitable in a table +\makeatletter +\def\doxyfigcaption{% +\H@refstepcounter{figure}% +\@dblarg{\@caption{figure}}} +\makeatother + +% Define alpha enumarative names for counters > 26 +\makeatletter +\def\enumalphalphcnt#1{\expandafter\@enumalphalphcnt\csname c@#1\endcsname} +\def\@enumalphalphcnt#1{\alphalph{#1}} +\def\enumAlphAlphcnt#1{\expandafter\@enumAlphAlphcnt\csname c@#1\endcsname} +\def\@enumAlphAlphcnt#1{\AlphAlph{#1}} +\makeatother +\AddEnumerateCounter{\enumalphalphcnt}{\@enumalphalphcnt}{aa} +\AddEnumerateCounter{\enumAlphAlphcnt}{\@enumAlphAlphcnt}{AA} diff --git a/documentation/latex/etoc_doxygen.sty b/documentation/latex/etoc_doxygen.sty new file mode 100644 index 00000000..5f7e1274 --- /dev/null +++ b/documentation/latex/etoc_doxygen.sty @@ -0,0 +1,2178 @@ +%% +%% This is file etoc_doxygen.sty +%% +%% Apart from this header notice and the renaming from etoc to +%% etoc_doxygen (also in \ProvidesPackage) it is an identical +%% copy of +%% +%% etoc.sty +%% +%% at version 1.2b of 2023/07/01. +%% +%% This file has been provided to Doxygen team courtesy of the +%% author for benefit of users having a LaTeX installation not +%% yet providing version 1.2a or later of etoc, whose +%% deeplevels feature is required. +%% +%% The original source etoc.dtx (only of the latest version at +%% any given time) is available at +%% +%% https://ctan.org/pkg/etoc +%% +%% and contains the terms for copying and modification as well +%% as author contact information. +%% +%% In brief any modified versions of this file must be renamed +%% with new filenames distinct from etoc.sty. +%% +%% Package: etoc +%% Version: 1.2b +%% License: LPPL 1.3c +%% Copyright (C) 2012-2023 Jean-Francois B. +\NeedsTeXFormat{LaTeX2e}[2003/12/01] +\ProvidesPackage{etoc_doxygen}[2023/07/01 v1.2b Completely customisable TOCs (JFB)] +\newif\ifEtoc@oldLaTeX +\@ifl@t@r\fmtversion{2020/10/01} + {} + {\Etoc@oldLaTeXtrue + \PackageInfo{etoc}{Old LaTeX (\fmtversion) detected!\MessageBreak + Since 1.1a (2023/01/14), etoc prefers LaTeX at least\MessageBreak + as recent as 2020-10-01, for reasons of the .toc file,\MessageBreak + and used to require it (from 1.1a to 1.2).\MessageBreak + This etoc (1.2b) does not *require* it, but has not been\MessageBreak + tested thoroughly on old LaTeX (especially if document\MessageBreak + does not use hyperref) and retrofitting was done only\MessageBreak + on basis of author partial remembrances of old context.\MessageBreak + Reported}} +\RequirePackage{kvoptions} +\SetupKeyvalOptions{prefix=Etoc@} +\newif\ifEtoc@lof +\DeclareVoidOption{lof}{\Etoc@loftrue + \PackageInfo{etoc}{Experimental support for \string\locallistoffigures.\MessageBreak + Barely tested, use at own risk}% +} +\newif\ifEtoc@lot +\DeclareVoidOption{lot}{\Etoc@lottrue + \PackageInfo{etoc}{Experimental support for \string\locallistoftables.\MessageBreak + Barely tested, use at own risk}% +} +\@ifclassloaded{memoir}{ +\PackageInfo{etoc} + {As this is with memoir class, all `...totoc' options\MessageBreak + are set true by default. Reported} +\DeclareBoolOption[true]{maintoctotoc} +\DeclareBoolOption[true]{localtoctotoc} +\DeclareBoolOption[true]{localloftotoc} +\DeclareBoolOption[true]{locallottotoc} +}{ +\DeclareBoolOption[false]{maintoctotoc} +\DeclareBoolOption[false]{localtoctotoc} +\DeclareBoolOption[false]{localloftotoc} +\DeclareBoolOption[false]{locallottotoc} +} +\DeclareBoolOption[true]{ouroboros} +\DeclareBoolOption[false]{deeplevels} +\DeclareDefaultOption{\PackageWarning{etoc}{Option `\CurrentOption' is unknown.}} +\ProcessKeyvalOptions* +\DisableKeyvalOption[action=error,package=etoc]{etoc}{lof} +\DisableKeyvalOption[action=error,package=etoc]{etoc}{lot} +\DisableKeyvalOption[action=error,package=etoc]{etoc}{deeplevels} +\def\etocsetup#1{\setkeys{etoc}{#1}} +\def\etocifmaintoctotoc{\ifEtoc@maintoctotoc + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +\def\etociflocaltoctotoc{\ifEtoc@localtoctotoc + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +\def\etociflocalloftotoc{\ifEtoc@localloftotoc + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +\def\etociflocallottotoc{\ifEtoc@locallottotoc + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +\RequirePackage{multicol} +\def\etoc@{\etoc@} +\long\def\Etoc@gobtoetoc@ #1\etoc@{} +\newtoks\Etoc@toctoks +\def\Etoc@par{\par} +\def\etocinline{\def\Etoc@par{}} +\let\etocnopar\etocinline +\def\etocdisplay{\def\Etoc@par{\par}} +\let\Etoc@global\@empty +\def\etocglobaldefs{\let\Etoc@global\global\let\tof@global\global} +\def\etoclocaldefs {\let\Etoc@global\@empty\let\tof@global\@empty} +\newif\ifEtoc@numbered +\newif\ifEtoc@hyperref +\newif\ifEtoc@parskip +\newif\ifEtoc@tocwithid +\newif\ifEtoc@standardlines +\newif\ifEtoc@etocstyle +\newif\ifEtoc@classstyle +\newif\ifEtoc@keeporiginaltoc +\newif\ifEtoc@skipprefix +\newif\ifEtoc@isfirst +\newif\ifEtoc@localtoc +\newif\ifEtoc@skipthisone +\newif\ifEtoc@stoptoc +\newif\ifEtoc@notactive +\newif\ifEtoc@mustclosegroup +\newif\ifEtoc@isemptytoc +\newif\ifEtoc@checksemptiness +\def\etocchecksemptiness {\Etoc@checksemptinesstrue } +\def\etocdoesnotcheckemptiness {\Etoc@checksemptinessfalse } +\newif\ifEtoc@notocifnotoc +\def\etocnotocifnotoc {\Etoc@checksemptinesstrue\Etoc@notocifnotoctrue } +\newcounter{etoc@tocid} +\def\Etoc@tocext{toc} +\def\Etoc@lofext{lof} +\def\Etoc@lotext{lot} +\let\Etoc@currext\Etoc@tocext +\def\etocifislocal{\ifEtoc@localtoc\expandafter\@firstoftwo\else + \expandafter\@secondoftwo\fi + } +\def\etocifislocaltoc{\etocifislocal{\ifx\Etoc@currext\Etoc@tocext + \expandafter\@firstoftwo\else + \expandafter\@secondoftwo\fi}% + {\@secondoftwo}% + } +\def\etocifislocallof{\etocifislocal{\ifx\Etoc@currext\Etoc@lofext + \expandafter\@firstoftwo\else + \expandafter\@secondoftwo\fi}% + {\@secondoftwo}% + } +\def\etocifislocallot{\etocifislocal{\ifx\Etoc@currext\Etoc@lotext + \expandafter\@firstoftwo\else + \expandafter\@secondoftwo\fi}% + {\@secondoftwo}% + } +\expandafter\def\csname Etoc@-3@@\endcsname {-\thr@@} +\expandafter\def\csname Etoc@-2@@\endcsname {-\tw@} +\expandafter\let\csname Etoc@-1@@\endcsname \m@ne +\expandafter\let\csname Etoc@0@@\endcsname \z@ +\expandafter\let\csname Etoc@1@@\endcsname \@ne +\expandafter\let\csname Etoc@2@@\endcsname \tw@ +\expandafter\let\csname Etoc@3@@\endcsname \thr@@ +\expandafter\chardef\csname Etoc@4@@\endcsname 4 +\expandafter\chardef\csname Etoc@5@@\endcsname 5 +\expandafter\chardef\csname Etoc@6@@\endcsname 6 +\ifEtoc@deeplevels + \expandafter\chardef\csname Etoc@7@@\endcsname 7 + \expandafter\chardef\csname Etoc@8@@\endcsname 8 + \expandafter\chardef\csname Etoc@9@@\endcsname 9 + \expandafter\chardef\csname Etoc@10@@\endcsname 10 + \expandafter\chardef\csname Etoc@11@@\endcsname 11 + \expandafter\chardef\csname Etoc@12@@\endcsname 12 +\fi +\expandafter\let\expandafter\Etoc@maxlevel + \csname Etoc@\ifEtoc@deeplevels12\else6\fi @@\endcsname +\edef\etocthemaxlevel{\number\Etoc@maxlevel} +\@ifclassloaded{memoir}{\def\Etoc@minf{-\thr@@}}{\def\Etoc@minf{-\tw@}} +\let\Etoc@none@@ \Etoc@minf +\expandafter\let\expandafter\Etoc@all@@ + \csname Etoc@\ifEtoc@deeplevels11\else5\fi @@\endcsname +\let\Etoc@dolevels\@empty +\def\Etoc@newlevel #1{\expandafter\def\expandafter\Etoc@dolevels\expandafter + {\Etoc@dolevels\Etoc@do{#1}}} +\ifdefined\expanded + \def\etocsetlevel#1#2{\expanded{\noexpand\etoc@setlevel{#1}{#2}}}% +\else + \def\etocsetlevel#1#2{{\edef\Etoc@tmp{\noexpand\etoc@setlevel{#1}{#2}}\expandafter}\Etoc@tmp}% +\fi +\def\etoc@setlevel#1#2{% + \edef\Etoc@tmp{\the\numexpr#2}% + \if1\ifnum\Etoc@tmp>\Etoc@maxlevel0\fi\unless\ifnum\Etoc@minf<\Etoc@tmp;\fi1% + \ifEtoc@deeplevels + \in@{.#1,}{.none,.all,.figure,.table,.-3,.-2,.-1,.0,.1,.2,.3,.4,.5,.6,% + .7,.8,.9,.10,.11,.12,}% + \else + \in@{.#1,}{.none,.all,.figure,.table,.-3,.-2,.-1,.0,.1,.2,.3,.4,.5,.6,}% + \fi + \ifin@\else\if\@car#1\@nil @\in@true\fi\fi + \ifin@ + \PackageWarning{etoc} + {Sorry, but `#1' is forbidden as level name.\MessageBreak + \if\@car#1\@nil @% + (because of the @ as first character)\MessageBreak\fi + Reported}% + \else + \etocifunknownlevelTF{#1}{\Etoc@newlevel{#1}}{}% + \expandafter\let\csname Etoc@#1@@\expandafter\endcsname + \csname Etoc@\Etoc@tmp @@\endcsname + \expandafter\edef\csname Etoc@@#1@@\endcsname + {\expandafter\noexpand\csname Etoc@#1@@\endcsname}% + \expandafter\edef\csname toclevel@@#1\endcsname + {\expandafter\noexpand\csname toclevel@#1\endcsname}% + \fi + \else + \PackageWarning{etoc} + {Argument `\detokenize{#2}' of \string\etocsetlevel\space should + represent one of\MessageBreak + \ifnum\Etoc@minf=-\thr@@-2, \fi-1, 0, 1, 2, \ifEtoc@deeplevels ...\else3, 4\fi, + \the\numexpr\Etoc@maxlevel-1, or \number\Etoc@maxlevel\space + but evaluates to \Etoc@tmp.\MessageBreak + The level of `#1' will be set to \number\Etoc@maxlevel.\MessageBreak + Tables of contents will ignore `#1' as long\MessageBreak + as its level is \number\Etoc@maxlevel\space (=\string\etocthemaxlevel).% + \MessageBreak + Reported}% + \etocifunknownlevelTF{#1}{\Etoc@newlevel{#1}}{}% + \expandafter\let\csname Etoc@#1@@\endcsname\Etoc@maxlevel + \fi +} +\def\etoclevel#1{\csname Etoc@#1@@\endcsname} +\def\etocthelevel#1{\number\csname Etoc@#1@@\endcsname} +\def\etocifunknownlevelTF#1{\@ifundefined{Etoc@#1@@}} +\@ifclassloaded{memoir}{\etocsetlevel{book}{-2}}{} +\etocsetlevel{part}{-1} +\etocsetlevel{chapter}{0} +\etocsetlevel{section}{1} +\etocsetlevel{subsection}{2} +\etocsetlevel{subsubsection}{3} +\etocsetlevel{paragraph}{4} +\etocsetlevel{subparagraph}{5} +\ifdefined\c@chapter + \etocsetlevel{appendix}{0} +\else + \etocsetlevel{appendix}{1} +\fi +\def\Etoc@do#1{\@namedef{l@@#1}{\csname l@#1\endcsname}} +\Etoc@dolevels +\let\Etoc@figure@@\Etoc@maxlevel +\let\Etoc@table@@ \Etoc@maxlevel +\let\Etoc@gobblethreeorfour\@gobblefour +\ifdefined\@gobblethree + \let\Etoc@gobblethree\@gobblethree +\else + \long\def\Etoc@gobblethree#1#2#3{}% +\fi +\AtBeginDocument{% +\@ifpackageloaded{parskip}{\Etoc@parskiptrue}{}% +\@ifpackageloaded{hyperref} + {\Etoc@hyperreftrue} + {\ifEtoc@oldLaTeX + \let\Etoc@gobblethreeorfour\Etoc@gobblethree + \let\Etoc@etoccontentsline@fourargs\Etoc@etoccontentsline@ + \long\def\Etoc@etoccontentsline@#1#2#3{% + \Etoc@etoccontentsline@fourargs{#1}{#2}{#3}{}% + }% + \fi + }% +} +\def\etocskipfirstprefix {\global\Etoc@skipprefixtrue } +\def\Etoc@updatestackofends#1\etoc@{\gdef\Etoc@stackofends{#1}} +\def\Etoc@stackofends{{-3}{}} +\def\Etoc@doendsandbegin{% + \expandafter\Etoc@traversestackofends\Etoc@stackofends\etoc@ +} +\def\Etoc@traversestackofends#1{% + \ifnum#1>\Etoc@level + \csname Etoc@end@#1\endcsname + \expandafter\Etoc@traversestackofends + \else + \Etoc@traversestackofends@done{#1}% + \fi +} +\def\Etoc@traversestackofends@done#1#2{#2% + \ifnum#1<\Etoc@level + \csname Etoc@begin@\the\numexpr\Etoc@level\endcsname + \Etoc@global\Etoc@isfirsttrue + \edef\Etoc@tmp{{\the\numexpr\Etoc@level}}% + \else + \Etoc@global\Etoc@isfirstfalse + \let\Etoc@tmp\@empty + \fi + \expandafter\Etoc@updatestackofends\Etoc@tmp{#1}% +} +\def\Etoc@etoccontentsline #1{% + \let\Etoc@next\Etoc@gobblethreeorfour + \ifnum\csname Etoc@#1@@\endcsname=\Etoc@maxlevel + \else + \Etoc@skipthisonefalse + \global\expandafter\let\expandafter\Etoc@level\csname Etoc@#1@@\endcsname + \if @\@car#1\@nil\else\global\let\Etoc@virtualtop\Etoc@level\fi + \ifEtoc@localtoc + \ifEtoc@stoptoc + \Etoc@skipthisonetrue + \else + \ifEtoc@notactive + \Etoc@skipthisonetrue + \else + \unless\ifnum\Etoc@level>\etoclocaltop + \Etoc@skipthisonetrue + \global\Etoc@stoptoctrue + \fi + \fi + \fi + \fi + \ifEtoc@skipthisone + \else + \unless\ifnum\Etoc@level>\c@tocdepth + \ifEtoc@standardlines + \let\Etoc@next\Etoc@savedcontentsline + \else + \let\Etoc@next\Etoc@etoccontentsline@ + \fi + \fi + \fi + \fi + \Etoc@next{#1}% +} +\def\Etoc@etoccontentsline@ #1#2#3#4{% + \Etoc@doendsandbegin + \Etoc@global\edef\Etoc@prefix {\expandafter\noexpand + \csname Etoc@prefix@\the\numexpr\Etoc@level\endcsname }% + \Etoc@global\edef\Etoc@contents{\expandafter\noexpand + \csname Etoc@contents@\the\numexpr\Etoc@level\endcsname }% + \ifEtoc@skipprefix \Etoc@global\def\Etoc@prefix{\@empty}\fi + \global\Etoc@skipprefixfalse + \Etoc@lxyz{#2}{#3}{#4}% + \Etoc@prefix + \Etoc@contents +} +\def\Etoc@lxyz #1#2#3{% + \ifEtoc@hyperref + \Etoc@global\def\etocthelink##1{\hyperlink{#3}{##1}}% + \else + \Etoc@global\let\etocthelink\@firstofone + \fi + \Etoc@global\def\etocthepage {#2}% + \ifEtoc@hyperref + \ifx\etocthepage\@empty + \Etoc@global\let\etocthelinkedpage\@empty + \else + \Etoc@global\def\etocthelinkedpage{\hyperlink {#3}{#2}}% + \fi + \else + \Etoc@global\let\etocthelinkedpage\etocthepage + \fi + \Etoc@global\def\etocthename{#1}% + \futurelet\Etoc@getnb@token\Etoc@@getnb #1\hspace\etoc@ + \ifEtoc@hyperref + \def\Etoc@tmp##1##2{\Etoc@global\def##2{\hyperlink{#3}{##1}}}% + \expandafter\Etoc@tmp\expandafter{\etocthename}\etocthelinkedname + \ifEtoc@numbered + \expandafter\Etoc@tmp\expandafter{\etocthenumber}\etocthelinkednumber + \else + \Etoc@global\let\etocthelinkednumber\@empty + \fi + \else + \Etoc@global\let\etocthelinkedname \etocthename + \Etoc@global\let\etocthelinkednumber\etocthenumber + \fi + \Etoc@global\expandafter\let\csname etoclink \endcsname \etocthelink + \Etoc@global\expandafter\let\csname etocname \endcsname \etocthename + \Etoc@global\expandafter\let\csname etocnumber \endcsname\etocthenumber + \Etoc@global\expandafter\let\csname etocpage \endcsname \etocthepage + \ifEtoc@hyperref + \Etoc@lxyz@linktoc + \fi +} +\def\Etoc@lxyz@linktoc{% + \ifcase\Hy@linktoc + \or + \Etoc@global\expandafter\let\csname etocname \endcsname\etocthelinkedname + \Etoc@global\expandafter\let\csname etocnumber \endcsname\etocthelinkednumber + \or % page + \Etoc@global\expandafter\let\csname etocpage \endcsname\etocthelinkedpage + \else % all + \Etoc@global\expandafter\let\csname etocname \endcsname\etocthelinkedname + \Etoc@global\expandafter\let\csname etocnumber \endcsname\etocthelinkednumber + \Etoc@global\expandafter\let\csname etocpage \endcsname\etocthelinkedpage + \fi +} +\def\Etoc@@getnb {% + \let\Etoc@next\Etoc@getnb + \ifx\Etoc@getnb@token\@sptoken\let\Etoc@next\Etoc@getnb@nonbr\fi + \ifx\Etoc@getnb@token\bgroup \let\Etoc@next\Etoc@getnb@nonbr\fi + \Etoc@next +} +\def\Etoc@getnb #1{% + \in@{#1}{\numberline\chapternumberline\partnumberline\booknumberline}% + \ifin@ + \let\Etoc@next\Etoc@getnb@nmbrd + \else + \ifnum\Etoc@level=\m@ne + \let\Etoc@next\Etoc@@getit + \else + \let\Etoc@next\Etoc@getnb@nonbr + \fi + \in@{#1}{\nonumberline}% + \ifin@ + \let\Etoc@next\Etoc@getnb@nonumberline + \fi + \fi + \Etoc@next #1% +} +\def\Etoc@getnb@nmbrd #1#2{% + \Etoc@global\Etoc@numberedtrue + \Etoc@global\def\etocthenumber {#2}% + \Etoc@getnb@nmbrd@getname\@empty +}% +\def\Etoc@getnb@nmbrd@getname #1\hspace\etoc@ {% + \Etoc@global\expandafter\def\expandafter\etocthename\expandafter{#1}% +} +\def\Etoc@getnb@nonbr #1\etoc@ {% + \Etoc@global\Etoc@numberedfalse + \Etoc@global\let\etocthenumber \@empty +} +\def\Etoc@getnb@nonumberline #1\hspace\etoc@ {% + \Etoc@global\Etoc@numberedfalse + \Etoc@global\let\etocthenumber \@empty + \Etoc@global\expandafter\def\expandafter\etocthename\expandafter{\@gobble#1}% +} +\def\Etoc@@getit #1\hspace#2{% + \ifx\etoc@#2% + \Etoc@global\Etoc@numberedfalse + \Etoc@global\let\etocthenumber \@empty + \else + \Etoc@global\Etoc@numberedtrue + \Etoc@global\def\etocthenumber {#1}% + \expandafter\Etoc@getit@getname \expandafter\@empty + \fi +} +\def\Etoc@getit@getname #1\hspace\etoc@ {% + \Etoc@global\expandafter\def\expandafter\etocthename\expandafter{#1}% +} +\let\etocthename \@empty +\let\etocthenumber \@empty +\let\etocthepage \@empty +\let\etocthelinkedname \@empty +\let\etocthelinkednumber \@empty +\let\etocthelinkedpage \@empty +\let\etocthelink \@firstofone +\DeclareRobustCommand*{\etocname} {} +\DeclareRobustCommand*{\etocnumber}{} +\DeclareRobustCommand*{\etocpage} {} +\DeclareRobustCommand*{\etoclink} {\@firstofone} +\DeclareRobustCommand*{\etocifnumbered} + {\ifEtoc@numbered\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi} +\expandafter\let\expandafter\etocxifnumbered\csname etocifnumbered \endcsname +\DeclareRobustCommand*{\etociffirst} + {\ifEtoc@isfirst\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi} +\expandafter\let\expandafter\etocxiffirst\csname etociffirst \endcsname +\def\Etoc@readtoc {% + \ifeof \Etoc@tf + \else + \read \Etoc@tf to \Etoc@buffer + \Etoc@toctoks=\expandafter\expandafter\expandafter + {\expandafter\the\expandafter\Etoc@toctoks\Etoc@buffer}% + \expandafter\Etoc@readtoc + \fi +} +\Etoc@toctoks {}% (superfluous, but for clarity) +\AtBeginDocument{\IfFileExists{\jobname.toc} + {{\endlinechar=\m@ne + \makeatletter + \newread\Etoc@tf + \openin\Etoc@tf\@filef@und + \Etoc@readtoc + \global\Etoc@toctoks=\expandafter{\the\Etoc@toctoks}% + \closein\Etoc@tf}} + {\typeout{No file \jobname.toc.}}} +\def\Etoc@openouttoc{% + \ifEtoc@hyperref + \ifx\hyper@last\@undefined + \IfFileExists{\jobname .toc} + {\Hy@WarningNoLine + {old toc file detected; run LaTeX again (cheers from `etoc')}% + \global\Etoc@toctoks={}% + } + {}% + \fi + \fi + \if@filesw + \newwrite \tf@toc + \immediate \openout \tf@toc \jobname .toc\relax + \fi + \global\let\Etoc@openouttoc\empty +} +\def\Etoc@toctoc{% + \gdef\Etoc@stackofends{{-3}{}}% + \global\let\Etoc@level\Etoc@minf + \global\let\Etoc@virtualtop\Etoc@minf + \the\Etoc@toctoks + \ifEtoc@notactive + \else + \gdef\Etoc@level{-\thr@@}% + \Etoc@doendsandbegin + \fi +} +\def\Etoc@@startlocaltoc#1#2{% + \ifEtoc@localtoc + \ifnum #1=#2\relax + \global\let\etoclocaltop\Etoc@virtualtop + \Etoc@@startlocaltochook + \etoclocaltableofcontentshook + \ifEtoc@etocstyle + \etocetoclocaltocmaketitle + \fi + \ifx\Etoc@aftertitlehook\@empty + \else + \ifEtoc@localtoctotoc + \ifEtoc@ouroboros + \else + \let\Etoc@tmp\contentsline + \def\contentsline{\let\contentsline\Etoc@tmp\Etoc@gobblethreeorfour}% + \fi + \fi + \fi + \global\Etoc@notactivefalse + \fi + \fi +} +\let\etoc@startlocaltoc\@gobble +\let\Etoc@@startlocaltoc@toc\Etoc@@startlocaltoc +\let\Etoc@@startlocaltochook\@empty +\unless\ifEtoc@deeplevels + \def\etocdivisionnameatlevel#1{% + \ifcase\numexpr#1\relax + \ifdefined\c@chapter chapter\else section\fi% + \or section% + \or subsection% + \or subsubsection% + \or paragraph% + \or subparagraph% + \or empty% + \else\ifnum\numexpr#1<\m@ne + book% + \else + part% + \fi + \fi + } +\else + \def\etocdivisionnameatlevel#1{% + \ifcase\numexpr#1\relax + \ifdefined\c@chapter chapter\else section\fi% + \or section% + \or subsection% + \or subsubsection% + \or subsubsubsection% + \or subsubsubsubsection% + \or subsubsubsubsubsection% + \or subsubsubsubsubsubsection% + \or paragraph% + \or subparagraph% + \else\ifnum\numexpr#1>\z@ + empty% + \else\ifnum\numexpr#1=\m@ne + part% + \else + book% + \fi\fi + \fi + } +\fi +\def\etoclocalheadtotoc#1#2{\addcontentsline{toc}{@#1}{#2}} +\def\etocglobalheadtotoc{\addcontentsline{toc}} +\providecommand*\UseName{\@nameuse} +\def\etocetoclocaltocmaketitle{% + \UseName{\etocdivisionnameatlevel{\etoclocaltop+1}}*{\localcontentsname}% + \if@noskipsec\leavevmode\par\fi + \etociflocaltoctotoc + {\etocifisstarred + {}% star variant, do not add to toc + {\etoclocalheadtotoc + {\etocdivisionnameatlevel{\etoclocaltop+1}}% + {\localcontentsname}% + }% + }% + {}% +}% +\def\localcontentsname {\contentsname}% +\let\etoclocaltableofcontentshook\@empty +\if1\ifEtoc@lof0\fi\ifEtoc@lot0\fi1% +\else +\AtBeginDocument{% + \let\Etoc@originaladdcontentsline\addcontentsline + \def\addcontentsline{\Etoc@hackedaddcontentsline}% +}% +\fi +\ifEtoc@lof + \ifEtoc@lot + \def\Etoc@hackedaddcontentsline#1{% + \expanded{\noexpand\in@{.#1,}}{.lof,.lot,}% + \ifin@\expandafter\Etoc@hackedaddcontentsline@i + \else\expandafter\Etoc@originaladdcontentsline + \fi {#1}} + \else + \def\Etoc@hackedaddcontentsline#1{% + \expanded{\noexpand\in@{.#1,}}{.lof,}% + \ifin@\expandafter\Etoc@hackedaddcontentsline@i + \else\expandafter\Etoc@originaladdcontentsline + \fi {#1}} + \fi +\else + \def\Etoc@hackedaddcontentsline#1{% + \expanded{\noexpand\in@{.#1,}}{.lot,}% + \ifin@\expandafter\Etoc@hackedaddcontentsline@i + \else\expandafter\Etoc@originaladdcontentsline + \fi {#1}} +\fi +\def\Etoc@hackedaddcontentsline@i#1#2#3{% + \expanded{\noexpand\in@{.#1;#2,}}{.lof;figure,.lot;table,}% + \ifin@ + \addtocontents {toc}{% + \protect\contentsline{#2}{#3}{\thepage}{\ifEtoc@hyperref\@currentHref\fi}% + \ifdefined\protected@file@percent\protected@file@percent\fi + }% + \fi + \Etoc@originaladdcontentsline{#1}{#2}{#3}% +} +\unless\ifdefined\expanded + \def\Etoc@hackedaddcontentsline#1{% + {\edef\Etoc@tmp{\noexpand\in@{.#1,}{\ifEtoc@lof.lof,\fi\ifEtoc@lot.lot,\fi}}\expandafter}% + \Etoc@tmp + \ifin@\expandafter\Etoc@hackedaddcontentsline@i + \else\expandafter\Etoc@originaladdcontentsline + \fi {#1}% + } + \def\Etoc@hackedaddcontentsline@i#1#2#3{% + {\edef\Etoc@tmp{\noexpand\in@{.#1;#2,}}\expandafter}% + \Etoc@tmp{.lof;figure,.lot;table,}% + \ifin@ + \addtocontents {toc}{% + \protect\contentsline{#2}{#3}{\thepage}{\ifEtoc@hyperref\@currentHref\fi}% + \ifdefined\protected@file@percent\protected@file@percent\fi + }% + \fi + \Etoc@originaladdcontentsline{#1}{#2}{#3}% + } +\fi +\def\Etoc@@startlocallistof#1#2#3{% + \ifEtoc@localtoc + \ifnum #2=#3\relax + \global\let\etoclocaltop\Etoc@virtualtop + \global\Etoc@notactivefalse + \Etoc@@startlocaltochook + \csname etoclocallistof#1shook\endcsname + \ifEtoc@etocstyle + \csname etocetoclistof#1smaketitle\endcsname + \fi + \fi + \fi +} +\def\Etoc@@startlocallistof@setlevels#1{% + \ifnum\etoclocaltop<\z@ + \expandafter\let\csname Etoc@#1@@\endcsname\@ne + \else + \expandafter\let\csname Etoc@#1@@\expandafter\endcsname + \csname Etoc@\the\numexpr\etoclocaltop+\@ne @@\endcsname + \fi + \def\Etoc@do##1{% + \ifnum\etoclevel{##1}>\etoclocaltop + \expandafter\let\csname Etoc@##1@@\endcsname\Etoc@maxlevel + \fi}% + \Etoc@dolevels +} +\def\etoclocallistoffigureshook{\etocstandardlines} +\def\etoclocallistoftableshook {\etocstandardlines} +\def\locallistfigurename{\listfigurename} +\def\locallisttablename {\listtablename} +\def\etocetoclistoffiguresmaketitle{% + \UseName{\etocdivisionnameatlevel{\etoclocaltop+1}}*{\locallistfigurename}% + \ifnum\etoclocaltop>\tw@\mbox{}\par\fi + \etociflocalloftotoc + {\etocifisstarred + {}% star variant, do not add to toc + {\etoclocalheadtotoc + {\etocdivisionnameatlevel{\etoclocaltop+1}}% + {\locallistfigurename}% + }% + }% + {}% +}% +\def\etocetoclistoftablesmaketitle{% + \UseName{\etocdivisionnameatlevel{\etoclocaltop+1}}*{\locallisttablename}% + \ifnum\etoclocaltop>\tw@\mbox{}\par\fi + \etociflocallottotoc + {\etocifisstarred + {}% star variant, do not add to toc + {\etoclocalheadtotoc + {\etocdivisionnameatlevel{\etoclocaltop+1}}% + {\locallisttablename}% + }% + }% + {}% +}% +\let\Etoc@listofreset\@empty +\ifEtoc@lof + \def\locallistoffigures{% + \def\Etoc@listofreset{% + \let\Etoc@currext\Etoc@tocext + \let\Etoc@@startlocaltoc\Etoc@@startlocaltoc@toc + \let\Etoc@@startlocaltochook\@empty + \let\Etoc@listofreset\@empty + \let\Etoc@listofhook\@empty + }% + \let\Etoc@currext\Etoc@lofext + \def\Etoc@@startlocaltoc{\Etoc@@startlocallistof{figure}}% + \def\Etoc@@startlocaltochook{\Etoc@@startlocallistof@setlevels{figure}}% + \def\Etoc@listofhook{% + \def\Etoc@do####1{% + \expandafter\let\csname Etoc@@####1@@\endcsname\Etoc@maxlevel + }% + \Etoc@dolevels + }% + \localtableofcontents + } +\else + \def\locallistoffigures{% + \PackageError{etoc}{% + \string\locallistoffigures \on@line\space but\MessageBreak + package was loaded without `lof' option}% + {Try again with \string\usepackage[lof]{etoc}}% + } +\fi +\ifEtoc@lot + \def\locallistoftables{% + \def\Etoc@listofreset{% + \let\Etoc@currext\Etoc@tocext + \let\Etoc@@startlocaltoc\Etoc@@startlocaltoc@toc + \let\Etoc@@startlocaltochook\@empty + \let\Etoc@listofreset\@empty + \let\Etoc@listofhook\@empty + }% + \let\Etoc@currext\Etoc@lotext + \def\Etoc@@startlocaltoc{\Etoc@@startlocallistof{table}}% + \def\Etoc@@startlocaltochook{\Etoc@@startlocallistof@setlevels{table}}% + \def\Etoc@listofhook{% + \def\Etoc@do####1{% + \expandafter\let\csname Etoc@@####1@@\endcsname\Etoc@maxlevel + }% + \Etoc@dolevels + }% + \localtableofcontents + } +\else + \def\locallistoftables{% + \PackageError{etoc}{% + \string\locallistoftable \on@line\space but\MessageBreak + package was loaded without `lot' option}% + {Try again with \string\usepackage[lot]{etoc}}% + } +\fi +\def\Etoc@checkifempty {% + \global\Etoc@isemptytoctrue + \global\Etoc@stoptocfalse + \global\let\Etoc@level\Etoc@minf + \global\let\Etoc@virtualtop\Etoc@minf + \gdef\Etoc@stackofends{{-3}{}}% + \begingroup + \ifEtoc@localtoc + \def\etoc@startlocaltoc##1{% + \ifnum##1=\Etoc@tocid\relax + \global\let\etoclocaltop\Etoc@virtualtop + \Etoc@@startlocaltochook + \global\Etoc@notactivefalse + \fi + }% + \let\contentsline\Etoc@testingcontentslinelocal + \else + \let\contentsline\Etoc@testingcontentsline + \fi + \Etoc@storetocdepth + \let\Etoc@setlocaltop@doendsandbegin\@empty + \the\Etoc@toctoks + \Etoc@restoretocdepth + \endgroup +} +\DeclareRobustCommand*\etocifwasempty + {\ifEtoc@isemptytoc\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi } +\expandafter\let\expandafter\etocxifwasempty\csname etocifwasempty \endcsname +\def\Etoc@testingcontentslinelocal #1{% + \ifEtoc@stoptoc + \else + \ifnum\csname Etoc@#1@@\endcsname=\Etoc@maxlevel + \else + \global\expandafter\let\expandafter\Etoc@level\csname Etoc@#1@@\endcsname + \if @\@car#1\@nil\else\global\let\Etoc@virtualtop\Etoc@level\fi + \ifEtoc@notactive + \else + \ifnum\Etoc@level>\etoclocaltop + \unless\ifnum\Etoc@level>\c@tocdepth + \global\Etoc@isemptytocfalse + \global\Etoc@stoptoctrue + \fi + \else + \global\Etoc@stoptoctrue + \fi + \fi + \fi + \fi + \Etoc@gobblethreeorfour{}% +} +\def\Etoc@testingcontentsline #1{% + \ifEtoc@stoptoc + \else + \ifnum\csname Etoc@#1@@\endcsname=\Etoc@maxlevel + \else + \unless\ifnum\csname Etoc@#1@@\endcsname>\c@tocdepth + \global\Etoc@isemptytocfalse + \global\Etoc@stoptoctrue + \fi + \fi + \fi + \Etoc@gobblethreeorfour{}% +} +\def\Etoc@localtableofcontents#1{% + \gdef\etoclocaltop{-\@m}% + \Etoc@localtoctrue + \global\Etoc@isemptytocfalse + \edef\Etoc@tocid{#1}% + \ifnum\Etoc@tocid<\@ne + \setbox0\hbox{\ref{Unknown toc ref \@secondoftwo#1. \space Rerun LaTeX}}% + \global\Etoc@stoptoctrue + \gdef\etoclocaltop{-\thr@@}% + \Etoc@tableofcontents + \expandafter\Etoc@gobtoetoc@ + \fi + \global\Etoc@notactivetrue + \ifEtoc@checksemptiness + \Etoc@checkifempty + \fi + \ifEtoc@isemptytoc + \ifEtoc@notactive + \setbox0\hbox{\ref{Unknown toc ID \number\Etoc@tocid. \space Rerun LaTeX}}% + \global\Etoc@isemptytocfalse + \global\Etoc@stoptoctrue + \gdef\etoclocaltop{-\thr@@}% + \Etoc@tableofcontents + \expandafter\expandafter\expandafter\Etoc@gobtoetoc@ + \fi + \else + \global\Etoc@stoptocfalse + \global\Etoc@notactivetrue + \edef\etoc@startlocaltoc##1% + {\noexpand\Etoc@@startlocaltoc{##1}{\Etoc@tocid}}% + \Etoc@tableofcontents + \fi + \@gobble\etoc@ + \endgroup\ifEtoc@mustclosegroup\endgroup\fi + \Etoc@tocdepthreset + \Etoc@listofreset + \etocaftertochook +}% \Etoc@localtableofcontents +\def\Etoc@getref #1{% + \@ifundefined{r@#1} + {0} + {\expandafter\Etoc@getref@i\romannumeral-`0% + \expandafter\expandafter\expandafter + \@car\csname r@#1\endcsname0\@nil\@etoc + }% +} +\def\Etoc@getref@i#1#2\@etoc{\ifnum9<1\string#1 #1#2\else 0\fi} +\def\Etoc@ref#1{\Etoc@localtableofcontents{\Etoc@getref{#1}}} +\def\Etoc@label#1{\label{#1}\futurelet\Etoc@nexttoken\Etoc@t@bleofcontents} +\@firstofone{\def\Etoc@again} {\futurelet\Etoc@nexttoken\Etoc@t@bleofcontents} +\def\Etoc@dothis #1#2\etoc@ {\fi #1} +\def\Etoc@t@bleofcontents{% + \gdef\etoclocaltop{-\@M}% + \ifx\Etoc@nexttoken\label\Etoc@dothis{\expandafter\Etoc@label\@gobble}\fi + \ifx\Etoc@nexttoken\@sptoken\Etoc@dothis{\Etoc@again}\fi + \ifx\Etoc@nexttoken\ref\Etoc@dothis{\expandafter\Etoc@ref\@gobble}\fi + \ifEtoc@tocwithid\Etoc@dothis{\Etoc@localtableofcontents{\c@etoc@tocid}}\fi + \global\Etoc@isemptytocfalse + \ifEtoc@checksemptiness\Etoc@checkifempty\fi + \ifEtoc@isemptytoc + \ifEtoc@notocifnotoc + \expandafter\expandafter\expandafter\@gobble + \fi + \fi + \Etoc@tableofcontents + \endgroup + \ifEtoc@mustclosegroup\endgroup\fi + \Etoc@tocdepthreset + \Etoc@listofreset + \etocaftertochook + \@gobble\etoc@ + }% \Etoc@t@bleofcontents +\def\Etoc@table@fcontents{% + \refstepcounter{etoc@tocid}% + \Etoc@tocwithidfalse + \futurelet\Etoc@nexttoken\Etoc@t@bleofcontents +} +\def\Etoc@localtable@fcontents{% + \refstepcounter{etoc@tocid}% + \addtocontents{toc}{\string\etoc@startlocaltoc{\the\c@etoc@tocid}}% + \Etoc@tocwithidtrue + \futurelet\Etoc@nexttoken\Etoc@t@bleofcontents +} +\def\etoctableofcontents{% + \Etoc@openouttoc + \Etoc@tocdepthset + \begingroup + \@ifstar + {\let\Etoc@aftertitlehook\@empty\Etoc@table@fcontents} + {\def\Etoc@aftertitlehook{\etocaftertitlehook}\Etoc@table@fcontents}% +}% \etoctableofcontents +\def\etocifisstarred{\ifx\Etoc@aftertitlehook\@empty + \expandafter\@firstoftwo\else + \expandafter\@secondoftwo + \fi} +\let\etocoriginaltableofcontents\tableofcontents +\let\tableofcontents\etoctableofcontents +\let\Etoc@listofhook\@empty +\newcommand*\localtableofcontents{% + \Etoc@openouttoc + \Etoc@tocdepthset + \begingroup + \Etoc@listofhook + \@ifstar + {\let\Etoc@aftertitlehook\@empty\Etoc@localtable@fcontents} + {\def\Etoc@aftertitlehook{\etocaftertitlehook}\Etoc@localtable@fcontents}% +}% \localtableofcontents +\newcommand*\localtableofcontentswithrelativedepth[1]{% + \def\Etoc@@startlocaltochook{% + \global\c@tocdepth\numexpr\etoclocaltop+#1\relax + }% + \def\Etoc@listofreset{\let\Etoc@@startlocaltochook\@empty + \let\Etoc@listofreset\@empty}% + \localtableofcontents +}% \localtableofcontentswithrelativedepth +\newcommand\etocsettocstyle[2]{% + \Etoc@etocstylefalse + \Etoc@classstylefalse + \def\Etoc@tableofcontents@user@before{#1}% + \def\Etoc@tableofcontents@user@after {#2}% +}% +\def\etocstoretocstyleinto#1{% +%% \@ifdefinable#1{% + \edef#1{\noexpand\Etoc@etocstylefalse\noexpand\Etoc@classstylefalse + \def\noexpand\Etoc@tableofcontents@user@before{% + \unexpanded\expandafter{\Etoc@tableofcontents@user@before}% + }% + \def\noexpand\Etoc@tableofcontents@user@after{% + \unexpanded\expandafter{\Etoc@tableofcontents@user@after}% + }% + }% +%% }% +}% +\def\Etoc@tableofcontents {% + \Etoc@tableofcontents@etoc@before + \ifEtoc@localtoc\ifEtoc@etocstyle\expandafter\expandafter\expandafter\@gobble\fi\fi + \Etoc@tableofcontents@user@before + \Etoc@tableofcontents@contents + \ifEtoc@localtoc\ifEtoc@etocstyle\expandafter\expandafter\expandafter\@gobble\fi\fi + \Etoc@tableofcontents@user@after + \Etoc@tableofcontents@etoc@after + \@gobble\etoc@ +} +\def\Etoc@tableofcontents@etoc@before{% + \ifnum\c@tocdepth>\Etoc@minf + \else + \expandafter\Etoc@gobtoetoc@ + \fi + \Etoc@par + \Etoc@beforetitlehook + \etocbeforetitlehook + \Etoc@storetocdepth + \let\Etoc@savedcontentsline\contentsline + \let\contentsline\Etoc@etoccontentsline + \ifEtoc@standardlines + \else + \def\Etoc@do##1{% + \expandafter\def\csname etocsaved##1tocline\endcsname + {\PackageError{etoc}{% + \expandafter\string\csname etocsaved##1tocline\endcsname\space + has been deprecated\MessageBreak + at 1.1a and is removed at 1.2.\MessageBreak + Use \expandafter\string\csname l@##1\endcsname\space directly.\MessageBreak + Reported \on@line}% + {I will use \expandafter\string + \csname l@##1\endcsname\space myself for this time.% + }% + \csname l@##1\endcsname + }% + }% + \Etoc@dolevels + \fi +}% +\def\Etoc@tableofcontents@contents{% + \Etoc@tocdepthset + \ifEtoc@parskip\parskip\z@skip\fi + \Etoc@aftertitlehook + \gdef\etoclocaltop{-\thr@@}% + \Etoc@toctoc + \etocaftercontentshook +}% +\def\Etoc@tableofcontents@etoc@after{% + \@nobreakfalse + \Etoc@restoretocdepth + \ifx\Etoc@global\global + \@ifundefined{tof@finish} + {} + {\ifx\tof@finish\@empty + \else + \global\let\contentsline\Etoc@savedcontentsline + \fi + }% + \fi +} +\def\etocsetstyle#1{\ifcsname Etoc@#1@@\endcsname + \expandafter\Etoc@setstyle@a + \else + \expandafter\Etoc@setstyle@error + \fi {#1}% +} +\def\Etoc@setstyle@error #1{% + \PackageWarning{etoc}{`#1' is unknown to etoc. \space Did you\MessageBreak + forget some \string\etocsetlevel{#1}{}?\MessageBreak + Reported}% + \@gobblefour +} +\def\Etoc@setstyle@a #1{% + \edef\Etoc@tmp{\the\numexpr\csname Etoc@#1@@\endcsname}% + \if1\unless\ifnum\Etoc@tmp<\Etoc@maxlevel 0\fi + \unless\ifnum\Etoc@tmp>\Etoc@minf 0\fi1% + \Etoc@standardlinesfalse + \expandafter\Etoc@setstyle@b\expandafter\Etoc@tmp + \else + \ifnum\Etoc@tmp=\Etoc@maxlevel + \in@{.#1,}{.figure,.table,}% + \ifin@ + \PackageWarning{etoc} + {You can not use \string\etocsetstyle\space with `#1'.\MessageBreak + Check the package documentation (in particular about\MessageBreak + \string\etoclocallistoffigureshook/\string\etoclocallistoftableshook)% + \MessageBreak on how to customize + figure and table entries in local\MessageBreak lists. Reported}% + \else + \PackageInfo{etoc} + {Attempt to set the style of `#1',\MessageBreak + whose level is currently the maximal one \etocthemaxlevel,\MessageBreak + which is never displayed. \space This will be ignored\MessageBreak + but note that we do quit compatibility mode.\MessageBreak + Reported}% + \Etoc@standardlinesfalse + \fi + \else + \PackageWarning{etoc}{This should not happen. Reported}% + \fi + \expandafter\@gobblefour + \fi +} +\long\def\Etoc@setstyle@b#1#2#3#4#5{% + \expandafter\def\csname Etoc@begin@#1\endcsname {#2}% + \expandafter\def\csname Etoc@prefix@#1\endcsname {#3}% + \expandafter\def\csname Etoc@contents@#1\endcsname {#4}% + \expandafter\def\csname Etoc@end@#1\endcsname {#5}% +} +\def\Etoc@setstyle@e#1{% + \expandafter\let\csname Etoc@begin@#1\endcsname \@empty + \expandafter\let\csname Etoc@prefix@#1\endcsname \@empty + \expandafter\let\csname Etoc@contents@#1\endcsname \@empty + \expandafter\let\csname Etoc@end@#1\endcsname \@empty +} +\def\Etoc@storelines@a#1{% + \noexpand\Etoc@setstyle@b{#1}% + {\expandafter\Etoc@expandonce\csname Etoc@begin@#1\endcsname}% + {\expandafter\Etoc@expandonce\csname Etoc@prefix@#1\endcsname}% + {\expandafter\Etoc@expandonce\csname Etoc@contents@#1\endcsname}% + {\expandafter\Etoc@expandonce\csname Etoc@end@#1\endcsname}% +} +\def\Etoc@expandonce#1{\unexpanded\expandafter{#1}} +\def\etocstorelinestylesinto#1{% + \edef#1{\Etoc@storelines@a{-2}\Etoc@storelines@a{-1}\Etoc@storelines@a{0}% + \Etoc@storelines@a {1}\Etoc@storelines@a {2}\Etoc@storelines@a{3}% + \Etoc@storelines@a {4}\Etoc@storelines@a {5}% + \ifEtoc@deeplevels + \Etoc@storelines@a{6}\Etoc@storelines@a{7}\Etoc@storelines@a{8}% + \Etoc@storelines@a{9}\Etoc@storelines@a{10}\Etoc@storelines@a{11}% + \fi + }% +} +\def\etocstorethislinestyleinto#1#2{% + \edef#2{\expandafter\Etoc@storelines@a\expandafter{\number\etoclevel{#1}}}% +}% +\def\etocfontminustwo {\normalfont \LARGE \bfseries} +\def\etocfontminusone {\normalfont \large \bfseries} +\def\etocfontzero {\normalfont \large \bfseries} +\def\etocfontone {\normalfont \normalsize \bfseries} +\def\etocfonttwo {\normalfont \normalsize} +\def\etocfontthree {\normalfont \footnotesize} +\def\etocsepminustwo {4ex \@plus .5ex \@minus .5ex} +\def\etocsepminusone {4ex \@plus .5ex \@minus .5ex} +\def\etocsepzero {2.5ex \@plus .4ex \@minus .4ex} +\def\etocsepone {1.5ex \@plus .3ex \@minus .3ex} +\def\etocseptwo {.5ex \@plus .1ex \@minus .1ex} +\def\etocsepthree {.25ex \@plus .05ex \@minus .05ex} +\def\etocbaselinespreadminustwo {1} +\def\etocbaselinespreadminusone {1} +\def\etocbaselinespreadzero {1} +\def\etocbaselinespreadone {1} +\def\etocbaselinespreadtwo {1} +\def\etocbaselinespreadthree {.9} +\def\etocminustwoleftmargin {1.5em plus 0.5fil} +\def\etocminustworightmargin {1.5em plus -0.5fil} +\def\etocminusoneleftmargin {1em} +\def\etocminusonerightmargin {1em} +\def\etoctoclineleaders + {\hbox{\normalfont\normalsize\hb@xt@2ex {\hss.\hss}}} +\def\etocabbrevpagename {p.~} +\def\etocpartname {Part} +\def\etocbookname {Book} +\def\etocdefaultlines{% + \Etoc@standardlinesfalse + \etocdefaultlines@setbook + \etocdefaultlines@setpart + \etocdefaultlines@setchapter + \etocdefaultlines@setsection + \etocdefaultlines@setsubsection + \etocdefaultlines@setsubsubsection + \etocdefaultlines@setdeeperones +} +\def\etocnoprotrusion{\leavevmode\kern-\p@\kern\p@} +\@ifclassloaded{memoir}{% + \def\etocdefaultlines@setbook{% + \Etoc@setstyle@b + {-2}% + {\addpenalty\@M\etocskipfirstprefix} + {\addpenalty\@secpenalty} + {\begingroup + \etocfontminustwo + \addvspace{\etocsepminustwo}% + \parindent \z@ + \leftskip \etocminustwoleftmargin + \rightskip \etocminustworightmargin + \parfillskip \@flushglue + \vbox{\etocifnumbered{\etoclink{\etocbookname\enspace\etocthenumber:\quad}}{}% + \etocname + \baselineskip\etocbaselinespreadminustwo\baselineskip + \par}% + \addpenalty\@M\addvspace{\etocsepminusone}% + \endgroup} + {}% + } + }{\let\etocdefaultlines@setbook\@empty} +\def\etocdefaultlines@setpart{% +\Etoc@setstyle@b + {-1}% + {\addpenalty\@M\etocskipfirstprefix} + {\addpenalty\@secpenalty} + {\begingroup + \etocfontminusone + \addvspace{\etocsepminusone}% + \parindent \z@ + \leftskip \etocminusoneleftmargin + \rightskip \etocminusonerightmargin + \parfillskip \@flushglue + \vbox{\etocifnumbered{\etoclink{\etocpartname\enspace\etocthenumber.\quad}}{}% + \etocname + \baselineskip\etocbaselinespreadminusone\baselineskip + \par}% + \addpenalty\@M\addvspace{\etocsepzero}% + \endgroup} + {}% +} +\def\etocdefaultlines@setchapter{% +\Etoc@setstyle@b + {0}% + {\addpenalty\@M\etocskipfirstprefix} + {\addpenalty\@itempenalty} + {\begingroup + \etocfontzero + \addvspace{\etocsepzero}% + \parindent \z@ \parfillskip \@flushglue + \vbox{\etocifnumbered{\etocnumber.\enspace}{}\etocname + \baselineskip\etocbaselinespreadzero\baselineskip + \par}% + \endgroup} + {\addpenalty{-\@highpenalty}\addvspace{\etocsepminusone}}% +} +\def\etocdefaultlines@setsection{% +\Etoc@setstyle@b + {1}% + {\addpenalty\@M\etocskipfirstprefix} + {\addpenalty\@itempenalty} + {\begingroup + \etocfontone + \addvspace{\etocsepone}% + \parindent \z@ \parfillskip \z@ + \setbox\z@\vbox{\parfillskip\@flushglue + \etocname\par + \setbox\tw@\lastbox + \global\setbox\@ne\hbox{\unhbox\tw@\ }}% + \dimen\z@=\wd\@ne + \setbox\z@=\etoctoclineleaders + \advance\dimen\z@\wd\z@ + \etocifnumbered + {\setbox\tw@\hbox{\etocnumber, \etocabbrevpagename\etocpage\etocnoprotrusion}} + {\setbox\tw@\hbox{\etocabbrevpagename\etocpage\etocnoprotrusion}}% + \advance\dimen\z@\wd\tw@ + \ifdim\dimen\z@ < \linewidth + \vbox{\etocname~% + \leaders\box\z@\hfil\box\tw@ + \baselineskip\etocbaselinespreadone\baselineskip + \par}% + \else + \vbox{\etocname~% + \leaders\copy\z@\hfil\break + \hbox{}\leaders\box\z@\hfil\box\tw@ + \baselineskip\etocbaselinespreadone\baselineskip + \par}% + \fi + \endgroup} + {\addpenalty\@secpenalty\addvspace{\etocsepzero}}% +} +\def\etocdefaultlines@setsubsection{% +\Etoc@setstyle@b + {2}% + {\addpenalty\@medpenalty\etocskipfirstprefix} + {\addpenalty\@itempenalty} + {\begingroup + \etocfonttwo + \addvspace{\etocseptwo}% + \parindent \z@ \parfillskip \z@ + \setbox\z@\vbox{\parfillskip\@flushglue + \etocname\par\setbox\tw@\lastbox + \global\setbox\@ne\hbox{\unhbox\tw@}}% + \dimen\z@=\wd\@ne + \setbox\z@=\etoctoclineleaders + \advance\dimen\z@\wd\z@ + \etocifnumbered + {\setbox\tw@\hbox{\etocnumber, \etocabbrevpagename\etocpage\etocnoprotrusion}} + {\setbox\tw@\hbox{\etocabbrevpagename\etocpage\etocnoprotrusion}}% + \advance\dimen\z@\wd\tw@ + \ifdim\dimen\z@ < \linewidth + \vbox{\etocname~% + \leaders\box\z@\hfil\box\tw@ + \baselineskip\etocbaselinespreadtwo\baselineskip + \par}% + \else + \vbox{\etocname~% + \leaders\copy\z@\hfil\break + \hbox{}\leaders\box\z@\hfil\box\tw@ + \baselineskip\etocbaselinespreadtwo\baselineskip + \par}% + \fi + \endgroup} + {\addpenalty\@secpenalty\addvspace{\etocsepone}}% +} +\def\etocdefaultlines@setsubsubsection{% +\Etoc@setstyle@b + {3}% + {\addpenalty\@M + \etocfontthree + \vspace{\etocsepthree}% + \noindent + \etocskipfirstprefix} + {\allowbreak\,--\,} + {\etocname} + {.\hfil + \begingroup + \baselineskip\etocbaselinespreadthree\baselineskip + \par + \endgroup + \addpenalty{-\@highpenalty}} +} +\def\etocdefaultlines@setdeeperones{% +\Etoc@setstyle@e{4}% +\Etoc@setstyle@e{5}% +\ifEtoc@deeplevels + \Etoc@setstyle@e{6}% + \Etoc@setstyle@e{7}% + \Etoc@setstyle@e{8}% + \Etoc@setstyle@e{9}% + \Etoc@setstyle@e{10}% + \Etoc@setstyle@e{11}% +\fi +} +\def\etocabovetocskip{3.5ex \@plus 1ex \@minus .2ex} +\def\etocbelowtocskip{3.5ex \@plus 1ex \@minus .2ex} +\def\etoccolumnsep{2em} +\def\etocmulticolsep{0ex} +\def\etocmulticolpretolerance{-1} +\def\etocmulticoltolerance{200} +\def\etocdefaultnbcol{2} +\def\etocinnertopsep{2ex} +\newcommand\etocmulticolstyle[2][\etocdefaultnbcol]{% +\etocsettocstyle + {\let\etocoldpar\par + \addvspace{\etocabovetocskip}% + \ifnum #1>\@ne + \expandafter\@firstoftwo + \else \expandafter\@secondoftwo + \fi + {\multicolpretolerance\etocmulticolpretolerance + \multicoltolerance\etocmulticoltolerance + \setlength{\columnsep}{\etoccolumnsep}% + \setlength{\multicolsep}{\etocmulticolsep}% + \begin{multicols}{#1}[#2\etocoldpar\addvspace{\etocinnertopsep}]} + {#2\ifvmode\else\begingroup\interlinepenalty\@M\parskip\z@skip + \@@par\endgroup + \fi + \nobreak\addvspace{\etocinnertopsep}% + \pretolerance\etocmulticolpretolerance + \tolerance\etocmulticoltolerance}% + }% + {\ifnum #1>\@ne + \expandafter\@firstofone + \else \expandafter\@gobble + \fi + {\end{multicols}}% + \addvspace{\etocbelowtocskip}}% +} +\def\etocinnerbottomsep{3.5ex} +\def\etocinnerleftsep{2em} +\def\etocinnerrightsep{2em} +\def\etoctoprule{\hrule} +\def\etocleftrule{\vrule} +\def\etocrightrule{\vrule} +\def\etocbottomrule{\hrule} +\def\etoctoprulecolorcmd{\relax} +\def\etocbottomrulecolorcmd{\relax} +\def\etocleftrulecolorcmd{\relax} +\def\etocrightrulecolorcmd{\relax} +\def\etoc@ruledheading #1{% + \hb@xt@\linewidth{\color@begingroup + \hss #1\hss\hskip-\linewidth + \etoctoprulecolorcmd\leaders\etoctoprule\hss + \phantom{#1}% + \leaders\etoctoprule\hss\color@endgroup}% + \nointerlineskip\nobreak\vskip\etocinnertopsep} +\newcommand*\etocruledstyle[2][\etocdefaultnbcol]{% +\etocsettocstyle + {\addvspace{\etocabovetocskip}% + \ifnum #1>\@ne + \expandafter\@firstoftwo + \else \expandafter\@secondoftwo + \fi + {\multicolpretolerance\etocmulticolpretolerance + \multicoltolerance\etocmulticoltolerance + \setlength{\columnsep}{\etoccolumnsep}% + \setlength{\multicolsep}{\etocmulticolsep}% + \begin{multicols}{#1}[\etoc@ruledheading{#2}]} + {\etoc@ruledheading{#2}% + \pretolerance\etocmulticolpretolerance + \tolerance\etocmulticoltolerance}} + {\ifnum #1>\@ne\expandafter\@firstofone + \else \expandafter\@gobble + \fi + {\end{multicols}}% + \addvspace{\etocbelowtocskip}}} +\def\etocframedmphook{\relax} +\long\def\etocbkgcolorcmd{\relax} +\long\def\Etoc@relax{\relax} +\newbox\etoc@framed@titlebox +\newbox\etoc@framed@contentsbox +\newcommand*\etocframedstyle[2][\etocdefaultnbcol]{% +\etocsettocstyle{% + \addvspace{\etocabovetocskip}% + \sbox\z@{#2}% + \dimen\z@\dp\z@ + \ifdim\wd\z@<\linewidth \dp\z@\z@ \else \dimen\z@\z@ \fi + \setbox\etoc@framed@titlebox=\hb@xt@\linewidth{\color@begingroup + \hss + \ifx\etocbkgcolorcmd\Etoc@relax + \else + \sbox\tw@{\color{white}% + \vrule\@width\wd\z@\@height\ht\z@\@depth\dimen\z@}% + \ifdim\wd\z@<\linewidth \dp\tw@\z@\fi + \box\tw@ + \hskip-\wd\z@ + \fi + \copy\z@ + \hss + \hskip-\linewidth + \etoctoprulecolorcmd\leaders\etoctoprule\hss + \hskip\wd\z@ + \etoctoprulecolorcmd\leaders\etoctoprule\hss\color@endgroup}% + \setbox\z@\hbox{\etocleftrule\etocrightrule}% + \dimen\tw@\linewidth\advance\dimen\tw@-\wd\z@ + \advance\dimen\tw@-\etocinnerleftsep + \advance\dimen\tw@-\etocinnerrightsep + \setbox\etoc@framed@contentsbox=\vbox\bgroup + \hsize\dimen\tw@ + \kern\dimen\z@ + \vskip\etocinnertopsep + \hbox\bgroup + \begin{minipage}{\hsize}% + \etocframedmphook + \ifnum #1>\@ne + \expandafter\@firstoftwo + \else \expandafter\@secondoftwo + \fi + {\multicolpretolerance\etocmulticolpretolerance + \multicoltolerance\etocmulticoltolerance + \setlength{\columnsep}{\etoccolumnsep}% + \setlength{\multicolsep}{\etocmulticolsep}% + \begin{multicols}{#1}} + {\pretolerance\etocmulticolpretolerance + \tolerance\etocmulticoltolerance}} + {\ifnum #1>\@ne\expandafter\@firstofone + \else \expandafter\@gobble + \fi + {\end{multicols}\unskip }% + \end{minipage}% + \egroup + \vskip\etocinnerbottomsep + \egroup + \vbox{\hsize\linewidth + \ifx\etocbkgcolorcmd\Etoc@relax + \else + \kern\ht\etoc@framed@titlebox + \kern\dp\etoc@framed@titlebox + \hb@xt@\linewidth{\color@begingroup + \etocleftrulecolorcmd\etocleftrule + \etocbkgcolorcmd + \leaders\vrule + \@height\ht\etoc@framed@contentsbox + \@depth\dp\etoc@framed@contentsbox + \hss + \etocrightrulecolorcmd\etocrightrule + \color@endgroup}\nointerlineskip + \vskip-\dp\etoc@framed@contentsbox + \vskip-\ht\etoc@framed@contentsbox + \vskip-\dp\etoc@framed@titlebox + \vskip-\ht\etoc@framed@titlebox + \fi + \box\etoc@framed@titlebox\nointerlineskip + \hb@xt@\linewidth{\color@begingroup + {\etocleftrulecolorcmd\etocleftrule}% + \hss\box\etoc@framed@contentsbox\hss + \etocrightrulecolorcmd\etocrightrule\color@endgroup} + \nointerlineskip + \vskip\ht\etoc@framed@contentsbox + \vskip\dp\etoc@framed@contentsbox + \hb@xt@\linewidth{\color@begingroup\etocbottomrulecolorcmd + \leaders\etocbottomrule\hss\color@endgroup}} + \addvspace{\etocbelowtocskip}}} +\newcommand\etoc@multicoltoc[2][\etocdefaultnbcol]{% + \etocmulticolstyle[#1]{#2}% + \tableofcontents} +\newcommand\etoc@multicoltoci[2][\etocdefaultnbcol]{% + \etocmulticolstyle[#1]{#2}% + \tableofcontents*} +\newcommand\etoc@local@multicoltoc[2][\etocdefaultnbcol]{% + \etocmulticolstyle[#1]{#2}% + \localtableofcontents} +\newcommand\etoc@local@multicoltoci[2][\etocdefaultnbcol]{% + \etocmulticolstyle[#1]{#2}% + \localtableofcontents*} +\newcommand*\etoc@ruledtoc[2][\etocdefaultnbcol]{% + \etocruledstyle[#1]{#2}% + \tableofcontents} +\newcommand*\etoc@ruledtoci[2][\etocdefaultnbcol]{% + \etocruledstyle[#1]{#2}% + \tableofcontents*} +\newcommand*\etoc@local@ruledtoc[2][\etocdefaultnbcol]{% + \etocruledstyle[#1]{#2}% + \localtableofcontents} +\newcommand*\etoc@local@ruledtoci[2][\etocdefaultnbcol]{% + \etocruledstyle[#1]{#2}% + \localtableofcontents*} +\newcommand*\etoc@framedtoc[2][\etocdefaultnbcol]{% + \etocframedstyle[#1]{#2}% + \tableofcontents} +\newcommand*\etoc@framedtoci[2][\etocdefaultnbcol]{% + \etocframedstyle[#1]{#2}% + \tableofcontents*} +\newcommand*\etoc@local@framedtoc[2][\etocdefaultnbcol]{% + \etocframedstyle[#1]{#2}% + \localtableofcontents} +\newcommand*\etoc@local@framedtoci[2][\etocdefaultnbcol]{% + \etocframedstyle[#1]{#2}% + \localtableofcontents*} +\def\etocmulticol{\begingroup + \Etoc@mustclosegrouptrue + \@ifstar + {\etoc@multicoltoci} + {\etoc@multicoltoc}} +\def\etocruled{\begingroup + \Etoc@mustclosegrouptrue + \@ifstar + {\etoc@ruledtoci} + {\etoc@ruledtoc}} +\def\etocframed{\begingroup + \Etoc@mustclosegrouptrue + \@ifstar + {\etoc@framedtoci} + {\etoc@framedtoc}} +\def\etoclocalmulticol{\begingroup + \Etoc@mustclosegrouptrue + \@ifstar + {\etoc@local@multicoltoci} + {\etoc@local@multicoltoc}} +\def\etoclocalruled{\begingroup + \Etoc@mustclosegrouptrue + \@ifstar + {\etoc@local@ruledtoci} + {\etoc@local@ruledtoc}} +\def\etoclocalframed{\begingroup + \Etoc@mustclosegrouptrue + \@ifstar + {\etoc@local@framedtoci} + {\etoc@local@framedtoc}} +\def\etocmemoirtoctotocfmt #1#2{% + \PackageWarning{etoc} + {\string\etocmemoirtoctotocfmt\space is deprecated.\MessageBreak + Use in its place \string\etocsettoclineforclasstoc,\MessageBreak + and \string\etocsettoclineforclasslistof{toc} (or {lof}, {lot}). + I will do this now.\MessageBreak + Reported}% + \etocsettoclineforclasstoc{#1}{#2}% + \etocsettoclineforclasslistof{toc}{#1}{#2}% +} +\def\etocsettoclineforclasstoc #1#2{% + \def\etocclassmaintocaddtotoc{\etocglobalheadtotoc{#1}{#2}}% +} +\def\etocsettoclineforclasslistof #1#2#3{% + \@namedef{etocclasslocal#1addtotoc}{\etoclocalheadtotoc{#2}{#3}}% +} +\let\etocclasslocaltocaddtotoc\@empty +\let\etocclasslocallofaddtotoc\@empty +\let\etocclasslocallotaddtotoc\@empty +\ifdefined\c@chapter + \def\etocclasslocaltocmaketitle{\section*{\localcontentsname}} + \def\etocclasslocallofmaketitle{\section*{\locallistfigurename}} + \def\etocclasslocallotmaketitle{\section*{\locallisttablename}} + \etocsettoclineforclasstoc {chapter}{\contentsname} + \etocsettoclineforclasslistof{toc}{section}{\localcontentsname} + \etocsettoclineforclasslistof{lof}{section}{\locallistfigurename} + \etocsettoclineforclasslistof{lot}{section}{\locallisttablename} +\else + \def\etocclasslocaltocmaketitle{\subsection*{\localcontentsname}}% + \def\etocclasslocallofmaketitle{\subsection*{\locallistfigurename}}% + \def\etocclasslocallotmaketitle{\subsection*{\locallisttablename}}% + \etocsettoclineforclasstoc {section}{\contentsname} + \etocsettoclineforclasslistof{toc}{subsection}{\localcontentsname} + \etocsettoclineforclasslistof{lof}{subsection}{\locallistfigurename} + \etocsettoclineforclasslistof{lot}{subsection}{\locallisttablename} +\fi +\def\etocclasslocalperhapsaddtotoc #1{% + \etocifisstarred + {} + {\csname ifEtoc@local#1totoc\endcsname + \csname etocclasslocal#1addtotoc\endcsname + \fi + }% +} +\def\etocarticlestyle{% + \etocsettocstyle + {\ifEtoc@localtoc + \@nameuse{etocclasslocal\Etoc@currext maketitle}% + \etocclasslocalperhapsaddtotoc\Etoc@currext + \else + \section *{\contentsname + \@mkboth {\MakeUppercase \contentsname} + {\MakeUppercase \contentsname}}% + \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}% + \fi + } + {}% +} +\def\etocarticlestylenomarks{% + \etocsettocstyle + {\ifEtoc@localtoc + \@nameuse{etocclasslocal\Etoc@currext maketitle}% + \etocclasslocalperhapsaddtotoc\Etoc@currext + \else + \section *{\contentsname}% + \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}% + \fi + } + {}% +} +\def\etocbookstyle{% + \etocsettocstyle + {\if@twocolumn \@restonecoltrue \onecolumn \else \@restonecolfalse \fi + \ifEtoc@localtoc + \@nameuse{etocclasslocal\Etoc@currext maketitle}% + \etocclasslocalperhapsaddtotoc\Etoc@currext + \else + \chapter *{\contentsname + \@mkboth {\MakeUppercase \contentsname} + {\MakeUppercase \contentsname}}% + \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}% + \fi + }% + {\if@restonecol \twocolumn \fi}% +} +\def\etocbookstylenomarks{% + \etocsettocstyle + {\if@twocolumn \@restonecoltrue \onecolumn \else \@restonecolfalse \fi + \ifEtoc@localtoc + \@nameuse{etocclasslocal\Etoc@currext maketitle}% + \etocclasslocalperhapsaddtotoc\Etoc@currext + \else + \chapter *{\contentsname}% + \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}% + \fi + }% + {\if@restonecol \twocolumn \fi}% +} +\let\etocreportstyle\etocbookstyle +\let\etocreportstylenomarks\etocbookstylenomarks +\def\etocmemoirstyle{% + \etocsettocstyle + {\ensureonecol \par \begingroup \phantomsection + \ifx\Etoc@aftertitlehook\@empty + \else + \ifmem@em@starred@listof + \else + \ifEtoc@localtoc + \etocclasslocalperhapsaddtotoc\Etoc@currext + \else + \ifEtoc@maintoctotoc + \etocclassmaintocaddtotoc + \fi + \fi + \fi + \fi + \ifEtoc@localtoc + \@namedef{@\Etoc@currext maketitle}{% + \@nameuse{etocclasslocal\Etoc@currext maketitle}% + }% + \fi + \@nameuse {@\Etoc@currext maketitle} %<< space token here from memoir code + \ifx\Etoc@aftertitlehook\@empty + \else + \Etoc@aftertitlehook \let \Etoc@aftertitlehook \relax + \fi + \parskip \cftparskip \@nameuse {cft\Etoc@currext beforelisthook}% + }% + {\@nameuse {cft\Etoc@currext afterlisthook}% + \endgroup\restorefromonecol + }% +} +\let\Etoc@beforetitlehook\@empty +\if1\@ifclassloaded{scrartcl}0{\@ifclassloaded{scrbook}0{\@ifclassloaded{scrreprt}01}}% +\expandafter\@gobble +\else + \ifdefined\setuptoc + \def\Etoc@beforetitlehook{% + \ifEtoc@localtoc + \etocclasslocalperhapsaddtotoc\Etoc@currext + \setuptoc{\Etoc@currext}{leveldown}% + \else + \etocifisstarred{}{\etocifmaintoctotoc{\setuptoc{toc}{totoc}}}% + \fi + }% + \fi +\expandafter\@firstofone +\fi +{\def\etocclasslocalperhapsaddtotoc #1{% + \etocifisstarred + {}% + {\csname ifEtoc@local#1totoc\endcsname + \setuptoc{\Etoc@currext}{totoc}% + \fi + }% + }% +} +\ifdefined\Iftocfeature + \def\etoc@Iftocfeature{\Iftocfeature}% +\else + \def\etoc@Iftocfeature{\iftocfeature}% +\fi +\def\etocscrartclstyle{% + \etocsettocstyle + {\ifx\Etoc@currext\Etoc@tocext + \expandafter\@firstofone + \else + \expandafter\@gobble + \fi + {\let\if@dynlist\if@tocleft}% + \edef\@currext{\Etoc@currext}% + \@ifundefined{listof\@currext name}% + {\def\list@fname{\listofname~\@currext}}% + {\expandafter\let\expandafter\list@fname + \csname listof\@currext name\endcsname}% + \etoc@Iftocfeature {\@currext}{onecolumn} + {\etoc@Iftocfeature {\@currext}{leveldown} + {} + {\if@twocolumn \aftergroup \twocolumn \onecolumn \fi }} + {}% + \etoc@Iftocfeature {\@currext}{numberline}% + {\def \nonumberline {\numberline {}}}{}% + \expandafter\tocbasic@listhead\expandafter {\list@fname}% + \begingroup \expandafter \expandafter \expandafter + \endgroup \expandafter + \ifx + \csname microtypesetup\endcsname \relax + \else + \etoc@Iftocfeature {\@currext}{noprotrusion}{} + {\microtypesetup {protrusion=false}% + \PackageInfo {tocbasic}% + {character protrusion at \@currext\space deactivated}}% + \fi + \etoc@Iftocfeature{\@currext}{noparskipfake}{}{% + \ifvmode \@tempskipa\lastskip \vskip-\lastskip + \addtolength{\@tempskipa}{\parskip}\vskip\@tempskipa\fi + }% + \setlength {\parskip }{\z@ }% + \setlength {\parindent }{\z@ }% + \setlength {\parfillskip }{\z@ \@plus 1fil}% + \csname tocbasic@@before@hook\endcsname + \csname tb@\@currext @before@hook\endcsname + }% end of before_toc + {% start of after_toc + \providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file + \edef\@currext{\Etoc@currext}% + \csname tb@\@currext @after@hook\endcsname + \csname tocbasic@@after@hook\endcsname + }% end of after_toc +} +\let\etocscrbookstyle\etocscrartclstyle +\let\etocscrreprtstyle\etocscrartclstyle +\def\etocclasstocstyle{\etocarticlestyle} +\newcommand*\etocmarkboth[1]{% + \@mkboth{\MakeUppercase{#1}}{\MakeUppercase{#1}}} +\newcommand*\etocmarkbothnouc[1]{\@mkboth{#1}{#1}} +\newcommand\etoctocstyle[3][section]{\etocmulticolstyle[#2]% + {\csname #1\endcsname *{#3}}} +\newcommand\etoctocstylewithmarks[4][section]{\etocmulticolstyle[#2]% + {\csname #1\endcsname *{#3\etocmarkboth{#4}}}} +\newcommand\etoctocstylewithmarksnouc[4][section]{\etocmulticolstyle[#2]% + {\csname #1\endcsname *{#3\etocmarkbothnouc{#4}}}} +\def\Etoc@redefetocstylesforchapters{% + \renewcommand\etoctocstylewithmarks[4][chapter]{% + \etocmulticolstyle[##2]{\csname ##1\endcsname *{##3\etocmarkboth{##4}}}% + } + \renewcommand\etoctocstylewithmarksnouc[4][chapter]{% + \etocmulticolstyle[##2]{\csname ##1\endcsname *{##3\etocmarkbothnouc{##4}}}% + } + \renewcommand\etoctocstyle[3][chapter]{% + \etocmulticolstyle[##2]{\csname ##1\endcsname *{##3}} + } +} +\@ifclassloaded{scrartcl} + {\renewcommand*\etocclasstocstyle{\etocscrartclstyle}}{} +\@ifclassloaded{book} + {\renewcommand*\etocfontone{\normalfont\normalsize} + \renewcommand*\etocclasstocstyle{\etocbookstyle} + \Etoc@redefetocstylesforchapters}{} +\@ifclassloaded{report} + {\renewcommand*\etocfontone{\normalfont\normalsize} + \renewcommand*\etocclasstocstyle{\etocreportstyle} + \Etoc@redefetocstylesforchapters}{} +\@ifclassloaded{scrbook} + {\renewcommand*\etocfontone{\normalfont\normalsize} + \renewcommand*\etocclasstocstyle{\etocscrbookstyle} + \Etoc@redefetocstylesforchapters}{} +\@ifclassloaded{scrreprt} + {\renewcommand*\etocfontone{\normalfont\normalsize} + \renewcommand*\etocclasstocstyle{\etocscrreprtstyle} + \Etoc@redefetocstylesforchapters}{} +\@ifclassloaded{memoir} + {\renewcommand*\etocfontone{\normalfont\normalsize} + \renewcommand*\etocclasstocstyle{\etocmemoirstyle} + \Etoc@redefetocstylesforchapters}{} +\def\etoctocloftstyle {% + \etocsettocstyle{% + \@cfttocstart + \par + \begingroup + \parindent\z@ \parskip\cftparskip + \@nameuse{@cftmake\Etoc@currext title}% + \ifEtoc@localtoc + \etoctocloftlocalperhapsaddtotoc\Etoc@currext + \else + \etocifisstarred {}{\ifEtoc@maintoctotoc\@cftdobibtoc\fi}% + \fi + }% + {% + \endgroup + \@cfttocfinish + }% +} +\def\etoctocloftlocalperhapsaddtotoc#1{% + \etocifisstarred + {}% + {\csname ifEtoc@local#1totoc\endcsname + \ifdefined\c@chapter\def\@tocextra{@section}\else\def\@tocextra{@subsection}\fi + \csname @cftdobib#1\endcsname + \fi + }% +} +\def\etoctocbibindstyle {% + \etocsettocstyle {% + \toc@start + \ifEtoc@localtoc + \@nameuse{etocclasslocal\Etoc@currext maketitle}% + \etocclasslocalperhapsaddtotoc\Etoc@currext + \else + \etoc@tocbibind@dotoctitle + \fi + }% + {\toc@finish}% +} +\def\etoc@tocbibind@dotoctitle {% + \if@bibchapter + \etocifisstarred + {\chapter*{\contentsname}\prw@mkboth{\contentsname} % id. + }% + {\ifEtoc@maintoctotoc + \toc@chapter{\contentsname} %<-space from original + \else + \chapter*{\contentsname}\prw@mkboth{\contentsname} % id. + \fi + }% + \else + \etocifisstarred + {\@nameuse{\@tocextra}*{\contentsname\prw@mkboth{\contentsname}} %<-space + } + {\ifEtoc@maintoctotoc + \toc@section{\@tocextra}{\contentsname} %<-space from original + \else + \@nameuse{\@tocextra}*{\contentsname\prw@mkboth{\contentsname}} % id. + \fi + }% + \fi +}% +\@ifclassloaded{memoir} +{} +{% memoir not loaded + \@ifpackageloaded{tocloft} + {\if@cftnctoc\else + \ifEtoc@keeporiginaltoc + \else + \AtBeginDocument{\let\tableofcontents\etoctableofcontents}% + \fi + \fi } + {\AtBeginDocument + {\@ifpackageloaded{tocloft} + {\if@cftnctoc\else + \PackageWarningNoLine {etoc} + {Package `tocloft' was loaded after `etoc'.\MessageBreak + To prevent it from overwriting \protect\tableofcontents, it will\MessageBreak + be tricked into believing to have been loaded with its\MessageBreak + option `titles'. \space But this will cause the `tocloft'\MessageBreak + customization of the titles of the main list of figures\MessageBreak + and list of tables to not apply either.\MessageBreak + You should load `tocloft' before `etoc'.}% + \AtEndDocument{\PackageWarning{etoc} + {Please load `tocloft' before `etoc'!\@gobbletwo}}% + \fi + \@cftnctoctrue }% + {}% + }% + }% +} +\@ifclassloaded{memoir} +{} +{% memoir not loaded + \AtBeginDocument{% + \@ifpackageloaded{tocloft} + {% + \def\etocclasstocstyle{% + \etoctocloftstyle + \Etoc@classstyletrue + }% + \ifEtoc@etocstyle + \ifEtoc@classstyle + \etocclasstocstyle + \Etoc@etocstyletrue + \fi + \else + \ifEtoc@classstyle + \etocclasstocstyle + \fi + \fi + }% + {% no tocloft + \@ifpackageloaded {tocbibind} + {\if@dotoctoc + \def\etocclasstocstyle{% + \etoctocbibindstyle + \Etoc@classstyletrue + }% + \ifEtoc@etocstyle + \ifEtoc@classstyle + \etocclasstocstyle + \Etoc@etocstyletrue + \fi + \else + \ifEtoc@classstyle + \etocclasstocstyle + \fi + \fi + \ifEtoc@keeporiginaltoc + \else + \let\tableofcontents\etoctableofcontents + \fi + }% + {}% + }% + \@ifpackageloaded{tocbibind} + {% tocbibind, perhaps with tocloft + \if@dotoctoc + \ifEtoc@keeporiginaltoc + \else + \let\tableofcontents\etoctableofcontents + \fi + \etocsetup{maintoctotoc,localtoctotoc}% + \PackageInfo{etoc}{% + Setting (or re-setting) the options `maintoctotoc' and\MessageBreak + `localtoctotoc' to true as tocbibind was detected and\MessageBreak + found to be configured for `TOC to toc'.\MessageBreak + Reported at begin document}% + \fi + \if@dotoclof + \ifEtoc@lof + \etocsetup{localloftotoc}% + \PackageInfo{etoc}{% + Setting (or re-setting) `localloftotoc=true' as the\MessageBreak + package tocbibind was detected and is configured for\MessageBreak + `LOF to toc'. Reported at begin document}% + \fi + \fi + \if@dotoclot + \ifEtoc@lot + \etocsetup{locallottotoc}% + \PackageInfo{etoc}{% + Setting (or re-setting) `locallottotoc=true' as the\MessageBreak + package tocbibind was detected and is configured for\MessageBreak + `LOT to toc'. Reported at begin document}% + \fi + \fi + }% end of tocbibind branch + {}% + }% end of at begin document +}% end of not with memoir branch +\def\Etoc@addtocontents #1#2{% + \addtocontents {toc}{% + \protect\contentsline{#1}{#2}{\thepage}{\ifEtoc@hyperref\@currentHref\fi}% + \ifdefined\protected@file@percent\protected@file@percent\fi + }% +} +\def\Etoc@addcontentsline@ #1#2#3{% + \@namedef{toclevel@#1}{#3}\addcontentsline {toc}{#1}{#2}% +} +\DeclareRobustCommand*{\etoctoccontentsline} + {\@ifstar{\Etoc@addcontentsline@}{\Etoc@addtocontents}} +\def\Etoc@addtocontents@immediately#1#2{% + \begingroup + \let\Etoc@originalwrite\write + \def\write{\immediate\Etoc@originalwrite}% + \Etoc@addtocontents{#1}{#2}% + \endgroup +} +\def\Etoc@addcontentsline@@immediately#1#2#3{% + \begingroup + \let\Etoc@originalwrite\write + \def\write{\immediate\Etoc@originalwrite}% + \Etoc@addcontentsline@{#1}{#2}{#3}% + \endgoroup +} +\DeclareRobustCommand*{\etocimmediatetoccontentsline} + {\@ifstar{\Etoc@addcontentsline@@immediately}{\Etoc@addtocontents@immediately}} +\def\Etoc@storetocdepth {\xdef\Etoc@savedtocdepth{\number\c@tocdepth}} +\def\Etoc@restoretocdepth {\global\c@tocdepth\Etoc@savedtocdepth\relax} +\def\etocobeytoctocdepth {\def\etoc@settocdepth + {\afterassignment\Etoc@@nottoodeep \global\c@tocdepth}} +\def\Etoc@@nottoodeep {\ifnum\Etoc@savedtocdepth<\c@tocdepth + \global\c@tocdepth\Etoc@savedtocdepth\relax\fi } +\def\etocignoretoctocdepth {\let\etoc@settocdepth\@gobble } +\def\etocsettocdepth {\futurelet\Etoc@nexttoken\Etoc@set@tocdepth } +\def\Etoc@set@tocdepth {\ifx\Etoc@nexttoken\bgroup + \expandafter\Etoc@set@tocdepth@ + \else\expandafter\Etoc@set@toctocdepth + \fi } +\def\Etoc@set@tocdepth@ #1{\@ifundefined {Etoc@#1@@} + {\PackageWarning{etoc} + {Unknown sectioning unit #1, \protect\etocsettocdepth\space ignored}} + {\global\c@tocdepth\csname Etoc@#1@@\endcsname}% +} +\def\Etoc@set@toctocdepth #1#{\Etoc@set@toctocdepth@ } +\def\Etoc@set@toctocdepth@ #1{% + \@ifundefined{Etoc@#1@@}% + {\PackageWarning{etoc} + {Unknown sectioning depth #1, \protect\etocsettocdepth.toc ignored}}% + {\addtocontents {toc} + {\protect\etoc@settocdepth\expandafter\protect\csname Etoc@#1@@\endcsname}}% +} +\def\etocimmediatesettocdepth #1#{\Etoc@set@toctocdepth@immediately} +\def\Etoc@set@toctocdepth@immediately #1{% + \@ifundefined{Etoc@#1@@}% + {\PackageWarning{etoc} + {Unknown sectioning depth #1, \protect\etocimmediatesettocdepth.toc ignored}}% + {\begingroup + \let\Etoc@originalwrite\write + \def\write{\immediate\Etoc@originalwrite}% + \addtocontents {toc} + {\protect\etoc@settocdepth\expandafter\protect + \csname Etoc@#1@@\endcsname}% + \endgroup + }% +} +\def\etocdepthtag #1#{\Etoc@depthtag } +\def\Etoc@depthtag #1{\addtocontents {toc}{\protect\etoc@depthtag {#1}}} +\def\etocimmediatedepthtag #1#{\Etoc@depthtag@immediately } +\def\Etoc@depthtag@immediately #1{% + \begingroup + \let\Etoc@originalwrite\write + \def\write{\immediate\Etoc@originalwrite}% + \addtocontents {toc}{\protect\etoc@depthtag {#1}}% + \endgroup +} +\def\etocignoredepthtags {\let\etoc@depthtag \@gobble } +\def\etocobeydepthtags {\let\etoc@depthtag \Etoc@depthtag@ } +\def\Etoc@depthtag@ #1{\@ifundefined{Etoc@depthof@#1}% + {}% ignore in silence if tag has no associated depth + {\afterassignment\Etoc@@nottoodeep + \global\c@tocdepth\csname Etoc@depthof@#1\endcsname}% +} +\def\etocsettagdepth #1#2{\@ifundefined{Etoc@#2@@}% + {\PackageWarning{etoc} + {Unknown sectioning depth #2, \protect\etocsettagdepth\space ignored}}% + {\@namedef{Etoc@depthof@#1}{\@nameuse{Etoc@#2@@}}}% +} +\def\Etoc@tocvsec@err #1{\PackageError {etoc} + {The command \protect#1\space is incompatible with `etoc'} + {Use \protect\etocsettocdepth.toc as replacement}% +}% +\AtBeginDocument {% + \@ifclassloaded{memoir} + {\PackageInfo {etoc} + {Regarding `memoir' class command \protect\settocdepth, consider\MessageBreak + \protect\etocsettocdepth.toc as a drop-in replacement with more\MessageBreak + capabilities (see `etoc' manual). \space + Also, \protect\etocsettocdepth\MessageBreak + and \protect\etocsetnexttocdepth\space should be used in place of\MessageBreak + `memoir' command \protect\maxtocdepth\@gobble}% + }% + {\@ifpackageloaded {tocvsec2}{% + \def\maxtocdepth #1{\Etoc@tocvsec@err \maxtocdepth }% + \def\settocdepth #1{\Etoc@tocvsec@err \settocdepth }% + \def\resettocdepth {\@ifstar {\Etoc@tocvsec@err \resettocdepth }% + {\Etoc@tocvsec@err \resettocdepth }% + }% + \def\save@tocdepth #1#2#3{}% + \let\reset@tocdepth\relax + \let\remax@tocdepth\relax + \let\tableofcontents\etoctableofcontents + \PackageWarningNoLine {etoc} + {Package `tocvsec2' detected and its modification of\MessageBreak + \protect\tableofcontents\space reverted. \space Use + \protect\etocsettocdepth.toc\MessageBreak as a replacement + for `tocvsec2' toc-related commands}% + }% tocvsec2 loaded + {}% tocvsec2 not loaded + }% +}% +\def\invisibletableofcontents {\etocsetnexttocdepth {-3}\tableofcontents }% +\def\invisiblelocaltableofcontents + {\etocsetnexttocdepth {-3}\localtableofcontents }% +\def\etocsetnexttocdepth #1{% + \@ifundefined{Etoc@#1@@} + {\PackageWarning{etoc} + {Unknown sectioning unit #1, \protect\etocsetnextocdepth\space ignored}} + {\Etoc@setnexttocdepth{\csname Etoc@#1@@\endcsname}}% +}% +\def\Etoc@setnexttocdepth#1{% + \def\Etoc@tocdepthset{% + \Etoc@tocdepthreset + \edef\Etoc@tocdepthreset {% + \global\c@tocdepth\the\c@tocdepth\space + \global\let\noexpand\Etoc@tocdepthreset\noexpand\@empty + }% + \global\c@tocdepth#1% + \global\let\Etoc@tocdepthset\@empty + }% +}% +\let\Etoc@tocdepthreset\@empty +\let\Etoc@tocdepthset \@empty +\def\etocsetlocaltop #1#{\Etoc@set@localtop}% +\def\Etoc@set@localtop #1{% + \@ifundefined{Etoc@#1@@}% + {\PackageWarning{etoc} + {Unknown sectioning depth #1, \protect\etocsetlocaltop.toc ignored}}% + {\addtocontents {toc} + {\protect\etoc@setlocaltop\expandafter\protect\csname Etoc@#1@@\endcsname}}% +}% +\def\etocimmediatesetlocaltop #1#{\Etoc@set@localtop@immediately}% +\def\Etoc@set@localtop@immediately #1{% + \@ifundefined{Etoc@#1@@}% + {\PackageWarning{etoc} + {Unknown sectioning depth #1, \protect\etocimmediatesetlocaltop.toc ignored}}% + {\begingroup + \let\Etoc@originalwrite\write + \def\write{\immediate\Etoc@originalwrite}% + \addtocontents {toc} + {\protect\etoc@setlocaltop\expandafter\protect + \csname Etoc@#1@@\endcsname}% + \endgroup + }% +}% +\def\etoc@setlocaltop #1{% + \ifnum#1=\Etoc@maxlevel + \Etoc@skipthisonetrue + \else + \Etoc@skipthisonefalse + \global\let\Etoc@level #1% + \global\let\Etoc@virtualtop #1% + \ifEtoc@localtoc + \ifEtoc@stoptoc + \Etoc@skipthisonetrue + \else + \ifEtoc@notactive + \Etoc@skipthisonetrue + \else + \unless\ifnum\Etoc@level>\etoclocaltop + \Etoc@skipthisonetrue + \global\Etoc@stoptoctrue + \fi + \fi + \fi + \fi + \fi + \let\Etoc@next\@empty + \ifEtoc@skipthisone + \else + \ifnum\Etoc@level>\c@tocdepth + \else + \ifEtoc@standardlines + \else + \let\Etoc@next\Etoc@setlocaltop@doendsandbegin + \fi + \fi + \fi + \Etoc@next +}% +\def\Etoc@setlocaltop@doendsandbegin{% + \Etoc@doendsandbegin + \global\Etoc@skipprefixfalse +} +\addtocontents {toc}{\protect\@ifundefined{etoctocstyle}% + {\let\protect\etoc@startlocaltoc\protect\@gobble + \let\protect\etoc@settocdepth\protect\@gobble + \let\protect\etoc@depthtag\protect\@gobble + \let\protect\etoc@setlocaltop\protect\@gobble}{}}% +\def\etocstandardlines {\Etoc@standardlinestrue} +\def\etoctoclines {\Etoc@standardlinesfalse} +\etocdefaultlines +\etocstandardlines +\def\etocstandarddisplaystyle{% + \PackageWarningNoLine{etoc}{% + \string\etocstandarddisplaystyle \on@line\MessageBreak + is deprecated. \space Please use \string\etocclasstocstyle}% +} +\expandafter\def\expandafter\etocclasstocstyle\expandafter{% + \etocclasstocstyle + \Etoc@classstyletrue +} +\def\etocetoclocaltocstyle{\Etoc@etocstyletrue} +\def\etocusertocstyle{\Etoc@etocstylefalse} +\etocclasstocstyle +\etocetoclocaltocstyle +\etocobeytoctocdepth +\etocobeydepthtags +\let\etocbeforetitlehook \@empty +\let\etocaftertitlehook \@empty +\let\etocaftercontentshook \@empty +\let\etocaftertochook \@empty +\def\etockeeporiginaltableofcontents + {\Etoc@keeporiginaltoctrue\let\tableofcontents\etocoriginaltableofcontents}% +\endinput +%% +%% End of file `etoc.sty'. diff --git a/documentation/latex/field__variable_8h_source.tex b/documentation/latex/field__variable_8h_source.tex new file mode 100644 index 00000000..02df5035 --- /dev/null +++ b/documentation/latex/field__variable_8h_source.tex @@ -0,0 +1,51 @@ +\doxysection{field\+\_\+variable.\+h} +\hypertarget{field__variable_8h_source}{}\label{field__variable_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/storage/field\_variable.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/storage/field\_variable.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ "{}array2D.h"{}}} +\DoxyCodeLine{00008\ } + + + + + + + +\DoxyCodeLine{00017\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classArray2D}{Array2D}}} +\DoxyCodeLine{00018\ \{} +\DoxyCodeLine{00019\ \textcolor{keyword}{public}:} + + + + + + +\DoxyCodeLine{00027\ \ \ \ \ \mbox{\hyperlink{classFieldVariable_aa0985778bc6331b74904a03c3ef67a98}{FieldVariable}}(std::array\ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}},\ std::array\ origin,\ std::array\ meshWidth);} +\DoxyCodeLine{00028\ } + + + + + + + +\DoxyCodeLine{00037\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classFieldVariable_a2949624f1d2d7e29872f743db0b1d83b}{interpolateAt}}(\textcolor{keywordtype}{double}\ x,\ \textcolor{keywordtype}{double}\ y)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00038\ } + + + + +\DoxyCodeLine{00044\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classFieldVariable_a55168fd422c70c8386ba311909427cf7}{findAbsMax}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00045\ } +\DoxyCodeLine{00046\ \textcolor{keyword}{private}:} +\DoxyCodeLine{00047\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ origin\_;\ \ \ \ } +\DoxyCodeLine{00048\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ meshWidth\_;\ } +\DoxyCodeLine{00049\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/files.tex b/documentation/latex/files.tex new file mode 100644 index 00000000..8dca0be9 --- /dev/null +++ b/documentation/latex/files.tex @@ -0,0 +1,20 @@ +\doxysection{File List} +Here is a list of all documented files with brief descriptions\+:\begin{DoxyCompactList} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/\mbox{\hyperlink{computation_8h_source}{computation.\+h}} }{\pageref{computation_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/boundary/\mbox{\hyperlink{boundary_8h_source}{boundary.\+h}} }{\pageref{boundary_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/boundary/\mbox{\hyperlink{mask_8h_source}{mask.\+h}} }{\pageref{mask_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/\mbox{\hyperlink{central__differences_8h_source}{central\+\_\+differences.\+h}} }{\pageref{central__differences_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/\mbox{\hyperlink{discretization_8h_source}{discretization.\+h}} }{\pageref{discretization_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/\mbox{\hyperlink{donor__cell_8h_source}{donor\+\_\+cell.\+h}} }{\pageref{donor__cell_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/\mbox{\hyperlink{staggered__grid_8h_source}{staggered\+\_\+grid.\+h}} }{\pageref{staggered__grid_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/\mbox{\hyperlink{output__writer_8h_source}{output\+\_\+writer.\+h}} }{\pageref{output__writer_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/\mbox{\hyperlink{output__writer__paraview_8h_source}{output\+\_\+writer\+\_\+paraview.\+h}} }{\pageref{output__writer__paraview_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/\mbox{\hyperlink{output__writer__text_8h_source}{output\+\_\+writer\+\_\+text.\+h}} }{\pageref{output__writer__text_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/settings\+\_\+parser/\mbox{\hyperlink{settings_8h_source}{settings.\+h}} }{\pageref{settings_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/\mbox{\hyperlink{gauss__seidel_8h_source}{gauss\+\_\+seidel.\+h}} }{\pageref{gauss__seidel_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/\mbox{\hyperlink{pressure__solver_8h_source}{pressure\+\_\+solver.\+h}} }{\pageref{pressure__solver_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/\mbox{\hyperlink{sor_8h_source}{sor.\+h}} }{\pageref{sor_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/storage/\mbox{\hyperlink{array2D_8h_source}{array2\+D.\+h}} }{\pageref{array2D_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/storage/\mbox{\hyperlink{field__variable_8h_source}{field\+\_\+variable.\+h}} }{\pageref{field__variable_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/surface/\mbox{\hyperlink{fluid__tracer_8h_source}{fluid\+\_\+tracer.\+h}} }{\pageref{fluid__tracer_8h_source}}{} +\end{DoxyCompactList} diff --git a/documentation/latex/fluid__tracer_8h_source.tex b/documentation/latex/fluid__tracer_8h_source.tex new file mode 100644 index 00000000..dcd597e6 --- /dev/null +++ b/documentation/latex/fluid__tracer_8h_source.tex @@ -0,0 +1,95 @@ +\doxysection{fluid\+\_\+tracer.\+h} +\hypertarget{fluid__tracer_8h_source}{}\label{fluid__tracer_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/surface/fluid\_tracer.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/surface/fluid\_tracer.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00007\ } +\DoxyCodeLine{00008\ \textcolor{preprocessor}{\#include\ "{}../discretization/discretization.h"{}}} +\DoxyCodeLine{00009\ \textcolor{preprocessor}{\#include\ "{}../boundary/boundary.h"{}}} +\DoxyCodeLine{00010\ } +\DoxyCodeLine{00011\ } +\DoxyCodeLine{00012\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classFluidTracer}{FluidTracer}}\ \{} +\DoxyCodeLine{00013\ \ \ \ \ \textcolor{keyword}{public}:} +\DoxyCodeLine{00014\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classFluidTracer}{FluidTracer}}(\textcolor{keywordtype}{int}\ numParticlesperCell,} +\DoxyCodeLine{00015\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ discretization,} +\DoxyCodeLine{00016\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ mask);} +\DoxyCodeLine{00017\ } +\DoxyCodeLine{00018\ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ Mainly\ for\ testing\ purposes}} +\DoxyCodeLine{00019\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classFluidTracer}{FluidTracer}}(std::vector\ x,\ std::vector\ y,} +\DoxyCodeLine{00020\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ discretization,} +\DoxyCodeLine{00021\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ mask);} +\DoxyCodeLine{00022\ } + + + + + + + + +\DoxyCodeLine{00032\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classFluidTracer_aba4d452f26e9276b91256dd251789b90}{moveParticles}}(\textcolor{keywordtype}{double}\ dt);} +\DoxyCodeLine{00033\ } + + + + + +\DoxyCodeLine{00040\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classFluidTracer_ace163e1fe040acbd4c3122f082b08eea}{createParticles}}(\textcolor{keywordtype}{double}\ positionSourceX,\ \textcolor{keywordtype}{double}\ positionSourceY);} +\DoxyCodeLine{00041\ } + + + + +\DoxyCodeLine{00047\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classFluidTracer_adc687a4988f532e21e13c9aa0591d658}{getNumberOfParticles}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00048\ } +\DoxyCodeLine{00049\ } + + + + + +\DoxyCodeLine{00056\ \ \ \ \ \ \ \ \ std::array\ \mbox{\hyperlink{classFluidTracer_a37ee0325d6af08be6eba8b073162342e}{getParticlePosition}}(\textcolor{keywordtype}{int}\ i)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00057\ } +\DoxyCodeLine{00058\ \ \ \ \ \ \ \ \ std::array\ cellOfParticle(\textcolor{keywordtype}{int}\ i);} +\DoxyCodeLine{00059\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ val2CellX(\textcolor{keywordtype}{double}\ xVal);} +\DoxyCodeLine{00060\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ val2CellY(\textcolor{keywordtype}{double}\ yVal);} +\DoxyCodeLine{00061\ } +\DoxyCodeLine{00062\ } +\DoxyCodeLine{00063\ } +\DoxyCodeLine{00064\ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ Only\ test}} +\DoxyCodeLine{00065\ \ \ \ \ \ \ \ \ std::array\ updateParticle(\textcolor{keywordtype}{int}\ i,\ std::array\ idx,\ \textcolor{keywordtype}{double}\ dt,\ std::array\ vel,\ \textcolor{keywordtype}{int}\ depth);} +\DoxyCodeLine{00066\ \ \ \ \ \ \ \ \ std::array\ \mbox{\hyperlink{classFluidTracer_aba4d452f26e9276b91256dd251789b90}{moveParticles}}(\textcolor{keywordtype}{double}\ dt,\ std::array\ vel);} +\DoxyCodeLine{00067\ } +\DoxyCodeLine{00068\ } +\DoxyCodeLine{00069\ \ \ \ \ \textcolor{keyword}{private}:} + + + + + + +\DoxyCodeLine{00077\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ initializeFluidCell(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j,\ \textcolor{keywordtype}{int}\ idx);} +\DoxyCodeLine{00078\ } +\DoxyCodeLine{00079\ \ \ \ \ \ \ \ \ std::array\ updateParticle(\textcolor{keywordtype}{int}\ i,\ std::array,\ \textcolor{keywordtype}{double}\ dt,\ std::array\ vel);} +\DoxyCodeLine{00080\ } +\DoxyCodeLine{00081\ } +\DoxyCodeLine{00082\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ numParticles\_;} +\DoxyCodeLine{00083\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ numParticlesPerCell\_;\ \textcolor{comment}{//\ \ }} +\DoxyCodeLine{00084\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ seedRelationDyDx\_;} +\DoxyCodeLine{00085\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ n\_x;} +\DoxyCodeLine{00086\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ n\_y;} +\DoxyCodeLine{00087\ } +\DoxyCodeLine{00088\ \ \ \ \ \ \ \ \ std::shared\_ptr\ discretization\_;} +\DoxyCodeLine{00089\ \ \ \ \ \ \ \ \ std::shared\_ptr\ mask\_;} +\DoxyCodeLine{00090\ \ \ \ \ \ \ \ \ std::vector\ x\_;} +\DoxyCodeLine{00091\ \ \ \ \ \ \ \ \ std::vector\ y\_;} +\DoxyCodeLine{00092\ } +\DoxyCodeLine{00093\ } +\DoxyCodeLine{00094\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/gauss__seidel_8h_source.tex b/documentation/latex/gauss__seidel_8h_source.tex new file mode 100644 index 00000000..c5e99414 --- /dev/null +++ b/documentation/latex/gauss__seidel_8h_source.tex @@ -0,0 +1,34 @@ +\doxysection{gauss\+\_\+seidel.\+h} +\hypertarget{gauss__seidel_8h_source}{}\label{gauss__seidel_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/solver/gauss\_seidel.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/solver/gauss\_seidel.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}pressure\_solver.h"{}}} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ } + + + + +\DoxyCodeLine{00011\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classGaussSeidel}{GaussSeidel}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classPressureSolver}{PressureSolver}}} +\DoxyCodeLine{00012\ \{} +\DoxyCodeLine{00013\ } +\DoxyCodeLine{00014\ \textcolor{keyword}{public}:} + + + + + + +\DoxyCodeLine{00022\ \ \ \ \ \mbox{\hyperlink{classGaussSeidel_af31cc1ace2d616ebb8e0592c06865b9c}{GaussSeidel}}(\textcolor{keyword}{const}\ std::shared\_ptr\ \&data,} +\DoxyCodeLine{00023\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ epsilon,} +\DoxyCodeLine{00024\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ maximumNumberOfIterations,} +\DoxyCodeLine{00025\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ boundary);} + + + +\DoxyCodeLine{00030\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classGaussSeidel_a6f0eb0c6938a64f8ded186f88170a04b}{solve}}()\ \textcolor{keyword}{override};} +\DoxyCodeLine{00031\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/hierarchy.tex b/documentation/latex/hierarchy.tex new file mode 100644 index 00000000..72064932 --- /dev/null +++ b/documentation/latex/hierarchy.tex @@ -0,0 +1,31 @@ +\doxysection{Class Hierarchy} +This inheritance list is sorted roughly, but not completely, alphabetically\+:\begin{DoxyCompactList} +\item \contentsline{section}{Array2D}{\pageref{classArray2D}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Field\+Variable}{\pageref{classFieldVariable}}{} +\end{DoxyCompactList} +\item \contentsline{section}{Boundary}{\pageref{classBoundary}}{} +\item \contentsline{section}{Computation}{\pageref{classComputation}}{} +\item \contentsline{section}{Fluid\+Tracer}{\pageref{classFluidTracer}}{} +\item \contentsline{section}{Settings\+::Line\+Content}{\pageref{structSettings_1_1LineContent}}{} +\item \contentsline{section}{Mask}{\pageref{classMask}}{} +\item \contentsline{section}{Output\+Writer}{\pageref{classOutputWriter}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Output\+Writer\+Paraview}{\pageref{classOutputWriterParaview}}{} +\item \contentsline{section}{Output\+Writer\+Text}{\pageref{classOutputWriterText}}{} +\end{DoxyCompactList} +\item \contentsline{section}{Pressure\+Solver}{\pageref{classPressureSolver}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Gauss\+Seidel}{\pageref{classGaussSeidel}}{} +\item \contentsline{section}{SOR}{\pageref{classSOR}}{} +\end{DoxyCompactList} +\item \contentsline{section}{Settings}{\pageref{structSettings}}{} +\item \contentsline{section}{Staggered\+Grid}{\pageref{classStaggeredGrid}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Discretization}{\pageref{classDiscretization}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Central\+Differences}{\pageref{classCentralDifferences}}{} +\item \contentsline{section}{Donor\+Cell}{\pageref{classDonorCell}}{} +\end{DoxyCompactList} +\end{DoxyCompactList} +\end{DoxyCompactList} diff --git a/documentation/latex/longtable_doxygen.sty b/documentation/latex/longtable_doxygen.sty new file mode 100644 index 00000000..e94b78b6 --- /dev/null +++ b/documentation/latex/longtable_doxygen.sty @@ -0,0 +1,456 @@ +%% +%% This is file `longtable.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% longtable.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% The source is maintained by the LaTeX Project team and bug +%% reports for it can be opened at http://latex-project.org/bugs.html +%% (but please observe conditions on bug reports sent to that address!) +%% +%% Copyright 1993-2016 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file was generated from file(s) of the Standard LaTeX `Tools Bundle'. +%% -------------------------------------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3c +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file may only be distributed together with a copy of the LaTeX +%% `Tools Bundle'. You may however distribute the LaTeX `Tools Bundle' +%% without such generated files. +%% +%% The list of all files belonging to the LaTeX `Tools Bundle' is +%% given in the file `manifest.txt'. +%% +%% File: longtable.dtx Copyright (C) 1990-2001 David Carlisle +\NeedsTeXFormat{LaTeX2e}[1995/06/01] +\ProvidesPackage{longtable_doxygen} + [2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen] +\def\LT@err{\PackageError{longtable}} +\def\LT@warn{\PackageWarning{longtable}} +\def\LT@final@warn{% + \AtEndDocument{% + \LT@warn{Table \@width s have changed. Rerun LaTeX.\@gobbletwo}}% + \global\let\LT@final@warn\relax} +\DeclareOption{errorshow}{% + \def\LT@warn{\PackageInfo{longtable}}} +\DeclareOption{pausing}{% + \def\LT@warn#1{% + \LT@err{#1}{This is not really an error}}} +\DeclareOption{set}{} +\DeclareOption{final}{} +\ProcessOptions +\newskip\LTleft \LTleft=\fill +\newskip\LTright \LTright=\fill +\newskip\LTpre \LTpre=\bigskipamount +\newskip\LTpost \LTpost=\bigskipamount +\newcount\LTchunksize \LTchunksize=20 +\let\c@LTchunksize\LTchunksize +\newdimen\LTcapwidth \LTcapwidth=4in +\newbox\LT@head +\newbox\LT@firsthead +\newbox\LT@foot +\newbox\LT@lastfoot +\newcount\LT@cols +\newcount\LT@rows +\newcounter{LT@tables} +\newcounter{LT@chunks}[LT@tables] +\ifx\c@table\undefined + \newcounter{table} + \def\fnum@table{\tablename~\thetable} +\fi +\ifx\tablename\undefined + \def\tablename{Table} +\fi +\newtoks\LT@p@ftn +\mathchardef\LT@end@pen=30000 +\def\longtable{% + \par + \ifx\multicols\@undefined + \else + \ifnum\col@number>\@ne + \@twocolumntrue + \fi + \fi + \if@twocolumn + \LT@err{longtable not in 1-column mode}\@ehc + \fi + \begingroup + \@ifnextchar[\LT@array{\LT@array[x]}} +\def\LT@array[#1]#2{% + \refstepcounter{table}\stepcounter{LT@tables}% + \if l#1% + \LTleft\z@ \LTright\fill + \else\if r#1% + \LTleft\fill \LTright\z@ + \else\if c#1% + \LTleft\fill \LTright\fill + \fi\fi\fi + \let\LT@mcol\multicolumn + \let\LT@@tabarray\@tabarray + \let\LT@@hl\hline + \def\@tabarray{% + \let\hline\LT@@hl + \LT@@tabarray}% + \let\\\LT@tabularcr\let\tabularnewline\\% + \def\newpage{\noalign{\break}}% + \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}% + \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}% + \let\hline\LT@hline \let\kill\LT@kill\let\caption\LT@caption + \@tempdima\ht\strutbox + \let\@endpbox\LT@endpbox + \ifx\extrarowheight\@undefined + \let\@acol\@tabacol + \let\@classz\@tabclassz \let\@classiv\@tabclassiv + \def\@startpbox{\vtop\LT@startpbox}% + \let\@@startpbox\@startpbox + \let\@@endpbox\@endpbox + \let\LT@LL@FM@cr\@tabularcr + \else + \advance\@tempdima\extrarowheight + \col@sep\tabcolsep + \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr + \fi + \setbox\@arstrutbox\hbox{\vrule + \@height \arraystretch \@tempdima + \@depth \arraystretch \dp \strutbox + \@width \z@}% + \let\@sharp##\let\protect\relax + \begingroup + \@mkpream{#2}% + \xdef\LT@bchunk{% + \global\advance\c@LT@chunks\@ne + \global\LT@rows\z@\setbox\z@\vbox\bgroup + \LT@setprevdepth + \tabskip\LTleft \noexpand\halign to\hsize\bgroup + \tabskip\z@ \@arstrut \@preamble \tabskip\LTright \cr}% + \endgroup + \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols + \LT@make@row + \m@th\let\par\@empty + \everycr{}\lineskip\z@\baselineskip\z@ + \LT@bchunk} +\def\LT@no@pgbk#1[#2]{\penalty #1\@getpen{#2}\ifnum`{=0\fi}} +\def\LT@start{% + \let\LT@start\endgraf + \endgraf\penalty\z@\vskip\LTpre + \dimen@\pagetotal + \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi + \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi + \advance\dimen@ \ht\LT@foot + \dimen@ii\vfuzz + \vfuzz\maxdimen + \setbox\tw@\copy\z@ + \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox + \setbox\tw@\vbox{\unvbox\tw@}% + \vfuzz\dimen@ii + \advance\dimen@ \ht + \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi + \advance\dimen@\dp + \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi + \advance\dimen@ -\pagegoal + \ifdim \dimen@>\z@\vfil\break\fi + \global\@colroom\@colht + \ifvoid\LT@foot\else + \advance\vsize-\ht\LT@foot + \global\advance\@colroom-\ht\LT@foot + \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@ + \maxdepth\z@ + \fi + \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak + \output{\LT@output}} +\def\endlongtable{% + \crcr + \noalign{% + \let\LT@entry\LT@entry@chop + \xdef\LT@save@row{\LT@save@row}}% + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \if@filesw + {\let\LT@entry\LT@entry@write\immediate\write\@auxout{% + \gdef\expandafter\noexpand + \csname LT@\romannumeral\c@LT@tables\endcsname + {\LT@save@row}}}% + \fi + \ifx\LT@save@row\LT@@save@row + \else + \LT@warn{Column \@width s have changed\MessageBreak + in table \thetable}% + \LT@final@warn + \fi + \endgraf\penalty -\LT@end@pen + \endgroup + \global\@mparbottom\z@ + \pagegoal\vsize + \endgraf\penalty\z@\addvspace\LTpost + \ifvoid\footins\else\insert\footins{}\fi} +\def\LT@nofcols#1&{% + \futurelet\@let@token\LT@n@fcols} +\def\LT@n@fcols{% + \advance\LT@cols\@ne + \ifx\@let@token\LT@nofcols + \expandafter\@gobble + \else + \expandafter\LT@nofcols + \fi} +\def\LT@tabularcr{% + \relax\iffalse{\fi\ifnum0=`}\fi + \@ifstar + {\def\crcr{\LT@crcr\noalign{\nobreak}}\let\cr\crcr + \LT@t@bularcr}% + {\LT@t@bularcr}} +\let\LT@crcr\crcr +\let\LT@setprevdepth\relax +\def\LT@t@bularcr{% + \global\advance\LT@rows\@ne + \ifnum\LT@rows=\LTchunksize + \gdef\LT@setprevdepth{% + \prevdepth\z@\global + \global\let\LT@setprevdepth\relax}% + \expandafter\LT@xtabularcr + \else + \ifnum0=`{}\fi + \expandafter\LT@LL@FM@cr + \fi} +\def\LT@xtabularcr{% + \@ifnextchar[\LT@argtabularcr\LT@ntabularcr} +\def\LT@ntabularcr{% + \ifnum0=`{}\fi + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \LT@bchunk} +\def\LT@argtabularcr[#1]{% + \ifnum0=`{}\fi + \ifdim #1>\z@ + \unskip\@xargarraycr{#1}% + \else + \@yargarraycr{#1}% + \fi + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \LT@bchunk} +\def\LT@echunk{% + \crcr\LT@save@row\cr\egroup + \global\setbox\@ne\lastbox + \unskip + \egroup} +\def\LT@entry#1#2{% + \ifhmode\@firstofone{&}\fi\omit + \ifnum#1=\c@LT@chunks + \else + \kern#2\relax + \fi} +\def\LT@entry@chop#1#2{% + \noexpand\LT@entry + {\ifnum#1>\c@LT@chunks + 1}{0pt% + \else + #1}{#2% + \fi}} +\def\LT@entry@write{% + \noexpand\LT@entry^^J% + \@spaces} +\def\LT@kill{% + \LT@echunk + \LT@get@widths + \expandafter\LT@rebox\LT@bchunk} +\def\LT@rebox#1\bgroup{% + #1\bgroup + \unvbox\z@ + \unskip + \setbox\z@\lastbox} +\def\LT@blank@row{% + \xdef\LT@save@row{\expandafter\LT@build@blank + \romannumeral\number\LT@cols 001 }} +\def\LT@build@blank#1{% + \if#1m% + \noexpand\LT@entry{1}{0pt}% + \expandafter\LT@build@blank + \fi} +\def\LT@make@row{% + \global\expandafter\let\expandafter\LT@save@row + \csname LT@\romannumeral\c@LT@tables\endcsname + \ifx\LT@save@row\relax + \LT@blank@row + \else + {\let\LT@entry\or + \if!% + \ifcase\expandafter\expandafter\expandafter\LT@cols + \expandafter\@gobble\LT@save@row + \or + \else + \relax + \fi + !% + \else + \aftergroup\LT@blank@row + \fi}% + \fi} +\let\setlongtables\relax +\def\LT@get@widths{% + \setbox\tw@\hbox{% + \unhbox\@ne + \let\LT@old@row\LT@save@row + \global\let\LT@save@row\@empty + \count@\LT@cols + \loop + \unskip + \setbox\tw@\lastbox + \ifhbox\tw@ + \LT@def@row + \advance\count@\m@ne + \repeat}% + \ifx\LT@@save@row\@undefined + \let\LT@@save@row\LT@save@row + \fi} +\def\LT@def@row{% + \let\LT@entry\or + \edef\@tempa{% + \ifcase\expandafter\count@\LT@old@row + \else + {1}{0pt}% + \fi}% + \let\LT@entry\relax + \xdef\LT@save@row{% + \LT@entry + \expandafter\LT@max@sel\@tempa + \LT@save@row}} +\def\LT@max@sel#1#2{% + {\ifdim#2=\wd\tw@ + #1% + \else + \number\c@LT@chunks + \fi}% + {\the\wd\tw@}} +\def\LT@hline{% + \noalign{\ifnum0=`}\fi + \penalty\@M + \futurelet\@let@token\LT@@hline} +\def\LT@@hline{% + \ifx\@let@token\hline + \global\let\@gtempa\@gobble + \gdef\LT@sep{\penalty-\@medpenalty\vskip\doublerulesep}% + \else + \global\let\@gtempa\@empty + \gdef\LT@sep{\penalty-\@lowpenalty\vskip-\arrayrulewidth}% + \fi + \ifnum0=`{\fi}% + \multispan\LT@cols + \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr + \noalign{\LT@sep}% + \multispan\LT@cols + \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr + \noalign{\penalty\@M}% + \@gtempa} +\def\LT@caption{% + \noalign\bgroup + \@ifnextchar[{\egroup\LT@c@ption\@firstofone}\LT@capti@n} +\def\LT@c@ption#1[#2]#3{% + \LT@makecaption#1\fnum@table{#3}% + \def\@tempa{#2}% + \ifx\@tempa\@empty\else + {\let\\\space + \addcontentsline{lot}{table}{\protect\numberline{\thetable}{#2}}}% + \fi} +\def\LT@capti@n{% + \@ifstar + {\egroup\LT@c@ption\@gobble[]}% + {\egroup\@xdblarg{\LT@c@ption\@firstofone}}} +\def\LT@makecaption#1#2#3{% + \LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\LTcapwidth{% + \sbox\@tempboxa{#1{#2: }#3}% + \ifdim\wd\@tempboxa>\hsize + #1{#2: }#3% + \else + \hbox to\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \endgraf\vskip\baselineskip}% + \hss}}} +\def\LT@output{% + \ifnum\outputpenalty <-\@Mi + \ifnum\outputpenalty > -\LT@end@pen + \LT@err{floats and marginpars not allowed in a longtable}\@ehc + \else + \setbox\z@\vbox{\unvbox\@cclv}% + \ifdim \ht\LT@lastfoot>\ht\LT@foot + \dimen@\pagegoal + \advance\dimen@-\ht\LT@lastfoot + \ifdim\dimen@<\ht\z@ + \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}% + \@makecol + \@outputpage + \setbox\z@\vbox{\box\LT@head}% + \fi + \fi + \global\@colroom\@colht + \global\vsize\@colht + \vbox + {\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}% + \fi + \else + \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}% + \@makecol + \@outputpage + \global\vsize\@colroom + \copy\LT@head\nobreak + \fi} +\def\LT@end@hd@ft#1{% + \LT@echunk + \ifx\LT@start\endgraf + \LT@err + {Longtable head or foot not at start of table}% + {Increase LTchunksize}% + \fi + \setbox#1\box\z@ + \LT@get@widths + \LT@bchunk} +\def\endfirsthead{\LT@end@hd@ft\LT@firsthead} +\def\endhead{\LT@end@hd@ft\LT@head} +\def\endfoot{\LT@end@hd@ft\LT@foot} +\def\endlastfoot{\LT@end@hd@ft\LT@lastfoot} +\def\LT@startpbox#1{% + \bgroup + \let\@footnotetext\LT@p@ftntext + \setlength\hsize{#1}% + \@arrayparboxrestore + \vrule \@height \ht\@arstrutbox \@width \z@} +\def\LT@endpbox{% + \@finalstrut\@arstrutbox + \egroup + \the\LT@p@ftn + \global\LT@p@ftn{}% + \hfil} +%% added \long to prevent: +% LaTeX Warning: Command \LT@p@ftntext has changed. +% +% from the original repository (https://github.com/latex3/latex2e/blob/develop/required/tools/longtable.dtx): +% \changes{v4.15}{2021/03/28} +% {make long for gh/364} +% Inside the `p' column, just save up the footnote text in a token +% register. +\long\def\LT@p@ftntext#1{% + \edef\@tempa{\the\LT@p@ftn\noexpand\footnotetext[\the\c@footnote]}% + \global\LT@p@ftn\expandafter{\@tempa{#1}}}% + +\@namedef{ver@longtable.sty}{2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen} +\endinput +%% +%% End of file `longtable.sty'. diff --git a/documentation/latex/mask_8h_source.tex b/documentation/latex/mask_8h_source.tex new file mode 100644 index 00000000..5af910f4 --- /dev/null +++ b/documentation/latex/mask_8h_source.tex @@ -0,0 +1,172 @@ +\doxysection{mask.\+h} +\hypertarget{mask_8h_source}{}\label{mask_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/boundary/mask.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/boundary/mask.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00007\ } +\DoxyCodeLine{00008\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00009\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00010\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00011\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00012\ \textcolor{preprocessor}{\#include\ "{}../settings\_parser/settings.h"{}}} +\DoxyCodeLine{00013\ } +\DoxyCodeLine{00014\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classMask}{Mask}}} +\DoxyCodeLine{00015\ \{} +\DoxyCodeLine{00016\ \textcolor{keyword}{public}:} + + + + +\DoxyCodeLine{00022\ \ \ \ \ \mbox{\hyperlink{classMask_a5d65d3a108a79864bc69994f5e56f6c3}{Mask}}(\mbox{\hyperlink{structSettings}{Settings}}\ settings);} +\DoxyCodeLine{00023\ } +\DoxyCodeLine{00024\ \ \ \ \ \textcolor{comment}{//\ TODO:\ it\ is\ weird\ but\ if\ we\ would\ use\ \`{}char`\ instead\ of\ int,\ we\ would\ use\ less\ memory}} +\DoxyCodeLine{00025\ } +\DoxyCodeLine{00026\ \ \ \ \ \textcolor{keyword}{enum}\ CellType} +\DoxyCodeLine{00027\ \ \ \ \ \{} +\DoxyCodeLine{00028\ \ \ \ \ \ \ \ \ FLUID\_DROPLET\ =\ 0,} +\DoxyCodeLine{00029\ } +\DoxyCodeLine{00030\ \ \ \ \ \ \ \ \ FLUID\_SINGLE\_LEFT\ =\ 1,} +\DoxyCodeLine{00031\ \ \ \ \ \ \ \ \ FLUID\_SINGLE\_TOP\ =\ 2,} +\DoxyCodeLine{00032\ \ \ \ \ \ \ \ \ FLUID\_SINGLE\_RIGHT\ =\ 4,} +\DoxyCodeLine{00033\ \ \ \ \ \ \ \ \ FLUID\_SINGLE\_BOTTOM\ =\ 8,} +\DoxyCodeLine{00034\ } +\DoxyCodeLine{00035\ \ \ \ \ \ \ \ \ FLUID\_CORNER\_BOTTOM\_LEFT\ =\ 6,} +\DoxyCodeLine{00036\ \ \ \ \ \ \ \ \ FLUID\_CORNER\_TOP\_LEFT\ =\ 12,} +\DoxyCodeLine{00037\ \ \ \ \ \ \ \ \ FLUID\_CORNER\_TOP\_RIGHT\ =\ 9,} +\DoxyCodeLine{00038\ \ \ \ \ \ \ \ \ FLUID\_CORNER\_BOTTOM\_RIGHT\ =\ 3,} +\DoxyCodeLine{00039\ } +\DoxyCodeLine{00040\ \ \ \ \ \ \ \ \ FLUID\_COLUMN\_HORIZONTAL\ =\ 5,} +\DoxyCodeLine{00041\ \ \ \ \ \ \ \ \ FLUID\_COLUMN\_VERTICAL\ =\ 10,} +\DoxyCodeLine{00042\ } +\DoxyCodeLine{00043\ \ \ \ \ \ \ \ \ FLUID\_BORDER\_LEFT\ =\ 14,} +\DoxyCodeLine{00044\ \ \ \ \ \ \ \ \ FLUID\_BORDER\_TOP\ =\ 13,} +\DoxyCodeLine{00045\ \ \ \ \ \ \ \ \ FLUID\_BORDER\_RIGHT\ =\ 11,} +\DoxyCodeLine{00046\ \ \ \ \ \ \ \ \ FLUID\_BORDER\_BOTTOM\ =\ 7,} +\DoxyCodeLine{00047\ } +\DoxyCodeLine{00048\ \ \ \ \ \ \ \ \ FLUID\ =\ 15,} +\DoxyCodeLine{00049\ \ \ \ \ \ \ \ \ FLUID\_TYPE\ =\ 50,} +\DoxyCodeLine{00050\ \ \ \ \ \ \ \ \ AIR\ =\ 64,} +\DoxyCodeLine{00051\ } +\DoxyCodeLine{00052\ \ \ \ \ \ \ \ \ OBSTACLE\ =\ 99,} +\DoxyCodeLine{00053\ \ \ \ \ \ \ \ \ OBSTACLE\_INSIDE\ =\ 100,} +\DoxyCodeLine{00054\ } +\DoxyCodeLine{00055\ \ \ \ \ \ \ \ \ OBSTACLE\_BORDER\_LEFT\ =\ 101,} +\DoxyCodeLine{00056\ \ \ \ \ \ \ \ \ OBSTACLE\_BORDER\_TOP\ =\ 102,} +\DoxyCodeLine{00057\ \ \ \ \ \ \ \ \ OBSTACLE\_CORNER\_TOP\_LEFT\ =\ 103,} +\DoxyCodeLine{00058\ \ \ \ \ \ \ \ \ OBSTACLE\_BORDER\_RIGHT\ =\ 104,} +\DoxyCodeLine{00059\ \ \ \ \ \ \ \ \ OBSTACLE\_CORNER\_TOP\_RIGHT\ =\ 106,} +\DoxyCodeLine{00060\ \ \ \ \ \ \ \ \ OBSTACLE\_BORDER\_BOTTOM\ =\ 108,} +\DoxyCodeLine{00061\ \ \ \ \ \ \ \ \ OBSTACLE\_CORNER\_BOTTOM\_LEFT\ =\ 109,} +\DoxyCodeLine{00062\ \ \ \ \ \ \ \ \ OBSTACLE\_CORNER\_BOTTOM\_RIGHT\ =\ 112,} +\DoxyCodeLine{00063\ } +\DoxyCodeLine{00064\ \ \ \ \ \ \ \ \ DOMAIN\_BOUNDARY\ =\ 200,} +\DoxyCodeLine{00065\ } +\DoxyCodeLine{00066\ \ \ \ \ \ \ \ \ DOMAIN\_LEFT\_NOSLIP\ =\ 201,} +\DoxyCodeLine{00067\ \ \ \ \ \ \ \ \ DOMAIN\_TOP\_NOSLIP\ =\ 202,} +\DoxyCodeLine{00068\ \ \ \ \ \ \ \ \ DOMAIN\_RIGHT\_NOSLIP\ =\ 203,} +\DoxyCodeLine{00069\ \ \ \ \ \ \ \ \ DOMAIN\_BOTTOM\_NOSLIP\ =\ 204,} +\DoxyCodeLine{00070\ } +\DoxyCodeLine{00071\ \ \ \ \ \ \ \ \ DOMAIN\_LEFT\_PRESSURE\ =\ 205,} +\DoxyCodeLine{00072\ \ \ \ \ \ \ \ \ DOMAIN\_TOP\_PRESSURE\ =\ 206,} +\DoxyCodeLine{00073\ \ \ \ \ \ \ \ \ DOMAIN\_RIGHT\_PRESSURE\ =\ 207,} +\DoxyCodeLine{00074\ \ \ \ \ \ \ \ \ DOMAIN\_BOTTOM\_PRESSURE\ =\ 208,} +\DoxyCodeLine{00075\ \ \ \ \ \};} +\DoxyCodeLine{00076\ } + + + + + + +\DoxyCodeLine{00084\ \ \ \ \ \textcolor{keywordtype}{int}\ \&\mbox{\hyperlink{classMask_a6d612f1ac2185304b3ad7432d90dcd2b}{operator()}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} +\DoxyCodeLine{00085\ } + + + + + + +\DoxyCodeLine{00093\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classMask_a6d612f1ac2185304b3ad7432d90dcd2b}{operator()}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00094\ } + + +\DoxyCodeLine{00098\ \ \ \ \ std::array\ \mbox{\hyperlink{classMask_aafa0857af35b02ba6070e76f82d51c7b}{size}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00099\ } + + + +\DoxyCodeLine{00104\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classMask_ac30997cdd83faef98290733acb325cf8}{resetMask}}();} +\DoxyCodeLine{00105\ } +\DoxyCodeLine{00106\ \ \ \ \ \textcolor{comment}{//\ ********************************************************}} +\DoxyCodeLine{00107\ \ \ \ \ \textcolor{comment}{//\ R\ E\ Q\ U\ E\ S\ T\ S\ }} +\DoxyCodeLine{00108\ } + + + + + + + +\DoxyCodeLine{00117\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{classMask_aadacef52f95b796920864b8519d0594b}{isFluid}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00118\ } + + + + + +\DoxyCodeLine{00125\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{classMask_a53e4e7c0b29234856cbee33386cc5c18}{isObstacle}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00126\ } +\DoxyCodeLine{00127\ } + + + + + + + +\DoxyCodeLine{00136\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{classMask_a7eb34f789ef96c622ab93718d5278d77}{isAir}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00137\ \ \ \ \ \textcolor{keywordtype}{bool}\ isInnerFluid(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00138\ } +\DoxyCodeLine{00139\ } +\DoxyCodeLine{00140\ \ \ \ \ \textcolor{keywordtype}{bool}\ isDomainBoundary(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00141\ \ \ \ \ \textcolor{keywordtype}{bool}\ isObstacleBoundary(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00142\ \ \ \ \ \textcolor{keywordtype}{bool}\ isFluidBoundary(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00143\ } +\DoxyCodeLine{00144\ } + + + + + +\DoxyCodeLine{00151\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classMask_a3471a6026ce7eab118f660557a8abac6}{getNumberOfFluidCells}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00152\ } +\DoxyCodeLine{00153\ \ \ \ \ \textcolor{comment}{//\ For\ initialization}} +\DoxyCodeLine{00154\ \ \ \ \ \textcolor{keywordtype}{void}\ makeRectangularObstacle();} +\DoxyCodeLine{00155\ \ \ \ \ \textcolor{keywordtype}{void}\ createMaskFromPNGBitMap();} +\DoxyCodeLine{00156\ } +\DoxyCodeLine{00157\ } +\DoxyCodeLine{00158\ } +\DoxyCodeLine{00159\ } +\DoxyCodeLine{00160\ \ \ \ \ \textcolor{comment}{//\ Sets\ Enums\ for\ Boundary\ Types\ from\ type\ FLUID,\ AIR,\ OBSTACLE,\ DOMAIN}} +\DoxyCodeLine{00161\ \ \ \ \ \textcolor{comment}{//\ \ -\/\ uses\ \`{}settings`\ and\ neighbours}} +\DoxyCodeLine{00162\ \ \ \ \ \textcolor{keywordtype}{void}\ setDomainBC();} +\DoxyCodeLine{00163\ \ \ \ \ \textcolor{keywordtype}{void}\ setObstacleBC();} +\DoxyCodeLine{00164\ \ \ \ \ \textcolor{keywordtype}{void}\ setFluidBC();} +\DoxyCodeLine{00165\ } +\DoxyCodeLine{00166\ \ \ \ \ \textcolor{keywordtype}{void}\ printMask()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00167\ } +\DoxyCodeLine{00168\ } +\DoxyCodeLine{00169\ \textcolor{keyword}{protected}:} +\DoxyCodeLine{00170\ \ \ \ \ std::array\ \mbox{\hyperlink{classMask_a84bff46271e16eb8639c1831403c1bb9}{size\_}};\ } +\DoxyCodeLine{00171\ \ \ \ \ std::vector\ \mbox{\hyperlink{classMask_acdb73aee935b502fecc8de6bf1e32a09}{data\_}};\ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00172\ \ \ \ \ std::vector\ \mbox{\hyperlink{classMask_a3c5a51f6d03bb4a5e1742537a22ec441}{boundary\_list}};\ } +\DoxyCodeLine{00173\ \ \ \ \ \mbox{\hyperlink{structSettings}{Settings}}\ settings\_;} +\DoxyCodeLine{00174\ \ \ \ \ \textcolor{keywordtype}{int}\ forbiddenObstacleFluidCombinations[7]\ =\ \{105,107,110,111,113,114,115\};} +\DoxyCodeLine{00175\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/output__writer_8h_source.tex b/documentation/latex/output__writer_8h_source.tex new file mode 100644 index 00000000..727b14c7 --- /dev/null +++ b/documentation/latex/output__writer_8h_source.tex @@ -0,0 +1,38 @@ +\doxysection{output\+\_\+writer.\+h} +\hypertarget{output__writer_8h_source}{}\label{output__writer_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/output\_writer/output\_writer.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/output\_writer/output\_writer.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}../discretization/discretization.h"{}}} +\DoxyCodeLine{00004\ } +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00008\ } + + + +\DoxyCodeLine{00013\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classOutputWriter}{OutputWriter}}} +\DoxyCodeLine{00014\ \{} +\DoxyCodeLine{00015\ \textcolor{keyword}{public}:} + + + + +\DoxyCodeLine{00021\ \ \ \mbox{\hyperlink{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}{OutputWriter}}(std::shared\_ptr\ discretization);} +\DoxyCodeLine{00022\ } + + + + + + +\DoxyCodeLine{00030\ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classOutputWriter_ac625c204affdc05919388a3549c2e945}{writeFile}}(\textcolor{keywordtype}{double}\ currentTime)\ =\ 0;} +\DoxyCodeLine{00031\ } +\DoxyCodeLine{00032\ \textcolor{keyword}{protected}:} +\DoxyCodeLine{00033\ \ \ std::shared\_ptr\ \mbox{\hyperlink{classOutputWriter_a0587b2dc160a9b1393411433dfc23b68}{discretization\_}};\ } +\DoxyCodeLine{00034\ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classOutputWriter_a69d167e2526407602dce26ca7a2b9248}{fileNo\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00035\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/output__writer__paraview_8h_source.tex b/documentation/latex/output__writer__paraview_8h_source.tex new file mode 100644 index 00000000..54a24f27 --- /dev/null +++ b/documentation/latex/output__writer__paraview_8h_source.tex @@ -0,0 +1,47 @@ +\doxysection{output\+\_\+writer\+\_\+paraview.\+h} +\hypertarget{output__writer__paraview_8h_source}{}\label{output__writer__paraview_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/output\_writer/output\_writer\_paraview.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/output\_writer/output\_writer\_paraview.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}output\_writer.h"{}}} +\DoxyCodeLine{00004\ } +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00008\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00009\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00010\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00011\ } +\DoxyCodeLine{00012\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00013\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00014\ \textcolor{preprocessor}{\#include\ "{}../boundary/mask.h"{}}} +\DoxyCodeLine{00015\ } + + + + + + + +\DoxyCodeLine{00024\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classOutputWriterParaview}{OutputWriterParaview}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classOutputWriter}{OutputWriter}}} +\DoxyCodeLine{00025\ \{} +\DoxyCodeLine{00026\ \textcolor{keyword}{public}:} + + + + +\DoxyCodeLine{00032\ \ \ \mbox{\hyperlink{classOutputWriterParaview_a7a599c2694986563c801806234eb07d7}{OutputWriterParaview}}(std::shared\_ptr\ discretization,\ std::shared\_ptr\ mask);} +\DoxyCodeLine{00033\ } + + + + +\DoxyCodeLine{00039\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classOutputWriterParaview_a9e203b63d0e2f26ad53d18ee1821c6bb}{writeFile}}(\textcolor{keywordtype}{double}\ currentTime);} +\DoxyCodeLine{00040\ } +\DoxyCodeLine{00041\ \textcolor{keyword}{private}:} +\DoxyCodeLine{00042\ \ \ vtkSmartPointer\ vtkWriter\_;\ } +\DoxyCodeLine{00043\ \ \ std::shared\_ptr\ mask\_;} +\DoxyCodeLine{00044\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/output__writer__text_8h_source.tex b/documentation/latex/output__writer__text_8h_source.tex new file mode 100644 index 00000000..8c93c215 --- /dev/null +++ b/documentation/latex/output__writer__text_8h_source.tex @@ -0,0 +1,41 @@ +\doxysection{output\+\_\+writer\+\_\+text.\+h} +\hypertarget{output__writer__text_8h_source}{}\label{output__writer__text_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/output\_writer/output\_writer\_text.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/output\_writer/output\_writer\_text.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}output\_writer.h"{}}} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00008\ } + + + + + + +\DoxyCodeLine{00016\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classOutputWriterText}{OutputWriterText}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classOutputWriter}{OutputWriter}}} +\DoxyCodeLine{00017\ \{} +\DoxyCodeLine{00018\ \textcolor{keyword}{public}:} + + +\DoxyCodeLine{00022\ \ \ \textcolor{keyword}{using\ }\mbox{\hyperlink{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}{OutputWriter::OutputWriter}};} +\DoxyCodeLine{00023\ } + + + + + + +\DoxyCodeLine{00031\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classOutputWriterText_a25a12ea2524fc34e9acb19ef1f4c7431}{writeFile}}(\textcolor{keywordtype}{double}\ currentTime);} +\DoxyCodeLine{00032\ } + + + + +\DoxyCodeLine{00038\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classOutputWriterText_a3480b58a23fd158f16d0ef9c1b67cbfd}{writePressureFile}}();} +\DoxyCodeLine{00039\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/pressure__solver_8h_source.tex b/documentation/latex/pressure__solver_8h_source.tex new file mode 100644 index 00000000..346dbb83 --- /dev/null +++ b/documentation/latex/pressure__solver_8h_source.tex @@ -0,0 +1,70 @@ +\doxysection{pressure\+\_\+solver.\+h} +\hypertarget{pressure__solver_8h_source}{}\label{pressure__solver_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/solver/pressure\_solver.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/solver/pressure\_solver.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ } +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ "{}../storage/field\_variable.h"{}}} +\DoxyCodeLine{00008\ \textcolor{preprocessor}{\#include\ "{}../discretization/discretization.h"{}}} +\DoxyCodeLine{00009\ \textcolor{preprocessor}{\#include\ "{}../boundary/boundary.h"{}}} +\DoxyCodeLine{00010\ } +\DoxyCodeLine{00011\ } + + + + + + + +\DoxyCodeLine{00020\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classPressureSolver}{PressureSolver}}} +\DoxyCodeLine{00021\ \{} +\DoxyCodeLine{00022\ \textcolor{keyword}{public}:} + + + + + + + +\DoxyCodeLine{00031\ \ \ \ \ \mbox{\hyperlink{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058}{PressureSolver}}(std::shared\_ptr\ discretization,} +\DoxyCodeLine{00032\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ epsilon,} +\DoxyCodeLine{00033\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ maximumNumberOfIterations,} +\DoxyCodeLine{00034\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ boundary);} +\DoxyCodeLine{00035\ \ } + + + +\DoxyCodeLine{00040\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0}{solve}}()\ =\ 0;} +\DoxyCodeLine{00041\ } +\DoxyCodeLine{00042\ \ \ \ \ \textcolor{keywordtype}{double}\ dx2,\ \mbox{\hyperlink{classPressureSolver_a25b7ff50bdaea53d1b5c7a5cf735c5b5}{dy2}};\ } +\DoxyCodeLine{00043\ } +\DoxyCodeLine{00044\ \textcolor{keyword}{protected}:} + + + + + +\DoxyCodeLine{00051\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classPressureSolver_a458c383fcacaf54c1a333a271049ca93}{setBoundaryValues}}();} +\DoxyCodeLine{00052\ } + + +\DoxyCodeLine{00056\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classPressureSolver_afc51f4315c483988aeec327a16c5bb90}{calculateResiduum}}();} +\DoxyCodeLine{00057\ } +\DoxyCodeLine{00058\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classPressureSolver_af3ac2e53c6f49b9a362415a89595a7f0}{i\_beg}};\ } +\DoxyCodeLine{00059\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classPressureSolver_a41b263980e55591d1ffdc4837c252a61}{i\_end}};\ } +\DoxyCodeLine{00060\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classPressureSolver_aa309af30e5e63e09b77900091e562235}{j\_beg}};\ } +\DoxyCodeLine{00061\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classPressureSolver_ac2402794034dd74073700998ee2860bf}{j\_end}};\ } +\DoxyCodeLine{00062\ } +\DoxyCodeLine{00063\ \ \ \ \ std::shared\_ptr\ \mbox{\hyperlink{classPressureSolver_af579ecebaaa8b11914293ef18af5fdc6}{discretization\_}};\ } +\DoxyCodeLine{00064\ \ \ \ \ std::shared\_ptr\ \mbox{\hyperlink{classPressureSolver_a0b17b46580d259e4bb3a05486bc06a60}{boundary\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00065\ } +\DoxyCodeLine{00066\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classPressureSolver_a22b723f3b3ba54e47f36cfc2b9576749}{epsilon\_}};\ } +\DoxyCodeLine{00067\ } +\DoxyCodeLine{00068\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classPressureSolver_af3b02d29bf1b21ad8b7e6edf8c2f4e87}{maximumNumberOfIterations\_}};\ } +\DoxyCodeLine{00069\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/refman.tex b/documentation/latex/refman.tex new file mode 100644 index 00000000..f37c07a9 --- /dev/null +++ b/documentation/latex/refman.tex @@ -0,0 +1,262 @@ + % Handle batch mode + % to overcome problems with too many open files + \let\mypdfximage\pdfximage\def\pdfximage{\immediate\mypdfximage} + \pdfminorversion=7 + % Set document class depending on configuration + \documentclass[twoside]{book} + %% moved from doxygen.sty due to workaround for LaTex 2019 version and unmaintained tabu package + \usepackage{ifthen} + \ifx\requestedLaTeXdate\undefined + \usepackage{array} + \else + \usepackage{array}[=2016-10-06] + \fi + %% + % Packages required by doxygen + \makeatletter + \providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion} + % suppress package identification of infwarerr as it contains the word "warning" + \let\@@protected@wlog\protected@wlog + \def\protected@wlog#1{\wlog{package info suppressed}} + \RequirePackage{infwarerr} + \let\protected@wlog\@@protected@wlog + \makeatother + \IfFormatAtLeastTF{2016/01/01}{}{\usepackage{fixltx2e}} % for \textsubscript + \IfFormatAtLeastTF{2015/01/01}{\pdfsuppresswarningpagegroup=1}{} + \usepackage{doxygen} + \usepackage{graphicx} + \usepackage[utf8]{inputenc} + \usepackage{makeidx} + \PassOptionsToPackage{warn}{textcomp} + \usepackage{textcomp} + \usepackage[nointegrals]{wasysym} + \usepackage{ifxetex} + % NLS support packages + % Define default fonts + % Font selection + \usepackage[T1]{fontenc} + % set main and monospaced font + \usepackage[scaled=.90]{helvet} +\usepackage{courier} +\renewcommand{\familydefault}{\sfdefault} + \doxyallsectionsfont{% + \fontseries{bc}\selectfont% + \color{darkgray}% + } + \renewcommand{\DoxyLabelFont}{% + \fontseries{bc}\selectfont% + \color{darkgray}% + } + \newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}} + % Arguments of doxygenemoji: + % 1) '::' form of the emoji, already LaTeX-escaped + % 2) file with the name of the emoji without the .png extension + % in case image exist use this otherwise use the '::' form + \newcommand{\doxygenemoji}[2]{% + \IfFileExists{./#2.png}{\raisebox{-0.1em}{\includegraphics[height=0.9em]{./#2.png}}}{#1}% + } + % Page & text layout + \usepackage{geometry} + \geometry{% + a4paper,% + top=2.5cm,% + bottom=2.5cm,% + left=2.5cm,% + right=2.5cm% + } + \usepackage{changepage} + % Allow a bit of overflow to go unnoticed by other means + \tolerance=750 + \hfuzz=15pt + \hbadness=750 + \setlength{\emergencystretch}{15pt} + \setlength{\parindent}{0cm} + \newcommand{\doxynormalparskip}{\setlength{\parskip}{3ex plus 2ex minus 2ex}} + \newcommand{\doxytocparskip}{\setlength{\parskip}{1ex plus 0ex minus 0ex}} + \doxynormalparskip + % Redefine paragraph/subparagraph environments, using sectsty fonts + \makeatletter + \renewcommand{\paragraph}{% + \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{% + \normalfont\normalsize\bfseries\SS@parafont% + }% + } + \renewcommand{\subparagraph}{% + \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{% + \normalfont\normalsize\bfseries\SS@subparafont% + }% + } + \makeatother + \makeatletter + \newcommand\hrulefilll{\leavevmode\leaders\hrule\hskip 0pt plus 1filll\kern\z@} + \makeatother + % Headers & footers + \usepackage{fancyhdr} + \pagestyle{fancyplain} + \renewcommand{\footrulewidth}{0.4pt} + \fancypagestyle{fancyplain}{ + \fancyhf{} + \fancyhead[LE, RO]{\bfseries\thepage} + \fancyhead[LO]{\bfseries\rightmark} + \fancyhead[RE]{\bfseries\leftmark} + \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen } + } + \fancypagestyle{plain}{ + \fancyhf{} + \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen } + \renewcommand{\headrulewidth}{0pt} + } + \pagestyle{fancyplain} + \renewcommand{\chaptermark}[1]{% + \markboth{#1}{}% + } + \renewcommand{\sectionmark}[1]{% + \markright{\thesection\ #1}% + } + % ToC, LoF, LoT, bibliography, and index + % Indices & bibliography + \usepackage{natbib} + \usepackage[titles]{tocloft} + \setcounter{tocdepth}{3} + \setcounter{secnumdepth}{5} + % creating indexes + \makeindex + \usepackage{newunicodechar} + \makeatletter + \def\doxynewunicodechar#1#2{% + \@tempswafalse + \edef\nuc@tempa{\detokenize{#1}}% + \if\relax\nuc@tempa\relax + \nuc@emptyargerr + \else + \edef\@tempb{\expandafter\@car\nuc@tempa\@nil}% + \nuc@check + \if@tempswa + \@namedef{u8:\nuc@tempa}{#2}% + \fi + \fi + } + \makeatother + \doxynewunicodechar{⁻}{${}^{-}$}% Superscript minus + \doxynewunicodechar{²}{${}^{2}$}% Superscript two + \doxynewunicodechar{³}{${}^{3}$}% Superscript three + % Hyperlinks + % Hyperlinks (required, but should be loaded last) + \ifpdf + \usepackage[pdftex,pagebackref=true]{hyperref} + \else + \ifxetex + \usepackage[pagebackref=true]{hyperref} + \else + \usepackage[ps2pdf,pagebackref=true]{hyperref} + \fi + \fi + \hypersetup{% + colorlinks=true,% + linkcolor=blue,% + citecolor=blue,% + unicode,% + pdftitle={Num\+Sim},% + pdfsubject={Numerical Simulation of fluid-\/flow}% + } + % Custom commands used by the header + % Custom commands + \newcommand{\clearemptydoublepage}{% + \newpage{\pagestyle{empty}\cleardoublepage}% + } + % caption style definition + \usepackage{caption} + \captionsetup{labelsep=space,justification=centering,font={bf},singlelinecheck=off,skip=4pt,position=top} + % in page table of contents + \IfFormatAtLeastTF{2023/05/01}{\usepackage[deeplevels]{etoc}}{\usepackage[deeplevels]{etoc_doxygen}} + \etocsettocstyle{\doxytocparskip}{\doxynormalparskip} + \etocsetlevel{subsubsubsection}{4} + \etocsetlevel{subsubsubsubsection}{5} + \etocsetlevel{subsubsubsubsubsection}{6} + \etocsetlevel{subsubsubsubsubsubsection}{7} + \etocsetlevel{paragraph}{8} + \etocsetlevel{subparagraph}{9} + % prevent numbers overlap the titles in toc + \renewcommand{\numberline}[1]{#1~} +% End of preamble, now comes the document contents +%===== C O N T E N T S ===== +\begin{document} + \raggedbottom + % Titlepage & ToC + % To avoid duplicate page anchors due to reuse of same numbers for + % the index (be it as roman numbers) + \hypersetup{pageanchor=false, + bookmarksnumbered=true, + pdfencoding=unicode + } + \pagenumbering{alph} + \begin{titlepage} + \vspace*{7cm} + \begin{center}% + {\Large Num\+Sim}\\ + [1ex]\large 1.\+0 \\ + \vspace*{1cm} + {\large Generated by Doxygen 1.10.0}\\ + \end{center} + \end{titlepage} + \clearemptydoublepage + \pagenumbering{roman} + \tableofcontents + \clearemptydoublepage + \pagenumbering{arabic} + % re-enable anchors again + \hypersetup{pageanchor=true} +%--- Begin generated contents --- +\chapter{Hierarchical Index} +\input{hierarchy} +\chapter{Class Index} +\input{annotated} +\chapter{File Index} +\input{files} +\chapter{Class Documentation} +\input{classArray2D} +\input{classBoundary} +\input{classCentralDifferences} +\input{classComputation} +\input{classDiscretization} +\input{classDonorCell} +\input{classFieldVariable} +\input{classFluidTracer} +\input{classGaussSeidel} +\input{structSettings_1_1LineContent} +\input{classMask} +\input{classOutputWriter} +\input{classOutputWriterParaview} +\input{classOutputWriterText} +\input{classPressureSolver} +\input{structSettings} +\input{classSOR} +\input{classStaggeredGrid} +\chapter{File Documentation} +\input{boundary_8h_source} +\input{mask_8h_source} +\input{computation_8h_source} +\input{central__differences_8h_source} +\input{discretization_8h_source} +\input{donor__cell_8h_source} +\input{staggered__grid_8h_source} +\input{output__writer_8h_source} +\input{output__writer__paraview_8h_source} +\input{output__writer__text_8h_source} +\input{settings_8h_source} +\input{gauss__seidel_8h_source} +\input{pressure__solver_8h_source} +\input{sor_8h_source} +\input{array2D_8h_source} +\input{field__variable_8h_source} +\input{fluid__tracer_8h_source} +%--- End generated contents --- +% Index + \backmatter + \newpage + \phantomsection + \clearemptydoublepage + \addcontentsline{toc}{chapter}{\indexname} + \printindex +% Required for some languages (in combination with latexdocumentpre from the header) +\end{document} diff --git a/documentation/latex/settings_8h_source.tex b/documentation/latex/settings_8h_source.tex new file mode 100644 index 00000000..87950f1a --- /dev/null +++ b/documentation/latex/settings_8h_source.tex @@ -0,0 +1,98 @@ +\doxysection{settings.\+h} +\hypertarget{settings_8h_source}{}\label{settings_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/settings\_parser/settings.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/settings\_parser/settings.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00008\ } + + + +\DoxyCodeLine{00013\ \textcolor{keyword}{struct\ }\mbox{\hyperlink{structSettings}{Settings}}} +\DoxyCodeLine{00014\ \{} +\DoxyCodeLine{00015\ \ \ std::array\ \mbox{\hyperlink{structSettings_a43a0d2ee903496bfb86693a43a891a69}{nCells}};\ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00016\ \ \ std::array\ \mbox{\hyperlink{structSettings_a372a1549c306b12ca7bb0ed84f8a4cef}{physicalSize}};\ } +\DoxyCodeLine{00017\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a8b8330dfa04fe849291d68eacbc8dfec}{re}}\ =\ 1000;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00018\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a73cd9110793ede99e9ebe409e5e115fd}{endTime}}\ =\ 10.0;\ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00019\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_adaa611dc8c075474d40d7149afd310d1}{tau}}\ =\ 0.5;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00020\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a988b93fdeb6c91932043b3f746b45e86}{maximumDt}}\ =\ 0.1;\ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00021\ } +\DoxyCodeLine{00022\ \ \ std::array\ \mbox{\hyperlink{structSettings_a1a21237c7f5b7585e5a3545c7d4a4e8c}{g}}\{0.,\ 0.\};\ } +\DoxyCodeLine{00023\ } +\DoxyCodeLine{00024\ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{structSettings_a05bd5ffa1e1b48f5dc99878538596db3}{useDonorCell}}\ =\ \textcolor{keyword}{false};\ } +\DoxyCodeLine{00025\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a8b3721d24a5417caa0f2ad6f5eb85782}{alpha}}\ =\ 0.5;\ \ \ \ \ \ \ \ } +\DoxyCodeLine{00026\ } +\DoxyCodeLine{00027\ \ \ \textcolor{comment}{//\ Boundary\ Conditions\ Type}} +\DoxyCodeLine{00028\ \ \ std::string\ BCTop\ =\ \textcolor{stringliteral}{"{}NoSlip"{}};} +\DoxyCodeLine{00029\ \ \ std::string\ BCRight\ =\ \textcolor{stringliteral}{"{}NoSlip"{}};} +\DoxyCodeLine{00030\ \ \ std::string\ BCBottom\ =\ \textcolor{stringliteral}{"{}NoSlip"{}};} +\DoxyCodeLine{00031\ \ \ std::string\ BCLeft\ =\ \textcolor{stringliteral}{"{}NoSlip"{}};} +\DoxyCodeLine{00032\ } +\DoxyCodeLine{00033\ \ \ \textcolor{comment}{//\ NoSlip\ boundary\ conditions}} +\DoxyCodeLine{00034\ \ \ std::array\ \mbox{\hyperlink{structSettings_a8887591c6c157d7006051aa95896c284}{NoSlipVelTop}};\ \ \ \ } +\DoxyCodeLine{00035\ \ \ std::array\ \mbox{\hyperlink{structSettings_a2508aa084fe48e78d72b06e67c5a2006}{NoSlipVelRight}};\ \ } +\DoxyCodeLine{00036\ \ \ std::array\ \mbox{\hyperlink{structSettings_a13e254a0439df7f7bd24ffe4f919a1a4}{NoSlipVelBottom}};\ } +\DoxyCodeLine{00037\ \ \ std::array\ \mbox{\hyperlink{structSettings_aafaec8c10a728a0f115f3bed43a1c478}{NoSlipVelLeft}};\ \ \ } +\DoxyCodeLine{00038\ } +\DoxyCodeLine{00039\ \ \ \textcolor{comment}{//\ Pressure\ boundary\ conditions}} +\DoxyCodeLine{00040\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a5c8295a86e29ac27579058f07242e78c}{PressureTop}};\ \ \ \ } +\DoxyCodeLine{00041\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a8e7d49e95d30c9390fc5039f9326df32}{PressureRight}};\ \ } +\DoxyCodeLine{00042\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_acae74bcd333251c982ea347b8eb52017}{PressureBottom}};\ } +\DoxyCodeLine{00043\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a55f2fbdeb4d9c25bc679bd1fd42f1da7}{PressureLeft}};\ \ \ } +\DoxyCodeLine{00044\ } +\DoxyCodeLine{00045\ \ \ \textcolor{comment}{//\ Create\ rectangular\ obstacle\ in\ domain}} +\DoxyCodeLine{00046\ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{structSettings_a9e871c2bbb7d1b0131eac1f30f4f7788}{createRectangularObject}}\ =\ \textcolor{keyword}{false};\ } +\DoxyCodeLine{00047\ } +\DoxyCodeLine{00048\ \ \ \textcolor{comment}{//\ Create\ domain\ from\ PNGBitmap}} +\DoxyCodeLine{00049\ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{structSettings_a6300ad5a809cdaf480f4553c3e3dbf7c}{createDomainfromBitmap}}\ =\ \textcolor{keyword}{false};\ } +\DoxyCodeLine{00050\ \ \ std::string\ \mbox{\hyperlink{structSettings_a398d6490c8731b9b74115abc34700086}{pathToBitmap}};\ } +\DoxyCodeLine{00051\ } +\DoxyCodeLine{00052\ \ \ std::array\ \mbox{\hyperlink{structSettings_aff5a1563289e354946a164fd80da5bf6}{obstaclePosition}};\ } +\DoxyCodeLine{00053\ \ \ std::array\ \mbox{\hyperlink{structSettings_ae23782f18cddfea58cb843e98cb5854f}{obstacleDimension}};\ } +\DoxyCodeLine{00054\ } +\DoxyCodeLine{00055\ \ \ std::string\ \mbox{\hyperlink{structSettings_a888e2fca33db512d4e200b49f1f618f7}{pressureSolver}}\ =\ \textcolor{stringliteral}{"{}SOR"{}};\ \ } +\DoxyCodeLine{00056\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_af5ac13128e8c442ba45eedfab06ba14c}{omega}}\ =\ 1.0;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00057\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_aa02bd91d026d9ded9e36004b41b068b1}{epsilon}}\ =\ 1e-\/5;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00058\ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{structSettings_ac118e1c6052e35fb0ee38547a85d84ba}{maximumNumberOfIterations}}\ =\ 1e5;\ } +\DoxyCodeLine{00059\ } + + + + +\DoxyCodeLine{00065\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{structSettings_a55f95e3b6e7379bef4f8399a2cd670cc}{loadFromFile}}(std::string\ filename);} +\DoxyCodeLine{00066\ } + + +\DoxyCodeLine{00070\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{structSettings_a68ce38117dcef2cbdd3bd17f127b3078}{printSettings}}();} +\DoxyCodeLine{00071\ } + + + +\DoxyCodeLine{00076\ \ \ \textcolor{keyword}{struct\ }\mbox{\hyperlink{structSettings_1_1LineContent}{LineContent}}} +\DoxyCodeLine{00077\ \ \ \{} +\DoxyCodeLine{00078\ \ \ \ \ std::string\ \mbox{\hyperlink{structSettings_1_1LineContent_a2fa37c56a8ebe361c95b8332fa0262d3}{parameterName}};\ } +\DoxyCodeLine{00079\ \ \ \ \ std::string\ \mbox{\hyperlink{structSettings_1_1LineContent_a0bb96393366f2e5035379ab5b99d3ab2}{value}};\ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00080\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{structSettings_1_1LineContent_aa2af8a274c468eb68c61cd93171748e5}{isContent}};\ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00081\ \ \ \};} +\DoxyCodeLine{00082\ } + + + + +\DoxyCodeLine{00088\ \ \ \mbox{\hyperlink{structSettings_1_1LineContent}{LineContent}}\ \mbox{\hyperlink{structSettings_a6dbc25f91b99664976cd4a0a8af153c9}{readSingleLine}}(std::string\ line);} +\DoxyCodeLine{00089\ } +\DoxyCodeLine{00090\ \ \ \textcolor{comment}{//\ sets\ the\ parameter\ to\ the\ corresponding\ value}} + + + + + +\DoxyCodeLine{00097\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{structSettings_a588f30eb8d791c03ec811360386bff0d}{setParameter}}(std::string\ parameterName,\ std::string\ value);} +\DoxyCodeLine{00098\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/sor_8h_source.tex b/documentation/latex/sor_8h_source.tex new file mode 100644 index 00000000..75054cea --- /dev/null +++ b/documentation/latex/sor_8h_source.tex @@ -0,0 +1,39 @@ +\doxysection{sor.\+h} +\hypertarget{sor_8h_source}{}\label{sor_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/solver/sor.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/solver/sor.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}pressure\_solver.h"{}}} +\DoxyCodeLine{00004\ } + + + + +\DoxyCodeLine{00010\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classSOR}{SOR}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classPressureSolver}{PressureSolver}}} +\DoxyCodeLine{00011\ \{} +\DoxyCodeLine{00012\ } +\DoxyCodeLine{00013\ \textcolor{keyword}{public}:} + + + + + + + +\DoxyCodeLine{00022\ \ \ \ \ \mbox{\hyperlink{classSOR_a357cfea8935f4b2dfee06f2d8e1461a8}{SOR}}(\textcolor{keyword}{const}\ std::shared\_ptr\ \&data,} +\DoxyCodeLine{00023\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ epsilon,} +\DoxyCodeLine{00024\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ maximumNumberOfIterations,} +\DoxyCodeLine{00025\ \ \ \ \ \ \ \ \ std::shared\_ptr\ boundary,} +\DoxyCodeLine{00026\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ omega);} +\DoxyCodeLine{00027\ } + + + +\DoxyCodeLine{00032\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classSOR_a860992d85d8aacf114a3a02b5831f728}{solve}}()\ \textcolor{keyword}{override};} +\DoxyCodeLine{00033\ } +\DoxyCodeLine{00034\ \textcolor{keyword}{private}:} +\DoxyCodeLine{00035\ \ \ \ \ \textcolor{keywordtype}{double}\ omega\_;\ } +\DoxyCodeLine{00036\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/staggered__grid_8h_source.tex b/documentation/latex/staggered__grid_8h_source.tex new file mode 100644 index 00000000..e132f780 --- /dev/null +++ b/documentation/latex/staggered__grid_8h_source.tex @@ -0,0 +1,180 @@ +\doxysection{staggered\+\_\+grid.\+h} +\hypertarget{staggered__grid_8h_source}{}\label{staggered__grid_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/discretization/staggered\_grid.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/discretization/staggered\_grid.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00002\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ "{}../storage/field\_variable.h"{}}} +\DoxyCodeLine{00005\ } + + + + + + + +\DoxyCodeLine{00014\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classStaggeredGrid}{StaggeredGrid}}} +\DoxyCodeLine{00015\ \{} +\DoxyCodeLine{00016\ \textcolor{keyword}{public}:} + + + + + +\DoxyCodeLine{00023\ \ \ \ \ \mbox{\hyperlink{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}{StaggeredGrid}}(std::array\ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{nCells}},\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{meshWidth}});} +\DoxyCodeLine{00024\ } + + +\DoxyCodeLine{00028\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{meshWidth}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00032\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{nCells}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00033\ } + + +\DoxyCodeLine{00037\ \ \ \ \ \textcolor{keyword}{const}\ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \&\mbox{\hyperlink{classStaggeredGrid_a87cee12621c641ab143a8b1a61b2ef7e}{u}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00041\ \ \ \ \ \textcolor{keyword}{const}\ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \&\mbox{\hyperlink{classStaggeredGrid_a26e478abba632554652c9e05a279d1ca}{v}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00045\ \ \ \ \ \textcolor{keyword}{const}\ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \&\mbox{\hyperlink{classStaggeredGrid_aafe6e0bb3509f6aad272b94f74e7ffec}{p}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00049\ \ \ \ \ \textcolor{keyword}{const}\ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \&\mbox{\hyperlink{classStaggeredGrid_a3f36422a02b9b18d1577d61e406f08cf}{rhs}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00050\ } + + +\DoxyCodeLine{00054\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classStaggeredGrid_a87cee12621c641ab143a8b1a61b2ef7e}{u}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00058\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_a87cee12621c641ab143a8b1a61b2ef7e}{u}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} +\DoxyCodeLine{00059\ } + + +\DoxyCodeLine{00063\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classStaggeredGrid_a26e478abba632554652c9e05a279d1ca}{v}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00067\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_a26e478abba632554652c9e05a279d1ca}{v}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} +\DoxyCodeLine{00068\ } + + +\DoxyCodeLine{00072\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classStaggeredGrid_aafe6e0bb3509f6aad272b94f74e7ffec}{p}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00076\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_aafe6e0bb3509f6aad272b94f74e7ffec}{p}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} +\DoxyCodeLine{00077\ } + + +\DoxyCodeLine{00081\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_adb05c59512dc8993367e4beddba05785}{f}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} + + +\DoxyCodeLine{00085\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_aaf849bec40f7fa7c68823038f0877341}{g}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} + + +\DoxyCodeLine{00089\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_a3f36422a02b9b18d1577d61e406f08cf}{rhs}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} +\DoxyCodeLine{00090\ } + + +\DoxyCodeLine{00094\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classStaggeredGrid_aec8490affea703cdd73b1febaed68968}{dx}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00098\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classStaggeredGrid_abde2da10e0c130fb0f206de64c9b4956}{dy}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00099\ } + + +\DoxyCodeLine{00103\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a31e2d3a0b6e03685380810a7c2f323e1}{uIBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00107\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a641e473d72e1d02ba3de1c16e9d0d332}{uIEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00108\ } + + +\DoxyCodeLine{00112\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a9b0e97704e1871441a8e713ecaa2cff5}{uJBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00116\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a3393aa91b17054d2d700de308ae25632}{uJEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00117\ } + + +\DoxyCodeLine{00121\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ace7bf8cb1d279131739d5d12de302d09}{vIBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00125\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_aa5a44aa088b5a7923fa952af1ecb5778}{vIEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00126\ } + + +\DoxyCodeLine{00130\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a7f8468d672411c0e3a5eeb67788fc826}{vJBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00134\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ab67e8d9d8d76d34fb02d4d644f0b3795}{vJEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00135\ } + + +\DoxyCodeLine{00139\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a9922c955707f2a31a4a27d1d696f002e}{pIBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00143\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a34f16fdf87971fe84ffc3c84722bb2c7}{pIEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00144\ } + + +\DoxyCodeLine{00148\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ae4c9ba16c5635dc1ffaa264fbcc3e034}{pJBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00152\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ad9928ee522eedb7d7fd48ca0b92f2795}{pJEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00153\ } + + +\DoxyCodeLine{00157\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a5cc368f9ede58a3cb689705df998f750}{fIBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00161\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a8162b849231354ba73aacb085b5cd665}{fIEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00162\ } + + +\DoxyCodeLine{00166\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ab92aca90331200d0cc7bc0c0a857b4ef}{fJBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00170\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a7ac43ac86231987bc0bf6565589d52e1}{fJEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00171\ } + + +\DoxyCodeLine{00175\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a061fb6d6948cdc3054171dd60842a8c3}{gIBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00179\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_aebc76693e5dd61db521d6763236bf664}{gIEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00180\ } + + +\DoxyCodeLine{00184\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a18ca3a121787b19c18886b0945aca2e3}{gJBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00188\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a7a29456e1bce9efffa27de0b41957b50}{gJEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00189\ } + + +\DoxyCodeLine{00193\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ad5c16b00d9dbf0f115e1ded81203edce}{rhsIBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00197\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ae11e8842fdd508b914dc8f24b09b36a9}{rhsIEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00198\ } + + +\DoxyCodeLine{00202\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a28c36939e3d3cc8df76e7aa91f0e0804}{rhsJBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00206\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a953ec890a986473bffe87ea26dfcd782}{rhsJEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00207\ } +\DoxyCodeLine{00208\ \textcolor{keyword}{protected}:} +\DoxyCodeLine{00209\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ \mbox{\hyperlink{classStaggeredGrid_acacffb5739539d9015c986080bb5ed44}{nCells\_}};\ \ \ \ \ \ \ } +\DoxyCodeLine{00210\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a9603c3334440aab082dda48947e5ce6e}{meshWidth\_}};\ } +\DoxyCodeLine{00211\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_adcef36b4ce8cc6843a2b6f603b62c763}{u\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00212\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_a20ec43568fe937b194561e21a0b84ad9}{v\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00213\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_a2ea3c93dd401ac06461ade9a74e76459}{p\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00214\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_a94933ac0c6e0d2a794f46c7a97d72f75}{f\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00215\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_a5f5c88f603d4e503cba4c44ed43de46a}{g\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00216\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_a496206955162452a0629a7742fe92a84}{rhs\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00217\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/structSettings.tex b/documentation/latex/structSettings.tex new file mode 100644 index 00000000..79e56f84 --- /dev/null +++ b/documentation/latex/structSettings.tex @@ -0,0 +1,175 @@ +\doxysection{Settings Struct Reference} +\hypertarget{structSettings}{}\label{structSettings}\index{Settings@{Settings}} + + +All settings that parametrize a simulation run. + + + + +{\ttfamily \#include $<$settings.\+h$>$} + +\doxysubsubsection*{Classes} +\begin{DoxyCompactItemize} +\item +struct \mbox{\hyperlink{structSettings_1_1LineContent}{Line\+Content}} +\begin{DoxyCompactList}\small\item\em Contains the content of a single line in a file. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +void \mbox{\hyperlink{structSettings_a55f95e3b6e7379bef4f8399a2cd670cc}{load\+From\+File}} (std\+::string filename) +\begin{DoxyCompactList}\small\item\em Parse a text file with settings. \end{DoxyCompactList}\item +\Hypertarget{structSettings_a68ce38117dcef2cbdd3bd17f127b3078}\label{structSettings_a68ce38117dcef2cbdd3bd17f127b3078} +void {\bfseries print\+Settings} () +\begin{DoxyCompactList}\small\item\em Print all setting to terminal. \end{DoxyCompactList}\item +\mbox{\hyperlink{structSettings_1_1LineContent}{Line\+Content}} \mbox{\hyperlink{structSettings_a6dbc25f91b99664976cd4a0a8af153c9}{read\+Single\+Line}} (std\+::string line) +\begin{DoxyCompactList}\small\item\em Reads one line of the settings file. \end{DoxyCompactList}\item +void \mbox{\hyperlink{structSettings_a588f30eb8d791c03ec811360386bff0d}{set\+Parameter}} (std\+::string parameter\+Name, std\+::string value) +\begin{DoxyCompactList}\small\item\em Sets the parameter to the corresponding value. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{structSettings_a43a0d2ee903496bfb86693a43a891a69}\label{structSettings_a43a0d2ee903496bfb86693a43a891a69} +std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells} +\begin{DoxyCompactList}\small\item\em number of cells in x and y direction \end{DoxyCompactList}\item +\Hypertarget{structSettings_a372a1549c306b12ca7bb0ed84f8a4cef}\label{structSettings_a372a1549c306b12ca7bb0ed84f8a4cef} +std\+::array$<$ double, 2 $>$ {\bfseries physical\+Size} +\begin{DoxyCompactList}\small\item\em physical size of the domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_a8b8330dfa04fe849291d68eacbc8dfec}\label{structSettings_a8b8330dfa04fe849291d68eacbc8dfec} +double {\bfseries re} = 1000 +\begin{DoxyCompactList}\small\item\em reynolds number \end{DoxyCompactList}\item +\Hypertarget{structSettings_a73cd9110793ede99e9ebe409e5e115fd}\label{structSettings_a73cd9110793ede99e9ebe409e5e115fd} +double {\bfseries end\+Time} = 10.\+0 +\begin{DoxyCompactList}\small\item\em end time of the simulation \end{DoxyCompactList}\item +\Hypertarget{structSettings_adaa611dc8c075474d40d7149afd310d1}\label{structSettings_adaa611dc8c075474d40d7149afd310d1} +double {\bfseries tau} = 0.\+5 +\begin{DoxyCompactList}\small\item\em safety factor for time step width \end{DoxyCompactList}\item +\Hypertarget{structSettings_a988b93fdeb6c91932043b3f746b45e86}\label{structSettings_a988b93fdeb6c91932043b3f746b45e86} +double {\bfseries maximum\+Dt} = 0.\+1 +\begin{DoxyCompactList}\small\item\em maximum time step width \end{DoxyCompactList}\item +\Hypertarget{structSettings_a1a21237c7f5b7585e5a3545c7d4a4e8c}\label{structSettings_a1a21237c7f5b7585e5a3545c7d4a4e8c} +std\+::array$<$ double, 2 $>$ {\bfseries g} \{0., 0.\} +\begin{DoxyCompactList}\small\item\em external forces \end{DoxyCompactList}\item +\Hypertarget{structSettings_a05bd5ffa1e1b48f5dc99878538596db3}\label{structSettings_a05bd5ffa1e1b48f5dc99878538596db3} +bool {\bfseries use\+Donor\+Cell} = false +\begin{DoxyCompactList}\small\item\em if the donor cell scheme schould be used \end{DoxyCompactList}\item +\Hypertarget{structSettings_a8b3721d24a5417caa0f2ad6f5eb85782}\label{structSettings_a8b3721d24a5417caa0f2ad6f5eb85782} +double {\bfseries alpha} = 0.\+5 +\begin{DoxyCompactList}\small\item\em factor for donor-\/cell scheme \end{DoxyCompactList}\item +\Hypertarget{structSettings_a90549573af4f6c2c60ac640321fe1956}\label{structSettings_a90549573af4f6c2c60ac640321fe1956} +std\+::string {\bfseries BCTop} = "{}No\+Slip"{} +\item +\Hypertarget{structSettings_a4f6f4dbc9e08834584809de5e553e5cd}\label{structSettings_a4f6f4dbc9e08834584809de5e553e5cd} +std\+::string {\bfseries BCRight} = "{}No\+Slip"{} +\item +\Hypertarget{structSettings_a8003d11fa49639f3f827123d42f5f0ce}\label{structSettings_a8003d11fa49639f3f827123d42f5f0ce} +std\+::string {\bfseries BCBottom} = "{}No\+Slip"{} +\item +\Hypertarget{structSettings_ac411ff66a486b89fba9dc520b6e305e3}\label{structSettings_ac411ff66a486b89fba9dc520b6e305e3} +std\+::string {\bfseries BCLeft} = "{}No\+Slip"{} +\item +\Hypertarget{structSettings_a8887591c6c157d7006051aa95896c284}\label{structSettings_a8887591c6c157d7006051aa95896c284} +std\+::array$<$ double, 2 $>$ {\bfseries No\+Slip\+Vel\+Top} +\begin{DoxyCompactList}\small\item\em prescribed values of u,v at top of domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_a2508aa084fe48e78d72b06e67c5a2006}\label{structSettings_a2508aa084fe48e78d72b06e67c5a2006} +std\+::array$<$ double, 2 $>$ {\bfseries No\+Slip\+Vel\+Right} +\begin{DoxyCompactList}\small\item\em prescribed values of u,v at right of domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_a13e254a0439df7f7bd24ffe4f919a1a4}\label{structSettings_a13e254a0439df7f7bd24ffe4f919a1a4} +std\+::array$<$ double, 2 $>$ {\bfseries No\+Slip\+Vel\+Bottom} +\begin{DoxyCompactList}\small\item\em prescribed values of u,v at bottom of domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_aafaec8c10a728a0f115f3bed43a1c478}\label{structSettings_aafaec8c10a728a0f115f3bed43a1c478} +std\+::array$<$ double, 2 $>$ {\bfseries No\+Slip\+Vel\+Left} +\begin{DoxyCompactList}\small\item\em prescribed values of u,v at left of domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_a5c8295a86e29ac27579058f07242e78c}\label{structSettings_a5c8295a86e29ac27579058f07242e78c} +double {\bfseries Pressure\+Top} +\begin{DoxyCompactList}\small\item\em prescribed pressure BC top of domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_a8e7d49e95d30c9390fc5039f9326df32}\label{structSettings_a8e7d49e95d30c9390fc5039f9326df32} +double {\bfseries Pressure\+Right} +\begin{DoxyCompactList}\small\item\em prescribed pressure BC right of domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_acae74bcd333251c982ea347b8eb52017}\label{structSettings_acae74bcd333251c982ea347b8eb52017} +double {\bfseries Pressure\+Bottom} +\begin{DoxyCompactList}\small\item\em prescribed pressure BC bottom of domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_a55f2fbdeb4d9c25bc679bd1fd42f1da7}\label{structSettings_a55f2fbdeb4d9c25bc679bd1fd42f1da7} +double {\bfseries Pressure\+Left} +\begin{DoxyCompactList}\small\item\em prescribed pressure BC left of domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_a9e871c2bbb7d1b0131eac1f30f4f7788}\label{structSettings_a9e871c2bbb7d1b0131eac1f30f4f7788} +bool {\bfseries create\+Rectangular\+Object} = false +\begin{DoxyCompactList}\small\item\em wheter a rectangular object in domain should be created \end{DoxyCompactList}\item +\Hypertarget{structSettings_a6300ad5a809cdaf480f4553c3e3dbf7c}\label{structSettings_a6300ad5a809cdaf480f4553c3e3dbf7c} +bool {\bfseries create\+Domainfrom\+Bitmap} = false +\begin{DoxyCompactList}\small\item\em wheter domain should be created from bitmap \end{DoxyCompactList}\item +\Hypertarget{structSettings_a398d6490c8731b9b74115abc34700086}\label{structSettings_a398d6490c8731b9b74115abc34700086} +std\+::string {\bfseries path\+To\+Bitmap} +\begin{DoxyCompactList}\small\item\em path to bitmap \end{DoxyCompactList}\item +\Hypertarget{structSettings_aff5a1563289e354946a164fd80da5bf6}\label{structSettings_aff5a1563289e354946a164fd80da5bf6} +std\+::array$<$ double, 2 $>$ {\bfseries obstacle\+Position} +\begin{DoxyCompactList}\small\item\em x and y position of rectangular object \end{DoxyCompactList}\item +\Hypertarget{structSettings_ae23782f18cddfea58cb843e98cb5854f}\label{structSettings_ae23782f18cddfea58cb843e98cb5854f} +std\+::array$<$ double, 2 $>$ {\bfseries obstacle\+Dimension} +\begin{DoxyCompactList}\small\item\em x and y dimension of rectangular object \end{DoxyCompactList}\item +\Hypertarget{structSettings_a888e2fca33db512d4e200b49f1f618f7}\label{structSettings_a888e2fca33db512d4e200b49f1f618f7} +std\+::string {\bfseries pressure\+Solver} = "{}SOR"{} +\begin{DoxyCompactList}\small\item\em which pressure solver to use, "{}\+Gauss\+Seidel"{} or "{}\+SOR"{} \end{DoxyCompactList}\item +\Hypertarget{structSettings_af5ac13128e8c442ba45eedfab06ba14c}\label{structSettings_af5ac13128e8c442ba45eedfab06ba14c} +double {\bfseries omega} = 1.\+0 +\begin{DoxyCompactList}\small\item\em overrelaxation factor \end{DoxyCompactList}\item +\Hypertarget{structSettings_aa02bd91d026d9ded9e36004b41b068b1}\label{structSettings_aa02bd91d026d9ded9e36004b41b068b1} +double {\bfseries epsilon} = 1e-\/5 +\begin{DoxyCompactList}\small\item\em tolerance for the residual in the pressure solver \end{DoxyCompactList}\item +\Hypertarget{structSettings_ac118e1c6052e35fb0ee38547a85d84ba}\label{structSettings_ac118e1c6052e35fb0ee38547a85d84ba} +int {\bfseries maximum\+Number\+Of\+Iterations} = 1e5 +\begin{DoxyCompactList}\small\item\em maximum number of iterations in the solver \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +All settings that parametrize a simulation run. + +\doxysubsection{Member Function Documentation} +\Hypertarget{structSettings_a55f95e3b6e7379bef4f8399a2cd670cc}\label{structSettings_a55f95e3b6e7379bef4f8399a2cd670cc} +\index{Settings@{Settings}!loadFromFile@{loadFromFile}} +\index{loadFromFile@{loadFromFile}!Settings@{Settings}} +\doxysubsubsection{\texorpdfstring{loadFromFile()}{loadFromFile()}} +{\footnotesize\ttfamily void Settings\+::load\+From\+File (\begin{DoxyParamCaption}\item[{std\+::string}]{filename }\end{DoxyParamCaption})} + + + +Parse a text file with settings. + +Each line contains "{}$<$parameter\+Name$>$ = $<$value$>$"{} \Hypertarget{structSettings_a6dbc25f91b99664976cd4a0a8af153c9}\label{structSettings_a6dbc25f91b99664976cd4a0a8af153c9} +\index{Settings@{Settings}!readSingleLine@{readSingleLine}} +\index{readSingleLine@{readSingleLine}!Settings@{Settings}} +\doxysubsubsection{\texorpdfstring{readSingleLine()}{readSingleLine()}} +{\footnotesize\ttfamily \mbox{\hyperlink{structSettings_1_1LineContent}{Settings\+::\+Line\+Content}} Settings\+::read\+Single\+Line (\begin{DoxyParamCaption}\item[{std\+::string}]{line }\end{DoxyParamCaption})} + + + +Reads one line of the settings file. + + +\begin{DoxyParams}{Parameters} +{\em line} & line of file to read \\ +\hline +\end{DoxyParams} +\Hypertarget{structSettings_a588f30eb8d791c03ec811360386bff0d}\label{structSettings_a588f30eb8d791c03ec811360386bff0d} +\index{Settings@{Settings}!setParameter@{setParameter}} +\index{setParameter@{setParameter}!Settings@{Settings}} +\doxysubsubsection{\texorpdfstring{setParameter()}{setParameter()}} +{\footnotesize\ttfamily void Settings\+::set\+Parameter (\begin{DoxyParamCaption}\item[{std\+::string}]{parameter\+Name, }\item[{std\+::string}]{value }\end{DoxyParamCaption})} + + + +Sets the parameter to the corresponding value. + + +\begin{DoxyParams}{Parameters} +{\em parameter\+Name} & paramter name \\ +\hline +{\em value} & of parameter \\ +\hline +\end{DoxyParams} + + +The documentation for this struct was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/settings\+\_\+parser/settings.\+h\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/settings\+\_\+parser/settings.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/structSettings_1_1LineContent.tex b/documentation/latex/structSettings_1_1LineContent.tex new file mode 100644 index 00000000..72568299 --- /dev/null +++ b/documentation/latex/structSettings_1_1LineContent.tex @@ -0,0 +1,31 @@ +\doxysection{Settings\+::Line\+Content Struct Reference} +\hypertarget{structSettings_1_1LineContent}{}\label{structSettings_1_1LineContent}\index{Settings::LineContent@{Settings::LineContent}} + + +Contains the content of a single line in a file. + + + + +{\ttfamily \#include $<$settings.\+h$>$} + +\doxysubsubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{structSettings_1_1LineContent_a2fa37c56a8ebe361c95b8332fa0262d3}\label{structSettings_1_1LineContent_a2fa37c56a8ebe361c95b8332fa0262d3} +std\+::string {\bfseries parameter\+Name} +\begin{DoxyCompactList}\small\item\em Name of parameter. \end{DoxyCompactList}\item +\Hypertarget{structSettings_1_1LineContent_a0bb96393366f2e5035379ab5b99d3ab2}\label{structSettings_1_1LineContent_a0bb96393366f2e5035379ab5b99d3ab2} +std\+::string {\bfseries value} +\begin{DoxyCompactList}\small\item\em value of the parameter \end{DoxyCompactList}\item +\Hypertarget{structSettings_1_1LineContent_aa2af8a274c468eb68c61cd93171748e5}\label{structSettings_1_1LineContent_aa2af8a274c468eb68c61cd93171748e5} +bool {\bfseries is\+Content} +\begin{DoxyCompactList}\small\item\em whether line is readable parameter or comment \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Contains the content of a single line in a file. + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/settings\+\_\+parser/settings.\+h\end{DoxyCompactItemize} diff --git a/documentation/latex/tabu_doxygen.sty b/documentation/latex/tabu_doxygen.sty new file mode 100644 index 00000000..3f17d1d0 --- /dev/null +++ b/documentation/latex/tabu_doxygen.sty @@ -0,0 +1,2557 @@ +%% +%% This is file `tabu.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% tabu.dtx (with options: `package') +%% +%% This is a generated file. +%% Copyright (FC) 2010-2011 - lppl +%% +%% tabu : 2011/02/26 v2.8 - tabu : Flexible LaTeX tabulars +%% +%% ********************************************************************************************** +%% \begin{tabu} { preamble } => default target: \linewidth or \linegoal +%% \begin{tabu} to { preamble } => target specified +%% \begin{tabu} spread { preamble } => target relative to the ``natural width'' +%% +%% tabu works in text and in math modes. +%% +%% X columns: automatic width adjustment + horizontal and vertical alignment +%% \begin{tabu} { X[4c] X[1c] X[-2ml] } +%% +%% Horizontal lines and / or leaders: +%% \hline\hline => double horizontal line +%% \firsthline\hline => for nested tabulars +%% \lasthline\hline => for nested tabulars +%% \tabucline[line spec]{column-column} => ``funny'' lines (dash/leader) +%% Automatic lines / leaders : +%% \everyrow{\hline\hline} +%% +%% Vertical lines and / or leaders: +%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt blue] } +%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt on 2pt off 4pt blue] } +%% +%% Fixed vertical spacing adjustment: +%% \extrarowheight= \extrarowdepth= +%% or: \extrarowsep= => may be prefixed by \global +%% +%% Dynamic vertical spacing adjustment: +%% \abovetabulinesep= \belowtabulinesep= +%% or: \tabulinesep= => may be prefixed by \global +%% +%% delarray.sty shortcuts: in math and text modes +%% \begin{tabu} .... \({ preamble }\) +%% +%% Algorithms reports: +%% \tracingtabu=1 \tracingtabu=2 +%% +%% ********************************************************************************************** +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3 of this license or (at your option) any later +%% version. The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% +%% This work consists of the main source file tabu.dtx +%% and the derived files +%% tabu.sty, tabu.pdf, tabu.ins +%% +%% tabu : Flexible LaTeX tabulars +%% lppl copyright 2010-2011 by FC +%% + +\NeedsTeXFormat{LaTeX2e}[2005/12/01] +\ProvidesPackage{tabu_doxygen}[2011/02/26 v2.8 - flexible LaTeX tabulars (FC), frozen version for doxygen] +\RequirePackage{array}[2008/09/09] +\RequirePackage{varwidth}[2009/03/30] +\AtEndOfPackage{\tabu@AtEnd \let\tabu@AtEnd \@undefined} +\let\tabu@AtEnd\@empty +\def\TMP@EnsureCode#1={% + \edef\tabu@AtEnd{\tabu@AtEnd + \catcode#1 \the\catcode#1}% + \catcode#1=% +}% \TMP@EnsureCode +\TMP@EnsureCode 33 = 12 % ! +\TMP@EnsureCode 58 = 12 % : (for siunitx) +\TMP@EnsureCode124 = 12 % | +\TMP@EnsureCode 36 = 3 % $ = math shift +\TMP@EnsureCode 38 = 4 % & = tab alignment character +\TMP@EnsureCode 32 = 10 % space +\TMP@EnsureCode 94 = 7 % ^ +\TMP@EnsureCode 95 = 8 % _ +%% Constants -------------------------------------------------------- +\newcount \c@taburow \def\thetaburow {\number\c@taburow} +\newcount \tabu@nbcols +\newcount \tabu@cnt +\newcount \tabu@Xcol +\let\tabu@start \@tempcnta +\let\tabu@stop \@tempcntb +\newcount \tabu@alloc \tabu@alloc=\m@ne +\newcount \tabu@nested +\def\tabu@alloc@{\global\advance\tabu@alloc \@ne \tabu@nested\tabu@alloc} +\newdimen \tabu@target +\newdimen \tabu@spreadtarget +\newdimen \tabu@naturalX +\newdimen \tabucolX +\let\tabu@DELTA \@tempdimc +\let\tabu@thick \@tempdima +\let\tabu@on \@tempdimb +\let\tabu@off \@tempdimc +\newdimen \tabu@Xsum +\newdimen \extrarowdepth +\newdimen \abovetabulinesep +\newdimen \belowtabulinesep +\newdimen \tabustrutrule \tabustrutrule \z@ +\newtoks \tabu@thebody +\newtoks \tabu@footnotes +\newsavebox \tabu@box +\newsavebox \tabu@arstrutbox +\newsavebox \tabu@hleads +\newsavebox \tabu@vleads +\newif \iftabu@colortbl +\newif \iftabu@siunitx +\newif \iftabu@measuring +\newif \iftabu@spread +\newif \iftabu@negcoef +\newif \iftabu@everyrow +\def\tabu@everyrowtrue {\global\let\iftabu@everyrow \iftrue} +\def\tabu@everyrowfalse{\global\let\iftabu@everyrow \iffalse} +\newif \iftabu@long +\newif \iftabuscantokens +\def\tabu@rescan {\tabu@verbatim \scantokens } +%% Utilities (for internal usage) ----------------------------------- +\def\tabu@gobblespace #1 {#1} +\def\tabu@gobbletoken #1#2{#1} +\def\tabu@gobbleX{\futurelet\@let@token \tabu@gobblex} +\def\tabu@gobblex{\if ^^J\noexpand\@let@token \expandafter\@gobble + \else\ifx \@sptoken\@let@token + \expandafter\tabu@gobblespace\expandafter\tabu@gobbleX + \fi\fi +}% \tabu@gobblex +\def\tabu@X{^^J} +{\obeyspaces +\global\let\tabu@spxiii= % saves an active space (for \ifx) +\gdef\tabu@@spxiii{ }} +\def\tabu@ifenvir {% only for \multicolumn + \expandafter\tabu@if@nvir\csname\@currenvir\endcsname +}% \tabu@ifenvir +\def\tabu@if@nvir #1{\csname @\ifx\tabu#1first\else + \ifx\longtabu#1first\else + second\fi\fi oftwo\endcsname +}% \tabu@ifenvir +\def\tabu@modulo #1#2{\numexpr\ifnum\numexpr#1=\z@ 0\else #1-(#1-(#2-1)/2)/(#2)*(#2)\fi} +{\catcode`\&=3 +\gdef\tabu@strtrim #1{% #1 = control sequence to trim + \ifodd 1\ifx #1\@empty \else \ifx #1\space \else 0\fi \fi + \let\tabu@c@l@r \@empty \let#1\@empty + \else \expandafter \tabu@trimspaces #1\@nnil + \fi +}% \tabu@strtrim +\gdef\tabu@trimspaces #1\@nnil{\let\tabu@c@l@r=#2\tabu@firstspace .#1& }% +\gdef\tabu@firstspace #1#2#3 &{\tabu@lastspace #2#3&} +\gdef\tabu@lastspace #1{\def #3{#1}% + \ifx #3\tabu@c@l@r \def\tabu@c@l@r{\protect\color{#1}}\expandafter\remove@to@nnil \fi + \tabu@trimspaces #1\@nnil} +}% \catcode +\def\tabu@sanitizearg #1#2{{% + \csname \ifcsname if@safe@actives\endcsname % + @safe@activestrue\else + relax\fi \endcsname + \edef#2{#1}\tabu@strtrim#2\@onelevel@sanitize#2% + \expandafter}\expandafter\def\expandafter#2\expandafter{#2}% +}% \tabu@sanitizearg +\def\tabu@textbar #1{\begingroup \endlinechar\m@ne \scantokens{\def\:{|}}% + \expandafter\endgroup \expandafter#1\:% !!! semi simple group !!! +}% \tabu@textbar +\def\tabu@everyrow@bgroup{\iftabu@everyrow \begingroup \else \noalign{\ifnum0=`}\fi \fi} +\def\tabu@everyrow@egroup{% + \iftabu@everyrow \expandafter \endgroup \the\toks@ + \else \ifnum0=`{\fi}% + \fi +}% \tabu@everyrow@egroup +\def\tabu@arstrut {\global\setbox\@arstrutbox \hbox{\vrule + height \arraystretch \dimexpr\ht\strutbox+\extrarowheight + depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth + width \z@}% +}% \tabu@arstrut +\def\tabu@rearstrut {% + \@tempdima \arraystretch\dimexpr\ht\strutbox+\extrarowheight \relax + \@tempdimb \arraystretch\dimexpr\dp\strutbox+\extrarowdepth \relax + \ifodd 1\ifdim \ht\@arstrutbox=\@tempdima + \ifdim \dp\@arstrutbox=\@tempdimb 0 \fi\fi + \tabu@mkarstrut + \fi +}% \tabu@rearstrut +\def\tabu@@DBG #1{\ifdim\tabustrutrule>\z@ \color{#1}\fi} +\def\tabu@DBG@arstrut {\global\setbox\@arstrutbox + \hbox to\z@{\hbox to\z@{\hss + {\tabu@DBG{cyan}\vrule + height \arraystretch \dimexpr\ht\strutbox+\extrarowheight + depth \z@ + width \tabustrutrule}\kern-\tabustrutrule + {\tabu@DBG{pink}\vrule + height \z@ + depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth + width \tabustrutrule}}}% +}% \tabu@DBG@arstrut +\def\tabu@save@decl{\toks\count@ \expandafter{\the\toks\expandafter\count@ + \@nextchar}}% +\def\tabu@savedecl{\ifcat$\d@llarend\else + \let\save@decl \tabu@save@decl \fi % no inversion of tokens in text mode +}% \tabu@savedecl +\def\tabu@finalstrut #1{\unskip\ifhmode\nobreak\fi\vrule height\z@ depth\z@ width\z@} +\newcommand*\tabuDisableCommands {\g@addto@macro\tabu@trialh@@k } +\let\tabu@trialh@@k \@empty +\def\tabu@nowrite #1#{{\afterassignment}\toks@} +\let\tabu@write\write +\let\tabu@immediate\immediate +\def\tabu@WRITE{\begingroup + \def\immediate\write{\aftergroup\endgroup + \tabu@immediate\tabu@write}% +}% \tabu@WRITE +\expandafter\def\expandafter\tabu@GenericError\expandafter{% + \expandafter\tabu@WRITE\GenericError} +\def\tabu@warn{\tabu@WRITE\PackageWarning{tabu}} +\def\tabu@noxfootnote [#1]{\@gobble} +\def\tabu@nocolor #1#{\@gobble} +\newcommand*\tabu@norowcolor[2][]{} +\def\tabu@maybesiunitx #1{\def\tabu@temp{#1}% + \futurelet\@let@token \tabu@m@ybesiunitx} +\def\tabu@m@ybesiunitx #1{\def\tabu@m@ybesiunitx {% + \ifx #1\@let@token \let\tabu@cellleft \@empty \let\tabu@cellright \@empty \fi + \tabu@temp}% \tabu@m@ybesiunitx +}\expandafter\tabu@m@ybesiunitx \csname siunitx_table_collect_begin:Nn\endcsname +\def\tabu@celllalign@def #1{\def\tabu@celllalign{\tabu@maybesiunitx{#1}}}% +%% Fixed vertical spacing adjustment: \extrarowsep ------------------ +\newcommand*\extrarowsep{\edef\tabu@C@extra{\the\numexpr\tabu@C@extra+1}% + \iftabu@everyrow \aftergroup\tabu@Gextra + \else \aftergroup\tabu@n@Gextra + \fi + \@ifnextchar={\tabu@gobbletoken\tabu@extra} \tabu@extra +}% \extrarowsep +\def\tabu@extra {\@ifnextchar_% + {\tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}} + {\ifx ^\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}}% + \else \let\tabu@temp \@empty + \afterassignment \tabu@setextrasep \extrarowdepth + \fi \tabu@temp}% +}% \tabu@extra +\def\tabu@setextra #1#2{\def\tabu@temp{\tabu@extr@#1#2}\afterassignment\tabu@temp#2} +\def\tabu@extr@ #1#2{\@ifnextchar^% + {\tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}} + {\ifx _\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}}% + \else \let\tabu@temp \@empty + \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth + \fi \tabu@temp}% +}% \tabu@extr@ +\def\tabu@setextrasep {\extrarowheight=\extrarowdepth + \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth +}% \tabu@setextrasep +\def\tabu@Gextra{\ifx \tabu@G@extra\@empty \else {\tabu@Rextra}\fi} +\def\tabu@n@Gextra{\ifx \tabu@G@extra\@empty \else \noalign{\tabu@Rextra}\fi} +\def\tabu@Rextra{\tabu@Grestore \tabu@G@extra \tabu@C@extra} +\let\tabu@C@extra \z@ +\let\tabu@G@extra \@empty +%% Dynamic vertical spacing adjustment: \tabulinesep ---------------- +\newcommand*\tabulinesep{\edef\tabu@C@linesep{\the\numexpr\tabu@C@linesep+1}% + \iftabu@everyrow \aftergroup\tabu@Glinesep + \else \aftergroup\tabu@n@Glinesep + \fi + \@ifnextchar={\tabu@gobbletoken\tabu@linesep} \tabu@linesep +}% \tabulinesep +\def\tabu@linesep {\@ifnextchar_% + {\tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}} + {\ifx ^\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}}% + \else \let\tabu@temp \@empty + \afterassignment \tabu@setlinesep \abovetabulinesep + \fi \tabu@temp}% +}% \tabu@linesep +\def\tabu@setsep #1#2{\def\tabu@temp{\tabu@sets@p#1#2}\afterassignment\tabu@temp#2} +\def\tabu@sets@p #1#2{\@ifnextchar^% + {\tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}} + {\ifx _\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}}% + \else \let\tabu@temp \@empty + \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep + \fi \tabu@temp}% +}% \tabu@sets@p +\def\tabu@setlinesep {\belowtabulinesep=\abovetabulinesep + \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep +}% \tabu@setlinesep +\def\tabu@Glinesep{\ifx \tabu@G@linesep\@empty \else {\tabu@Rlinesep}\fi} +\def\tabu@n@Glinesep{\ifx \tabu@G@linesep\@empty \else \noalign{\tabu@Rlinesep}\fi} +\def\tabu@Rlinesep{\tabu@Grestore \tabu@G@linesep \tabu@C@linesep} +\let\tabu@C@linesep \z@ +\let\tabu@G@linesep \@empty +%% \global\extrarowsep and \global\tabulinesep ------------------- +\def\tabu@Gsave #1#2#3#4{\xdef#1{#1% + \toks#2{\toks\the\currentgrouplevel{\global#3\the#3\global#4\the#4}}}% +}% \tabu@Gsave +\def\tabu@Grestore#1#2{% + \toks#2{}#1\toks\currentgrouplevel\expandafter{\expandafter}\the\toks#2\relax + \ifcat$\the\toks\currentgrouplevel$\else + \global\let#1\@empty \global\let#2\z@ + \the\toks\currentgrouplevel + \fi +}% \tabu@Grestore +%% Setting code for every row --------------------------------------- +\newcommand*\everyrow{\tabu@everyrow@bgroup + \tabu@start \z@ \tabu@stop \z@ \tabu@evrstartstop +}% \everyrow +\def\tabu@evrstartstop {\@ifnextchar^% + {\afterassignment \tabu@evrstartstop \tabu@stop=}% + {\ifx ^\@let@token + \afterassignment\tabu@evrstartstop \tabu@start=% + \else \afterassignment\tabu@everyr@w \toks@ + \fi}% +}% \tabu@evrstartstop +\def\tabu@everyr@w {% + \xdef\tabu@everyrow{% + \noexpand\tabu@everyrowfalse + \let\noalign \relax + \noexpand\tabu@rowfontreset + \iftabu@colortbl \noexpand\tabu@rc@ \fi % \taburowcolors + \let\noexpand\tabu@docline \noexpand\tabu@docline@evr + \the\toks@ + \noexpand\tabu@evrh@@k + \noexpand\tabu@rearstrut + \global\advance\c@taburow \@ne}% + \iftabu@everyrow \toks@\expandafter + {\expandafter\def\expandafter\tabu@evr@L\expandafter{\the\toks@}\ignorespaces}% + \else \xdef\tabu@evr@G{\the\toks@}% + \fi + \tabu@everyrow@egroup +}% \tabu@everyr@w +\def\tabu@evr {\def\tabu@evrh@@k} % for internal use only +\tabu@evr{} +%% line style and leaders ------------------------------------------- +\newcommand*\newtabulinestyle [1]{% + {\@for \@tempa :=#1\do{\expandafter\tabu@newlinestyle \@tempa==\@nil}}% +}% \newtabulinestyle +\def\tabu@newlinestyle #1=#2=#3\@nil{\tabu@getline {#2}% + \tabu@sanitizearg {#1}\@tempa + \ifodd 1\ifx \@tempa\@empty \ifdefined\tabu@linestyle@ 0 \fi\fi + \global\expandafter\let + \csname tabu@linestyle@\@tempa \endcsname =\tabu@thestyle \fi +}% \tabu@newlinestyle +\newcommand*\tabulinestyle [1]{\tabu@everyrow@bgroup \tabu@getline{#1}% + \iftabu@everyrow + \toks@\expandafter{\expandafter \def \expandafter + \tabu@ls@L\expandafter{\tabu@thestyle}\ignorespaces}% + \gdef\tabu@ls@{\tabu@ls@L}% + \else + \global\let\tabu@ls@G \tabu@thestyle + \gdef\tabu@ls@{\tabu@ls@G}% + \fi + \tabu@everyrow@egroup +}% \tabulinestyle +\newcommand*\taburulecolor{\tabu@everyrow@bgroup \tabu@textbar \tabu@rulecolor} +\def\tabu@rulecolor #1{\toks@{}% + \def\tabu@temp #1##1#1{\tabu@ruledrsc{##1}}\@ifnextchar #1% + \tabu@temp + \tabu@rulearc +}% \tabu@rulecolor +\def\tabu@ruledrsc #1{\edef\tabu@temp{#1}\tabu@strtrim\tabu@temp + \ifx \tabu@temp\@empty \def\tabu@temp{\tabu@rule@drsc@ {}{}}% + \else \edef\tabu@temp{\noexpand\tabu@rule@drsc@ {}{\tabu@temp}}% + \fi + \tabu@temp +}% \tabu@ruledrsc@ +\def\tabu@ruledrsc@ #1#{\tabu@rule@drsc@ {#1}} +\def\tabu@rule@drsc@ #1#2{% + \iftabu@everyrow + \ifx \\#1#2\\\toks@{\let\CT@drsc@ \relax}% + \else \toks@{\def\CT@drsc@{\color #1{#2}}}% + \fi + \else + \ifx \\#1#2\\\global\let\CT@drsc@ \relax + \else \gdef\CT@drsc@{\color #1{#2}}% + \fi + \fi + \tabu@rulearc +}% \tabu@rule@drsc@ +\def\tabu@rulearc #1#{\tabu@rule@arc@ {#1}} +\def\tabu@rule@arc@ #1#2{% + \iftabu@everyrow + \ifx \\#1#2\\\toks@\expandafter{\the\toks@ \def\CT@arc@{}}% + \else \toks@\expandafter{\the\toks@ \def\CT@arc@{\color #1{#2}}}% + \fi + \toks@\expandafter{\the\toks@ + \let\tabu@arc@L \CT@arc@ + \let\tabu@drsc@L \CT@drsc@ + \ignorespaces}% + \else + \ifx \\#1#2\\\gdef\CT@arc@{}% + \else \gdef\CT@arc@{\color #1{#2}}% + \fi + \global\let\tabu@arc@G \CT@arc@ + \global\let\tabu@drsc@G \CT@drsc@ + \fi + \tabu@everyrow@egroup +}% \tabu@rule@arc@ +\def\taburowcolors {\tabu@everyrow@bgroup \@testopt \tabu@rowcolors 1} +\def\tabu@rowcolors [#1]#2#{\tabu@rowc@lors{#1}{#2}} +\def\tabu@rowc@lors #1#2#3{% + \toks@{}\@defaultunits \count@ =\number0#2\relax \@nnil + \@defaultunits \tabu@start =\number0#1\relax \@nnil + \ifnum \count@<\tw@ \count@=\tw@ \fi + \advance\tabu@start \m@ne + \ifnum \tabu@start<\z@ \tabu@start \z@ \fi + \tabu@rowcolorseries #3\in@..\in@ \@nnil +}% \tabu@rowcolors +\def\tabu@rowcolorseries #1..#2\in@ #3\@nnil {% + \ifx \in@#1\relax + \iftabu@everyrow \toks@{\def\tabu@rc@{}\let\tabu@rc@L \tabu@rc@}% + \else \gdef\tabu@rc@{}\global\let\tabu@rc@G \tabu@rc@ + \fi + \else + \ifx \\#2\\\tabu@rowcolorserieserror \fi + \tabu@sanitizearg{#1}\tabu@temp + \tabu@sanitizearg{#2}\@tempa + \advance\count@ \m@ne + \iftabu@everyrow + \def\tabu@rc@ ##1##2##3##4{\def\tabu@rc@{% + \ifnum ##2=\c@taburow + \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{##3}{##4}\fi + \ifnum \c@taburow<##2 \else + \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\z@ + \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi + \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% + \rowcolor{tabu@rc@\the\tabu@nested}\fi}% + }\edef\x{\noexpand\tabu@rc@ {\the\count@} + {\the\tabu@start} + {\tabu@temp} + {\@tempa}% + }\x + \toks@\expandafter{\expandafter\def\expandafter\tabu@rc@\expandafter{\tabu@rc@}}% + \toks@\expandafter{\the\toks@ \let\tabu@rc@L \tabu@rc@ \ignorespaces}% + \else % inside \noalign + \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{\tabu@temp}{\@tempa}% + \expandafter\resetcolorseries\expandafter[\the\count@]{tabu@rcseries@\the\tabu@nested}% + \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% + \let\noalign \relax \rowcolor{tabu@rc@\the\tabu@nested}% + \def\tabu@rc@ ##1##2{\gdef\tabu@rc@{% + \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\@ne + \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi + \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% + \rowcolor{tabu@rc@\the\tabu@nested}}% + }\edef\x{\noexpand\tabu@rc@{\the\count@}{\the\c@taburow}}\x + \global\let\tabu@rc@G \tabu@rc@ + \fi + \fi + \tabu@everyrow@egroup +}% \tabu@rowcolorseries +\tabuDisableCommands {\let\tabu@rc@ \@empty } +\def\tabu@rowcolorserieserror {\PackageError{tabu} + {Invalid syntax for \string\taburowcolors + \MessageBreak Please look at the documentation!}\@ehd +}% \tabu@rowcolorserieserror +\newcommand*\tabureset {% + \tabulinesep=\z@ \extrarowsep=\z@ \extratabsurround=\z@ + \tabulinestyle{}\everyrow{}\taburulecolor||{}\taburowcolors{}% +}% \tabureset +%% Parsing the line styles ------------------------------------------ +\def\tabu@getline #1{\begingroup + \csname \ifcsname if@safe@actives\endcsname % + @safe@activestrue\else + relax\fi \endcsname + \edef\tabu@temp{#1}\tabu@sanitizearg{#1}\@tempa + \let\tabu@thestyle \relax + \ifcsname tabu@linestyle@\@tempa \endcsname + \edef\tabu@thestyle{\endgroup + \def\tabu@thestyle{\expandafter\noexpand + \csname tabu@linestyle@\@tempa\endcsname}% + }\tabu@thestyle + \else \expandafter\tabu@definestyle \tabu@temp \@nil + \fi +}% \tabu@getline +\def\tabu@definestyle #1#2\@nil {\endlinechar \m@ne \makeatletter + \tabu@thick \maxdimen \tabu@on \maxdimen \tabu@off \maxdimen + \let\tabu@c@lon \@undefined \let\tabu@c@loff \@undefined + \ifodd 1\ifcat .#1\else\ifcat\relax #1\else 0\fi\fi % catcode 12 or non expandable cs + \def\tabu@temp{\tabu@getparam{thick}}% + \else \def\tabu@temp{\tabu@getparam{thick}\maxdimen}% + \fi + {% + \let\tabu@ \relax + \def\:{\obeyspaces \tabu@oXIII \tabu@commaXIII \edef\:}% (space active \: happy ;-)) + \scantokens{\:{\tabu@temp #1#2 \tabu@\tabu@}}% + \expandafter}\expandafter + \def\expandafter\:\expandafter{\:}% line spec rewritten now ;-) + \def\;{\def\:}% + \scantokens\expandafter{\expandafter\;\expandafter{\:}}% space is now inactive (catcode 10) + \let\tabu@ \tabu@getcolor \:% all arguments are ready now ;-) + \ifdefined\tabu@c@lon \else \let\tabu@c@lon\@empty \fi + \ifx \tabu@c@lon\@empty \def\tabu@c@lon{\CT@arc@}\fi + \ifdefined\tabu@c@loff \else \let\tabu@c@loff \@empty \fi + \ifdim \tabu@on=\maxdimen \ifdim \tabu@off<\maxdimen + \tabu@on \tabulineon \fi\fi + \ifdim \tabu@off=\maxdimen \ifdim \tabu@on<\maxdimen + \tabu@off \tabulineoff \fi\fi + \ifodd 1\ifdim \tabu@off=\maxdimen \ifdim \tabu@on=\maxdimen 0 \fi\fi + \in@true % + \else \in@false % + \fi + \ifdim\tabu@thick=\maxdimen \def\tabu@thick{\arrayrulewidth}% + \else \edef\tabu@thick{\the\tabu@thick}% + \fi + \edef \tabu@thestyle ##1##2{\endgroup + \def\tabu@thestyle{% + \ifin@ \noexpand\tabu@leadersstyle {\tabu@thick} + {\the\tabu@on}{##1} + {\the\tabu@off}{##2}% + \else \noexpand\tabu@rulesstyle + {##1\vrule width \tabu@thick}% + {##1\leaders \hrule height \tabu@thick \hfil}% + \fi}% + }\expandafter \expandafter + \expandafter \tabu@thestyle \expandafter + \expandafter \expandafter + {\expandafter\tabu@c@lon\expandafter}\expandafter{\tabu@c@loff}% +}% \tabu@definestyle +{\catcode`\O=\active \lccode`\O=`\o \catcode`\,=\active + \lowercase{\gdef\tabu@oXIII {\catcode`\o=\active \let O=\tabu@oxiii}} + \gdef\tabu@commaXIII {\catcode`\,=\active \let ,=\space} +}% \catcode +\def\tabu@oxiii #1{% + \ifcase \ifx n#1\z@ \else + \ifx f#1\@ne\else + \tw@ \fi\fi + \expandafter\tabu@onxiii + \or \expandafter\tabu@ofxiii + \else o% + \fi#1}% +\def\tabu@onxiii #1#2{% + \ifcase \ifx !#2\tw@ \else + \ifcat.\noexpand#2\z@ \else + \ifx \tabu@spxiii#2\@ne\else + \tw@ \fi\fi\fi + \tabu@getparam{on}#2\expandafter\@gobble + \or \expandafter\tabu@onxiii % (space is active) + \else o\expandafter\@firstofone + \fi{#1#2}}% +\def\tabu@ofxiii #1#2{% + \ifx #2f\expandafter\tabu@offxiii + \else o\expandafter\@firstofone + \fi{#1#2}} +\def\tabu@offxiii #1#2{% + \ifcase \ifx !#2\tw@ \else + \ifcat.\noexpand#2\z@ \else + \ifx\tabu@spxiii#2\@ne \else + \tw@ \fi\fi\fi + \tabu@getparam{off}#2\expandafter\@gobble + \or \expandafter\tabu@offxiii % (space is active) + \else o\expandafter\@firstofone + \fi{#1#2}} +\def\tabu@getparam #1{\tabu@ \csname tabu@#1\endcsname=} +\def\tabu@getcolor #1{% \tabu@ <- \tabu@getcolor after \edef + \ifx \tabu@#1\else % no more spec + \let\tabu@theparam=#1\afterassignment \tabu@getc@l@r #1\fi +}% \tabu@getcolor +\def\tabu@getc@l@r #1\tabu@ {% + \def\tabu@temp{#1}\tabu@strtrim \tabu@temp + \ifx \tabu@temp\@empty + \else%\ifcsname \string\color@\tabu@temp \endcsname % if the color exists + \ifx \tabu@theparam \tabu@off \let\tabu@c@loff \tabu@c@l@r + \else \let\tabu@c@lon \tabu@c@l@r + \fi + %\else \tabu@warncolour{\tabu@temp}% + \fi%\fi + \tabu@ % next spec +}% \tabu@getc@l@r +\def\tabu@warncolour #1{\PackageWarning{tabu} + {Color #1 is not defined. Default color used}% +}% \tabu@warncolour +\def\tabu@leadersstyle #1#2#3#4#5{\def\tabu@leaders{{#1}{#2}{#3}{#4}{#5}}% + \ifx \tabu@leaders\tabu@leaders@G \else + \tabu@LEADERS{#1}{#2}{#3}{#4}{#5}\fi +}% \tabu@leadersstyle +\def\tabu@rulesstyle #1#2{\let\tabu@leaders \@undefined + \gdef\tabu@thevrule{#1}\gdef\tabu@thehrule{#2}% +}% \tabu@rulesstyle +%% The leaders boxes ------------------------------------------------ +\def\tabu@LEADERS #1#2#3#4#5{%% width, dash, dash color, gap, gap color + {\let\color \tabu@color % => during trials -> \color = \tabu@nocolor + {% % but the leaders boxes should have colors ! + \def\@therule{\vrule}\def\@thick{height}\def\@length{width}% + \def\@box{\hbox}\def\@unbox{\unhbox}\def\@elt{\wd}% + \def\@skip{\hskip}\def\@ss{\hss}\def\tabu@leads{\tabu@hleads}% + \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}% + \global\let\tabu@thehleaders \tabu@theleaders + }% + {% + \def\@therule{\hrule}\def\@thick{width}\def\@length{height}% + \def\@box{\vbox}\def\@unbox{\unvbox}\def\@elt{\ht}% + \def\@skip{\vskip}\def\@ss{\vss}\def\tabu@leads{\tabu@vleads}% + \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}% + \global\let\tabu@thevleaders \tabu@theleaders + }% + \gdef\tabu@leaders@G{{#1}{#2}{#3}{#4}{#5}}% + }% +}% \tabu@LEADERS +\def\tabu@therule #1#2{\@therule \@thick#1\@length\dimexpr#2/2 \@depth\z@} +\def\tabu@l@@d@rs #1#2#3#4#5{%% width, dash, dash color, gap, gap color + \global\setbox \tabu@leads=\@box{% + {#3\tabu@therule{#1}{#2}}% + \ifx\\#5\\\@skip#4\else{#5\tabu@therule{#1}{#4*2}}\fi + {#3\tabu@therule{#1}{#2}}}% + \global\setbox\tabu@leads=\@box to\@elt\tabu@leads{\@ss + {#3\tabu@therule{#1}{#2}}\@unbox\tabu@leads}% + \edef\tabu@theleaders ##1{\def\noexpand\tabu@theleaders {% + {##1\tabu@therule{#1}{#2}}% + \xleaders \copy\tabu@leads \@ss + \tabu@therule{0pt}{-#2}{##1\tabu@therule{#1}{#2}}}% + }\tabu@theleaders{#3}% +}% \tabu@l@@d@rs +%% \tabu \endtabu \tabu* \longtabu \endlongtabu \longtabu* ---------- +\newcommand*\tabu {\tabu@longfalse + \ifmmode \def\tabu@ {\array}\def\endtabu {\endarray}% + \else \def\tabu@ {\tabu@tabular}\def\endtabu {\endtabular}\fi + \expandafter\let\csname tabu*\endcsname \tabu + \expandafter\def\csname endtabu*\endcsname{\endtabu}% + \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget +}% {tabu} +\let\tabu@tabular \tabular % +\expandafter\def\csname tabu*\endcsname{\tabuscantokenstrue \tabu} +\newcommand*\longtabu {\tabu@longtrue + \ifmmode\PackageError{tabu}{longtabu not allowed in math mode}\fi + \def\tabu@{\longtable}\def\endlongtabu{\endlongtable}% + \LTchunksize=\@M + \expandafter\let\csname tabu*\endcsname \tabu + \expandafter\def\csname endlongtabu*\endcsname{\endlongtabu}% + \let\LT@startpbox \tabu@LT@startpbox % \everypar{ array struts } + \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget +}% {longtabu} +\expandafter\def\csname longtabu*\endcsname{\tabuscantokenstrue \longtabu} +\def\tabu@nolongtabu{\PackageError{tabu} + {longtabu requires the longtable package}\@ehd} +%% Read the target and then : \tabular or \@array ------------------ +\def\tabu@settarget {\futurelet\@let@token \tabu@sett@rget } +\def\tabu@sett@rget {\tabu@target \z@ + \ifcase \ifx \bgroup\@let@token \z@ \else + \ifx \@sptoken\@let@token \@ne \else + \if t\@let@token \tw@ \else + \if s\@let@token \thr@@\else + \z@\fi\fi\fi\fi + \expandafter\tabu@begin + \or \expandafter\tabu@gobblespace\expandafter\tabu@settarget + \or \expandafter\tabu@to + \or \expandafter\tabu@spread + \fi +}% \tabu@sett@rget +\def\tabu@to to{\def\tabu@halignto{to}\tabu@gettarget} +\def\tabu@spread spread{\tabu@spreadtrue\def\tabu@halignto{spread}\tabu@gettarget} +\def\tabu@gettarget {\afterassignment\tabu@linegoaltarget \tabu@target } +\def\tabu@linegoaltarget {\futurelet\tabu@temp \tabu@linegoalt@rget } +\def\tabu@linegoalt@rget {% + \ifx \tabu@temp\LNGL@setlinegoal + \LNGL@setlinegoal \expandafter \@firstoftwo \fi % @gobbles \LNGL@setlinegoal + \tabu@begin +}% \tabu@linegoalt@rget +\def\tabu@begin #1#{% + \iftabu@measuring \expandafter\tabu@nestedmeasure \fi + \ifdim \tabu@target=\z@ \let\tabu@halignto \@empty + \else \edef\tabu@halignto{\tabu@halignto\the\tabu@target}% + \fi + \@testopt \tabu@tabu@ \tabu@aligndefault #1\@nil +}% \tabu@begin +\long\def\tabu@tabu@ [#1]#2\@nil #3{\tabu@setup + \def\tabu@align {#1}\def\tabu@savedpream{\NC@find #3}% + \tabu@ [\tabu@align ]#2{#3\tabu@rewritefirst }% +}% \tabu@tabu@ +\def\tabu@nestedmeasure {% + \ifodd 1\iftabu@spread \else \ifdim\tabu@target=\z@ \else 0 \fi\fi\relax + \tabu@spreadtrue + \else \begingroup \iffalse{\fi \ifnum0=`}\fi + \toks@{}\def\tabu@stack{b}% + \expandafter\tabu@collectbody\expandafter\tabu@quickrule + \expandafter\endgroup + \fi +}% \tabu@nestedmeasure +\def\tabu@quickrule {\indent\vrule height\z@ depth\z@ width\tabu@target} +%% \tabu@setup \tabu@init \tabu@indent +\def\tabu@setup{\tabu@alloc@ + \ifcase \tabu@nested + \ifmmode \else \iftabu@spread\else \ifdim\tabu@target=\z@ + \let\tabu@afterendpar \par + \fi\fi\fi + \def\tabu@aligndefault{c}\tabu@init \tabu@indent + \else % + \def\tabu@aligndefault{t}\let\tabudefaulttarget \linewidth + \fi + \let\tabu@thetarget \tabudefaulttarget \let\tabu@restored \@undefined + \edef\tabu@NC@list{\the\NC@list}\NC@list{\NC@do \tabu@rewritefirst}% + \everycr{}\let\@startpbox \tabu@startpbox % for nested tabu inside longtabu... + \let\@endpbox \tabu@endpbox % idem " " " " " " + \let\@tabarray \tabu@tabarray % idem " " " " " " + \tabu@setcleanup \tabu@setreset +}% \tabu@setup +\def\tabu@init{\tabu@starttimer \tabu@measuringfalse + \edef\tabu@hfuzz {\the\dimexpr\hfuzz+1sp}\global\tabu@footnotes{}% + \let\firsthline \tabu@firsthline \let\lasthline \tabu@lasthline + \let\firstline \tabu@firstline \let\lastline \tabu@lastline + \let\hline \tabu@hline \let\@xhline \tabu@xhline + \let\color \tabu@color \let\@arstrutbox \tabu@arstrutbox + \iftabu@colortbl\else\let\LT@@hline \tabu@LT@@hline \fi + \tabu@trivlist % + \let\@footnotetext \tabu@footnotetext \let\@xfootnotetext \tabu@xfootnotetext + \let\@xfootnote \tabu@xfootnote \let\centering \tabu@centering + \let\raggedright \tabu@raggedright \let\raggedleft \tabu@raggedleft + \let\tabudecimal \tabu@tabudecimal \let\Centering \tabu@Centering + \let\RaggedRight \tabu@RaggedRight \let\RaggedLeft \tabu@RaggedLeft + \let\justifying \tabu@justifying \let\rowfont \tabu@rowfont + \let\fbox \tabu@fbox \let\color@b@x \tabu@color@b@x + \let\tabu@@everycr \everycr \let\tabu@@everypar \everypar + \let\tabu@prepnext@tokORI \prepnext@tok\let\prepnext@tok \tabu@prepnext@tok + \let\tabu@multicolumnORI\multicolumn \let\multicolumn \tabu@multicolumn + \let\tabu@startpbox \@startpbox % for nested tabu inside longtabu pfff !!! + \let\tabu@endpbox \@endpbox % idem " " " " " " " + \let\tabu@tabarray \@tabarray % idem " " " " " " " + \tabu@adl@fix \let\endarray \tabu@endarray % colortbl & arydshln (delarray) + \iftabu@colortbl\CT@everycr\expandafter{\expandafter\iftabu@everyrow \the\CT@everycr \fi}\fi +}% \tabu@init +\def\tabu@indent{% correction for indentation + \ifdim \parindent>\z@\ifx \linewidth\tabudefaulttarget + \everypar\expandafter{% + \the\everypar\everypar\expandafter{\the\everypar}% + \setbox\z@=\lastbox + \ifdim\wd\z@>\z@ \edef\tabu@thetarget + {\the\dimexpr -\wd\z@+\tabudefaulttarget}\fi + \box\z@}% + \fi\fi +}% \tabu@indent +\def\tabu@setcleanup {% saves last global assignments + \ifodd 1\ifmmode \else \iftabu@long \else 0\fi\fi\relax + \def\tabu@aftergroupcleanup{% + \def\tabu@aftergroupcleanup{\aftergroup\tabu@cleanup}}% + \else + \def\tabu@aftergroupcleanup{% + \aftergroup\aftergroup\aftergroup\tabu@cleanup + \let\tabu@aftergroupcleanup \relax}% + \fi + \let\tabu@arc@Gsave \tabu@arc@G + \let\tabu@arc@G \tabu@arc@L % + \let\tabu@drsc@Gsave \tabu@drsc@G + \let\tabu@drsc@G \tabu@drsc@L % + \let\tabu@ls@Gsave \tabu@ls@G + \let\tabu@ls@G \tabu@ls@L % + \let\tabu@rc@Gsave \tabu@rc@G + \let\tabu@rc@G \tabu@rc@L % + \let\tabu@evr@Gsave \tabu@evr@G + \let\tabu@evr@G \tabu@evr@L % + \let\tabu@celllalign@save \tabu@celllalign + \let\tabu@cellralign@save \tabu@cellralign + \let\tabu@cellleft@save \tabu@cellleft + \let\tabu@cellright@save \tabu@cellright + \let\tabu@@celllalign@save \tabu@@celllalign + \let\tabu@@cellralign@save \tabu@@cellralign + \let\tabu@@cellleft@save \tabu@@cellleft + \let\tabu@@cellright@save \tabu@@cellright + \let\tabu@rowfontreset@save \tabu@rowfontreset + \let\tabu@@rowfontreset@save\tabu@@rowfontreset + \let\tabu@rowfontreset \@empty + \edef\tabu@alloc@save {\the\tabu@alloc}% restore at \tabu@reset + \edef\c@taburow@save {\the\c@taburow}% + \edef\tabu@naturalX@save {\the\tabu@naturalX}% + \let\tabu@naturalXmin@save \tabu@naturalXmin + \let\tabu@naturalXmax@save \tabu@naturalXmax + \let\tabu@mkarstrut@save \tabu@mkarstrut + \edef\tabu@clarstrut{% + \extrarowheight \the\dimexpr \ht\@arstrutbox-\ht\strutbox \relax + \extrarowdepth \the\dimexpr \dp\@arstrutbox-\dp\strutbox \relax + \let\noexpand\@arraystretch \@ne \noexpand\tabu@rearstrut}% +}% \tabu@setcleanup +\def\tabu@cleanup {\begingroup + \globaldefs\@ne \tabu@everyrowtrue + \let\tabu@arc@G \tabu@arc@Gsave + \let\CT@arc@ \tabu@arc@G + \let\tabu@drsc@G \tabu@drsc@Gsave + \let\CT@drsc@ \tabu@drsc@G + \let\tabu@ls@G \tabu@ls@Gsave + \let\tabu@ls@ \tabu@ls@G + \let\tabu@rc@G \tabu@rc@Gsave + \let\tabu@rc@ \tabu@rc@G + \let\CT@do@color \relax + \let\tabu@evr@G \tabu@evr@Gsave + \let\tabu@celllalign \tabu@celllalign@save + \let\tabu@cellralign \tabu@cellralign@save + \let\tabu@cellleft \tabu@cellleft@save + \let\tabu@cellright \tabu@cellright@save + \let\tabu@@celllalign \tabu@@celllalign@save + \let\tabu@@cellralign \tabu@@cellralign@save + \let\tabu@@cellleft \tabu@@cellleft@save + \let\tabu@@cellright \tabu@@cellright@save + \let\tabu@rowfontreset \tabu@rowfontreset@save + \let\tabu@@rowfontreset \tabu@@rowfontreset@save + \tabu@naturalX =\tabu@naturalX@save + \let\tabu@naturalXmax \tabu@naturalXmax@save + \let\tabu@naturalXmin \tabu@naturalXmin@save + \let\tabu@mkarstrut \tabu@mkarstrut@save + \c@taburow =\c@taburow@save + \ifcase \tabu@nested \tabu@alloc \m@ne\fi + \endgroup % + \ifcase \tabu@nested + \the\tabu@footnotes \global\tabu@footnotes{}% + \tabu@afterendpar \tabu@elapsedtime + \fi + \tabu@clarstrut + \everyrow\expandafter {\tabu@evr@G}% +}% \tabu@cleanup +\let\tabu@afterendpar \relax +\def\tabu@setreset {% + \edef\tabu@savedparams {% \relax for \tabu@message@save + \ifmmode \col@sep \the\arraycolsep + \else \col@sep \the\tabcolsep \fi \relax + \arrayrulewidth \the\arrayrulewidth \relax + \doublerulesep \the\doublerulesep \relax + \extratabsurround \the\extratabsurround \relax + \extrarowheight \the\extrarowheight \relax + \extrarowdepth \the\extrarowdepth \relax + \abovetabulinesep \the\abovetabulinesep \relax + \belowtabulinesep \the\belowtabulinesep \relax + \def\noexpand\arraystretch{\arraystretch}% + \ifdefined\minrowclearance \minrowclearance\the\minrowclearance\relax\fi}% + \begingroup + \@temptokena\expandafter{\tabu@savedparams}% => only for \savetabu / \usetabu + \ifx \tabu@arc@L\relax \else \tabu@setsave \tabu@arc@L \fi + \ifx \tabu@drsc@L\relax \else \tabu@setsave \tabu@drsc@L \fi + \tabu@setsave \tabu@ls@L \tabu@setsave \tabu@evr@L + \expandafter \endgroup \expandafter + \def\expandafter\tabu@saved@ \expandafter{\the\@temptokena + \let\tabu@arc@G \tabu@arc@L + \let\tabu@drsc@G \tabu@drsc@L + \let\tabu@ls@G \tabu@ls@L + \let\tabu@rc@G \tabu@rc@L + \let\tabu@evr@G \tabu@evr@L}% + \def\tabu@reset{\tabu@savedparams + \tabu@everyrowtrue \c@taburow \z@ + \let\CT@arc@ \tabu@arc@L + \let\CT@drsc@ \tabu@drsc@L + \let\tabu@ls@ \tabu@ls@L + \let\tabu@rc@ \tabu@rc@L + \global\tabu@alloc \tabu@alloc@save + \everyrow\expandafter{\tabu@evr@L}}% +}% \tabu@reset +\def\tabu@setsave #1{\expandafter\tabu@sets@ve #1\@nil{#1}} +\long\def\tabu@sets@ve #1\@nil #2{\@temptokena\expandafter{\the\@temptokena \def#2{#1}}} +%% The Rewriting Process ------------------------------------------- +\def\tabu@newcolumntype #1{% + \expandafter\tabu@new@columntype + \csname NC@find@\string#1\expandafter\endcsname + \csname NC@rewrite@\string#1\endcsname + {#1}% +}% \tabu@newcolumntype +\def\tabu@new@columntype #1#2#3{% + \def#1##1#3{\NC@{##1}}% + \let#2\relax \newcommand*#2% +}% \tabu@new@columntype +\def\tabu@privatecolumntype #1{% + \expandafter\tabu@private@columntype + \csname NC@find@\string#1\expandafter\endcsname + \csname NC@rewrite@\string#1\expandafter\endcsname + \csname tabu@NC@find@\string#1\expandafter\endcsname + \csname tabu@NC@rewrite@\string#1\endcsname + {#1}% +}% \tabu@privatecolumntype +\def\tabu@private@columntype#1#2#3#4{% + \g@addto@macro\tabu@privatecolumns{\let#1#3\let#2#4}% + \tabu@new@columntype#3#4% +}% \tabu@private@columntype +\let\tabu@privatecolumns \@empty +\newcommand*\tabucolumn [1]{\expandafter \def \expandafter + \tabu@highprioritycolumns\expandafter{\tabu@highprioritycolumns + \NC@do #1}}% +\let\tabu@highprioritycolumns \@empty +%% The | ``column'' : rewriting process -------------------------- +\tabu@privatecolumntype |{\tabu@rewritevline} +\newcommand*\tabu@rewritevline[1][]{\tabu@vlinearg{#1}% + \expandafter \NC@find \tabu@rewritten} +\def\tabu@lines #1{% + \ifx|#1\else \tabu@privatecolumntype #1{\tabu@rewritevline}\fi + \NC@list\expandafter{\the\NC@list \NC@do #1}% +}% \tabu@lines@ +\def\tabu@vlinearg #1{% + \ifx\\#1\\\def\tabu@thestyle {\tabu@ls@}% + \else\tabu@getline {#1}% + \fi + \def\tabu@rewritten ##1{\def\tabu@rewritten{!{##1\tabu@thevline}}% + }\expandafter\tabu@rewritten\expandafter{\tabu@thestyle}% + \expandafter \tabu@keepls \tabu@thestyle \@nil +}% \tabu@vlinearg +\def\tabu@keepls #1\@nil{% + \ifcat $\@cdr #1\@nil $% + \ifx \relax#1\else + \ifx \tabu@ls@#1\else + \let#1\relax + \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer + \tabu@savels\noexpand#1}\fi\fi\fi +}% \tabu@keepls +\def\tabu@thevline {\begingroup + \ifdefined\tabu@leaders + \setbox\@tempboxa=\vtop to\dimexpr + \ht\@arstrutbox+\dp\@arstrutbox{{\tabu@thevleaders}}% + \ht\@tempboxa=\ht\@arstrutbox \dp\@tempboxa=\dp\@arstrutbox + \box\@tempboxa + \else + \tabu@thevrule + \fi \endgroup +}% \tabu@thevline +\def\tabu@savels #1{% + \expandafter\let\csname\string#1\endcsname #1% + \expandafter\def\expandafter\tabu@reset\expandafter{\tabu@reset + \tabu@resetls#1}}% +\def\tabu@resetls #1{\expandafter\let\expandafter#1\csname\string#1\endcsname}% +%% \multicolumn inside tabu environment ----------------------------- +\tabu@newcolumntype \tabu@rewritemulticolumn{% + \aftergroup \tabu@endrewritemulticolumn % after \@mkpream group + \NC@list{\NC@do *}\tabu@textbar \tabu@lines + \tabu@savedecl + \tabu@privatecolumns + \NC@list\expandafter{\the\expandafter\NC@list \tabu@NC@list}% + \let\tabu@savels \relax + \NC@find +}% \tabu@rewritemulticolumn +\def\tabu@endrewritemulticolumn{\gdef\tabu@mkpreambuffer{}\endgroup} +\def\tabu@multicolumn{\tabu@ifenvir \tabu@multic@lumn \tabu@multicolumnORI} +\long\def\tabu@multic@lumn #1#2#3{\multispan{#1}\begingroup + \tabu@everyrowtrue + \NC@list{\NC@do \tabu@rewritemulticolumn}% + \expandafter\@gobbletwo % gobbles \multispan{#1} + \tabu@multicolumnORI{#1}{\tabu@rewritemulticolumn #2}% + {\iftabuscantokens \tabu@rescan \else \expandafter\@firstofone \fi + {#3}}% +}% \tabu@multic@lumn +%% The X column(s): rewriting process ----------------------------- +\tabu@privatecolumntype X[1][]{\begingroup \tabu@siunitx{\endgroup \tabu@rewriteX {#1}}} +\def\tabu@nosiunitx #1{#1{}{}\expandafter \NC@find \tabu@rewritten } +\def\tabu@siunitx #1{\@ifnextchar \bgroup + {\tabu@rewriteX@Ss{#1}} + {\tabu@nosiunitx{#1}}} +\def\tabu@rewriteX@Ss #1#2{\@temptokena{}% + \@defaultunits \let\tabu@temp =#2\relax\@nnil + \ifodd 1\ifx S\tabu@temp \else \ifx s\tabu@temp \else 0 \fi\fi + \def\NC@find{\def\NC@find >####1####2<####3\relax{#1 {####1}{####3}% + }\expandafter\NC@find \the\@temptokena \relax + }\expandafter\NC@rewrite@S \@gobble #2\relax + \else \tabu@siunitxerror + \fi + \expandafter \NC@find \tabu@rewritten +}% \tabu@rewriteX@Ss +\def\tabu@siunitxerror {\PackageError{tabu}{Not a S nor s column ! + \MessageBreak X column can only embed siunitx S or s columns}\@ehd +}% \tabu@siunitxerror +\def\tabu@rewriteX #1#2#3{\tabu@Xarg {#1}{#2}{#3}% + \iftabu@measuring + \else \tabu@measuringtrue % first X column found in the preamble + \let\@halignto \relax \let\tabu@halignto \relax + \iftabu@spread \tabu@spreadtarget \tabu@target \tabu@target \z@ + \else \tabu@spreadtarget \z@ \fi + \ifdim \tabu@target=\z@ + \setlength\tabu@target \tabu@thetarget + \tabu@message{\tabu@message@defaulttarget}% + \else \tabu@message{\tabu@message@target}\fi + \fi +}% \tabu@rewriteX +\def\tabu@rewriteXrestore #1#2#3{\let\@halignto \relax + \def\tabu@rewritten{l}} +\def\tabu@Xarg #1#2#3{% + \advance\tabu@Xcol \@ne \let\tabu@Xlcr \@empty + \let\tabu@Xdisp \@empty \let\tabu@Xmath \@empty + \ifx\\#1\\% + \def\tabu@rewritten{p}\tabucolX \p@ % + \else + \let\tabu@rewritten \@empty \let\tabu@temp \@empty \tabucolX \z@ + \tabu@Xparse {}#1\relax + \fi + \tabu@Xrewritten{#2}{#3}% +}% \tabu@Xarg +\def\tabu@Xparse #1{\futurelet\@let@token \tabu@Xtest} +\expandafter\def\expandafter\tabu@Xparsespace\space{\tabu@Xparse{}} +\def\tabu@Xtest{% + \ifcase \ifx \relax\@let@token \z@ \else + \if ,\@let@token \m@ne\else + \if p\@let@token 1\else + \if m\@let@token 2\else + \if b\@let@token 3\else + \if l\@let@token 4\else + \if c\@let@token 5\else + \if r\@let@token 6\else + \if j\@let@token 7\else + \if L\@let@token 8\else + \if C\@let@token 9\else + \if R\@let@token 10\else + \if J\@let@token 11\else + \ifx \@sptoken\@let@token 12\else + \if .\@let@token 13\else + \if -\@let@token 13\else + \ifcat $\@let@token 14\else + 15\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax + \or \tabu@Xtype {p}% + \or \tabu@Xtype {m}% + \or \tabu@Xtype {b}% + \or \tabu@Xalign \raggedright\relax + \or \tabu@Xalign \centering\relax + \or \tabu@Xalign \raggedleft\relax + \or \tabu@Xalign \tabu@justify\relax + \or \tabu@Xalign \RaggedRight\raggedright + \or \tabu@Xalign \Centering\centering + \or \tabu@Xalign \RaggedLeft\raggedleft + \or \tabu@Xalign \justifying\tabu@justify + \or \expandafter \tabu@Xparsespace + \or \expandafter \tabu@Xcoef + \or \expandafter \tabu@Xm@th + \or \tabu@Xcoef{}% + \else\expandafter \tabu@Xparse + \fi +}% \tabu@Xtest +\def\tabu@Xalign #1#2{% + \ifx \tabu@Xlcr\@empty \else \PackageWarning{tabu} + {Duplicate horizontal alignment specification}\fi + \ifdefined#1\def\tabu@Xlcr{#1}\let#1\relax + \else \def\tabu@Xlcr{#2}\let#2\relax\fi + \expandafter\tabu@Xparse +}% \tabu@Xalign +\def\tabu@Xtype #1{% + \ifx \tabu@rewritten\@empty \else \PackageWarning{tabu} + {Duplicate vertical alignment specification}\fi + \def\tabu@rewritten{#1}\expandafter\tabu@Xparse +}% \tabu@Xtype +\def\tabu@Xcoef#1{\edef\tabu@temp{\tabu@temp#1}% + \afterassignment\tabu@Xc@ef \tabu@cnt\number\if-#10\fi +}% \tabu@Xcoef +\def\tabu@Xc@ef{\advance\tabucolX \tabu@temp\the\tabu@cnt\p@ + \tabu@Xparse{}% +}% \tabu@Xc@ef +\def\tabu@Xm@th #1{\futurelet \@let@token \tabu@Xd@sp} +\def\tabu@Xd@sp{\let\tabu@Xmath=$% + \ifx $\@let@token \def\tabu@Xdisp{\displaystyle}% + \expandafter\tabu@Xparse + \else \expandafter\tabu@Xparse\expandafter{\expandafter}% + \fi +}% \tabu@Xd@sp +\def\tabu@Xrewritten {% + \ifx \tabu@rewritten\@empty \def\tabu@rewritten{p}\fi + \ifdim \tabucolX<\z@ \tabu@negcoeftrue + \else\ifdim \tabucolX=\z@ \tabucolX \p@ + \fi\fi + \edef\tabu@temp{{\the\tabu@Xcol}{\tabu@strippt\tabucolX}}% + \edef\tabu@Xcoefs{\tabu@Xcoefs \tabu@ \tabu@temp}% + \edef\tabu@rewritten ##1##2{\def\noexpand\tabu@rewritten{% + >{\tabu@Xlcr \ifx$\tabu@Xmath$\tabu@Xdisp\fi ##1}% + \tabu@rewritten {\tabu@hsize \tabu@temp}% + <{##2\ifx$\tabu@Xmath$\fi}}% + }\tabu@rewritten +}% \tabu@Xrewritten +\def\tabu@hsize #1#2{% + \ifdim #2\p@<\z@ + \ifdim \tabucolX=\maxdimen \tabu@wd{#1}\else + \ifdim \tabu@wd{#1}<-#2\tabucolX \tabu@wd{#1}\else -#2\tabucolX\fi + \fi + \else #2\tabucolX + \fi +}% \tabu@hsize +%% \usetabu and \preamble: rewriting process --------------------- +\tabu@privatecolumntype \usetabu [1]{% + \ifx\\#1\\\tabu@saveerr{}\else + \@ifundefined{tabu@saved@\string#1} + {\tabu@saveerr{#1}} + {\let\tabu@rewriteX \tabu@rewriteXrestore + \csname tabu@saved@\string#1\expandafter\endcsname\expandafter\@ne}% + \fi +}% \NC@rewrite@\usetabu +\tabu@privatecolumntype \preamble [1]{% + \ifx\\#1\\\tabu@saveerr{}\else + \@ifundefined{tabu@saved@\string#1} + {\tabu@saveerr{#1}} + {\csname tabu@saved@\string#1\expandafter\endcsname\expandafter\z@}% + \fi +}% \NC@rewrite@\preamble +%% Controlling the rewriting process ------------------------------- +\tabu@newcolumntype \tabu@rewritefirst{% + \iftabu@long \aftergroup \tabu@longpream % + \else \aftergroup \tabu@pream + \fi + \let\tabu@ \relax \let\tabu@hsize \relax + \let\tabu@Xcoefs \@empty \let\tabu@savels \relax + \tabu@Xcol \z@ \tabu@cnt \tw@ + \gdef\tabu@mkpreambuffer{\tabu@{}}\tabu@measuringfalse + \global\setbox\@arstrutbox \box\@arstrutbox + \NC@list{\NC@do *}\tabu@textbar \tabu@lines + \NC@list\expandafter{\the\NC@list \NC@do X}% + \iftabu@siunitx % + \NC@list\expandafter{\the\NC@list \NC@do S\NC@do s}\fi + \NC@list\expandafter{\the\expandafter\NC@list \tabu@highprioritycolumns}% + \expandafter\def\expandafter\tabu@NC@list\expandafter{% + \the\expandafter\NC@list \tabu@NC@list}% % * | X S + \NC@list\expandafter{\expandafter \NC@do \expandafter\usetabu + \expandafter \NC@do \expandafter\preamble + \the\NC@list \NC@do \tabu@rewritemiddle + \NC@do \tabu@rewritelast}% + \tabu@savedecl + \tabu@privatecolumns + \edef\tabu@prev{\the\@temptokena}\NC@find \tabu@rewritemiddle +}% NC@rewrite@\tabu@rewritefirst +\tabu@newcolumntype \tabu@rewritemiddle{% + \edef\tabu@temp{\the\@temptokena}\NC@find \tabu@rewritelast +}% \NC@rewrite@\tabu@rewritemiddle +\tabu@newcolumntype \tabu@rewritelast{% + \ifx \tabu@temp\tabu@prev \advance\tabu@cnt \m@ne + \NC@list\expandafter{\tabu@NC@list \NC@do \tabu@rewritemiddle + \NC@do \tabu@rewritelast}% + \else \let\tabu@prev\tabu@temp + \fi + \ifcase \tabu@cnt \expandafter\tabu@endrewrite + \else \expandafter\NC@find \expandafter\tabu@rewritemiddle + \fi +}% \NC@rewrite@\tabu@rewritelast +%% Choosing the strategy -------------------------------------------- +\def\tabu@endrewrite {% + \let\tabu@temp \NC@find + \ifx \@arrayright\relax \let\@arrayright \@empty \fi + \count@=% + \ifx \@finalstrut\tabu@finalstrut \z@ % outer in mode 0 print + \iftabu@measuring + \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer + \tabu@target \csname tabu@\the\tabu@nested.T\endcsname + \tabucolX \csname tabu@\the\tabu@nested.X\endcsname + \edef\@halignto {\ifx\@arrayright\@empty to\tabu@target\fi}}% + \fi + \else\iftabu@measuring 4 % X columns + \xdef\tabu@mkpreambuffer{\tabu@{\tabu@mkpreambuffer + \tabu@target \the\tabu@target + \tabu@spreadtarget \the\tabu@spreadtarget}% + \def\noexpand\tabu@Xcoefs{\tabu@Xcoefs}% + \edef\tabu@halignto{\ifx \@arrayright\@empty to\tabu@target\fi}}% + \let\tabu@Xcoefs \relax + \else\ifcase\tabu@nested \thr@@ % outer, no X + \global\let\tabu@afterendpar \relax + \else \@ne % inner, no X, outer in mode 1 or 2 + \fi + \ifdefined\tabu@usetabu + \else \ifdim\tabu@target=\z@ + \else \let\tabu@temp \tabu@extracolsep + \fi\fi + \fi + \fi + \xdef\tabu@mkpreambuffer{\count@ \the\count@ \tabu@mkpreambuffer}% + \tabu@temp +}% \tabu@endrewrite +\def\tabu@extracolsep{\@defaultunits \expandafter\let + \expandafter\tabu@temp \expandafter=\the\@temptokena \relax\@nnil + \ifx \tabu@temp\@sptoken + \expandafter\tabu@gobblespace \expandafter\tabu@extracolsep + \else + \edef\tabu@temp{\noexpand\NC@find + \if |\noexpand\tabu@temp @% + \else\if !\noexpand\tabu@temp @% + \else !% + \fi\fi + {\noexpand\extracolsep\noexpand\@flushglue}}% + \fi + \tabu@temp +}% \tabu@extrac@lsep +%% Implementing the strategy ---------------------------------------- +\long\def\tabu@pream #1\@preamble {% + \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup + \NC@list\expandafter {\tabu@NC@list}% in case of nesting... + \ifdefined\tabu@usetabu \tabu@usetabu \tabu@target \z@ \fi + \let\tabu@savedpreamble \@preamble + \global\let\tabu@elapsedtime \relax + \tabu@thebody ={#1\tabu@aftergroupcleanup}% + \tabu@thebody =\expandafter{\the\expandafter\tabu@thebody + \@preamble}% + \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens ) + \tabu@select +}% \tabu@pream +\long\def\tabu@longpream #1\LT@bchunk #2\LT@bchunk{% + \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup + \NC@list\expandafter {\tabu@NC@list}% in case of nesting... + \let\tabu@savedpreamble \@preamble + \global\let\tabu@elapsedtime \relax + \tabu@thebody ={#1\LT@bchunk #2\tabu@aftergroupcleanup \LT@bchunk}% + \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens ) + \tabu@select +}% \tabu@longpream +\def\tabu@select {% + \ifnum\tabu@nested>\z@ \tabuscantokensfalse \fi + \ifnum \count@=\@ne \iftabu@measuring \count@=\tw@ \fi\fi + \ifcase \count@ + \global\let\tabu@elapsedtime \relax + \tabu@seteverycr + \expandafter \tabuthepreamble % vertical adjustment (inherited from outer) + \or % exit in vertical measure + struts per cell because no X and outer in mode 3 + \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}% + \def\tabu@cellralign{\tabu@verticalspacing}% + \tabu@seteverycr + \expandafter \tabuthepreamble + \or % exit without measure because no X and outer in mode 4 + \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty + \tabu@seteverycr + \expandafter \tabuthepreamble + \else % needs trials + \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty + \tabu@savecounters + \expandafter \tabu@setstrategy + \fi +}% \tabu@select +\def\tabu@@ {\gdef\tabu@mkpreambuffer} +%% Protections to set up before trials ------------------------------ +\def\tabu@setstrategy {\begingroup % + \tabu@trialh@@k \tabu@cnt \z@ % number of trials + \hbadness \@M \let\hbadness \@tempcnta + \hfuzz \maxdimen \let\hfuzz \@tempdima + \let\write \tabu@nowrite\let\GenericError \tabu@GenericError + \let\savetabu \@gobble \let\tabudefaulttarget \linewidth + \let\@footnotetext \@gobble \let\@xfootnote \tabu@xfootnote + \let\color \tabu@nocolor\let\rowcolor \tabu@norowcolor + \let\tabu@aftergroupcleanup \relax % only after the last trial + \tabu@mkpreambuffer + \ifnum \count@>\thr@@ \let\@halignto \@empty \tabucolX@init + \def\tabu@lasttry{\m@ne\p@}\fi + \begingroup \iffalse{\fi \ifnum0=`}\fi + \toks@{}\def\tabu@stack{b}\iftabuscantokens \endlinechar=10 \obeyspaces \fi % + \tabu@collectbody \tabu@strategy % +}% \tabu@setstrategy +\def\tabu@savecounters{% + \def\@elt ##1{\csname c@##1\endcsname\the\csname c@##1\endcsname}% + \edef\tabu@clckpt {\begingroup \globaldefs=\@ne \cl@@ckpt \endgroup}\let\@elt \relax +}% \tabu@savecounters +\def\tabucolX@init {% \tabucolX <= \tabu@target / (sum coefs > 0) + \dimen@ \z@ \tabu@Xsum \z@ \tabucolX \z@ \let\tabu@ \tabu@Xinit \tabu@Xcoefs + \ifdim \dimen@>\z@ + \@tempdima \dimexpr \tabu@target *\p@/\dimen@ + \tabu@hfuzz\relax + \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi + \fi +}% \tabucolX@init +\def\tabu@Xinit #1#2{\tabu@Xcol #1 \advance \tabu@Xsum + \ifdim #2\p@>\z@ #2\p@ \advance\dimen@ #2\p@ + \else -#2\p@ \tabu@negcoeftrue + \@tempdima \dimexpr \tabu@target*\p@/\dimexpr-#2\p@\relax \relax + \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi + \tabu@wddef{#1}{0pt}% + \fi +}% \tabu@Xinit +%% Collecting the environment body ---------------------------------- +\long\def\tabu@collectbody #1#2\end #3{% + \edef\tabu@stack{\tabu@pushbegins #2\begin\end\expandafter\@gobble\tabu@stack}% + \ifx \tabu@stack\@empty + \toks@\expandafter{\expandafter\tabu@thebody\expandafter{\the\toks@ #2}% + \def\tabu@end@envir{\end{#3}}% + \iftabuscantokens + \iftabu@long \def\tabu@endenvir {\end{#3}\tabu@gobbleX}% + \else \def\tabu@endenvir {\let\endarray \@empty + \end{#3}\tabu@gobbleX}% + \fi + \else \def\tabu@endenvir {\end{#3}}\fi}% + \let\tabu@collectbody \tabu@endofcollect + \else\def\tabu@temp{#3}% + \ifx \tabu@temp\@empty \toks@\expandafter{\the\toks@ #2\end }% + \else \ifx\tabu@temp\tabu@@spxiii \toks@\expandafter{\the\toks@ #2\end #3}% + \else \ifx\tabu@temp\tabu@X \toks@\expandafter{\the\toks@ #2\end #3}% + \else \toks@\expandafter{\the\toks@ #2\end{#3}}% + \fi\fi\fi + \fi + \tabu@collectbody{#1}% +}% \tabu@collectbody +\long\def\tabu@pushbegins#1\begin#2{\ifx\end#2\else b\expandafter\tabu@pushbegins\fi}% +\def\tabu@endofcollect #1{\ifnum0=`{}\fi + \expandafter\endgroup \the\toks@ #1% +}% \tabu@endofcollect +%% The trials: switching between strategies ------------------------- +\def\tabu@strategy {\relax % stops \count@ assignment ! + \ifcase\count@ % case 0 = print with vertical adjustment (outer is finished) + \expandafter \tabu@endoftrials + \or % case 1 = exit in vertical measure (outer in mode 3) + \expandafter\xdef\csname tabu@\the\tabu@nested.T\endcsname{\the\tabu@target}% + \expandafter\xdef\csname tabu@\the\tabu@nested.X\endcsname{\the\tabucolX}% + \expandafter \tabu@endoftrials + \or % case 2 = exit with a rule replacing the table (outer in mode 4) + \expandafter \tabu@quickend + \or % case 3 = outer is in mode 3 because of no X + \begingroup + \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}% + \def\tabu@cellralign{\tabu@verticalspacing}% + \expandafter \tabu@measuring + \else % case 4 = horizontal measure + \begingroup + \global\let\tabu@elapsedtime \tabu@message@etime + \long\def\multicolumn##1##2##3{\multispan{##1}}% + \let\tabu@startpboxORI \@startpbox + \iftabu@spread + \def\tabu@naturalXmax {\z@}% + \let\tabu@naturalXmin \tabu@naturalXmax + \tabu@evr{\global\tabu@naturalX \z@}% + \let\@startpbox \tabu@startpboxmeasure + \else\iftabu@negcoef + \let\@startpbox \tabu@startpboxmeasure + \else \let\@startpbox \tabu@startpboxquick + \fi\fi + \expandafter \tabu@measuring + \fi +}% \tabu@strategy +\def\tabu@measuring{\expandafter \tabu@trial \expandafter + \count@ \the\count@ \tabu@endtrial +}% \tabu@measuring +\def\tabu@trial{\iftabu@long \tabu@longtrial \else \tabu@shorttrial \fi} +\def\tabu@shorttrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr + \ifx \tabu@savecounters\relax \else + \let\tabu@savecounters \relax \tabu@clckpt \fi + $\iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi + \expandafter{\expandafter \tabuthepreamble + \the\tabu@thebody + \csname tabu@adl@endtrial\endcsname + \endarray}$\egroup % got \tabu@box +}% \tabu@shorttrial +\def\tabu@longtrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr + \ifx \tabu@savecounters\relax \else + \let\tabu@savecounters \relax \tabu@clckpt \fi + \iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi + \expandafter{\expandafter \tabuthepreamble + \the\tabu@thebody + \tabuendlongtrial}\egroup % got \tabu@box +}% \tabu@longtrial +\def\tabuendlongtrial{% no @ allowed for \scantokens + \LT@echunk \global\setbox\@ne \hbox{\unhbox\@ne}\kern\wd\@ne + \LT@get@widths +}% \tabuendlongtrial +\def\tabu@adl@endtrial{% + \crcr \noalign{\global\adl@ncol \tabu@nbcols}}% anything global is crap, junky and fails ! +\def\tabu@seteverycr {\tabu@reset + \everycr \expandafter{\the\everycr \tabu@everycr}% + \let\everycr \tabu@noeverycr % +}% \tabu@seteverycr +\def\tabu@noeverycr{{\aftergroup\tabu@restoreeverycr \afterassignment}\toks@} +\def\tabu@restoreeverycr {\let\everycr \tabu@@everycr} +\def\tabu@everycr {\iftabu@everyrow \noalign{\tabu@everyrow}\fi} +\def\tabu@endoftrials {% + \iftabuscantokens \expandafter\@firstoftwo + \else \expandafter\@secondoftwo + \fi + {\expandafter \tabu@closetrialsgroup \expandafter + \tabu@rescan \expandafter{% + \expandafter\tabuthepreamble + \the\expandafter\tabu@thebody + \iftabu@long \else \endarray \fi}} + {\expandafter\tabu@closetrialsgroup \expandafter + \tabuthepreamble + \the\tabu@thebody}% + \tabu@endenvir % Finish ! +}% \tabu@endoftrials +\def\tabu@closetrialsgroup {% + \toks@\expandafter{\tabu@endenvir}% + \edef\tabu@bufferX{\endgroup + \tabucolX \the\tabucolX + \tabu@target \the\tabu@target + \tabu@cnt \the\tabu@cnt + \def\noexpand\tabu@endenvir{\the\toks@}% + %Quid de \@halignto = \tabu@halignto ?? + }% \tabu@bufferX + \tabu@bufferX + \ifcase\tabu@nested % print out (outer in mode 0) + \global\tabu@cnt \tabu@cnt + \tabu@evr{\tabu@verticaldynamicadjustment}% + \tabu@celllalign@def{\everypar{}}\let\tabu@cellralign \@empty + \let\@finalstrut \tabu@finalstrut + \else % vertical measure of nested tabu + \tabu@evr{\tabu@verticalinit}% + \tabu@celllalign@def{\tabu@verticalmeasure}% + \def\tabu@cellralign{\tabu@verticalspacing}% + \fi + \tabu@clckpt \let\@halignto \tabu@halignto + \let\@halignto \@empty + \tabu@seteverycr + \ifdim \tabustrutrule>\z@ \ifnum\tabu@nested=\z@ + \setbox\@arstrutbox \box\voidb@x % force \@arstrutbox to be rebuilt (visible struts) + \fi\fi +}% \tabu@closetrialsgroup +\def\tabu@quickend {\expandafter \endgroup \expandafter + \tabu@target \the\tabu@target \tabu@quickrule + \let\endarray \relax \tabu@endenvir +}% \tabu@quickend +\def\tabu@endtrial {\relax % stops \count@ assignment ! + \ifcase \count@ \tabu@err % case 0 = impossible here + \or \tabu@err % case 1 = impossible here + \or \tabu@err % case 2 = impossible here + \or % case 3 = outer goes into mode 0 + \def\tabu@bufferX{\endgroup}\count@ \z@ + \else % case 4 = outer goes into mode 3 + \iftabu@spread \tabu@spreadarith % inner into mode 1 (outer in mode 3) + \else \tabu@arith % or 2 (outer in mode 4) + \fi + \count@=% + \ifcase\tabu@nested \thr@@ % outer goes into mode 3 + \else\iftabu@measuring \tw@ % outer is in mode 4 + \else \@ne % outer is in mode 3 + \fi\fi + \edef\tabu@bufferX{\endgroup + \tabucolX \the\tabucolX + \tabu@target \the\tabu@target}% + \fi + \expandafter \tabu@bufferX \expandafter + \count@ \the\count@ \tabu@strategy +}% \tabu@endtrial +\def\tabu@err{\errmessage{(tabu) Internal impossible error! (\count@=\the\count@)}} +%% The algorithms: compute the widths / stop or go on --------------- +\def\tabu@arithnegcoef {% + \@tempdima \z@ \dimen@ \z@ \let\tabu@ \tabu@arith@negcoef \tabu@Xcoefs +}% \tabu@arithnegcoef +\def\tabu@arith@negcoef #1#2{% + \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ % saturated by definition + \advance\@tempdima #2\tabucolX + \else + \ifdim -#2\tabucolX <\tabu@wd{#1}% c_i X < natural width <= \tabu@target-> saturated + \advance\dimen@ -#2\p@ + \advance\@tempdima -#2\tabucolX + \else + \advance\@tempdima \tabu@wd{#1}% natural width <= c_i X => neutralised + \ifdim \tabu@wd{#1}<\tabu@target \else % neutralised + \advance\dimen@ -#2\p@ % saturated (natural width = tabu@target) + \fi + \fi + \fi +}% \tabu@arith@negcoef +\def\tabu@givespace #1#2{% here \tabu@DELTA < \z@ + \ifdim \@tempdima=\z@ + \tabu@wddef{#1}{\the\dimexpr -\tabu@DELTA*\p@/\tabu@Xsum}% + \else + \tabu@wddef{#1}{\the\dimexpr \tabu@hsize{#1}{#2} + *(\p@ -\tabu@DELTA*\p@/\@tempdima)/\p@\relax}% + \fi +}% \tabu@givespace +\def\tabu@arith {\advance\tabu@cnt \@ne + \ifnum \tabu@cnt=\@ne \tabu@message{\tabu@titles}\fi + \tabu@arithnegcoef + \@tempdimb \dimexpr \wd\tabu@box -\@tempdima \relax % + \tabu@DELTA = \dimexpr \wd\tabu@box - \tabu@target \relax + \tabu@message{\tabu@message@arith}% + \ifdim \tabu@DELTA <\tabu@hfuzz + \ifdim \tabu@DELTA<\z@ % wd (tabu)<\tabu@target ? + \let\tabu@ \tabu@givespace \tabu@Xcoefs + \advance\@tempdima \@tempdimb \advance\@tempdima -\tabu@DELTA % for message + \else % already converged: nothing to do but nearly impossible... + \fi + \tabucolX \maxdimen + \tabu@measuringfalse + \else % need for narrower X columns + \tabucolX =\dimexpr (\@tempdima -\tabu@DELTA) *\p@/\tabu@Xsum \relax + \tabu@measuringtrue + \@whilesw \iftabu@measuring\fi {% + \advance\tabu@cnt \@ne + \tabu@arithnegcoef + \tabu@DELTA =\dimexpr \@tempdima+\@tempdimb -\tabu@target \relax % always < 0 here + \tabu@message{\tabu@header + \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@ + \tabu@msgalign \@tempdima+\@tempdimb { }{ }{ }{ }{ }\@@ + \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@ + \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@ + \ifdim -\tabu@DELTA<\tabu@hfuzz \tabu@spaces target ok\else + \tabu@msgalign \dimexpr -\tabu@DELTA *\p@/\dimen@ {}{}{}{}{}\@@ + \fi}% + \ifdim -\tabu@DELTA<\tabu@hfuzz + \advance\@tempdima \@tempdimb % for message + \tabu@measuringfalse + \else + \advance\tabucolX \dimexpr -\tabu@DELTA *\p@/\dimen@ \relax + \fi + }% + \fi + \tabu@message{\tabu@message@reached}% + \edef\tabu@bufferX{\endgroup \tabu@cnt \the\tabu@cnt + \tabucolX \the\tabucolX + \tabu@target \the\tabu@target}% +}% \tabu@arith +\def\tabu@spreadarith {% + \dimen@ \z@ \@tempdima \tabu@naturalXmax \let\tabu@ \tabu@spread@arith \tabu@Xcoefs + \edef\tabu@naturalXmin {\the\dimexpr\tabu@naturalXmin*\dimen@/\p@}% + \@tempdimc =\dimexpr \wd\tabu@box -\tabu@naturalXmax+\tabu@naturalXmin \relax + \iftabu@measuring + \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax + \edef\tabu@bufferX{\endgroup \tabucolX \the\tabucolX \tabu@target\the\tabu@target}% + \else + \tabu@message{\tabu@message@spreadarith}% + \ifdim \dimexpr \@tempdimc+\tabu@spreadtarget >\tabu@target + \tabu@message{(tabu) spread + \ifdim \@tempdimc>\tabu@target useless here: default target used% + \else too large: reduced to fit default target\fi.}% + \else + \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax + \tabu@message{(tabu) spread: New target set to \the\tabu@target^^J}% + \fi + \begingroup \let\tabu@wddef \@gobbletwo + \@tempdimb \@tempdima + \tabucolX@init + \tabu@arithnegcoef + \wd\tabu@box =\dimexpr \wd\tabu@box +\@tempdima-\@tempdimb \relax + \expandafter\endgroup \expandafter\tabucolX \the\tabucolX + \tabu@arith + \fi +}% \tabu@spreadarith +\def\tabu@spread@arith #1#2{% + \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ + \else \advance\@tempdima \tabu@wd{#1}\relax + \fi +}% \tabu@spread@arith +%% Reporting in the .log file --------------------------------------- +\def\tabu@message@defaulttarget{% + \ifnum\tabu@nested=\z@^^J(tabu) Default target: + \ifx\tabudefaulttarget\linewidth \string\linewidth + \ifdim \tabu@thetarget=\linewidth \else + -\the\dimexpr\linewidth-\tabu@thetarget\fi = + \else\ifx\tabudefaulttarget\linegoal\string\linegoal= + \fi\fi + \else (tabu) Default target (nested): \fi + \the\tabu@target \on@line + \ifnum\tabu@nested=\z@ , page \the\c@page\fi} +\def\tabu@message@target {^^J(tabu) Target specified: + \the\tabu@target \on@line, page \the\c@page} +\def\tabu@message@arith {\tabu@header + \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@ + \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{ }\@@ + \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@ + \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@ + \ifdim \tabu@DELTA<\tabu@hfuzz giving space\else + \tabu@msgalign \dimexpr (\@tempdima-\tabu@DELTA) *\p@/\tabu@Xsum -\tabucolX {}{}{}{}{}\@@ + \fi +}% \tabu@message@arith +\def\tabu@message@spreadarith {\tabu@spreadheader + \tabu@msgalign \tabu@spreadtarget { }{ }{ }{ }{}\@@ + \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{}\@@ + \tabu@msgalign -\tabu@naturalXmax { }{}{}{}{}\@@ + \tabu@msgalign \tabu@naturalXmin { }{ }{ }{ }{}\@@ + \tabu@msgalign \ifdim \dimexpr\@tempdimc>\tabu@target \tabu@target + \else \@tempdimc+\tabu@spreadtarget \fi + {}{}{}{}{}\@@} +\def\tabu@message@negcoef #1#2{ + \tabu@spaces\tabu@spaces\space * #1. X[\rem@pt#2]: + \space width = \tabu@wd {#1} + \expandafter\string\csname tabu@\the\tabu@nested.W\number#1\endcsname + \ifdim -\tabu@pt#2\tabucolX<\tabu@target + < \number-\rem@pt#2 X + = \the\dimexpr -\tabu@pt#2\tabucolX \relax + \else + <= \the\tabu@target\space < \number-\rem@pt#2 X\fi} +\def\tabu@message@reached{\tabu@header + ******* Reached Target: + hfuzz = \tabu@hfuzz\on@line\space *******} +\def\tabu@message@etime{\edef\tabu@stoptime{\the\pdfelapsedtime}% + \tabu@message{(tabu)\tabu@spaces Time elapsed during measure: + \the\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax sec + \the\numexpr\numexpr(\tabu@stoptime-\tabu@starttime) + -\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax*65536\relax + *1000/65536\relax ms \tabu@spaces(\the\tabu@cnt\space + cycle\ifnum\tabu@cnt>\@ne s\fi)^^J^^J}} +\def\tabu@message@verticalsp {% + \ifdim \@tempdima>\tabu@ht + \ifdim \@tempdimb>\tabu@dp + \expandafter\expandafter\expandafter\string\tabu@ht = + \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@ + \expandafter\expandafter\expandafter\string\tabu@dp = + \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J% + \else + \expandafter\expandafter\expandafter\string\tabu@ht = + \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@^^J% + \fi + \else\ifdim \@tempdimb>\tabu@dp + \tabu@spaces\tabu@spaces\tabu@spaces + \expandafter\expandafter\expandafter\string\tabu@dp = + \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J\fi + \fi +}% \tabu@message@verticalsp +\edef\tabu@spaces{\@spaces} +\def\tabu@strippt{\expandafter\tabu@pt\the} +{\@makeother\P \@makeother\T\lowercase{\gdef\tabu@pt #1PT{#1}}} +\def\tabu@msgalign{\expandafter\tabu@msg@align\the\dimexpr} +\def\tabu@msgalign@PT{\expandafter\tabu@msg@align\romannumeral-`\0\tabu@strippt} +\def\do #1{% + \def\tabu@msg@align##1.##2##3##4##5##6##7##8##9\@@{% + \ifnum##1<10 #1 #1\else + \ifnum##1<100 #1 \else + \ifnum##1<\@m #1\fi\fi\fi + ##1.##2##3##4##5##6##7##8#1}% + \def\tabu@header{(tabu) \ifnum\tabu@cnt<10 #1\fi\the\tabu@cnt) }% + \def\tabu@titles{\ifnum \tabu@nested=\z@ + (tabu) Try#1 #1 tabu X #1 #1 #1tabu Width #1 #1 Target + #1 #1 #1 Coefs #1 #1 #1 Update^^J\fi}% + \def\tabu@spreadheader{% + (tabu) Try#1 #1 Spread #1 #1 tabu Width #1 #1 #1 Nat. X #1 #1 #1 #1Nat. Min. + #1 New Target^^J% + (tabu) sprd} + \def\tabu@message@save {\begingroup + \def\x ####1{\tabu@msg@align ####1{ }{ }{ }{ }{}\@@} + \def\z ####1{\expandafter\x\expandafter{\romannumeral-`\0\tabu@strippt + \dimexpr####1\p@{ }{ }}}% + \let\color \relax \def\tabu@rulesstyle ####1####2{\detokenize{####1}}% + \let\CT@arc@ \relax \let\@preamble \@gobble + \let\tabu@savedpream \@firstofone + \let\tabu@savedparams \@firstofone + \def\tabu@target ####1\relax {(tabu) target #1 #1 #1 #1 #1 = \x{####1}^^J}% + \def\tabucolX ####1\relax {(tabu) X columns width#1 = \x{####1}^^J}% + \def\tabu@nbcols ####1\relax {(tabu) Number of columns: \z{####1}^^J}% + \def\tabu@aligndefault ####1{(tabu) Default alignment: #1 #1 ####1^^J}% + \def\col@sep ####1\relax {(tabu) column sep #1 #1 #1 = \x{####1}^^J}% + \def\arrayrulewidth ####1\relax{(tabu) arrayrulewidth #1 = \x{####1}}% + \def\doublerulesep ####1\relax { doublerulesep = \x{####1}^^J}% + \def\extratabsurround####1\relax{(tabu) extratabsurround = \x{####1}^^J}% + \def\extrarowheight ####1\relax{(tabu) extrarowheight #1 = \x{####1}}% + \def\extrarowdepth ####1\relax {extrarowdepth = \x{####1}^^J}% + \def\abovetabulinesep####1\relax{(tabu) abovetabulinesep=\x{####1} }% + \def\belowtabulinesep####1\relax{ belowtabulinesep=\x{####1}^^J}% + \def\arraystretch ####1{(tabu) arraystretch #1 #1 = \z{####1}^^J}% + \def\minrowclearance####1\relax{(tabu) minrowclearance #1 = \x{####1}^^J}% + \def\tabu@arc@L ####1{(tabu) taburulecolor #1 #1 = ####1^^J}% + \def\tabu@drsc@L ####1{(tabu) tabudoublerulecolor= ####1^^J}% + \def\tabu@evr@L ####1{(tabu) everyrow #1 #1 #1 #1 = \detokenize{####1}^^J}% + \def\tabu@ls@L ####1{(tabu) line style = \detokenize{####1}^^J}% + \def\NC@find ####1\@nil{(tabu) tabu preamble#1 #1 = \detokenize{####1}^^J}% + \def\tabu@wddef####1####2{(tabu) Natural width ####1 = \x{####2}^^J}% + \let\edef \@gobbletwo \let\def \@empty \let\let \@gobbletwo + \tabu@message{% + (tabu) \string\savetabu{\tabu@temp}: \on@line^^J% + \tabu@usetabu \@nil^^J}% + \endgroup} +}\do{ } +%% Measuring the natural width (varwidth) - store the results ------- +\def\tabu@startpboxmeasure #1{\bgroup % entering \vtop + \edef\tabu@temp{\expandafter\@secondoftwo \ifx\tabu@hsize #1\else\relax\fi}% + \ifodd 1\ifx \tabu@temp\@empty 0 \else % starts with \tabu@hsize ? + \iftabu@spread \else % if spread -> measure + \ifdim \tabu@temp\p@>\z@ 0 \fi\fi\fi% if coef>0 -> do not measure + \let\@startpbox \tabu@startpboxORI % restore immediately (nesting) + \tabu@measuringtrue % for the quick option... + \tabu@Xcol =\expandafter\@firstoftwo\ifx\tabu@hsize #1\fi + \ifdim \tabu@temp\p@>\z@ \ifdim \tabu@temp\tabucolX<\tabu@target + \tabu@target=\tabu@temp\tabucolX \fi\fi + \setbox\tabu@box \hbox \bgroup + \begin{varwidth}\tabu@target + \let\FV@ListProcessLine \tabu@FV@ListProcessLine % \hbox to natural width... + \narrowragged \arraybackslash \parfillskip \@flushglue + \ifdefined\pdfadjustspacing \pdfadjustspacing\z@ \fi + \bgroup \aftergroup\tabu@endpboxmeasure + \ifdefined \cellspacetoplimit \tabu@cellspacepatch \fi + \else \expandafter\@gobble + \tabu@startpboxquick{#1}% \@gobble \bgroup + \fi +}% \tabu@startpboxmeasure +\def\tabu@cellspacepatch{\def\bcolumn##1\@nil{}\let\ecolumn\@empty + \bgroup\color@begingroup} +\def\tabu@endpboxmeasure {% + \@finalstrut \@arstrutbox + \end{varwidth}\egroup % + \ifdim \tabu@temp\p@ <\z@ % neg coef + \ifdim \tabu@wd\tabu@Xcol <\wd\tabu@box + \tabu@wddef\tabu@Xcol {\the\wd\tabu@box}% + \tabu@debug{\tabu@message@endpboxmeasure}% + \fi + \else % spread coef>0 + \global\advance \tabu@naturalX \wd\tabu@box + \@tempdima =\dimexpr \wd\tabu@box *\p@/\dimexpr \tabu@temp\p@\relax \relax + \ifdim \tabu@naturalXmax <\tabu@naturalX + \xdef\tabu@naturalXmax {\the\tabu@naturalX}\fi + \ifdim \tabu@naturalXmin <\@tempdima + \xdef\tabu@naturalXmin {\the\@tempdima}\fi + \fi + \box\tabu@box \egroup % end of \vtop (measure) restore \tabu@target +}% \tabu@endpboxmeasure +\def\tabu@wddef #1{\expandafter\xdef + \csname tabu@\the\tabu@nested.W\number#1\endcsname} +\def\tabu@wd #1{\csname tabu@\the\tabu@nested.W\number#1\endcsname} +\def\tabu@message@endpboxmeasure{\tabu@spaces\tabu@spaces<-> % <-> save natural wd + \the\tabu@Xcol. X[\tabu@temp]: + target = \the\tabucolX \space + \expandafter\expandafter\expandafter\string\tabu@wd\tabu@Xcol + =\tabu@wd\tabu@Xcol +}% \tabu@message@endpboxmeasure +\def\tabu@startpboxquick {\bgroup + \let\@startpbox \tabu@startpboxORI % restore immediately + \let\tabu \tabu@quick % \begin is expanded before... + \expandafter\@gobble \@startpbox % gobbles \bgroup +}% \tabu@startpboxquick +\def\tabu@quick {\begingroup \iffalse{\fi \ifnum0=`}\fi + \toks@{}\def\tabu@stack{b}\tabu@collectbody \tabu@endquick +}% \tabu@quick +\def\tabu@endquick {% + \ifodd 1\ifx\tabu@end@envir\tabu@endtabu \else + \ifx\tabu@end@envir\tabu@endtabus \else 0\fi\fi\relax + \endgroup + \else \let\endtabu \relax + \tabu@end@envir + \fi +}% \tabu@quick +\def\tabu@endtabu {\end{tabu}} +\def\tabu@endtabus {\end{tabu*}} +%% Measuring the heights and depths - store the results ------------- +\def\tabu@verticalmeasure{\everypar{}% + \ifnum \currentgrouptype>12 % 14=semi-simple, 15=math shift group + \setbox\tabu@box =\hbox\bgroup + \let\tabu@verticalspacing \tabu@verticalsp@lcr + \d@llarbegin % after \hbox ... + \else + \edef\tabu@temp{\ifnum\currentgrouptype=5\vtop + \else\ifnum\currentgrouptype=12\vcenter + \else\vbox\fi\fi}% + \setbox\tabu@box \hbox\bgroup$\tabu@temp \bgroup + \let\tabu@verticalspacing \tabu@verticalsp@pmb + \fi +}% \tabu@verticalmeasure +\def\tabu@verticalsp@lcr{% + \d@llarend \egroup % + \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep + \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax + \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi + \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi + \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi + \noindent\vrule height\@tempdima depth\@tempdimb +}% \tabu@verticalsp@lcr +\def\tabu@verticalsp@pmb{% inserts struts as needed + \par \expandafter\egroup + \expandafter$\expandafter + \egroup \expandafter + \@tempdimc \the\prevdepth + \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep + \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax + \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi + \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi + \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi + \let\@finalstrut \@gobble + \hrule height\@tempdima depth\@tempdimb width\hsize +%% \box\tabu@box +}% \tabu@verticalsp@pmb + +\def\tabu@verticalinit{% + \ifnum \c@taburow=\z@ \tabu@rearstrut \fi % after \tabu@reset ! + \advance\c@taburow \@ne + \tabu@htdef{\the\ht\@arstrutbox}\tabu@dpdef{\the\dp\@arstrutbox}% + \advance\c@taburow \m@ne +}% \tabu@verticalinit +\def\tabu@htdef {\expandafter\xdef \csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname} +\def\tabu@ht {\csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname} +\def\tabu@dpdef {\expandafter\xdef \csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname} +\def\tabu@dp {\csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname} +\def\tabu@verticaldynamicadjustment {% + \advance\c@taburow \@ne + \extrarowheight \dimexpr\tabu@ht - \ht\strutbox + \extrarowdepth \dimexpr\tabu@dp - \dp\strutbox + \let\arraystretch \@empty + \advance\c@taburow \m@ne +}% \tabu@verticaldynamicadjustment +\def\tabuphantomline{\crcr \noalign{% + {\globaldefs \@ne + \setbox\@arstrutbox \box\voidb@x + \let\tabu@@celllalign \tabu@celllalign + \let\tabu@@cellralign \tabu@cellralign + \let\tabu@@cellleft \tabu@cellleft + \let\tabu@@cellright \tabu@cellright + \let\tabu@@thevline \tabu@thevline + \let\tabu@celllalign \@empty + \let\tabu@cellralign \@empty + \let\tabu@cellright \@empty + \let\tabu@cellleft \@empty + \let\tabu@thevline \relax}% + \edef\tabu@temp{\tabu@multispan \tabu@nbcols{\noindent &}}% + \toks@\expandafter{\tabu@temp \noindent\tabu@everyrowfalse \cr + \noalign{\tabu@rearstrut + {\globaldefs\@ne + \let\tabu@celllalign \tabu@@celllalign + \let\tabu@cellralign \tabu@@cellralign + \let\tabu@cellleft \tabu@@cellleft + \let\tabu@cellright \tabu@@cellright + \let\tabu@thevline \tabu@@thevline}}}% + \expandafter}\the\toks@ +}% \tabuphantomline +%% \firsthline and \lasthline corrections --------------------------- +\def\tabu@firstline {\tabu@hlineAZ \tabu@firsthlinecorrection {}} +\def\tabu@firsthline{\tabu@hlineAZ \tabu@firsthlinecorrection \hline} +\def\tabu@lastline {\tabu@hlineAZ \tabu@lasthlinecorrection {}} +\def\tabu@lasthline {\tabu@hlineAZ \tabu@lasthlinecorrection \hline} +\def\tabu@hline {% replaces \hline if no colortbl (see \AtBeginDocument) + \noalign{\ifnum0=`}\fi + {\CT@arc@\hrule height\arrayrulewidth}% + \futurelet \tabu@temp \tabu@xhline +}% \tabu@hline +\def\tabu@xhline{% + \ifx \tabu@temp \hline + {\ifx \CT@drsc@\relax \vskip + \else\ifx \CT@drsc@\@empty \vskip + \else \CT@drsc@\hrule height + \fi\fi + \doublerulesep}% + \fi + \ifnum0=`{\fi}% +}% \tabu@xhline +\def\tabu@hlineAZ #1#2{\noalign{\ifnum0=`}\fi \dimen@ \z@ \count@ \z@ + \toks@{}\def\tabu@hlinecorrection{#1}\def\tabu@temp{#2}% + \tabu@hlineAZsurround +}% \tabu@hlineAZ +\newcommand*\tabu@hlineAZsurround[1][\extratabsurround]{% + \extratabsurround #1\let\tabucline \tabucline@scan + \let\hline \tabu@hlinescan \let\firsthline \hline + \let\cline \tabu@clinescan \let\lasthline \hline + \expandafter \futurelet \expandafter \tabu@temp + \expandafter \tabu@nexthlineAZ \tabu@temp +}% \tabu@hlineAZsurround +\def\tabu@hlinescan {\tabu@thick \arrayrulewidth \tabu@xhlineAZ \hline} +\def\tabu@clinescan #1{\tabu@thick \arrayrulewidth \tabu@xhlineAZ {\cline{#1}}} +\def\tabucline@scan{\@testopt \tabucline@sc@n {}} +\def\tabucline@sc@n #1[#2]{\tabu@xhlineAZ {\tabucline[{#1}]{#2}}} +\def\tabu@nexthlineAZ{% + \ifx \tabu@temp\hline \else + \ifx \tabu@temp\cline \else + \ifx \tabu@temp\tabucline \else + \tabu@hlinecorrection + \fi\fi\fi +}% \tabu@nexthlineAZ +\def\tabu@xhlineAZ #1{% + \toks@\expandafter{\the\toks@ #1}% + \@tempdimc \tabu@thick % The last line width + \ifcase\count@ \@tempdimb \tabu@thick % The first line width + \else \advance\dimen@ \dimexpr \tabu@thick+\doublerulesep \relax + \fi + \advance\count@ \@ne \futurelet \tabu@temp \tabu@nexthlineAZ +}% \tabu@xhlineAZ +\def\tabu@firsthlinecorrection{% \count@ = number of \hline -1 + \@tempdima \dimexpr \ht\@arstrutbox+\dimen@ + \edef\firsthline{% + \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule + height \the\dimexpr\@tempdima+\extratabsurround + depth \dp\@arstrutbox + width \tabustrutrule}\hss}\cr + \noalign{\vskip -\the\dimexpr \@tempdima+\@tempdimb + +\dp\@arstrutbox \relax}% + \the\toks@ + }\ifnum0=`{\fi + \expandafter}\firsthline % we are then ! +}% \tabu@firsthlinecorrection +\def\tabu@lasthlinecorrection{% + \@tempdima \dimexpr \dp\@arstrutbox+\dimen@+\@tempdimb+\@tempdimc + \edef\lasthline{% + \the\toks@ + \noalign{\vskip -\the\dimexpr\dimen@+\@tempdimb+\dp\@arstrutbox}% + \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule + depth \the\dimexpr \dp\@arstrutbox+\@tempdimb+\dimen@ + +\extratabsurround-\@tempdimc + height \z@ + width \tabustrutrule}\hss}\cr + }\ifnum0=`{\fi + \expandafter}\lasthline % we are then ! +}% \tabu@lasthlinecorrection +\def\tabu@LT@@hline{% + \ifx\LT@next\hline + \global\let\LT@next \@gobble + \ifx \CT@drsc@\relax + \gdef\CT@LT@sep{% + \noalign{\penalty-\@medpenalty\vskip\doublerulesep}}% + \else + \gdef\CT@LT@sep{% + \multispan\LT@cols{% + \CT@drsc@\leaders\hrule\@height\doublerulesep\hfill}\cr}% + \fi + \else + \global\let\LT@next\empty + \gdef\CT@LT@sep{% + \noalign{\penalty-\@lowpenalty\vskip-\arrayrulewidth}}% + \fi + \ifnum0=`{\fi}% + \multispan\LT@cols + {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr + \CT@LT@sep + \multispan\LT@cols + {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr + \noalign{\penalty\@M}% + \LT@next +}% \tabu@LT@@hline +%% Horizontal lines : \tabucline ------------------------------------ +\let\tabu@start \@tempcnta +\let\tabu@stop \@tempcntb +\newcommand*\tabucline{\noalign{\ifnum0=`}\fi \tabu@cline} +\newcommand*\tabu@cline[2][]{\tabu@startstop{#2}% + \ifnum \tabu@stop<\z@ \toks@{}% + \else \tabu@clinearg{#1}\tabu@thestyle + \edef\tabucline{\toks@{% + \ifnum \tabu@start>\z@ \omit + \tabu@multispan\tabu@start {\span\omit}&\fi + \omit \tabu@multispan\tabu@stop {\span\omit}% + \tabu@thehline\cr + }}\tabucline + \tabu@tracinglines{(tabu:tabucline) Style: #1^^J\the\toks@^^J^^J}% + \fi + \futurelet \tabu@temp \tabu@xcline +}% \tabu@cline +\def\tabu@clinearg #1{% + \ifx\\#1\\\let\tabu@thestyle \tabu@ls@ + \else \@defaultunits \expandafter\let\expandafter\@tempa + \romannumeral-`\0#1\relax \@nnil + \ifx \hbox\@tempa \tabu@clinebox{#1}% + \else\ifx \box\@tempa \tabu@clinebox{#1}% + \else\ifx \vbox\@tempa \tabu@clinebox{#1}% + \else\ifx \vtop\@tempa \tabu@clinebox{#1}% + \else\ifx \copy\@tempa \tabu@clinebox{#1}% + \else\ifx \leaders\@tempa \tabu@clineleads{#1}% + \else\ifx \cleaders\@tempa \tabu@clineleads{#1}% + \else\ifx \xleaders\@tempa \tabu@clineleads{#1}% + \else\tabu@getline {#1}% + \fi\fi\fi\fi\fi\fi\fi\fi + \fi +}% \tabu@clinearg +\def\tabu@clinebox #1{\tabu@clineleads{\xleaders#1\hss}} +\def\tabu@clineleads #1{% + \let\tabu@thestyle \relax \let\tabu@leaders \@undefined + \gdef\tabu@thehrule{#1}} +\def\tabu@thehline{\begingroup + \ifdefined\tabu@leaders + \noexpand\tabu@thehleaders + \else \noexpand\tabu@thehrule + \fi \endgroup +}% \tabu@thehline +\def\tabu@xcline{% + \ifx \tabu@temp\tabucline + \toks@\expandafter{\the\toks@ \noalign + {\ifx\CT@drsc@\relax \vskip + \else \CT@drsc@\hrule height + \fi + \doublerulesep}}% + \fi + \tabu@docline +}% \tabu@xcline +\def\tabu@docline {\ifnum0=`{\fi \expandafter}\the\toks@} +\def\tabu@docline@evr {\xdef\tabu@doclineafter{\the\toks@}% + \ifnum0=`{\fi}\aftergroup\tabu@doclineafter} +\def\tabu@multispan #1#2{% + \ifnum\numexpr#1>\@ne #2\expandafter\tabu@multispan + \else \expandafter\@gobbletwo + \fi {#1-1}{#2}% +}% \tabu@multispan +\def\tabu@startstop #1{\tabu@start@stop #1\relax 1-\tabu@nbcols \@nnil} +\def\tabu@start@stop #1-#2\@nnil{% + \@defaultunits \tabu@start\number 0#1\relax \@nnil + \@defaultunits \tabu@stop \number 0#2\relax \@nnil + \tabu@stop \ifnum \tabu@start>\tabu@nbcols \m@ne + \else\ifnum \tabu@stop=\z@ \tabu@nbcols + \else\ifnum \tabu@stop>\tabu@nbcols \tabu@nbcols + \else \tabu@stop + \fi\fi\fi + \advance\tabu@start \m@ne + \ifnum \tabu@start>\z@ \advance\tabu@stop -\tabu@start \fi +}% \tabu@start@stop +%% Numbers: siunitx S columns (and \tabudecimal) ------------------- +\def\tabu@tabudecimal #1{% + \def\tabu@decimal{#1}\@temptokena{}% + \let\tabu@getdecimal@ \tabu@getdecimal@ignorespaces + \tabu@scandecimal +}% \tabu@tabudecimal +\def\tabu@scandecimal{\futurelet \tabu@temp \tabu@getdecimal@} +\def\tabu@skipdecimal#1{#1\tabu@scandecimal} +\def\tabu@getdecimal@ignorespaces{% + \ifcase 0\ifx\tabu@temp\ignorespaces\else + \ifx\tabu@temp\@sptoken1\else + 2\fi\fi\relax + \let\tabu@getdecimal@ \tabu@getdecimal + \expandafter\tabu@skipdecimal + \or \expandafter\tabu@gobblespace\expandafter\tabu@scandecimal + \else \expandafter\tabu@skipdecimal + \fi +}% \tabu@getdecimal@ignorespaces +\def\tabu@get@decimal#1{\@temptokena\expandafter{\the\@temptokena #1}% + \tabu@scandecimal} +\def\do#1{% + \def\tabu@get@decimalspace#1{% + \@temptokena\expandafter{\the\@temptokena #1}\tabu@scandecimal}% +}\do{ } +\let\tabu@@tabudecimal \tabu@tabudecimal +\def\tabu@getdecimal{% + \ifcase 0\ifx 0\tabu@temp\else + \ifx 1\tabu@temp\else + \ifx 2\tabu@temp\else + \ifx 3\tabu@temp\else + \ifx 4\tabu@temp\else + \ifx 5\tabu@temp\else + \ifx 6\tabu@temp\else + \ifx 7\tabu@temp\else + \ifx 8\tabu@temp\else + \ifx 9\tabu@temp\else + \ifx .\tabu@temp\else + \ifx ,\tabu@temp\else + \ifx -\tabu@temp\else + \ifx +\tabu@temp\else + \ifx e\tabu@temp\else + \ifx E\tabu@temp\else + \ifx\tabu@cellleft\tabu@temp1\else + \ifx\ignorespaces\tabu@temp1\else + \ifx\@sptoken\tabu@temp2\else + 3\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax + \expandafter\tabu@get@decimal + \or \expandafter\tabu@skipdecimal + \or \expandafter\tabu@get@decimalspace + \else\expandafter\tabu@printdecimal + \fi +}% \tabu@getdecimal +\def\tabu@printdecimal{% + \edef\tabu@temp{\the\@temptokena}% + \ifx\tabu@temp\@empty\else + \ifx\tabu@temp\space\else + \expandafter\tabu@decimal\expandafter{\the\@temptokena}% + \fi\fi +}% \tabu@printdecimal +%% Verbatim inside X columns ---------------------------------------- +\def\tabu@verbatim{% + \let\verb \tabu@verb + \let\FV@DefineCheckEnd \tabu@FV@DefineCheckEnd +}% \tabu@verbatim +\let\tabu@ltx@verb \verb +\def\tabu@verb{\@ifstar {\tabu@ltx@verb*} \tabu@ltx@verb} +\def\tabu@fancyvrb {% + \def\tabu@FV@DefineCheckEnd ##1{% + \def\tabu@FV@DefineCheckEnd{% + ##1% + \let\FV@CheckEnd \tabu@FV@CheckEnd + \let\FV@@CheckEnd \tabu@FV@@CheckEnd + \let\FV@@@CheckEnd \tabu@FV@@@CheckEnd + \edef\FV@EndScanning{% + \def\noexpand\next{\noexpand\end{\FV@EnvironName}}% + \global\let\noexpand\FV@EnvironName\relax + \noexpand\next}% + \xdef\FV@EnvironName{\detokenize\expandafter{\FV@EnvironName}}}% + }\expandafter\tabu@FV@DefineCheckEnd\expandafter{\FV@DefineCheckEnd} +}% \tabu@fancyvrb +\def\tabu@FV@CheckEnd #1{\expandafter\FV@@CheckEnd \detokenize{#1\end{}}\@nil} +\edef\tabu@FV@@@CheckEnd {\detokenize{\end{}}} +\begingroup +\catcode`\[1 \catcode`\]2 +\@makeother\{ \@makeother\} + \edef\x[\endgroup + \def\noexpand\tabu@FV@@CheckEnd ##1\detokenize[\end{]##2\detokenize[}]##3% + ]\x \@nil{\def\@tempa{#2}\def\@tempb{#3}} +\def\tabu@FV@ListProcessLine #1{% + \hbox {%to \hsize{% + \kern\leftmargin + \hbox {%to \linewidth{% + \FV@LeftListNumber + \FV@LeftListFrame + \FancyVerbFormatLine{#1}\hss +%% DG/SR modification begin - Jan. 28, 1998 (for numbers=right add-on) +%% \FV@RightListFrame}% + \FV@RightListFrame + \FV@RightListNumber}% +%% DG/SR modification end + \hss}} +%% \savetabu -------------------------------------------------------- +\newcommand*\savetabu[1]{\noalign{% + \tabu@sanitizearg{#1}\tabu@temp + \ifx \tabu@temp\@empty \tabu@savewarn{}{The tabu will not be saved}\else + \@ifundefined{tabu@saved@\tabu@temp}{}{\tabu@savewarn{#1}{Overwriting}}% + \ifdefined\tabu@restored \expandafter\let + \csname tabu@saved@\tabu@temp \endcsname \tabu@restored + \else {\tabu@save}% + \fi + \fi}% +}% \savetabu +\def\tabu@save {% + \toks0\expandafter{\tabu@saved@}% + \iftabu@negcoef + \let\tabu@wddef \relax \let\tabu@ \tabu@savewd \edef\tabu@savewd{\tabu@Xcoefs}% + \toks0\expandafter{\the\toks\expandafter0\tabu@savewd}\fi + \toks1\expandafter{\tabu@savedpream}% + \toks2\expandafter{\tabu@savedpreamble}% + \let\@preamble \relax + \let\tabu@savedpream \relax \let\tabu@savedparams \relax + \edef\tabu@preamble{% + \def\noexpand\tabu@aligndefault{\tabu@align}% + \def\tabu@savedparams {\noexpand\the\toks0}% + \def\tabu@savedpream {\noexpand\the\toks1}}% + \edef\tabu@usetabu{% + \def\@preamble {\noexpand\the\toks2}% + \tabu@target \the\tabu@target \relax + \tabucolX \the\tabucolX \relax + \tabu@nbcols \the\tabu@nbcols \relax + \def\noexpand\tabu@aligndefault{\tabu@align}% + \def\tabu@savedparams {\noexpand\the\toks0}% + \def\tabu@savedpream {\noexpand\the\toks1}}% + \let\tabu@aligndefault \relax \let\@sharp \relax + \edef\@tempa{\noexpand\tabu@s@ved + {\tabu@usetabu} + {\tabu@preamble} + {\the\toks1}}\@tempa + \tabu@message@save +}% \tabu@save +\long\def\tabu@s@ved #1#2#3{% + \def\tabu@usetabu{#1}% + \expandafter\gdef\csname tabu@saved@\tabu@temp\endcsname ##1{% + \ifodd ##1% \usetabu + \tabu@measuringfalse \tabu@spreadfalse % Just in case... + \gdef\tabu@usetabu {% + \ifdim \tabu@target>\z@ \tabu@warn@usetabu \fi + \global\let\tabu@usetabu \@undefined + \def\@halignto {to\tabu@target}% + #1% + \ifx \tabu@align\tabu@aligndefault@text + \ifnum \tabu@nested=\z@ + \let\tabu@align \tabu@aligndefault \fi\fi}% + \else % \preamble + \gdef\tabu@preamble {% + \global\let\tabu@preamble \@undefined + #2% + \ifx \tabu@align\tabu@aligndefault@text + \ifnum \tabu@nested=\z@ + \let\tabu@align \tabu@aligndefault \fi\fi}% + \fi + #3}% +}% \tabu@s@ved +\def\tabu@aligndefault@text {\tabu@aligndefault}% +\def\tabu@warn@usetabu {\PackageWarning{tabu} + {Specifying a target with \string\usetabu\space is useless + \MessageBreak The target cannot be changed!}} +\def\tabu@savewd #1#2{\ifdim #2\p@<\z@ \tabu@wddef{#1}{\tabu@wd{#1}}\fi} +\def\tabu@savewarn#1#2{\PackageInfo{tabu} + {User-name `#1' already used for \string\savetabu + \MessageBreak #2}}% +\def\tabu@saveerr#1{\PackageError{tabu} + {User-name `#1' is unknown for \string\usetabu + \MessageBreak I cannot restore an unknown preamble!}\@ehd} +%% \rowfont --------------------------------------------------------- +\newskip \tabu@cellskip +\def\tabu@rowfont{\ifdim \baselineskip=\z@\noalign\fi + {\ifnum0=`}\fi \tabu@row@font} +\newcommand*\tabu@row@font[2][]{% + \ifnum7=\currentgrouptype + \global\let\tabu@@cellleft \tabu@cellleft + \global\let\tabu@@cellright \tabu@cellright + \global\let\tabu@@celllalign \tabu@celllalign + \global\let\tabu@@cellralign \tabu@cellralign + \global\let\tabu@@rowfontreset\tabu@rowfontreset + \fi + \global\let\tabu@rowfontreset \tabu@rowfont@reset + \expandafter\gdef\expandafter\tabu@cellleft\expandafter{\tabu@cellleft #2}% + \ifcsname tabu@cell@#1\endcsname % row alignment + \csname tabu@cell@#1\endcsname \fi + \ifnum0=`{\fi}% end of group / noalign group +}% \rowfont +\def\tabu@ifcolorleavevmode #1{\let\color \tabu@leavevmodecolor #1\let\color\tabu@color}% +\def\tabu@rowfont@reset{% + \global\let\tabu@rowfontreset \tabu@@rowfontreset + \global\let\tabu@cellleft \tabu@@cellleft + \global\let\tabu@cellright \tabu@@cellright + \global\let\tabu@cellfont \@empty + \global\let\tabu@celllalign \tabu@@celllalign + \global\let\tabu@cellralign \tabu@@cellralign +}% \tabu@@rowfontreset +\let\tabu@rowfontreset \@empty % overwritten \AtBeginDocument if colortbl +%% \tabu@prepnext@tok ----------------------------------------------- +\newif \iftabu@cellright +\def\tabu@prepnext@tok{% + \ifnum \count@<\z@ % + \@tempcnta \@M % + \tabu@nbcols\z@ + \let\tabu@fornoopORI \@fornoop + \tabu@cellrightfalse + \else + \ifcase \numexpr \count@-\@tempcnta \relax % (case 0): prev. token is left + \advance \tabu@nbcols \@ne + \iftabu@cellright % before-previous token is right and is finished + \tabu@cellrightfalse % + \tabu@righttok + \fi + \tabu@lefttok + \or % (case 1) previous token is right + \tabu@cellrighttrue \let\@fornoop \tabu@lastnoop + \else % special column: do not change the token + \iftabu@cellright % before-previous token is right + \tabu@cellrightfalse + \tabu@righttok + \fi + \fi % \ifcase + \fi + \tabu@prepnext@tokORI +}% \tabu@prepnext@tok +\long\def\tabu@lastnoop#1\@@#2#3{\tabu@lastn@@p #2\@nextchar \in@\in@@} +\def\tabu@lastn@@p #1\@nextchar #2#3\in@@{% + \ifx \in@#2\else + \let\@fornoop \tabu@fornoopORI + \xdef\tabu@mkpreambuffer{\tabu@nbcols\the\tabu@nbcols \tabu@mkpreambuffer}% + \toks0\expandafter{\expandafter\tabu@everyrowtrue \the\toks0}% + \expandafter\prepnext@tok + \fi +}% \tabu@lastnoop +\def\tabu@righttok{% + \advance \count@ \m@ne + \toks\count@\expandafter {\the\toks\count@ \tabu@cellright \tabu@cellralign}% + \advance \count@ \@ne +}% \tabu@righttok +\def\tabu@lefttok{\toks\count@\expandafter{\expandafter\tabu@celllalign + \the\toks\count@ \tabu@cellleft}% after because of $ +}% \tabu@lefttok +%% Neutralisation of glues ------------------------------------------ +\let\tabu@cellleft \@empty +\let\tabu@cellright \@empty +\tabu@celllalign@def{\tabu@cellleft}% +\let\tabu@cellralign \@empty +\def\tabu@cell@align #1#2#3{% + \let\tabu@maybesiunitx \toks@ \tabu@celllalign + \global \expandafter \tabu@celllalign@def \expandafter {\the\toks@ #1}% + \toks@\expandafter{\tabu@cellralign #2}% + \xdef\tabu@cellralign{\the\toks@}% + \toks@\expandafter{\tabu@cellleft #3}% + \xdef\tabu@cellleft{\the\toks@}% +}% \tabu@cell@align +\def\tabu@cell@l{% force alignment to left + \tabu@cell@align + {\tabu@removehfil \raggedright \tabu@cellleft}% left + {\tabu@flush1\tabu@ignorehfil}% right + \raggedright +}% \tabu@cell@l +\def\tabu@cell@c{% force alignment to center + \tabu@cell@align + {\tabu@removehfil \centering \tabu@flush{.5}\tabu@cellleft} + {\tabu@flush{.5}\tabu@ignorehfil} + \centering +}% \tabu@cell@c +\def\tabu@cell@r{% force alignment to right + \tabu@cell@align + {\tabu@removehfil \raggedleft \tabu@flush1\tabu@cellleft} + \tabu@ignorehfil + \raggedleft +}% \tabu@cell@r +\def\tabu@cell@j{% force justification (for p, m, b columns) + \tabu@cell@align + {\tabu@justify\tabu@cellleft} + {} + \tabu@justify +}% \tabu@cell@j +\def\tabu@justify{% + \leftskip\z@skip \@rightskip\leftskip \rightskip\@rightskip + \parfillskip\@flushglue +}% \tabu@justify +%% ragged2e settings +\def\tabu@cell@L{% force alignment to left (ragged2e) + \tabu@cell@align + {\tabu@removehfil \RaggedRight \tabu@cellleft} + {\tabu@flush 1\tabu@ignorehfil} + \RaggedRight +}% \tabu@cell@L +\def\tabu@cell@C{% force alignment to center (ragged2e) + \tabu@cell@align + {\tabu@removehfil \Centering \tabu@flush{.5}\tabu@cellleft} + {\tabu@flush{.5}\tabu@ignorehfil} + \Centering +}% \tabu@cell@C +\def\tabu@cell@R{% force alignment to right (ragged2e) + \tabu@cell@align + {\tabu@removehfil \RaggedLeft \tabu@flush 1\tabu@cellleft} + \tabu@ignorehfil + \RaggedLeft +}% \tabu@cell@R +\def\tabu@cell@J{% force justification (ragged2e) + \tabu@cell@align + {\justifying \tabu@cellleft} + {} + \justifying +}% \tabu@cell@J +\def\tabu@flush#1{% + \iftabu@colortbl % colortbl uses \hfill rather than \hfil + \hskip \ifnum13<\currentgrouptype \stretch{#1}% + \else \ifdim#1pt<\p@ \tabu@cellskip + \else \stretch{#1} + \fi\fi \relax + \else % array.sty + \ifnum 13<\currentgrouptype + \hfil \hskip1sp \relax \fi + \fi +}% \tabu@flush +\let\tabu@hfil \hfil +\let\tabu@hfill \hfill +\let\tabu@hskip \hskip +\def\tabu@removehfil{% + \iftabu@colortbl + \unkern \tabu@cellskip =\lastskip + \ifnum\gluestretchorder\tabu@cellskip =\tw@ \hskip-\tabu@cellskip + \else \tabu@cellskip \z@skip + \fi + \else + \ifdim\lastskip=1sp\unskip\fi + \ifnum\gluestretchorder\lastskip =\@ne + \hfilneg % \hfilneg for array.sty but not for colortbl... + \fi + \fi +}% \tabu@removehfil +\def\tabu@ignorehfil{\aftergroup \tabu@nohfil} +\def\tabu@nohfil{% \hfil -> do nothing + restore original \hfil + \def\hfil{\let\hfil \tabu@hfil}% local to (alignment template) group +}% \tabu@nohfil +\def\tabu@colortblalignments {% if colortbl + \def\tabu@nohfil{% + \def\hfil {\let\hfil \tabu@hfil}% local to (alignment template) group + \def\hfill {\let\hfill \tabu@hfill}% (colortbl uses \hfill) pfff... + \def\hskip ####1\relax{\let\hskip \tabu@hskip}}% local +}% \tabu@colortblalignments +%% Taking care of footnotes and hyperfootnotes ---------------------- +\long\def\tabu@footnotetext #1{% + \edef\@tempa{\the\tabu@footnotes + \noexpand\footnotetext [\the\csname c@\@mpfn\endcsname]}% + \global\tabu@footnotes\expandafter{\@tempa {#1}}}% +\long\def\tabu@xfootnotetext [#1]#2{% + \global\tabu@footnotes\expandafter{\the\tabu@footnotes + \footnotetext [{#1}]{#2}}} +\let\tabu@xfootnote \@xfootnote +\long\def\tabu@Hy@ftntext{\tabu@Hy@ftntxt {\the \c@footnote }} +\long\def\tabu@Hy@xfootnote [#1]{% + \begingroup + \value\@mpfn #1\relax + \protected@xdef \@thefnmark {\thempfn}% + \endgroup + \@footnotemark \tabu@Hy@ftntxt {#1}% +}% \tabu@Hy@xfootnote +\long\def\tabu@Hy@ftntxt #1#2{% + \edef\@tempa{% + \the\tabu@footnotes + \begingroup + \value\@mpfn #1\relax + \noexpand\protected@xdef\noexpand\@thefnmark {\noexpand\thempfn}% + \expandafter \noexpand \expandafter + \tabu@Hy@footnotetext \expandafter{\Hy@footnote@currentHref}% + }% + \global\tabu@footnotes\expandafter{\@tempa {#2}% + \endgroup}% +}% \tabu@Hy@ftntxt +\long\def\tabu@Hy@footnotetext #1#2{% + \H@@footnotetext{% + \ifHy@nesting + \hyper@@anchor {#1}{#2}% + \else + \Hy@raisedlink{% + \hyper@@anchor {#1}{\relax}% + }% + \def\@currentHref {#1}% + \let\@currentlabelname \@empty + #2% + \fi + }% +}% \tabu@Hy@footnotetext +%% No need for \arraybackslash ! ------------------------------------ +\def\tabu@latextwoe {% +\def\tabu@temp##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}} +\tabu@temp \tabu@centering \centering \arraybackslash +\tabu@temp \tabu@raggedleft \raggedleft \arraybackslash +\tabu@temp \tabu@raggedright \raggedright \arraybackslash +}% \tabu@latextwoe +\def\tabu@raggedtwoe {% +\def\tabu@temp ##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}} +\tabu@temp \tabu@Centering \Centering \arraybackslash +\tabu@temp \tabu@RaggedLeft \RaggedLeft \arraybackslash +\tabu@temp \tabu@RaggedRight \RaggedRight \arraybackslash +\tabu@temp \tabu@justifying \justifying \arraybackslash +}% \tabu@raggedtwoe +\def\tabu@normalcrbackslash{\let\\\@normalcr} +\def\tabu@trivlist{\expandafter\def\expandafter\@trivlist\expandafter{% + \expandafter\tabu@normalcrbackslash \@trivlist}} +%% Utilities: \fbox \fcolorbox and \tabudecimal ------------------- +\def\tabu@fbox {\leavevmode\afterassignment\tabu@beginfbox \setbox\@tempboxa\hbox} +\def\tabu@beginfbox {\bgroup \kern\fboxsep + \bgroup\aftergroup\tabu@endfbox} +\def\tabu@endfbox {\kern\fboxsep\egroup\egroup + \@frameb@x\relax} +\def\tabu@color@b@x #1#2{\leavevmode \bgroup + \def\tabu@docolor@b@x{#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@}}% + \afterassignment\tabu@begincolor@b@x \setbox\z@ \hbox +}% \tabu@color@b@x +\def\tabu@begincolor@b@x {\kern\fboxsep \bgroup + \aftergroup\tabu@endcolor@b@x \set@color} +\def\tabu@endcolor@b@x {\kern\fboxsep \egroup + \dimen@\ht\z@ \advance\dimen@ \fboxsep \ht\z@ \dimen@ + \dimen@\dp\z@ \advance\dimen@ \fboxsep \dp\z@ \dimen@ + \tabu@docolor@b@x \egroup +}% \tabu@endcolor@b@x +%% Corrections (arydshln, delarray, colortbl) ----------------------- +\def\tabu@fix@arrayright {%% \@arrayright is missing from \endarray + \iftabu@colortbl + \ifdefined\adl@array % + \def\tabu@endarray{% + \adl@endarray \egroup \adl@arrayrestore \CT@end \egroup % + \@arrayright % + \gdef\@preamble{}}% + \else % + \def\tabu@endarray{% + \crcr \egroup \egroup % + \@arrayright % + \gdef\@preamble{}\CT@end}% + \fi + \else + \ifdefined\adl@array % + \def\tabu@endarray{% + \adl@endarray \egroup \adl@arrayrestore \egroup % + \@arrayright % + \gdef\@preamble{}}% + \else % + \PackageWarning{tabu} + {\string\@arrayright\space is missing from the + \MessageBreak definition of \string\endarray. + \MessageBreak Compatibility with delarray.sty is broken.}% + \fi\fi +}% \tabu@fix@arrayright +\def\tabu@adl@xarraydashrule #1#2#3{% + \ifnum\@lastchclass=\adl@class@start\else + \ifnum\@lastchclass=\@ne\else + \ifnum\@lastchclass=5 \else % @-arg (class 5) and !-arg (class 1) + \adl@leftrulefalse \fi\fi % must be treated the same + \fi + \ifadl@zwvrule\else \ifadl@inactive\else + \@addtopreamble{\vrule\@width\arrayrulewidth + \@height\z@ \@depth\z@}\fi \fi + \ifadl@leftrule + \@addtopreamble{\adl@vlineL{\CT@arc@}{\adl@dashgapcolor}% + {\number#1}#3}% + \else \@addtopreamble{\adl@vlineR{\CT@arc@}{\adl@dashgapcolor}% + {\number#2}#3} + \fi +}% \tabu@adl@xarraydashrule +\def\tabu@adl@act@endpbox {% + \unskip \ifhmode \nobreak \fi \@finalstrut \@arstrutbox + \egroup \egroup + \adl@colhtdp \box\adl@box \hfil +}% \tabu@adl@act@endpbox +\def\tabu@adl@fix {% + \let\adl@xarraydashrule \tabu@adl@xarraydashrule % arydshln + \let\adl@act@endpbox \tabu@adl@act@endpbox % arydshln + \let\adl@act@@endpbox \tabu@adl@act@endpbox % arydshln + \let\@preamerror \@preamerr % arydshln +}% \tabu@adl@fix +%% Correction for longtable' \@startbox definition ------------------ +%% => \everypar is ``missing'' : TeX should be in vertical mode +\def\tabu@LT@startpbox #1{% + \bgroup + \let\@footnotetext\LT@p@ftntext + \setlength\hsize{#1}% + \@arrayparboxrestore + \everypar{% + \vrule \@height \ht\@arstrutbox \@width \z@ + \everypar{}}% +}% \tabu@LT@startpbox +%% \tracingtabu and the package options ------------------ +\DeclareOption{delarray}{\AtEndOfPackage{\RequirePackage{delarray}}} +\DeclareOption{linegoal}{% + \AtEndOfPackage{% + \RequirePackage{linegoal}[2010/12/07]% + \let\tabudefaulttarget \linegoal% \linegoal is \linewidth if not pdfTeX +}} +\DeclareOption{scantokens}{\tabuscantokenstrue} +\DeclareOption{debugshow}{\AtEndOfPackage{\tracingtabu=\tw@}} +\def\tracingtabu {\begingroup\@ifnextchar=% + {\afterassignment\tabu@tracing\count@} + {\afterassignment\tabu@tracing\count@1\relax}} +\def\tabu@tracing{\expandafter\endgroup + \expandafter\tabu@tr@cing \the\count@ \relax +}% \tabu@tracing +\def\tabu@tr@cing #1\relax {% + \ifnum#1>\thr@@ \let\tabu@tracinglines\message + \else \let\tabu@tracinglines\@gobble + \fi + \ifnum#1>\tw@ \let\tabu@DBG \tabu@@DBG + \def\tabu@mkarstrut {\tabu@DBG@arstrut}% + \tabustrutrule 1.5\p@ + \else \let\tabu@DBG \@gobble + \def\tabu@mkarstrut {\tabu@arstrut}% + \tabustrutrule \z@ + \fi + \ifnum#1>\@ne \let\tabu@debug \message + \else \let\tabu@debug \@gobble + \fi + \ifnum#1>\z@ + \let\tabu@message \message + \let\tabu@tracing@save \tabu@message@save + \let\tabu@starttimer \tabu@pdftimer + \else + \let\tabu@message \@gobble + \let\tabu@tracing@save \@gobble + \let\tabu@starttimer \relax + \fi +}% \tabu@tr@cing +%% Setup \AtBeginDocument +\AtBeginDocument{\tabu@AtBeginDocument} +\def\tabu@AtBeginDocument{\let\tabu@AtBeginDocument \@undefined + \ifdefined\arrayrulecolor \tabu@colortbltrue % + \tabu@colortblalignments % different glues are used + \else \tabu@colortblfalse \fi + \ifdefined\CT@arc@ \else \let\CT@arc@ \relax \fi + \ifdefined\CT@drsc@\else \let\CT@drsc@ \relax \fi + \let\tabu@arc@L \CT@arc@ \let\tabu@drsc@L \CT@drsc@ + \ifodd 1\ifcsname siunitx_table_collect_begin:Nn\endcsname % + \expandafter\ifx + \csname siunitx_table_collect_begin:Nn\endcsname\relax 0\fi\fi\relax + \tabu@siunitxtrue + \else \let\tabu@maybesiunitx \@firstofone % + \let\tabu@siunitx \tabu@nosiunitx + \tabu@siunitxfalse + \fi + \ifdefined\adl@array % + \else \let\tabu@adl@fix \relax + \let\tabu@adl@endtrial \@empty \fi + \ifdefined\longtable % + \else \let\longtabu \tabu@nolongtabu \fi + \ifdefined\cellspacetoplimit \tabu@warn@cellspace\fi + \csname\ifcsname ifHy@hyperfootnotes\endcsname % + ifHy@hyperfootnotes\else iffalse\fi\endcsname + \let\tabu@footnotetext \tabu@Hy@ftntext + \let\tabu@xfootnote \tabu@Hy@xfootnote \fi + \ifdefined\FV@DefineCheckEnd% + \tabu@fancyvrb \fi + \ifdefined\color % + \let\tabu@color \color + \def\tabu@leavevmodecolor ##1{% + \def\tabu@leavevmodecolor {\leavevmode ##1}% + }\expandafter\tabu@leavevmodecolor\expandafter{\color}% + \else + \let\tabu@color \tabu@nocolor + \let\tabu@leavevmodecolor \@firstofone \fi + \tabu@latextwoe + \ifdefined\@raggedtwoe@everyselectfont % + \tabu@raggedtwoe + \else + \let\tabu@cell@L \tabu@cell@l + \let\tabu@cell@R \tabu@cell@r + \let\tabu@cell@C \tabu@cell@c + \let\tabu@cell@J \tabu@cell@j \fi + \expandafter\in@ \expandafter\@arrayright \expandafter{\endarray}% + \ifin@ \let\tabu@endarray \endarray + \else \tabu@fix@arrayright \fi% + \everyrow{}% +}% \tabu@AtBeginDocument +\def\tabu@warn@cellspace{% + \PackageWarning{tabu}{% + Package cellspace has some limitations + \MessageBreak And redefines some macros of array.sty. + \MessageBreak Please use \string\tabulinesep\space to control + \MessageBreak vertical spacing of lines inside tabu environment}% +}% \tabu@warn@cellspace +%% tabu Package initialisation +\tabuscantokensfalse +\let\tabu@arc@G \relax +\let\tabu@drsc@G \relax +\let\tabu@evr@G \@empty +\let\tabu@rc@G \@empty +\def\tabu@ls@G {\tabu@linestyle@}% +\let\tabu@@rowfontreset \@empty % +\let\tabu@@celllalign \@empty +\let\tabu@@cellralign \@empty +\let\tabu@@cellleft \@empty +\let\tabu@@cellright \@empty +\def\tabu@naturalXmin {\z@} +\def\tabu@naturalXmax {\z@} +\let\tabu@rowfontreset \@empty +\def\tabulineon {4pt}\let\tabulineoff \tabulineon +\tabu@everyrowtrue +\ifdefined\pdfelapsedtime % + \def\tabu@pdftimer {\xdef\tabu@starttime{\the\pdfelapsedtime}}% +\else \let\tabu@pdftimer \relax \let\tabu@message@etime \relax +\fi +\tracingtabu=\z@ +\newtabulinestyle {=\maxdimen}% creates the 'factory' settings \tabu@linestyle@ +\tabulinestyle{} +\taburowcolors{} +\let\tabudefaulttarget \linewidth +\ProcessOptions* % \ProcessOptions* is quicker ! +\endinput +%% +%% End of file `tabu.sty'. diff --git a/input/settings_debug.txt b/input/settings_debug.txt index 3e2dfa46..15bf2bbc 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -7,15 +7,15 @@ physicalSizeY = 2.0 endTime = 10.0 # duration of the simulation re = 1000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity -gY = 0.0 +gY = -10.0 # Boundary Conditions Type BCTop = NoSlip -BCRight = Pressure +BCRight = NoSlip BCBottom = NoSlip -BCLeft = Pressure +BCLeft = NoSlip # NoSlip boundary conditions @@ -49,7 +49,7 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap createDomainfromBitmap = true -pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/air_water_obstacle.png +pathToBitmap = /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Bitmap/simple2.png # Discretization parameters nCellsX = 20 # number of cells in x and y direction @@ -64,4 +64,4 @@ maximumDt = 0.1 # maximum values for time step width pressureSolver = SOR # which pressure solver to use, possible values: GaussSeidel SOR CG omega = 1.6 # overrelaxation factor, only for SOR solver epsilon = 1e-5 # tolerance for 2-norm of residual -maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver +maximumNumberOfIterations = 1e4 # maximum number of iterations in the solver diff --git a/src/computation.cpp b/src/computation.cpp index 65960859..fa9b71a1 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -75,9 +75,9 @@ void Computation::runSimulation() //fluidTracer_->createAndKillParticles(dt_); // std::cout << "Particles: " << fluidTracer_->getNumberOfParticles() << std::endl; - // //mask_->printMask(); - // usleep(100000); - // std::cout << "\033[2J\033[1;1H"; + std::cout << "\033[2J\033[1;1H"; + mask_->printMask(); + // usleep(1000000); computeTimeStepWidth(currentTime); @@ -87,8 +87,8 @@ void Computation::runSimulation() computeVelocities(); applyBoundaryValues(); - // fluidTracer_->moveParticles(dt_); - // applyBoundaryValues(); + fluidTracer_->moveParticles(dt_); + applyBoundaryValues(); From b69ee1e926eeecd09569507a56bde511c33c27a7 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Mon, 5 Feb 2024 13:56:16 +0100 Subject: [PATCH 43/67] [surface(dt)] Deleted documentation --- documentation/html/annotated.html | 105 - documentation/html/array2D_8h_source.html | 122 - documentation/html/bc_s.png | Bin 676 -> 0 bytes documentation/html/bc_sd.png | Bin 635 -> 0 bytes documentation/html/boundary_8h_source.html | 139 - .../html/central__differences_8h_source.html | 119 - documentation/html/classArray2D-members.html | 92 - documentation/html/classArray2D.html | 238 -- documentation/html/classArray2D.png | Bin 455 -> 0 bytes documentation/html/classBoundary-members.html | 92 - documentation/html/classBoundary.html | 116 - .../html/classCentralDifferences-members.html | 148 - .../html/classCentralDifferences.html | 558 ---- .../html/classCentralDifferences.png | Bin 799 -> 0 bytes .../html/classComputation-members.html | 88 - documentation/html/classComputation.html | 147 - .../html/classDiscretization-members.html | 147 - documentation/html/classDiscretization.html | 555 ---- documentation/html/classDiscretization.png | Bin 1039 -> 0 bytes .../html/classDonorCell-members.html | 148 - documentation/html/classDonorCell.html | 565 ---- documentation/html/classDonorCell.png | Bin 690 -> 0 bytes .../html/classFieldVariable-members.html | 95 - documentation/html/classFieldVariable.html | 250 -- documentation/html/classFieldVariable.png | Bin 454 -> 0 bytes .../html/classFluidTracer-members.html | 97 - documentation/html/classFluidTracer.html | 233 -- .../html/classGaussSeidel-members.html | 101 - documentation/html/classGaussSeidel.html | 253 -- documentation/html/classGaussSeidel.png | Bin 502 -> 0 bytes documentation/html/classMask-members.html | 148 - documentation/html/classMask.html | 464 --- .../html/classOutputWriter-members.html | 90 - documentation/html/classOutputWriter.html | 194 -- documentation/html/classOutputWriter.png | Bin 884 -> 0 bytes .../classOutputWriterParaview-members.html | 91 - .../html/classOutputWriterParaview.html | 207 -- .../html/classOutputWriterParaview.png | Bin 611 -> 0 bytes .../html/classOutputWriterText-members.html | 91 - documentation/html/classOutputWriterText.html | 195 -- documentation/html/classOutputWriterText.png | Bin 534 -> 0 bytes .../html/classPressureSolver-members.html | 100 - documentation/html/classPressureSolver.html | 286 -- documentation/html/classPressureSolver.png | Bin 675 -> 0 bytes documentation/html/classSOR-members.html | 101 - documentation/html/classSOR.html | 260 -- documentation/html/classSOR.png | Bin 441 -> 0 bytes .../html/classStaggeredGrid-members.html | 136 - documentation/html/classStaggeredGrid.html | 354 --- documentation/html/classStaggeredGrid.png | Bin 1049 -> 0 bytes documentation/html/classes.html | 119 - documentation/html/clipboard.js | 61 - documentation/html/closed.png | Bin 132 -> 0 bytes documentation/html/computation_8h_source.html | 158 - .../dir_041db6ad6a3d44280e40e5af409429cb.html | 97 - .../dir_2725064ac5d6db7b2425ad4e379e8748.html | 95 - .../dir_29398f723566cb24cda620b0fb0566c4.html | 93 - .../dir_452baf35e1d7639c9f2a5ece4ec85855.html | 95 - .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 110 - .../dir_93b0d6a552827721ec9247642283aaa7.html | 93 - .../dir_b0b9c4b8ebed4a07d44b9aa635c19fe7.html | 97 - .../dir_e7c1ed2d2d4c4bb5d8a9744d9e98c346.html | 99 - .../html/discretization_8h_source.html | 137 - documentation/html/doc.svg | 12 - documentation/html/docd.svg | 12 - documentation/html/donor__cell_8h_source.html | 123 - documentation/html/doxygen.css | 2080 -------------- documentation/html/doxygen.svg | 28 - documentation/html/dynsections.js | 194 -- .../html/field__variable_8h_source.html | 121 - documentation/html/files.html | 112 - .../html/fluid__tracer_8h_source.html | 160 -- documentation/html/folderclosed.svg | 11 - documentation/html/folderclosedd.svg | 11 - documentation/html/folderopen.svg | 17 - documentation/html/folderopend.svg | 12 - documentation/html/functions.html | 288 -- documentation/html/functions_func.html | 224 -- documentation/html/functions_vars.html | 202 -- .../html/gauss__seidel_8h_source.html | 113 - documentation/html/hierarchy.html | 105 - documentation/html/index.html | 83 - documentation/html/jquery.js | 91 - documentation/html/mask_8h_source.html | 228 -- documentation/html/menu.js | 134 - documentation/html/menudata.js | 90 - documentation/html/minus.svg | 8 - documentation/html/minusd.svg | 8 - documentation/html/nav_f.png | Bin 153 -> 0 bytes documentation/html/nav_fd.png | Bin 169 -> 0 bytes documentation/html/nav_g.png | Bin 95 -> 0 bytes documentation/html/nav_h.png | Bin 98 -> 0 bytes documentation/html/nav_hd.png | Bin 114 -> 0 bytes documentation/html/open.png | Bin 123 -> 0 bytes .../html/output__writer_8h_source.html | 118 - .../output__writer__paraview_8h_source.html | 124 - .../html/output__writer__text_8h_source.html | 116 - documentation/html/plus.svg | 9 - documentation/html/plusd.svg | 9 - .../html/pressure__solver_8h_source.html | 148 - documentation/html/search/all_0.js | 5 - documentation/html/search/all_1.js | 6 - documentation/html/search/all_10.js | 4 - documentation/html/search/all_11.js | 10 - documentation/html/search/all_12.js | 10 - documentation/html/search/all_13.js | 5 - documentation/html/search/all_2.js | 19 - documentation/html/search/all_3.js | 10 - documentation/html/search/all_4.js | 6 - documentation/html/search/all_5.js | 13 - documentation/html/search/all_6.js | 13 - documentation/html/search/all_7.js | 11 - documentation/html/search/all_8.js | 5 - documentation/html/search/all_9.js | 5 - documentation/html/search/all_a.js | 10 - documentation/html/search/all_b.js | 9 - documentation/html/search/all_c.js | 10 - documentation/html/search/all_d.js | 18 - documentation/html/search/all_e.js | 13 - documentation/html/search/all_f.js | 11 - documentation/html/search/classes_0.js | 4 - documentation/html/search/classes_1.js | 4 - documentation/html/search/classes_2.js | 5 - documentation/html/search/classes_3.js | 5 - documentation/html/search/classes_4.js | 5 - documentation/html/search/classes_5.js | 4 - documentation/html/search/classes_6.js | 4 - documentation/html/search/classes_7.js | 4 - documentation/html/search/classes_8.js | 6 - documentation/html/search/classes_9.js | 4 - documentation/html/search/classes_a.js | 6 - documentation/html/search/close.svg | 18 - documentation/html/search/functions_0.js | 4 - documentation/html/search/functions_1.js | 16 - documentation/html/search/functions_2.js | 7 - documentation/html/search/functions_3.js | 10 - documentation/html/search/functions_4.js | 12 - documentation/html/search/functions_5.js | 8 - documentation/html/search/functions_6.js | 4 - documentation/html/search/functions_7.js | 6 - documentation/html/search/functions_8.js | 4 - documentation/html/search/functions_9.js | 6 - documentation/html/search/functions_a.js | 10 - documentation/html/search/functions_b.js | 11 - documentation/html/search/functions_c.js | 9 - documentation/html/search/functions_d.js | 8 - documentation/html/search/functions_e.js | 8 - documentation/html/search/functions_f.js | 5 - documentation/html/search/mag.svg | 24 - documentation/html/search/mag_d.svg | 24 - documentation/html/search/mag_sel.svg | 31 - documentation/html/search/mag_seld.svg | 31 - documentation/html/search/search.css | 291 -- documentation/html/search/search.js | 694 ----- documentation/html/search/searchdata.js | 24 - documentation/html/search/variables_0.js | 4 - documentation/html/search/variables_1.js | 5 - documentation/html/search/variables_10.js | 5 - documentation/html/search/variables_11.js | 5 - documentation/html/search/variables_2.js | 5 - documentation/html/search/variables_3.js | 6 - documentation/html/search/variables_4.js | 6 - documentation/html/search/variables_5.js | 5 - documentation/html/search/variables_6.js | 5 - documentation/html/search/variables_7.js | 6 - documentation/html/search/variables_8.js | 5 - documentation/html/search/variables_9.js | 7 - documentation/html/search/variables_a.js | 9 - documentation/html/search/variables_b.js | 6 - documentation/html/search/variables_c.js | 12 - documentation/html/search/variables_d.js | 5 - documentation/html/search/variables_e.js | 4 - documentation/html/search/variables_f.js | 4 - documentation/html/settings_8h_source.html | 202 -- documentation/html/sor_8h_source.html | 117 - documentation/html/splitbar.png | Bin 314 -> 0 bytes documentation/html/splitbard.png | Bin 282 -> 0 bytes .../html/staggered__grid_8h_source.html | 219 -- .../html/structSettings-members.html | 120 - documentation/html/structSettings.html | 326 --- ...structSettings_1_1LineContent-members.html | 93 - .../html/structSettings_1_1LineContent.html | 116 - documentation/html/sync_off.png | Bin 853 -> 0 bytes documentation/html/sync_on.png | Bin 845 -> 0 bytes documentation/html/tab_a.png | Bin 142 -> 0 bytes documentation/html/tab_ad.png | Bin 135 -> 0 bytes documentation/html/tab_b.png | Bin 169 -> 0 bytes documentation/html/tab_bd.png | Bin 173 -> 0 bytes documentation/html/tab_h.png | Bin 177 -> 0 bytes documentation/html/tab_hd.png | Bin 180 -> 0 bytes documentation/html/tab_s.png | Bin 184 -> 0 bytes documentation/html/tab_sd.png | Bin 188 -> 0 bytes documentation/html/tabs.css | 1 - documentation/latex/Makefile | 27 - documentation/latex/annotated.tex | 21 - documentation/latex/array2D_8h_source.tex | 52 - documentation/latex/boundary_8h_source.tex | 49 - .../latex/central__differences_8h_source.tex | 45 - documentation/latex/classArray2D.eps | 197 -- documentation/latex/classArray2D.pdf | Bin 4942 -> 0 bytes documentation/latex/classArray2D.tex | 104 - documentation/latex/classBoundary.tex | 32 - .../latex/classCentralDifferences.eps | 203 -- .../latex/classCentralDifferences.pdf | Bin 5704 -> 0 bytes .../latex/classCentralDifferences.tex | 244 -- documentation/latex/classComputation.tex | 50 - documentation/latex/classDiscretization.eps | 209 -- documentation/latex/classDiscretization.pdf | Bin 5766 -> 0 bytes documentation/latex/classDiscretization.tex | 245 -- documentation/latex/classDonorCell.eps | 203 -- documentation/latex/classDonorCell.pdf | Bin 5600 -> 0 bytes documentation/latex/classDonorCell.tex | 246 -- documentation/latex/classFieldVariable.eps | 197 -- documentation/latex/classFieldVariable.pdf | Bin 4939 -> 0 bytes documentation/latex/classFieldVariable.tex | 110 - documentation/latex/classFluidTracer.tex | 101 - documentation/latex/classGaussSeidel.eps | 197 -- documentation/latex/classGaussSeidel.pdf | Bin 5020 -> 0 bytes documentation/latex/classGaussSeidel.tex | 111 - documentation/latex/classMask.tex | 248 -- documentation/latex/classOutputWriter.eps | 203 -- documentation/latex/classOutputWriter.pdf | Bin 5206 -> 0 bytes documentation/latex/classOutputWriter.tex | 84 - .../latex/classOutputWriterParaview.eps | 197 -- .../latex/classOutputWriterParaview.pdf | Bin 4909 -> 0 bytes .../latex/classOutputWriterParaview.tex | 88 - documentation/latex/classOutputWriterText.eps | 197 -- documentation/latex/classOutputWriterText.pdf | Bin 4610 -> 0 bytes documentation/latex/classOutputWriterText.tex | 85 - documentation/latex/classPressureSolver.eps | 203 -- documentation/latex/classPressureSolver.pdf | Bin 5338 -> 0 bytes documentation/latex/classPressureSolver.tex | 130 - documentation/latex/classSOR.eps | 197 -- documentation/latex/classSOR.pdf | Bin 4725 -> 0 bytes documentation/latex/classSOR.tex | 113 - documentation/latex/classStaggeredGrid.eps | 209 -- documentation/latex/classStaggeredGrid.pdf | Bin 5761 -> 0 bytes documentation/latex/classStaggeredGrid.tex | 203 -- documentation/latex/computation_8h_source.tex | 94 - .../latex/discretization_8h_source.tex | 66 - documentation/latex/donor__cell_8h_source.tex | 50 - documentation/latex/doxygen.sty | 694 ----- documentation/latex/etoc_doxygen.sty | 2178 -------------- .../latex/field__variable_8h_source.tex | 51 - documentation/latex/files.tex | 20 - .../latex/fluid__tracer_8h_source.tex | 95 - .../latex/gauss__seidel_8h_source.tex | 34 - documentation/latex/hierarchy.tex | 31 - documentation/latex/longtable_doxygen.sty | 456 --- documentation/latex/mask_8h_source.tex | 172 -- .../latex/output__writer_8h_source.tex | 38 - .../output__writer__paraview_8h_source.tex | 47 - .../latex/output__writer__text_8h_source.tex | 41 - .../latex/pressure__solver_8h_source.tex | 70 - documentation/latex/refman.tex | 262 -- documentation/latex/settings_8h_source.tex | 98 - documentation/latex/sor_8h_source.tex | 39 - .../latex/staggered__grid_8h_source.tex | 180 -- documentation/latex/structSettings.tex | 175 -- .../latex/structSettings_1_1LineContent.tex | 31 - documentation/latex/tabu_doxygen.sty | 2557 ----------------- src/boundary/boundary.cpp | 261 ++ src/boundary/boundary.h | 2 + src/computation.cpp | 7 +- 264 files changed, 267 insertions(+), 28459 deletions(-) delete mode 100644 documentation/html/annotated.html delete mode 100644 documentation/html/array2D_8h_source.html delete mode 100644 documentation/html/bc_s.png delete mode 100644 documentation/html/bc_sd.png delete mode 100644 documentation/html/boundary_8h_source.html delete mode 100644 documentation/html/central__differences_8h_source.html delete mode 100644 documentation/html/classArray2D-members.html delete mode 100644 documentation/html/classArray2D.html delete mode 100644 documentation/html/classArray2D.png delete mode 100644 documentation/html/classBoundary-members.html delete mode 100644 documentation/html/classBoundary.html delete mode 100644 documentation/html/classCentralDifferences-members.html delete mode 100644 documentation/html/classCentralDifferences.html delete mode 100644 documentation/html/classCentralDifferences.png delete mode 100644 documentation/html/classComputation-members.html delete mode 100644 documentation/html/classComputation.html delete mode 100644 documentation/html/classDiscretization-members.html delete mode 100644 documentation/html/classDiscretization.html delete mode 100644 documentation/html/classDiscretization.png delete mode 100644 documentation/html/classDonorCell-members.html delete mode 100644 documentation/html/classDonorCell.html delete mode 100644 documentation/html/classDonorCell.png delete mode 100644 documentation/html/classFieldVariable-members.html delete mode 100644 documentation/html/classFieldVariable.html delete mode 100644 documentation/html/classFieldVariable.png delete mode 100644 documentation/html/classFluidTracer-members.html delete mode 100644 documentation/html/classFluidTracer.html delete mode 100644 documentation/html/classGaussSeidel-members.html delete mode 100644 documentation/html/classGaussSeidel.html delete mode 100644 documentation/html/classGaussSeidel.png delete mode 100644 documentation/html/classMask-members.html delete mode 100644 documentation/html/classMask.html delete mode 100644 documentation/html/classOutputWriter-members.html delete mode 100644 documentation/html/classOutputWriter.html delete mode 100644 documentation/html/classOutputWriter.png delete mode 100644 documentation/html/classOutputWriterParaview-members.html delete mode 100644 documentation/html/classOutputWriterParaview.html delete mode 100644 documentation/html/classOutputWriterParaview.png delete mode 100644 documentation/html/classOutputWriterText-members.html delete mode 100644 documentation/html/classOutputWriterText.html delete mode 100644 documentation/html/classOutputWriterText.png delete mode 100644 documentation/html/classPressureSolver-members.html delete mode 100644 documentation/html/classPressureSolver.html delete mode 100644 documentation/html/classPressureSolver.png delete mode 100644 documentation/html/classSOR-members.html delete mode 100644 documentation/html/classSOR.html delete mode 100644 documentation/html/classSOR.png delete mode 100644 documentation/html/classStaggeredGrid-members.html delete mode 100644 documentation/html/classStaggeredGrid.html delete mode 100644 documentation/html/classStaggeredGrid.png delete mode 100644 documentation/html/classes.html delete mode 100644 documentation/html/clipboard.js delete mode 100644 documentation/html/closed.png delete mode 100644 documentation/html/computation_8h_source.html delete mode 100644 documentation/html/dir_041db6ad6a3d44280e40e5af409429cb.html delete mode 100644 documentation/html/dir_2725064ac5d6db7b2425ad4e379e8748.html delete mode 100644 documentation/html/dir_29398f723566cb24cda620b0fb0566c4.html delete mode 100644 documentation/html/dir_452baf35e1d7639c9f2a5ece4ec85855.html delete mode 100644 documentation/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html delete mode 100644 documentation/html/dir_93b0d6a552827721ec9247642283aaa7.html delete mode 100644 documentation/html/dir_b0b9c4b8ebed4a07d44b9aa635c19fe7.html delete mode 100644 documentation/html/dir_e7c1ed2d2d4c4bb5d8a9744d9e98c346.html delete mode 100644 documentation/html/discretization_8h_source.html delete mode 100644 documentation/html/doc.svg delete mode 100644 documentation/html/docd.svg delete mode 100644 documentation/html/donor__cell_8h_source.html delete mode 100644 documentation/html/doxygen.css delete mode 100644 documentation/html/doxygen.svg delete mode 100644 documentation/html/dynsections.js delete mode 100644 documentation/html/field__variable_8h_source.html delete mode 100644 documentation/html/files.html delete mode 100644 documentation/html/fluid__tracer_8h_source.html delete mode 100644 documentation/html/folderclosed.svg delete mode 100644 documentation/html/folderclosedd.svg delete mode 100644 documentation/html/folderopen.svg delete mode 100644 documentation/html/folderopend.svg delete mode 100644 documentation/html/functions.html delete mode 100644 documentation/html/functions_func.html delete mode 100644 documentation/html/functions_vars.html delete mode 100644 documentation/html/gauss__seidel_8h_source.html delete mode 100644 documentation/html/hierarchy.html delete mode 100644 documentation/html/index.html delete mode 100644 documentation/html/jquery.js delete mode 100644 documentation/html/mask_8h_source.html delete mode 100644 documentation/html/menu.js delete mode 100644 documentation/html/menudata.js delete mode 100644 documentation/html/minus.svg delete mode 100644 documentation/html/minusd.svg delete mode 100644 documentation/html/nav_f.png delete mode 100644 documentation/html/nav_fd.png delete mode 100644 documentation/html/nav_g.png delete mode 100644 documentation/html/nav_h.png delete mode 100644 documentation/html/nav_hd.png delete mode 100644 documentation/html/open.png delete mode 100644 documentation/html/output__writer_8h_source.html delete mode 100644 documentation/html/output__writer__paraview_8h_source.html delete mode 100644 documentation/html/output__writer__text_8h_source.html delete mode 100644 documentation/html/plus.svg delete mode 100644 documentation/html/plusd.svg delete mode 100644 documentation/html/pressure__solver_8h_source.html delete mode 100644 documentation/html/search/all_0.js delete mode 100644 documentation/html/search/all_1.js delete mode 100644 documentation/html/search/all_10.js delete mode 100644 documentation/html/search/all_11.js delete mode 100644 documentation/html/search/all_12.js delete mode 100644 documentation/html/search/all_13.js delete mode 100644 documentation/html/search/all_2.js delete mode 100644 documentation/html/search/all_3.js delete mode 100644 documentation/html/search/all_4.js delete mode 100644 documentation/html/search/all_5.js delete mode 100644 documentation/html/search/all_6.js delete mode 100644 documentation/html/search/all_7.js delete mode 100644 documentation/html/search/all_8.js delete mode 100644 documentation/html/search/all_9.js delete mode 100644 documentation/html/search/all_a.js delete mode 100644 documentation/html/search/all_b.js delete mode 100644 documentation/html/search/all_c.js delete mode 100644 documentation/html/search/all_d.js delete mode 100644 documentation/html/search/all_e.js delete mode 100644 documentation/html/search/all_f.js delete mode 100644 documentation/html/search/classes_0.js delete mode 100644 documentation/html/search/classes_1.js delete mode 100644 documentation/html/search/classes_2.js delete mode 100644 documentation/html/search/classes_3.js delete mode 100644 documentation/html/search/classes_4.js delete mode 100644 documentation/html/search/classes_5.js delete mode 100644 documentation/html/search/classes_6.js delete mode 100644 documentation/html/search/classes_7.js delete mode 100644 documentation/html/search/classes_8.js delete mode 100644 documentation/html/search/classes_9.js delete mode 100644 documentation/html/search/classes_a.js delete mode 100644 documentation/html/search/close.svg delete mode 100644 documentation/html/search/functions_0.js delete mode 100644 documentation/html/search/functions_1.js delete mode 100644 documentation/html/search/functions_2.js delete mode 100644 documentation/html/search/functions_3.js delete mode 100644 documentation/html/search/functions_4.js delete mode 100644 documentation/html/search/functions_5.js delete mode 100644 documentation/html/search/functions_6.js delete mode 100644 documentation/html/search/functions_7.js delete mode 100644 documentation/html/search/functions_8.js delete mode 100644 documentation/html/search/functions_9.js delete mode 100644 documentation/html/search/functions_a.js delete mode 100644 documentation/html/search/functions_b.js delete mode 100644 documentation/html/search/functions_c.js delete mode 100644 documentation/html/search/functions_d.js delete mode 100644 documentation/html/search/functions_e.js delete mode 100644 documentation/html/search/functions_f.js delete mode 100644 documentation/html/search/mag.svg delete mode 100644 documentation/html/search/mag_d.svg delete mode 100644 documentation/html/search/mag_sel.svg delete mode 100644 documentation/html/search/mag_seld.svg delete mode 100644 documentation/html/search/search.css delete mode 100644 documentation/html/search/search.js delete mode 100644 documentation/html/search/searchdata.js delete mode 100644 documentation/html/search/variables_0.js delete mode 100644 documentation/html/search/variables_1.js delete mode 100644 documentation/html/search/variables_10.js delete mode 100644 documentation/html/search/variables_11.js delete mode 100644 documentation/html/search/variables_2.js delete mode 100644 documentation/html/search/variables_3.js delete mode 100644 documentation/html/search/variables_4.js delete mode 100644 documentation/html/search/variables_5.js delete mode 100644 documentation/html/search/variables_6.js delete mode 100644 documentation/html/search/variables_7.js delete mode 100644 documentation/html/search/variables_8.js delete mode 100644 documentation/html/search/variables_9.js delete mode 100644 documentation/html/search/variables_a.js delete mode 100644 documentation/html/search/variables_b.js delete mode 100644 documentation/html/search/variables_c.js delete mode 100644 documentation/html/search/variables_d.js delete mode 100644 documentation/html/search/variables_e.js delete mode 100644 documentation/html/search/variables_f.js delete mode 100644 documentation/html/settings_8h_source.html delete mode 100644 documentation/html/sor_8h_source.html delete mode 100644 documentation/html/splitbar.png delete mode 100644 documentation/html/splitbard.png delete mode 100644 documentation/html/staggered__grid_8h_source.html delete mode 100644 documentation/html/structSettings-members.html delete mode 100644 documentation/html/structSettings.html delete mode 100644 documentation/html/structSettings_1_1LineContent-members.html delete mode 100644 documentation/html/structSettings_1_1LineContent.html delete mode 100644 documentation/html/sync_off.png delete mode 100644 documentation/html/sync_on.png delete mode 100644 documentation/html/tab_a.png delete mode 100644 documentation/html/tab_ad.png delete mode 100644 documentation/html/tab_b.png delete mode 100644 documentation/html/tab_bd.png delete mode 100644 documentation/html/tab_h.png delete mode 100644 documentation/html/tab_hd.png delete mode 100644 documentation/html/tab_s.png delete mode 100644 documentation/html/tab_sd.png delete mode 100644 documentation/html/tabs.css delete mode 100644 documentation/latex/Makefile delete mode 100644 documentation/latex/annotated.tex delete mode 100644 documentation/latex/array2D_8h_source.tex delete mode 100644 documentation/latex/boundary_8h_source.tex delete mode 100644 documentation/latex/central__differences_8h_source.tex delete mode 100644 documentation/latex/classArray2D.eps delete mode 100644 documentation/latex/classArray2D.pdf delete mode 100644 documentation/latex/classArray2D.tex delete mode 100644 documentation/latex/classBoundary.tex delete mode 100644 documentation/latex/classCentralDifferences.eps delete mode 100644 documentation/latex/classCentralDifferences.pdf delete mode 100644 documentation/latex/classCentralDifferences.tex delete mode 100644 documentation/latex/classComputation.tex delete mode 100644 documentation/latex/classDiscretization.eps delete mode 100644 documentation/latex/classDiscretization.pdf delete mode 100644 documentation/latex/classDiscretization.tex delete mode 100644 documentation/latex/classDonorCell.eps delete mode 100644 documentation/latex/classDonorCell.pdf delete mode 100644 documentation/latex/classDonorCell.tex delete mode 100644 documentation/latex/classFieldVariable.eps delete mode 100644 documentation/latex/classFieldVariable.pdf delete mode 100644 documentation/latex/classFieldVariable.tex delete mode 100644 documentation/latex/classFluidTracer.tex delete mode 100644 documentation/latex/classGaussSeidel.eps delete mode 100644 documentation/latex/classGaussSeidel.pdf delete mode 100644 documentation/latex/classGaussSeidel.tex delete mode 100644 documentation/latex/classMask.tex delete mode 100644 documentation/latex/classOutputWriter.eps delete mode 100644 documentation/latex/classOutputWriter.pdf delete mode 100644 documentation/latex/classOutputWriter.tex delete mode 100644 documentation/latex/classOutputWriterParaview.eps delete mode 100644 documentation/latex/classOutputWriterParaview.pdf delete mode 100644 documentation/latex/classOutputWriterParaview.tex delete mode 100644 documentation/latex/classOutputWriterText.eps delete mode 100644 documentation/latex/classOutputWriterText.pdf delete mode 100644 documentation/latex/classOutputWriterText.tex delete mode 100644 documentation/latex/classPressureSolver.eps delete mode 100644 documentation/latex/classPressureSolver.pdf delete mode 100644 documentation/latex/classPressureSolver.tex delete mode 100644 documentation/latex/classSOR.eps delete mode 100644 documentation/latex/classSOR.pdf delete mode 100644 documentation/latex/classSOR.tex delete mode 100644 documentation/latex/classStaggeredGrid.eps delete mode 100644 documentation/latex/classStaggeredGrid.pdf delete mode 100644 documentation/latex/classStaggeredGrid.tex delete mode 100644 documentation/latex/computation_8h_source.tex delete mode 100644 documentation/latex/discretization_8h_source.tex delete mode 100644 documentation/latex/donor__cell_8h_source.tex delete mode 100644 documentation/latex/doxygen.sty delete mode 100644 documentation/latex/etoc_doxygen.sty delete mode 100644 documentation/latex/field__variable_8h_source.tex delete mode 100644 documentation/latex/files.tex delete mode 100644 documentation/latex/fluid__tracer_8h_source.tex delete mode 100644 documentation/latex/gauss__seidel_8h_source.tex delete mode 100644 documentation/latex/hierarchy.tex delete mode 100644 documentation/latex/longtable_doxygen.sty delete mode 100644 documentation/latex/mask_8h_source.tex delete mode 100644 documentation/latex/output__writer_8h_source.tex delete mode 100644 documentation/latex/output__writer__paraview_8h_source.tex delete mode 100644 documentation/latex/output__writer__text_8h_source.tex delete mode 100644 documentation/latex/pressure__solver_8h_source.tex delete mode 100644 documentation/latex/refman.tex delete mode 100644 documentation/latex/settings_8h_source.tex delete mode 100644 documentation/latex/sor_8h_source.tex delete mode 100644 documentation/latex/staggered__grid_8h_source.tex delete mode 100644 documentation/latex/structSettings.tex delete mode 100644 documentation/latex/structSettings_1_1LineContent.tex delete mode 100644 documentation/latex/tabu_doxygen.sty diff --git a/documentation/html/annotated.html b/documentation/html/annotated.html deleted file mode 100644 index 07ee10af..00000000 --- a/documentation/html/annotated.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - -NumSim: Class List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Class List
    -
    -
    -
    Here are the classes, structs, unions and interfaces with brief descriptions:
    -
    [detail level 12]
    - - - - - - - - - - - - - - - - - - -
     CArray2DThis class represents a 2D array of double values
     CBoundary
     CCentralDifferencesDiscretizes the problem using the central differences scheme
     CComputationComputation of Simulation
     CDiscretizationComputes derivatives included in governing equations
     CDonorCellDiscretizes the problem using the donor cell scheme
     CFieldVariableDiscretization of a scalar function
     CFluidTracer
     CGaussSeidelStandard Gauss-Seidel solver
     CMask
     COutputWriterInteface class for writing simulation data output
     COutputWriterParaviewWrite *.vti files that can be viewed with ParaView
     COutputWriterTextWrite *.txt files that are useful for debugging
     CPressureSolverSolves the Poisson problem for the pressure
     CSettingsAll settings that parametrize a simulation run
     CLineContentContains the content of a single line in a file
     CSORSuccessive over-relaxation solver
     CStaggeredGridCreate field variables and define limits for the indices
    -
    -
    - -
    - - diff --git a/documentation/html/array2D_8h_source.html b/documentation/html/array2D_8h_source.html deleted file mode 100644 index 6ef5be35..00000000 --- a/documentation/html/array2D_8h_source.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/storage/array2D.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    array2D.h
    -
    -
    -
    1#pragma once
    -
    2
    -
    3#include <vector>
    -
    4#include <array>
    -
    5#include <cassert>
    -
    6
    -
    7
    -
    - -
    16{
    -
    17public:
    -
    23 Array2D(std::array<int, 2> size);
    -
    24
    -
    32 double &operator()(int i, int j);
    -
    33
    -
    41 double operator()(int i, int j) const;
    -
    42
    -
    46 std::array<int, 2> size() const;
    -
    47
    -
    48protected:
    -
    49 const std::array<int, 2> size_;
    -
    50 std::vector<double> data_;
    -
    51};
    -
    -
    This class represents a 2D array of double values.
    Definition array2D.h:16
    -
    Array2D(std::array< int, 2 > size)
    constructor.
    Definition array2D.cpp:3
    -
    const std::array< int, 2 > size_
    size of array in x and y direction
    Definition array2D.h:49
    -
    double & operator()(int i, int j)
    set array value. Overloads the () operator
    Definition array2D.cpp:9
    -
    std::array< int, 2 > size() const
    get size of array in x and y direction
    Definition array2D.cpp:33
    -
    std::vector< double > data_
    storage array values, in row-major order
    Definition array2D.h:50
    -
    - - - - diff --git a/documentation/html/bc_s.png b/documentation/html/bc_s.png deleted file mode 100644 index 224b29aa9847d5a4b3902efd602b7ddf7d33e6c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT diff --git a/documentation/html/bc_sd.png b/documentation/html/bc_sd.png deleted file mode 100644 index 31ca888dc71049713b35c351933a8d0f36180bf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 635 zcmV->0)+jEP)Jwi0r1~gdSq#w{Bu1q z`craw(p2!hu$4C_$Oc3X(sI6e=9QSTwPt{G) z=htT&^~&c~L2~e{r5_5SYe7#Is-$ln>~Kd%$F#tC65?{LvQ}8O`A~RBB0N~`2M+waajO;5>3B&-viHGJeEK2TQOiPRa zfDKyqwMc4wfaEh4jt>H`nW_Zidwk@Bowp`}(VUaj-pSI(-1L>FJVsX}Yl9~JsqgsZ zUD9(rMwf23Gez6KPa|wwInZodP-2}9@fK0Ga_9{8SOjU&4l`pH4@qlQp83>>HT$xW zER^U>)MyV%t(Lu=`d=Y?{k1@}&r7ZGkFQ%z%N+sE9BtYjovzxyxCPxN6&@wLK{soQ zSmkj$aLI}miuE^p@~4}mg9OjDfGEkgY4~^XzLRUBB*O{+&vq<3v(E%+k_i%=`~j%{ Vj14gnt9}3g002ovPDHLkV1n!oC4m3{ diff --git a/documentation/html/boundary_8h_source.html b/documentation/html/boundary_8h_source.html deleted file mode 100644 index b64504fc..00000000 --- a/documentation/html/boundary_8h_source.html +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/boundary/boundary.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    boundary.h
    -
    -
    -
    1#pragma once
    -
    2
    -
    3#include "mask.h"
    -
    4#include "../discretization/discretization.h"
    -
    5#include "../settings_parser/settings.h"
    -
    6#include <vector>
    -
    7#include <memory>
    -
    8
    -
    - -
    10{
    -
    11 public:
    -
    12 Boundary(std::shared_ptr<Mask> mask, std::shared_ptr<Discretization> discretization, Settings settings);
    -
    13 void setPressureBoundaryValues();
    -
    14 void setVelocityBoundaryValues();
    -
    15 std::shared_ptr<Mask> mask_;
    -
    16
    -
    17
    -
    18 bool doCalculateF(int i, int j) const;
    -
    19 bool doCalculateG(int i, int j) const;
    -
    20
    -
    21 private:
    -
    22 void createBoundaryCellsLists();
    -
    23
    -
    24 // Set Pressure
    -
    25 void setPressureDomainBC();
    -
    26 void setPressureObstacleBC();
    -
    27 void setPressureSurfaceBC();
    -
    28
    -
    29
    -
    30 // Set Velocity
    -
    31 void setVelocityDomainBC();
    -
    32 void setVelocityObstacleBC();
    -
    33 void setVelocitySurfaceBC();
    -
    34
    -
    35
    -
    36 std::shared_ptr<Discretization> discretization_;
    -
    37 Settings settings_;
    -
    38
    -
    39 std::vector<int> DomainBoundaryCells_;
    -
    40 std::vector<int> ObstacleBoundaryCells_;
    -
    41 std::vector<int> FluidBoundaryCells_;
    -
    42
    -
    43};
    -
    -
    Definition boundary.h:10
    -
    All settings that parametrize a simulation run.
    Definition settings.h:14
    -
    - - - - diff --git a/documentation/html/central__differences_8h_source.html b/documentation/html/central__differences_8h_source.html deleted file mode 100644 index ef22486b..00000000 --- a/documentation/html/central__differences_8h_source.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/central_differences.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    central_differences.h
    -
    -
    -
    1#pragma once
    -
    2
    -
    3#include <array>
    -
    4#include <vector>
    -
    5#include "discretization.h"
    -
    6
    -
    - -
    15{
    -
    16public:
    -
    23 CentralDifferences(std::array<int, 2> nCells, std::array<double, 2> meshWidth);
    -
    24
    -
    29 double computeDu2Dx(int i, int j) const override;
    -
    34 double computeDv2Dy(int i, int j) const override;
    -
    39 double computeDuvDx(int i, int j) const override;
    -
    44 double computeDuvDy(int i, int j) const override;
    -
    45};
    -
    -
    Discretizes the problem using the central differences scheme.
    Definition central_differences.h:15
    -
    double computeDuvDy(int i, int j) const override
    Calculate first derivative of u*v with respect to y with the central differences Scheme.
    Definition central_differences.cpp:32
    -
    double computeDv2Dy(int i, int j) const override
    Calculate first derivative of v^2 with respect to y with the central differences Scheme.
    Definition central_differences.cpp:14
    -
    double computeDuvDx(int i, int j) const override
    Calculate first derivative of u*v with respect to x with the central differences Scheme.
    Definition central_differences.cpp:21
    -
    CentralDifferences(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
    Constructor.
    Definition central_differences.cpp:3
    -
    double computeDu2Dx(int i, int j) const override
    Calculate first derivative of u^2 with respect to x with the central differences Scheme.
    Definition central_differences.cpp:7
    -
    Computes derivatives included in governing equations.
    Definition discretization.h:16
    -
    const std::array< double, 2 > meshWidth() const
    Get the length of a single cell in x and y directions.
    Definition staggered_grid.cpp:14
    -
    const std::array< int, 2 > nCells() const
    Get number of cells in x and y directions.
    Definition staggered_grid.cpp:19
    -
    - - - - diff --git a/documentation/html/classArray2D-members.html b/documentation/html/classArray2D-members.html deleted file mode 100644 index b1ed0030..00000000 --- a/documentation/html/classArray2D-members.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    Array2D Member List
    -
    -
    - -

    This is the complete list of members for Array2D, including all inherited members.

    - - - - - - - -
    Array2D(std::array< int, 2 > size)Array2D
    data_Array2Dprotected
    operator()(int i, int j)Array2D
    operator()(int i, int j) constArray2D
    size() constArray2D
    size_Array2Dprotected
    - - - - diff --git a/documentation/html/classArray2D.html b/documentation/html/classArray2D.html deleted file mode 100644 index 614b3f4f..00000000 --- a/documentation/html/classArray2D.html +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - -NumSim: Array2D Class Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    - -

    This class represents a 2D array of double values. - More...

    - -

    #include <array2D.h>

    -
    -Inheritance diagram for Array2D:
    -
    -
    - - -FieldVariable - -
    - - - - - - - - - - - - - - -

    -Public Member Functions

     Array2D (std::array< int, 2 > size)
     constructor.
     
    double & operator() (int i, int j)
     set array value. Overloads the () operator
     
    double operator() (int i, int j) const
     get array value. Overloads the () operator
     
    -std::array< int, 2 > size () const
     get size of array in x and y direction
     
    - - - - - - - -

    -Protected Attributes

    -const std::array< int, 2 > size_
     size of array in x and y direction
     
    -std::vector< double > data_
     storage array values, in row-major order
     
    -

    Detailed Description

    -

    This class represents a 2D array of double values.

    -

    Internally they are stored consecutively in memory. The entries can be accessed by two indices i,j.

    -

    Constructor & Destructor Documentation

    - -

    ◆ Array2D()

    - -
    -
    - - - - - - - - -
    Array2D::Array2D (std::array< int, 2 > size)
    -
    - -

    constructor.

    -
    Parameters
    - - -
    sizesize of array in x and y direction
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ operator()() [1/2]

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    double & Array2D::operator() (int i,
    int j 
    )
    -
    - -

    set array value. Overloads the () operator

    -
    Parameters
    - - - -
    iindex in x direction
    jindex in y direction
    -
    -
    - -
    -
    - -

    ◆ operator()() [2/2]

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    double Array2D::operator() (int i,
    int j 
    ) const
    -
    - -

    get array value. Overloads the () operator

    -
    Parameters
    - - - -
    iindex in x direction
    jindex in y direction
    -
    -
    - -
    -
    -
    The documentation for this class was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/storage/array2D.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/storage/array2D.cpp
    • -
    -
    - - - - diff --git a/documentation/html/classArray2D.png b/documentation/html/classArray2D.png deleted file mode 100644 index c9e0e4f3fd8ffc5a396c96d152a76113e65387ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 455 zcmV;&0XY7NP)vTJr#LVva2S`&=)l0h|Ns9}lGCUF000SeQchC<|NsC0|NsC0Hv*f~0003} zNkl3lJRwZB0`v_l|O)%RuKKLkI# z@4R;3x?WYa(H)q^WJe8ezX3deUGE#8V4|HV6Qw zbpXH)?E)XiCh{)u$=yTV2L8aRFtC9Eppk(M3;?wZY+wMWW#In;77>}%AtEv<2s88h zGVm{g$$ic~ZG}-<%R9|92X?{C%#|L%y}%LpyLYLFk?&%F-#N!&Jp>l-)xH&=hgi9Wmh0y_zJswp> xK80T>i@<#cRl&^srVMOgX69Nu!6G6X^aayqN|$%m@09=m002ovPDHLkV1h~+$&>&9 diff --git a/documentation/html/classBoundary-members.html b/documentation/html/classBoundary-members.html deleted file mode 100644 index 6b5ee1fb..00000000 --- a/documentation/html/classBoundary-members.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    Boundary Member List
    -
    -
    - -

    This is the complete list of members for Boundary, including all inherited members.

    - - - - - - - -
    Boundary(std::shared_ptr< Mask > mask, std::shared_ptr< Discretization > discretization, Settings settings) (defined in Boundary)Boundary
    doCalculateF(int i, int j) const (defined in Boundary)Boundary
    doCalculateG(int i, int j) const (defined in Boundary)Boundary
    mask_ (defined in Boundary)Boundary
    setPressureBoundaryValues() (defined in Boundary)Boundary
    setVelocityBoundaryValues() (defined in Boundary)Boundary
    - - - - diff --git a/documentation/html/classBoundary.html b/documentation/html/classBoundary.html deleted file mode 100644 index 3bd66f7b..00000000 --- a/documentation/html/classBoundary.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - -NumSim: Boundary Class Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    - -
    Boundary Class Reference
    -
    -
    - - - - - - - - - - - - -

    -Public Member Functions

    Boundary (std::shared_ptr< Mask > mask, std::shared_ptr< Discretization > discretization, Settings settings)
     
    -void setPressureBoundaryValues ()
     
    -void setVelocityBoundaryValues ()
     
    -bool doCalculateF (int i, int j) const
     
    -bool doCalculateG (int i, int j) const
     
    - - - -

    -Public Attributes

    -std::shared_ptr< Maskmask_
     
    -
    The documentation for this class was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/boundary/boundary.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/boundary/boundary.cpp
    • -
    -
    - - - - diff --git a/documentation/html/classCentralDifferences-members.html b/documentation/html/classCentralDifferences-members.html deleted file mode 100644 index 66f6e3a4..00000000 --- a/documentation/html/classCentralDifferences-members.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    CentralDifferences Member List
    -
    -
    - -

    This is the complete list of members for CentralDifferences, including all inherited members.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    CentralDifferences(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)CentralDifferences
    computeD2uDx2(int i, int j) constDiscretizationvirtual
    computeD2uDy2(int i, int j) constDiscretizationvirtual
    computeD2vDx2(int i, int j) constDiscretizationvirtual
    computeD2vDy2(int i, int j) constDiscretizationvirtual
    computeDpDx(int i, int j) constDiscretizationvirtual
    computeDpDy(int i, int j) constDiscretizationvirtual
    computeDu2Dx(int i, int j) const overrideCentralDifferencesvirtual
    computeDuvDx(int i, int j) const overrideCentralDifferencesvirtual
    computeDuvDy(int i, int j) const overrideCentralDifferencesvirtual
    computeDv2Dy(int i, int j) const overrideCentralDifferencesvirtual
    Discretization(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)Discretization
    dx() constStaggeredGrid
    dy() constStaggeredGrid
    f(int i, int j)StaggeredGrid
    f_StaggeredGridprotected
    fIBegin() constStaggeredGrid
    fIEnd() constStaggeredGrid
    fJBegin() constStaggeredGrid
    fJEnd() constStaggeredGrid
    g(int i, int j)StaggeredGrid
    g_StaggeredGridprotected
    gIBegin() constStaggeredGrid
    gIEnd() constStaggeredGrid
    gJBegin() constStaggeredGrid
    gJEnd() constStaggeredGrid
    meshWidth() constStaggeredGrid
    meshWidth_StaggeredGridprotected
    nCells() constStaggeredGrid
    nCells_StaggeredGridprotected
    p() constStaggeredGrid
    p(int i, int j) constStaggeredGrid
    p(int i, int j)StaggeredGrid
    p_StaggeredGridprotected
    pIBegin() constStaggeredGrid
    pIEnd() constStaggeredGrid
    pJBegin() constStaggeredGrid
    pJEnd() constStaggeredGrid
    rhs() constStaggeredGrid
    rhs(int i, int j)StaggeredGrid
    rhs_StaggeredGridprotected
    rhsIBegin() constStaggeredGrid
    rhsIEnd() constStaggeredGrid
    rhsJBegin() constStaggeredGrid
    rhsJEnd() constStaggeredGrid
    StaggeredGrid(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)StaggeredGrid
    u() constStaggeredGrid
    u(int i, int j) constStaggeredGrid
    u(int i, int j)StaggeredGrid
    u_StaggeredGridprotected
    uIBegin() constStaggeredGrid
    uIEnd() constStaggeredGrid
    uJBegin() constStaggeredGrid
    uJEnd() constStaggeredGrid
    v() constStaggeredGrid
    v(int i, int j) constStaggeredGrid
    v(int i, int j)StaggeredGrid
    v_StaggeredGridprotected
    vIBegin() constStaggeredGrid
    vIEnd() constStaggeredGrid
    vJBegin() constStaggeredGrid
    vJEnd() constStaggeredGrid
    - - - - diff --git a/documentation/html/classCentralDifferences.html b/documentation/html/classCentralDifferences.html deleted file mode 100644 index 31a53c1b..00000000 --- a/documentation/html/classCentralDifferences.html +++ /dev/null @@ -1,558 +0,0 @@ - - - - - - - -NumSim: CentralDifferences Class Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    - -
    CentralDifferences Class Reference
    -
    -
    - -

    Discretizes the problem using the central differences scheme. - More...

    - -

    #include <central_differences.h>

    -
    -Inheritance diagram for CentralDifferences:
    -
    -
    - - -Discretization -StaggeredGrid - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

     CentralDifferences (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
     Constructor.
     
    double computeDu2Dx (int i, int j) const override
     Calculate first derivative of u^2 with respect to x with the central differences Scheme.
     
    double computeDv2Dy (int i, int j) const override
     Calculate first derivative of v^2 with respect to y with the central differences Scheme.
     
    double computeDuvDx (int i, int j) const override
     Calculate first derivative of u*v with respect to x with the central differences Scheme.
     
    double computeDuvDy (int i, int j) const override
     Calculate first derivative of u*v with respect to y with the central differences Scheme.
     
    - Public Member Functions inherited from Discretization
     Discretization (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
     Constructor.
     
    -virtual double computeD2uDx2 (int i, int j) const
     Calculate second derivative of u with respect to x.
     
    -virtual double computeD2uDy2 (int i, int j) const
     Calculate second derivative of u with respect to y.
     
    -virtual double computeD2vDx2 (int i, int j) const
     Calculate second derivative of v with respect to x.
     
    -virtual double computeD2vDy2 (int i, int j) const
     Calculate second derivative of v with respect to y.
     
    -virtual double computeDpDx (int i, int j) const
     Calculate first derivative of p with respect to x.
     
    -virtual double computeDpDy (int i, int j) const
     Calculate first derivative of p with respect to y.
     
    - Public Member Functions inherited from StaggeredGrid
     StaggeredGrid (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
     Constructor.
     
    -const std::array< double, 2 > meshWidth () const
     Get the length of a single cell in x and y directions.
     
    -const std::array< int, 2 > nCells () const
     Get number of cells in x and y directions.
     
    -const FieldVariableu () const
     Get a reference to the field variable u.
     
    -const FieldVariablev () const
     Get a reference to the field variable v.
     
    -const FieldVariablep () const
     Get a reference to the field variable p.
     
    -const FieldVariablerhs () const
     Get a reference to the field variable rhs.
     
    -double u (int i, int j) const
     Access value of u in element (i,j), declared constant.
     
    -double & u (int i, int j)
     Access value of u in element (i,j)
     
    -double v (int i, int j) const
     Access value of v in element (i,j), declared constant.
     
    -double & v (int i, int j)
     Access value of v in element (i,j)
     
    -double p (int i, int j) const
     Access value of p in element (i,j), declared constant.
     
    -double & p (int i, int j)
     Access value of p in element (i,j)
     
    -double & f (int i, int j)
     Access value of f in element (i,j)
     
    -double & g (int i, int j)
     Access value of g in element (i,j)
     
    -double & rhs (int i, int j)
     Access value of rhs in element (i,j)
     
    -double dx () const
     Get the mesh width in x-direction.
     
    -double dy () const
     Get the mesh width in y-direction.
     
    -int uIBegin () const
     first valid index for u in x direction
     
    -int uIEnd () const
     one after last valid index for u in x direction
     
    -int uJBegin () const
     first valid index for u in y direction
     
    -int uJEnd () const
     one after last valid index for u in y direction
     
    -int vIBegin () const
     first valid index for v in x direction
     
    -int vIEnd () const
     one after last valid index for v in x direction
     
    -int vJBegin () const
     first valid index for v in y direction
     
    -int vJEnd () const
     one after last valid index for v in y direction
     
    -int pIBegin () const
     first valid index for p in x direction
     
    -int pIEnd () const
     one after last valid index for p in x direction
     
    -int pJBegin () const
     first valid index for p in y direction
     
    -int pJEnd () const
     one after last valid index for p in y direction
     
    -int fIBegin () const
     first valid index for f in x direction
     
    -int fIEnd () const
     one after last valid index for f in x direction
     
    -int fJBegin () const
     first valid index for f in y direction
     
    -int fJEnd () const
     one after last valid index for f in y direction
     
    -int gIBegin () const
     first valid index for g in x direction
     
    -int gIEnd () const
     one after last valid index for g in x direction
     
    -int gJBegin () const
     first valid index for g in y direction
     
    -int gJEnd () const
     one after last valid index for g in y direction
     
    -int rhsIBegin () const
     first valid index for rhs in x direction
     
    -int rhsIEnd () const
     one after last valid index for rhs in x direction
     
    -int rhsJBegin () const
     first valid index for rhs in y direction
     
    -int rhsJEnd () const
     one after last valid index for rhs in y direction
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Additional Inherited Members

    - Protected Attributes inherited from StaggeredGrid
    -const std::array< int, 2 > nCells_
     array containing number of cells in x and y directions
     
    -const std::array< double, 2 > meshWidth_
     array containing the sizes of cell edges in x and y directions
     
    -FieldVariable u_
     instance of the field variable u
     
    -FieldVariable v_
     instance of the field variable v
     
    -FieldVariable p_
     instance of the field variable p
     
    -FieldVariable f_
     instance of the field variable f
     
    -FieldVariable g_
     instance of the field variable g
     
    -FieldVariable rhs_
     instance of the field variable rhs
     
    -

    Detailed Description

    -

    Discretizes the problem using the central differences scheme.

    -

    Implements the first derivatives of u^2, v^2 and u*v according to the central differences scheme

    -

    Constructor & Destructor Documentation

    - -

    ◆ CentralDifferences()

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    CentralDifferences::CentralDifferences (std::array< int, 2 > nCells,
    std::array< double, 2 > meshWidth 
    )
    -
    - -

    Constructor.

    -
    Parameters
    - - - -
    nCellsarray containing number of cells in x and y directions
    meshWidtharray containing the length of a single cell in x and y directions
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ computeDu2Dx()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    double CentralDifferences::computeDu2Dx (int i,
    int j 
    ) const
    -
    -overridevirtual
    -
    - -

    Calculate first derivative of u^2 with respect to x with the central differences Scheme.

    - -

    Implements Discretization.

    - -
    -
    - -

    ◆ computeDuvDx()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    double CentralDifferences::computeDuvDx (int i,
    int j 
    ) const
    -
    -overridevirtual
    -
    - -

    Calculate first derivative of u*v with respect to x with the central differences Scheme.

    - -

    Implements Discretization.

    - -
    -
    - -

    ◆ computeDuvDy()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    double CentralDifferences::computeDuvDy (int i,
    int j 
    ) const
    -
    -overridevirtual
    -
    - -

    Calculate first derivative of u*v with respect to y with the central differences Scheme.

    - -

    Implements Discretization.

    - -
    -
    - -

    ◆ computeDv2Dy()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    double CentralDifferences::computeDv2Dy (int i,
    int j 
    ) const
    -
    -overridevirtual
    -
    - -

    Calculate first derivative of v^2 with respect to y with the central differences Scheme.

    - -

    Implements Discretization.

    - -
    -
    -
    The documentation for this class was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/central_differences.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/central_differences.cpp
    • -
    -
    - - - - diff --git a/documentation/html/classCentralDifferences.png b/documentation/html/classCentralDifferences.png deleted file mode 100644 index 047955ca06d1a3cca14ed0fcc1092b365f8bddea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 799 zcmeAS@N?(olHy`uVBq!ia0vp^666=m0OW&#In(Sb3=B-GJY5_^Dj46+&F(v_z|+$1 z*j4jiIA6|&r_p4s*NQFcj9R5Wu%~VMEq<@s-tmLV&mBG9lOBJKj@e$ftxe^9_I$Z% z&m63MCs(Wd=#ZX1@6yC8{_}U|+t%csooHsJSZ}MSyls9K>&ZtiuUdXOEcxxvu1?GI z!XaHU>L;CS<6r*P-L%@x+dOmaEU!%!zv|9Ko{M?9`$D*I)NjR;PU~x~+GO~ITuTwy zUb^44F0`q5PRhra{reBDJN{_e{80NJW@oP7tA1bSx#_~uc*aRJ{^mRN^SV{;U%vZ! zSyml;_Wyp5PmF(^*L}Zdug~x!gqy+Vg37y1XBhn-t-GQ5Ao5QA^Yq6|2bhiY7<#4` zGA8Wl;bwT88p9x=4-~DC6lXYgdIv*6Fp9UcW470R zj4yor?(oTE#%(XI-QU;uY{nGl#CNyezkSSSZks8*aDG=*`=kE4tNBHttityFD;G|> zt^en*mH3^-+g!6`e+g~hu+nQ;u=(phirc5Yj(J|gd;h_!@7q5Wf6IRR{O*BU=ktp_ zi?@iZ`^g~*)O9TPv!Ql+^Ko%3ETRWbw_)J*S)T}^{v+`+|GLbcAxrB#k - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    Computation Member List
    -
    -
    - -

    This is the complete list of members for Computation, including all inherited members.

    - - - -
    initialize(int argc, char *argv[])Computation
    runSimulation()Computation
    - - - - diff --git a/documentation/html/classComputation.html b/documentation/html/classComputation.html deleted file mode 100644 index df94b70e..00000000 --- a/documentation/html/classComputation.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - -NumSim: Computation Class Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    - -
    Computation Class Reference
    -
    -
    - -

    Computation of Simulation. - More...

    - -

    #include <computation.h>

    - - - - - - - - -

    -Public Member Functions

    void initialize (int argc, char *argv[])
     Initialize the simulation with settings from .txt file.
     
    -void runSimulation ()
     run the whole simulation until t_end
     
    -

    Detailed Description

    -

    Computation of Simulation.

    -

    Combines discretization, pressure solver and outputwriter

    -

    Member Function Documentation

    - -

    ◆ initialize()

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    void Computation::initialize (int argc,
    char * argv[] 
    )
    -
    - -

    Initialize the simulation with settings from .txt file.

    -
    Parameters
    - - - -
    argccounts of CLI commands
    argvvalues of CLI commands, expect settings.txt filename
    -
    -
    - -
    -
    -
    The documentation for this class was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/computation.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/computation.cpp
    • -
    -
    - - - - diff --git a/documentation/html/classDiscretization-members.html b/documentation/html/classDiscretization-members.html deleted file mode 100644 index 6971d969..00000000 --- a/documentation/html/classDiscretization-members.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    Discretization Member List
    -
    -
    - -

    This is the complete list of members for Discretization, including all inherited members.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    computeD2uDx2(int i, int j) constDiscretizationvirtual
    computeD2uDy2(int i, int j) constDiscretizationvirtual
    computeD2vDx2(int i, int j) constDiscretizationvirtual
    computeD2vDy2(int i, int j) constDiscretizationvirtual
    computeDpDx(int i, int j) constDiscretizationvirtual
    computeDpDy(int i, int j) constDiscretizationvirtual
    computeDu2Dx(int i, int j) const =0Discretizationpure virtual
    computeDuvDx(int i, int j) const =0Discretizationpure virtual
    computeDuvDy(int i, int j) const =0Discretizationpure virtual
    computeDv2Dy(int i, int j) const =0Discretizationpure virtual
    Discretization(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)Discretization
    dx() constStaggeredGrid
    dy() constStaggeredGrid
    f(int i, int j)StaggeredGrid
    f_StaggeredGridprotected
    fIBegin() constStaggeredGrid
    fIEnd() constStaggeredGrid
    fJBegin() constStaggeredGrid
    fJEnd() constStaggeredGrid
    g(int i, int j)StaggeredGrid
    g_StaggeredGridprotected
    gIBegin() constStaggeredGrid
    gIEnd() constStaggeredGrid
    gJBegin() constStaggeredGrid
    gJEnd() constStaggeredGrid
    meshWidth() constStaggeredGrid
    meshWidth_StaggeredGridprotected
    nCells() constStaggeredGrid
    nCells_StaggeredGridprotected
    p() constStaggeredGrid
    p(int i, int j) constStaggeredGrid
    p(int i, int j)StaggeredGrid
    p_StaggeredGridprotected
    pIBegin() constStaggeredGrid
    pIEnd() constStaggeredGrid
    pJBegin() constStaggeredGrid
    pJEnd() constStaggeredGrid
    rhs() constStaggeredGrid
    rhs(int i, int j)StaggeredGrid
    rhs_StaggeredGridprotected
    rhsIBegin() constStaggeredGrid
    rhsIEnd() constStaggeredGrid
    rhsJBegin() constStaggeredGrid
    rhsJEnd() constStaggeredGrid
    StaggeredGrid(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)StaggeredGrid
    u() constStaggeredGrid
    u(int i, int j) constStaggeredGrid
    u(int i, int j)StaggeredGrid
    u_StaggeredGridprotected
    uIBegin() constStaggeredGrid
    uIEnd() constStaggeredGrid
    uJBegin() constStaggeredGrid
    uJEnd() constStaggeredGrid
    v() constStaggeredGrid
    v(int i, int j) constStaggeredGrid
    v(int i, int j)StaggeredGrid
    v_StaggeredGridprotected
    vIBegin() constStaggeredGrid
    vIEnd() constStaggeredGrid
    vJBegin() constStaggeredGrid
    vJEnd() constStaggeredGrid
    - - - - diff --git a/documentation/html/classDiscretization.html b/documentation/html/classDiscretization.html deleted file mode 100644 index 8130fcd8..00000000 --- a/documentation/html/classDiscretization.html +++ /dev/null @@ -1,555 +0,0 @@ - - - - - - - -NumSim: Discretization Class Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    - -
    Discretization Class Referenceabstract
    -
    -
    - -

    Computes derivatives included in governing equations. - More...

    - -

    #include <discretization.h>

    -
    -Inheritance diagram for Discretization:
    -
    -
    - - -StaggeredGrid -CentralDifferences -DonorCell - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

     Discretization (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
     Constructor.
     
    virtual double computeDu2Dx (int i, int j) const =0
     Calculate first derivative of u^2 with respect to x.
     
    virtual double computeDv2Dy (int i, int j) const =0
     Calculate first derivative of v^2 with respect to y.
     
    virtual double computeDuvDx (int i, int j) const =0
     Calculate first derivative of u*v with respect to x.
     
    virtual double computeDuvDy (int i, int j) const =0
     Calculate first derivative of u*v with respect to y.
     
    -virtual double computeD2uDx2 (int i, int j) const
     Calculate second derivative of u with respect to x.
     
    -virtual double computeD2uDy2 (int i, int j) const
     Calculate second derivative of u with respect to y.
     
    -virtual double computeD2vDx2 (int i, int j) const
     Calculate second derivative of v with respect to x.
     
    -virtual double computeD2vDy2 (int i, int j) const
     Calculate second derivative of v with respect to y.
     
    -virtual double computeDpDx (int i, int j) const
     Calculate first derivative of p with respect to x.
     
    -virtual double computeDpDy (int i, int j) const
     Calculate first derivative of p with respect to y.
     
    - Public Member Functions inherited from StaggeredGrid
     StaggeredGrid (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
     Constructor.
     
    -const std::array< double, 2 > meshWidth () const
     Get the length of a single cell in x and y directions.
     
    -const std::array< int, 2 > nCells () const
     Get number of cells in x and y directions.
     
    -const FieldVariableu () const
     Get a reference to the field variable u.
     
    -const FieldVariablev () const
     Get a reference to the field variable v.
     
    -const FieldVariablep () const
     Get a reference to the field variable p.
     
    -const FieldVariablerhs () const
     Get a reference to the field variable rhs.
     
    -double u (int i, int j) const
     Access value of u in element (i,j), declared constant.
     
    -double & u (int i, int j)
     Access value of u in element (i,j)
     
    -double v (int i, int j) const
     Access value of v in element (i,j), declared constant.
     
    -double & v (int i, int j)
     Access value of v in element (i,j)
     
    -double p (int i, int j) const
     Access value of p in element (i,j), declared constant.
     
    -double & p (int i, int j)
     Access value of p in element (i,j)
     
    -double & f (int i, int j)
     Access value of f in element (i,j)
     
    -double & g (int i, int j)
     Access value of g in element (i,j)
     
    -double & rhs (int i, int j)
     Access value of rhs in element (i,j)
     
    -double dx () const
     Get the mesh width in x-direction.
     
    -double dy () const
     Get the mesh width in y-direction.
     
    -int uIBegin () const
     first valid index for u in x direction
     
    -int uIEnd () const
     one after last valid index for u in x direction
     
    -int uJBegin () const
     first valid index for u in y direction
     
    -int uJEnd () const
     one after last valid index for u in y direction
     
    -int vIBegin () const
     first valid index for v in x direction
     
    -int vIEnd () const
     one after last valid index for v in x direction
     
    -int vJBegin () const
     first valid index for v in y direction
     
    -int vJEnd () const
     one after last valid index for v in y direction
     
    -int pIBegin () const
     first valid index for p in x direction
     
    -int pIEnd () const
     one after last valid index for p in x direction
     
    -int pJBegin () const
     first valid index for p in y direction
     
    -int pJEnd () const
     one after last valid index for p in y direction
     
    -int fIBegin () const
     first valid index for f in x direction
     
    -int fIEnd () const
     one after last valid index for f in x direction
     
    -int fJBegin () const
     first valid index for f in y direction
     
    -int fJEnd () const
     one after last valid index for f in y direction
     
    -int gIBegin () const
     first valid index for g in x direction
     
    -int gIEnd () const
     one after last valid index for g in x direction
     
    -int gJBegin () const
     first valid index for g in y direction
     
    -int gJEnd () const
     one after last valid index for g in y direction
     
    -int rhsIBegin () const
     first valid index for rhs in x direction
     
    -int rhsIEnd () const
     one after last valid index for rhs in x direction
     
    -int rhsJBegin () const
     first valid index for rhs in y direction
     
    -int rhsJEnd () const
     one after last valid index for rhs in y direction
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Additional Inherited Members

    - Protected Attributes inherited from StaggeredGrid
    -const std::array< int, 2 > nCells_
     array containing number of cells in x and y directions
     
    -const std::array< double, 2 > meshWidth_
     array containing the sizes of cell edges in x and y directions
     
    -FieldVariable u_
     instance of the field variable u
     
    -FieldVariable v_
     instance of the field variable v
     
    -FieldVariable p_
     instance of the field variable p
     
    -FieldVariable f_
     instance of the field variable f
     
    -FieldVariable g_
     instance of the field variable g
     
    -FieldVariable rhs_
     instance of the field variable rhs
     
    -

    Detailed Description

    -

    Computes derivatives included in governing equations.

    -

    Interface for the discretization. Computes the needed derivatives to solve the Poisson and continuity equations.

    -

    Constructor & Destructor Documentation

    - -

    ◆ Discretization()

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    Discretization::Discretization (std::array< int, 2 > nCells,
    std::array< double, 2 > meshWidth 
    )
    -
    - -

    Constructor.

    -
    Parameters
    - - - -
    nCellsarray containing number of cells in x and y directions
    meshWidtharray containing the length of a single cell in x and y directions
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ computeDu2Dx()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    virtual double Discretization::computeDu2Dx (int i,
    int j 
    ) const
    -
    -pure virtual
    -
    - -

    Calculate first derivative of u^2 with respect to x.

    - -

    Implemented in CentralDifferences, and DonorCell.

    - -
    -
    - -

    ◆ computeDuvDx()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    virtual double Discretization::computeDuvDx (int i,
    int j 
    ) const
    -
    -pure virtual
    -
    - -

    Calculate first derivative of u*v with respect to x.

    - -

    Implemented in CentralDifferences, and DonorCell.

    - -
    -
    - -

    ◆ computeDuvDy()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    virtual double Discretization::computeDuvDy (int i,
    int j 
    ) const
    -
    -pure virtual
    -
    - -

    Calculate first derivative of u*v with respect to y.

    - -

    Implemented in CentralDifferences, and DonorCell.

    - -
    -
    - -

    ◆ computeDv2Dy()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    virtual double Discretization::computeDv2Dy (int i,
    int j 
    ) const
    -
    -pure virtual
    -
    - -

    Calculate first derivative of v^2 with respect to y.

    - -

    Implemented in CentralDifferences, and DonorCell.

    - -
    -
    -
    The documentation for this class was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/discretization.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/discretization.cpp
    • -
    -
    - - - - diff --git a/documentation/html/classDiscretization.png b/documentation/html/classDiscretization.png deleted file mode 100644 index d491366f744153de2fc8baf4dd88ade26458eea9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1039 zcmeAS@N?(olHy`uVBq!ia0vp^KY+M{gBeKv)x8GdNC)_Yxc>kDAIN<1=4)yHq2(3^ zngtTm&%8Kr-~doOc+%w+KsnBmAirP+ARi3OnPy*MU|^o*>Eakt!T5IW>!LLZ0&KVY zwYtC8KYD!E@n%XsyNS=KI1Z*uMm_b6c1kS*S_}cx6+Dj?7B*Pz*r6hN_$cG63BvE& z_HUf9k9tg{IPS}k6rbr@2yuf*w**;W4him zzv|1E%2(J|32qm-zwWKB&R5-a{l2g5`F=Yj$a0HG6Nbsj~+<=g)kQr(oj7hvFVjc_)tipn68fNnOcDRaaW*>3IS*0wbYG;$z;A$xB+CPk(rSBR5O7 z{#aDn6qUbcxF6kSR(&a$IlnM;(ii64Kh%^n_ZvN0R#`NC$@EHBo81PU&#b;wy58xT zbuV`Nn`b7+qi(0qncco^X)Q0)<>E{$k^CYnQRd#>wQ{Vc3$K&^DU*(r?kNo>G;QukndW+4TFLpln z2%2`L{Eo|7PuXBL`?}+A9dFFfKVGlAI{*HQKWBa(-LIhMd9=bYX41a?Ztoz+m^;7# rQ2+bP0l+XkKjGpu- diff --git a/documentation/html/classDonorCell-members.html b/documentation/html/classDonorCell-members.html deleted file mode 100644 index 01049bd1..00000000 --- a/documentation/html/classDonorCell-members.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    DonorCell Member List
    -
    -
    - -

    This is the complete list of members for DonorCell, including all inherited members.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    computeD2uDx2(int i, int j) constDiscretizationvirtual
    computeD2uDy2(int i, int j) constDiscretizationvirtual
    computeD2vDx2(int i, int j) constDiscretizationvirtual
    computeD2vDy2(int i, int j) constDiscretizationvirtual
    computeDpDx(int i, int j) constDiscretizationvirtual
    computeDpDy(int i, int j) constDiscretizationvirtual
    computeDu2Dx(int i, int j) const overrideDonorCellvirtual
    computeDuvDx(int i, int j) const overrideDonorCellvirtual
    computeDuvDy(int i, int j) const overrideDonorCellvirtual
    computeDv2Dy(int i, int j) const overrideDonorCellvirtual
    Discretization(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)Discretization
    DonorCell(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth, double alpha)DonorCell
    dx() constStaggeredGrid
    dy() constStaggeredGrid
    f(int i, int j)StaggeredGrid
    f_StaggeredGridprotected
    fIBegin() constStaggeredGrid
    fIEnd() constStaggeredGrid
    fJBegin() constStaggeredGrid
    fJEnd() constStaggeredGrid
    g(int i, int j)StaggeredGrid
    g_StaggeredGridprotected
    gIBegin() constStaggeredGrid
    gIEnd() constStaggeredGrid
    gJBegin() constStaggeredGrid
    gJEnd() constStaggeredGrid
    meshWidth() constStaggeredGrid
    meshWidth_StaggeredGridprotected
    nCells() constStaggeredGrid
    nCells_StaggeredGridprotected
    p() constStaggeredGrid
    p(int i, int j) constStaggeredGrid
    p(int i, int j)StaggeredGrid
    p_StaggeredGridprotected
    pIBegin() constStaggeredGrid
    pIEnd() constStaggeredGrid
    pJBegin() constStaggeredGrid
    pJEnd() constStaggeredGrid
    rhs() constStaggeredGrid
    rhs(int i, int j)StaggeredGrid
    rhs_StaggeredGridprotected
    rhsIBegin() constStaggeredGrid
    rhsIEnd() constStaggeredGrid
    rhsJBegin() constStaggeredGrid
    rhsJEnd() constStaggeredGrid
    StaggeredGrid(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)StaggeredGrid
    u() constStaggeredGrid
    u(int i, int j) constStaggeredGrid
    u(int i, int j)StaggeredGrid
    u_StaggeredGridprotected
    uIBegin() constStaggeredGrid
    uIEnd() constStaggeredGrid
    uJBegin() constStaggeredGrid
    uJEnd() constStaggeredGrid
    v() constStaggeredGrid
    v(int i, int j) constStaggeredGrid
    v(int i, int j)StaggeredGrid
    v_StaggeredGridprotected
    vIBegin() constStaggeredGrid
    vIEnd() constStaggeredGrid
    vJBegin() constStaggeredGrid
    vJEnd() constStaggeredGrid
    - - - - diff --git a/documentation/html/classDonorCell.html b/documentation/html/classDonorCell.html deleted file mode 100644 index 7e6db599..00000000 --- a/documentation/html/classDonorCell.html +++ /dev/null @@ -1,565 +0,0 @@ - - - - - - - -NumSim: DonorCell Class Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    - -
    DonorCell Class Reference
    -
    -
    - -

    Discretizes the problem using the donor cell scheme. - More...

    - -

    #include <donor_cell.h>

    -
    -Inheritance diagram for DonorCell:
    -
    -
    - - -Discretization -StaggeredGrid - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

     DonorCell (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth, double alpha)
     Constructor.
     
    double computeDu2Dx (int i, int j) const override
     Calculate first derivative of u^2 with respect to x with the donor cell Scheme.
     
    double computeDv2Dy (int i, int j) const override
     Calculate first derivative of v^2 with respect to y with the donor cell Scheme.
     
    double computeDuvDx (int i, int j) const override
     Calculate first derivative of u*v with respect to x with the donor cell Scheme.
     
    double computeDuvDy (int i, int j) const override
     Calculate first derivative of u*v with respect to y with the donor cell Scheme.
     
    - Public Member Functions inherited from Discretization
     Discretization (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
     Constructor.
     
    -virtual double computeD2uDx2 (int i, int j) const
     Calculate second derivative of u with respect to x.
     
    -virtual double computeD2uDy2 (int i, int j) const
     Calculate second derivative of u with respect to y.
     
    -virtual double computeD2vDx2 (int i, int j) const
     Calculate second derivative of v with respect to x.
     
    -virtual double computeD2vDy2 (int i, int j) const
     Calculate second derivative of v with respect to y.
     
    -virtual double computeDpDx (int i, int j) const
     Calculate first derivative of p with respect to x.
     
    -virtual double computeDpDy (int i, int j) const
     Calculate first derivative of p with respect to y.
     
    - Public Member Functions inherited from StaggeredGrid
     StaggeredGrid (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
     Constructor.
     
    -const std::array< double, 2 > meshWidth () const
     Get the length of a single cell in x and y directions.
     
    -const std::array< int, 2 > nCells () const
     Get number of cells in x and y directions.
     
    -const FieldVariableu () const
     Get a reference to the field variable u.
     
    -const FieldVariablev () const
     Get a reference to the field variable v.
     
    -const FieldVariablep () const
     Get a reference to the field variable p.
     
    -const FieldVariablerhs () const
     Get a reference to the field variable rhs.
     
    -double u (int i, int j) const
     Access value of u in element (i,j), declared constant.
     
    -double & u (int i, int j)
     Access value of u in element (i,j)
     
    -double v (int i, int j) const
     Access value of v in element (i,j), declared constant.
     
    -double & v (int i, int j)
     Access value of v in element (i,j)
     
    -double p (int i, int j) const
     Access value of p in element (i,j), declared constant.
     
    -double & p (int i, int j)
     Access value of p in element (i,j)
     
    -double & f (int i, int j)
     Access value of f in element (i,j)
     
    -double & g (int i, int j)
     Access value of g in element (i,j)
     
    -double & rhs (int i, int j)
     Access value of rhs in element (i,j)
     
    -double dx () const
     Get the mesh width in x-direction.
     
    -double dy () const
     Get the mesh width in y-direction.
     
    -int uIBegin () const
     first valid index for u in x direction
     
    -int uIEnd () const
     one after last valid index for u in x direction
     
    -int uJBegin () const
     first valid index for u in y direction
     
    -int uJEnd () const
     one after last valid index for u in y direction
     
    -int vIBegin () const
     first valid index for v in x direction
     
    -int vIEnd () const
     one after last valid index for v in x direction
     
    -int vJBegin () const
     first valid index for v in y direction
     
    -int vJEnd () const
     one after last valid index for v in y direction
     
    -int pIBegin () const
     first valid index for p in x direction
     
    -int pIEnd () const
     one after last valid index for p in x direction
     
    -int pJBegin () const
     first valid index for p in y direction
     
    -int pJEnd () const
     one after last valid index for p in y direction
     
    -int fIBegin () const
     first valid index for f in x direction
     
    -int fIEnd () const
     one after last valid index for f in x direction
     
    -int fJBegin () const
     first valid index for f in y direction
     
    -int fJEnd () const
     one after last valid index for f in y direction
     
    -int gIBegin () const
     first valid index for g in x direction
     
    -int gIEnd () const
     one after last valid index for g in x direction
     
    -int gJBegin () const
     first valid index for g in y direction
     
    -int gJEnd () const
     one after last valid index for g in y direction
     
    -int rhsIBegin () const
     first valid index for rhs in x direction
     
    -int rhsIEnd () const
     one after last valid index for rhs in x direction
     
    -int rhsJBegin () const
     first valid index for rhs in y direction
     
    -int rhsJEnd () const
     one after last valid index for rhs in y direction
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Additional Inherited Members

    - Protected Attributes inherited from StaggeredGrid
    -const std::array< int, 2 > nCells_
     array containing number of cells in x and y directions
     
    -const std::array< double, 2 > meshWidth_
     array containing the sizes of cell edges in x and y directions
     
    -FieldVariable u_
     instance of the field variable u
     
    -FieldVariable v_
     instance of the field variable v
     
    -FieldVariable p_
     instance of the field variable p
     
    -FieldVariable f_
     instance of the field variable f
     
    -FieldVariable g_
     instance of the field variable g
     
    -FieldVariable rhs_
     instance of the field variable rhs
     
    -

    Detailed Description

    -

    Discretizes the problem using the donor cell scheme.

    -

    Implements the first derivatives of u^2, v^2 and u*v according to the donor cell scheme

    -

    Constructor & Destructor Documentation

    - -

    ◆ DonorCell()

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    DonorCell::DonorCell (std::array< int, 2 > nCells,
    std::array< double, 2 > meshWidth,
    double alpha 
    )
    -
    - -

    Constructor.

    -
    Parameters
    - - - - -
    nCellsarray containing number of cells in x and y directions
    meshWidtharray containing the length of a single cell in x and y directions
    alphaweight factor between central differences and donor cell schemes
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ computeDu2Dx()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    double DonorCell::computeDu2Dx (int i,
    int j 
    ) const
    -
    -overridevirtual
    -
    - -

    Calculate first derivative of u^2 with respect to x with the donor cell Scheme.

    - -

    Implements Discretization.

    - -
    -
    - -

    ◆ computeDuvDx()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    double DonorCell::computeDuvDx (int i,
    int j 
    ) const
    -
    -overridevirtual
    -
    - -

    Calculate first derivative of u*v with respect to x with the donor cell Scheme.

    - -

    Implements Discretization.

    - -
    -
    - -

    ◆ computeDuvDy()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    double DonorCell::computeDuvDy (int i,
    int j 
    ) const
    -
    -overridevirtual
    -
    - -

    Calculate first derivative of u*v with respect to y with the donor cell Scheme.

    - -

    Implements Discretization.

    - -
    -
    - -

    ◆ computeDv2Dy()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    double DonorCell::computeDv2Dy (int i,
    int j 
    ) const
    -
    -overridevirtual
    -
    - -

    Calculate first derivative of v^2 with respect to y with the donor cell Scheme.

    - -

    Implements Discretization.

    - -
    -
    -
    The documentation for this class was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/donor_cell.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/donor_cell.cpp
    • -
    -
    - - - - diff --git a/documentation/html/classDonorCell.png b/documentation/html/classDonorCell.png deleted file mode 100644 index 20dde334a1660559f4a7d4aaf585c66f6d93b870..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 690 zcmeAS@N?(olHy`uVBq!ia0vp^aX{R`!3-oLv)AMSDd_;85ZC|z{{xvX-h3_XKeXJ! zK(jz%`k5C84jcfA2T!`Z0w~8>666=m0OW&#In(Sb3=B-Ro-U3d6^w7^zAaj9z{A?# zpDwZYzi|8k`4b5jCxz{tymFF`*|t45oZjX?nX_5`gvv|T7oL|M2l0_U;YyMK53usUYl=g?wbecM+b*(UzT-_vAtqI?uw@i0sdaq~nD(smb zzxLc;g}`1n^V+psdqd6%)?8g39{*b_;akM(tA5+>1{uuzkp3(39ec0Uh0>a+?^_ML z&a5d4*&pW7dwqTVtm;WJ68}9sK1rJY%2xCIBw4=uy=KKtx&IS9FFktv)$;ipHU^tS zMh5$uucsfq`hInNng9OH{|;-be_==vtYR?Wuw{^Fkz?R-;%8u6$j;Dwfw|$}{Y%f0 zyw>|`OYJv4PpLJ<&tIOr5b}TOtr`0xi!N^8d!=~GEqlBAc;v5t zug|agJFoL|z;4N)(#7G&-}PHQyK-fP{HD_Ra~$J^j3mBXF#a1LkkxDEGr4&EeBGUD z&rjTC-n;I1@Kc$oh3n?*4JmmVQ8npLs+0dDwuS1R%=NYBEO#?9_(w1t;E(^iX~(bH zudDA~e!u4bhf|!k3=wE$(N>gPdi-=w2s+b9b>7awBPxKs|$~lzEaYI_5PZw=KmP;B$HTk Tq?ZW;Qx}7$tDnm{r-UW|1!Yj+ diff --git a/documentation/html/classFieldVariable-members.html b/documentation/html/classFieldVariable-members.html deleted file mode 100644 index a9dcfae0..00000000 --- a/documentation/html/classFieldVariable-members.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    FieldVariable Member List
    -
    -
    - -

    This is the complete list of members for FieldVariable, including all inherited members.

    - - - - - - - - - - -
    Array2D(std::array< int, 2 > size)Array2D
    data_Array2Dprotected
    FieldVariable(std::array< int, 2 > size, std::array< double, 2 > origin, std::array< double, 2 > meshWidth)FieldVariable
    findAbsMax() constFieldVariable
    interpolateAt(double x, double y) constFieldVariable
    operator()(int i, int j)Array2D
    operator()(int i, int j) constArray2D
    size() constArray2D
    size_Array2Dprotected
    - - - - diff --git a/documentation/html/classFieldVariable.html b/documentation/html/classFieldVariable.html deleted file mode 100644 index d0847d24..00000000 --- a/documentation/html/classFieldVariable.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - -NumSim: FieldVariable Class Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    - -
    FieldVariable Class Reference
    -
    -
    - -

    Discretization of a scalar function. - More...

    - -

    #include <field_variable.h>

    -
    -Inheritance diagram for FieldVariable:
    -
    -
    - - -Array2D - -
    - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

     FieldVariable (std::array< int, 2 > size, std::array< double, 2 > origin, std::array< double, 2 > meshWidth)
     Constructor.
     
    double interpolateAt (double x, double y) const
     Interpolates value of field variable in domain using x and y coordinates.
     
    double findAbsMax () const
     Find point in Array2D of Fieldvariable with maximum value.
     
    - Public Member Functions inherited from Array2D
     Array2D (std::array< int, 2 > size)
     constructor.
     
    double & operator() (int i, int j)
     set array value. Overloads the () operator
     
    double operator() (int i, int j) const
     get array value. Overloads the () operator
     
    -std::array< int, 2 > size () const
     get size of array in x and y direction
     
    - - - - - - - - -

    -Additional Inherited Members

    - Protected Attributes inherited from Array2D
    -const std::array< int, 2 > size_
     size of array in x and y direction
     
    -std::vector< double > data_
     storage array values, in row-major order
     
    -

    Detailed Description

    -

    Discretization of a scalar function.

    -

    A field variable is the discretization of a scalar function f(x) with x in the computational domain. More specifically, a scalar value is stored at discrete nodes/points. The nodes are arranged in an equidistant mesh with specified mesh width.

    -

    Constructor & Destructor Documentation

    - -

    ◆ FieldVariable()

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - -
    FieldVariable::FieldVariable (std::array< int, 2 > size,
    std::array< double, 2 > origin,
    std::array< double, 2 > meshWidth 
    )
    -
    - -

    Constructor.

    -
    Parameters
    - - - - -
    sizenumber of cells in x and y direction
    originorgin of Fieldvariable relative to domain origin
    meshwidthmesh width in x and y direction
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ findAbsMax()

    - -
    -
    - - - - - - - -
    double FieldVariable::findAbsMax () const
    -
    - -

    Find point in Array2D of Fieldvariable with maximum value.

    -

    Finds maximum by iterating through all values in FielVariable

    - -
    -
    - -

    ◆ interpolateAt()

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    double FieldVariable::interpolateAt (double x,
    double y 
    ) const
    -
    - -

    Interpolates value of field variable in domain using x and y coordinates.

    -

    Interpolates by using bilinear interpolation.

    -
    Parameters
    - - - -
    xx postion of point to interpolate
    yy postion of point to interpolate
    -
    -
    - -
    -
    -
    The documentation for this class was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/storage/field_variable.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/storage/field_variable.cpp
    • -
    -
    - - - - diff --git a/documentation/html/classFieldVariable.png b/documentation/html/classFieldVariable.png deleted file mode 100644 index 39c18d0f1b691be9faa9372616fc41ecf7fc3d45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 454 zcmV;%0XhDOP)vTJr#LVva2S`&=)l0h|Ns9}lGCUF000SeQchC<|NsC0|NsC0Hv*f~0003| zNkl`s*4$)%wb>B7(iI9gc13fh$(Z#%W@grP^X7aT{E)j0e#-T~%?}5M z5Q2dK;ITFUu#gpa+l2w3u5@+C7jHTzR6pn?SjsnhE`AZ^l zQdvGyx{0&L3b?QMe6QwTRa}m-T5$N>xKwT%a9*ES(bZDG!w%FPE_vKGh60{@JnM>@ wo+jERh@VMUh={yX4tB7JNH0q;5s`tu0C3Dm#*)<23jhEB07*qoM6N<$g7tvVw*UYD diff --git a/documentation/html/classFluidTracer-members.html b/documentation/html/classFluidTracer-members.html deleted file mode 100644 index d7949e5c..00000000 --- a/documentation/html/classFluidTracer-members.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    FluidTracer Member List
    -
    -
    - -

    This is the complete list of members for FluidTracer, including all inherited members.

    - - - - - - - - - - - - -
    cellOfParticle(int i) (defined in FluidTracer)FluidTracer
    createParticles(double positionSourceX, double positionSourceY)FluidTracer
    FluidTracer(int numParticlesperCell, std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask) (defined in FluidTracer)FluidTracer
    FluidTracer(std::vector< double > x, std::vector< double > y, std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask) (defined in FluidTracer)FluidTracer
    getNumberOfParticles() constFluidTracer
    getParticlePosition(int i) constFluidTracer
    moveParticles(double dt)FluidTracer
    moveParticles(double dt, std::array< double, 2 > vel) (defined in FluidTracer)FluidTracer
    updateParticle(int i, std::array< int, 2 > idx, double dt, std::array< double, 2 > vel, int depth) (defined in FluidTracer)FluidTracer
    val2CellX(double xVal) (defined in FluidTracer)FluidTracer
    val2CellY(double yVal) (defined in FluidTracer)FluidTracer
    - - - - diff --git a/documentation/html/classFluidTracer.html b/documentation/html/classFluidTracer.html deleted file mode 100644 index 619e2467..00000000 --- a/documentation/html/classFluidTracer.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - - -NumSim: FluidTracer Class Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    - -
    FluidTracer Class Reference
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

    FluidTracer (int numParticlesperCell, std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask)
     
    FluidTracer (std::vector< double > x, std::vector< double > y, std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask)
     
    void moveParticles (double dt)
     Update the position of the particles according to the velocity field and sets mask accordingly.
     
    void createParticles (double positionSourceX, double positionSourceY)
     can be used to create a source cell for particles
     
    int getNumberOfParticles () const
     Get the Number Of Particles object.
     
    std::array< double, 2 > getParticlePosition (int i) const
     Get the Particle Position, index starts at 0.
     
    -std::array< int, 2 > cellOfParticle (int i)
     
    -int val2CellX (double xVal)
     
    -int val2CellY (double yVal)
     
    -std::array< double, 2 > updateParticle (int i, std::array< int, 2 > idx, double dt, std::array< double, 2 > vel, int depth)
     
    -std::array< double, 2 > moveParticles (double dt, std::array< double, 2 > vel)
     
    -

    Member Function Documentation

    - -

    ◆ createParticles()

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    void FluidTracer::createParticles (double positionSourceX,
    double positionSourceY 
    )
    -
    - -

    can be used to create a source cell for particles

    -

    fills the cell homogenously with particles by cell

    - -
    -
    - -

    ◆ getNumberOfParticles()

    - -
    -
    - - - - - - - -
    int FluidTracer::getNumberOfParticles () const
    -
    - -

    Get the Number Of Particles object.

    -
    Returns
    int
    - -
    -
    - -

    ◆ getParticlePosition()

    - -
    -
    - - - - - - - - -
    std::array< double, 2 > FluidTracer::getParticlePosition (int i) const
    -
    - -

    Get the Particle Position, index starts at 0.

    -
    Parameters
    - - -
    i
    -
    -
    -
    Returns
    std::array<double, 2>
    - -
    -
    - -

    ◆ moveParticles()

    - -
    -
    - - - - - - - - -
    void FluidTracer::moveParticles (double dt)
    -
    - -

    Update the position of the particles according to the velocity field and sets mask accordingly.

    -

    get the velocity field $u$ and $v$ Checks for collision with border or obstacle and reflects the particle at this position Update the mask where there are new Air or Fluid cells

    -
    Parameters
    - - -
    dt
    -
    -
    - -
    -
    -
    The documentation for this class was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/surface/fluid_tracer.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/surface/fluid_tracer.cpp
    • -
    -
    - - - - diff --git a/documentation/html/classGaussSeidel-members.html b/documentation/html/classGaussSeidel-members.html deleted file mode 100644 index ece7c0c4..00000000 --- a/documentation/html/classGaussSeidel-members.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    GaussSeidel Member List
    -
    -
    - -

    This is the complete list of members for GaussSeidel, including all inherited members.

    - - - - - - - - - - - - - - - - -
    boundary_PressureSolverprotected
    calculateResiduum()PressureSolverprotected
    discretization_PressureSolverprotected
    dx2 (defined in PressureSolver)PressureSolver
    dy2PressureSolver
    epsilon_PressureSolverprotected
    GaussSeidel(const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)GaussSeidel
    i_begPressureSolverprotected
    i_endPressureSolverprotected
    j_begPressureSolverprotected
    j_endPressureSolverprotected
    maximumNumberOfIterations_PressureSolverprotected
    PressureSolver(std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)PressureSolver
    setBoundaryValues()PressureSolverprotected
    solve() overrideGaussSeidelvirtual
    - - - - diff --git a/documentation/html/classGaussSeidel.html b/documentation/html/classGaussSeidel.html deleted file mode 100644 index 1f8d0ed0..00000000 --- a/documentation/html/classGaussSeidel.html +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - - -NumSim: GaussSeidel Class Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    - -
    GaussSeidel Class Reference
    -
    -
    - -

    Standard Gauss-Seidel solver. - More...

    - -

    #include <gauss_seidel.h>

    -
    -Inheritance diagram for GaussSeidel:
    -
    -
    - - -PressureSolver - -
    - - - - - - - - - - - - -

    -Public Member Functions

     GaussSeidel (const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
     Constructor.
     
    void solve () override
     override function that starts solver.
     
    - Public Member Functions inherited from PressureSolver
     PressureSolver (std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
     Constructor.
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Additional Inherited Members

    - Public Attributes inherited from PressureSolver
    -double dx2
     
    -double dy2
     squared mesh widths
     
    - Protected Member Functions inherited from PressureSolver
    void setBoundaryValues ()
     Set the Boundary Values.
     
    -double calculateResiduum ()
     calculate residuum of current time step
     
    - Protected Attributes inherited from PressureSolver
    -int i_beg
     begin of loop for rhs in x direction
     
    -int i_end
     end of loop for rhs in x direction
     
    -int j_beg
     begin of loop for rhs in y direction
     
    -int j_end
     end of loop for rhs in y direction
     
    -std::shared_ptr< Discretizationdiscretization_
     object holding the needed field variables for rhs and p
     
    -std::shared_ptr< Boundaryboundary_
     object managing boundary for obstacle and surface tension
     
    -double epsilon_
     tolerance for the solver
     
    -int maximumNumberOfIterations_
     maximum number of iterations
     
    -

    Detailed Description

    -

    Standard Gauss-Seidel solver.

    -

    Constructor & Destructor Documentation

    - -

    ◆ GaussSeidel()

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    GaussSeidel::GaussSeidel (const std::shared_ptr< Discretization > & data,
    double epsilon,
    int maximumNumberOfIterations,
    std::shared_ptr< Boundaryboundary 
    )
    -
    - -

    Constructor.

    -
    Parameters
    - - - - -
    datainstance of Discretization holding the needed field variables for rhs and p
    epsilontolerance for the solver
    maximumNumberOfIterationsmaximum of iteration
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ solve()

    - -
    -
    - - - - - -
    - - - - - - - -
    void GaussSeidel::solve ()
    -
    -overridevirtual
    -
    - -

    override function that starts solver.

    - -

    Implements PressureSolver.

    - -
    -
    -
    The documentation for this class was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/gauss_seidel.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/gauss_seidel.cpp
    • -
    -
    - - - - diff --git a/documentation/html/classGaussSeidel.png b/documentation/html/classGaussSeidel.png deleted file mode 100644 index 9e4343d96a3cf9222d8ea21fcd5152dba5a1bd44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 502 zcmVvTJr#LVva2S`&=)l0h|Ns9}lGCUF000SeQchC<|NsC0|NsC0Hv*f~0004j zNklO-DKSIBE0NqV`EGZ5RZImPB$Ri?|T<*}G@V73e()of%t{B+KtcYE*n zOq#Uo8l>^4ev<>puv~RFxdNkd^-bcJ?!sR~+-bV(^7Ov(BgD1BbBK|CIM4vn_Rl-W zpu4tf2`tm)-gk6!yz9SK6P^@Aim zSMSJQ>l+_EfZSiaq>LSBAdUB)ZqZ}u{n0xt-@5ttkZiBFGBVIjbzVtzj3K4uKCsz? zha9}`cal*xuq{{N7stMO4GBW}?EFlV@nH+W?&=F%)2(?QkLygi9w)M&%p=;DYyX}6 sxVt3jm$e|06xM=BQdn0(%*-b13+#APiE!I&tN;K207*qoM6N<$f|&&HtN;K2 diff --git a/documentation/html/classMask-members.html b/documentation/html/classMask-members.html deleted file mode 100644 index 14541cdb..00000000 --- a/documentation/html/classMask-members.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    Mask Member List
    -
    -
    - -

    This is the complete list of members for Mask, including all inherited members.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    AIR enum value (defined in Mask)Mask
    boundary_listMaskprotected
    CellType enum name (defined in Mask)Mask
    createMaskFromPNGBitMap() (defined in Mask)Mask
    data_Maskprotected
    DOMAIN_BOTTOM_NOSLIP enum value (defined in Mask)Mask
    DOMAIN_BOTTOM_PRESSURE enum value (defined in Mask)Mask
    DOMAIN_BOUNDARY enum value (defined in Mask)Mask
    DOMAIN_LEFT_NOSLIP enum value (defined in Mask)Mask
    DOMAIN_LEFT_PRESSURE enum value (defined in Mask)Mask
    DOMAIN_RIGHT_NOSLIP enum value (defined in Mask)Mask
    DOMAIN_RIGHT_PRESSURE enum value (defined in Mask)Mask
    DOMAIN_TOP_NOSLIP enum value (defined in Mask)Mask
    DOMAIN_TOP_PRESSURE enum value (defined in Mask)Mask
    FLUID enum value (defined in Mask)Mask
    FLUID_BORDER_BOTTOM enum value (defined in Mask)Mask
    FLUID_BORDER_LEFT enum value (defined in Mask)Mask
    FLUID_BORDER_RIGHT enum value (defined in Mask)Mask
    FLUID_BORDER_TOP enum value (defined in Mask)Mask
    FLUID_COLUMN_HORIZONTAL enum value (defined in Mask)Mask
    FLUID_COLUMN_VERTICAL enum value (defined in Mask)Mask
    FLUID_CORNER_BOTTOM_LEFT enum value (defined in Mask)Mask
    FLUID_CORNER_BOTTOM_RIGHT enum value (defined in Mask)Mask
    FLUID_CORNER_TOP_LEFT enum value (defined in Mask)Mask
    FLUID_CORNER_TOP_RIGHT enum value (defined in Mask)Mask
    FLUID_DROPLET enum value (defined in Mask)Mask
    FLUID_SINGLE_BOTTOM enum value (defined in Mask)Mask
    FLUID_SINGLE_LEFT enum value (defined in Mask)Mask
    FLUID_SINGLE_RIGHT enum value (defined in Mask)Mask
    FLUID_SINGLE_TOP enum value (defined in Mask)Mask
    FLUID_TYPE enum value (defined in Mask)Mask
    forbiddenObstacleFluidCombinations (defined in Mask)Maskprotected
    getNumberOfFluidCells() constMask
    isAir(int i, int j) constMask
    isDomainBoundary(int i, int j) const (defined in Mask)Mask
    isFluid(int i, int j) constMask
    isFluidBoundary(int i, int j) const (defined in Mask)Mask
    isInnerFluid(int i, int j) const (defined in Mask)Mask
    isObstacle(int i, int j) constMask
    isObstacleBoundary(int i, int j) const (defined in Mask)Mask
    makeRectangularObstacle() (defined in Mask)Mask
    Mask(Settings settings)Mask
    OBSTACLE enum value (defined in Mask)Mask
    OBSTACLE_BORDER_BOTTOM enum value (defined in Mask)Mask
    OBSTACLE_BORDER_LEFT enum value (defined in Mask)Mask
    OBSTACLE_BORDER_RIGHT enum value (defined in Mask)Mask
    OBSTACLE_BORDER_TOP enum value (defined in Mask)Mask
    OBSTACLE_CORNER_BOTTOM_LEFT enum value (defined in Mask)Mask
    OBSTACLE_CORNER_BOTTOM_RIGHT enum value (defined in Mask)Mask
    OBSTACLE_CORNER_TOP_LEFT enum value (defined in Mask)Mask
    OBSTACLE_CORNER_TOP_RIGHT enum value (defined in Mask)Mask
    OBSTACLE_INSIDE enum value (defined in Mask)Mask
    operator()(int i, int j)Mask
    operator()(int i, int j) constMask
    printMask() const (defined in Mask)Mask
    resetMask()Mask
    setDomainBC() (defined in Mask)Mask
    setFluidBC() (defined in Mask)Mask
    setObstacleBC() (defined in Mask)Mask
    settings_ (defined in Mask)Maskprotected
    size() constMask
    size_Maskprotected
    - - - - diff --git a/documentation/html/classMask.html b/documentation/html/classMask.html deleted file mode 100644 index e946a812..00000000 --- a/documentation/html/classMask.html +++ /dev/null @@ -1,464 +0,0 @@ - - - - - - - -NumSim: Mask Class Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    - - - - -

    -Public Types

    enum  CellType {
    -  FLUID_DROPLET = 0 -, FLUID_SINGLE_LEFT = 1 -, FLUID_SINGLE_TOP = 2 -, FLUID_SINGLE_RIGHT = 4 -,
    -  FLUID_SINGLE_BOTTOM = 8 -, FLUID_CORNER_BOTTOM_LEFT = 6 -, FLUID_CORNER_TOP_LEFT = 12 -, FLUID_CORNER_TOP_RIGHT = 9 -,
    -  FLUID_CORNER_BOTTOM_RIGHT = 3 -, FLUID_COLUMN_HORIZONTAL = 5 -, FLUID_COLUMN_VERTICAL = 10 -, FLUID_BORDER_LEFT = 14 -,
    -  FLUID_BORDER_TOP = 13 -, FLUID_BORDER_RIGHT = 11 -, FLUID_BORDER_BOTTOM = 7 -, FLUID = 15 -,
    -  FLUID_TYPE = 50 -, AIR = 64 -, OBSTACLE = 99 -, OBSTACLE_INSIDE = 100 -,
    -  OBSTACLE_BORDER_LEFT = 101 -, OBSTACLE_BORDER_TOP = 102 -, OBSTACLE_CORNER_TOP_LEFT = 103 -, OBSTACLE_BORDER_RIGHT = 104 -,
    -  OBSTACLE_CORNER_TOP_RIGHT = 106 -, OBSTACLE_BORDER_BOTTOM = 108 -, OBSTACLE_CORNER_BOTTOM_LEFT = 109 -, OBSTACLE_CORNER_BOTTOM_RIGHT = 112 -,
    -  DOMAIN_BOUNDARY = 200 -, DOMAIN_LEFT_NOSLIP = 201 -, DOMAIN_TOP_NOSLIP = 202 -, DOMAIN_RIGHT_NOSLIP = 203 -,
    -  DOMAIN_BOTTOM_NOSLIP = 204 -, DOMAIN_LEFT_PRESSURE = 205 -, DOMAIN_TOP_PRESSURE = 206 -, DOMAIN_RIGHT_PRESSURE = 207 -,
    -  DOMAIN_BOTTOM_PRESSURE = 208 -
    - }
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

     Mask (Settings settings)
     constructor.
     
    int & operator() (int i, int j)
     set array value. Overloads the () operator
     
    int operator() (int i, int j) const
     get array value. Overloads the () operator
     
    -std::array< int, 2 > size () const
     get size of array in x and y direction
     
    -void resetMask ()
     sets all not obstacle cells to air
     
    bool isFluid (int i, int j) const
     Cell at (i,j) is fluid or not.
     
    bool isObstacle (int i, int j) const
     True if Cell at (i,j) is either obstacle or boundary.
     
    bool isAir (int i, int j) const
     Cell at (i,j) is a air cell or not.
     
    -bool isInnerFluid (int i, int j) const
     
    -bool isDomainBoundary (int i, int j) const
     
    -bool isObstacleBoundary (int i, int j) const
     
    -bool isFluidBoundary (int i, int j) const
     
    int getNumberOfFluidCells () const
     number of fluid cells
     
    -void makeRectangularObstacle ()
     
    -void createMaskFromPNGBitMap ()
     
    -void setDomainBC ()
     
    -void setObstacleBC ()
     
    -void setFluidBC ()
     
    -void printMask () const
     
    - - - - - - - - - - - - - - -

    -Protected Attributes

    -std::array< int, 2 > size_
     size of array in x and y direction
     
    -std::vector< int > data_
     storage array values, in row-major order
     
    -std::vector< int > boundary_list
     stores the indices of the boundary cells
     
    -Settings settings_
     
    -int forbiddenObstacleFluidCombinations [7] = {105,107,110,111,113,114,115}
     
    -

    Constructor & Destructor Documentation

    - -

    ◆ Mask()

    - -
    -
    - - - - - - - - -
    Mask::Mask (Settings settings)
    -
    - -

    constructor.

    -
    Parameters
    - - -
    sizesize of array in x and y direction
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ getNumberOfFluidCells()

    - -
    -
    - - - - - - - -
    int Mask::getNumberOfFluidCells () const
    -
    - -

    number of fluid cells

    -

    not efficient but is only used once in the creation of the fluid tracer

    - -
    -
    - -

    ◆ isAir()

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    bool Mask::isAir (int i,
    int j 
    ) const
    -
    - -

    Cell at (i,j) is a air cell or not.

    -
    Parameters
    - - - -
    iindex in x direction
    jindex in y direction
    -
    -
    -

    If i and j are out of bond returns false

    - -
    -
    - -

    ◆ isFluid()

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    bool Mask::isFluid (int i,
    int j 
    ) const
    -
    - -

    Cell at (i,j) is fluid or not.

    -
    Parameters
    - - - -
    iindex in x direction
    jindex in y direction
    -
    -
    -

    If i and j are out of bond returns false

    - -
    -
    - -

    ◆ isObstacle()

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    bool Mask::isObstacle (int i,
    int j 
    ) const
    -
    - -

    True if Cell at (i,j) is either obstacle or boundary.

    -
    Parameters
    - - - -
    iindex in x direction
    jindex in y direction
    -
    -
    - -
    -
    - -

    ◆ operator()() [1/2]

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    int & Mask::operator() (int i,
    int j 
    )
    -
    - -

    set array value. Overloads the () operator

    -
    Parameters
    - - - -
    iindex in x direction
    jindex in y direction
    -
    -
    - -
    -
    - -

    ◆ operator()() [2/2]

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    int Mask::operator() (int i,
    int j 
    ) const
    -
    - -

    get array value. Overloads the () operator

    -
    Parameters
    - - - -
    iindex in x direction
    jindex in y direction
    -
    -
    - -
    -
    -
    The documentation for this class was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/boundary/mask.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/boundary/mask.cpp
    • -
    -
    - - - - diff --git a/documentation/html/classOutputWriter-members.html b/documentation/html/classOutputWriter-members.html deleted file mode 100644 index a07d193b..00000000 --- a/documentation/html/classOutputWriter-members.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    OutputWriter Member List
    -
    -
    - -

    This is the complete list of members for OutputWriter, including all inherited members.

    - - - - - -
    discretization_OutputWriterprotected
    fileNo_OutputWriterprotected
    OutputWriter(std::shared_ptr< Discretization > discretization)OutputWriter
    writeFile(double currentTime)=0OutputWriterpure virtual
    - - - - diff --git a/documentation/html/classOutputWriter.html b/documentation/html/classOutputWriter.html deleted file mode 100644 index 7bb4f4f6..00000000 --- a/documentation/html/classOutputWriter.html +++ /dev/null @@ -1,194 +0,0 @@ - - - - - - - -NumSim: OutputWriter Class Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    - -
    OutputWriter Class Referenceabstract
    -
    -
    - -

    Inteface class for writing simulation data output. - More...

    - -

    #include <output_writer.h>

    -
    -Inheritance diagram for OutputWriter:
    -
    -
    - - -OutputWriterParaview -OutputWriterText - -
    - - - - - - - - -

    -Public Member Functions

     OutputWriter (std::shared_ptr< Discretization > discretization)
     Constructor.
     
    virtual void writeFile (double currentTime)=0
     Write current velocities to file.
     
    - - - - - - - -

    -Protected Attributes

    -std::shared_ptr< Discretizationdiscretization_
     shared pointer, discretization object containing data to be written to file
     
    -int fileNo_
     a counter that increments for every file written to disk
     
    -

    Detailed Description

    -

    Inteface class for writing simulation data output.

    -

    Constructor & Destructor Documentation

    - -

    ◆ OutputWriter()

    - -
    -
    - - - - - - - - -
    OutputWriter::OutputWriter (std::shared_ptr< Discretizationdiscretization)
    -
    - -

    Constructor.

    -
    Parameters
    - - -
    discretizationdiscretization object containing data to be written to file
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ writeFile()

    - -
    -
    - - - - - -
    - - - - - - - - -
    virtual void OutputWriter::writeFile (double currentTime)
    -
    -pure virtual
    -
    - -

    Write current velocities to file.

    -

    Filename is output_<fileNo_>.vti

    -
    Parameters
    - - -
    currentTimecurrent time of simulation
    -
    -
    - -

    Implemented in OutputWriterParaview, and OutputWriterText.

    - -
    -
    -
    The documentation for this class was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer.cpp
    • -
    -
    - - - - diff --git a/documentation/html/classOutputWriter.png b/documentation/html/classOutputWriter.png deleted file mode 100644 index 8c067052c2fdcc564b3d4ff58012906745de570c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 884 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y!~12~w06FES8t zp%Uy zGk)zmHG_HUyq$-xB*oFLY0rt|k?J*(YlqhmHrI*Z#S>y`AWZStR% zW##OCy3}o3?R1#)?A&^D<-O4zJSXTZ&_A3EKOEc|SQe;XWpL?9-o?n_VagyFpLU7& zfbL4R2Yi}r3My9_T9!yPObB5Xn3Tof6vXS`v5Jwy)09DRC7Z&N&sTaLTg>BWFfQ0P zeJ+MHUcDemnMr|~OaDySI3=j=1gEjqq%Xg(WU0LT?rAznWKx!jrpi^1AdgiOmrU?F z`{8T&)GOz+6S~%hEZh}zy<27L9nHH7pLMY4|NJU>Ofxr2?`h~#Tjl#nqRs< z?wnQW6`Rm|-u9aPbI$zr+xqWr$zT4lX_mO~ny~m_Jx|^Kt6v(w`ravt>)p4vIpOm6 zzj>8=mp%Ku~vvT$o+1x zaqrg!|`8Ot4}rXIZ8*#oaWkT$>4FO;(?w0*P6)|{+uldJ4r zZs$(mc2T}A?y!5|D&~#5q-VW;ZJpKUX|QAAG(Q#7`Ch#$TaTEjzN{!)F>%SX{j(B4 zVHKk6smOoTzopr E0Fh&y9smFU diff --git a/documentation/html/classOutputWriterParaview-members.html b/documentation/html/classOutputWriterParaview-members.html deleted file mode 100644 index 458d93be..00000000 --- a/documentation/html/classOutputWriterParaview-members.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    OutputWriterParaview Member List
    -
    -
    - -

    This is the complete list of members for OutputWriterParaview, including all inherited members.

    - - - - - - -
    discretization_OutputWriterprotected
    fileNo_OutputWriterprotected
    OutputWriter(std::shared_ptr< Discretization > discretization)OutputWriter
    OutputWriterParaview(std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask)OutputWriterParaview
    writeFile(double currentTime)OutputWriterParaviewvirtual
    - - - - diff --git a/documentation/html/classOutputWriterParaview.html b/documentation/html/classOutputWriterParaview.html deleted file mode 100644 index 863b4e64..00000000 --- a/documentation/html/classOutputWriterParaview.html +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - -NumSim: OutputWriterParaview Class Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    - -
    OutputWriterParaview Class Reference
    -
    -
    - -

    Write *.vti files that can be viewed with ParaView. - More...

    - -

    #include <output_writer_paraview.h>

    -
    -Inheritance diagram for OutputWriterParaview:
    -
    -
    - - -OutputWriter - -
    - - - - - - - - - - - - -

    -Public Member Functions

     OutputWriterParaview (std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask)
     Constructor.
     
    void writeFile (double currentTime)
     Write current velocities to file, filename is output_<count>.vti.
     
    - Public Member Functions inherited from OutputWriter
     OutputWriter (std::shared_ptr< Discretization > discretization)
     Constructor.
     
    - - - - - - - - -

    -Additional Inherited Members

    - Protected Attributes inherited from OutputWriter
    -std::shared_ptr< Discretizationdiscretization_
     shared pointer, discretization object containing data to be written to file
     
    -int fileNo_
     a counter that increments for every file written to disk
     
    -

    Detailed Description

    -

    Write *.vti files that can be viewed with ParaView.

    -

    The mesh that can be visualized in ParaView corresponds to the mesh of the computational domain. All values are given for the nodes of the mesh, i.e., the corners of each cell. This means, values will be interpolated because the values are stored at positions given by the staggered grid.

    -

    Constructor & Destructor Documentation

    - -

    ◆ OutputWriterParaview()

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    OutputWriterParaview::OutputWriterParaview (std::shared_ptr< Discretizationdiscretization,
    std::shared_ptr< Maskmask 
    )
    -
    - -

    Constructor.

    -
    Parameters
    - - -
    discretizationshared pointer to the discretization object that will contain all the data to be written to the file
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ writeFile()

    - -
    -
    - - - - - -
    - - - - - - - - -
    void OutputWriterParaview::writeFile (double currentTime)
    -
    -virtual
    -
    - -

    Write current velocities to file, filename is output_<count>.vti.

    -
    Parameters
    - - -
    currentTimecurrent time in simulation
    -
    -
    - -

    Implements OutputWriter.

    - -
    -
    -
    The documentation for this class was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer_paraview.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer_paraview.cpp
    • -
    -
    - - - - diff --git a/documentation/html/classOutputWriterParaview.png b/documentation/html/classOutputWriterParaview.png deleted file mode 100644 index b855af00854c54a33e2348e52457f01c4aab678a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 611 zcmeAS@N?(olHy`uVBq!ia0vp^9Y7qw!3-q7a-LNJQqloFA+G=b{|7Q(y!l$%e`vXd zfo6fk^fNCG95?_J51w>+1yGK&B*-tA0mugfbEer>7#JAedAc};R4~4s`?_znfk3mY za%kOu^?R2XB-w8i-I{kd!*uG|RF6Z`Q`-I=HSxX7am;1X{`V}3nO*{umU$~Y{nx!+ z#rOLGnP^!jmCCc>4syzEiR&9=OqEXt$1_B--MMF`f4=5UTr9KTGP4=gSC+0h@A>J9 zeuK@HIb|PrP5$`p;q%p>wLIh_rYF9=&^Y1A_kZUVyl4Ga@t9G$Jy@RkW9B!@O)+zu zYw}zVl`om*zIv9J1yg6J^Q8N~j_SYOU#sl#X{K5O@S&ezt2^e^`^VSwCT~`S|WDG{l0R*TA@(4cKJ8$1xlrT$~V{WtyWWUKU~LF6mUap zQssPyjfW2+h0Eh;;ZM7kE}MQuu|s8N{insVfsX(AUi;(}Ag$auCFm5xKPJY~0+}0< SI - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    OutputWriterText Member List
    -
    -
    - -

    This is the complete list of members for OutputWriterText, including all inherited members.

    - - - - - - -
    discretization_OutputWriterprotected
    fileNo_OutputWriterprotected
    OutputWriter(std::shared_ptr< Discretization > discretization)OutputWriterText
    writeFile(double currentTime)OutputWriterTextvirtual
    writePressureFile()OutputWriterText
    - - - - diff --git a/documentation/html/classOutputWriterText.html b/documentation/html/classOutputWriterText.html deleted file mode 100644 index 78445375..00000000 --- a/documentation/html/classOutputWriterText.html +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - -NumSim: OutputWriterText Class Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    - -
    OutputWriterText Class Reference
    -
    -
    - -

    Write *.txt files that are useful for debugging. - More...

    - -

    #include <output_writer_text.h>

    -
    -Inheritance diagram for OutputWriterText:
    -
    -
    - - -OutputWriter - -
    - - - - - - - - - - - - - - - -

    -Public Member Functions

    void writeFile (double currentTime)
     Write current velocities to file.
     
    void writePressureFile ()
     Write only current values of pressure to file.
     
    OutputWriter (std::shared_ptr< Discretization > discretization)
     Default constructor.
     
    - Public Member Functions inherited from OutputWriter
     OutputWriter (std::shared_ptr< Discretization > discretization)
     Constructor.
     
    - - - - - - - - -

    -Additional Inherited Members

    - Protected Attributes inherited from OutputWriter
    -std::shared_ptr< Discretizationdiscretization_
     shared pointer, discretization object containing data to be written to file
     
    -int fileNo_
     a counter that increments for every file written to disk
     
    -

    Detailed Description

    -

    Write *.txt files that are useful for debugging.

    -

    All values are written to the file as they are stored in the field variables, no interpolation takes place.

    -

    Member Function Documentation

    - -

    ◆ writeFile()

    - -
    -
    - - - - - -
    - - - - - - - - -
    void OutputWriterText::writeFile (double currentTime)
    -
    -virtual
    -
    - -

    Write current velocities to file.

    -

    Filename is output_<count>.vti

    -
    Parameters
    - - -
    currentTimecurrent time of simulation
    -
    -
    - -

    Implements OutputWriter.

    - -
    -
    - -

    ◆ writePressureFile()

    - -
    -
    - - - - - - - -
    void OutputWriterText::writePressureFile ()
    -
    - -

    Write only current values of pressure to file.

    -

    Filename is pressure_<count>.txt

    - -
    -
    -
    The documentation for this class was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer_text.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer_text.cpp
    • -
    -
    - - - - diff --git a/documentation/html/classOutputWriterText.png b/documentation/html/classOutputWriterText.png deleted file mode 100644 index 8fb73cca6234b65ec1dd053aa25f1cba6f2c682c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 534 zcmV+x0_pvUP)vTJr#LVva2S`&=)l0h|Ns9}lGCUF000SeQchC<|NsC0|NsC0Hv*f~0004@ zNkl5QK*zY3Bd`;wvtcm14Aqp~)SF(K5U|?7H?dVvKQ)5J_@|7K$VX z^mSBtUcO6m*Pcf5ikwA~2kN4>HE!V*RBswd*LtYDeo zuAsJ-A8)?p+jlp0BD{=hjS@;((4a`N(cP$AQ1_zT>6?6hfZ89meOLL{G3t}3+;?TA zRx7X?J(RCNlHBX+zs1QnLy~9u-zbtC)IyQufaaoNjB$zp;B!3yV28n(i}HH-WBL4!$cZwOWDI=%IWCy1P4ETY-|)>fS$+e~6N#`?OG!G@!Yt5JH%u YAFnW1BtDjmU;qFB07*qoM6N<$g7_EsVgLXD diff --git a/documentation/html/classPressureSolver-members.html b/documentation/html/classPressureSolver-members.html deleted file mode 100644 index 16f89391..00000000 --- a/documentation/html/classPressureSolver-members.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    PressureSolver Member List
    -
    -
    - -

    This is the complete list of members for PressureSolver, including all inherited members.

    - - - - - - - - - - - - - - - -
    boundary_PressureSolverprotected
    calculateResiduum()PressureSolverprotected
    discretization_PressureSolverprotected
    dx2 (defined in PressureSolver)PressureSolver
    dy2PressureSolver
    epsilon_PressureSolverprotected
    i_begPressureSolverprotected
    i_endPressureSolverprotected
    j_begPressureSolverprotected
    j_endPressureSolverprotected
    maximumNumberOfIterations_PressureSolverprotected
    PressureSolver(std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)PressureSolver
    setBoundaryValues()PressureSolverprotected
    solve()=0PressureSolverpure virtual
    - - - - diff --git a/documentation/html/classPressureSolver.html b/documentation/html/classPressureSolver.html deleted file mode 100644 index 4b96bb3d..00000000 --- a/documentation/html/classPressureSolver.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - - -NumSim: PressureSolver Class Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    - -
    - -

    Solves the Poisson problem for the pressure. - More...

    - -

    #include <pressure_solver.h>

    -
    -Inheritance diagram for PressureSolver:
    -
    -
    - - -GaussSeidel -SOR - -
    - - - - - - - - -

    -Public Member Functions

     PressureSolver (std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
     Constructor.
     
    virtual void solve ()=0
     virtual function that starts solver.
     
    - - - - - - -

    -Public Attributes

    -double dx2
     
    -double dy2
     squared mesh widths
     
    - - - - - - - -

    -Protected Member Functions

    void setBoundaryValues ()
     Set the Boundary Values.
     
    -double calculateResiduum ()
     calculate residuum of current time step
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Protected Attributes

    -int i_beg
     begin of loop for rhs in x direction
     
    -int i_end
     end of loop for rhs in x direction
     
    -int j_beg
     begin of loop for rhs in y direction
     
    -int j_end
     end of loop for rhs in y direction
     
    -std::shared_ptr< Discretizationdiscretization_
     object holding the needed field variables for rhs and p
     
    -std::shared_ptr< Boundaryboundary_
     object managing boundary for obstacle and surface tension
     
    -double epsilon_
     tolerance for the solver
     
    -int maximumNumberOfIterations_
     maximum number of iterations
     
    -

    Detailed Description

    -

    Solves the Poisson problem for the pressure.

    -

    Interface for the pressure solver. It computes the pressure field variable such that the continuity equation is fulfilled.

    -

    Constructor & Destructor Documentation

    - -

    ◆ PressureSolver()

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    PressureSolver::PressureSolver (std::shared_ptr< Discretizationdiscretization,
    double epsilon,
    int maximumNumberOfIterations,
    std::shared_ptr< Boundaryboundary 
    )
    -
    - -

    Constructor.

    -
    Parameters
    - - - - - -
    discretizationinstance of Discretization holding the needed field variables for rhs and p
    epsilontolerance for the solver
    maximumNumberOfIterationsmaximum of iteration
    boundaryobject managing boundary for obstacle and surface tension
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ setBoundaryValues()

    - -
    -
    - - - - - -
    - - - - - - - -
    void PressureSolver::setBoundaryValues ()
    -
    -protected
    -
    - -

    Set the Boundary Values.

    -

    Account for homogenous Neuman BC Has to be called every iteration

    - -
    -
    - -

    ◆ solve()

    - -
    -
    - - - - - -
    - - - - - - - -
    virtual void PressureSolver::solve ()
    -
    -pure virtual
    -
    - -

    virtual function that starts solver.

    - -

    Implemented in GaussSeidel, and SOR.

    - -
    -
    -
    The documentation for this class was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/pressure_solver.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/pressure_solver.cpp
    • -
    -
    - - - - diff --git a/documentation/html/classPressureSolver.png b/documentation/html/classPressureSolver.png deleted file mode 100644 index c4c751c264dc13283a3b381339d7aaa6caf83ff6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 675 zcmeAS@N?(olHy`uVBq!ia0vp^mw-5cgBeIh+uvRcq@)9ULR|m<{|{uoc=NTi|Il&^ z1I+@7>1SRXIB)=1df`A*p zeCN#X^^bPvMzUy75|@cT$#-EbJr!SEeT-h`7LOp%Il7^O}Q(@3*0lCjzouRJ-rn7=<3oXqAPcuUvlNm&$MT=WA191 zvL=fyO}Hl4d#x`hGWA)|t(6tqi{;Yt&RyTNO#JqzZm+bo^oK|eYSErK^DD@OEdqyb zGWeWjD$rfGe2dQX;$8DD^D zE0r(3{WX7E`Tn4~gYVD2{dIgnoQAEOqUZS={T2b5`xB~_J=fpV5>?)P-dpW#m}HPk zOUcSx?Ne5LwRh9x&D;A#`K76E=$a*8E7U*sg`KLr&9^yXepsfkb(q|#r~CYG9Ej5r zd+=|{+#}idf_JQmJ*Iu{*McOGNnhCYr@We(A6<5T$I9B~rwHq)$ diff --git a/documentation/html/classSOR-members.html b/documentation/html/classSOR-members.html deleted file mode 100644 index 98ccee2b..00000000 --- a/documentation/html/classSOR-members.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    SOR Member List
    -
    -
    - -

    This is the complete list of members for SOR, including all inherited members.

    - - - - - - - - - - - - - - - - -
    boundary_PressureSolverprotected
    calculateResiduum()PressureSolverprotected
    discretization_PressureSolverprotected
    dx2 (defined in PressureSolver)PressureSolver
    dy2PressureSolver
    epsilon_PressureSolverprotected
    i_begPressureSolverprotected
    i_endPressureSolverprotected
    j_begPressureSolverprotected
    j_endPressureSolverprotected
    maximumNumberOfIterations_PressureSolverprotected
    PressureSolver(std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)PressureSolver
    setBoundaryValues()PressureSolverprotected
    solve() overrideSORvirtual
    SOR(const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary, double omega)SOR
    - - - - diff --git a/documentation/html/classSOR.html b/documentation/html/classSOR.html deleted file mode 100644 index 9def3f81..00000000 --- a/documentation/html/classSOR.html +++ /dev/null @@ -1,260 +0,0 @@ - - - - - - - -NumSim: SOR Class Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    - -
    SOR Class Reference
    -
    -
    - -

    Successive over-relaxation solver. - More...

    - -

    #include <sor.h>

    -
    -Inheritance diagram for SOR:
    -
    -
    - - -PressureSolver - -
    - - - - - - - - - - - - -

    -Public Member Functions

     SOR (const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary, double omega)
     Constructor.
     
    void solve () override
     override function that starts solver.
     
    - Public Member Functions inherited from PressureSolver
     PressureSolver (std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
     Constructor.
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Additional Inherited Members

    - Public Attributes inherited from PressureSolver
    -double dx2
     
    -double dy2
     squared mesh widths
     
    - Protected Member Functions inherited from PressureSolver
    void setBoundaryValues ()
     Set the Boundary Values.
     
    -double calculateResiduum ()
     calculate residuum of current time step
     
    - Protected Attributes inherited from PressureSolver
    -int i_beg
     begin of loop for rhs in x direction
     
    -int i_end
     end of loop for rhs in x direction
     
    -int j_beg
     begin of loop for rhs in y direction
     
    -int j_end
     end of loop for rhs in y direction
     
    -std::shared_ptr< Discretizationdiscretization_
     object holding the needed field variables for rhs and p
     
    -std::shared_ptr< Boundaryboundary_
     object managing boundary for obstacle and surface tension
     
    -double epsilon_
     tolerance for the solver
     
    -int maximumNumberOfIterations_
     maximum number of iterations
     
    -

    Detailed Description

    -

    Successive over-relaxation solver.

    -

    Constructor & Destructor Documentation

    - -

    ◆ SOR()

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    SOR::SOR (const std::shared_ptr< Discretization > & data,
    double epsilon,
    int maximumNumberOfIterations,
    std::shared_ptr< Boundaryboundary,
    double omega 
    )
    -
    - -

    Constructor.

    -
    Parameters
    - - - - - -
    datainstance of Discretization holding the needed field variables for rhs and p
    epsilontolerance for the solver
    maximumNumberOfIterationsmaximum of iteration
    omegarelaxation factor
    -
    -
    - -
    -
    -

    Member Function Documentation

    - -

    ◆ solve()

    - -
    -
    - - - - - -
    - - - - - - - -
    void SOR::solve ()
    -
    -overridevirtual
    -
    - -

    override function that starts solver.

    - -

    Implements PressureSolver.

    - -
    -
    -
    The documentation for this class was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/sor.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/sor.cpp
    • -
    -
    - - - - diff --git a/documentation/html/classSOR.png b/documentation/html/classSOR.png deleted file mode 100644 index 78abfb4799f77e7cea02bd428cd48ca3c484962c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^DL@>+!3-pCTvxaYq@)9ULR|m<{|{uoc=NTi|Il&^ z1I+@7>1SRXIB)c)B=-R4~4s`!?^e0*~u@ z{h*Tj|2wDW@Gvc1Y0PUWzh3=0C?%h1 zZaIOcfAu@H`3GL?xTW-RdETYfDyVt(B{PkG9xaU136_uCI)~aYOHIZc4agvQ;bEM+UZLHHoC*3u?zscp3+f`8^ zh7ZC*3 - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    StaggeredGrid Member List
    -
    -
    - -

    This is the complete list of members for StaggeredGrid, including all inherited members.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    dx() constStaggeredGrid
    dy() constStaggeredGrid
    f(int i, int j)StaggeredGrid
    f_StaggeredGridprotected
    fIBegin() constStaggeredGrid
    fIEnd() constStaggeredGrid
    fJBegin() constStaggeredGrid
    fJEnd() constStaggeredGrid
    g(int i, int j)StaggeredGrid
    g_StaggeredGridprotected
    gIBegin() constStaggeredGrid
    gIEnd() constStaggeredGrid
    gJBegin() constStaggeredGrid
    gJEnd() constStaggeredGrid
    meshWidth() constStaggeredGrid
    meshWidth_StaggeredGridprotected
    nCells() constStaggeredGrid
    nCells_StaggeredGridprotected
    p() constStaggeredGrid
    p(int i, int j) constStaggeredGrid
    p(int i, int j)StaggeredGrid
    p_StaggeredGridprotected
    pIBegin() constStaggeredGrid
    pIEnd() constStaggeredGrid
    pJBegin() constStaggeredGrid
    pJEnd() constStaggeredGrid
    rhs() constStaggeredGrid
    rhs(int i, int j)StaggeredGrid
    rhs_StaggeredGridprotected
    rhsIBegin() constStaggeredGrid
    rhsIEnd() constStaggeredGrid
    rhsJBegin() constStaggeredGrid
    rhsJEnd() constStaggeredGrid
    StaggeredGrid(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)StaggeredGrid
    u() constStaggeredGrid
    u(int i, int j) constStaggeredGrid
    u(int i, int j)StaggeredGrid
    u_StaggeredGridprotected
    uIBegin() constStaggeredGrid
    uIEnd() constStaggeredGrid
    uJBegin() constStaggeredGrid
    uJEnd() constStaggeredGrid
    v() constStaggeredGrid
    v(int i, int j) constStaggeredGrid
    v(int i, int j)StaggeredGrid
    v_StaggeredGridprotected
    vIBegin() constStaggeredGrid
    vIEnd() constStaggeredGrid
    vJBegin() constStaggeredGrid
    vJEnd() constStaggeredGrid
    - - - - diff --git a/documentation/html/classStaggeredGrid.html b/documentation/html/classStaggeredGrid.html deleted file mode 100644 index 83166a46..00000000 --- a/documentation/html/classStaggeredGrid.html +++ /dev/null @@ -1,354 +0,0 @@ - - - - - - - -NumSim: StaggeredGrid Class Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    - -
    StaggeredGrid Class Reference
    -
    -
    - -

    Create field variables and define limits for the indices. - More...

    - -

    #include <staggered_grid.h>

    -
    -Inheritance diagram for StaggeredGrid:
    -
    -
    - - -Discretization -CentralDifferences -DonorCell - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Member Functions

     StaggeredGrid (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
     Constructor.
     
    -const std::array< double, 2 > meshWidth () const
     Get the length of a single cell in x and y directions.
     
    -const std::array< int, 2 > nCells () const
     Get number of cells in x and y directions.
     
    -const FieldVariableu () const
     Get a reference to the field variable u.
     
    -const FieldVariablev () const
     Get a reference to the field variable v.
     
    -const FieldVariablep () const
     Get a reference to the field variable p.
     
    -const FieldVariablerhs () const
     Get a reference to the field variable rhs.
     
    -double u (int i, int j) const
     Access value of u in element (i,j), declared constant.
     
    -double & u (int i, int j)
     Access value of u in element (i,j)
     
    -double v (int i, int j) const
     Access value of v in element (i,j), declared constant.
     
    -double & v (int i, int j)
     Access value of v in element (i,j)
     
    -double p (int i, int j) const
     Access value of p in element (i,j), declared constant.
     
    -double & p (int i, int j)
     Access value of p in element (i,j)
     
    -double & f (int i, int j)
     Access value of f in element (i,j)
     
    -double & g (int i, int j)
     Access value of g in element (i,j)
     
    -double & rhs (int i, int j)
     Access value of rhs in element (i,j)
     
    -double dx () const
     Get the mesh width in x-direction.
     
    -double dy () const
     Get the mesh width in y-direction.
     
    -int uIBegin () const
     first valid index for u in x direction
     
    -int uIEnd () const
     one after last valid index for u in x direction
     
    -int uJBegin () const
     first valid index for u in y direction
     
    -int uJEnd () const
     one after last valid index for u in y direction
     
    -int vIBegin () const
     first valid index for v in x direction
     
    -int vIEnd () const
     one after last valid index for v in x direction
     
    -int vJBegin () const
     first valid index for v in y direction
     
    -int vJEnd () const
     one after last valid index for v in y direction
     
    -int pIBegin () const
     first valid index for p in x direction
     
    -int pIEnd () const
     one after last valid index for p in x direction
     
    -int pJBegin () const
     first valid index for p in y direction
     
    -int pJEnd () const
     one after last valid index for p in y direction
     
    -int fIBegin () const
     first valid index for f in x direction
     
    -int fIEnd () const
     one after last valid index for f in x direction
     
    -int fJBegin () const
     first valid index for f in y direction
     
    -int fJEnd () const
     one after last valid index for f in y direction
     
    -int gIBegin () const
     first valid index for g in x direction
     
    -int gIEnd () const
     one after last valid index for g in x direction
     
    -int gJBegin () const
     first valid index for g in y direction
     
    -int gJEnd () const
     one after last valid index for g in y direction
     
    -int rhsIBegin () const
     first valid index for rhs in x direction
     
    -int rhsIEnd () const
     one after last valid index for rhs in x direction
     
    -int rhsJBegin () const
     first valid index for rhs in y direction
     
    -int rhsJEnd () const
     one after last valid index for rhs in y direction
     
    - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Protected Attributes

    -const std::array< int, 2 > nCells_
     array containing number of cells in x and y directions
     
    -const std::array< double, 2 > meshWidth_
     array containing the sizes of cell edges in x and y directions
     
    -FieldVariable u_
     instance of the field variable u
     
    -FieldVariable v_
     instance of the field variable v
     
    -FieldVariable p_
     instance of the field variable p
     
    -FieldVariable f_
     instance of the field variable f
     
    -FieldVariable g_
     instance of the field variable g
     
    -FieldVariable rhs_
     instance of the field variable rhs
     
    -

    Detailed Description

    -

    Create field variables and define limits for the indices.

    -

    Create the necessary u, v, p, f, g, rhs field variables and define the first valid index for each of the field variables, as well as the (one after) last valid index

    -

    Constructor & Destructor Documentation

    - -

    ◆ StaggeredGrid()

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    StaggeredGrid::StaggeredGrid (std::array< int, 2 > nCells,
    std::array< double, 2 > meshWidth 
    )
    -
    - -

    Constructor.

    -
    Parameters
    - - - -
    nCellsarray containing number of cells in x and y directions
    meshWidtharray containing the length of a single cell in x and y directions
    -
    -
    - -
    -
    -
    The documentation for this class was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/staggered_grid.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/staggered_grid.cpp
    • -
    -
    - - - - diff --git a/documentation/html/classStaggeredGrid.png b/documentation/html/classStaggeredGrid.png deleted file mode 100644 index 372a826c21c16a55ad438007dec0da6cc630b22d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1049 zcmeAS@N?(olHy`uVBq!ia0vp^KY+M{gBeKv)x8GdNC)_Yxc>kDAIN<1=4)yHq2(3^ zngtTm&%8Kr-~doOc+%w+KsnBmAirP+ARi3OnPy*MU|?S2>Eakt!T5IW>q)B>1lVr( zYh~a2-|24>$L3sCY%MVT<|gLuhAljg;~Tb1v?XRRI7G7^#(r$izdjF$pW_)=3saNav zrMzFd-@ifK`f*yCq~40NXYM`Ld9;5{gz@I*7H9kN8UISY4{qHx^X74m!UnUJ9Wx_M zon#j99yZ|NWw6jycIf}2W!E=%)_1MCkMAz;iT-%v6+^AyBL-U%@N(s)Q{qy5G?$7q zW_V9p0tv8~NvnWH8v-i!YC{dMkd`4G|KH*Nv$SZW_NBi~4x4{@$N5*! zg{Lq1@7ck;Me&I0N^mR+Oka`(iq;^nm5dC_Q(0b2j5~UKWANv=qx$!1XO(NqManMF z2L_Wm0zdHSd2F$bbphkqa-AcLT0)N)bb$fd1vG^ls7MKzHkt(3S9kzzQ2KmdRO%En38+y~&r`JU(c!25lZ^Our`IpfD}MdO_$t?8m6z%B z1n$decz!?e+h_HpCGt0pnoD~A4izXryLq>Y?OEeTM_WCMt}i@q{3!3rpLcDk=Fcs! z-LiYU_2;E+Th=>1sM7Oof8_d6b)T1U{QRnjKirRAA9(#hci#4wb9S(49{+l#N~V3k zO5B{v>a=Y?%8zV*q);8c$HFeZCf+7Kvh2=1q5aP~7yq~xB@$oMy;}arb-wp4zmy-f zr+Nj={M2_p=MMA2I*+pL*7L6Zd)&8w*46qs_tL+%JO33<|MTvQ-ookgls#R!?iY%0 z)hj(C`R9l1clN~kee(Z1*X*lZeA;-r`2Ut2Dxr@#3q60?fI@)tBQO%WKw>IKq`Q_+ i396k_;iY-?x%__hDNh>;QdR>qF@vY8pUXO@geCw>hW{)8 diff --git a/documentation/html/classes.html b/documentation/html/classes.html deleted file mode 100644 index 7297e602..00000000 --- a/documentation/html/classes.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -NumSim: Class Index - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Class Index
    -
    - - - - - diff --git a/documentation/html/clipboard.js b/documentation/html/clipboard.js deleted file mode 100644 index 42c1fb0e..00000000 --- a/documentation/html/clipboard.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - -The code below is based on the Doxygen Awesome project, see -https://github.com/jothepro/doxygen-awesome-css - -MIT License - -Copyright (c) 2021 - 2022 jothepro - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -*/ - -let clipboard_title = "Copy to clipboard" -let clipboard_icon = `` -let clipboard_successIcon = `` -let clipboard_successDuration = 1000 - -$(function() { - if(navigator.clipboard) { - const fragments = document.getElementsByClassName("fragment") - for(const fragment of fragments) { - const clipboard_div = document.createElement("div") - clipboard_div.classList.add("clipboard") - clipboard_div.innerHTML = clipboard_icon - clipboard_div.title = clipboard_title - $(clipboard_div).click(function() { - const content = this.parentNode.cloneNode(true) - // filter out line number and folded fragments from file listings - content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) - let text = content.textContent - // remove trailing newlines and trailing spaces from empty lines - text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') - navigator.clipboard.writeText(text); - this.classList.add("success") - this.innerHTML = clipboard_successIcon - window.setTimeout(() => { // switch back to normal icon after timeout - this.classList.remove("success") - this.innerHTML = clipboard_icon - }, clipboard_successDuration); - }) - fragment.insertBefore(clipboard_div, fragment.firstChild) - } - } -}) diff --git a/documentation/html/closed.png b/documentation/html/closed.png deleted file mode 100644 index 98cc2c909da37a6df914fbf67780eebd99c597f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT diff --git a/documentation/html/computation_8h_source.html b/documentation/html/computation_8h_source.html deleted file mode 100644 index 5f7e6871..00000000 --- a/documentation/html/computation_8h_source.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/computation.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    computation.h
    -
    -
    -
    1#pragma once
    -
    2
    -
    3#include "discretization/discretization.h"
    -
    4#include "discretization/donor_cell.h"
    -
    5#include "discretization/central_differences.h"
    -
    6
    -
    7#include "solver/pressure_solver.h"
    -
    8#include "solver/sor.h"
    -
    9#include "solver/gauss_seidel.h"
    -
    10
    -
    11#include "output_writer/output_writer_paraview.h"
    -
    12#include "output_writer/output_writer_text.h"
    -
    13#include "settings_parser/settings.h"
    -
    14
    -
    15#include "boundary/boundary.h"
    -
    16#include "boundary/mask.h"
    -
    17#include "surface/fluid_tracer.h"
    -
    18#include <unistd.h>
    -
    19
    -
    20#include <cmath>
    -
    21#include <algorithm>
    -
    22#include <iostream>
    -
    23
    -
    - -
    31{
    -
    32public:
    -
    39 void initialize(int argc, char *argv[]);
    -
    40
    -
    45 void runSimulation();
    -
    46
    -
    47
    -
    48
    -
    49private:
    -
    55 void computeTimeStepWidth(double currentTime);
    -
    56
    -
    60 void applyBoundaryValues();
    -
    61
    -
    65 void computePreliminaryVelocities();
    -
    66
    -
    70 void computeRightHandSide();
    -
    71
    -
    75 void computePressure();
    -
    76
    -
    81 void computeVelocities();
    -
    82
    -
    83 Settings settings_;
    -
    84 std::shared_ptr<Discretization> discretization_;
    -
    85
    -
    86 std::shared_ptr<Mask> mask_;
    -
    87 std::shared_ptr<Boundary> boundary_;
    -
    88 std::shared_ptr<FluidTracer> fluidTracer_;
    -
    89
    -
    90 std::unique_ptr<PressureSolver> pressureSolver_;
    -
    91 std::unique_ptr<OutputWriterParaview> outputWriterParaview_;
    -
    92 std::unique_ptr<OutputWriterText> outputWriterText_;
    -
    93 std::array<double, 2> meshWidth_;
    -
    94 double dt_;
    -
    95};
    -
    -
    96
    -
    97
    -
    Computation of Simulation.
    Definition computation.h:31
    -
    void initialize(int argc, char *argv[])
    Initialize the simulation with settings from .txt file.
    Definition computation.cpp:6
    -
    void runSimulation()
    run the whole simulation until t_end
    Definition computation.cpp:66
    -
    All settings that parametrize a simulation run.
    Definition settings.h:14
    -
    - - - - diff --git a/documentation/html/dir_041db6ad6a3d44280e40e5af409429cb.html b/documentation/html/dir_041db6ad6a3d44280e40e5af409429cb.html deleted file mode 100644 index c8aa3abe..00000000 --- a/documentation/html/dir_041db6ad6a3d44280e40e5af409429cb.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver Directory Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    solver Directory Reference
    -
    -
    - - - - - - - - -

    -Files

     gauss_seidel.h
     
     pressure_solver.h
     
     sor.h
     
    -
    - - - - diff --git a/documentation/html/dir_2725064ac5d6db7b2425ad4e379e8748.html b/documentation/html/dir_2725064ac5d6db7b2425ad4e379e8748.html deleted file mode 100644 index 89c7df26..00000000 --- a/documentation/html/dir_2725064ac5d6db7b2425ad4e379e8748.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/boundary Directory Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    boundary Directory Reference
    -
    -
    - - - - - - -

    -Files

     boundary.h
     
     mask.h
     
    -
    - - - - diff --git a/documentation/html/dir_29398f723566cb24cda620b0fb0566c4.html b/documentation/html/dir_29398f723566cb24cda620b0fb0566c4.html deleted file mode 100644 index bcdc2882..00000000 --- a/documentation/html/dir_29398f723566cb24cda620b0fb0566c4.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/settings_parser Directory Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    settings_parser Directory Reference
    -
    -
    - - - - -

    -Files

     settings.h
     
    -
    - - - - diff --git a/documentation/html/dir_452baf35e1d7639c9f2a5ece4ec85855.html b/documentation/html/dir_452baf35e1d7639c9f2a5ece4ec85855.html deleted file mode 100644 index c29b95f2..00000000 --- a/documentation/html/dir_452baf35e1d7639c9f2a5ece4ec85855.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/storage Directory Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    storage Directory Reference
    -
    -
    - - - - - - -

    -Files

     array2D.h
     
     field_variable.h
     
    -
    - - - - diff --git a/documentation/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/documentation/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html deleted file mode 100644 index 95f70267..00000000 --- a/documentation/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src Directory Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    src Directory Reference
    -
    -
    - - - - - - - - - - - - - - - - -

    -Directories

     boundary
     
     discretization
     
     output_writer
     
     settings_parser
     
     solver
     
     storage
     
     surface
     
    - - - -

    -Files

     computation.h
     
    -
    - - - - diff --git a/documentation/html/dir_93b0d6a552827721ec9247642283aaa7.html b/documentation/html/dir_93b0d6a552827721ec9247642283aaa7.html deleted file mode 100644 index c6de8009..00000000 --- a/documentation/html/dir_93b0d6a552827721ec9247642283aaa7.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/surface Directory Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    surface Directory Reference
    -
    -
    - - - - -

    -Files

     fluid_tracer.h
     
    -
    - - - - diff --git a/documentation/html/dir_b0b9c4b8ebed4a07d44b9aa635c19fe7.html b/documentation/html/dir_b0b9c4b8ebed4a07d44b9aa635c19fe7.html deleted file mode 100644 index 01cf9faf..00000000 --- a/documentation/html/dir_b0b9c4b8ebed4a07d44b9aa635c19fe7.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer Directory Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    output_writer Directory Reference
    -
    -
    - - - - - - - - -

    -Files

     output_writer.h
     
     output_writer_paraview.h
     
     output_writer_text.h
     
    -
    - - - - diff --git a/documentation/html/dir_e7c1ed2d2d4c4bb5d8a9744d9e98c346.html b/documentation/html/dir_e7c1ed2d2d4c4bb5d8a9744d9e98c346.html deleted file mode 100644 index 0e3dd74c..00000000 --- a/documentation/html/dir_e7c1ed2d2d4c4bb5d8a9744d9e98c346.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization Directory Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    discretization Directory Reference
    -
    -
    - - - - - - - - - - -

    -Files

     central_differences.h
     
     discretization.h
     
     donor_cell.h
     
     staggered_grid.h
     
    -
    - - - - diff --git a/documentation/html/discretization_8h_source.html b/documentation/html/discretization_8h_source.html deleted file mode 100644 index db3706f1..00000000 --- a/documentation/html/discretization_8h_source.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/discretization.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    discretization.h
    -
    -
    -
    1#pragma once
    -
    2
    -
    3#include <array>
    -
    4#include <vector>
    -
    5#include "staggered_grid.h"
    -
    6
    -
    - -
    16{
    -
    17public:
    -
    24 Discretization(std::array<int, 2> nCells, std::array<double, 2> meshWidth);
    -
    25
    -
    29 virtual double computeDu2Dx(int i, int j) const = 0;
    -
    33 virtual double computeDv2Dy(int i, int j) const = 0;
    -
    34
    -
    38 virtual double computeDuvDx(int i, int j) const = 0;
    -
    42 virtual double computeDuvDy(int i, int j) const = 0;
    -
    43
    -
    47 virtual double computeD2uDx2(int i, int j) const;
    -
    51 virtual double computeD2uDy2(int i, int j) const;
    -
    55 virtual double computeD2vDx2(int i, int j) const;
    -
    59 virtual double computeD2vDy2(int i, int j) const;
    -
    60
    -
    64 virtual double computeDpDx(int i, int j) const;
    -
    68 virtual double computeDpDy(int i, int j) const;
    -
    69
    -
    70
    -
    71};
    -
    -
    72
    -
    Computes derivatives included in governing equations.
    Definition discretization.h:16
    -
    virtual double computeDuvDy(int i, int j) const =0
    Calculate first derivative of u*v with respect to y.
    -
    virtual double computeD2uDy2(int i, int j) const
    Calculate second derivative of u with respect to y.
    Definition discretization.cpp:12
    -
    Discretization(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
    Constructor.
    Definition discretization.cpp:3
    -
    virtual double computeD2vDx2(int i, int j) const
    Calculate second derivative of v with respect to x.
    Definition discretization.cpp:17
    -
    virtual double computeD2vDy2(int i, int j) const
    Calculate second derivative of v with respect to y.
    Definition discretization.cpp:22
    -
    virtual double computeD2uDx2(int i, int j) const
    Calculate second derivative of u with respect to x.
    Definition discretization.cpp:7
    -
    virtual double computeDv2Dy(int i, int j) const =0
    Calculate first derivative of v^2 with respect to y.
    -
    virtual double computeDpDy(int i, int j) const
    Calculate first derivative of p with respect to y.
    Definition discretization.cpp:32
    -
    virtual double computeDuvDx(int i, int j) const =0
    Calculate first derivative of u*v with respect to x.
    -
    virtual double computeDu2Dx(int i, int j) const =0
    Calculate first derivative of u^2 with respect to x.
    -
    virtual double computeDpDx(int i, int j) const
    Calculate first derivative of p with respect to x.
    Definition discretization.cpp:27
    -
    Create field variables and define limits for the indices.
    Definition staggered_grid.h:15
    -
    const std::array< double, 2 > meshWidth() const
    Get the length of a single cell in x and y directions.
    Definition staggered_grid.cpp:14
    -
    const std::array< int, 2 > nCells() const
    Get number of cells in x and y directions.
    Definition staggered_grid.cpp:19
    -
    - - - - diff --git a/documentation/html/doc.svg b/documentation/html/doc.svg deleted file mode 100644 index 0b928a53..00000000 --- a/documentation/html/doc.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - diff --git a/documentation/html/docd.svg b/documentation/html/docd.svg deleted file mode 100644 index ac18b275..00000000 --- a/documentation/html/docd.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - diff --git a/documentation/html/donor__cell_8h_source.html b/documentation/html/donor__cell_8h_source.html deleted file mode 100644 index 21200449..00000000 --- a/documentation/html/donor__cell_8h_source.html +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/donor_cell.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    donor_cell.h
    -
    -
    -
    1#pragma once
    -
    2
    -
    3#include <array>
    -
    4#include <vector>
    -
    5#include <cmath>
    -
    6#include "discretization.h"
    -
    7
    -
    - -
    16{
    -
    17public:
    -
    25 DonorCell(std::array<int, 2> nCells, std::array<double, 2> meshWidth, double alpha);
    -
    26
    -
    31 double computeDu2Dx(int i, int j) const override;
    -
    36 double computeDv2Dy(int i, int j) const override;
    -
    41 double computeDuvDx(int i, int j) const override;
    -
    46 double computeDuvDy(int i, int j) const override;
    -
    47
    -
    48private:
    -
    49 const double alpha_;
    -
    50};
    -
    -
    Computes derivatives included in governing equations.
    Definition discretization.h:16
    -
    Discretizes the problem using the donor cell scheme.
    Definition donor_cell.h:16
    -
    double computeDv2Dy(int i, int j) const override
    Calculate first derivative of v^2 with respect to y with the donor cell Scheme.
    Definition donor_cell.cpp:49
    -
    double computeDu2Dx(int i, int j) const override
    Calculate first derivative of u^2 with respect to x with the donor cell Scheme.
    Definition donor_cell.cpp:36
    -
    double computeDuvDy(int i, int j) const override
    Calculate first derivative of u*v with respect to y with the donor cell Scheme.
    Definition donor_cell.cpp:22
    -
    DonorCell(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth, double alpha)
    Constructor.
    Definition donor_cell.cpp:3
    -
    double computeDuvDx(int i, int j) const override
    Calculate first derivative of u*v with respect to x with the donor cell Scheme.
    Definition donor_cell.cpp:8
    -
    const std::array< double, 2 > meshWidth() const
    Get the length of a single cell in x and y directions.
    Definition staggered_grid.cpp:14
    -
    const std::array< int, 2 > nCells() const
    Get number of cells in x and y directions.
    Definition staggered_grid.cpp:19
    -
    - - - - diff --git a/documentation/html/doxygen.css b/documentation/html/doxygen.css deleted file mode 100644 index 9193852a..00000000 --- a/documentation/html/doxygen.css +++ /dev/null @@ -1,2080 +0,0 @@ -/* The standard CSS for doxygen 1.10.0*/ - -html { -/* page base colors */ ---page-background-color: white; ---page-foreground-color: black; ---page-link-color: #3D578C; ---page-visited-link-color: #4665A2; - -/* index */ ---index-odd-item-bg-color: #F8F9FC; ---index-even-item-bg-color: white; ---index-header-color: black; ---index-separator-color: #A0A0A0; - -/* header */ ---header-background-color: #F9FAFC; ---header-separator-color: #C4CFE5; ---header-gradient-image: url('nav_h.png'); ---group-header-separator-color: #879ECB; ---group-header-color: #354C7B; ---inherit-header-color: gray; - ---footer-foreground-color: #2A3D61; ---footer-logo-width: 104px; ---citation-label-color: #334975; ---glow-color: cyan; - ---title-background-color: white; ---title-separator-color: #5373B4; ---directory-separator-color: #9CAFD4; ---separator-color: #4A6AAA; - ---blockquote-background-color: #F7F8FB; ---blockquote-border-color: #9CAFD4; - ---scrollbar-thumb-color: #9CAFD4; ---scrollbar-background-color: #F9FAFC; - ---icon-background-color: #728DC1; ---icon-foreground-color: white; ---icon-doc-image: url('doc.svg'); ---icon-folder-open-image: url('folderopen.svg'); ---icon-folder-closed-image: url('folderclosed.svg'); - -/* brief member declaration list */ ---memdecl-background-color: #F9FAFC; ---memdecl-separator-color: #DEE4F0; ---memdecl-foreground-color: #555; ---memdecl-template-color: #4665A2; - -/* detailed member list */ ---memdef-border-color: #A8B8D9; ---memdef-title-background-color: #E2E8F2; ---memdef-title-gradient-image: url('nav_f.png'); ---memdef-proto-background-color: #DFE5F1; ---memdef-proto-text-color: #253555; ---memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); ---memdef-doc-background-color: white; ---memdef-param-name-color: #602020; ---memdef-template-color: #4665A2; - -/* tables */ ---table-cell-border-color: #2D4068; ---table-header-background-color: #374F7F; ---table-header-foreground-color: #FFFFFF; - -/* labels */ ---label-background-color: #728DC1; ---label-left-top-border-color: #5373B4; ---label-right-bottom-border-color: #C4CFE5; ---label-foreground-color: white; - -/** navigation bar/tree/menu */ ---nav-background-color: #F9FAFC; ---nav-foreground-color: #364D7C; ---nav-gradient-image: url('tab_b.png'); ---nav-gradient-hover-image: url('tab_h.png'); ---nav-gradient-active-image: url('tab_a.png'); ---nav-gradient-active-image-parent: url("../tab_a.png"); ---nav-separator-image: url('tab_s.png'); ---nav-breadcrumb-image: url('bc_s.png'); ---nav-breadcrumb-border-color: #C2CDE4; ---nav-splitbar-image: url('splitbar.png'); ---nav-font-size-level1: 13px; ---nav-font-size-level2: 10px; ---nav-font-size-level3: 9px; ---nav-text-normal-color: #283A5D; ---nav-text-hover-color: white; ---nav-text-active-color: white; ---nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); ---nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); ---nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); ---nav-menu-button-color: #364D7C; ---nav-menu-background-color: white; ---nav-menu-foreground-color: #555555; ---nav-menu-toggle-color: rgba(255, 255, 255, 0.5); ---nav-arrow-color: #9CAFD4; ---nav-arrow-selected-color: #9CAFD4; - -/* table of contents */ ---toc-background-color: #F4F6FA; ---toc-border-color: #D8DFEE; ---toc-header-color: #4665A2; ---toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); - -/** search field */ ---search-background-color: white; ---search-foreground-color: #909090; ---search-magnification-image: url('mag.svg'); ---search-magnification-select-image: url('mag_sel.svg'); ---search-active-color: black; ---search-filter-background-color: #F9FAFC; ---search-filter-foreground-color: black; ---search-filter-border-color: #90A5CE; ---search-filter-highlight-text-color: white; ---search-filter-highlight-bg-color: #3D578C; ---search-results-foreground-color: #425E97; ---search-results-background-color: #EEF1F7; ---search-results-border-color: black; ---search-box-shadow: inset 0.5px 0.5px 3px 0px #555; - -/** code fragments */ ---code-keyword-color: #008000; ---code-type-keyword-color: #604020; ---code-flow-keyword-color: #E08000; ---code-comment-color: #800000; ---code-preprocessor-color: #806020; ---code-string-literal-color: #002080; ---code-char-literal-color: #008080; ---code-xml-cdata-color: black; ---code-vhdl-digit-color: #FF00FF; ---code-vhdl-char-color: #000000; ---code-vhdl-keyword-color: #700070; ---code-vhdl-logic-color: #FF0000; ---code-link-color: #4665A2; ---code-external-link-color: #4665A2; ---fragment-foreground-color: black; ---fragment-background-color: #FBFCFD; ---fragment-border-color: #C4CFE5; ---fragment-lineno-border-color: #00FF00; ---fragment-lineno-background-color: #E8E8E8; ---fragment-lineno-foreground-color: black; ---fragment-lineno-link-fg-color: #4665A2; ---fragment-lineno-link-bg-color: #D8D8D8; ---fragment-lineno-link-hover-fg-color: #4665A2; ---fragment-lineno-link-hover-bg-color: #C8C8C8; ---fragment-copy-ok-color: #2EC82E; ---tooltip-foreground-color: black; ---tooltip-background-color: white; ---tooltip-border-color: gray; ---tooltip-doc-color: grey; ---tooltip-declaration-color: #006318; ---tooltip-link-color: #4665A2; ---tooltip-shadow: 1px 1px 7px gray; ---fold-line-color: #808080; ---fold-minus-image: url('minus.svg'); ---fold-plus-image: url('plus.svg'); ---fold-minus-image-relpath: url('../../minus.svg'); ---fold-plus-image-relpath: url('../../plus.svg'); - -/** font-family */ ---font-family-normal: Roboto,sans-serif; ---font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; ---font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; ---font-family-title: Tahoma,Arial,sans-serif; ---font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; ---font-family-search: Arial,Verdana,sans-serif; ---font-family-icon: Arial,Helvetica; ---font-family-tooltip: Roboto,sans-serif; - -} - -@media (prefers-color-scheme: dark) { - html:not(.dark-mode) { - color-scheme: dark; - -/* page base colors */ ---page-background-color: black; ---page-foreground-color: #C9D1D9; ---page-link-color: #90A5CE; ---page-visited-link-color: #A3B4D7; - -/* index */ ---index-odd-item-bg-color: #0B101A; ---index-even-item-bg-color: black; ---index-header-color: #C4CFE5; ---index-separator-color: #334975; - -/* header */ ---header-background-color: #070B11; ---header-separator-color: #141C2E; ---header-gradient-image: url('nav_hd.png'); ---group-header-separator-color: #283A5D; ---group-header-color: #90A5CE; ---inherit-header-color: #A0A0A0; - ---footer-foreground-color: #5B7AB7; ---footer-logo-width: 60px; ---citation-label-color: #90A5CE; ---glow-color: cyan; - ---title-background-color: #090D16; ---title-separator-color: #354C79; ---directory-separator-color: #283A5D; ---separator-color: #283A5D; - ---blockquote-background-color: #101826; ---blockquote-border-color: #283A5D; - ---scrollbar-thumb-color: #283A5D; ---scrollbar-background-color: #070B11; - ---icon-background-color: #334975; ---icon-foreground-color: #C4CFE5; ---icon-doc-image: url('docd.svg'); ---icon-folder-open-image: url('folderopend.svg'); ---icon-folder-closed-image: url('folderclosedd.svg'); - -/* brief member declaration list */ ---memdecl-background-color: #0B101A; ---memdecl-separator-color: #2C3F65; ---memdecl-foreground-color: #BBB; ---memdecl-template-color: #7C95C6; - -/* detailed member list */ ---memdef-border-color: #233250; ---memdef-title-background-color: #1B2840; ---memdef-title-gradient-image: url('nav_fd.png'); ---memdef-proto-background-color: #19243A; ---memdef-proto-text-color: #9DB0D4; ---memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); ---memdef-doc-background-color: black; ---memdef-param-name-color: #D28757; ---memdef-template-color: #7C95C6; - -/* tables */ ---table-cell-border-color: #283A5D; ---table-header-background-color: #283A5D; ---table-header-foreground-color: #C4CFE5; - -/* labels */ ---label-background-color: #354C7B; ---label-left-top-border-color: #4665A2; ---label-right-bottom-border-color: #283A5D; ---label-foreground-color: #CCCCCC; - -/** navigation bar/tree/menu */ ---nav-background-color: #101826; ---nav-foreground-color: #364D7C; ---nav-gradient-image: url('tab_bd.png'); ---nav-gradient-hover-image: url('tab_hd.png'); ---nav-gradient-active-image: url('tab_ad.png'); ---nav-gradient-active-image-parent: url("../tab_ad.png"); ---nav-separator-image: url('tab_sd.png'); ---nav-breadcrumb-image: url('bc_sd.png'); ---nav-breadcrumb-border-color: #2A3D61; ---nav-splitbar-image: url('splitbard.png'); ---nav-font-size-level1: 13px; ---nav-font-size-level2: 10px; ---nav-font-size-level3: 9px; ---nav-text-normal-color: #B6C4DF; ---nav-text-hover-color: #DCE2EF; ---nav-text-active-color: #DCE2EF; ---nav-text-normal-shadow: 0px 1px 1px black; ---nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); ---nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); ---nav-menu-button-color: #B6C4DF; ---nav-menu-background-color: #05070C; ---nav-menu-foreground-color: #BBBBBB; ---nav-menu-toggle-color: rgba(255, 255, 255, 0.2); ---nav-arrow-color: #334975; ---nav-arrow-selected-color: #90A5CE; - -/* table of contents */ ---toc-background-color: #151E30; ---toc-border-color: #202E4A; ---toc-header-color: #A3B4D7; ---toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); - -/** search field */ ---search-background-color: black; ---search-foreground-color: #C5C5C5; ---search-magnification-image: url('mag_d.svg'); ---search-magnification-select-image: url('mag_seld.svg'); ---search-active-color: #C5C5C5; ---search-filter-background-color: #101826; ---search-filter-foreground-color: #90A5CE; ---search-filter-border-color: #7C95C6; ---search-filter-highlight-text-color: #BCC9E2; ---search-filter-highlight-bg-color: #283A5D; ---search-results-background-color: #101826; ---search-results-foreground-color: #90A5CE; ---search-results-border-color: #7C95C6; ---search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; - -/** code fragments */ ---code-keyword-color: #CC99CD; ---code-type-keyword-color: #AB99CD; ---code-flow-keyword-color: #E08000; ---code-comment-color: #717790; ---code-preprocessor-color: #65CABE; ---code-string-literal-color: #7EC699; ---code-char-literal-color: #00E0F0; ---code-xml-cdata-color: #C9D1D9; ---code-vhdl-digit-color: #FF00FF; ---code-vhdl-char-color: #C0C0C0; ---code-vhdl-keyword-color: #CF53C9; ---code-vhdl-logic-color: #FF0000; ---code-link-color: #79C0FF; ---code-external-link-color: #79C0FF; ---fragment-foreground-color: #C9D1D9; ---fragment-background-color: black; ---fragment-border-color: #30363D; ---fragment-lineno-border-color: #30363D; ---fragment-lineno-background-color: black; ---fragment-lineno-foreground-color: #6E7681; ---fragment-lineno-link-fg-color: #6E7681; ---fragment-lineno-link-bg-color: #303030; ---fragment-lineno-link-hover-fg-color: #8E96A1; ---fragment-lineno-link-hover-bg-color: #505050; ---fragment-copy-ok-color: #0EA80E; ---tooltip-foreground-color: #C9D1D9; ---tooltip-background-color: #202020; ---tooltip-border-color: #C9D1D9; ---tooltip-doc-color: #D9E1E9; ---tooltip-declaration-color: #20C348; ---tooltip-link-color: #79C0FF; ---tooltip-shadow: none; ---fold-line-color: #808080; ---fold-minus-image: url('minusd.svg'); ---fold-plus-image: url('plusd.svg'); ---fold-minus-image-relpath: url('../../minusd.svg'); ---fold-plus-image-relpath: url('../../plusd.svg'); - -/** font-family */ ---font-family-normal: Roboto,sans-serif; ---font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; ---font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; ---font-family-title: Tahoma,Arial,sans-serif; ---font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; ---font-family-search: Arial,Verdana,sans-serif; ---font-family-icon: Arial,Helvetica; ---font-family-tooltip: Roboto,sans-serif; - -}} -body { - background-color: var(--page-background-color); - color: var(--page-foreground-color); -} - -body, table, div, p, dl { - font-weight: 400; - font-size: 14px; - font-family: var(--font-family-normal); - line-height: 22px; -} - -/* @group Heading Levels */ - -.title { - font-weight: 400; - font-size: 14px; - font-family: var(--font-family-normal); - line-height: 28px; - font-size: 150%; - font-weight: bold; - margin: 10px 2px; -} - -h1.groupheader { - font-size: 150%; -} - -h2.groupheader { - border-bottom: 1px solid var(--group-header-separator-color); - color: var(--group-header-color); - font-size: 150%; - font-weight: normal; - margin-top: 1.75em; - padding-top: 8px; - padding-bottom: 4px; - width: 100%; -} - -h3.groupheader { - font-size: 100%; -} - -h1, h2, h3, h4, h5, h6 { - -webkit-transition: text-shadow 0.5s linear; - -moz-transition: text-shadow 0.5s linear; - -ms-transition: text-shadow 0.5s linear; - -o-transition: text-shadow 0.5s linear; - transition: text-shadow 0.5s linear; - margin-right: 15px; -} - -h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { - text-shadow: 0 0 15px var(--glow-color); -} - -dt { - font-weight: bold; -} - -p.startli, p.startdd { - margin-top: 2px; -} - -th p.starttd, th p.intertd, th p.endtd { - font-size: 100%; - font-weight: 700; -} - -p.starttd { - margin-top: 0px; -} - -p.endli { - margin-bottom: 0px; -} - -p.enddd { - margin-bottom: 4px; -} - -p.endtd { - margin-bottom: 2px; -} - -p.interli { -} - -p.interdd { -} - -p.intertd { -} - -/* @end */ - -caption { - font-weight: bold; -} - -span.legend { - font-size: 70%; - text-align: center; -} - -h3.version { - font-size: 90%; - text-align: center; -} - -div.navtab { - padding-right: 15px; - text-align: right; - line-height: 110%; -} - -div.navtab table { - border-spacing: 0; -} - -td.navtab { - padding-right: 6px; - padding-left: 6px; -} - -td.navtabHL { - background-image: var(--nav-gradient-active-image); - background-repeat:repeat-x; - padding-right: 6px; - padding-left: 6px; -} - -td.navtabHL a, td.navtabHL a:visited { - color: var(--nav-text-hover-color); - text-shadow: var(--nav-text-hover-shadow); -} - -a.navtab { - font-weight: bold; -} - -div.qindex{ - text-align: center; - width: 100%; - line-height: 140%; - font-size: 130%; - color: var(--index-separator-color); -} - -#main-menu a:focus { - outline: auto; - z-index: 10; - position: relative; -} - -dt.alphachar{ - font-size: 180%; - font-weight: bold; -} - -.alphachar a{ - color: var(--index-header-color); -} - -.alphachar a:hover, .alphachar a:visited{ - text-decoration: none; -} - -.classindex dl { - padding: 25px; - column-count:1 -} - -.classindex dd { - display:inline-block; - margin-left: 50px; - width: 90%; - line-height: 1.15em; -} - -.classindex dl.even { - background-color: var(--index-even-item-bg-color); -} - -.classindex dl.odd { - background-color: var(--index-odd-item-bg-color); -} - -@media(min-width: 1120px) { - .classindex dl { - column-count:2 - } -} - -@media(min-width: 1320px) { - .classindex dl { - column-count:3 - } -} - - -/* @group Link Styling */ - -a { - color: var(--page-link-color); - font-weight: normal; - text-decoration: none; -} - -.contents a:visited { - color: var(--page-visited-link-color); -} - -a:hover { - text-decoration: underline; -} - -a.el { - font-weight: bold; -} - -a.elRef { -} - -a.code, a.code:visited, a.line, a.line:visited { - color: var(--code-link-color); -} - -a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { - color: var(--code-external-link-color); -} - -a.code.hl_class { /* style for links to class names in code snippets */ } -a.code.hl_struct { /* style for links to struct names in code snippets */ } -a.code.hl_union { /* style for links to union names in code snippets */ } -a.code.hl_interface { /* style for links to interface names in code snippets */ } -a.code.hl_protocol { /* style for links to protocol names in code snippets */ } -a.code.hl_category { /* style for links to category names in code snippets */ } -a.code.hl_exception { /* style for links to exception names in code snippets */ } -a.code.hl_service { /* style for links to service names in code snippets */ } -a.code.hl_singleton { /* style for links to singleton names in code snippets */ } -a.code.hl_concept { /* style for links to concept names in code snippets */ } -a.code.hl_namespace { /* style for links to namespace names in code snippets */ } -a.code.hl_package { /* style for links to package names in code snippets */ } -a.code.hl_define { /* style for links to macro names in code snippets */ } -a.code.hl_function { /* style for links to function names in code snippets */ } -a.code.hl_variable { /* style for links to variable names in code snippets */ } -a.code.hl_typedef { /* style for links to typedef names in code snippets */ } -a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } -a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } -a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } -a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } -a.code.hl_friend { /* style for links to friend names in code snippets */ } -a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } -a.code.hl_property { /* style for links to property names in code snippets */ } -a.code.hl_event { /* style for links to event names in code snippets */ } -a.code.hl_sequence { /* style for links to sequence names in code snippets */ } -a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } - -/* @end */ - -dl.el { - margin-left: -1cm; -} - -ul { - overflow: visible; -} - -ul.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; - column-count: 3; - list-style-type: none; -} - -#side-nav ul { - overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ -} - -#main-nav ul { - overflow: visible; /* reset ul rule for the navigation bar drop down lists */ -} - -.fragment { - text-align: left; - direction: ltr; - overflow-x: auto; - overflow-y: hidden; - position: relative; - min-height: 28px; - margin: 4px 4px 4px 2px; - padding: 2px 2px 3px 2px; - border: 1px solid var(--fragment-border-color); - background-color: var(--fragment-background-color); - border-radius : 2px; - color: var(--fragment-foreground-color); -} - -pre.fragment { - word-wrap: break-word; - font-size: 10pt; - line-height: 125%; - font-family: var(--font-family-monospace); -} - -.clipboard { - width: 24px; - height: 24px; - right: 5px; - top: 5px; - opacity: 0; - position: absolute; - display: inline; - overflow: auto; - fill: var(--fragment-foreground-color); - justify-content: center; - align-items: center; - cursor: pointer; -} - -.clipboard.success { - border: 1px solid var(--fragment-foreground-color); - border-radius: 4px; -} - -.fragment:hover .clipboard, .clipboard.success { - opacity: .28; -} - -.clipboard:hover, .clipboard.success { - opacity: 1 !important; -} - -.clipboard:active:not([class~=success]) svg { - transform: scale(.91); -} - -.clipboard.success svg { - fill: var(--fragment-copy-ok-color); -} - -.clipboard.success { - border-color: var(--fragment-copy-ok-color); -} - -div.line { - font-family: var(--font-family-monospace); - font-size: 13px; - min-height: 13px; - line-height: 1.2; - text-wrap: unrestricted; - white-space: -moz-pre-wrap; /* Moz */ - white-space: -pre-wrap; /* Opera 4-6 */ - white-space: -o-pre-wrap; /* Opera 7 */ - white-space: pre-wrap; /* CSS3 */ - word-wrap: break-word; /* IE 5.5+ */ - text-indent: -53px; - padding-left: 53px; - padding-bottom: 0px; - margin: 0px; - -webkit-transition-property: background-color, box-shadow; - -webkit-transition-duration: 0.5s; - -moz-transition-property: background-color, box-shadow; - -moz-transition-duration: 0.5s; - -ms-transition-property: background-color, box-shadow; - -ms-transition-duration: 0.5s; - -o-transition-property: background-color, box-shadow; - -o-transition-duration: 0.5s; - transition-property: background-color, box-shadow; - transition-duration: 0.5s; -} - -div.line:after { - content:"\000A"; - white-space: pre; -} - -div.line.glow { - background-color: var(--glow-color); - box-shadow: 0 0 10px var(--glow-color); -} - -span.fold { - margin-left: 5px; - margin-right: 1px; - margin-top: 0px; - margin-bottom: 0px; - padding: 0px; - display: inline-block; - width: 12px; - height: 12px; - background-repeat:no-repeat; - background-position:center; -} - -span.lineno { - padding-right: 4px; - margin-right: 9px; - text-align: right; - border-right: 2px solid var(--fragment-lineno-border-color); - color: var(--fragment-lineno-foreground-color); - background-color: var(--fragment-lineno-background-color); - white-space: pre; -} -span.lineno a, span.lineno a:visited { - color: var(--fragment-lineno-link-fg-color); - background-color: var(--fragment-lineno-link-bg-color); -} - -span.lineno a:hover { - color: var(--fragment-lineno-link-hover-fg-color); - background-color: var(--fragment-lineno-link-hover-bg-color); -} - -.lineno { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -div.classindex ul { - list-style: none; - padding-left: 0; -} - -div.classindex span.ai { - display: inline-block; -} - -div.groupHeader { - margin-left: 16px; - margin-top: 12px; - font-weight: bold; -} - -div.groupText { - margin-left: 16px; - font-style: italic; -} - -body { - color: var(--page-foreground-color); - margin: 0; -} - -div.contents { - margin-top: 10px; - margin-left: 12px; - margin-right: 8px; -} - -p.formulaDsp { - text-align: center; -} - -img.dark-mode-visible { - display: none; -} -img.light-mode-visible { - display: none; -} - -img.formulaDsp { - -} - -img.formulaInl, img.inline { - vertical-align: middle; -} - -div.center { - text-align: center; - margin-top: 0px; - margin-bottom: 0px; - padding: 0px; -} - -div.center img { - border: 0px; -} - -address.footer { - text-align: right; - padding-right: 12px; -} - -img.footer { - border: 0px; - vertical-align: middle; - width: var(--footer-logo-width); -} - -.compoundTemplParams { - color: var(--memdecl-template-color); - font-size: 80%; - line-height: 120%; -} - -/* @group Code Colorization */ - -span.keyword { - color: var(--code-keyword-color); -} - -span.keywordtype { - color: var(--code-type-keyword-color); -} - -span.keywordflow { - color: var(--code-flow-keyword-color); -} - -span.comment { - color: var(--code-comment-color); -} - -span.preprocessor { - color: var(--code-preprocessor-color); -} - -span.stringliteral { - color: var(--code-string-literal-color); -} - -span.charliteral { - color: var(--code-char-literal-color); -} - -span.xmlcdata { - color: var(--code-xml-cdata-color); -} - -span.vhdldigit { - color: var(--code-vhdl-digit-color); -} - -span.vhdlchar { - color: var(--code-vhdl-char-color); -} - -span.vhdlkeyword { - color: var(--code-vhdl-keyword-color); -} - -span.vhdllogic { - color: var(--code-vhdl-logic-color); -} - -blockquote { - background-color: var(--blockquote-background-color); - border-left: 2px solid var(--blockquote-border-color); - margin: 0 24px 0 4px; - padding: 0 12px 0 16px; -} - -/* @end */ - -td.tiny { - font-size: 75%; -} - -.dirtab { - padding: 4px; - border-collapse: collapse; - border: 1px solid var(--table-cell-border-color); -} - -th.dirtab { - background-color: var(--table-header-background-color); - color: var(--table-header-foreground-color); - font-weight: bold; -} - -hr { - height: 0px; - border: none; - border-top: 1px solid var(--separator-color); -} - -hr.footer { - height: 1px; -} - -/* @group Member Descriptions */ - -table.memberdecls { - border-spacing: 0px; - padding: 0px; -} - -.memberdecls td, .fieldtable tr { - -webkit-transition-property: background-color, box-shadow; - -webkit-transition-duration: 0.5s; - -moz-transition-property: background-color, box-shadow; - -moz-transition-duration: 0.5s; - -ms-transition-property: background-color, box-shadow; - -ms-transition-duration: 0.5s; - -o-transition-property: background-color, box-shadow; - -o-transition-duration: 0.5s; - transition-property: background-color, box-shadow; - transition-duration: 0.5s; -} - -.memberdecls td.glow, .fieldtable tr.glow { - background-color: var(--glow-color); - box-shadow: 0 0 15px var(--glow-color); -} - -.mdescLeft, .mdescRight, -.memItemLeft, .memItemRight, -.memTemplItemLeft, .memTemplItemRight, .memTemplParams { - background-color: var(--memdecl-background-color); - border: none; - margin: 4px; - padding: 1px 0 0 8px; -} - -.mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - color: var(--memdecl-foreground-color); -} - -.memSeparator { - border-bottom: 1px solid var(--memdecl-separator-color); - line-height: 1px; - margin: 0px; - padding: 0px; -} - -.memItemLeft, .memTemplItemLeft { - white-space: nowrap; -} - -.memItemRight, .memTemplItemRight { - width: 100%; -} - -.memTemplParams { - color: var(--memdecl-template-color); - white-space: nowrap; - font-size: 80%; -} - -/* @end */ - -/* @group Member Details */ - -/* Styles for detailed member documentation */ - -.memtitle { - padding: 8px; - border-top: 1px solid var(--memdef-border-color); - border-left: 1px solid var(--memdef-border-color); - border-right: 1px solid var(--memdef-border-color); - border-top-right-radius: 4px; - border-top-left-radius: 4px; - margin-bottom: -1px; - background-image: var(--memdef-title-gradient-image); - background-repeat: repeat-x; - background-color: var(--memdef-title-background-color); - line-height: 1.25; - font-weight: 300; - float:left; -} - -.permalink -{ - font-size: 65%; - display: inline-block; - vertical-align: middle; -} - -.memtemplate { - font-size: 80%; - color: var(--memdef-template-color); - font-weight: normal; - margin-left: 9px; -} - -.mempage { - width: 100%; -} - -.memitem { - padding: 0; - margin-bottom: 10px; - margin-right: 5px; - -webkit-transition: box-shadow 0.5s linear; - -moz-transition: box-shadow 0.5s linear; - -ms-transition: box-shadow 0.5s linear; - -o-transition: box-shadow 0.5s linear; - transition: box-shadow 0.5s linear; - display: table !important; - width: 100%; -} - -.memitem.glow { - box-shadow: 0 0 15px var(--glow-color); -} - -.memname { - font-weight: 400; - margin-left: 6px; -} - -.memname td { - vertical-align: bottom; -} - -.memproto, dl.reflist dt { - border-top: 1px solid var(--memdef-border-color); - border-left: 1px solid var(--memdef-border-color); - border-right: 1px solid var(--memdef-border-color); - padding: 6px 0px 6px 0px; - color: var(--memdef-proto-text-color); - font-weight: bold; - text-shadow: var(--memdef-proto-text-shadow); - background-color: var(--memdef-proto-background-color); - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - border-top-right-radius: 4px; -} - -.overload { - font-family: var(--font-family-monospace); - font-size: 65%; -} - -.memdoc, dl.reflist dd { - border-bottom: 1px solid var(--memdef-border-color); - border-left: 1px solid var(--memdef-border-color); - border-right: 1px solid var(--memdef-border-color); - padding: 6px 10px 2px 10px; - border-top-width: 0; - background-image:url('nav_g.png'); - background-repeat:repeat-x; - background-color: var(--memdef-doc-background-color); - /* opera specific markup */ - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - /* firefox specific markup */ - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-bottomright: 4px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - /* webkit specific markup */ - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -} - -dl.reflist dt { - padding: 5px; -} - -dl.reflist dd { - margin: 0px 0px 10px 0px; - padding: 5px; -} - -.paramkey { - text-align: right; -} - -.paramtype { - white-space: nowrap; -} - -.paramname { - color: var(--memdef-param-name-color); - white-space: nowrap; -} -.paramname em { - font-style: normal; -} -.paramname code { - line-height: 14px; -} - -.params, .retval, .exception, .tparams { - margin-left: 0px; - padding-left: 0px; -} - -.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { - font-weight: bold; - vertical-align: top; -} - -.params .paramtype, .tparams .paramtype { - font-style: italic; - vertical-align: top; -} - -.params .paramdir, .tparams .paramdir { - font-family: var(--font-family-monospace); - vertical-align: top; -} - -table.mlabels { - border-spacing: 0px; -} - -td.mlabels-left { - width: 100%; - padding: 0px; -} - -td.mlabels-right { - vertical-align: bottom; - padding: 0px; - white-space: nowrap; -} - -span.mlabels { - margin-left: 8px; -} - -span.mlabel { - background-color: var(--label-background-color); - border-top:1px solid var(--label-left-top-border-color); - border-left:1px solid var(--label-left-top-border-color); - border-right:1px solid var(--label-right-bottom-border-color); - border-bottom:1px solid var(--label-right-bottom-border-color); - text-shadow: none; - color: var(--label-foreground-color); - margin-right: 4px; - padding: 2px 3px; - border-radius: 3px; - font-size: 7pt; - white-space: nowrap; - vertical-align: middle; -} - - - -/* @end */ - -/* these are for tree view inside a (index) page */ - -div.directory { - margin: 10px 0px; - border-top: 1px solid var(--directory-separator-color); - border-bottom: 1px solid var(--directory-separator-color); - width: 100%; -} - -.directory table { - border-collapse:collapse; -} - -.directory td { - margin: 0px; - padding: 0px; - vertical-align: top; -} - -.directory td.entry { - white-space: nowrap; - padding-right: 6px; - padding-top: 3px; -} - -.directory td.entry a { - outline:none; -} - -.directory td.entry a img { - border: none; -} - -.directory td.desc { - width: 100%; - padding-left: 6px; - padding-right: 6px; - padding-top: 3px; - border-left: 1px solid rgba(0,0,0,0.05); -} - -.directory tr.odd { - padding-left: 6px; - background-color: var(--index-odd-item-bg-color); -} - -.directory tr.even { - padding-left: 6px; - background-color: var(--index-even-item-bg-color); -} - -.directory img { - vertical-align: -30%; -} - -.directory .levels { - white-space: nowrap; - width: 100%; - text-align: right; - font-size: 9pt; -} - -.directory .levels span { - cursor: pointer; - padding-left: 2px; - padding-right: 2px; - color: var(--page-link-color); -} - -.arrow { - color: var(--nav-arrow-color); - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - cursor: pointer; - font-size: 80%; - display: inline-block; - width: 16px; - height: 22px; -} - -.icon { - font-family: var(--font-family-icon); - line-height: normal; - font-weight: bold; - font-size: 12px; - height: 14px; - width: 16px; - display: inline-block; - background-color: var(--icon-background-color); - color: var(--icon-foreground-color); - text-align: center; - border-radius: 4px; - margin-left: 2px; - margin-right: 2px; -} - -.icona { - width: 24px; - height: 22px; - display: inline-block; -} - -.iconfopen { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:var(--icon-folder-open-image); - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -.iconfclosed { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:var(--icon-folder-closed-image); - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -.icondoc { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:var(--icon-doc-image); - background-position: 0px -4px; - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -/* @end */ - -div.dynheader { - margin-top: 8px; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -address { - font-style: normal; - color: var(--footer-foreground-color); -} - -table.doxtable caption { - caption-side: top; -} - -table.doxtable { - border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; -} - -table.doxtable td, table.doxtable th { - border: 1px solid var(--table-cell-border-color); - padding: 3px 7px 2px; -} - -table.doxtable th { - background-color: var(--table-header-background-color); - color: var(--table-header-foreground-color); - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; -} - -table.fieldtable { - margin-bottom: 10px; - border: 1px solid var(--memdef-border-color); - border-spacing: 0px; - border-radius: 4px; - box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); -} - -.fieldtable td, .fieldtable th { - padding: 3px 7px 2px; -} - -.fieldtable td.fieldtype, .fieldtable td.fieldname { - white-space: nowrap; - border-right: 1px solid var(--memdef-border-color); - border-bottom: 1px solid var(--memdef-border-color); - vertical-align: top; -} - -.fieldtable td.fieldname { - padding-top: 3px; -} - -.fieldtable td.fielddoc { - border-bottom: 1px solid var(--memdef-border-color); -} - -.fieldtable td.fielddoc p:first-child { - margin-top: 0px; -} - -.fieldtable td.fielddoc p:last-child { - margin-bottom: 2px; -} - -.fieldtable tr:last-child td { - border-bottom: none; -} - -.fieldtable th { - background-image: var(--memdef-title-gradient-image); - background-repeat:repeat-x; - background-color: var(--memdef-title-background-color); - font-size: 90%; - color: var(--memdef-proto-text-color); - padding-bottom: 4px; - padding-top: 5px; - text-align:left; - font-weight: 400; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom: 1px solid var(--memdef-border-color); -} - - -.tabsearch { - top: 0px; - left: 10px; - height: 36px; - background-image: var(--nav-gradient-image); - z-index: 101; - overflow: hidden; - font-size: 13px; -} - -.navpath ul -{ - font-size: 11px; - background-image: var(--nav-gradient-image); - background-repeat:repeat-x; - background-position: 0 -5px; - height:30px; - line-height:30px; - color:var(--nav-text-normal-color); - border:solid 1px var(--nav-breadcrumb-border-color); - overflow:hidden; - margin:0px; - padding:0px; -} - -.navpath li -{ - list-style-type:none; - float:left; - padding-left:10px; - padding-right:15px; - background-image:var(--nav-breadcrumb-image); - background-repeat:no-repeat; - background-position:right; - color: var(--nav-foreground-color); -} - -.navpath li.navelem a -{ - height:32px; - display:block; - text-decoration: none; - outline: none; - color: var(--nav-text-normal-color); - font-family: var(--font-family-nav); - text-shadow: var(--nav-text-normal-shadow); - text-decoration: none; -} - -.navpath li.navelem a:hover -{ - color: var(--nav-text-hover-color); - text-shadow: var(--nav-text-hover-shadow); -} - -.navpath li.footer -{ - list-style-type:none; - float:right; - padding-left:10px; - padding-right:15px; - background-image:none; - background-repeat:no-repeat; - background-position:right; - color: var(--footer-foreground-color); - font-size: 8pt; -} - - -div.summary -{ - float: right; - font-size: 8pt; - padding-right: 5px; - width: 50%; - text-align: right; -} - -div.summary a -{ - white-space: nowrap; -} - -table.classindex -{ - margin: 10px; - white-space: nowrap; - margin-left: 3%; - margin-right: 3%; - width: 94%; - border: 0; - border-spacing: 0; - padding: 0; -} - -div.ingroups -{ - font-size: 8pt; - width: 50%; - text-align: left; -} - -div.ingroups a -{ - white-space: nowrap; -} - -div.header -{ - background-image: var(--header-gradient-image); - background-repeat:repeat-x; - background-color: var(--header-background-color); - margin: 0px; - border-bottom: 1px solid var(--header-separator-color); -} - -div.headertitle -{ - padding: 5px 5px 5px 10px; -} - -.PageDocRTL-title div.headertitle { - text-align: right; - direction: rtl; -} - -dl { - padding: 0 0 0 0; -} - -/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ -dl.section { - margin-left: 0px; - padding-left: 0px; -} - -dl.note { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #D0C000; -} - -dl.warning, dl.attention { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #FF0000; -} - -dl.pre, dl.post, dl.invariant { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #00D000; -} - -dl.deprecated { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #505050; -} - -dl.todo { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #00C0E0; -} - -dl.test { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #3030E0; -} - -dl.bug { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #C08050; -} - -dl.section dd { - margin-bottom: 6px; -} - - -#projectrow -{ - height: 56px; -} - -#projectlogo -{ - text-align: center; - vertical-align: bottom; - border-collapse: separate; -} - -#projectlogo img -{ - border: 0px none; -} - -#projectalign -{ - vertical-align: middle; - padding-left: 0.5em; -} - -#projectname -{ - font-size: 200%; - font-family: var(--font-family-title); - margin: 0px; - padding: 2px 0px; -} - -#projectbrief -{ - font-size: 90%; - font-family: var(--font-family-title); - margin: 0px; - padding: 0px; -} - -#projectnumber -{ - font-size: 50%; - font-family: 50% var(--font-family-title); - margin: 0px; - padding: 0px; -} - -#titlearea -{ - padding: 0px; - margin: 0px; - width: 100%; - border-bottom: 1px solid var(--title-separator-color); - background-color: var(--title-background-color); -} - -.image -{ - text-align: center; -} - -.dotgraph -{ - text-align: center; -} - -.mscgraph -{ - text-align: center; -} - -.plantumlgraph -{ - text-align: center; -} - -.diagraph -{ - text-align: center; -} - -.caption -{ - font-weight: bold; -} - -dl.citelist { - margin-bottom:50px; -} - -dl.citelist dt { - color:var(--citation-label-color); - float:left; - font-weight:bold; - margin-right:10px; - padding:5px; - text-align:right; - width:52px; -} - -dl.citelist dd { - margin:2px 0 2px 72px; - padding:5px 0; -} - -div.toc { - padding: 14px 25px; - background-color: var(--toc-background-color); - border: 1px solid var(--toc-border-color); - border-radius: 7px 7px 7px 7px; - float: right; - height: auto; - margin: 0 8px 10px 10px; - width: 200px; -} - -div.toc li { - background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; - font: 10px/1.2 var(--font-family-toc); - margin-top: 5px; - padding-left: 10px; - padding-top: 2px; -} - -div.toc h3 { - font: bold 12px/1.2 var(--font-family-toc); - color: var(--toc-header-color); - border-bottom: 0 none; - margin: 0; -} - -div.toc ul { - list-style: none outside none; - border: medium none; - padding: 0px; -} - -div.toc li.level1 { - margin-left: 0px; -} - -div.toc li.level2 { - margin-left: 15px; -} - -div.toc li.level3 { - margin-left: 15px; -} - -div.toc li.level4 { - margin-left: 15px; -} - -span.emoji { - /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html - * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; - */ -} - -span.obfuscator { - display: none; -} - -.inherit_header { - font-weight: bold; - color: var(--inherit-header-color); - cursor: pointer; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.inherit_header td { - padding: 6px 0px 2px 5px; -} - -.inherit { - display: none; -} - -tr.heading h2 { - margin-top: 12px; - margin-bottom: 4px; -} - -/* tooltip related style info */ - -.ttc { - position: absolute; - display: none; -} - -#powerTip { - cursor: default; - /*white-space: nowrap;*/ - color: var(--tooltip-foreground-color); - background-color: var(--tooltip-background-color); - border: 1px solid var(--tooltip-border-color); - border-radius: 4px 4px 4px 4px; - box-shadow: var(--tooltip-shadow); - display: none; - font-size: smaller; - max-width: 80%; - opacity: 0.9; - padding: 1ex 1em 1em; - position: absolute; - z-index: 2147483647; -} - -#powerTip div.ttdoc { - color: var(--tooltip-doc-color); - font-style: italic; -} - -#powerTip div.ttname a { - font-weight: bold; -} - -#powerTip a { - color: var(--tooltip-link-color); -} - -#powerTip div.ttname { - font-weight: bold; -} - -#powerTip div.ttdeci { - color: var(--tooltip-declaration-color); -} - -#powerTip div { - margin: 0px; - padding: 0px; - font-size: 12px; - font-family: var(--font-family-tooltip); - line-height: 16px; -} - -#powerTip:before, #powerTip:after { - content: ""; - position: absolute; - margin: 0px; -} - -#powerTip.n:after, #powerTip.n:before, -#powerTip.s:after, #powerTip.s:before, -#powerTip.w:after, #powerTip.w:before, -#powerTip.e:after, #powerTip.e:before, -#powerTip.ne:after, #powerTip.ne:before, -#powerTip.se:after, #powerTip.se:before, -#powerTip.nw:after, #powerTip.nw:before, -#powerTip.sw:after, #powerTip.sw:before { - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; -} - -#powerTip.n:after, #powerTip.s:after, -#powerTip.w:after, #powerTip.e:after, -#powerTip.nw:after, #powerTip.ne:after, -#powerTip.sw:after, #powerTip.se:after { - border-color: rgba(255, 255, 255, 0); -} - -#powerTip.n:before, #powerTip.s:before, -#powerTip.w:before, #powerTip.e:before, -#powerTip.nw:before, #powerTip.ne:before, -#powerTip.sw:before, #powerTip.se:before { - border-color: rgba(128, 128, 128, 0); -} - -#powerTip.n:after, #powerTip.n:before, -#powerTip.ne:after, #powerTip.ne:before, -#powerTip.nw:after, #powerTip.nw:before { - top: 100%; -} - -#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { - border-top-color: var(--tooltip-background-color); - border-width: 10px; - margin: 0px -10px; -} -#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { - border-top-color: var(--tooltip-border-color); - border-width: 11px; - margin: 0px -11px; -} -#powerTip.n:after, #powerTip.n:before { - left: 50%; -} - -#powerTip.nw:after, #powerTip.nw:before { - right: 14px; -} - -#powerTip.ne:after, #powerTip.ne:before { - left: 14px; -} - -#powerTip.s:after, #powerTip.s:before, -#powerTip.se:after, #powerTip.se:before, -#powerTip.sw:after, #powerTip.sw:before { - bottom: 100%; -} - -#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { - border-bottom-color: var(--tooltip-background-color); - border-width: 10px; - margin: 0px -10px; -} - -#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { - border-bottom-color: var(--tooltip-border-color); - border-width: 11px; - margin: 0px -11px; -} - -#powerTip.s:after, #powerTip.s:before { - left: 50%; -} - -#powerTip.sw:after, #powerTip.sw:before { - right: 14px; -} - -#powerTip.se:after, #powerTip.se:before { - left: 14px; -} - -#powerTip.e:after, #powerTip.e:before { - left: 100%; -} -#powerTip.e:after { - border-left-color: var(--tooltip-border-color); - border-width: 10px; - top: 50%; - margin-top: -10px; -} -#powerTip.e:before { - border-left-color: var(--tooltip-border-color); - border-width: 11px; - top: 50%; - margin-top: -11px; -} - -#powerTip.w:after, #powerTip.w:before { - right: 100%; -} -#powerTip.w:after { - border-right-color: var(--tooltip-border-color); - border-width: 10px; - top: 50%; - margin-top: -10px; -} -#powerTip.w:before { - border-right-color: var(--tooltip-border-color); - border-width: 11px; - top: 50%; - margin-top: -11px; -} - -@media print -{ - #top { display: none; } - #side-nav { display: none; } - #nav-path { display: none; } - body { overflow:visible; } - h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } - .summary { display: none; } - .memitem { page-break-inside: avoid; } - #doc-content - { - margin-left:0 !important; - height:auto !important; - width:auto !important; - overflow:inherit; - display:inline; - } -} - -/* @group Markdown */ - -table.markdownTable { - border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; -} - -table.markdownTable td, table.markdownTable th { - border: 1px solid var(--table-cell-border-color); - padding: 3px 7px 2px; -} - -table.markdownTable tr { -} - -th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { - background-color: var(--table-header-background-color); - color: var(--table-header-foreground-color); - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; -} - -th.markdownTableHeadLeft, td.markdownTableBodyLeft { - text-align: left -} - -th.markdownTableHeadRight, td.markdownTableBodyRight { - text-align: right -} - -th.markdownTableHeadCenter, td.markdownTableBodyCenter { - text-align: center -} - -tt, code, kbd, samp -{ - display: inline-block; -} -/* @end */ - -u { - text-decoration: underline; -} - -details>summary { - list-style-type: none; -} - -details > summary::-webkit-details-marker { - display: none; -} - -details>summary::before { - content: "\25ba"; - padding-right:4px; - font-size: 80%; -} - -details[open]>summary::before { - content: "\25bc"; - padding-right:4px; - font-size: 80%; -} - -body { - scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); -} - -::-webkit-scrollbar { - background-color: var(--scrollbar-background-color); - height: 12px; - width: 12px; -} -::-webkit-scrollbar-thumb { - border-radius: 6px; - box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); - border: solid 2px transparent; -} -::-webkit-scrollbar-corner { - background-color: var(--scrollbar-background-color); -} - diff --git a/documentation/html/doxygen.svg b/documentation/html/doxygen.svg deleted file mode 100644 index 79a76354..00000000 --- a/documentation/html/doxygen.svg +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/documentation/html/dynsections.js b/documentation/html/dynsections.js deleted file mode 100644 index 8f493264..00000000 --- a/documentation/html/dynsections.js +++ /dev/null @@ -1,194 +0,0 @@ -/* - @licstart The following is the entire license notice for the JavaScript code in this file. - - The MIT License (MIT) - - Copyright (C) 1997-2020 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software - and associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, - sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or - substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice for the JavaScript code in this file - */ - -let dynsection = { - - // helper function - updateStripes : function() { - $('table.directory tr'). - removeClass('even').filter(':visible:even').addClass('even'); - $('table.directory tr'). - removeClass('odd').filter(':visible:odd').addClass('odd'); - }, - - toggleVisibility : function(linkObj) { - const base = $(linkObj).attr('id'); - const summary = $('#'+base+'-summary'); - const content = $('#'+base+'-content'); - const trigger = $('#'+base+'-trigger'); - const src=$(trigger).attr('src'); - if (content.is(':visible')===true) { - content.hide(); - summary.show(); - $(linkObj).addClass('closed').removeClass('opened'); - $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); - } else { - content.show(); - summary.hide(); - $(linkObj).removeClass('closed').addClass('opened'); - $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); - } - return false; - }, - - toggleLevel : function(level) { - $('table.directory tr').each(function() { - const l = this.id.split('_').length-1; - const i = $('#img'+this.id.substring(3)); - const a = $('#arr'+this.id.substring(3)); - if (l'); - // add vertical lines to other rows - $('span[class=lineno]').not(':eq(0)').append(''); - // add toggle controls to lines with fold divs - $('div[class=foldopen]').each(function() { - // extract specific id to use - const id = $(this).attr('id').replace('foldopen',''); - // extract start and end foldable fragment attributes - const start = $(this).attr('data-start'); - const end = $(this).attr('data-end'); - // replace normal fold span with controls for the first line of a foldable fragment - $(this).find('span[class=fold]:first').replaceWith(''); - // append div for folded (closed) representation - $(this).after(''); - // extract the first line from the "open" section to represent closed content - const line = $(this).children().first().clone(); - // remove any glow that might still be active on the original line - $(line).removeClass('glow'); - if (start) { - // if line already ends with a start marker (e.g. trailing {), remove it - $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); - } - // replace minus with plus symbol - $(line).find('span[class=fold]').css('background-image',codefold.plusImg[relPath]); - // append ellipsis - $(line).append(' '+start+''+end); - // insert constructed line into closed div - $('#foldclosed'+id).html(line); - }); - }, -}; -/* @license-end */ diff --git a/documentation/html/field__variable_8h_source.html b/documentation/html/field__variable_8h_source.html deleted file mode 100644 index 1b64e744..00000000 --- a/documentation/html/field__variable_8h_source.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/storage/field_variable.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    field_variable.h
    -
    -
    -
    1#pragma once
    -
    2
    -
    3#include <array>
    -
    4#include <vector>
    -
    5#include <cmath>
    -
    6#include <iostream>
    -
    7#include "array2D.h"
    -
    8
    -
    -
    17class FieldVariable : public Array2D
    -
    18{
    -
    19public:
    -
    27 FieldVariable(std::array<int, 2> size, std::array<double, 2> origin, std::array<double, 2> meshWidth);
    -
    28
    -
    37 double interpolateAt(double x, double y) const;
    -
    38
    -
    44 double findAbsMax() const;
    -
    45
    -
    46private:
    -
    47 const std::array<double, 2> origin_;
    -
    48 const std::array<double, 2> meshWidth_;
    -
    49};
    -
    -
    This class represents a 2D array of double values.
    Definition array2D.h:16
    -
    std::array< int, 2 > size() const
    get size of array in x and y direction
    Definition array2D.cpp:33
    -
    Discretization of a scalar function.
    Definition field_variable.h:18
    -
    double interpolateAt(double x, double y) const
    Interpolates value of field variable in domain using x and y coordinates.
    Definition field_variable.cpp:12
    -
    double findAbsMax() const
    Find point in Array2D of Fieldvariable with maximum value.
    Definition field_variable.cpp:55
    -
    FieldVariable(std::array< int, 2 > size, std::array< double, 2 > origin, std::array< double, 2 > meshWidth)
    Constructor.
    Definition field_variable.cpp:4
    -
    - - - - diff --git a/documentation/html/files.html b/documentation/html/files.html deleted file mode 100644 index af63bf73..00000000 --- a/documentation/html/files.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - -NumSim: File List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    File List
    -
    -
    -
    Here is a list of all documented files with brief descriptions:
    -
    [detail level 123]
    - - - - - - - - - - - - - - - - - - - - - - - - - -
      src
      boundary
     boundary.h
     mask.h
      discretization
     central_differences.h
     discretization.h
     donor_cell.h
     staggered_grid.h
      output_writer
     output_writer.h
     output_writer_paraview.h
     output_writer_text.h
      settings_parser
     settings.h
      solver
     gauss_seidel.h
     pressure_solver.h
     sor.h
      storage
     array2D.h
     field_variable.h
      surface
     fluid_tracer.h
     computation.h
    -
    -
    - - - - diff --git a/documentation/html/fluid__tracer_8h_source.html b/documentation/html/fluid__tracer_8h_source.html deleted file mode 100644 index 4ea31da6..00000000 --- a/documentation/html/fluid__tracer_8h_source.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/surface/fluid_tracer.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    fluid_tracer.h
    -
    -
    -
    1#pragma once
    -
    2
    -
    3#include <iostream>
    -
    4#include <memory>
    -
    5#include <cmath>
    -
    6#include <cassert>
    -
    7
    -
    8#include "../discretization/discretization.h"
    -
    9#include "../boundary/boundary.h"
    -
    10
    -
    11
    -
    - -
    13 public:
    -
    14 FluidTracer(int numParticlesperCell,
    -
    15 std::shared_ptr<Discretization> discretization,
    -
    16 std::shared_ptr<Mask> mask);
    -
    17
    -
    18 // Mainly for testing purposes
    -
    19 FluidTracer(std::vector<double> x, std::vector<double> y,
    -
    20 std::shared_ptr<Discretization> discretization,
    -
    21 std::shared_ptr<Mask> mask);
    -
    22
    -
    32 void moveParticles(double dt);
    -
    33
    -
    40 void createParticles(double positionSourceX, double positionSourceY);
    -
    41
    -
    47 int getNumberOfParticles() const;
    -
    48
    -
    49
    -
    56 std::array<double, 2> getParticlePosition(int i) const;
    -
    57
    -
    58 std::array<int, 2> cellOfParticle(int i);
    -
    59 int val2CellX(double xVal);
    -
    60 int val2CellY(double yVal);
    -
    61
    -
    62
    -
    63
    -
    64 // Only test
    -
    65 std::array<double, 2> updateParticle(int i, std::array<int, 2> idx, double dt, std::array<double,2> vel, int depth);
    -
    66 std::array<double, 2> moveParticles(double dt, std::array<double, 2> vel);
    -
    67
    -
    68
    -
    69 private:
    -
    77 void initializeFluidCell(int i, int j, int idx);
    -
    78
    -
    79 std::array<int, 2> updateParticle(int i, std::array<int, 2>, double dt, std::array<double,2> vel);
    -
    80
    -
    81
    -
    82 int numParticles_;
    -
    83 int numParticlesPerCell_; // <! is usually because of ceil larger then numParticlesPerCell>
    -
    84 double seedRelationDyDx_;
    -
    85 int n_x;
    -
    86 int n_y;
    -
    87
    -
    88 std::shared_ptr<Discretization> discretization_;
    -
    89 std::shared_ptr<Mask> mask_;
    -
    90 std::vector<double> x_;
    -
    91 std::vector<double> y_;
    -
    92
    -
    93
    -
    94};
    -
    -
    Definition fluid_tracer.h:12
    -
    std::array< double, 2 > getParticlePosition(int i) const
    Get the Particle Position, index starts at 0.
    Definition fluid_tracer.cpp:92
    -
    void moveParticles(double dt)
    Update the position of the particles according to the velocity field and sets mask accordingly.
    Definition fluid_tracer.cpp:97
    -
    void createParticles(double positionSourceX, double positionSourceY)
    can be used to create a source cell for particles
    Definition fluid_tracer.cpp:64
    -
    int getNumberOfParticles() const
    Get the Number Of Particles object.
    Definition fluid_tracer.cpp:76
    -
    - - - - diff --git a/documentation/html/folderclosed.svg b/documentation/html/folderclosed.svg deleted file mode 100644 index b04bed2e..00000000 --- a/documentation/html/folderclosed.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - diff --git a/documentation/html/folderclosedd.svg b/documentation/html/folderclosedd.svg deleted file mode 100644 index 52f0166a..00000000 --- a/documentation/html/folderclosedd.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - diff --git a/documentation/html/folderopen.svg b/documentation/html/folderopen.svg deleted file mode 100644 index f6896dd2..00000000 --- a/documentation/html/folderopen.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - diff --git a/documentation/html/folderopend.svg b/documentation/html/folderopend.svg deleted file mode 100644 index 2d1f06e7..00000000 --- a/documentation/html/folderopend.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - diff --git a/documentation/html/functions.html b/documentation/html/functions.html deleted file mode 100644 index 7d966189..00000000 --- a/documentation/html/functions.html +++ /dev/null @@ -1,288 +0,0 @@ - - - - - - - -NumSim: Class Members - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented class members with links to the class documentation for each member:
    - -

    - a -

    - - -

    - b -

    - - -

    - c -

    - - -

    - d -

    - - -

    - e -

    - - -

    - f -

    - - -

    - g -

    - - -

    - i -

    - - -

    - j -

    - - -

    - l -

    - - -

    - m -

    - - -

    - n -

    - - -

    - o -

    - - -

    - p -

    - - -

    - r -

    - - -

    - s -

    - - -

    - t -

    - - -

    - u -

    - - -

    - v -

    - - -

    - w -

    -
    - - - - diff --git a/documentation/html/functions_func.html b/documentation/html/functions_func.html deleted file mode 100644 index 93a25a37..00000000 --- a/documentation/html/functions_func.html +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - - -NumSim: Class Members - Functions - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented functions with links to the class documentation for each member:
    - -

    - a -

    - - -

    - c -

    - - -

    - d -

    - - -

    - f -

    - - -

    - g -

    - - -

    - i -

    - - -

    - l -

    - - -

    - m -

    - - -

    - n -

    - - -

    - o -

    - - -

    - p -

    - - -

    - r -

    - - -

    - s -

    - - -

    - u -

    - - -

    - v -

    - - -

    - w -

    -
    - - - - diff --git a/documentation/html/functions_vars.html b/documentation/html/functions_vars.html deleted file mode 100644 index 6387eaf5..00000000 --- a/documentation/html/functions_vars.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - -NumSim: Class Members - Variables - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Here is a list of all documented variables with links to the class documentation for each member:
    - -

    - a -

    - - -

    - b -

    - - -

    - c -

    - - -

    - d -

    - - -

    - e -

    - - -

    - f -

    - - -

    - g -

    - - -

    - i -

    - - -

    - j -

    - - -

    - m -

    - - -

    - n -

    - - -

    - o -

    - - -

    - p -

    - - -

    - r -

    - - -

    - s -

    - - -

    - t -

    - - -

    - u -

    - - -

    - v -

    -
    - - - - diff --git a/documentation/html/gauss__seidel_8h_source.html b/documentation/html/gauss__seidel_8h_source.html deleted file mode 100644 index 53f54613..00000000 --- a/documentation/html/gauss__seidel_8h_source.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/gauss_seidel.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    gauss_seidel.h
    -
    -
    -
    1#pragma once
    -
    2
    -
    3#include "pressure_solver.h"
    -
    4#include <iostream>
    -
    5
    -
    - -
    12{
    -
    13
    -
    14public:
    -
    22 GaussSeidel(const std::shared_ptr<Discretization> &data,
    -
    23 double epsilon,
    -
    24 int maximumNumberOfIterations,
    -
    25 std::shared_ptr<Boundary> boundary);
    -
    30 void solve() override;
    -
    31};
    -
    -
    Standard Gauss-Seidel solver.
    Definition gauss_seidel.h:12
    -
    void solve() override
    override function that starts solver.
    Definition gauss_seidel.cpp:10
    -
    GaussSeidel(const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
    Constructor.
    Definition gauss_seidel.cpp:3
    -
    Solves the Poisson problem for the pressure.
    Definition pressure_solver.h:21
    -
    - - - - diff --git a/documentation/html/hierarchy.html b/documentation/html/hierarchy.html deleted file mode 100644 index f9bcc7fb..00000000 --- a/documentation/html/hierarchy.html +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - -NumSim: Class Hierarchy - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    Class Hierarchy
    -
    -
    -
    This inheritance list is sorted roughly, but not completely, alphabetically:
    -
    [detail level 123]
    - - - - - - - - - - - - - - - - - - -
     CArray2DThis class represents a 2D array of double values
     CFieldVariableDiscretization of a scalar function
     CBoundary
     CComputationComputation of Simulation
     CFluidTracer
     CSettings::LineContentContains the content of a single line in a file
     CMask
     COutputWriterInteface class for writing simulation data output
     COutputWriterParaviewWrite *.vti files that can be viewed with ParaView
     COutputWriterTextWrite *.txt files that are useful for debugging
     CPressureSolverSolves the Poisson problem for the pressure
     CGaussSeidelStandard Gauss-Seidel solver
     CSORSuccessive over-relaxation solver
     CSettingsAll settings that parametrize a simulation run
     CStaggeredGridCreate field variables and define limits for the indices
     CDiscretizationComputes derivatives included in governing equations
     CCentralDifferencesDiscretizes the problem using the central differences scheme
     CDonorCellDiscretizes the problem using the donor cell scheme
    -
    -
    - - - - diff --git a/documentation/html/index.html b/documentation/html/index.html deleted file mode 100644 index ea3c2329..00000000 --- a/documentation/html/index.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -NumSim: Main Page - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - -
    - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    NumSim Documentation
    -
    -
    -
    - - - - diff --git a/documentation/html/jquery.js b/documentation/html/jquery.js deleted file mode 100644 index 0ac00e20..00000000 --- a/documentation/html/jquery.js +++ /dev/null @@ -1,91 +0,0 @@ -/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 - * http://www.smartmenus.org/ - * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$});/*! - Cookie helper functions - Copyright (c) 2023 Dimitri van Heesch - Released under MIT license. -*/ -let Cookie = { - cookie_namespace: 'doxygen_', - - readSetting(cookie,defVal) { - if (window.chrome) { - const val = localStorage.getItem(this.cookie_namespace+cookie) || - sessionStorage.getItem(this.cookie_namespace+cookie); - if (val) return val; - } else { - let myCookie = this.cookie_namespace+cookie+"="; - if (document.cookie) { - const index = document.cookie.indexOf(myCookie); - if (index != -1) { - const valStart = index + myCookie.length; - let valEnd = document.cookie.indexOf(";", valStart); - if (valEnd == -1) { - valEnd = document.cookie.length; - } - return document.cookie.substring(valStart, valEnd); - } - } - } - return defVal; - }, - - writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete - if (window.chrome) { - if (days==0) { - sessionStorage.setItem(this.cookie_namespace+cookie,val); - } else { - localStorage.setItem(this.cookie_namespace+cookie,val); - } - } else { - let date = new Date(); - date.setTime(date.getTime()+(days*24*60*60*1000)); - const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; - document.cookie = this.cookie_namespace + cookie + "=" + - val + "; SameSite=Lax;" + expiration + "path=/"; - } - }, - - eraseSetting(cookie) { - if (window.chrome) { - if (localStorage.getItem(this.cookie_namespace+cookie)) { - localStorage.removeItem(this.cookie_namespace+cookie); - } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { - sessionStorage.removeItem(this.cookie_namespace+cookie); - } - } else { - this.writeSetting(cookie,'',-1); - } - }, -} diff --git a/documentation/html/mask_8h_source.html b/documentation/html/mask_8h_source.html deleted file mode 100644 index cca6e1bf..00000000 --- a/documentation/html/mask_8h_source.html +++ /dev/null @@ -1,228 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/boundary/mask.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    mask.h
    -
    -
    -
    1#pragma once
    -
    2
    -
    3#include <vector>
    -
    4#include <array>
    -
    5#include <cassert>
    -
    6#include <cmath>
    -
    7
    -
    8#include <iostream>
    -
    9#include <iomanip>
    -
    10#include <png.h>
    -
    11#include <fstream>
    -
    12#include "../settings_parser/settings.h"
    -
    13
    -
    -
    14class Mask
    -
    15{
    -
    16public:
    -
    22 Mask(Settings settings);
    -
    23
    -
    24 // TODO: it is weird but if we would use `char` instead of int, we would use less memory
    -
    25
    -
    26 enum CellType
    -
    27 {
    -
    28 FLUID_DROPLET = 0,
    -
    29
    -
    30 FLUID_SINGLE_LEFT = 1,
    -
    31 FLUID_SINGLE_TOP = 2,
    -
    32 FLUID_SINGLE_RIGHT = 4,
    -
    33 FLUID_SINGLE_BOTTOM = 8,
    -
    34
    -
    35 FLUID_CORNER_BOTTOM_LEFT = 6,
    -
    36 FLUID_CORNER_TOP_LEFT = 12,
    -
    37 FLUID_CORNER_TOP_RIGHT = 9,
    -
    38 FLUID_CORNER_BOTTOM_RIGHT = 3,
    -
    39
    -
    40 FLUID_COLUMN_HORIZONTAL = 5,
    -
    41 FLUID_COLUMN_VERTICAL = 10,
    -
    42
    -
    43 FLUID_BORDER_LEFT = 14,
    -
    44 FLUID_BORDER_TOP = 13,
    -
    45 FLUID_BORDER_RIGHT = 11,
    -
    46 FLUID_BORDER_BOTTOM = 7,
    -
    47
    -
    48 FLUID = 15,
    -
    49 FLUID_TYPE = 50,
    -
    50 AIR = 64,
    -
    51
    -
    52 OBSTACLE = 99,
    -
    53 OBSTACLE_INSIDE = 100,
    -
    54
    -
    55 OBSTACLE_BORDER_LEFT = 101,
    -
    56 OBSTACLE_BORDER_TOP = 102,
    -
    57 OBSTACLE_CORNER_TOP_LEFT = 103,
    -
    58 OBSTACLE_BORDER_RIGHT = 104,
    -
    59 OBSTACLE_CORNER_TOP_RIGHT = 106,
    -
    60 OBSTACLE_BORDER_BOTTOM = 108,
    -
    61 OBSTACLE_CORNER_BOTTOM_LEFT = 109,
    -
    62 OBSTACLE_CORNER_BOTTOM_RIGHT = 112,
    -
    63
    -
    64 DOMAIN_BOUNDARY = 200,
    -
    65
    -
    66 DOMAIN_LEFT_NOSLIP = 201,
    -
    67 DOMAIN_TOP_NOSLIP = 202,
    -
    68 DOMAIN_RIGHT_NOSLIP = 203,
    -
    69 DOMAIN_BOTTOM_NOSLIP = 204,
    -
    70
    -
    71 DOMAIN_LEFT_PRESSURE = 205,
    -
    72 DOMAIN_TOP_PRESSURE = 206,
    -
    73 DOMAIN_RIGHT_PRESSURE = 207,
    -
    74 DOMAIN_BOTTOM_PRESSURE = 208,
    -
    75 };
    -
    76
    -
    84 int &operator()(int i, int j);
    -
    85
    -
    93 int operator()(int i, int j) const;
    -
    94
    -
    98 std::array<int, 2> size() const;
    -
    99
    -
    104 void resetMask();
    -
    105
    -
    106 // ********************************************************
    -
    107 // R E Q U E S T S
    -
    108
    -
    117 bool isFluid(int i, int j) const;
    -
    118
    -
    125 bool isObstacle(int i, int j) const;
    -
    126
    -
    127
    -
    136 bool isAir(int i, int j) const;
    -
    137 bool isInnerFluid(int i, int j) const;
    -
    138
    -
    139
    -
    140 bool isDomainBoundary(int i, int j) const;
    -
    141 bool isObstacleBoundary(int i, int j) const;
    -
    142 bool isFluidBoundary(int i, int j) const;
    -
    143
    -
    144
    -
    151 int getNumberOfFluidCells() const;
    -
    152
    -
    153 // For initialization
    -
    154 void makeRectangularObstacle();
    -
    155 void createMaskFromPNGBitMap();
    -
    156
    -
    157
    -
    158
    -
    159
    -
    160 // Sets Enums for Boundary Types from type FLUID, AIR, OBSTACLE, DOMAIN
    -
    161 // - uses `settings` and neighbours
    -
    162 void setDomainBC();
    -
    163 void setObstacleBC();
    -
    164 void setFluidBC();
    -
    165
    -
    166 void printMask() const;
    -
    167
    -
    168
    -
    169protected:
    -
    170 std::array<int, 2> size_;
    -
    171 std::vector<int> data_;
    -
    172 std::vector<int> boundary_list;
    -
    173 Settings settings_;
    -
    174 int forbiddenObstacleFluidCombinations[7] = {105,107,110,111,113,114,115};
    -
    175};
    -
    -
    Definition mask.h:15
    -
    int getNumberOfFluidCells() const
    number of fluid cells
    Definition mask.cpp:78
    -
    std::vector< int > boundary_list
    stores the indices of the boundary cells
    Definition mask.h:172
    -
    bool isObstacle(int i, int j) const
    True if Cell at (i,j) is either obstacle or boundary.
    Definition mask.cpp:52
    -
    Mask(Settings settings)
    constructor.
    Definition mask.cpp:3
    -
    int & operator()(int i, int j)
    set array value. Overloads the () operator
    Definition mask.cpp:23
    -
    bool isAir(int i, int j) const
    Cell at (i,j) is a air cell or not.
    Definition mask.cpp:56
    -
    std::array< int, 2 > size_
    size of array in x and y direction
    Definition mask.h:170
    -
    bool isFluid(int i, int j) const
    Cell at (i,j) is fluid or not.
    Definition mask.cpp:48
    -
    std::array< int, 2 > size() const
    get size of array in x and y direction
    Definition mask.cpp:33
    -
    void resetMask()
    sets all not obstacle cells to air
    Definition mask.cpp:37
    -
    std::vector< int > data_
    storage array values, in row-major order
    Definition mask.h:171
    -
    All settings that parametrize a simulation run.
    Definition settings.h:14
    -
    - - - - diff --git a/documentation/html/menu.js b/documentation/html/menu.js deleted file mode 100644 index 717761d0..00000000 --- a/documentation/html/menu.js +++ /dev/null @@ -1,134 +0,0 @@ -/* - @licstart The following is the entire license notice for the JavaScript code in this file. - - The MIT License (MIT) - - Copyright (C) 1997-2020 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software - and associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, - sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or - substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice for the JavaScript code in this file - */ -function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { - function makeTree(data,relPath) { - let result=''; - if ('children' in data) { - result+='
      '; - for (let i in data.children) { - let url; - const link = data.children[i].url; - if (link.substring(0,1)=='^') { - url = link.substring(1); - } else { - url = relPath+link; - } - result+='
    • '+ - data.children[i].text+''+ - makeTree(data.children[i],relPath)+'
    • '; - } - result+='
    '; - } - return result; - } - let searchBoxHtml; - if (searchEnabled) { - if (serverSide) { - searchBoxHtml='
    '+ - '
    '+ - '
     '+ - ''+ - '
    '+ - '
    '+ - '
    '+ - '
    '; - } else { - searchBoxHtml='
    '+ - ''+ - ' '+ - ''+ - ''+ - ''+ - ''+ - ''+ - '
    '; - } - } - - $('#main-nav').before('
    '+ - ''+ - ''+ - '
    '); - $('#main-nav').append(makeTree(menudata,relPath)); - $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); - if (searchBoxHtml) { - $('#main-menu').append('
  • '); - } - const $mainMenuState = $('#main-menu-state'); - let prevWidth = 0; - if ($mainMenuState.length) { - const initResizableIfExists = function() { - if (typeof initResizable==='function') initResizable(); - } - // animate mobile menu - $mainMenuState.change(function() { - const $menu = $('#main-menu'); - let options = { duration: 250, step: initResizableIfExists }; - if (this.checked) { - options['complete'] = () => $menu.css('display', 'block'); - $menu.hide().slideDown(options); - } else { - options['complete'] = () => $menu.css('display', 'none'); - $menu.show().slideUp(options); - } - }); - // set default menu visibility - const resetState = function() { - const $menu = $('#main-menu'); - const newWidth = $(window).outerWidth(); - if (newWidth!=prevWidth) { - if ($(window).outerWidth()<768) { - $mainMenuState.prop('checked',false); $menu.hide(); - $('#searchBoxPos1').html(searchBoxHtml); - $('#searchBoxPos2').hide(); - } else { - $menu.show(); - $('#searchBoxPos1').empty(); - $('#searchBoxPos2').html(searchBoxHtml); - $('#searchBoxPos2').show(); - } - if (typeof searchBox!=='undefined') { - searchBox.CloseResultsWindow(); - } - prevWidth = newWidth; - } - } - $(window).ready(function() { resetState(); initResizableIfExists(); }); - $(window).resize(resetState); - } - $('#main-menu').smartmenus(); -} -/* @license-end */ diff --git a/documentation/html/menudata.js b/documentation/html/menudata.js deleted file mode 100644 index bc89ec05..00000000 --- a/documentation/html/menudata.js +++ /dev/null @@ -1,90 +0,0 @@ -/* - @licstart The following is the entire license notice for the JavaScript code in this file. - - The MIT License (MIT) - - Copyright (C) 1997-2020 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software - and associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, - sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or - substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice for the JavaScript code in this file -*/ -var menudata={children:[ -{text:"Main Page",url:"index.html"}, -{text:"Classes",url:"annotated.html",children:[ -{text:"Class List",url:"annotated.html"}, -{text:"Class Index",url:"classes.html"}, -{text:"Class Hierarchy",url:"hierarchy.html"}, -{text:"Class Members",url:"functions.html",children:[ -{text:"All",url:"functions.html",children:[ -{text:"a",url:"functions.html#index_a"}, -{text:"b",url:"functions.html#index_b"}, -{text:"c",url:"functions.html#index_c"}, -{text:"d",url:"functions.html#index_d"}, -{text:"e",url:"functions.html#index_e"}, -{text:"f",url:"functions.html#index_f"}, -{text:"g",url:"functions.html#index_g"}, -{text:"i",url:"functions.html#index_i"}, -{text:"j",url:"functions.html#index_j"}, -{text:"l",url:"functions.html#index_l"}, -{text:"m",url:"functions.html#index_m"}, -{text:"n",url:"functions.html#index_n"}, -{text:"o",url:"functions.html#index_o"}, -{text:"p",url:"functions.html#index_p"}, -{text:"r",url:"functions.html#index_r"}, -{text:"s",url:"functions.html#index_s"}, -{text:"t",url:"functions.html#index_t"}, -{text:"u",url:"functions.html#index_u"}, -{text:"v",url:"functions.html#index_v"}, -{text:"w",url:"functions.html#index_w"}]}, -{text:"Functions",url:"functions_func.html",children:[ -{text:"a",url:"functions_func.html#index_a"}, -{text:"c",url:"functions_func.html#index_c"}, -{text:"d",url:"functions_func.html#index_d"}, -{text:"f",url:"functions_func.html#index_f"}, -{text:"g",url:"functions_func.html#index_g"}, -{text:"i",url:"functions_func.html#index_i"}, -{text:"l",url:"functions_func.html#index_l"}, -{text:"m",url:"functions_func.html#index_m"}, -{text:"n",url:"functions_func.html#index_n"}, -{text:"o",url:"functions_func.html#index_o"}, -{text:"p",url:"functions_func.html#index_p"}, -{text:"r",url:"functions_func.html#index_r"}, -{text:"s",url:"functions_func.html#index_s"}, -{text:"u",url:"functions_func.html#index_u"}, -{text:"v",url:"functions_func.html#index_v"}, -{text:"w",url:"functions_func.html#index_w"}]}, -{text:"Variables",url:"functions_vars.html",children:[ -{text:"a",url:"functions_vars.html#index_a"}, -{text:"b",url:"functions_vars.html#index_b"}, -{text:"c",url:"functions_vars.html#index_c"}, -{text:"d",url:"functions_vars.html#index_d"}, -{text:"e",url:"functions_vars.html#index_e"}, -{text:"f",url:"functions_vars.html#index_f"}, -{text:"g",url:"functions_vars.html#index_g"}, -{text:"i",url:"functions_vars.html#index_i"}, -{text:"j",url:"functions_vars.html#index_j"}, -{text:"m",url:"functions_vars.html#index_m"}, -{text:"n",url:"functions_vars.html#index_n"}, -{text:"o",url:"functions_vars.html#index_o"}, -{text:"p",url:"functions_vars.html#index_p"}, -{text:"r",url:"functions_vars.html#index_r"}, -{text:"s",url:"functions_vars.html#index_s"}, -{text:"t",url:"functions_vars.html#index_t"}, -{text:"u",url:"functions_vars.html#index_u"}, -{text:"v",url:"functions_vars.html#index_v"}]}]}]}, -{text:"Files",url:"files.html",children:[ -{text:"File List",url:"files.html"}]}]} diff --git a/documentation/html/minus.svg b/documentation/html/minus.svg deleted file mode 100644 index f70d0c1a..00000000 --- a/documentation/html/minus.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/documentation/html/minusd.svg b/documentation/html/minusd.svg deleted file mode 100644 index 5f8e8796..00000000 --- a/documentation/html/minusd.svg +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/documentation/html/nav_f.png b/documentation/html/nav_f.png deleted file mode 100644 index 72a58a529ed3a9ed6aa0c51a79cf207e026deee2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U diff --git a/documentation/html/nav_fd.png b/documentation/html/nav_fd.png deleted file mode 100644 index 032fbdd4c54f54fa9a2e6423b94ef4b2ebdfaceb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQU#tajv*C{Z|C~*H7f|XvG1G8 zt7aS*L7xwMeS}!z6R#{C5tIw-s~AJ==F^i}x3XyJseHR@yF& zerFf(Zf;Dd{+(0lDIROL@Sj-Ju2JQ8&-n%4%q?>|^bShc&lR?}7HeMo@BDl5N(aHY Uj$gdr1MOz;boFyt=akR{0D!zeaR2}S diff --git a/documentation/html/nav_g.png b/documentation/html/nav_g.png deleted file mode 100644 index 2093a237a94f6c83e19ec6e5fd42f7ddabdafa81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL6W-eg#Jd_@e6*DPn)w;=|1H}Zvm9l6xXXB%>yL=NQU;mg M>FVdQ&MBb@0Bdt1Qvd(} diff --git a/documentation/html/open.png b/documentation/html/open.png deleted file mode 100644 index 30f75c7efe2dd0c9e956e35b69777a02751f048b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    output_writer.h
    -
    -
    -
    1#pragma once
    -
    2
    -
    3#include "../discretization/discretization.h"
    -
    4
    -
    5#include <memory>
    -
    6#include <iostream>
    -
    7#include <cstring>
    -
    8
    -
    - -
    14{
    -
    15public:
    -
    21 OutputWriter(std::shared_ptr<Discretization> discretization);
    -
    22
    -
    30 virtual void writeFile(double currentTime) = 0;
    -
    31
    -
    32protected:
    -
    33 std::shared_ptr<Discretization> discretization_;
    -
    34 int fileNo_;
    -
    35};
    -
    -
    Inteface class for writing simulation data output.
    Definition output_writer.h:14
    -
    std::shared_ptr< Discretization > discretization_
    shared pointer, discretization object containing data to be written to file
    Definition output_writer.h:33
    -
    OutputWriter(std::shared_ptr< Discretization > discretization)
    Constructor.
    Definition output_writer.cpp:3
    -
    int fileNo_
    a counter that increments for every file written to disk
    Definition output_writer.h:34
    -
    virtual void writeFile(double currentTime)=0
    Write current velocities to file.
    -
    - - - - diff --git a/documentation/html/output__writer__paraview_8h_source.html b/documentation/html/output__writer__paraview_8h_source.html deleted file mode 100644 index 64c9ea10..00000000 --- a/documentation/html/output__writer__paraview_8h_source.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer_paraview.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    output_writer_paraview.h
    -
    -
    -
    1#pragma once
    -
    2
    -
    3#include "output_writer.h"
    -
    4
    -
    5#include <vtkSmartPointer.h>
    -
    6#include <vtkXMLImageDataWriter.h>
    -
    7#include <vtkImageData.h>
    -
    8#include <vtkDoubleArray.h>
    -
    9#include <vtkPointData.h>
    -
    10#include <cmath>
    -
    11
    -
    12#include <memory>
    -
    13#include <iostream>
    -
    14#include "../boundary/mask.h"
    -
    15
    -
    - -
    25{
    -
    26public:
    -
    32 OutputWriterParaview(std::shared_ptr<Discretization> discretization, std::shared_ptr<Mask> mask);
    -
    33
    -
    39 void writeFile(double currentTime);
    -
    40
    -
    41private:
    -
    42 vtkSmartPointer<vtkXMLImageDataWriter> vtkWriter_;
    -
    43 std::shared_ptr<Mask> mask_;
    -
    44};
    -
    -
    Write *.vti files that can be viewed with ParaView.
    Definition output_writer_paraview.h:25
    -
    OutputWriterParaview(std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask)
    Constructor.
    Definition output_writer_paraview.cpp:3
    -
    void writeFile(double currentTime)
    Write current velocities to file, filename is output_<count>.vti.
    Definition output_writer_paraview.cpp:9
    -
    Inteface class for writing simulation data output.
    Definition output_writer.h:14
    -
    - - - - diff --git a/documentation/html/output__writer__text_8h_source.html b/documentation/html/output__writer__text_8h_source.html deleted file mode 100644 index db57ed16..00000000 --- a/documentation/html/output__writer__text_8h_source.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/output_writer/output_writer_text.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    output_writer_text.h
    -
    -
    -
    1#pragma once
    -
    2
    -
    3#include "output_writer.h"
    -
    4#include <iostream>
    -
    5#include <fstream>
    -
    6#include <sstream>
    -
    7#include <iomanip>
    -
    8
    -
    - -
    17{
    -
    18public:
    - -
    23
    -
    31 void writeFile(double currentTime);
    -
    32
    -
    38 void writePressureFile();
    -
    39};
    -
    -
    Write *.txt files that are useful for debugging.
    Definition output_writer_text.h:17
    -
    void writeFile(double currentTime)
    Write current velocities to file.
    Definition output_writer_text.cpp:3
    -
    void writePressureFile()
    Write only current values of pressure to file.
    Definition output_writer_text.cpp:177
    -
    Inteface class for writing simulation data output.
    Definition output_writer.h:14
    -
    OutputWriter(std::shared_ptr< Discretization > discretization)
    Constructor.
    Definition output_writer.cpp:3
    -
    - - - - diff --git a/documentation/html/plus.svg b/documentation/html/plus.svg deleted file mode 100644 index 07520165..00000000 --- a/documentation/html/plus.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/documentation/html/plusd.svg b/documentation/html/plusd.svg deleted file mode 100644 index 0c65bfe9..00000000 --- a/documentation/html/plusd.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/documentation/html/pressure__solver_8h_source.html b/documentation/html/pressure__solver_8h_source.html deleted file mode 100644 index 13213ceb..00000000 --- a/documentation/html/pressure__solver_8h_source.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/pressure_solver.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    pressure_solver.h
    -
    -
    -
    1#pragma once
    -
    2
    -
    3#include <math.h>
    -
    4#include <iostream>
    -
    5#include <memory>
    -
    6
    -
    7#include "../storage/field_variable.h"
    -
    8#include "../discretization/discretization.h"
    -
    9#include "../boundary/boundary.h"
    -
    10
    -
    11
    -
    - -
    21{
    -
    22public:
    -
    31 PressureSolver(std::shared_ptr<Discretization> discretization,
    -
    32 double epsilon,
    -
    33 int maximumNumberOfIterations,
    -
    34 std::shared_ptr<Boundary> boundary);
    -
    35
    -
    40 virtual void solve() = 0;
    -
    41
    -
    42 double dx2, dy2;
    -
    43
    -
    44protected:
    -
    51 void setBoundaryValues();
    -
    52
    -
    56 double calculateResiduum();
    -
    57
    -
    58 int i_beg;
    -
    59 int i_end;
    -
    60 int j_beg;
    -
    61 int j_end;
    -
    62
    -
    63 std::shared_ptr<Discretization> discretization_;
    -
    64 std::shared_ptr<Boundary> boundary_;
    -
    65
    -
    66 double epsilon_;
    -
    67
    - -
    69};
    -
    -
    Solves the Poisson problem for the pressure.
    Definition pressure_solver.h:21
    -
    std::shared_ptr< Boundary > boundary_
    object managing boundary for obstacle and surface tension
    Definition pressure_solver.h:64
    -
    PressureSolver(std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
    Constructor.
    Definition pressure_solver.cpp:5
    -
    double epsilon_
    tolerance for the solver
    Definition pressure_solver.h:66
    -
    double dy2
    squared mesh widths
    Definition pressure_solver.h:42
    -
    int i_end
    end of loop for rhs in x direction
    Definition pressure_solver.h:59
    -
    void setBoundaryValues()
    Set the Boundary Values.
    Definition pressure_solver.cpp:28
    -
    virtual void solve()=0
    virtual function that starts solver.
    -
    int j_beg
    begin of loop for rhs in y direction
    Definition pressure_solver.h:60
    -
    int j_end
    end of loop for rhs in y direction
    Definition pressure_solver.h:61
    -
    int i_beg
    begin of loop for rhs in x direction
    Definition pressure_solver.h:58
    -
    int maximumNumberOfIterations_
    maximum number of iterations
    Definition pressure_solver.h:68
    -
    std::shared_ptr< Discretization > discretization_
    object holding the needed field variables for rhs and p
    Definition pressure_solver.h:63
    -
    double calculateResiduum()
    calculate residuum of current time step
    Definition pressure_solver.cpp:33
    -
    - - - - diff --git a/documentation/html/search/all_0.js b/documentation/html/search/all_0.js deleted file mode 100644 index d432d029..00000000 --- a/documentation/html/search/all_0.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['alpha_0',['alpha',['../structSettings.html#a8b3721d24a5417caa0f2ad6f5eb85782',1,'Settings']]], - ['array2d_1',['array2d',['../classArray2D.html',1,'Array2D'],['../classArray2D.html#a16521417dfdf67ec694bfb7747df9000',1,'Array2D::Array2D()']]] -]; diff --git a/documentation/html/search/all_1.js b/documentation/html/search/all_1.js deleted file mode 100644 index 77069907..00000000 --- a/documentation/html/search/all_1.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['boundary_0',['Boundary',['../classBoundary.html',1,'']]], - ['boundary_5f_1',['boundary_',['../classPressureSolver.html#a0b17b46580d259e4bb3a05486bc06a60',1,'PressureSolver']]], - ['boundary_5flist_2',['boundary_list',['../classMask.html#a3c5a51f6d03bb4a5e1742537a22ec441',1,'Mask']]] -]; diff --git a/documentation/html/search/all_10.js b/documentation/html/search/all_10.js deleted file mode 100644 index b7e0cc14..00000000 --- a/documentation/html/search/all_10.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['tau_0',['tau',['../structSettings.html#adaa611dc8c075474d40d7149afd310d1',1,'Settings']]] -]; diff --git a/documentation/html/search/all_11.js b/documentation/html/search/all_11.js deleted file mode 100644 index 3e53abf5..00000000 --- a/documentation/html/search/all_11.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['u_0',['u',['../classStaggeredGrid.html#a87cee12621c641ab143a8b1a61b2ef7e',1,'StaggeredGrid::u() const'],['../classStaggeredGrid.html#a0324ce4d1fe2343d8aa9514e460cc556',1,'StaggeredGrid::u(int i, int j) const'],['../classStaggeredGrid.html#a0ed62d6752b6b2b3ead5f654b515cd12',1,'StaggeredGrid::u(int i, int j)']]], - ['u_5f_1',['u_',['../classStaggeredGrid.html#adcef36b4ce8cc6843a2b6f603b62c763',1,'StaggeredGrid']]], - ['uibegin_2',['uIBegin',['../classStaggeredGrid.html#a31e2d3a0b6e03685380810a7c2f323e1',1,'StaggeredGrid']]], - ['uiend_3',['uIEnd',['../classStaggeredGrid.html#a641e473d72e1d02ba3de1c16e9d0d332',1,'StaggeredGrid']]], - ['ujbegin_4',['uJBegin',['../classStaggeredGrid.html#a9b0e97704e1871441a8e713ecaa2cff5',1,'StaggeredGrid']]], - ['ujend_5',['uJEnd',['../classStaggeredGrid.html#a3393aa91b17054d2d700de308ae25632',1,'StaggeredGrid']]], - ['usedonorcell_6',['useDonorCell',['../structSettings.html#a05bd5ffa1e1b48f5dc99878538596db3',1,'Settings']]] -]; diff --git a/documentation/html/search/all_12.js b/documentation/html/search/all_12.js deleted file mode 100644 index 72fb9675..00000000 --- a/documentation/html/search/all_12.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['v_0',['v',['../classStaggeredGrid.html#a26e478abba632554652c9e05a279d1ca',1,'StaggeredGrid::v() const'],['../classStaggeredGrid.html#ac052d8803ff950aee04b86ac026c516b',1,'StaggeredGrid::v(int i, int j) const'],['../classStaggeredGrid.html#a7746f703f32c2f20a4c77246eebac697',1,'StaggeredGrid::v(int i, int j)']]], - ['v_5f_1',['v_',['../classStaggeredGrid.html#a20ec43568fe937b194561e21a0b84ad9',1,'StaggeredGrid']]], - ['value_2',['value',['../structSettings_1_1LineContent.html#a0bb96393366f2e5035379ab5b99d3ab2',1,'Settings::LineContent']]], - ['vibegin_3',['vIBegin',['../classStaggeredGrid.html#ace7bf8cb1d279131739d5d12de302d09',1,'StaggeredGrid']]], - ['viend_4',['vIEnd',['../classStaggeredGrid.html#aa5a44aa088b5a7923fa952af1ecb5778',1,'StaggeredGrid']]], - ['vjbegin_5',['vJBegin',['../classStaggeredGrid.html#a7f8468d672411c0e3a5eeb67788fc826',1,'StaggeredGrid']]], - ['vjend_6',['vJEnd',['../classStaggeredGrid.html#ab67e8d9d8d76d34fb02d4d644f0b3795',1,'StaggeredGrid']]] -]; diff --git a/documentation/html/search/all_13.js b/documentation/html/search/all_13.js deleted file mode 100644 index 9578483c..00000000 --- a/documentation/html/search/all_13.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['writefile_0',['writefile',['../classOutputWriter.html#ac625c204affdc05919388a3549c2e945',1,'OutputWriter::writeFile()'],['../classOutputWriterParaview.html#a9e203b63d0e2f26ad53d18ee1821c6bb',1,'OutputWriterParaview::writeFile()'],['../classOutputWriterText.html#a25a12ea2524fc34e9acb19ef1f4c7431',1,'OutputWriterText::writeFile(double currentTime)']]], - ['writepressurefile_1',['writePressureFile',['../classOutputWriterText.html#a3480b58a23fd158f16d0ef9c1b67cbfd',1,'OutputWriterText']]] -]; diff --git a/documentation/html/search/all_2.js b/documentation/html/search/all_2.js deleted file mode 100644 index 969f7b9c..00000000 --- a/documentation/html/search/all_2.js +++ /dev/null @@ -1,19 +0,0 @@ -var searchData= -[ - ['calculateresiduum_0',['calculateResiduum',['../classPressureSolver.html#afc51f4315c483988aeec327a16c5bb90',1,'PressureSolver']]], - ['centraldifferences_1',['centraldifferences',['../classCentralDifferences.html#ab055731e615298f745364c54f86fc191',1,'CentralDifferences::CentralDifferences()'],['../classCentralDifferences.html',1,'CentralDifferences']]], - ['computation_2',['Computation',['../classComputation.html',1,'']]], - ['computed2udx2_3',['computeD2uDx2',['../classDiscretization.html#a6986501b0b5c96699ff3ac843c1a6ca2',1,'Discretization']]], - ['computed2udy2_4',['computeD2uDy2',['../classDiscretization.html#a446aabc55a9fb4b5cb2f476babc532f9',1,'Discretization']]], - ['computed2vdx2_5',['computeD2vDx2',['../classDiscretization.html#a5119047788a34eadf37480e913bdc8ea',1,'Discretization']]], - ['computed2vdy2_6',['computeD2vDy2',['../classDiscretization.html#a56678582a049b1b141621e41afff1438',1,'Discretization']]], - ['computedpdx_7',['computeDpDx',['../classDiscretization.html#aed3ad75ad6e647d14f118a12652c01b2',1,'Discretization']]], - ['computedpdy_8',['computeDpDy',['../classDiscretization.html#a859f4dc33f0ea91f5e6537be09ce4999',1,'Discretization']]], - ['computedu2dx_9',['computedu2dx',['../classDonorCell.html#a265bdaf46ed8ba46a42ef0cb03807175',1,'DonorCell::computeDu2Dx()'],['../classDiscretization.html#acca6bf193e0e91f645d292527299254b',1,'Discretization::computeDu2Dx()'],['../classCentralDifferences.html#adb4502f473cc047a433db596146672e4',1,'CentralDifferences::computeDu2Dx(int i, int j) const override']]], - ['computeduvdx_10',['computeduvdx',['../classCentralDifferences.html#a9bd7ac3bfd709991525ec57de10ed2e1',1,'CentralDifferences::computeDuvDx()'],['../classDiscretization.html#ab1c2aa237e13e7c4c9edd429de656795',1,'Discretization::computeDuvDx()'],['../classDonorCell.html#ae41b5f85743ca7f148bd829561bd9cb5',1,'DonorCell::computeDuvDx()']]], - ['computeduvdy_11',['computeduvdy',['../classCentralDifferences.html#a4184367de8d48e678edfb078a19fc0a4',1,'CentralDifferences::computeDuvDy()'],['../classDiscretization.html#a0bab86aef10a72e01b4f8102a3c91f84',1,'Discretization::computeDuvDy()'],['../classDonorCell.html#a285562312f08efde26afd160174d2843',1,'DonorCell::computeDuvDy()']]], - ['computedv2dy_12',['computedv2dy',['../classCentralDifferences.html#a66eb9b800b9a9ac6f81fc719a42eb0ee',1,'CentralDifferences::computeDv2Dy()'],['../classDiscretization.html#a69ba136ab7f8c09d805afca159cab428',1,'Discretization::computeDv2Dy()'],['../classDonorCell.html#a01dcfb7fcf356d5ee412107a30c26fb3',1,'DonorCell::computeDv2Dy()']]], - ['createdomainfrombitmap_13',['createDomainfromBitmap',['../structSettings.html#a6300ad5a809cdaf480f4553c3e3dbf7c',1,'Settings']]], - ['createparticles_14',['createParticles',['../classFluidTracer.html#ace163e1fe040acbd4c3122f082b08eea',1,'FluidTracer']]], - ['createrectangularobject_15',['createRectangularObject',['../structSettings.html#a9e871c2bbb7d1b0131eac1f30f4f7788',1,'Settings']]] -]; diff --git a/documentation/html/search/all_3.js b/documentation/html/search/all_3.js deleted file mode 100644 index a977fb79..00000000 --- a/documentation/html/search/all_3.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['data_5f_0',['data_',['../classMask.html#acdb73aee935b502fecc8de6bf1e32a09',1,'Mask::data_'],['../classArray2D.html#af1572f75d219caab4b2372a98341b991',1,'Array2D::data_']]], - ['discretization_1',['discretization',['../classDiscretization.html',1,'Discretization'],['../classDiscretization.html#a4fb8cc9823938e7c2dec329b906a462c',1,'Discretization::Discretization()']]], - ['discretization_5f_2',['discretization_',['../classOutputWriter.html#a0587b2dc160a9b1393411433dfc23b68',1,'OutputWriter::discretization_'],['../classPressureSolver.html#af579ecebaaa8b11914293ef18af5fdc6',1,'PressureSolver::discretization_']]], - ['donorcell_3',['donorcell',['../classDonorCell.html',1,'DonorCell'],['../classDonorCell.html#a4896ad035a5ac50c85e2b66d442a5312',1,'DonorCell::DonorCell()']]], - ['dx_4',['dx',['../classStaggeredGrid.html#aec8490affea703cdd73b1febaed68968',1,'StaggeredGrid']]], - ['dy_5',['dy',['../classStaggeredGrid.html#abde2da10e0c130fb0f206de64c9b4956',1,'StaggeredGrid']]], - ['dy2_6',['dy2',['../classPressureSolver.html#a25b7ff50bdaea53d1b5c7a5cf735c5b5',1,'PressureSolver']]] -]; diff --git a/documentation/html/search/all_4.js b/documentation/html/search/all_4.js deleted file mode 100644 index 9909aa46..00000000 --- a/documentation/html/search/all_4.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['endtime_0',['endTime',['../structSettings.html#a73cd9110793ede99e9ebe409e5e115fd',1,'Settings']]], - ['epsilon_1',['epsilon',['../structSettings.html#aa02bd91d026d9ded9e36004b41b068b1',1,'Settings']]], - ['epsilon_5f_2',['epsilon_',['../classPressureSolver.html#a22b723f3b3ba54e47f36cfc2b9576749',1,'PressureSolver']]] -]; diff --git a/documentation/html/search/all_5.js b/documentation/html/search/all_5.js deleted file mode 100644 index e03e6103..00000000 --- a/documentation/html/search/all_5.js +++ /dev/null @@ -1,13 +0,0 @@ -var searchData= -[ - ['f_0',['f',['../classStaggeredGrid.html#adb05c59512dc8993367e4beddba05785',1,'StaggeredGrid']]], - ['f_5f_1',['f_',['../classStaggeredGrid.html#a94933ac0c6e0d2a794f46c7a97d72f75',1,'StaggeredGrid']]], - ['fibegin_2',['fIBegin',['../classStaggeredGrid.html#a5cc368f9ede58a3cb689705df998f750',1,'StaggeredGrid']]], - ['fieldvariable_3',['fieldvariable',['../classFieldVariable.html',1,'FieldVariable'],['../classFieldVariable.html#aa0985778bc6331b74904a03c3ef67a98',1,'FieldVariable::FieldVariable()']]], - ['fiend_4',['fIEnd',['../classStaggeredGrid.html#a8162b849231354ba73aacb085b5cd665',1,'StaggeredGrid']]], - ['fileno_5f_5',['fileNo_',['../classOutputWriter.html#a69d167e2526407602dce26ca7a2b9248',1,'OutputWriter']]], - ['findabsmax_6',['findAbsMax',['../classFieldVariable.html#a55168fd422c70c8386ba311909427cf7',1,'FieldVariable']]], - ['fjbegin_7',['fJBegin',['../classStaggeredGrid.html#ab92aca90331200d0cc7bc0c0a857b4ef',1,'StaggeredGrid']]], - ['fjend_8',['fJEnd',['../classStaggeredGrid.html#a7ac43ac86231987bc0bf6565589d52e1',1,'StaggeredGrid']]], - ['fluidtracer_9',['FluidTracer',['../classFluidTracer.html',1,'']]] -]; diff --git a/documentation/html/search/all_6.js b/documentation/html/search/all_6.js deleted file mode 100644 index 0bdb7c3e..00000000 --- a/documentation/html/search/all_6.js +++ /dev/null @@ -1,13 +0,0 @@ -var searchData= -[ - ['g_0',['g',['../structSettings.html#a1a21237c7f5b7585e5a3545c7d4a4e8c',1,'Settings::g'],['../classStaggeredGrid.html#aaf849bec40f7fa7c68823038f0877341',1,'StaggeredGrid::g(int i, int j)']]], - ['g_5f_1',['g_',['../classStaggeredGrid.html#a5f5c88f603d4e503cba4c44ed43de46a',1,'StaggeredGrid']]], - ['gaussseidel_2',['gaussseidel',['../classGaussSeidel.html',1,'GaussSeidel'],['../classGaussSeidel.html#af31cc1ace2d616ebb8e0592c06865b9c',1,'GaussSeidel::GaussSeidel()']]], - ['getnumberoffluidcells_3',['getNumberOfFluidCells',['../classMask.html#a3471a6026ce7eab118f660557a8abac6',1,'Mask']]], - ['getnumberofparticles_4',['getNumberOfParticles',['../classFluidTracer.html#adc687a4988f532e21e13c9aa0591d658',1,'FluidTracer']]], - ['getparticleposition_5',['getParticlePosition',['../classFluidTracer.html#a37ee0325d6af08be6eba8b073162342e',1,'FluidTracer']]], - ['gibegin_6',['gIBegin',['../classStaggeredGrid.html#a061fb6d6948cdc3054171dd60842a8c3',1,'StaggeredGrid']]], - ['giend_7',['gIEnd',['../classStaggeredGrid.html#aebc76693e5dd61db521d6763236bf664',1,'StaggeredGrid']]], - ['gjbegin_8',['gJBegin',['../classStaggeredGrid.html#a18ca3a121787b19c18886b0945aca2e3',1,'StaggeredGrid']]], - ['gjend_9',['gJEnd',['../classStaggeredGrid.html#a7a29456e1bce9efffa27de0b41957b50',1,'StaggeredGrid']]] -]; diff --git a/documentation/html/search/all_7.js b/documentation/html/search/all_7.js deleted file mode 100644 index 041d41cf..00000000 --- a/documentation/html/search/all_7.js +++ /dev/null @@ -1,11 +0,0 @@ -var searchData= -[ - ['i_5fbeg_0',['i_beg',['../classPressureSolver.html#af3ac2e53c6f49b9a362415a89595a7f0',1,'PressureSolver']]], - ['i_5fend_1',['i_end',['../classPressureSolver.html#a41b263980e55591d1ffdc4837c252a61',1,'PressureSolver']]], - ['initialize_2',['initialize',['../classComputation.html#a4a344479797b15bd5c9ed2f262657339',1,'Computation']]], - ['interpolateat_3',['interpolateAt',['../classFieldVariable.html#a2949624f1d2d7e29872f743db0b1d83b',1,'FieldVariable']]], - ['isair_4',['isAir',['../classMask.html#a7eb34f789ef96c622ab93718d5278d77',1,'Mask']]], - ['iscontent_5',['isContent',['../structSettings_1_1LineContent.html#aa2af8a274c468eb68c61cd93171748e5',1,'Settings::LineContent']]], - ['isfluid_6',['isFluid',['../classMask.html#aadacef52f95b796920864b8519d0594b',1,'Mask']]], - ['isobstacle_7',['isObstacle',['../classMask.html#a53e4e7c0b29234856cbee33386cc5c18',1,'Mask']]] -]; diff --git a/documentation/html/search/all_8.js b/documentation/html/search/all_8.js deleted file mode 100644 index 92030a3a..00000000 --- a/documentation/html/search/all_8.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['j_5fbeg_0',['j_beg',['../classPressureSolver.html#aa309af30e5e63e09b77900091e562235',1,'PressureSolver']]], - ['j_5fend_1',['j_end',['../classPressureSolver.html#ac2402794034dd74073700998ee2860bf',1,'PressureSolver']]] -]; diff --git a/documentation/html/search/all_9.js b/documentation/html/search/all_9.js deleted file mode 100644 index e7fbc954..00000000 --- a/documentation/html/search/all_9.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['linecontent_0',['LineContent',['../structSettings_1_1LineContent.html',1,'Settings']]], - ['loadfromfile_1',['loadFromFile',['../structSettings.html#a55f95e3b6e7379bef4f8399a2cd670cc',1,'Settings']]] -]; diff --git a/documentation/html/search/all_a.js b/documentation/html/search/all_a.js deleted file mode 100644 index 6dd04671..00000000 --- a/documentation/html/search/all_a.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['mask_0',['mask',['../classMask.html',1,'Mask'],['../classMask.html#a5d65d3a108a79864bc69994f5e56f6c3',1,'Mask::Mask()']]], - ['maximumdt_1',['maximumDt',['../structSettings.html#a988b93fdeb6c91932043b3f746b45e86',1,'Settings']]], - ['maximumnumberofiterations_2',['maximumNumberOfIterations',['../structSettings.html#ac118e1c6052e35fb0ee38547a85d84ba',1,'Settings']]], - ['maximumnumberofiterations_5f_3',['maximumNumberOfIterations_',['../classPressureSolver.html#af3b02d29bf1b21ad8b7e6edf8c2f4e87',1,'PressureSolver']]], - ['meshwidth_4',['meshWidth',['../classStaggeredGrid.html#a330856d4efe952771daf0753ef84068e',1,'StaggeredGrid']]], - ['meshwidth_5f_5',['meshWidth_',['../classStaggeredGrid.html#a9603c3334440aab082dda48947e5ce6e',1,'StaggeredGrid']]], - ['moveparticles_6',['moveParticles',['../classFluidTracer.html#aba4d452f26e9276b91256dd251789b90',1,'FluidTracer']]] -]; diff --git a/documentation/html/search/all_b.js b/documentation/html/search/all_b.js deleted file mode 100644 index ad7092d3..00000000 --- a/documentation/html/search/all_b.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['ncells_0',['ncells',['../structSettings.html#a43a0d2ee903496bfb86693a43a891a69',1,'Settings::nCells'],['../classStaggeredGrid.html#af37816ccb2c46e4a514dedac261897bf',1,'StaggeredGrid::nCells() const']]], - ['ncells_5f_1',['nCells_',['../classStaggeredGrid.html#acacffb5739539d9015c986080bb5ed44',1,'StaggeredGrid']]], - ['noslipvelbottom_2',['NoSlipVelBottom',['../structSettings.html#a13e254a0439df7f7bd24ffe4f919a1a4',1,'Settings']]], - ['noslipvelleft_3',['NoSlipVelLeft',['../structSettings.html#aafaec8c10a728a0f115f3bed43a1c478',1,'Settings']]], - ['noslipvelright_4',['NoSlipVelRight',['../structSettings.html#a2508aa084fe48e78d72b06e67c5a2006',1,'Settings']]], - ['noslipveltop_5',['NoSlipVelTop',['../structSettings.html#a8887591c6c157d7006051aa95896c284',1,'Settings']]] -]; diff --git a/documentation/html/search/all_c.js b/documentation/html/search/all_c.js deleted file mode 100644 index ca1e1d6e..00000000 --- a/documentation/html/search/all_c.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['obstacledimension_0',['obstacleDimension',['../structSettings.html#ae23782f18cddfea58cb843e98cb5854f',1,'Settings']]], - ['obstacleposition_1',['obstaclePosition',['../structSettings.html#aff5a1563289e354946a164fd80da5bf6',1,'Settings']]], - ['omega_2',['omega',['../structSettings.html#af5ac13128e8c442ba45eedfab06ba14c',1,'Settings']]], - ['operator_28_29_3',['operator()',['../classMask.html#a6d612f1ac2185304b3ad7432d90dcd2b',1,'Mask::operator()(int i, int j)'],['../classMask.html#a154acb41f2695c2a6ace82b5ebccbb1c',1,'Mask::operator()(int i, int j) const'],['../classArray2D.html#a9d49e5544f4acf51a57dcbb0ed1bb0f8',1,'Array2D::operator()(int i, int j)'],['../classArray2D.html#af745718ec25b815051de2d0c3c94e0d2',1,'Array2D::operator()(int i, int j) const']]], - ['outputwriter_4',['outputwriter',['../classOutputWriter.html',1,'OutputWriter'],['../classOutputWriter.html#a4f3180552b8102c27e087357b9cdd1f7',1,'OutputWriter::OutputWriter()'],['../classOutputWriterText.html#a4f3180552b8102c27e087357b9cdd1f7',1,'OutputWriterText::OutputWriter()']]], - ['outputwriterparaview_5',['outputwriterparaview',['../classOutputWriterParaview.html',1,'OutputWriterParaview'],['../classOutputWriterParaview.html#a7a599c2694986563c801806234eb07d7',1,'OutputWriterParaview::OutputWriterParaview()']]], - ['outputwritertext_6',['OutputWriterText',['../classOutputWriterText.html',1,'']]] -]; diff --git a/documentation/html/search/all_d.js b/documentation/html/search/all_d.js deleted file mode 100644 index 93bfc8f1..00000000 --- a/documentation/html/search/all_d.js +++ /dev/null @@ -1,18 +0,0 @@ -var searchData= -[ - ['p_0',['p',['../classStaggeredGrid.html#aafe6e0bb3509f6aad272b94f74e7ffec',1,'StaggeredGrid::p() const'],['../classStaggeredGrid.html#aa6a5d99d9b4fbd9bd9cfa6ec071918f9',1,'StaggeredGrid::p(int i, int j) const'],['../classStaggeredGrid.html#aa09a4ca67141589bae153797fbc4f3c5',1,'StaggeredGrid::p(int i, int j)']]], - ['p_5f_1',['p_',['../classStaggeredGrid.html#a2ea3c93dd401ac06461ade9a74e76459',1,'StaggeredGrid']]], - ['parametername_2',['parameterName',['../structSettings_1_1LineContent.html#a2fa37c56a8ebe361c95b8332fa0262d3',1,'Settings::LineContent']]], - ['pathtobitmap_3',['pathToBitmap',['../structSettings.html#a398d6490c8731b9b74115abc34700086',1,'Settings']]], - ['physicalsize_4',['physicalSize',['../structSettings.html#a372a1549c306b12ca7bb0ed84f8a4cef',1,'Settings']]], - ['pibegin_5',['pIBegin',['../classStaggeredGrid.html#a9922c955707f2a31a4a27d1d696f002e',1,'StaggeredGrid']]], - ['piend_6',['pIEnd',['../classStaggeredGrid.html#a34f16fdf87971fe84ffc3c84722bb2c7',1,'StaggeredGrid']]], - ['pjbegin_7',['pJBegin',['../classStaggeredGrid.html#ae4c9ba16c5635dc1ffaa264fbcc3e034',1,'StaggeredGrid']]], - ['pjend_8',['pJEnd',['../classStaggeredGrid.html#ad9928ee522eedb7d7fd48ca0b92f2795',1,'StaggeredGrid']]], - ['pressurebottom_9',['PressureBottom',['../structSettings.html#acae74bcd333251c982ea347b8eb52017',1,'Settings']]], - ['pressureleft_10',['PressureLeft',['../structSettings.html#a55f2fbdeb4d9c25bc679bd1fd42f1da7',1,'Settings']]], - ['pressureright_11',['PressureRight',['../structSettings.html#a8e7d49e95d30c9390fc5039f9326df32',1,'Settings']]], - ['pressuresolver_12',['pressuresolver',['../classPressureSolver.html',1,'PressureSolver'],['../structSettings.html#a888e2fca33db512d4e200b49f1f618f7',1,'Settings::pressureSolver'],['../classPressureSolver.html#a10803d8c3d7f3810fc0ba059acf04058',1,'PressureSolver::PressureSolver()']]], - ['pressuretop_13',['PressureTop',['../structSettings.html#a5c8295a86e29ac27579058f07242e78c',1,'Settings']]], - ['printsettings_14',['printSettings',['../structSettings.html#a68ce38117dcef2cbdd3bd17f127b3078',1,'Settings']]] -]; diff --git a/documentation/html/search/all_e.js b/documentation/html/search/all_e.js deleted file mode 100644 index 033d4072..00000000 --- a/documentation/html/search/all_e.js +++ /dev/null @@ -1,13 +0,0 @@ -var searchData= -[ - ['re_0',['re',['../structSettings.html#a8b8330dfa04fe849291d68eacbc8dfec',1,'Settings']]], - ['readsingleline_1',['readSingleLine',['../structSettings.html#a6dbc25f91b99664976cd4a0a8af153c9',1,'Settings']]], - ['resetmask_2',['resetMask',['../classMask.html#ac30997cdd83faef98290733acb325cf8',1,'Mask']]], - ['rhs_3',['rhs',['../classStaggeredGrid.html#a3f36422a02b9b18d1577d61e406f08cf',1,'StaggeredGrid::rhs() const'],['../classStaggeredGrid.html#a761ea51f1e8fd1290b3adfe09942b0d3',1,'StaggeredGrid::rhs(int i, int j)']]], - ['rhs_5f_4',['rhs_',['../classStaggeredGrid.html#a496206955162452a0629a7742fe92a84',1,'StaggeredGrid']]], - ['rhsibegin_5',['rhsIBegin',['../classStaggeredGrid.html#ad5c16b00d9dbf0f115e1ded81203edce',1,'StaggeredGrid']]], - ['rhsiend_6',['rhsIEnd',['../classStaggeredGrid.html#ae11e8842fdd508b914dc8f24b09b36a9',1,'StaggeredGrid']]], - ['rhsjbegin_7',['rhsJBegin',['../classStaggeredGrid.html#a28c36939e3d3cc8df76e7aa91f0e0804',1,'StaggeredGrid']]], - ['rhsjend_8',['rhsJEnd',['../classStaggeredGrid.html#a953ec890a986473bffe87ea26dfcd782',1,'StaggeredGrid']]], - ['runsimulation_9',['runSimulation',['../classComputation.html#ad20ce6e82ec9a918e6ac03840bc688d5',1,'Computation']]] -]; diff --git a/documentation/html/search/all_f.js b/documentation/html/search/all_f.js deleted file mode 100644 index e5618e81..00000000 --- a/documentation/html/search/all_f.js +++ /dev/null @@ -1,11 +0,0 @@ -var searchData= -[ - ['setboundaryvalues_0',['setBoundaryValues',['../classPressureSolver.html#a458c383fcacaf54c1a333a271049ca93',1,'PressureSolver']]], - ['setparameter_1',['setParameter',['../structSettings.html#a588f30eb8d791c03ec811360386bff0d',1,'Settings']]], - ['settings_2',['Settings',['../structSettings.html',1,'']]], - ['size_3',['size',['../classMask.html#aafa0857af35b02ba6070e76f82d51c7b',1,'Mask::size()'],['../classArray2D.html#accf87be860645d6c50d6ba6fa39ec6f9',1,'Array2D::size()']]], - ['size_5f_4',['size_',['../classMask.html#a84bff46271e16eb8639c1831403c1bb9',1,'Mask::size_'],['../classArray2D.html#a75bc7a1ff6f218c38f6ab94ec34e9472',1,'Array2D::size_']]], - ['solve_5',['solve',['../classGaussSeidel.html#a6f0eb0c6938a64f8ded186f88170a04b',1,'GaussSeidel::solve()'],['../classPressureSolver.html#a504ac61a1317650e0eb70d6a93212ca0',1,'PressureSolver::solve()'],['../classSOR.html#a860992d85d8aacf114a3a02b5831f728',1,'SOR::solve()']]], - ['sor_6',['sor',['../classSOR.html',1,'SOR'],['../classSOR.html#a357cfea8935f4b2dfee06f2d8e1461a8',1,'SOR::SOR()']]], - ['staggeredgrid_7',['staggeredgrid',['../classStaggeredGrid.html',1,'StaggeredGrid'],['../classStaggeredGrid.html#aec0990b64c559b1690f21b48fb2d13b1',1,'StaggeredGrid::StaggeredGrid()']]] -]; diff --git a/documentation/html/search/classes_0.js b/documentation/html/search/classes_0.js deleted file mode 100644 index a18a1a26..00000000 --- a/documentation/html/search/classes_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['array2d_0',['Array2D',['../classArray2D.html',1,'']]] -]; diff --git a/documentation/html/search/classes_1.js b/documentation/html/search/classes_1.js deleted file mode 100644 index e067cded..00000000 --- a/documentation/html/search/classes_1.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['boundary_0',['Boundary',['../classBoundary.html',1,'']]] -]; diff --git a/documentation/html/search/classes_2.js b/documentation/html/search/classes_2.js deleted file mode 100644 index 665d9deb..00000000 --- a/documentation/html/search/classes_2.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['centraldifferences_0',['CentralDifferences',['../classCentralDifferences.html',1,'']]], - ['computation_1',['Computation',['../classComputation.html',1,'']]] -]; diff --git a/documentation/html/search/classes_3.js b/documentation/html/search/classes_3.js deleted file mode 100644 index 6c1d2569..00000000 --- a/documentation/html/search/classes_3.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['discretization_0',['Discretization',['../classDiscretization.html',1,'']]], - ['donorcell_1',['DonorCell',['../classDonorCell.html',1,'']]] -]; diff --git a/documentation/html/search/classes_4.js b/documentation/html/search/classes_4.js deleted file mode 100644 index f09b5865..00000000 --- a/documentation/html/search/classes_4.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['fieldvariable_0',['FieldVariable',['../classFieldVariable.html',1,'']]], - ['fluidtracer_1',['FluidTracer',['../classFluidTracer.html',1,'']]] -]; diff --git a/documentation/html/search/classes_5.js b/documentation/html/search/classes_5.js deleted file mode 100644 index 461456be..00000000 --- a/documentation/html/search/classes_5.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['gaussseidel_0',['GaussSeidel',['../classGaussSeidel.html',1,'']]] -]; diff --git a/documentation/html/search/classes_6.js b/documentation/html/search/classes_6.js deleted file mode 100644 index a14c2b1e..00000000 --- a/documentation/html/search/classes_6.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['linecontent_0',['LineContent',['../structSettings_1_1LineContent.html',1,'Settings']]] -]; diff --git a/documentation/html/search/classes_7.js b/documentation/html/search/classes_7.js deleted file mode 100644 index e15d664e..00000000 --- a/documentation/html/search/classes_7.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['mask_0',['Mask',['../classMask.html',1,'']]] -]; diff --git a/documentation/html/search/classes_8.js b/documentation/html/search/classes_8.js deleted file mode 100644 index 780dc018..00000000 --- a/documentation/html/search/classes_8.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['outputwriter_0',['OutputWriter',['../classOutputWriter.html',1,'']]], - ['outputwriterparaview_1',['OutputWriterParaview',['../classOutputWriterParaview.html',1,'']]], - ['outputwritertext_2',['OutputWriterText',['../classOutputWriterText.html',1,'']]] -]; diff --git a/documentation/html/search/classes_9.js b/documentation/html/search/classes_9.js deleted file mode 100644 index b1ff3b09..00000000 --- a/documentation/html/search/classes_9.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['pressuresolver_0',['PressureSolver',['../classPressureSolver.html',1,'']]] -]; diff --git a/documentation/html/search/classes_a.js b/documentation/html/search/classes_a.js deleted file mode 100644 index 5f84540d..00000000 --- a/documentation/html/search/classes_a.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['settings_0',['Settings',['../structSettings.html',1,'']]], - ['sor_1',['SOR',['../classSOR.html',1,'']]], - ['staggeredgrid_2',['StaggeredGrid',['../classStaggeredGrid.html',1,'']]] -]; diff --git a/documentation/html/search/close.svg b/documentation/html/search/close.svg deleted file mode 100644 index 337d6cc1..00000000 --- a/documentation/html/search/close.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - diff --git a/documentation/html/search/functions_0.js b/documentation/html/search/functions_0.js deleted file mode 100644 index b31bc990..00000000 --- a/documentation/html/search/functions_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['array2d_0',['Array2D',['../classArray2D.html#a16521417dfdf67ec694bfb7747df9000',1,'Array2D']]] -]; diff --git a/documentation/html/search/functions_1.js b/documentation/html/search/functions_1.js deleted file mode 100644 index 6da961b1..00000000 --- a/documentation/html/search/functions_1.js +++ /dev/null @@ -1,16 +0,0 @@ -var searchData= -[ - ['calculateresiduum_0',['calculateResiduum',['../classPressureSolver.html#afc51f4315c483988aeec327a16c5bb90',1,'PressureSolver']]], - ['centraldifferences_1',['CentralDifferences',['../classCentralDifferences.html#ab055731e615298f745364c54f86fc191',1,'CentralDifferences']]], - ['computed2udx2_2',['computeD2uDx2',['../classDiscretization.html#a6986501b0b5c96699ff3ac843c1a6ca2',1,'Discretization']]], - ['computed2udy2_3',['computeD2uDy2',['../classDiscretization.html#a446aabc55a9fb4b5cb2f476babc532f9',1,'Discretization']]], - ['computed2vdx2_4',['computeD2vDx2',['../classDiscretization.html#a5119047788a34eadf37480e913bdc8ea',1,'Discretization']]], - ['computed2vdy2_5',['computeD2vDy2',['../classDiscretization.html#a56678582a049b1b141621e41afff1438',1,'Discretization']]], - ['computedpdx_6',['computeDpDx',['../classDiscretization.html#aed3ad75ad6e647d14f118a12652c01b2',1,'Discretization']]], - ['computedpdy_7',['computeDpDy',['../classDiscretization.html#a859f4dc33f0ea91f5e6537be09ce4999',1,'Discretization']]], - ['computedu2dx_8',['computedu2dx',['../classDonorCell.html#a265bdaf46ed8ba46a42ef0cb03807175',1,'DonorCell::computeDu2Dx()'],['../classDiscretization.html#acca6bf193e0e91f645d292527299254b',1,'Discretization::computeDu2Dx()'],['../classCentralDifferences.html#adb4502f473cc047a433db596146672e4',1,'CentralDifferences::computeDu2Dx(int i, int j) const override']]], - ['computeduvdx_9',['computeduvdx',['../classCentralDifferences.html#a9bd7ac3bfd709991525ec57de10ed2e1',1,'CentralDifferences::computeDuvDx()'],['../classDiscretization.html#ab1c2aa237e13e7c4c9edd429de656795',1,'Discretization::computeDuvDx()'],['../classDonorCell.html#ae41b5f85743ca7f148bd829561bd9cb5',1,'DonorCell::computeDuvDx()']]], - ['computeduvdy_10',['computeduvdy',['../classCentralDifferences.html#a4184367de8d48e678edfb078a19fc0a4',1,'CentralDifferences::computeDuvDy()'],['../classDiscretization.html#a0bab86aef10a72e01b4f8102a3c91f84',1,'Discretization::computeDuvDy()'],['../classDonorCell.html#a285562312f08efde26afd160174d2843',1,'DonorCell::computeDuvDy()']]], - ['computedv2dy_11',['computedv2dy',['../classCentralDifferences.html#a66eb9b800b9a9ac6f81fc719a42eb0ee',1,'CentralDifferences::computeDv2Dy()'],['../classDiscretization.html#a69ba136ab7f8c09d805afca159cab428',1,'Discretization::computeDv2Dy()'],['../classDonorCell.html#a01dcfb7fcf356d5ee412107a30c26fb3',1,'DonorCell::computeDv2Dy()']]], - ['createparticles_12',['createParticles',['../classFluidTracer.html#ace163e1fe040acbd4c3122f082b08eea',1,'FluidTracer']]] -]; diff --git a/documentation/html/search/functions_2.js b/documentation/html/search/functions_2.js deleted file mode 100644 index b6980f71..00000000 --- a/documentation/html/search/functions_2.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['discretization_0',['Discretization',['../classDiscretization.html#a4fb8cc9823938e7c2dec329b906a462c',1,'Discretization']]], - ['donorcell_1',['DonorCell',['../classDonorCell.html#a4896ad035a5ac50c85e2b66d442a5312',1,'DonorCell']]], - ['dx_2',['dx',['../classStaggeredGrid.html#aec8490affea703cdd73b1febaed68968',1,'StaggeredGrid']]], - ['dy_3',['dy',['../classStaggeredGrid.html#abde2da10e0c130fb0f206de64c9b4956',1,'StaggeredGrid']]] -]; diff --git a/documentation/html/search/functions_3.js b/documentation/html/search/functions_3.js deleted file mode 100644 index b8771a06..00000000 --- a/documentation/html/search/functions_3.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['f_0',['f',['../classStaggeredGrid.html#adb05c59512dc8993367e4beddba05785',1,'StaggeredGrid']]], - ['fibegin_1',['fIBegin',['../classStaggeredGrid.html#a5cc368f9ede58a3cb689705df998f750',1,'StaggeredGrid']]], - ['fieldvariable_2',['FieldVariable',['../classFieldVariable.html#aa0985778bc6331b74904a03c3ef67a98',1,'FieldVariable']]], - ['fiend_3',['fIEnd',['../classStaggeredGrid.html#a8162b849231354ba73aacb085b5cd665',1,'StaggeredGrid']]], - ['findabsmax_4',['findAbsMax',['../classFieldVariable.html#a55168fd422c70c8386ba311909427cf7',1,'FieldVariable']]], - ['fjbegin_5',['fJBegin',['../classStaggeredGrid.html#ab92aca90331200d0cc7bc0c0a857b4ef',1,'StaggeredGrid']]], - ['fjend_6',['fJEnd',['../classStaggeredGrid.html#a7ac43ac86231987bc0bf6565589d52e1',1,'StaggeredGrid']]] -]; diff --git a/documentation/html/search/functions_4.js b/documentation/html/search/functions_4.js deleted file mode 100644 index 59e6fbba..00000000 --- a/documentation/html/search/functions_4.js +++ /dev/null @@ -1,12 +0,0 @@ -var searchData= -[ - ['g_0',['g',['../classStaggeredGrid.html#aaf849bec40f7fa7c68823038f0877341',1,'StaggeredGrid']]], - ['gaussseidel_1',['GaussSeidel',['../classGaussSeidel.html#af31cc1ace2d616ebb8e0592c06865b9c',1,'GaussSeidel']]], - ['getnumberoffluidcells_2',['getNumberOfFluidCells',['../classMask.html#a3471a6026ce7eab118f660557a8abac6',1,'Mask']]], - ['getnumberofparticles_3',['getNumberOfParticles',['../classFluidTracer.html#adc687a4988f532e21e13c9aa0591d658',1,'FluidTracer']]], - ['getparticleposition_4',['getParticlePosition',['../classFluidTracer.html#a37ee0325d6af08be6eba8b073162342e',1,'FluidTracer']]], - ['gibegin_5',['gIBegin',['../classStaggeredGrid.html#a061fb6d6948cdc3054171dd60842a8c3',1,'StaggeredGrid']]], - ['giend_6',['gIEnd',['../classStaggeredGrid.html#aebc76693e5dd61db521d6763236bf664',1,'StaggeredGrid']]], - ['gjbegin_7',['gJBegin',['../classStaggeredGrid.html#a18ca3a121787b19c18886b0945aca2e3',1,'StaggeredGrid']]], - ['gjend_8',['gJEnd',['../classStaggeredGrid.html#a7a29456e1bce9efffa27de0b41957b50',1,'StaggeredGrid']]] -]; diff --git a/documentation/html/search/functions_5.js b/documentation/html/search/functions_5.js deleted file mode 100644 index 92857a86..00000000 --- a/documentation/html/search/functions_5.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['initialize_0',['initialize',['../classComputation.html#a4a344479797b15bd5c9ed2f262657339',1,'Computation']]], - ['interpolateat_1',['interpolateAt',['../classFieldVariable.html#a2949624f1d2d7e29872f743db0b1d83b',1,'FieldVariable']]], - ['isair_2',['isAir',['../classMask.html#a7eb34f789ef96c622ab93718d5278d77',1,'Mask']]], - ['isfluid_3',['isFluid',['../classMask.html#aadacef52f95b796920864b8519d0594b',1,'Mask']]], - ['isobstacle_4',['isObstacle',['../classMask.html#a53e4e7c0b29234856cbee33386cc5c18',1,'Mask']]] -]; diff --git a/documentation/html/search/functions_6.js b/documentation/html/search/functions_6.js deleted file mode 100644 index 73effe35..00000000 --- a/documentation/html/search/functions_6.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['loadfromfile_0',['loadFromFile',['../structSettings.html#a55f95e3b6e7379bef4f8399a2cd670cc',1,'Settings']]] -]; diff --git a/documentation/html/search/functions_7.js b/documentation/html/search/functions_7.js deleted file mode 100644 index 028ffad4..00000000 --- a/documentation/html/search/functions_7.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['mask_0',['Mask',['../classMask.html#a5d65d3a108a79864bc69994f5e56f6c3',1,'Mask']]], - ['meshwidth_1',['meshWidth',['../classStaggeredGrid.html#a330856d4efe952771daf0753ef84068e',1,'StaggeredGrid']]], - ['moveparticles_2',['moveParticles',['../classFluidTracer.html#aba4d452f26e9276b91256dd251789b90',1,'FluidTracer']]] -]; diff --git a/documentation/html/search/functions_8.js b/documentation/html/search/functions_8.js deleted file mode 100644 index 92b377ad..00000000 --- a/documentation/html/search/functions_8.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['ncells_0',['nCells',['../classStaggeredGrid.html#af37816ccb2c46e4a514dedac261897bf',1,'StaggeredGrid']]] -]; diff --git a/documentation/html/search/functions_9.js b/documentation/html/search/functions_9.js deleted file mode 100644 index d4da1e44..00000000 --- a/documentation/html/search/functions_9.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['operator_28_29_0',['operator()',['../classMask.html#a6d612f1ac2185304b3ad7432d90dcd2b',1,'Mask::operator()(int i, int j)'],['../classMask.html#a154acb41f2695c2a6ace82b5ebccbb1c',1,'Mask::operator()(int i, int j) const'],['../classArray2D.html#a9d49e5544f4acf51a57dcbb0ed1bb0f8',1,'Array2D::operator()(int i, int j)'],['../classArray2D.html#af745718ec25b815051de2d0c3c94e0d2',1,'Array2D::operator()(int i, int j) const']]], - ['outputwriter_1',['outputwriter',['../classOutputWriter.html#a4f3180552b8102c27e087357b9cdd1f7',1,'OutputWriter::OutputWriter()'],['../classOutputWriterText.html#a4f3180552b8102c27e087357b9cdd1f7',1,'OutputWriterText::OutputWriter()']]], - ['outputwriterparaview_2',['OutputWriterParaview',['../classOutputWriterParaview.html#a7a599c2694986563c801806234eb07d7',1,'OutputWriterParaview']]] -]; diff --git a/documentation/html/search/functions_a.js b/documentation/html/search/functions_a.js deleted file mode 100644 index c90bef05..00000000 --- a/documentation/html/search/functions_a.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['p_0',['p',['../classStaggeredGrid.html#aafe6e0bb3509f6aad272b94f74e7ffec',1,'StaggeredGrid::p() const'],['../classStaggeredGrid.html#aa6a5d99d9b4fbd9bd9cfa6ec071918f9',1,'StaggeredGrid::p(int i, int j) const'],['../classStaggeredGrid.html#aa09a4ca67141589bae153797fbc4f3c5',1,'StaggeredGrid::p(int i, int j)']]], - ['pibegin_1',['pIBegin',['../classStaggeredGrid.html#a9922c955707f2a31a4a27d1d696f002e',1,'StaggeredGrid']]], - ['piend_2',['pIEnd',['../classStaggeredGrid.html#a34f16fdf87971fe84ffc3c84722bb2c7',1,'StaggeredGrid']]], - ['pjbegin_3',['pJBegin',['../classStaggeredGrid.html#ae4c9ba16c5635dc1ffaa264fbcc3e034',1,'StaggeredGrid']]], - ['pjend_4',['pJEnd',['../classStaggeredGrid.html#ad9928ee522eedb7d7fd48ca0b92f2795',1,'StaggeredGrid']]], - ['pressuresolver_5',['PressureSolver',['../classPressureSolver.html#a10803d8c3d7f3810fc0ba059acf04058',1,'PressureSolver']]], - ['printsettings_6',['printSettings',['../structSettings.html#a68ce38117dcef2cbdd3bd17f127b3078',1,'Settings']]] -]; diff --git a/documentation/html/search/functions_b.js b/documentation/html/search/functions_b.js deleted file mode 100644 index 4e64c4dc..00000000 --- a/documentation/html/search/functions_b.js +++ /dev/null @@ -1,11 +0,0 @@ -var searchData= -[ - ['readsingleline_0',['readSingleLine',['../structSettings.html#a6dbc25f91b99664976cd4a0a8af153c9',1,'Settings']]], - ['resetmask_1',['resetMask',['../classMask.html#ac30997cdd83faef98290733acb325cf8',1,'Mask']]], - ['rhs_2',['rhs',['../classStaggeredGrid.html#a3f36422a02b9b18d1577d61e406f08cf',1,'StaggeredGrid::rhs() const'],['../classStaggeredGrid.html#a761ea51f1e8fd1290b3adfe09942b0d3',1,'StaggeredGrid::rhs(int i, int j)']]], - ['rhsibegin_3',['rhsIBegin',['../classStaggeredGrid.html#ad5c16b00d9dbf0f115e1ded81203edce',1,'StaggeredGrid']]], - ['rhsiend_4',['rhsIEnd',['../classStaggeredGrid.html#ae11e8842fdd508b914dc8f24b09b36a9',1,'StaggeredGrid']]], - ['rhsjbegin_5',['rhsJBegin',['../classStaggeredGrid.html#a28c36939e3d3cc8df76e7aa91f0e0804',1,'StaggeredGrid']]], - ['rhsjend_6',['rhsJEnd',['../classStaggeredGrid.html#a953ec890a986473bffe87ea26dfcd782',1,'StaggeredGrid']]], - ['runsimulation_7',['runSimulation',['../classComputation.html#ad20ce6e82ec9a918e6ac03840bc688d5',1,'Computation']]] -]; diff --git a/documentation/html/search/functions_c.js b/documentation/html/search/functions_c.js deleted file mode 100644 index 8ac7307e..00000000 --- a/documentation/html/search/functions_c.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['setboundaryvalues_0',['setBoundaryValues',['../classPressureSolver.html#a458c383fcacaf54c1a333a271049ca93',1,'PressureSolver']]], - ['setparameter_1',['setParameter',['../structSettings.html#a588f30eb8d791c03ec811360386bff0d',1,'Settings']]], - ['size_2',['size',['../classMask.html#aafa0857af35b02ba6070e76f82d51c7b',1,'Mask::size()'],['../classArray2D.html#accf87be860645d6c50d6ba6fa39ec6f9',1,'Array2D::size()']]], - ['solve_3',['solve',['../classGaussSeidel.html#a6f0eb0c6938a64f8ded186f88170a04b',1,'GaussSeidel::solve()'],['../classPressureSolver.html#a504ac61a1317650e0eb70d6a93212ca0',1,'PressureSolver::solve()'],['../classSOR.html#a860992d85d8aacf114a3a02b5831f728',1,'SOR::solve() override']]], - ['sor_4',['SOR',['../classSOR.html#a357cfea8935f4b2dfee06f2d8e1461a8',1,'SOR']]], - ['staggeredgrid_5',['StaggeredGrid',['../classStaggeredGrid.html#aec0990b64c559b1690f21b48fb2d13b1',1,'StaggeredGrid']]] -]; diff --git a/documentation/html/search/functions_d.js b/documentation/html/search/functions_d.js deleted file mode 100644 index 3c653a05..00000000 --- a/documentation/html/search/functions_d.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['u_0',['u',['../classStaggeredGrid.html#a87cee12621c641ab143a8b1a61b2ef7e',1,'StaggeredGrid::u() const'],['../classStaggeredGrid.html#a0324ce4d1fe2343d8aa9514e460cc556',1,'StaggeredGrid::u(int i, int j) const'],['../classStaggeredGrid.html#a0ed62d6752b6b2b3ead5f654b515cd12',1,'StaggeredGrid::u(int i, int j)']]], - ['uibegin_1',['uIBegin',['../classStaggeredGrid.html#a31e2d3a0b6e03685380810a7c2f323e1',1,'StaggeredGrid']]], - ['uiend_2',['uIEnd',['../classStaggeredGrid.html#a641e473d72e1d02ba3de1c16e9d0d332',1,'StaggeredGrid']]], - ['ujbegin_3',['uJBegin',['../classStaggeredGrid.html#a9b0e97704e1871441a8e713ecaa2cff5',1,'StaggeredGrid']]], - ['ujend_4',['uJEnd',['../classStaggeredGrid.html#a3393aa91b17054d2d700de308ae25632',1,'StaggeredGrid']]] -]; diff --git a/documentation/html/search/functions_e.js b/documentation/html/search/functions_e.js deleted file mode 100644 index 8b908be9..00000000 --- a/documentation/html/search/functions_e.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['v_0',['v',['../classStaggeredGrid.html#a26e478abba632554652c9e05a279d1ca',1,'StaggeredGrid::v() const'],['../classStaggeredGrid.html#ac052d8803ff950aee04b86ac026c516b',1,'StaggeredGrid::v(int i, int j) const'],['../classStaggeredGrid.html#a7746f703f32c2f20a4c77246eebac697',1,'StaggeredGrid::v(int i, int j)']]], - ['vibegin_1',['vIBegin',['../classStaggeredGrid.html#ace7bf8cb1d279131739d5d12de302d09',1,'StaggeredGrid']]], - ['viend_2',['vIEnd',['../classStaggeredGrid.html#aa5a44aa088b5a7923fa952af1ecb5778',1,'StaggeredGrid']]], - ['vjbegin_3',['vJBegin',['../classStaggeredGrid.html#a7f8468d672411c0e3a5eeb67788fc826',1,'StaggeredGrid']]], - ['vjend_4',['vJEnd',['../classStaggeredGrid.html#ab67e8d9d8d76d34fb02d4d644f0b3795',1,'StaggeredGrid']]] -]; diff --git a/documentation/html/search/functions_f.js b/documentation/html/search/functions_f.js deleted file mode 100644 index 9578483c..00000000 --- a/documentation/html/search/functions_f.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['writefile_0',['writefile',['../classOutputWriter.html#ac625c204affdc05919388a3549c2e945',1,'OutputWriter::writeFile()'],['../classOutputWriterParaview.html#a9e203b63d0e2f26ad53d18ee1821c6bb',1,'OutputWriterParaview::writeFile()'],['../classOutputWriterText.html#a25a12ea2524fc34e9acb19ef1f4c7431',1,'OutputWriterText::writeFile(double currentTime)']]], - ['writepressurefile_1',['writePressureFile',['../classOutputWriterText.html#a3480b58a23fd158f16d0ef9c1b67cbfd',1,'OutputWriterText']]] -]; diff --git a/documentation/html/search/mag.svg b/documentation/html/search/mag.svg deleted file mode 100644 index ffb6cf0d..00000000 --- a/documentation/html/search/mag.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - diff --git a/documentation/html/search/mag_d.svg b/documentation/html/search/mag_d.svg deleted file mode 100644 index 4122773f..00000000 --- a/documentation/html/search/mag_d.svg +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - diff --git a/documentation/html/search/mag_sel.svg b/documentation/html/search/mag_sel.svg deleted file mode 100644 index 553dba87..00000000 --- a/documentation/html/search/mag_sel.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - diff --git a/documentation/html/search/mag_seld.svg b/documentation/html/search/mag_seld.svg deleted file mode 100644 index c906f84c..00000000 --- a/documentation/html/search/mag_seld.svg +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - diff --git a/documentation/html/search/search.css b/documentation/html/search/search.css deleted file mode 100644 index 19f76f9d..00000000 --- a/documentation/html/search/search.css +++ /dev/null @@ -1,291 +0,0 @@ -/*---------------- Search Box positioning */ - -#main-menu > li:last-child { - /* This
  • object is the parent of the search bar */ - display: flex; - justify-content: center; - align-items: center; - height: 36px; - margin-right: 1em; -} - -/*---------------- Search box styling */ - -.SRPage * { - font-weight: normal; - line-height: normal; -} - -dark-mode-toggle { - margin-left: 5px; - display: flex; - float: right; -} - -#MSearchBox { - display: inline-block; - white-space : nowrap; - background: var(--search-background-color); - border-radius: 0.65em; - box-shadow: var(--search-box-shadow); - z-index: 102; -} - -#MSearchBox .left { - display: inline-block; - vertical-align: middle; - height: 1.4em; -} - -#MSearchSelect { - display: inline-block; - vertical-align: middle; - width: 20px; - height: 19px; - background-image: var(--search-magnification-select-image); - margin: 0 0 0 0.3em; - padding: 0; -} - -#MSearchSelectExt { - display: inline-block; - vertical-align: middle; - width: 10px; - height: 19px; - background-image: var(--search-magnification-image); - margin: 0 0 0 0.5em; - padding: 0; -} - - -#MSearchField { - display: inline-block; - vertical-align: middle; - width: 7.5em; - height: 19px; - margin: 0 0.15em; - padding: 0; - line-height: 1em; - border:none; - color: var(--search-foreground-color); - outline: none; - font-family: var(--font-family-search); - -webkit-border-radius: 0px; - border-radius: 0px; - background: none; -} - -@media(hover: none) { - /* to avoid zooming on iOS */ - #MSearchField { - font-size: 16px; - } -} - -#MSearchBox .right { - display: inline-block; - vertical-align: middle; - width: 1.4em; - height: 1.4em; -} - -#MSearchClose { - display: none; - font-size: inherit; - background : none; - border: none; - margin: 0; - padding: 0; - outline: none; - -} - -#MSearchCloseImg { - padding: 0.3em; - margin: 0; -} - -.MSearchBoxActive #MSearchField { - color: var(--search-active-color); -} - - - -/*---------------- Search filter selection */ - -#MSearchSelectWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid var(--search-filter-border-color); - background-color: var(--search-filter-background-color); - z-index: 10001; - padding-top: 4px; - padding-bottom: 4px; - -moz-border-radius: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -} - -.SelectItem { - font: 8pt var(--font-family-search); - padding-left: 2px; - padding-right: 12px; - border: 0px; -} - -span.SelectionMark { - margin-right: 4px; - font-family: var(--font-family-monospace); - outline-style: none; - text-decoration: none; -} - -a.SelectItem { - display: block; - outline-style: none; - color: var(--search-filter-foreground-color); - text-decoration: none; - padding-left: 6px; - padding-right: 12px; -} - -a.SelectItem:focus, -a.SelectItem:active { - color: var(--search-filter-foreground-color); - outline-style: none; - text-decoration: none; -} - -a.SelectItem:hover { - color: var(--search-filter-highlight-text-color); - background-color: var(--search-filter-highlight-bg-color); - outline-style: none; - text-decoration: none; - cursor: pointer; - display: block; -} - -/*---------------- Search results window */ - -iframe#MSearchResults { - /*width: 60ex;*/ - height: 15em; -} - -#MSearchResultsWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid var(--search-results-border-color); - background-color: var(--search-results-background-color); - z-index:10000; - width: 300px; - height: 400px; - overflow: auto; -} - -/* ----------------------------------- */ - - -#SRIndex { - clear:both; -} - -.SREntry { - font-size: 10pt; - padding-left: 1ex; -} - -.SRPage .SREntry { - font-size: 8pt; - padding: 1px 5px; -} - -div.SRPage { - margin: 5px 2px; - background-color: var(--search-results-background-color); -} - -.SRChildren { - padding-left: 3ex; padding-bottom: .5em -} - -.SRPage .SRChildren { - display: none; -} - -.SRSymbol { - font-weight: bold; - color: var(--search-results-foreground-color); - font-family: var(--font-family-search); - text-decoration: none; - outline: none; -} - -a.SRScope { - display: block; - color: var(--search-results-foreground-color); - font-family: var(--font-family-search); - font-size: 8pt; - text-decoration: none; - outline: none; -} - -a.SRSymbol:focus, a.SRSymbol:active, -a.SRScope:focus, a.SRScope:active { - text-decoration: underline; -} - -span.SRScope { - padding-left: 4px; - font-family: var(--font-family-search); -} - -.SRPage .SRStatus { - padding: 2px 5px; - font-size: 8pt; - font-style: italic; - font-family: var(--font-family-search); -} - -.SRResult { - display: none; -} - -div.searchresults { - margin-left: 10px; - margin-right: 10px; -} - -/*---------------- External search page results */ - -.pages b { - color: white; - padding: 5px 5px 3px 5px; - background-image: var(--nav-gradient-active-image-parent); - background-repeat: repeat-x; - text-shadow: 0 1px 1px #000000; -} - -.pages { - line-height: 17px; - margin-left: 4px; - text-decoration: none; -} - -.hl { - font-weight: bold; -} - -#searchresults { - margin-bottom: 20px; -} - -.searchpages { - margin-top: 10px; -} - diff --git a/documentation/html/search/search.js b/documentation/html/search/search.js deleted file mode 100644 index 666af01e..00000000 --- a/documentation/html/search/search.js +++ /dev/null @@ -1,694 +0,0 @@ -/* - @licstart The following is the entire license notice for the JavaScript code in this file. - - The MIT License (MIT) - - Copyright (C) 1997-2020 by Dimitri van Heesch - - Permission is hereby granted, free of charge, to any person obtaining a copy of this software - and associated documentation files (the "Software"), to deal in the Software without restriction, - including without limitation the rights to use, copy, modify, merge, publish, distribute, - sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all copies or - substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - @licend The above is the entire license notice for the JavaScript code in this file - */ -const SEARCH_COOKIE_NAME = ''+'search_grp'; - -const searchResults = new SearchResults(); - -/* A class handling everything associated with the search panel. - - Parameters: - name - The name of the global variable that will be - storing this instance. Is needed to be able to set timeouts. - resultPath - path to use for external files -*/ -function SearchBox(name, resultsPath, extension) { - if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } - if (!extension || extension == "") { extension = ".html"; } - - function getXPos(item) { - let x = 0; - if (item.offsetWidth) { - while (item && item!=document.body) { - x += item.offsetLeft; - item = item.offsetParent; - } - } - return x; - } - - function getYPos(item) { - let y = 0; - if (item.offsetWidth) { - while (item && item!=document.body) { - y += item.offsetTop; - item = item.offsetParent; - } - } - return y; - } - - // ---------- Instance variables - this.name = name; - this.resultsPath = resultsPath; - this.keyTimeout = 0; - this.keyTimeoutLength = 500; - this.closeSelectionTimeout = 300; - this.lastSearchValue = ""; - this.lastResultsPage = ""; - this.hideTimeout = 0; - this.searchIndex = 0; - this.searchActive = false; - this.extension = extension; - - // ----------- DOM Elements - - this.DOMSearchField = () => document.getElementById("MSearchField"); - this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); - this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); - this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); - this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); - this.DOMSearchClose = () => document.getElementById("MSearchClose"); - this.DOMSearchBox = () => document.getElementById("MSearchBox"); - - // ------------ Event Handlers - - // Called when focus is added or removed from the search field. - this.OnSearchFieldFocus = function(isActive) { - this.Activate(isActive); - } - - this.OnSearchSelectShow = function() { - const searchSelectWindow = this.DOMSearchSelectWindow(); - const searchField = this.DOMSearchSelect(); - - const left = getXPos(searchField); - const top = getYPos(searchField) + searchField.offsetHeight; - - // show search selection popup - searchSelectWindow.style.display='block'; - searchSelectWindow.style.left = left + 'px'; - searchSelectWindow.style.top = top + 'px'; - - // stop selection hide timer - if (this.hideTimeout) { - clearTimeout(this.hideTimeout); - this.hideTimeout=0; - } - return false; // to avoid "image drag" default event - } - - this.OnSearchSelectHide = function() { - this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), - this.closeSelectionTimeout); - } - - // Called when the content of the search field is changed. - this.OnSearchFieldChange = function(evt) { - if (this.keyTimeout) { // kill running timer - clearTimeout(this.keyTimeout); - this.keyTimeout = 0; - } - - const e = evt ? evt : window.event; // for IE - if (e.keyCode==40 || e.keyCode==13) { - if (e.shiftKey==1) { - this.OnSearchSelectShow(); - const win=this.DOMSearchSelectWindow(); - for (let i=0;i do a search - this.Search(); - } - } - - this.OnSearchSelectKey = function(evt) { - const e = (evt) ? evt : window.event; // for IE - if (e.keyCode==40 && this.searchIndex0) { // Up - this.searchIndex--; - this.OnSelectItem(this.searchIndex); - } else if (e.keyCode==13 || e.keyCode==27) { - e.stopPropagation(); - this.OnSelectItem(this.searchIndex); - this.CloseSelectionWindow(); - this.DOMSearchField().focus(); - } - return false; - } - - // --------- Actions - - // Closes the results window. - this.CloseResultsWindow = function() { - this.DOMPopupSearchResultsWindow().style.display = 'none'; - this.DOMSearchClose().style.display = 'none'; - this.Activate(false); - } - - this.CloseSelectionWindow = function() { - this.DOMSearchSelectWindow().style.display = 'none'; - } - - // Performs a search. - this.Search = function() { - this.keyTimeout = 0; - - // strip leading whitespace - const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); - - const code = searchValue.toLowerCase().charCodeAt(0); - let idxChar = searchValue.substr(0, 1).toLowerCase(); - if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair - idxChar = searchValue.substr(0, 2); - } - - let jsFile; - let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); - if (idx!=-1) { - const hexCode=idx.toString(16); - jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; - } - - const loadJS = function(url, impl, loc) { - const scriptTag = document.createElement('script'); - scriptTag.src = url; - scriptTag.onload = impl; - scriptTag.onreadystatechange = impl; - loc.appendChild(scriptTag); - } - - const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); - const domSearchBox = this.DOMSearchBox(); - const domPopupSearchResults = this.DOMPopupSearchResults(); - const domSearchClose = this.DOMSearchClose(); - const resultsPath = this.resultsPath; - - const handleResults = function() { - document.getElementById("Loading").style.display="none"; - if (typeof searchData !== 'undefined') { - createResults(resultsPath); - document.getElementById("NoMatches").style.display="none"; - } - - if (idx!=-1) { - searchResults.Search(searchValue); - } else { // no file with search results => force empty search results - searchResults.Search('===='); - } - - if (domPopupSearchResultsWindow.style.display!='block') { - domSearchClose.style.display = 'inline-block'; - let left = getXPos(domSearchBox) + 150; - let top = getYPos(domSearchBox) + 20; - domPopupSearchResultsWindow.style.display = 'block'; - left -= domPopupSearchResults.offsetWidth; - const maxWidth = document.body.clientWidth; - const maxHeight = document.body.clientHeight; - let width = 300; - if (left<10) left=10; - if (width+left+8>maxWidth) width=maxWidth-left-8; - let height = 400; - if (height+top+8>maxHeight) height=maxHeight-top-8; - domPopupSearchResultsWindow.style.top = top + 'px'; - domPopupSearchResultsWindow.style.left = left + 'px'; - domPopupSearchResultsWindow.style.width = width + 'px'; - domPopupSearchResultsWindow.style.height = height + 'px'; - } - } - - if (jsFile) { - loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); - } else { - handleResults(); - } - - this.lastSearchValue = searchValue; - } - - // -------- Activation Functions - - // Activates or deactivates the search panel, resetting things to - // their default values if necessary. - this.Activate = function(isActive) { - if (isActive || // open it - this.DOMPopupSearchResultsWindow().style.display == 'block' - ) { - this.DOMSearchBox().className = 'MSearchBoxActive'; - this.searchActive = true; - } else if (!isActive) { // directly remove the panel - this.DOMSearchBox().className = 'MSearchBoxInactive'; - this.searchActive = false; - this.lastSearchValue = '' - this.lastResultsPage = ''; - this.DOMSearchField().value = ''; - } - } -} - -// ----------------------------------------------------------------------- - -// The class that handles everything on the search results page. -function SearchResults() { - - function convertToId(search) { - let result = ''; - for (let i=0;i. - this.lastMatchCount = 0; - this.lastKey = 0; - this.repeatOn = false; - - // Toggles the visibility of the passed element ID. - this.FindChildElement = function(id) { - const parentElement = document.getElementById(id); - let element = parentElement.firstChild; - - while (element && element!=parentElement) { - if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { - return element; - } - - if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { - element = element.firstChild; - } else if (element.nextSibling) { - element = element.nextSibling; - } else { - do { - element = element.parentNode; - } - while (element && element!=parentElement && !element.nextSibling); - - if (element && element!=parentElement) { - element = element.nextSibling; - } - } - } - } - - this.Toggle = function(id) { - const element = this.FindChildElement(id); - if (element) { - if (element.style.display == 'block') { - element.style.display = 'none'; - } else { - element.style.display = 'block'; - } - } - } - - // Searches for the passed string. If there is no parameter, - // it takes it from the URL query. - // - // Always returns true, since other documents may try to call it - // and that may or may not be possible. - this.Search = function(search) { - if (!search) { // get search word from URL - search = window.location.search; - search = search.substring(1); // Remove the leading '?' - search = unescape(search); - } - - search = search.replace(/^ +/, ""); // strip leading spaces - search = search.replace(/ +$/, ""); // strip trailing spaces - search = search.toLowerCase(); - search = convertToId(search); - - const resultRows = document.getElementsByTagName("div"); - let matches = 0; - - let i = 0; - while (i < resultRows.length) { - const row = resultRows.item(i); - if (row.className == "SRResult") { - let rowMatchName = row.id.toLowerCase(); - rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' - - if (search.length<=rowMatchName.length && - rowMatchName.substr(0, search.length)==search) { - row.style.display = 'block'; - matches++; - } else { - row.style.display = 'none'; - } - } - i++; - } - document.getElementById("Searching").style.display='none'; - if (matches == 0) { // no results - document.getElementById("NoMatches").style.display='block'; - } else { // at least one result - document.getElementById("NoMatches").style.display='none'; - } - this.lastMatchCount = matches; - return true; - } - - // return the first item with index index or higher that is visible - this.NavNext = function(index) { - let focusItem; - for (;;) { - const focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { - break; - } else if (!focusItem) { // last element - break; - } - focusItem=null; - index++; - } - return focusItem; - } - - this.NavPrev = function(index) { - let focusItem; - for (;;) { - const focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { - break; - } else if (!focusItem) { // last element - break; - } - focusItem=null; - index--; - } - return focusItem; - } - - this.ProcessKeys = function(e) { - if (e.type == "keydown") { - this.repeatOn = false; - this.lastKey = e.keyCode; - } else if (e.type == "keypress") { - if (!this.repeatOn) { - if (this.lastKey) this.repeatOn = true; - return false; // ignore first keypress after keydown - } - } else if (e.type == "keyup") { - this.lastKey = 0; - this.repeatOn = false; - } - return this.lastKey!=0; - } - - this.Nav = function(evt,itemIndex) { - const e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) { // Up - const newIndex = itemIndex-1; - let focusItem = this.NavPrev(newIndex); - if (focusItem) { - let child = this.FindChildElement(focusItem.parentNode.parentNode.id); - if (child && child.style.display == 'block') { // children visible - let n=0; - let tmpElem; - for (;;) { // search for last child - tmpElem = document.getElementById('Item'+newIndex+'_c'+n); - if (tmpElem) { - focusItem = tmpElem; - } else { // found it! - break; - } - n++; - } - } - } - if (focusItem) { - focusItem.focus(); - } else { // return focus to search field - document.getElementById("MSearchField").focus(); - } - } else if (this.lastKey==40) { // Down - const newIndex = itemIndex+1; - let focusItem; - const item = document.getElementById('Item'+itemIndex); - const elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem && elem.style.display == 'block') { // children visible - focusItem = document.getElementById('Item'+itemIndex+'_c0'); - } - if (!focusItem) focusItem = this.NavNext(newIndex); - if (focusItem) focusItem.focus(); - } else if (this.lastKey==39) { // Right - const item = document.getElementById('Item'+itemIndex); - const elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'block'; - } else if (this.lastKey==37) { // Left - const item = document.getElementById('Item'+itemIndex); - const elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'none'; - } else if (this.lastKey==27) { // Escape - e.stopPropagation(); - searchBox.CloseResultsWindow(); - document.getElementById("MSearchField").focus(); - } else if (this.lastKey==13) { // Enter - return true; - } - return false; - } - - this.NavChild = function(evt,itemIndex,childIndex) { - const e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) { // Up - if (childIndex>0) { - const newIndex = childIndex-1; - document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); - } else { // already at first child, jump to parent - document.getElementById('Item'+itemIndex).focus(); - } - } else if (this.lastKey==40) { // Down - const newIndex = childIndex+1; - let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); - if (!elem) { // last child, jump to parent next parent - elem = this.NavNext(itemIndex+1); - } - if (elem) { - elem.focus(); - } - } else if (this.lastKey==27) { // Escape - e.stopPropagation(); - searchBox.CloseResultsWindow(); - document.getElementById("MSearchField").focus(); - } else if (this.lastKey==13) { // Enter - return true; - } - return false; - } -} - -function createResults(resultsPath) { - - function setKeyActions(elem,action) { - elem.setAttribute('onkeydown',action); - elem.setAttribute('onkeypress',action); - elem.setAttribute('onkeyup',action); - } - - function setClassAttr(elem,attr) { - elem.setAttribute('class',attr); - elem.setAttribute('className',attr); - } - - const results = document.getElementById("SRResults"); - results.innerHTML = ''; - searchData.forEach((elem,index) => { - const id = elem[0]; - const srResult = document.createElement('div'); - srResult.setAttribute('id','SR_'+id); - setClassAttr(srResult,'SRResult'); - const srEntry = document.createElement('div'); - setClassAttr(srEntry,'SREntry'); - const srLink = document.createElement('a'); - srLink.setAttribute('id','Item'+index); - setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); - setClassAttr(srLink,'SRSymbol'); - srLink.innerHTML = elem[1][0]; - srEntry.appendChild(srLink); - if (elem[1].length==2) { // single result - srLink.setAttribute('href',resultsPath+elem[1][1][0]); - srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); - if (elem[1][1][1]) { - srLink.setAttribute('target','_parent'); - } else { - srLink.setAttribute('target','_blank'); - } - const srScope = document.createElement('span'); - setClassAttr(srScope,'SRScope'); - srScope.innerHTML = elem[1][1][2]; - srEntry.appendChild(srScope); - } else { // multiple results - srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); - const srChildren = document.createElement('div'); - setClassAttr(srChildren,'SRChildren'); - for (let c=0; c - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/settings_parser/settings.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    settings.h
    -
    -
    -
    1#pragma once
    -
    2
    -
    3#include <iostream>
    -
    4#include <array>
    -
    5#include <fstream>
    -
    6#include <iostream>
    -
    7#include <functional>
    -
    8
    -
    - -
    14{
    -
    15 std::array<int, 2> nCells;
    -
    16 std::array<double, 2> physicalSize;
    -
    17 double re = 1000;
    -
    18 double endTime = 10.0;
    -
    19 double tau = 0.5;
    -
    20 double maximumDt = 0.1;
    -
    21
    -
    22 std::array<double, 2> g{0., 0.};
    -
    23
    -
    24 bool useDonorCell = false;
    -
    25 double alpha = 0.5;
    -
    26
    -
    27 // Boundary Conditions Type
    -
    28 std::string BCTop = "NoSlip";
    -
    29 std::string BCRight = "NoSlip";
    -
    30 std::string BCBottom = "NoSlip";
    -
    31 std::string BCLeft = "NoSlip";
    -
    32
    -
    33 // NoSlip boundary conditions
    -
    34 std::array<double, 2> NoSlipVelTop;
    -
    35 std::array<double, 2> NoSlipVelRight;
    -
    36 std::array<double, 2> NoSlipVelBottom;
    -
    37 std::array<double, 2> NoSlipVelLeft;
    -
    38
    -
    39 // Pressure boundary conditions
    -
    40 double PressureTop;
    - - -
    43 double PressureLeft;
    -
    44
    -
    45 // Create rectangular obstacle in domain
    - -
    47
    -
    48 // Create domain from PNGBitmap
    - -
    50 std::string pathToBitmap;
    -
    51
    -
    52 std::array<double, 2> obstaclePosition;
    -
    53 std::array<double, 2> obstacleDimension;
    -
    54
    -
    55 std::string pressureSolver = "SOR";
    -
    56 double omega = 1.0;
    -
    57 double epsilon = 1e-5;
    - -
    59
    -
    65 void loadFromFile(std::string filename);
    -
    66
    -
    70 void printSettings();
    -
    71
    -
    - -
    77 {
    -
    78 std::string parameterName;
    -
    79 std::string value;
    -
    80 bool isContent;
    -
    81 };
    -
    -
    82
    -
    88 LineContent readSingleLine(std::string line);
    -
    89
    -
    90 // sets the parameter to the corresponding value
    -
    97 void setParameter(std::string parameterName, std::string value);
    -
    98};
    -
    -
    Contains the content of a single line in a file.
    Definition settings.h:77
    -
    std::string value
    value of the parameter
    Definition settings.h:79
    -
    std::string parameterName
    Name of parameter.
    Definition settings.h:78
    -
    bool isContent
    whether line is readable parameter or comment
    Definition settings.h:80
    -
    All settings that parametrize a simulation run.
    Definition settings.h:14
    -
    bool useDonorCell
    if the donor cell scheme schould be used
    Definition settings.h:24
    -
    std::array< double, 2 > NoSlipVelBottom
    prescribed values of u,v at bottom of domain
    Definition settings.h:36
    -
    std::array< double, 2 > g
    external forces
    Definition settings.h:22
    -
    std::array< double, 2 > NoSlipVelRight
    prescribed values of u,v at right of domain
    Definition settings.h:35
    -
    std::array< double, 2 > physicalSize
    physical size of the domain
    Definition settings.h:16
    -
    std::string pathToBitmap
    path to bitmap
    Definition settings.h:50
    -
    std::array< int, 2 > nCells
    number of cells in x and y direction
    Definition settings.h:15
    -
    double PressureLeft
    prescribed pressure BC left of domain
    Definition settings.h:43
    -
    void loadFromFile(std::string filename)
    Parse a text file with settings.
    Definition settings.cpp:3
    -
    void setParameter(std::string parameterName, std::string value)
    Sets the parameter to the corresponding value.
    Definition settings.cpp:99
    -
    double PressureTop
    prescribed pressure BC top of domain
    Definition settings.h:40
    -
    bool createDomainfromBitmap
    wheter domain should be created from bitmap
    Definition settings.h:49
    -
    void printSettings()
    Print all setting to terminal.
    Definition settings.cpp:40
    -
    LineContent readSingleLine(std::string line)
    Reads one line of the settings file.
    Definition settings.cpp:53
    -
    double endTime
    end time of the simulation
    Definition settings.h:18
    -
    std::array< double, 2 > NoSlipVelTop
    prescribed values of u,v at top of domain
    Definition settings.h:34
    -
    std::string pressureSolver
    which pressure solver to use, "GaussSeidel" or "SOR"
    Definition settings.h:55
    -
    double alpha
    factor for donor-cell scheme
    Definition settings.h:25
    -
    double re
    reynolds number
    Definition settings.h:17
    -
    double PressureRight
    prescribed pressure BC right of domain
    Definition settings.h:41
    -
    double maximumDt
    maximum time step width
    Definition settings.h:20
    -
    bool createRectangularObject
    wheter a rectangular object in domain should be created
    Definition settings.h:46
    -
    double epsilon
    tolerance for the residual in the pressure solver
    Definition settings.h:57
    -
    std::array< double, 2 > NoSlipVelLeft
    prescribed values of u,v at left of domain
    Definition settings.h:37
    -
    int maximumNumberOfIterations
    maximum number of iterations in the solver
    Definition settings.h:58
    -
    double PressureBottom
    prescribed pressure BC bottom of domain
    Definition settings.h:42
    -
    double tau
    safety factor for time step width
    Definition settings.h:19
    -
    std::array< double, 2 > obstacleDimension
    x and y dimension of rectangular object
    Definition settings.h:53
    -
    double omega
    overrelaxation factor
    Definition settings.h:56
    -
    std::array< double, 2 > obstaclePosition
    x and y position of rectangular object
    Definition settings.h:52
    -
    - - - - diff --git a/documentation/html/sor_8h_source.html b/documentation/html/sor_8h_source.html deleted file mode 100644 index 5a403483..00000000 --- a/documentation/html/sor_8h_source.html +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/solver/sor.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    sor.h
    -
    -
    -
    1#pragma once
    -
    2
    -
    3#include "pressure_solver.h"
    -
    4
    -
    -
    10class SOR : public PressureSolver
    -
    11{
    -
    12
    -
    13public:
    -
    22 SOR(const std::shared_ptr<Discretization> &data,
    -
    23 double epsilon,
    -
    24 int maximumNumberOfIterations,
    -
    25 std::shared_ptr<Boundary> boundary,
    -
    26 double omega);
    -
    27
    -
    32 void solve() override;
    -
    33
    -
    34private:
    -
    35 double omega_;
    -
    36};
    -
    -
    Solves the Poisson problem for the pressure.
    Definition pressure_solver.h:21
    -
    Successive over-relaxation solver.
    Definition sor.h:11
    -
    SOR(const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary, double omega)
    Constructor.
    Definition sor.cpp:4
    -
    void solve() override
    override function that starts solver.
    Definition sor.cpp:12
    -
    - - - - diff --git a/documentation/html/splitbar.png b/documentation/html/splitbar.png deleted file mode 100644 index fe895f2c58179b471a22d8320b39a4bd7312ec8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T diff --git a/documentation/html/splitbard.png b/documentation/html/splitbard.png deleted file mode 100644 index 8367416d757fd7b6dc4272b6432dc75a75abd068..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf@VhhFKy35^fiT zT~&lUj3=cDh^%3HDY9k5CEku}PHXNoNC(_$U3XPb&Q*ME25pT;2(*BOgAf<+R$lzakPG`kF31()Fx{L5Wrac|GQzjeE= zueY1`Ze{#x<8=S|`~MgGetGce)#vN&|J{Cd^tS%;tBYTo?+^d68<#n_Y_xx`J||4O V@QB{^CqU0Kc)I$ztaD0e0svEzbJzd? diff --git a/documentation/html/staggered__grid_8h_source.html b/documentation/html/staggered__grid_8h_source.html deleted file mode 100644 index ca9858fa..00000000 --- a/documentation/html/staggered__grid_8h_source.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - -NumSim: /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/discretization/staggered_grid.h Source File - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    staggered_grid.h
    -
    -
    -
    1#include <array>
    -
    2#include <vector>
    -
    3#include <iostream>
    -
    4#include "../storage/field_variable.h"
    -
    5
    -
    - -
    15{
    -
    16public:
    -
    23 StaggeredGrid(std::array<int, 2> nCells, std::array<double, 2> meshWidth);
    -
    24
    -
    28 const std::array<double, 2> meshWidth() const;
    -
    32 const std::array<int, 2> nCells() const;
    -
    33
    -
    37 const FieldVariable &u() const;
    -
    41 const FieldVariable &v() const;
    -
    45 const FieldVariable &p() const;
    -
    49 const FieldVariable &rhs() const;
    -
    50
    -
    54 double u(int i, int j) const;
    -
    58 double &u(int i, int j);
    -
    59
    -
    63 double v(int i, int j) const;
    -
    67 double &v(int i, int j);
    -
    68
    -
    72 double p(int i, int j) const;
    -
    76 double &p(int i, int j);
    -
    77
    -
    81 double &f(int i, int j);
    -
    85 double &g(int i, int j);
    -
    89 double &rhs(int i, int j);
    -
    90
    -
    94 double dx() const;
    -
    98 double dy() const;
    -
    99
    -
    103 int uIBegin() const;
    -
    107 int uIEnd() const;
    -
    108
    -
    112 int uJBegin() const;
    -
    116 int uJEnd() const;
    -
    117
    -
    121 int vIBegin() const;
    -
    125 int vIEnd() const;
    -
    126
    -
    130 int vJBegin() const;
    -
    134 int vJEnd() const;
    -
    135
    -
    139 int pIBegin() const;
    -
    143 int pIEnd() const;
    -
    144
    -
    148 int pJBegin() const;
    -
    152 int pJEnd() const;
    -
    153
    -
    157 int fIBegin() const;
    -
    161 int fIEnd() const;
    -
    162
    -
    166 int fJBegin() const;
    -
    170 int fJEnd() const;
    -
    171
    -
    175 int gIBegin() const;
    -
    179 int gIEnd() const;
    -
    180
    -
    184 int gJBegin() const;
    -
    188 int gJEnd() const;
    -
    189
    -
    193 int rhsIBegin() const;
    -
    197 int rhsIEnd() const;
    -
    198
    -
    202 int rhsJBegin() const;
    -
    206 int rhsJEnd() const;
    -
    207
    -
    208protected:
    -
    209 const std::array<int, 2> nCells_;
    -
    210 const std::array<double, 2> meshWidth_;
    - - - - - - -
    217};
    -
    -
    Discretization of a scalar function.
    Definition field_variable.h:18
    -
    Create field variables and define limits for the indices.
    Definition staggered_grid.h:15
    -
    int gIBegin() const
    first valid index for g in x direction
    Definition staggered_grid.cpp:159
    -
    int gJBegin() const
    first valid index for g in y direction
    Definition staggered_grid.cpp:169
    -
    FieldVariable v_
    instance of the field variable v
    Definition staggered_grid.h:212
    -
    const FieldVariable & v() const
    Get a reference to the field variable v.
    Definition staggered_grid.cpp:29
    -
    int rhsJBegin() const
    first valid index for rhs in y direction
    Definition staggered_grid.cpp:209
    -
    FieldVariable p_
    instance of the field variable p
    Definition staggered_grid.h:213
    -
    int uIBegin() const
    first valid index for u in x direction
    Definition staggered_grid.cpp:99
    -
    const std::array< double, 2 > meshWidth() const
    Get the length of a single cell in x and y directions.
    Definition staggered_grid.cpp:14
    -
    int uJEnd() const
    one after last valid index for u in y direction
    Definition staggered_grid.cpp:114
    -
    int pIEnd() const
    one after last valid index for p in x direction
    Definition staggered_grid.cpp:184
    -
    const FieldVariable & rhs() const
    Get a reference to the field variable rhs.
    Definition staggered_grid.cpp:39
    -
    FieldVariable rhs_
    instance of the field variable rhs
    Definition staggered_grid.h:216
    -
    int fIBegin() const
    first valid index for f in x direction
    Definition staggered_grid.cpp:119
    -
    FieldVariable g_
    instance of the field variable g
    Definition staggered_grid.h:215
    -
    int uIEnd() const
    one after last valid index for u in x direction
    Definition staggered_grid.cpp:104
    -
    int gJEnd() const
    one after last valid index for g in y direction
    Definition staggered_grid.cpp:174
    -
    int fJEnd() const
    one after last valid index for f in y direction
    Definition staggered_grid.cpp:134
    -
    int vJBegin() const
    first valid index for v in y direction
    Definition staggered_grid.cpp:149
    -
    int fIEnd() const
    one after last valid index for f in x direction
    Definition staggered_grid.cpp:124
    -
    const FieldVariable & u() const
    Get a reference to the field variable u.
    Definition staggered_grid.cpp:24
    -
    FieldVariable f_
    instance of the field variable f
    Definition staggered_grid.h:214
    -
    int rhsJEnd() const
    one after last valid index for rhs in y direction
    Definition staggered_grid.cpp:214
    -
    const std::array< double, 2 > meshWidth_
    array containing the sizes of cell edges in x and y directions
    Definition staggered_grid.h:210
    -
    int pIBegin() const
    first valid index for p in x direction
    Definition staggered_grid.cpp:179
    -
    int uJBegin() const
    first valid index for u in y direction
    Definition staggered_grid.cpp:109
    -
    int vIEnd() const
    one after last valid index for v in x direction
    Definition staggered_grid.cpp:144
    -
    double & g(int i, int j)
    Access value of g in element (i,j)
    Definition staggered_grid.cpp:79
    -
    const FieldVariable & p() const
    Get a reference to the field variable p.
    Definition staggered_grid.cpp:34
    -
    int vJEnd() const
    one after last valid index for v in y direction
    Definition staggered_grid.cpp:154
    -
    int fJBegin() const
    first valid index for f in y direction
    Definition staggered_grid.cpp:129
    -
    double dy() const
    Get the mesh width in y-direction.
    Definition staggered_grid.cpp:94
    -
    const std::array< int, 2 > nCells_
    array containing number of cells in x and y directions
    Definition staggered_grid.h:209
    -
    int vIBegin() const
    first valid index for v in x direction
    Definition staggered_grid.cpp:139
    -
    int rhsIBegin() const
    first valid index for rhs in x direction
    Definition staggered_grid.cpp:199
    -
    int pJEnd() const
    one after last valid index for p in y direction
    Definition staggered_grid.cpp:194
    -
    double & f(int i, int j)
    Access value of f in element (i,j)
    Definition staggered_grid.cpp:74
    -
    FieldVariable u_
    instance of the field variable u
    Definition staggered_grid.h:211
    -
    int rhsIEnd() const
    one after last valid index for rhs in x direction
    Definition staggered_grid.cpp:204
    -
    int pJBegin() const
    first valid index for p in y direction
    Definition staggered_grid.cpp:189
    -
    int gIEnd() const
    one after last valid index for g in x direction
    Definition staggered_grid.cpp:164
    -
    StaggeredGrid(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
    Constructor.
    Definition staggered_grid.cpp:3
    -
    double dx() const
    Get the mesh width in x-direction.
    Definition staggered_grid.cpp:89
    -
    const std::array< int, 2 > nCells() const
    Get number of cells in x and y directions.
    Definition staggered_grid.cpp:19
    -
    - - - - diff --git a/documentation/html/structSettings-members.html b/documentation/html/structSettings-members.html deleted file mode 100644 index c9be4e3f..00000000 --- a/documentation/html/structSettings-members.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    -
    Settings Member List
    -
    - - - - - diff --git a/documentation/html/structSettings.html b/documentation/html/structSettings.html deleted file mode 100644 index b0244700..00000000 --- a/documentation/html/structSettings.html +++ /dev/null @@ -1,326 +0,0 @@ - - - - - - - -NumSim: Settings Struct Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - -
    -
    - -
    Settings Struct Reference
    -
    -
    - -

    All settings that parametrize a simulation run. - More...

    - -

    #include <settings.h>

    - - - - - -

    -Classes

    struct  LineContent
     Contains the content of a single line in a file. More...
     
    - - - - - - - - - - - - - -

    -Public Member Functions

    void loadFromFile (std::string filename)
     Parse a text file with settings.
     
    -void printSettings ()
     Print all setting to terminal.
     
    LineContent readSingleLine (std::string line)
     Reads one line of the settings file.
     
    void setParameter (std::string parameterName, std::string value)
     Sets the parameter to the corresponding value.
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Attributes

    -std::array< int, 2 > nCells
     number of cells in x and y direction
     
    -std::array< double, 2 > physicalSize
     physical size of the domain
     
    -double re = 1000
     reynolds number
     
    -double endTime = 10.0
     end time of the simulation
     
    -double tau = 0.5
     safety factor for time step width
     
    -double maximumDt = 0.1
     maximum time step width
     
    -std::array< double, 2 > g {0., 0.}
     external forces
     
    -bool useDonorCell = false
     if the donor cell scheme schould be used
     
    -double alpha = 0.5
     factor for donor-cell scheme
     
    -std::string BCTop = "NoSlip"
     
    -std::string BCRight = "NoSlip"
     
    -std::string BCBottom = "NoSlip"
     
    -std::string BCLeft = "NoSlip"
     
    -std::array< double, 2 > NoSlipVelTop
     prescribed values of u,v at top of domain
     
    -std::array< double, 2 > NoSlipVelRight
     prescribed values of u,v at right of domain
     
    -std::array< double, 2 > NoSlipVelBottom
     prescribed values of u,v at bottom of domain
     
    -std::array< double, 2 > NoSlipVelLeft
     prescribed values of u,v at left of domain
     
    -double PressureTop
     prescribed pressure BC top of domain
     
    -double PressureRight
     prescribed pressure BC right of domain
     
    -double PressureBottom
     prescribed pressure BC bottom of domain
     
    -double PressureLeft
     prescribed pressure BC left of domain
     
    -bool createRectangularObject = false
     wheter a rectangular object in domain should be created
     
    -bool createDomainfromBitmap = false
     wheter domain should be created from bitmap
     
    -std::string pathToBitmap
     path to bitmap
     
    -std::array< double, 2 > obstaclePosition
     x and y position of rectangular object
     
    -std::array< double, 2 > obstacleDimension
     x and y dimension of rectangular object
     
    -std::string pressureSolver = "SOR"
     which pressure solver to use, "GaussSeidel" or "SOR"
     
    -double omega = 1.0
     overrelaxation factor
     
    -double epsilon = 1e-5
     tolerance for the residual in the pressure solver
     
    -int maximumNumberOfIterations = 1e5
     maximum number of iterations in the solver
     
    -

    Detailed Description

    -

    All settings that parametrize a simulation run.

    -

    Member Function Documentation

    - -

    ◆ loadFromFile()

    - -
    -
    - - - - - - - - -
    void Settings::loadFromFile (std::string filename)
    -
    - -

    Parse a text file with settings.

    -

    Each line contains "<parameterName> = <value>"

    - -
    -
    - -

    ◆ readSingleLine()

    - -
    -
    - - - - - - - - -
    Settings::LineContent Settings::readSingleLine (std::string line)
    -
    - -

    Reads one line of the settings file.

    -
    Parameters
    - - -
    lineline of file to read
    -
    -
    - -
    -
    - -

    ◆ setParameter()

    - -
    -
    - - - - - - - - - - - - - - - - - - -
    void Settings::setParameter (std::string parameterName,
    std::string value 
    )
    -
    - -

    Sets the parameter to the corresponding value.

    -
    Parameters
    - - - -
    parameterNameparamter name
    valueof parameter
    -
    -
    - -
    -
    -
    The documentation for this struct was generated from the following files:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/settings_parser/settings.h
    • -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/settings_parser/settings.cpp
    • -
    -
    - - - - diff --git a/documentation/html/structSettings_1_1LineContent-members.html b/documentation/html/structSettings_1_1LineContent-members.html deleted file mode 100644 index bed13298..00000000 --- a/documentation/html/structSettings_1_1LineContent-members.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - -NumSim: Member List - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    -
    Settings::LineContent Member List
    -
    -
    - -

    This is the complete list of members for Settings::LineContent, including all inherited members.

    - - - - -
    isContentSettings::LineContent
    parameterNameSettings::LineContent
    valueSettings::LineContent
    - - - - diff --git a/documentation/html/structSettings_1_1LineContent.html b/documentation/html/structSettings_1_1LineContent.html deleted file mode 100644 index 6a33cf57..00000000 --- a/documentation/html/structSettings_1_1LineContent.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - -NumSim: Settings::LineContent Struct Reference - - - - - - - - - - -
    -
    - - - - - - -
    -
    NumSim 1.0 -
    -
    Numerical Simulation of fluid-flow
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    -
    -
    -
    -
    Loading...
    -
    Searching...
    -
    No Matches
    -
    -
    -
    -
    - - -
    -
    - -
    Settings::LineContent Struct Reference
    -
    -
    - -

    Contains the content of a single line in a file. - More...

    - -

    #include <settings.h>

    - - - - - - - - - - - -

    -Public Attributes

    -std::string parameterName
     Name of parameter.
     
    -std::string value
     value of the parameter
     
    -bool isContent
     whether line is readable parameter or comment
     
    -

    Detailed Description

    -

    Contains the content of a single line in a file.

    -

    The documentation for this struct was generated from the following file:
      -
    • /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/NumSim/src/settings_parser/settings.h
    • -
    -
    - - - - diff --git a/documentation/html/sync_off.png b/documentation/html/sync_off.png deleted file mode 100644 index 3b443fc62892114406e3d399421b2a881b897acc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* diff --git a/documentation/html/sync_on.png b/documentation/html/sync_on.png deleted file mode 100644 index e08320fb64e6fa33b573005ed6d8fe294e19db76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 diff --git a/documentation/html/tab_a.png b/documentation/html/tab_a.png deleted file mode 100644 index 3b725c41c5a527a3a3e40097077d0e206a681247..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 diff --git a/documentation/html/tab_ad.png b/documentation/html/tab_ad.png deleted file mode 100644 index e34850acfc24be58da6d2fd1ccc6b29cc84fe34d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QhuH;jv*C{Z|5d*H3V=pKi{In zd2jxLclDRPylmD}^l7{QOtL{vUjO{-WqItb5sQp2h-99b8^^Scr-=2mblCdZuUm?4 jzOJvgvt3{(cjKLW5(A@0qPS@<&}0TrS3j3^P6y&q2{!U5bk+Tso_B!YCpDh>v z{CM*1U8YvQRyBUHt^Ju0W_sq-?;9@_4equ-bavTs=gk796zopr0EBT&m;e9( diff --git a/documentation/html/tab_s.png b/documentation/html/tab_s.png deleted file mode 100644 index ab478c95b67371d700a20869f7de1ddd73522d50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QuUrLjv*C{Z|^p8HaRdjTwH7) zC?wLlL}}I{)n%R&r+1}IGmDnq;&J#%V6)9VsYhS`O^BVBQlxOUep0c$RENLq#g8A$ z)z7%K_bI&n@J+X_=x}fJoEKed-$<>=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ diff --git a/documentation/html/tab_sd.png b/documentation/html/tab_sd.png deleted file mode 100644 index 757a565ced4730f85c833fb2547d8e199ae68f19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qq7(&jv*C{Z|_!fH5o7*c=%9% zcILh!EA=pAQKdx-Cdiev=v{eg{8Ht<{e8_NAN~b=)%W>-WDCE0PyDHGemi$BoXwcK z{>e9^za6*c1ilttWw&V+U;WCPlV9{LdC~Ey%_H(qj`xgfES(4Yz5jSTZfCt`4E$0YRsR*S^mTCR^;V&sxC8{l_Cp7w8-YPgg&ebxsLQ00$vXK>z>% diff --git a/documentation/html/tabs.css b/documentation/html/tabs.css deleted file mode 100644 index 71c8a470..00000000 --- a/documentation/html/tabs.css +++ /dev/null @@ -1 +0,0 @@ -.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} \ No newline at end of file diff --git a/documentation/latex/Makefile b/documentation/latex/Makefile deleted file mode 100644 index 7f829721..00000000 --- a/documentation/latex/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -LATEX_CMD?=pdflatex -MKIDX_CMD?=makeindex -BIBTEX_CMD?=bibtex -LATEX_COUNT?=8 -MANUAL_FILE?=refman - -all: $(MANUAL_FILE).pdf - -pdf: $(MANUAL_FILE).pdf - -$(MANUAL_FILE).pdf: clean $(MANUAL_FILE).tex - $(LATEX_CMD) $(MANUAL_FILE) - $(MKIDX_CMD) $(MANUAL_FILE).idx - $(LATEX_CMD) $(MANUAL_FILE) - latex_count=$(LATEX_COUNT) ; \ - while grep -E -s 'Rerun (LaTeX|to get cross-references right|to get bibliographical references right)' $(MANUAL_FILE).log && [ $$latex_count -gt 0 ] ;\ - do \ - echo "Rerunning latex...." ;\ - $(LATEX_CMD) $(MANUAL_FILE) ;\ - latex_count=`expr $$latex_count - 1` ;\ - done - $(MKIDX_CMD) $(MANUAL_FILE).idx - $(LATEX_CMD) $(MANUAL_FILE) - - -clean: - rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl $(MANUAL_FILE).pdf diff --git a/documentation/latex/annotated.tex b/documentation/latex/annotated.tex deleted file mode 100644 index 56bc5a85..00000000 --- a/documentation/latex/annotated.tex +++ /dev/null @@ -1,21 +0,0 @@ -\doxysection{Class List} -Here are the classes, structs, unions and interfaces with brief descriptions\+:\begin{DoxyCompactList} -\item\contentsline{section}{\mbox{\hyperlink{classArray2D}{Array2D}} \\*This class represents a 2D array of double values }{\pageref{classArray2D}}{} -\item\contentsline{section}{\mbox{\hyperlink{classBoundary}{Boundary}} }{\pageref{classBoundary}}{} -\item\contentsline{section}{\mbox{\hyperlink{classCentralDifferences}{Central\+Differences}} \\*Discretizes the problem using the central differences scheme }{\pageref{classCentralDifferences}}{} -\item\contentsline{section}{\mbox{\hyperlink{classComputation}{Computation}} \\*\doxylink{classComputation}{Computation} of Simulation }{\pageref{classComputation}}{} -\item\contentsline{section}{\mbox{\hyperlink{classDiscretization}{Discretization}} \\*Computes derivatives included in governing equations }{\pageref{classDiscretization}}{} -\item\contentsline{section}{\mbox{\hyperlink{classDonorCell}{Donor\+Cell}} \\*Discretizes the problem using the donor cell scheme }{\pageref{classDonorCell}}{} -\item\contentsline{section}{\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \\*\doxylink{classDiscretization}{Discretization} of a scalar function }{\pageref{classFieldVariable}}{} -\item\contentsline{section}{\mbox{\hyperlink{classFluidTracer}{Fluid\+Tracer}} }{\pageref{classFluidTracer}}{} -\item\contentsline{section}{\mbox{\hyperlink{classGaussSeidel}{Gauss\+Seidel}} \\*Standard Gauss-\/\+Seidel solver }{\pageref{classGaussSeidel}}{} -\item\contentsline{section}{\mbox{\hyperlink{structSettings_1_1LineContent}{Settings\+::\+Line\+Content}} \\*Contains the content of a single line in a file }{\pageref{structSettings_1_1LineContent}}{} -\item\contentsline{section}{\mbox{\hyperlink{classMask}{Mask}} }{\pageref{classMask}}{} -\item\contentsline{section}{\mbox{\hyperlink{classOutputWriter}{Output\+Writer}} \\*Inteface class for writing simulation data output }{\pageref{classOutputWriter}}{} -\item\contentsline{section}{\mbox{\hyperlink{classOutputWriterParaview}{Output\+Writer\+Paraview}} \\*Write \texorpdfstring{$\ast$}{*}.vti files that can be viewed with Para\+View }{\pageref{classOutputWriterParaview}}{} -\item\contentsline{section}{\mbox{\hyperlink{classOutputWriterText}{Output\+Writer\+Text}} \\*Write \texorpdfstring{$\ast$}{*}.txt files that are useful for debugging }{\pageref{classOutputWriterText}}{} -\item\contentsline{section}{\mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}} \\*Solves the Poisson problem for the pressure }{\pageref{classPressureSolver}}{} -\item\contentsline{section}{\mbox{\hyperlink{structSettings}{Settings}} \\*All settings that parametrize a simulation run }{\pageref{structSettings}}{} -\item\contentsline{section}{\mbox{\hyperlink{classSOR}{SOR}} \\*Successive over-\/relaxation solver }{\pageref{classSOR}}{} -\item\contentsline{section}{\mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}} \\*Create field variables and define limits for the indices }{\pageref{classStaggeredGrid}}{} -\end{DoxyCompactList} diff --git a/documentation/latex/array2D_8h_source.tex b/documentation/latex/array2D_8h_source.tex deleted file mode 100644 index c9d800f0..00000000 --- a/documentation/latex/array2D_8h_source.tex +++ /dev/null @@ -1,52 +0,0 @@ -\doxysection{array2\+D.\+h} -\hypertarget{array2D_8h_source}{}\label{array2D_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/storage/array2D.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/storage/array2D.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} -\DoxyCodeLine{00002\ } -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00006\ } -\DoxyCodeLine{00007\ } - - - - - - -\DoxyCodeLine{00015\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classArray2D}{Array2D}}} -\DoxyCodeLine{00016\ \{} -\DoxyCodeLine{00017\ \textcolor{keyword}{public}:} - - - - -\DoxyCodeLine{00023\ \ \ \ \ \mbox{\hyperlink{classArray2D_a16521417dfdf67ec694bfb7747df9000}{Array2D}}(std::array\ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}});} -\DoxyCodeLine{00024\ } - - - - - - -\DoxyCodeLine{00032\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8}{operator()}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} -\DoxyCodeLine{00033\ } - - - - - - -\DoxyCodeLine{00041\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8}{operator()}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} -\DoxyCodeLine{00042\ } - - -\DoxyCodeLine{00046\ \ \ \ \ std::array\ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00047\ } -\DoxyCodeLine{00048\ \textcolor{keyword}{protected}:} -\DoxyCodeLine{00049\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ \mbox{\hyperlink{classArray2D_a75bc7a1ff6f218c38f6ab94ec34e9472}{size\_}};\ } -\DoxyCodeLine{00050\ \ \ \ \ std::vector\ \mbox{\hyperlink{classArray2D_af1572f75d219caab4b2372a98341b991}{data\_}};\ \ \ \ \ \ } -\DoxyCodeLine{00051\ \};} - -\end{DoxyCode} diff --git a/documentation/latex/boundary_8h_source.tex b/documentation/latex/boundary_8h_source.tex deleted file mode 100644 index 23d0a248..00000000 --- a/documentation/latex/boundary_8h_source.tex +++ /dev/null @@ -1,49 +0,0 @@ -\doxysection{boundary.\+h} -\hypertarget{boundary_8h_source}{}\label{boundary_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/boundary/boundary.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/boundary/boundary.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} -\DoxyCodeLine{00002\ } -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}mask.h"{}}} -\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ "{}../discretization/discretization.h"{}}} -\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ "{}../settings\_parser/settings.h"{}}} -\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00008\ } -\DoxyCodeLine{00009\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classBoundary}{Boundary}}} -\DoxyCodeLine{00010\ \{} -\DoxyCodeLine{00011\ \ \ \ \ \textcolor{keyword}{public}:} -\DoxyCodeLine{00012\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classBoundary}{Boundary}}(std::shared\_ptr\ mask,\ std::shared\_ptr\ discretization,\ \mbox{\hyperlink{structSettings}{Settings}}\ settings);} -\DoxyCodeLine{00013\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ setPressureBoundaryValues();} -\DoxyCodeLine{00014\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ setVelocityBoundaryValues();} -\DoxyCodeLine{00015\ \ \ \ \ \ \ \ \ std::shared\_ptr\ mask\_;} -\DoxyCodeLine{00016\ } -\DoxyCodeLine{00017\ } -\DoxyCodeLine{00018\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{bool}\ doCalculateF(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} -\DoxyCodeLine{00019\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{bool}\ doCalculateG(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} -\DoxyCodeLine{00020\ } -\DoxyCodeLine{00021\ \ \ \ \ \textcolor{keyword}{private}:} -\DoxyCodeLine{00022\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ createBoundaryCellsLists();} -\DoxyCodeLine{00023\ } -\DoxyCodeLine{00024\ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ Set\ Pressure}} -\DoxyCodeLine{00025\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ setPressureDomainBC();} -\DoxyCodeLine{00026\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ setPressureObstacleBC();} -\DoxyCodeLine{00027\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ setPressureSurfaceBC();} -\DoxyCodeLine{00028\ } -\DoxyCodeLine{00029\ } -\DoxyCodeLine{00030\ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ Set\ Velocity}} -\DoxyCodeLine{00031\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ setVelocityDomainBC();} -\DoxyCodeLine{00032\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ setVelocityObstacleBC();} -\DoxyCodeLine{00033\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ setVelocitySurfaceBC();} -\DoxyCodeLine{00034\ } -\DoxyCodeLine{00035\ } -\DoxyCodeLine{00036\ \ \ \ \ \ \ \ \ std::shared\_ptr\ discretization\_;} -\DoxyCodeLine{00037\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{structSettings}{Settings}}\ settings\_;} -\DoxyCodeLine{00038\ } -\DoxyCodeLine{00039\ \ \ \ \ \ \ \ \ std::vector\ DomainBoundaryCells\_;} -\DoxyCodeLine{00040\ \ \ \ \ \ \ \ \ std::vector\ ObstacleBoundaryCells\_;} -\DoxyCodeLine{00041\ \ \ \ \ \ \ \ \ std::vector\ FluidBoundaryCells\_;} -\DoxyCodeLine{00042\ } -\DoxyCodeLine{00043\ \};} - -\end{DoxyCode} diff --git a/documentation/latex/central__differences_8h_source.tex b/documentation/latex/central__differences_8h_source.tex deleted file mode 100644 index 5026194d..00000000 --- a/documentation/latex/central__differences_8h_source.tex +++ /dev/null @@ -1,45 +0,0 @@ -\doxysection{central\+\_\+differences.\+h} -\hypertarget{central__differences_8h_source}{}\label{central__differences_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/discretization/central\_differences.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/discretization/central\_differences.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} -\DoxyCodeLine{00002\ } -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ "{}discretization.h"{}}} -\DoxyCodeLine{00006\ } - - - - - - -\DoxyCodeLine{00014\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classCentralDifferences}{CentralDifferences}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classDiscretization}{Discretization}}} -\DoxyCodeLine{00015\ \{} -\DoxyCodeLine{00016\ \textcolor{keyword}{public}:} - - - - - -\DoxyCodeLine{00023\ \ \ \ \ \mbox{\hyperlink{classCentralDifferences_ab055731e615298f745364c54f86fc191}{CentralDifferences}}(std::array\ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{nCells}},\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{meshWidth}});} -\DoxyCodeLine{00024\ } - - - -\DoxyCodeLine{00029\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classCentralDifferences_adb4502f473cc047a433db596146672e4}{computeDu2Dx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} - - - -\DoxyCodeLine{00034\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classCentralDifferences_a66eb9b800b9a9ac6f81fc719a42eb0ee}{computeDv2Dy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} - - - -\DoxyCodeLine{00039\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classCentralDifferences_a9bd7ac3bfd709991525ec57de10ed2e1}{computeDuvDx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} - - - -\DoxyCodeLine{00044\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classCentralDifferences_a4184367de8d48e678edfb078a19fc0a4}{computeDuvDy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} -\DoxyCodeLine{00045\ \};} - -\end{DoxyCode} diff --git a/documentation/latex/classArray2D.eps b/documentation/latex/classArray2D.eps deleted file mode 100644 index fc8663d7..00000000 --- a/documentation/latex/classArray2D.eps +++ /dev/null @@ -1,197 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: ClassName -%%Creator: Doxygen -%%CreationDate: Time -%%For: -%Magnification: 1.00 -%%Orientation: Portrait -%%BoundingBox: 0 0 500 416.666656 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%EndComments - -% ----- variables ----- - -/boxwidth 0 def -/boxheight 40 def -/fontheight 24 def -/marginwidth 10 def -/distx 20 def -/disty 40 def -/boundaspect 1.200000 def % aspect ratio of the BoundingBox (width/height) -/boundx 500 def -/boundy boundx boundaspect div def -/xspacing 0 def -/yspacing 0 def -/rows 2 def -/cols 1 def -/scalefactor 0 def -/boxfont /Times-Roman findfont fontheight scalefont def - -% ----- procedures ----- - -/dotted { [1 4] 0 setdash } def -/dashed { [5] 0 setdash } def -/solid { [] 0 setdash } def - -/max % result = MAX(arg1,arg2) -{ - /a exch def - /b exch def - a b gt {a} {b} ifelse -} def - -/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) -{ - 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max -} def - -/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) -{ - /str exch def - /boxwidth boxwidth str stringwidth pop max def -} def - -/box % draws a box with text 'arg1' at grid pos (arg2,arg3) -{ gsave - 2 setlinewidth - newpath - exch xspacing mul xoffset add - exch yspacing mul - moveto - boxwidth 0 rlineto - 0 boxheight rlineto - boxwidth neg 0 rlineto - 0 boxheight neg rlineto - closepath - dup stringwidth pop neg boxwidth add 2 div - boxheight fontheight 2 div sub 2 div - rmoveto show stroke - grestore -} def - -/mark -{ newpath - exch xspacing mul xoffset add boxwidth add - exch yspacing mul - moveto - 0 boxheight 4 div rlineto - boxheight neg 4 div boxheight neg 4 div rlineto - closepath - eofill - stroke -} def - -/arrow -{ newpath - moveto - 3 -8 rlineto - -6 0 rlineto - 3 8 rlineto - closepath - eofill - stroke -} def - -/out % draws an output connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight add - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/in % draws an input connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul disty 2 div sub - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/hedge -{ - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight 2 div sub - /y exch def - /x exch def - newpath - x y moveto - boxwidth 2 div distx add 0 rlineto - stroke - 1 eq - { newpath x boxwidth 2 div distx add add y moveto - -8 3 rlineto - 0 -6 rlineto - 8 3 rlineto - closepath - eofill - stroke - } if -} def - -/vedge -{ - /ye exch def - /ys exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add dup - ys yspacing mul boxheight 2 div sub - moveto - ye yspacing mul boxheight 2 div sub - lineto - stroke -} def - -/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' -{ - /ys exch def - /xe exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add - ys yspacing mul disty 2 div sub - moveto - xspacing xe xs sub mul 0 - rlineto - stroke -} def - -% ----- main ------ - -boxfont setfont -1 boundaspect scale -(Array2D) cw -(FieldVariable) cw -/boxwidth boxwidth marginwidth 2 mul add def -/xspacing boxwidth distx add def -/yspacing boxheight disty add def -/scalefactor - boxwidth cols mul distx cols 1 sub mul add - boxheight rows mul disty rows 1 sub mul add boundaspect mul - max def -boundx scalefactor div boundy scalefactor div scale - -% ----- classes ----- - - (Array2D) 0.000000 1.000000 box - (FieldVariable) 0.000000 0.000000 box - -% ----- relations ----- - -solid -1 0.000000 0.250000 out -solid -0 0.000000 0.750000 in diff --git a/documentation/latex/classArray2D.pdf b/documentation/latex/classArray2D.pdf deleted file mode 100644 index 8d4720cd77a5651c38a162ee8ba5580d35c94bf8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4942 zcmb_Ad0Z3M)+!V+(mwlKYF!5u17b3hodgmI0VK*MP{4-V*Pyi9(-d+)htyJxv`&e;07 zdC(Yi4#l?a(eC3ETU)6r9+#nn0#^y3C@n;bgJ|*qv4^`q7=3*G#2*B>gPE&1P~r(j z2_CBk$Po&qf=KYf;xVNVFoS4XH}@c^#9gSCN9r{S0s|0V9ii3{9ttHUTnZ?G+yM8$ zK&j8NfCaExgMq&mh?9Gxh5%iJ79;#*gph$C05r7rz*U4+NN99`ncO`#0+WlC%GZEm z9fAAf1WI6jXcVSh0Q=x7fK1^)2!uzhqc}UmUYIJ1h=#ZT;tvB|2uuUP9!fyshRJX_ zCK6G!ga$)nDTbpNyUYE}7*_7`#}}|8}tT<*7Q6-?VoQ_Nx=nz^PJKm)slMYSMq~ zKo6(jgT#@_R(>_*M0V8@L(pLG-MrG;cUVND)@jYZ-b;e|Z_}@qJ{m_aSB&(_|j z>lJ$PgVdGRCKs!Ni^F%7#|?_S>VA~nc~SjdlG*)mxAq;Ctm$3P8>e4cfqM!okm=nM zaufDUe`$5v!J_zCZBXGlr;V`{bJ7QAezB};p2B>Y1X-pGV=5yQ7McOVg$+s>R6jz+OR8ae%}jP!Wr1Y5sUD zsxqF_4b#dr3N?XiAV-pkQ61wBu!BOQB_z?P23QmJLQQi9lK}@SmkYWl|6i{9zR%sO@Ymnds8AYTE8KXudIh%}V3^LM+qt-H-$OnzZ{x8G2f=~pJ zNMkY_As)hoxQ?taGS|Va#$r-nu~tTgB!GedL)D&`A}Sgzd29+y3L*DMQVJ{uaiNfj zRZ&U|m;w$Uu-G7ofp93Ww?eB0=P~*MBC`VyF|lED!Gd%g2yHu947p z%~vjLxj2Xawr7)<({g|N$0aM6`EG+@&AZ!w{w3jDl)kS`7rgP=y{FFi%DW#7d{~)z z^}xc973R{toh{SKo}B;OHt+WG`@KmF-qxQwa^jwvPjSeV2MpNw9QLUq#(TZ@O@}|H z)bEj~NdxC)N-d?#!Y`KedMc#1vibZKl)!b_9>w}hu9JSC-J#^f99R?P{dva){8jwm#ut+|A1prYS6W%p@Y~+i zD;Iogn>tYI8sSi!YDlqz;{Vx|+E@Fuc9G5QOADC>drNC;YQdg!a{cY^6miubioJe4 zP~`Q!_3x{`v`Ap(}3%@kGU&n~L7G^W;vlNZ%&%4ahGF-eRrHyY{eX-Anb9~dx|JZ#r&L=fzyv5m2 zv!CYgo0IG*ex_u*SdV+<++TeuW4qbCi{Y*MhMrRoc&opbFFiJK{DvDYcZ>Ag^5#uV zk+=JHd|mR*c)v;dRUfjiB|Pc+cG1_XIt`uIrcRkUbeFVER`g>t8Q>^jr4j*G-FGWA3?(>RY+b@uB|v&DT@;KRw)>#e1^6EhH&$<-e~_ zf3$W(*4$&K&R0AN%C2?WTCqWIxw&S;ciXM{uU{$Izkg>?T6M*@Cv^(Tfr<6^7QMB4 zF7uN;t5$>t^NJik9S6J3YIt$J`H0$#eITlHN6FoDt;mg(8L9r0%ygIEUDrEpQ(AdDy2#W^<(9 z_#SmSz9eJDcLqgqvEt0?+^Fg5rI+qh_VjMg&fOYOlYPCBeyBTbL-dunnUgCRmk#_| zawH<8tLSDZJOBK-d7G2++H()a-%jf6h0e#MzCw@C>hC_aPS8#0yzp+;=K;Rk=N?-e zbT{w^yOrGSUcKTo@5Q^SFWw8RKXJbE@Fy?AkLOF%Q)Xlx8dyqS{6h)8b_mw z)NMtVr|er4(>8nU_^QoMj%Q%yZH3YVtNf#_9@z_X+vE|>bzZjRN4!oI?B_a_&U}W> znyZ|2CIxkw@DF!^PlAhiaB*+UslpJa*;A6kR#}&|+%L6_CxRs`wqpD2b&ZD;%_fJg z-BoYjz&x7s)vUU+wqf;avzi?aE#fx{4??@|cs!ppKI$B# zBFd_Q*6hq_eLtnVF*N7mi6T*RRcOw4kGE{FwD|q>VhcF;zEr3F2OjmDvE<^@o)1bpAN@a!z=0pJH#>3%ItS^_>tj-C=QFQ?lB& z>bh^HOYhapFt=K%{k&x>YO8zN&9c?g`t!~QZL%WLcQ+*0uWH}t>*Ji3kl~v{a}_=) z9n8I)`Y;GybJ|-zBxkt^*6Lk}} z{6gnFtQJ~4Kgw!6*5F>ybSU34nSCc&#@k$7s_(EY)E4gA^Kh_bf=_bCC$p1ogy#2C z4w&--qB)Cy@2}$(*2L9!pA>}`o$@-9`>*FE7k}4C(8fKwwr1YmOc!;`iG_IIlfHLM?z{yCQEOePIr(6k9E0yWT7+66$KQ4vMR z2$@PtH|j)};jyqH1ZL0?cv#SIc>>xeh!l)Q;5tHRV`Jh1+MzeI0ULl13mgy31fV9C z>tvWlNL}XV1uculwZu@32=VD04jrMwrgQy;IAF^+ivtcYsqGAK1m2)5i%f6>U66>0 zFxfPONkiCyOhmxs3lOdY!Vn;cGyDfk;4DBY0nHLeku%sN6oe8J8G~7@B!(tR1sPTXC8~-NQVldY7K!SV1XUza zqFOCk84npxsSpiKjD+wgGcc2p?!z@h`~tAJVa6tk5mMt8NjgIC2EQ0VAk~12;E_ZY zQK0|P?|;W=^!5UGqL8X5@1{T9j%43tx*Uh|(eBOZXb(z#(vBeM$waVo6OdViFcCHw z`NjmIA_x_rfkgWYj6l-Qb|W4fW{qp?Oeq2&;5$b&0N9H}rZ(81!6HH5#b8p%C>{Di zTn>lDfg+({7>^4&Sn>y{hGA?L*}c6ELwE={`5#~$E@)`~0An)$Ov_>a8Rp0VUHj{_ z42C0UbzX-dj!e*-z7AusS$~4D5bhWmga!qzlLma+f#3i|A_i;#!TvZ7dVR8&f?%mC z5{F1vg3k_8Hz?Fu;^8V`IEq;wjx46w!;#P7ySutF+}%7Rh=j>?Y(^S00T3 diff --git a/documentation/latex/classArray2D.tex b/documentation/latex/classArray2D.tex deleted file mode 100644 index f5841f69..00000000 --- a/documentation/latex/classArray2D.tex +++ /dev/null @@ -1,104 +0,0 @@ -\doxysection{Array2D Class Reference} -\hypertarget{classArray2D}{}\label{classArray2D}\index{Array2D@{Array2D}} - - -This class represents a 2D array of double values. - - - - -{\ttfamily \#include $<$array2\+D.\+h$>$} - -Inheritance diagram for Array2D\+:\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[height=2.000000cm]{classArray2D} -\end{center} -\end{figure} -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classArray2D_a16521417dfdf67ec694bfb7747df9000}{Array2D}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}}) -\begin{DoxyCompactList}\small\item\em constructor. \end{DoxyCompactList}\item -double \& \mbox{\hyperlink{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8}{operator()}} (int i, int j) -\begin{DoxyCompactList}\small\item\em set array value. Overloads the () operator \end{DoxyCompactList}\item -double \mbox{\hyperlink{classArray2D_af745718ec25b815051de2d0c3c94e0d2}{operator()}} (int i, int j) const -\begin{DoxyCompactList}\small\item\em get array value. Overloads the () operator \end{DoxyCompactList}\item -\Hypertarget{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}\label{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9} -std\+::array$<$ int, 2 $>$ {\bfseries size} () const -\begin{DoxyCompactList}\small\item\em get size of array in x and y direction \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsubsection*{Protected Attributes} -\begin{DoxyCompactItemize} -\item -\Hypertarget{classArray2D_a75bc7a1ff6f218c38f6ab94ec34e9472}\label{classArray2D_a75bc7a1ff6f218c38f6ab94ec34e9472} -const std\+::array$<$ int, 2 $>$ {\bfseries size\+\_\+} -\begin{DoxyCompactList}\small\item\em size of array in x and y direction \end{DoxyCompactList}\item -\Hypertarget{classArray2D_af1572f75d219caab4b2372a98341b991}\label{classArray2D_af1572f75d219caab4b2372a98341b991} -std\+::vector$<$ double $>$ {\bfseries data\+\_\+} -\begin{DoxyCompactList}\small\item\em storage array values, in row-\/major order \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\doxysubsection{Detailed Description} -This class represents a 2D array of double values. - -Internally they are stored consecutively in memory. The entries can be accessed by two indices i,j. - -\doxysubsection{Constructor \& Destructor Documentation} -\Hypertarget{classArray2D_a16521417dfdf67ec694bfb7747df9000}\label{classArray2D_a16521417dfdf67ec694bfb7747df9000} -\index{Array2D@{Array2D}!Array2D@{Array2D}} -\index{Array2D@{Array2D}!Array2D@{Array2D}} -\doxysubsubsection{\texorpdfstring{Array2D()}{Array2D()}} -{\footnotesize\ttfamily Array2\+D\+::\+Array2D (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{size }\end{DoxyParamCaption})} - - - -constructor. - - -\begin{DoxyParams}{Parameters} -{\em size} & size of array in x and y direction \\ -\hline -\end{DoxyParams} - - -\doxysubsection{Member Function Documentation} -\Hypertarget{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8}\label{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8} -\index{Array2D@{Array2D}!operator()@{operator()}} -\index{operator()@{operator()}!Array2D@{Array2D}} -\doxysubsubsection{\texorpdfstring{operator()()}{operator()()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} -{\footnotesize\ttfamily double \& Array2\+D\+::operator() (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption})} - - - -set array value. Overloads the () operator - - -\begin{DoxyParams}{Parameters} -{\em i} & index in x direction \\ -\hline -{\em j} & index in y direction \\ -\hline -\end{DoxyParams} -\Hypertarget{classArray2D_af745718ec25b815051de2d0c3c94e0d2}\label{classArray2D_af745718ec25b815051de2d0c3c94e0d2} -\index{Array2D@{Array2D}!operator()@{operator()}} -\index{operator()@{operator()}!Array2D@{Array2D}} -\doxysubsubsection{\texorpdfstring{operator()()}{operator()()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} -{\footnotesize\ttfamily double Array2\+D\+::operator() (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} - - - -get array value. Overloads the () operator - - -\begin{DoxyParams}{Parameters} -{\em i} & index in x direction \\ -\hline -{\em j} & index in y direction \\ -\hline -\end{DoxyParams} - - -The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/storage/array2\+D.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/storage/array2\+D.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classBoundary.tex b/documentation/latex/classBoundary.tex deleted file mode 100644 index c6e7cc36..00000000 --- a/documentation/latex/classBoundary.tex +++ /dev/null @@ -1,32 +0,0 @@ -\doxysection{Boundary Class Reference} -\hypertarget{classBoundary}{}\label{classBoundary}\index{Boundary@{Boundary}} -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\Hypertarget{classBoundary_a4c78a28ad0839810f15229382f642cf1}\label{classBoundary_a4c78a28ad0839810f15229382f642cf1} -{\bfseries Boundary} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$ mask, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, \mbox{\hyperlink{structSettings}{Settings}} settings) -\item -\Hypertarget{classBoundary_a77c90b2a43220ce9796d098158e4376d}\label{classBoundary_a77c90b2a43220ce9796d098158e4376d} -void {\bfseries set\+Pressure\+Boundary\+Values} () -\item -\Hypertarget{classBoundary_ab7e15ee44237de051ff8347f2f9c770b}\label{classBoundary_ab7e15ee44237de051ff8347f2f9c770b} -void {\bfseries set\+Velocity\+Boundary\+Values} () -\item -\Hypertarget{classBoundary_ac76b887d65491d38c093ca50333697a9}\label{classBoundary_ac76b887d65491d38c093ca50333697a9} -bool {\bfseries do\+CalculateF} (int i, int j) const -\item -\Hypertarget{classBoundary_aacf325c02e71925b7847d7189282b5c1}\label{classBoundary_aacf325c02e71925b7847d7189282b5c1} -bool {\bfseries do\+CalculateG} (int i, int j) const -\end{DoxyCompactItemize} -\doxysubsubsection*{Public Attributes} -\begin{DoxyCompactItemize} -\item -\Hypertarget{classBoundary_a25d33b12fbdf312cf319713ff88b3d38}\label{classBoundary_a25d33b12fbdf312cf319713ff88b3d38} -std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$ {\bfseries mask\+\_\+} -\end{DoxyCompactItemize} - - -The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/boundary/boundary.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/boundary/boundary.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classCentralDifferences.eps b/documentation/latex/classCentralDifferences.eps deleted file mode 100644 index 04ccd50f..00000000 --- a/documentation/latex/classCentralDifferences.eps +++ /dev/null @@ -1,203 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: ClassName -%%Creator: Doxygen -%%CreationDate: Time -%%For: -%Magnification: 1.00 -%%Orientation: Portrait -%%BoundingBox: 0 0 500 472.440948 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%EndComments - -% ----- variables ----- - -/boxwidth 0 def -/boxheight 40 def -/fontheight 24 def -/marginwidth 10 def -/distx 20 def -/disty 40 def -/boundaspect 1.058333 def % aspect ratio of the BoundingBox (width/height) -/boundx 500 def -/boundy boundx boundaspect div def -/xspacing 0 def -/yspacing 0 def -/rows 3 def -/cols 1 def -/scalefactor 0 def -/boxfont /Times-Roman findfont fontheight scalefont def - -% ----- procedures ----- - -/dotted { [1 4] 0 setdash } def -/dashed { [5] 0 setdash } def -/solid { [] 0 setdash } def - -/max % result = MAX(arg1,arg2) -{ - /a exch def - /b exch def - a b gt {a} {b} ifelse -} def - -/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) -{ - 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max -} def - -/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) -{ - /str exch def - /boxwidth boxwidth str stringwidth pop max def -} def - -/box % draws a box with text 'arg1' at grid pos (arg2,arg3) -{ gsave - 2 setlinewidth - newpath - exch xspacing mul xoffset add - exch yspacing mul - moveto - boxwidth 0 rlineto - 0 boxheight rlineto - boxwidth neg 0 rlineto - 0 boxheight neg rlineto - closepath - dup stringwidth pop neg boxwidth add 2 div - boxheight fontheight 2 div sub 2 div - rmoveto show stroke - grestore -} def - -/mark -{ newpath - exch xspacing mul xoffset add boxwidth add - exch yspacing mul - moveto - 0 boxheight 4 div rlineto - boxheight neg 4 div boxheight neg 4 div rlineto - closepath - eofill - stroke -} def - -/arrow -{ newpath - moveto - 3 -8 rlineto - -6 0 rlineto - 3 8 rlineto - closepath - eofill - stroke -} def - -/out % draws an output connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight add - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/in % draws an input connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul disty 2 div sub - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/hedge -{ - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight 2 div sub - /y exch def - /x exch def - newpath - x y moveto - boxwidth 2 div distx add 0 rlineto - stroke - 1 eq - { newpath x boxwidth 2 div distx add add y moveto - -8 3 rlineto - 0 -6 rlineto - 8 3 rlineto - closepath - eofill - stroke - } if -} def - -/vedge -{ - /ye exch def - /ys exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add dup - ys yspacing mul boxheight 2 div sub - moveto - ye yspacing mul boxheight 2 div sub - lineto - stroke -} def - -/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' -{ - /ys exch def - /xe exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add - ys yspacing mul disty 2 div sub - moveto - xspacing xe xs sub mul 0 - rlineto - stroke -} def - -% ----- main ------ - -boxfont setfont -1 boundaspect scale -(CentralDifferences) cw -(Discretization) cw -(StaggeredGrid) cw -/boxwidth boxwidth marginwidth 2 mul add def -/xspacing boxwidth distx add def -/yspacing boxheight disty add def -/scalefactor - boxwidth cols mul distx cols 1 sub mul add - boxheight rows mul disty rows 1 sub mul add boundaspect mul - max def -boundx scalefactor div boundy scalefactor div scale - -% ----- classes ----- - - (CentralDifferences) 0.000000 0.000000 box - (Discretization) 0.000000 1.000000 box - (StaggeredGrid) 0.000000 2.000000 box - -% ----- relations ----- - -solid -0 0.000000 0.000000 out -solid -1 0.000000 1.000000 in -solid -0 0.000000 1.000000 out -solid -1 0.000000 2.000000 in diff --git a/documentation/latex/classCentralDifferences.pdf b/documentation/latex/classCentralDifferences.pdf deleted file mode 100644 index fea4467cff42527c159abee031aa3b33deb6d608..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5704 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 diff --git a/documentation/latex/classCentralDifferences.tex b/documentation/latex/classCentralDifferences.tex deleted file mode 100644 index 45083819..00000000 --- a/documentation/latex/classCentralDifferences.tex +++ /dev/null @@ -1,244 +0,0 @@ -\doxysection{Central\+Differences Class Reference} -\hypertarget{classCentralDifferences}{}\label{classCentralDifferences}\index{CentralDifferences@{CentralDifferences}} - - -Discretizes the problem using the central differences scheme. - - - - -{\ttfamily \#include $<$central\+\_\+differences.\+h$>$} - -Inheritance diagram for Central\+Differences\+:\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[height=3.000000cm]{classCentralDifferences} -\end{center} -\end{figure} -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classCentralDifferences_ab055731e615298f745364c54f86fc191}{Central\+Differences}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item -double \mbox{\hyperlink{classCentralDifferences_adb4502f473cc047a433db596146672e4}{compute\+Du2\+Dx}} (int i, int j) const override -\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x with the central differences Scheme. \end{DoxyCompactList}\item -double \mbox{\hyperlink{classCentralDifferences_a66eb9b800b9a9ac6f81fc719a42eb0ee}{compute\+Dv2\+Dy}} (int i, int j) const override -\begin{DoxyCompactList}\small\item\em Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y with the central differences Scheme. \end{DoxyCompactList}\item -double \mbox{\hyperlink{classCentralDifferences_a9bd7ac3bfd709991525ec57de10ed2e1}{compute\+Duv\+Dx}} (int i, int j) const override -\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x with the central differences Scheme. \end{DoxyCompactList}\item -double \mbox{\hyperlink{classCentralDifferences_a4184367de8d48e678edfb078a19fc0a4}{compute\+Duv\+Dy}} (int i, int j) const override -\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y with the central differences Scheme. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classDiscretization}{Discretization}}} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c}{Discretization}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item -virtual double {\bfseries compute\+D2u\+Dx2} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to x. \end{DoxyCompactList}\item -virtual double {\bfseries compute\+D2u\+Dy2} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to y. \end{DoxyCompactList}\item -virtual double {\bfseries compute\+D2v\+Dx2} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to x. \end{DoxyCompactList}\item -virtual double {\bfseries compute\+D2v\+Dy2} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to y. \end{DoxyCompactList}\item -virtual double {\bfseries compute\+Dp\+Dx} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to x. \end{DoxyCompactList}\item -virtual double {\bfseries compute\+Dp\+Dy} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to y. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}{Staggered\+Grid}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item -const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width} () const -\begin{DoxyCompactList}\small\item\em Get the length of a single cell in x and y directions. \end{DoxyCompactList}\item -const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells} () const -\begin{DoxyCompactList}\small\item\em Get number of cells in x and y directions. \end{DoxyCompactList}\item -const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries u} () const -\begin{DoxyCompactList}\small\item\em Get a reference to the field variable u. \end{DoxyCompactList}\item -const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries v} () const -\begin{DoxyCompactList}\small\item\em Get a reference to the field variable v. \end{DoxyCompactList}\item -const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries p} () const -\begin{DoxyCompactList}\small\item\em Get a reference to the field variable p. \end{DoxyCompactList}\item -const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries rhs} () const -\begin{DoxyCompactList}\small\item\em Get a reference to the field variable rhs. \end{DoxyCompactList}\item -double {\bfseries u} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j), declared constant. \end{DoxyCompactList}\item -double \& {\bfseries u} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j) \end{DoxyCompactList}\item -double {\bfseries v} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j), declared constant. \end{DoxyCompactList}\item -double \& {\bfseries v} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j) \end{DoxyCompactList}\item -double {\bfseries p} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j), declared constant. \end{DoxyCompactList}\item -double \& {\bfseries p} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j) \end{DoxyCompactList}\item -double \& {\bfseries f} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of f in element (i,j) \end{DoxyCompactList}\item -double \& {\bfseries g} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of g in element (i,j) \end{DoxyCompactList}\item -double \& {\bfseries rhs} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of rhs in element (i,j) \end{DoxyCompactList}\item -double {\bfseries dx} () const -\begin{DoxyCompactList}\small\item\em Get the mesh width in x-\/direction. \end{DoxyCompactList}\item -double {\bfseries dy} () const -\begin{DoxyCompactList}\small\item\em Get the mesh width in y-\/direction. \end{DoxyCompactList}\item -int {\bfseries u\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for u in x direction \end{DoxyCompactList}\item -int {\bfseries u\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for u in x direction \end{DoxyCompactList}\item -int {\bfseries u\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for u in y direction \end{DoxyCompactList}\item -int {\bfseries u\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for u in y direction \end{DoxyCompactList}\item -int {\bfseries v\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for v in x direction \end{DoxyCompactList}\item -int {\bfseries v\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for v in x direction \end{DoxyCompactList}\item -int {\bfseries v\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for v in y direction \end{DoxyCompactList}\item -int {\bfseries v\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for v in y direction \end{DoxyCompactList}\item -int {\bfseries p\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for p in x direction \end{DoxyCompactList}\item -int {\bfseries p\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for p in x direction \end{DoxyCompactList}\item -int {\bfseries p\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for p in y direction \end{DoxyCompactList}\item -int {\bfseries p\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for p in y direction \end{DoxyCompactList}\item -int {\bfseries f\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for f in x direction \end{DoxyCompactList}\item -int {\bfseries f\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for f in x direction \end{DoxyCompactList}\item -int {\bfseries f\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for f in y direction \end{DoxyCompactList}\item -int {\bfseries f\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for f in y direction \end{DoxyCompactList}\item -int {\bfseries g\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for g in x direction \end{DoxyCompactList}\item -int {\bfseries g\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for g in x direction \end{DoxyCompactList}\item -int {\bfseries g\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for g in y direction \end{DoxyCompactList}\item -int {\bfseries g\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for g in y direction \end{DoxyCompactList}\item -int {\bfseries rhs\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for rhs in x direction \end{DoxyCompactList}\item -int {\bfseries rhs\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in x direction \end{DoxyCompactList}\item -int {\bfseries rhs\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for rhs in y direction \end{DoxyCompactList}\item -int {\bfseries rhs\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in y direction \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsubsection*{Additional Inherited Members} -\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} -\begin{DoxyCompactItemize} -\item -const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells\+\_\+} -\begin{DoxyCompactList}\small\item\em array containing number of cells in x and y directions \end{DoxyCompactList}\item -const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width\+\_\+} -\begin{DoxyCompactList}\small\item\em array containing the sizes of cell edges in x and y directions \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries u\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable u \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries v\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable v \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries p\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable p \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries f\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable f \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries g\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable g \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries rhs\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable rhs \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\doxysubsection{Detailed Description} -Discretizes the problem using the central differences scheme. - -Implements the first derivatives of u\texorpdfstring{$^\wedge$}{\string^}2, v\texorpdfstring{$^\wedge$}{\string^}2 and u\texorpdfstring{$\ast$}{*}v according to the central differences scheme - -\doxysubsection{Constructor \& Destructor Documentation} -\Hypertarget{classCentralDifferences_ab055731e615298f745364c54f86fc191}\label{classCentralDifferences_ab055731e615298f745364c54f86fc191} -\index{CentralDifferences@{CentralDifferences}!CentralDifferences@{CentralDifferences}} -\index{CentralDifferences@{CentralDifferences}!CentralDifferences@{CentralDifferences}} -\doxysubsubsection{\texorpdfstring{CentralDifferences()}{CentralDifferences()}} -{\footnotesize\ttfamily Central\+Differences\+::\+Central\+Differences (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{n\+Cells, }\item[{std\+::array$<$ double, 2 $>$}]{mesh\+Width }\end{DoxyParamCaption})} - - - -Constructor. - - -\begin{DoxyParams}{Parameters} -{\em n\+Cells} & array containing number of cells in x and y directions \\ -\hline -{\em mesh\+Width} & array containing the length of a single cell in x and y directions \\ -\hline -\end{DoxyParams} - - -\doxysubsection{Member Function Documentation} -\Hypertarget{classCentralDifferences_adb4502f473cc047a433db596146672e4}\label{classCentralDifferences_adb4502f473cc047a433db596146672e4} -\index{CentralDifferences@{CentralDifferences}!computeDu2Dx@{computeDu2Dx}} -\index{computeDu2Dx@{computeDu2Dx}!CentralDifferences@{CentralDifferences}} -\doxysubsubsection{\texorpdfstring{computeDu2Dx()}{computeDu2Dx()}} -{\footnotesize\ttfamily double Central\+Differences\+::compute\+Du2\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} - - - -Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x with the central differences Scheme. - - - -Implements \mbox{\hyperlink{classDiscretization_acca6bf193e0e91f645d292527299254b}{Discretization}}. - -\Hypertarget{classCentralDifferences_a9bd7ac3bfd709991525ec57de10ed2e1}\label{classCentralDifferences_a9bd7ac3bfd709991525ec57de10ed2e1} -\index{CentralDifferences@{CentralDifferences}!computeDuvDx@{computeDuvDx}} -\index{computeDuvDx@{computeDuvDx}!CentralDifferences@{CentralDifferences}} -\doxysubsubsection{\texorpdfstring{computeDuvDx()}{computeDuvDx()}} -{\footnotesize\ttfamily double Central\+Differences\+::compute\+Duv\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} - - - -Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x with the central differences Scheme. - - - -Implements \mbox{\hyperlink{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795}{Discretization}}. - -\Hypertarget{classCentralDifferences_a4184367de8d48e678edfb078a19fc0a4}\label{classCentralDifferences_a4184367de8d48e678edfb078a19fc0a4} -\index{CentralDifferences@{CentralDifferences}!computeDuvDy@{computeDuvDy}} -\index{computeDuvDy@{computeDuvDy}!CentralDifferences@{CentralDifferences}} -\doxysubsubsection{\texorpdfstring{computeDuvDy()}{computeDuvDy()}} -{\footnotesize\ttfamily double Central\+Differences\+::compute\+Duv\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} - - - -Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y with the central differences Scheme. - - - -Implements \mbox{\hyperlink{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84}{Discretization}}. - -\Hypertarget{classCentralDifferences_a66eb9b800b9a9ac6f81fc719a42eb0ee}\label{classCentralDifferences_a66eb9b800b9a9ac6f81fc719a42eb0ee} -\index{CentralDifferences@{CentralDifferences}!computeDv2Dy@{computeDv2Dy}} -\index{computeDv2Dy@{computeDv2Dy}!CentralDifferences@{CentralDifferences}} -\doxysubsubsection{\texorpdfstring{computeDv2Dy()}{computeDv2Dy()}} -{\footnotesize\ttfamily double Central\+Differences\+::compute\+Dv2\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} - - - -Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y with the central differences Scheme. - - - -Implements \mbox{\hyperlink{classDiscretization_a69ba136ab7f8c09d805afca159cab428}{Discretization}}. - - - -The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/central\+\_\+differences.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/central\+\_\+differences.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classComputation.tex b/documentation/latex/classComputation.tex deleted file mode 100644 index b2f5d250..00000000 --- a/documentation/latex/classComputation.tex +++ /dev/null @@ -1,50 +0,0 @@ -\doxysection{Computation Class Reference} -\hypertarget{classComputation}{}\label{classComputation}\index{Computation@{Computation}} - - -\doxylink{classComputation}{Computation} of Simulation. - - - - -{\ttfamily \#include $<$computation.\+h$>$} - -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -void \mbox{\hyperlink{classComputation_a4a344479797b15bd5c9ed2f262657339}{initialize}} (int argc, char \texorpdfstring{$\ast$}{*}argv\mbox{[}$\,$\mbox{]}) -\begin{DoxyCompactList}\small\item\em Initialize the simulation with settings from .txt file. \end{DoxyCompactList}\item -\Hypertarget{classComputation_ad20ce6e82ec9a918e6ac03840bc688d5}\label{classComputation_ad20ce6e82ec9a918e6ac03840bc688d5} -void {\bfseries run\+Simulation} () -\begin{DoxyCompactList}\small\item\em run the whole simulation until t\+\_\+end \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\doxysubsection{Detailed Description} -\doxylink{classComputation}{Computation} of Simulation. - -Combines discretization, pressure solver and outputwriter - -\doxysubsection{Member Function Documentation} -\Hypertarget{classComputation_a4a344479797b15bd5c9ed2f262657339}\label{classComputation_a4a344479797b15bd5c9ed2f262657339} -\index{Computation@{Computation}!initialize@{initialize}} -\index{initialize@{initialize}!Computation@{Computation}} -\doxysubsubsection{\texorpdfstring{initialize()}{initialize()}} -{\footnotesize\ttfamily void Computation\+::initialize (\begin{DoxyParamCaption}\item[{int}]{argc, }\item[{char \texorpdfstring{$\ast$}{*}}]{argv\mbox{[}$\,$\mbox{]} }\end{DoxyParamCaption})} - - - -Initialize the simulation with settings from .txt file. - - -\begin{DoxyParams}{Parameters} -{\em argc} & counts of CLI commands \\ -\hline -{\em argv} & values of CLI commands, expect settings.\+txt filename \\ -\hline -\end{DoxyParams} - - -The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/computation.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/computation.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classDiscretization.eps b/documentation/latex/classDiscretization.eps deleted file mode 100644 index 486eee2b..00000000 --- a/documentation/latex/classDiscretization.eps +++ /dev/null @@ -1,209 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: ClassName -%%Creator: Doxygen -%%CreationDate: Time -%%For: -%Magnification: 1.00 -%%Orientation: Portrait -%%BoundingBox: 0 0 500 236.220474 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%EndComments - -% ----- variables ----- - -/boxwidth 0 def -/boxheight 40 def -/fontheight 24 def -/marginwidth 10 def -/distx 20 def -/disty 40 def -/boundaspect 2.116667 def % aspect ratio of the BoundingBox (width/height) -/boundx 500 def -/boundy boundx boundaspect div def -/xspacing 0 def -/yspacing 0 def -/rows 3 def -/cols 2 def -/scalefactor 0 def -/boxfont /Times-Roman findfont fontheight scalefont def - -% ----- procedures ----- - -/dotted { [1 4] 0 setdash } def -/dashed { [5] 0 setdash } def -/solid { [] 0 setdash } def - -/max % result = MAX(arg1,arg2) -{ - /a exch def - /b exch def - a b gt {a} {b} ifelse -} def - -/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) -{ - 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max -} def - -/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) -{ - /str exch def - /boxwidth boxwidth str stringwidth pop max def -} def - -/box % draws a box with text 'arg1' at grid pos (arg2,arg3) -{ gsave - 2 setlinewidth - newpath - exch xspacing mul xoffset add - exch yspacing mul - moveto - boxwidth 0 rlineto - 0 boxheight rlineto - boxwidth neg 0 rlineto - 0 boxheight neg rlineto - closepath - dup stringwidth pop neg boxwidth add 2 div - boxheight fontheight 2 div sub 2 div - rmoveto show stroke - grestore -} def - -/mark -{ newpath - exch xspacing mul xoffset add boxwidth add - exch yspacing mul - moveto - 0 boxheight 4 div rlineto - boxheight neg 4 div boxheight neg 4 div rlineto - closepath - eofill - stroke -} def - -/arrow -{ newpath - moveto - 3 -8 rlineto - -6 0 rlineto - 3 8 rlineto - closepath - eofill - stroke -} def - -/out % draws an output connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight add - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/in % draws an input connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul disty 2 div sub - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/hedge -{ - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight 2 div sub - /y exch def - /x exch def - newpath - x y moveto - boxwidth 2 div distx add 0 rlineto - stroke - 1 eq - { newpath x boxwidth 2 div distx add add y moveto - -8 3 rlineto - 0 -6 rlineto - 8 3 rlineto - closepath - eofill - stroke - } if -} def - -/vedge -{ - /ye exch def - /ys exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add dup - ys yspacing mul boxheight 2 div sub - moveto - ye yspacing mul boxheight 2 div sub - lineto - stroke -} def - -/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' -{ - /ys exch def - /xe exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add - ys yspacing mul disty 2 div sub - moveto - xspacing xe xs sub mul 0 - rlineto - stroke -} def - -% ----- main ------ - -boxfont setfont -1 boundaspect scale -(Discretization) cw -(StaggeredGrid) cw -(CentralDifferences) cw -(DonorCell) cw -/boxwidth boxwidth marginwidth 2 mul add def -/xspacing boxwidth distx add def -/yspacing boxheight disty add def -/scalefactor - boxwidth cols mul distx cols 1 sub mul add - boxheight rows mul disty rows 1 sub mul add boundaspect mul - max def -boundx scalefactor div boundy scalefactor div scale - -% ----- classes ----- - - (Discretization) 0.500000 1.000000 box - (StaggeredGrid) 0.500000 2.000000 box - (CentralDifferences) 0.000000 0.000000 box - (DonorCell) 1.000000 0.000000 box - -% ----- relations ----- - -solid -0 0.500000 1.000000 out -solid -1 0.500000 2.000000 in -solid -1 0.500000 0.250000 out -solid -0.000000 1.000000 1.000000 conn -solid -0 0.000000 0.750000 in -solid -0 1.000000 0.750000 in diff --git a/documentation/latex/classDiscretization.pdf b/documentation/latex/classDiscretization.pdf deleted file mode 100644 index 084eb9cc38316928d083658f1479b7fea56c644e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5766 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 - -Inheritance diagram for Discretization\+:\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[height=3.000000cm]{classDiscretization} -\end{center} -\end{figure} -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c}{Discretization}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item -virtual double \mbox{\hyperlink{classDiscretization_acca6bf193e0e91f645d292527299254b}{compute\+Du2\+Dx}} (int i, int j) const =0 -\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x. \end{DoxyCompactList}\item -virtual double \mbox{\hyperlink{classDiscretization_a69ba136ab7f8c09d805afca159cab428}{compute\+Dv2\+Dy}} (int i, int j) const =0 -\begin{DoxyCompactList}\small\item\em Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y. \end{DoxyCompactList}\item -virtual double \mbox{\hyperlink{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795}{compute\+Duv\+Dx}} (int i, int j) const =0 -\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x. \end{DoxyCompactList}\item -virtual double \mbox{\hyperlink{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84}{compute\+Duv\+Dy}} (int i, int j) const =0 -\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y. \end{DoxyCompactList}\item -\Hypertarget{classDiscretization_a6986501b0b5c96699ff3ac843c1a6ca2}\label{classDiscretization_a6986501b0b5c96699ff3ac843c1a6ca2} -virtual double {\bfseries compute\+D2u\+Dx2} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to x. \end{DoxyCompactList}\item -\Hypertarget{classDiscretization_a446aabc55a9fb4b5cb2f476babc532f9}\label{classDiscretization_a446aabc55a9fb4b5cb2f476babc532f9} -virtual double {\bfseries compute\+D2u\+Dy2} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to y. \end{DoxyCompactList}\item -\Hypertarget{classDiscretization_a5119047788a34eadf37480e913bdc8ea}\label{classDiscretization_a5119047788a34eadf37480e913bdc8ea} -virtual double {\bfseries compute\+D2v\+Dx2} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to x. \end{DoxyCompactList}\item -\Hypertarget{classDiscretization_a56678582a049b1b141621e41afff1438}\label{classDiscretization_a56678582a049b1b141621e41afff1438} -virtual double {\bfseries compute\+D2v\+Dy2} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to y. \end{DoxyCompactList}\item -\Hypertarget{classDiscretization_aed3ad75ad6e647d14f118a12652c01b2}\label{classDiscretization_aed3ad75ad6e647d14f118a12652c01b2} -virtual double {\bfseries compute\+Dp\+Dx} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to x. \end{DoxyCompactList}\item -\Hypertarget{classDiscretization_a859f4dc33f0ea91f5e6537be09ce4999}\label{classDiscretization_a859f4dc33f0ea91f5e6537be09ce4999} -virtual double {\bfseries compute\+Dp\+Dy} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to y. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}{Staggered\+Grid}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item -const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width} () const -\begin{DoxyCompactList}\small\item\em Get the length of a single cell in x and y directions. \end{DoxyCompactList}\item -const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells} () const -\begin{DoxyCompactList}\small\item\em Get number of cells in x and y directions. \end{DoxyCompactList}\item -const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries u} () const -\begin{DoxyCompactList}\small\item\em Get a reference to the field variable u. \end{DoxyCompactList}\item -const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries v} () const -\begin{DoxyCompactList}\small\item\em Get a reference to the field variable v. \end{DoxyCompactList}\item -const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries p} () const -\begin{DoxyCompactList}\small\item\em Get a reference to the field variable p. \end{DoxyCompactList}\item -const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries rhs} () const -\begin{DoxyCompactList}\small\item\em Get a reference to the field variable rhs. \end{DoxyCompactList}\item -double {\bfseries u} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j), declared constant. \end{DoxyCompactList}\item -double \& {\bfseries u} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j) \end{DoxyCompactList}\item -double {\bfseries v} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j), declared constant. \end{DoxyCompactList}\item -double \& {\bfseries v} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j) \end{DoxyCompactList}\item -double {\bfseries p} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j), declared constant. \end{DoxyCompactList}\item -double \& {\bfseries p} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j) \end{DoxyCompactList}\item -double \& {\bfseries f} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of f in element (i,j) \end{DoxyCompactList}\item -double \& {\bfseries g} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of g in element (i,j) \end{DoxyCompactList}\item -double \& {\bfseries rhs} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of rhs in element (i,j) \end{DoxyCompactList}\item -double {\bfseries dx} () const -\begin{DoxyCompactList}\small\item\em Get the mesh width in x-\/direction. \end{DoxyCompactList}\item -double {\bfseries dy} () const -\begin{DoxyCompactList}\small\item\em Get the mesh width in y-\/direction. \end{DoxyCompactList}\item -int {\bfseries u\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for u in x direction \end{DoxyCompactList}\item -int {\bfseries u\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for u in x direction \end{DoxyCompactList}\item -int {\bfseries u\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for u in y direction \end{DoxyCompactList}\item -int {\bfseries u\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for u in y direction \end{DoxyCompactList}\item -int {\bfseries v\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for v in x direction \end{DoxyCompactList}\item -int {\bfseries v\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for v in x direction \end{DoxyCompactList}\item -int {\bfseries v\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for v in y direction \end{DoxyCompactList}\item -int {\bfseries v\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for v in y direction \end{DoxyCompactList}\item -int {\bfseries p\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for p in x direction \end{DoxyCompactList}\item -int {\bfseries p\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for p in x direction \end{DoxyCompactList}\item -int {\bfseries p\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for p in y direction \end{DoxyCompactList}\item -int {\bfseries p\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for p in y direction \end{DoxyCompactList}\item -int {\bfseries f\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for f in x direction \end{DoxyCompactList}\item -int {\bfseries f\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for f in x direction \end{DoxyCompactList}\item -int {\bfseries f\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for f in y direction \end{DoxyCompactList}\item -int {\bfseries f\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for f in y direction \end{DoxyCompactList}\item -int {\bfseries g\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for g in x direction \end{DoxyCompactList}\item -int {\bfseries g\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for g in x direction \end{DoxyCompactList}\item -int {\bfseries g\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for g in y direction \end{DoxyCompactList}\item -int {\bfseries g\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for g in y direction \end{DoxyCompactList}\item -int {\bfseries rhs\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for rhs in x direction \end{DoxyCompactList}\item -int {\bfseries rhs\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in x direction \end{DoxyCompactList}\item -int {\bfseries rhs\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for rhs in y direction \end{DoxyCompactList}\item -int {\bfseries rhs\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in y direction \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsubsection*{Additional Inherited Members} -\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} -\begin{DoxyCompactItemize} -\item -const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells\+\_\+} -\begin{DoxyCompactList}\small\item\em array containing number of cells in x and y directions \end{DoxyCompactList}\item -const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width\+\_\+} -\begin{DoxyCompactList}\small\item\em array containing the sizes of cell edges in x and y directions \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries u\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable u \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries v\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable v \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries p\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable p \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries f\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable f \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries g\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable g \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries rhs\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable rhs \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\doxysubsection{Detailed Description} -Computes derivatives included in governing equations. - -Interface for the discretization. Computes the needed derivatives to solve the Poisson and continuity equations. - -\doxysubsection{Constructor \& Destructor Documentation} -\Hypertarget{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c}\label{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c} -\index{Discretization@{Discretization}!Discretization@{Discretization}} -\index{Discretization@{Discretization}!Discretization@{Discretization}} -\doxysubsubsection{\texorpdfstring{Discretization()}{Discretization()}} -{\footnotesize\ttfamily Discretization\+::\+Discretization (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{n\+Cells, }\item[{std\+::array$<$ double, 2 $>$}]{mesh\+Width }\end{DoxyParamCaption})} - - - -Constructor. - - -\begin{DoxyParams}{Parameters} -{\em n\+Cells} & array containing number of cells in x and y directions \\ -\hline -{\em mesh\+Width} & array containing the length of a single cell in x and y directions \\ -\hline -\end{DoxyParams} - - -\doxysubsection{Member Function Documentation} -\Hypertarget{classDiscretization_acca6bf193e0e91f645d292527299254b}\label{classDiscretization_acca6bf193e0e91f645d292527299254b} -\index{Discretization@{Discretization}!computeDu2Dx@{computeDu2Dx}} -\index{computeDu2Dx@{computeDu2Dx}!Discretization@{Discretization}} -\doxysubsubsection{\texorpdfstring{computeDu2Dx()}{computeDu2Dx()}} -{\footnotesize\ttfamily virtual double Discretization\+::compute\+Du2\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [pure virtual]}} - - - -Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x. - - - -Implemented in \mbox{\hyperlink{classCentralDifferences_adb4502f473cc047a433db596146672e4}{Central\+Differences}}, and \mbox{\hyperlink{classDonorCell_a265bdaf46ed8ba46a42ef0cb03807175}{Donor\+Cell}}. - -\Hypertarget{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795}\label{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795} -\index{Discretization@{Discretization}!computeDuvDx@{computeDuvDx}} -\index{computeDuvDx@{computeDuvDx}!Discretization@{Discretization}} -\doxysubsubsection{\texorpdfstring{computeDuvDx()}{computeDuvDx()}} -{\footnotesize\ttfamily virtual double Discretization\+::compute\+Duv\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [pure virtual]}} - - - -Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x. - - - -Implemented in \mbox{\hyperlink{classCentralDifferences_a9bd7ac3bfd709991525ec57de10ed2e1}{Central\+Differences}}, and \mbox{\hyperlink{classDonorCell_ae41b5f85743ca7f148bd829561bd9cb5}{Donor\+Cell}}. - -\Hypertarget{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84}\label{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84} -\index{Discretization@{Discretization}!computeDuvDy@{computeDuvDy}} -\index{computeDuvDy@{computeDuvDy}!Discretization@{Discretization}} -\doxysubsubsection{\texorpdfstring{computeDuvDy()}{computeDuvDy()}} -{\footnotesize\ttfamily virtual double Discretization\+::compute\+Duv\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [pure virtual]}} - - - -Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y. - - - -Implemented in \mbox{\hyperlink{classCentralDifferences_a4184367de8d48e678edfb078a19fc0a4}{Central\+Differences}}, and \mbox{\hyperlink{classDonorCell_a285562312f08efde26afd160174d2843}{Donor\+Cell}}. - -\Hypertarget{classDiscretization_a69ba136ab7f8c09d805afca159cab428}\label{classDiscretization_a69ba136ab7f8c09d805afca159cab428} -\index{Discretization@{Discretization}!computeDv2Dy@{computeDv2Dy}} -\index{computeDv2Dy@{computeDv2Dy}!Discretization@{Discretization}} -\doxysubsubsection{\texorpdfstring{computeDv2Dy()}{computeDv2Dy()}} -{\footnotesize\ttfamily virtual double Discretization\+::compute\+Dv2\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [pure virtual]}} - - - -Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y. - - - -Implemented in \mbox{\hyperlink{classCentralDifferences_a66eb9b800b9a9ac6f81fc719a42eb0ee}{Central\+Differences}}, and \mbox{\hyperlink{classDonorCell_a01dcfb7fcf356d5ee412107a30c26fb3}{Donor\+Cell}}. - - - -The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/discretization.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/discretization.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classDonorCell.eps b/documentation/latex/classDonorCell.eps deleted file mode 100644 index b2ede092..00000000 --- a/documentation/latex/classDonorCell.eps +++ /dev/null @@ -1,203 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: ClassName -%%Creator: Doxygen -%%CreationDate: Time -%%For: -%Magnification: 1.00 -%%Orientation: Portrait -%%BoundingBox: 0 0 500 588.235291 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%EndComments - -% ----- variables ----- - -/boxwidth 0 def -/boxheight 40 def -/fontheight 24 def -/marginwidth 10 def -/distx 20 def -/disty 40 def -/boundaspect 0.850000 def % aspect ratio of the BoundingBox (width/height) -/boundx 500 def -/boundy boundx boundaspect div def -/xspacing 0 def -/yspacing 0 def -/rows 3 def -/cols 1 def -/scalefactor 0 def -/boxfont /Times-Roman findfont fontheight scalefont def - -% ----- procedures ----- - -/dotted { [1 4] 0 setdash } def -/dashed { [5] 0 setdash } def -/solid { [] 0 setdash } def - -/max % result = MAX(arg1,arg2) -{ - /a exch def - /b exch def - a b gt {a} {b} ifelse -} def - -/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) -{ - 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max -} def - -/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) -{ - /str exch def - /boxwidth boxwidth str stringwidth pop max def -} def - -/box % draws a box with text 'arg1' at grid pos (arg2,arg3) -{ gsave - 2 setlinewidth - newpath - exch xspacing mul xoffset add - exch yspacing mul - moveto - boxwidth 0 rlineto - 0 boxheight rlineto - boxwidth neg 0 rlineto - 0 boxheight neg rlineto - closepath - dup stringwidth pop neg boxwidth add 2 div - boxheight fontheight 2 div sub 2 div - rmoveto show stroke - grestore -} def - -/mark -{ newpath - exch xspacing mul xoffset add boxwidth add - exch yspacing mul - moveto - 0 boxheight 4 div rlineto - boxheight neg 4 div boxheight neg 4 div rlineto - closepath - eofill - stroke -} def - -/arrow -{ newpath - moveto - 3 -8 rlineto - -6 0 rlineto - 3 8 rlineto - closepath - eofill - stroke -} def - -/out % draws an output connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight add - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/in % draws an input connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul disty 2 div sub - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/hedge -{ - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight 2 div sub - /y exch def - /x exch def - newpath - x y moveto - boxwidth 2 div distx add 0 rlineto - stroke - 1 eq - { newpath x boxwidth 2 div distx add add y moveto - -8 3 rlineto - 0 -6 rlineto - 8 3 rlineto - closepath - eofill - stroke - } if -} def - -/vedge -{ - /ye exch def - /ys exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add dup - ys yspacing mul boxheight 2 div sub - moveto - ye yspacing mul boxheight 2 div sub - lineto - stroke -} def - -/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' -{ - /ys exch def - /xe exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add - ys yspacing mul disty 2 div sub - moveto - xspacing xe xs sub mul 0 - rlineto - stroke -} def - -% ----- main ------ - -boxfont setfont -1 boundaspect scale -(DonorCell) cw -(Discretization) cw -(StaggeredGrid) cw -/boxwidth boxwidth marginwidth 2 mul add def -/xspacing boxwidth distx add def -/yspacing boxheight disty add def -/scalefactor - boxwidth cols mul distx cols 1 sub mul add - boxheight rows mul disty rows 1 sub mul add boundaspect mul - max def -boundx scalefactor div boundy scalefactor div scale - -% ----- classes ----- - - (DonorCell) 0.000000 0.000000 box - (Discretization) 0.000000 1.000000 box - (StaggeredGrid) 0.000000 2.000000 box - -% ----- relations ----- - -solid -0 0.000000 0.000000 out -solid -1 0.000000 1.000000 in -solid -0 0.000000 1.000000 out -solid -1 0.000000 2.000000 in diff --git a/documentation/latex/classDonorCell.pdf b/documentation/latex/classDonorCell.pdf deleted file mode 100644 index ad49977a93e718b23c3f8ea852c0dd173a8544f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5600 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 diff --git a/documentation/latex/classDonorCell.tex b/documentation/latex/classDonorCell.tex deleted file mode 100644 index 02e099c1..00000000 --- a/documentation/latex/classDonorCell.tex +++ /dev/null @@ -1,246 +0,0 @@ -\doxysection{Donor\+Cell Class Reference} -\hypertarget{classDonorCell}{}\label{classDonorCell}\index{DonorCell@{DonorCell}} - - -Discretizes the problem using the donor cell scheme. - - - - -{\ttfamily \#include $<$donor\+\_\+cell.\+h$>$} - -Inheritance diagram for Donor\+Cell\+:\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[height=3.000000cm]{classDonorCell} -\end{center} -\end{figure} -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classDonorCell_a4896ad035a5ac50c85e2b66d442a5312}{Donor\+Cell}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}, double alpha) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item -double \mbox{\hyperlink{classDonorCell_a265bdaf46ed8ba46a42ef0cb03807175}{compute\+Du2\+Dx}} (int i, int j) const override -\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x with the donor cell Scheme. \end{DoxyCompactList}\item -double \mbox{\hyperlink{classDonorCell_a01dcfb7fcf356d5ee412107a30c26fb3}{compute\+Dv2\+Dy}} (int i, int j) const override -\begin{DoxyCompactList}\small\item\em Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y with the donor cell Scheme. \end{DoxyCompactList}\item -double \mbox{\hyperlink{classDonorCell_ae41b5f85743ca7f148bd829561bd9cb5}{compute\+Duv\+Dx}} (int i, int j) const override -\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x with the donor cell Scheme. \end{DoxyCompactList}\item -double \mbox{\hyperlink{classDonorCell_a285562312f08efde26afd160174d2843}{compute\+Duv\+Dy}} (int i, int j) const override -\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y with the donor cell Scheme. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classDiscretization}{Discretization}}} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c}{Discretization}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item -virtual double {\bfseries compute\+D2u\+Dx2} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to x. \end{DoxyCompactList}\item -virtual double {\bfseries compute\+D2u\+Dy2} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to y. \end{DoxyCompactList}\item -virtual double {\bfseries compute\+D2v\+Dx2} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to x. \end{DoxyCompactList}\item -virtual double {\bfseries compute\+D2v\+Dy2} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to y. \end{DoxyCompactList}\item -virtual double {\bfseries compute\+Dp\+Dx} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to x. \end{DoxyCompactList}\item -virtual double {\bfseries compute\+Dp\+Dy} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to y. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}{Staggered\+Grid}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item -const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width} () const -\begin{DoxyCompactList}\small\item\em Get the length of a single cell in x and y directions. \end{DoxyCompactList}\item -const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells} () const -\begin{DoxyCompactList}\small\item\em Get number of cells in x and y directions. \end{DoxyCompactList}\item -const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries u} () const -\begin{DoxyCompactList}\small\item\em Get a reference to the field variable u. \end{DoxyCompactList}\item -const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries v} () const -\begin{DoxyCompactList}\small\item\em Get a reference to the field variable v. \end{DoxyCompactList}\item -const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries p} () const -\begin{DoxyCompactList}\small\item\em Get a reference to the field variable p. \end{DoxyCompactList}\item -const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries rhs} () const -\begin{DoxyCompactList}\small\item\em Get a reference to the field variable rhs. \end{DoxyCompactList}\item -double {\bfseries u} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j), declared constant. \end{DoxyCompactList}\item -double \& {\bfseries u} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j) \end{DoxyCompactList}\item -double {\bfseries v} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j), declared constant. \end{DoxyCompactList}\item -double \& {\bfseries v} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j) \end{DoxyCompactList}\item -double {\bfseries p} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j), declared constant. \end{DoxyCompactList}\item -double \& {\bfseries p} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j) \end{DoxyCompactList}\item -double \& {\bfseries f} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of f in element (i,j) \end{DoxyCompactList}\item -double \& {\bfseries g} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of g in element (i,j) \end{DoxyCompactList}\item -double \& {\bfseries rhs} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of rhs in element (i,j) \end{DoxyCompactList}\item -double {\bfseries dx} () const -\begin{DoxyCompactList}\small\item\em Get the mesh width in x-\/direction. \end{DoxyCompactList}\item -double {\bfseries dy} () const -\begin{DoxyCompactList}\small\item\em Get the mesh width in y-\/direction. \end{DoxyCompactList}\item -int {\bfseries u\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for u in x direction \end{DoxyCompactList}\item -int {\bfseries u\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for u in x direction \end{DoxyCompactList}\item -int {\bfseries u\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for u in y direction \end{DoxyCompactList}\item -int {\bfseries u\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for u in y direction \end{DoxyCompactList}\item -int {\bfseries v\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for v in x direction \end{DoxyCompactList}\item -int {\bfseries v\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for v in x direction \end{DoxyCompactList}\item -int {\bfseries v\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for v in y direction \end{DoxyCompactList}\item -int {\bfseries v\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for v in y direction \end{DoxyCompactList}\item -int {\bfseries p\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for p in x direction \end{DoxyCompactList}\item -int {\bfseries p\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for p in x direction \end{DoxyCompactList}\item -int {\bfseries p\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for p in y direction \end{DoxyCompactList}\item -int {\bfseries p\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for p in y direction \end{DoxyCompactList}\item -int {\bfseries f\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for f in x direction \end{DoxyCompactList}\item -int {\bfseries f\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for f in x direction \end{DoxyCompactList}\item -int {\bfseries f\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for f in y direction \end{DoxyCompactList}\item -int {\bfseries f\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for f in y direction \end{DoxyCompactList}\item -int {\bfseries g\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for g in x direction \end{DoxyCompactList}\item -int {\bfseries g\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for g in x direction \end{DoxyCompactList}\item -int {\bfseries g\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for g in y direction \end{DoxyCompactList}\item -int {\bfseries g\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for g in y direction \end{DoxyCompactList}\item -int {\bfseries rhs\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for rhs in x direction \end{DoxyCompactList}\item -int {\bfseries rhs\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in x direction \end{DoxyCompactList}\item -int {\bfseries rhs\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for rhs in y direction \end{DoxyCompactList}\item -int {\bfseries rhs\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in y direction \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsubsection*{Additional Inherited Members} -\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} -\begin{DoxyCompactItemize} -\item -const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells\+\_\+} -\begin{DoxyCompactList}\small\item\em array containing number of cells in x and y directions \end{DoxyCompactList}\item -const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width\+\_\+} -\begin{DoxyCompactList}\small\item\em array containing the sizes of cell edges in x and y directions \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries u\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable u \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries v\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable v \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries p\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable p \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries f\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable f \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries g\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable g \end{DoxyCompactList}\item -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries rhs\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable rhs \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\doxysubsection{Detailed Description} -Discretizes the problem using the donor cell scheme. - -Implements the first derivatives of u\texorpdfstring{$^\wedge$}{\string^}2, v\texorpdfstring{$^\wedge$}{\string^}2 and u\texorpdfstring{$\ast$}{*}v according to the donor cell scheme - -\doxysubsection{Constructor \& Destructor Documentation} -\Hypertarget{classDonorCell_a4896ad035a5ac50c85e2b66d442a5312}\label{classDonorCell_a4896ad035a5ac50c85e2b66d442a5312} -\index{DonorCell@{DonorCell}!DonorCell@{DonorCell}} -\index{DonorCell@{DonorCell}!DonorCell@{DonorCell}} -\doxysubsubsection{\texorpdfstring{DonorCell()}{DonorCell()}} -{\footnotesize\ttfamily Donor\+Cell\+::\+Donor\+Cell (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{n\+Cells, }\item[{std\+::array$<$ double, 2 $>$}]{mesh\+Width, }\item[{double}]{alpha }\end{DoxyParamCaption})} - - - -Constructor. - - -\begin{DoxyParams}{Parameters} -{\em n\+Cells} & array containing number of cells in x and y directions \\ -\hline -{\em mesh\+Width} & array containing the length of a single cell in x and y directions \\ -\hline -{\em alpha} & weight factor between central differences and donor cell schemes \\ -\hline -\end{DoxyParams} - - -\doxysubsection{Member Function Documentation} -\Hypertarget{classDonorCell_a265bdaf46ed8ba46a42ef0cb03807175}\label{classDonorCell_a265bdaf46ed8ba46a42ef0cb03807175} -\index{DonorCell@{DonorCell}!computeDu2Dx@{computeDu2Dx}} -\index{computeDu2Dx@{computeDu2Dx}!DonorCell@{DonorCell}} -\doxysubsubsection{\texorpdfstring{computeDu2Dx()}{computeDu2Dx()}} -{\footnotesize\ttfamily double Donor\+Cell\+::compute\+Du2\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} - - - -Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x with the donor cell Scheme. - - - -Implements \mbox{\hyperlink{classDiscretization_acca6bf193e0e91f645d292527299254b}{Discretization}}. - -\Hypertarget{classDonorCell_ae41b5f85743ca7f148bd829561bd9cb5}\label{classDonorCell_ae41b5f85743ca7f148bd829561bd9cb5} -\index{DonorCell@{DonorCell}!computeDuvDx@{computeDuvDx}} -\index{computeDuvDx@{computeDuvDx}!DonorCell@{DonorCell}} -\doxysubsubsection{\texorpdfstring{computeDuvDx()}{computeDuvDx()}} -{\footnotesize\ttfamily double Donor\+Cell\+::compute\+Duv\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} - - - -Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x with the donor cell Scheme. - - - -Implements \mbox{\hyperlink{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795}{Discretization}}. - -\Hypertarget{classDonorCell_a285562312f08efde26afd160174d2843}\label{classDonorCell_a285562312f08efde26afd160174d2843} -\index{DonorCell@{DonorCell}!computeDuvDy@{computeDuvDy}} -\index{computeDuvDy@{computeDuvDy}!DonorCell@{DonorCell}} -\doxysubsubsection{\texorpdfstring{computeDuvDy()}{computeDuvDy()}} -{\footnotesize\ttfamily double Donor\+Cell\+::compute\+Duv\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} - - - -Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y with the donor cell Scheme. - - - -Implements \mbox{\hyperlink{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84}{Discretization}}. - -\Hypertarget{classDonorCell_a01dcfb7fcf356d5ee412107a30c26fb3}\label{classDonorCell_a01dcfb7fcf356d5ee412107a30c26fb3} -\index{DonorCell@{DonorCell}!computeDv2Dy@{computeDv2Dy}} -\index{computeDv2Dy@{computeDv2Dy}!DonorCell@{DonorCell}} -\doxysubsubsection{\texorpdfstring{computeDv2Dy()}{computeDv2Dy()}} -{\footnotesize\ttfamily double Donor\+Cell\+::compute\+Dv2\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} - - - -Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y with the donor cell Scheme. - - - -Implements \mbox{\hyperlink{classDiscretization_a69ba136ab7f8c09d805afca159cab428}{Discretization}}. - - - -The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/donor\+\_\+cell.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/donor\+\_\+cell.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classFieldVariable.eps b/documentation/latex/classFieldVariable.eps deleted file mode 100644 index 0a27d91c..00000000 --- a/documentation/latex/classFieldVariable.eps +++ /dev/null @@ -1,197 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: ClassName -%%Creator: Doxygen -%%CreationDate: Time -%%For: -%Magnification: 1.00 -%%Orientation: Portrait -%%BoundingBox: 0 0 500 416.666656 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%EndComments - -% ----- variables ----- - -/boxwidth 0 def -/boxheight 40 def -/fontheight 24 def -/marginwidth 10 def -/distx 20 def -/disty 40 def -/boundaspect 1.200000 def % aspect ratio of the BoundingBox (width/height) -/boundx 500 def -/boundy boundx boundaspect div def -/xspacing 0 def -/yspacing 0 def -/rows 2 def -/cols 1 def -/scalefactor 0 def -/boxfont /Times-Roman findfont fontheight scalefont def - -% ----- procedures ----- - -/dotted { [1 4] 0 setdash } def -/dashed { [5] 0 setdash } def -/solid { [] 0 setdash } def - -/max % result = MAX(arg1,arg2) -{ - /a exch def - /b exch def - a b gt {a} {b} ifelse -} def - -/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) -{ - 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max -} def - -/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) -{ - /str exch def - /boxwidth boxwidth str stringwidth pop max def -} def - -/box % draws a box with text 'arg1' at grid pos (arg2,arg3) -{ gsave - 2 setlinewidth - newpath - exch xspacing mul xoffset add - exch yspacing mul - moveto - boxwidth 0 rlineto - 0 boxheight rlineto - boxwidth neg 0 rlineto - 0 boxheight neg rlineto - closepath - dup stringwidth pop neg boxwidth add 2 div - boxheight fontheight 2 div sub 2 div - rmoveto show stroke - grestore -} def - -/mark -{ newpath - exch xspacing mul xoffset add boxwidth add - exch yspacing mul - moveto - 0 boxheight 4 div rlineto - boxheight neg 4 div boxheight neg 4 div rlineto - closepath - eofill - stroke -} def - -/arrow -{ newpath - moveto - 3 -8 rlineto - -6 0 rlineto - 3 8 rlineto - closepath - eofill - stroke -} def - -/out % draws an output connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight add - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/in % draws an input connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul disty 2 div sub - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/hedge -{ - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight 2 div sub - /y exch def - /x exch def - newpath - x y moveto - boxwidth 2 div distx add 0 rlineto - stroke - 1 eq - { newpath x boxwidth 2 div distx add add y moveto - -8 3 rlineto - 0 -6 rlineto - 8 3 rlineto - closepath - eofill - stroke - } if -} def - -/vedge -{ - /ye exch def - /ys exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add dup - ys yspacing mul boxheight 2 div sub - moveto - ye yspacing mul boxheight 2 div sub - lineto - stroke -} def - -/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' -{ - /ys exch def - /xe exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add - ys yspacing mul disty 2 div sub - moveto - xspacing xe xs sub mul 0 - rlineto - stroke -} def - -% ----- main ------ - -boxfont setfont -1 boundaspect scale -(FieldVariable) cw -(Array2D) cw -/boxwidth boxwidth marginwidth 2 mul add def -/xspacing boxwidth distx add def -/yspacing boxheight disty add def -/scalefactor - boxwidth cols mul distx cols 1 sub mul add - boxheight rows mul disty rows 1 sub mul add boundaspect mul - max def -boundx scalefactor div boundy scalefactor div scale - -% ----- classes ----- - - (FieldVariable) 0.000000 0.000000 box - (Array2D) 0.000000 1.000000 box - -% ----- relations ----- - -solid -0 0.000000 0.000000 out -solid -1 0.000000 1.000000 in diff --git a/documentation/latex/classFieldVariable.pdf b/documentation/latex/classFieldVariable.pdf deleted file mode 100644 index 88b42a4a104c8c25571fe3fe94b2848e9c106a2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4939 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 - -Inheritance diagram for Field\+Variable\+:\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[height=2.000000cm]{classFieldVariable} -\end{center} -\end{figure} -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classFieldVariable_aa0985778bc6331b74904a03c3ef67a98}{Field\+Variable}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}}, std\+::array$<$ double, 2 $>$ origin, std\+::array$<$ double, 2 $>$ mesh\+Width) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item -double \mbox{\hyperlink{classFieldVariable_a2949624f1d2d7e29872f743db0b1d83b}{interpolate\+At}} (double x, double y) const -\begin{DoxyCompactList}\small\item\em Interpolates value of field variable in domain using x and y coordinates. \end{DoxyCompactList}\item -double \mbox{\hyperlink{classFieldVariable_a55168fd422c70c8386ba311909427cf7}{find\+Abs\+Max}} () const -\begin{DoxyCompactList}\small\item\em Find point in \doxylink{classArray2D}{Array2D} of Fieldvariable with maximum value. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classArray2D}{Array2D}}} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classArray2D_a16521417dfdf67ec694bfb7747df9000}{Array2D}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}}) -\begin{DoxyCompactList}\small\item\em constructor. \end{DoxyCompactList}\item -double \& \mbox{\hyperlink{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8}{operator()}} (int i, int j) -\begin{DoxyCompactList}\small\item\em set array value. Overloads the () operator \end{DoxyCompactList}\item -double \mbox{\hyperlink{classArray2D_af745718ec25b815051de2d0c3c94e0d2}{operator()}} (int i, int j) const -\begin{DoxyCompactList}\small\item\em get array value. Overloads the () operator \end{DoxyCompactList}\item -std\+::array$<$ int, 2 $>$ {\bfseries size} () const -\begin{DoxyCompactList}\small\item\em get size of array in x and y direction \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsubsection*{Additional Inherited Members} -\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classArray2D}{Array2D}}} -\begin{DoxyCompactItemize} -\item -const std\+::array$<$ int, 2 $>$ {\bfseries size\+\_\+} -\begin{DoxyCompactList}\small\item\em size of array in x and y direction \end{DoxyCompactList}\item -std\+::vector$<$ double $>$ {\bfseries data\+\_\+} -\begin{DoxyCompactList}\small\item\em storage array values, in row-\/major order \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\doxysubsection{Detailed Description} -\doxylink{classDiscretization}{Discretization} of a scalar function. - -A field variable is the discretization of a scalar function f(x) with x in the computational domain. More specifically, a scalar value is stored at discrete nodes/points. The nodes are arranged in an equidistant mesh with specified mesh width. - -\doxysubsection{Constructor \& Destructor Documentation} -\Hypertarget{classFieldVariable_aa0985778bc6331b74904a03c3ef67a98}\label{classFieldVariable_aa0985778bc6331b74904a03c3ef67a98} -\index{FieldVariable@{FieldVariable}!FieldVariable@{FieldVariable}} -\index{FieldVariable@{FieldVariable}!FieldVariable@{FieldVariable}} -\doxysubsubsection{\texorpdfstring{FieldVariable()}{FieldVariable()}} -{\footnotesize\ttfamily Field\+Variable\+::\+Field\+Variable (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{size, }\item[{std\+::array$<$ double, 2 $>$}]{origin, }\item[{std\+::array$<$ double, 2 $>$}]{mesh\+Width }\end{DoxyParamCaption})} - - - -Constructor. - - -\begin{DoxyParams}{Parameters} -{\em size} & number of cells in x and y direction \\ -\hline -{\em origin} & orgin of Fieldvariable relative to domain origin \\ -\hline -{\em meshwidth} & mesh width in x and y direction \\ -\hline -\end{DoxyParams} - - -\doxysubsection{Member Function Documentation} -\Hypertarget{classFieldVariable_a55168fd422c70c8386ba311909427cf7}\label{classFieldVariable_a55168fd422c70c8386ba311909427cf7} -\index{FieldVariable@{FieldVariable}!findAbsMax@{findAbsMax}} -\index{findAbsMax@{findAbsMax}!FieldVariable@{FieldVariable}} -\doxysubsubsection{\texorpdfstring{findAbsMax()}{findAbsMax()}} -{\footnotesize\ttfamily double Field\+Variable\+::find\+Abs\+Max (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const} - - - -Find point in \doxylink{classArray2D}{Array2D} of Fieldvariable with maximum value. - -Finds maximum by iterating through all values in Fiel\+Variable \Hypertarget{classFieldVariable_a2949624f1d2d7e29872f743db0b1d83b}\label{classFieldVariable_a2949624f1d2d7e29872f743db0b1d83b} -\index{FieldVariable@{FieldVariable}!interpolateAt@{interpolateAt}} -\index{interpolateAt@{interpolateAt}!FieldVariable@{FieldVariable}} -\doxysubsubsection{\texorpdfstring{interpolateAt()}{interpolateAt()}} -{\footnotesize\ttfamily double Field\+Variable\+::interpolate\+At (\begin{DoxyParamCaption}\item[{double}]{x, }\item[{double}]{y }\end{DoxyParamCaption}) const} - - - -Interpolates value of field variable in domain using x and y coordinates. - -Interpolates by using bilinear interpolation. - - -\begin{DoxyParams}{Parameters} -{\em x} & x postion of point to interpolate \\ -\hline -{\em y} & y postion of point to interpolate \\ -\hline -\end{DoxyParams} - - -The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/storage/field\+\_\+variable.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/storage/field\+\_\+variable.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classFluidTracer.tex b/documentation/latex/classFluidTracer.tex deleted file mode 100644 index 7d7c7b28..00000000 --- a/documentation/latex/classFluidTracer.tex +++ /dev/null @@ -1,101 +0,0 @@ -\doxysection{Fluid\+Tracer Class Reference} -\hypertarget{classFluidTracer}{}\label{classFluidTracer}\index{FluidTracer@{FluidTracer}} -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\Hypertarget{classFluidTracer_a0a1c9fde640a129696e5c47869948939}\label{classFluidTracer_a0a1c9fde640a129696e5c47869948939} -{\bfseries Fluid\+Tracer} (int num\+Particlesper\+Cell, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$ mask) -\item -\Hypertarget{classFluidTracer_ad7f2ef5ef8d806b87c6478e85159a873}\label{classFluidTracer_ad7f2ef5ef8d806b87c6478e85159a873} -{\bfseries Fluid\+Tracer} (std\+::vector$<$ double $>$ x, std\+::vector$<$ double $>$ y, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$ mask) -\item -void \mbox{\hyperlink{classFluidTracer_aba4d452f26e9276b91256dd251789b90}{move\+Particles}} (double dt) -\begin{DoxyCompactList}\small\item\em Update the position of the particles according to the velocity field and sets mask accordingly. \end{DoxyCompactList}\item -void \mbox{\hyperlink{classFluidTracer_ace163e1fe040acbd4c3122f082b08eea}{create\+Particles}} (double position\+SourceX, double position\+SourceY) -\begin{DoxyCompactList}\small\item\em can be used to create a source cell for particles \end{DoxyCompactList}\item -int \mbox{\hyperlink{classFluidTracer_adc687a4988f532e21e13c9aa0591d658}{get\+Number\+Of\+Particles}} () const -\begin{DoxyCompactList}\small\item\em Get the Number Of Particles object. \end{DoxyCompactList}\item -std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classFluidTracer_a37ee0325d6af08be6eba8b073162342e}{get\+Particle\+Position}} (int i) const -\begin{DoxyCompactList}\small\item\em Get the Particle Position, index starts at 0. \end{DoxyCompactList}\item -\Hypertarget{classFluidTracer_a0a9c3c092d01327d636ef39b8dd36ed8}\label{classFluidTracer_a0a9c3c092d01327d636ef39b8dd36ed8} -std\+::array$<$ int, 2 $>$ {\bfseries cell\+Of\+Particle} (int i) -\item -\Hypertarget{classFluidTracer_a052e1ab909459100cd6a6cd8e9064ba6}\label{classFluidTracer_a052e1ab909459100cd6a6cd8e9064ba6} -int {\bfseries val2\+CellX} (double x\+Val) -\item -\Hypertarget{classFluidTracer_a7bc97a7586fa8d900a6269e77c9ccba1}\label{classFluidTracer_a7bc97a7586fa8d900a6269e77c9ccba1} -int {\bfseries val2\+CellY} (double y\+Val) -\item -\Hypertarget{classFluidTracer_a8306a4cff0036da1fcf695713f9f4226}\label{classFluidTracer_a8306a4cff0036da1fcf695713f9f4226} -std\+::array$<$ double, 2 $>$ {\bfseries update\+Particle} (int i, std\+::array$<$ int, 2 $>$ idx, double dt, std\+::array$<$ double, 2 $>$ vel, int depth) -\item -\Hypertarget{classFluidTracer_acdaf955221e204e107513b0e29738d53}\label{classFluidTracer_acdaf955221e204e107513b0e29738d53} -std\+::array$<$ double, 2 $>$ {\bfseries move\+Particles} (double dt, std\+::array$<$ double, 2 $>$ vel) -\end{DoxyCompactItemize} - - -\doxysubsection{Member Function Documentation} -\Hypertarget{classFluidTracer_ace163e1fe040acbd4c3122f082b08eea}\label{classFluidTracer_ace163e1fe040acbd4c3122f082b08eea} -\index{FluidTracer@{FluidTracer}!createParticles@{createParticles}} -\index{createParticles@{createParticles}!FluidTracer@{FluidTracer}} -\doxysubsubsection{\texorpdfstring{createParticles()}{createParticles()}} -{\footnotesize\ttfamily void Fluid\+Tracer\+::create\+Particles (\begin{DoxyParamCaption}\item[{double}]{position\+SourceX, }\item[{double}]{position\+SourceY }\end{DoxyParamCaption})} - - - -can be used to create a source cell for particles - -fills the cell homogenously with particles by cell \Hypertarget{classFluidTracer_adc687a4988f532e21e13c9aa0591d658}\label{classFluidTracer_adc687a4988f532e21e13c9aa0591d658} -\index{FluidTracer@{FluidTracer}!getNumberOfParticles@{getNumberOfParticles}} -\index{getNumberOfParticles@{getNumberOfParticles}!FluidTracer@{FluidTracer}} -\doxysubsubsection{\texorpdfstring{getNumberOfParticles()}{getNumberOfParticles()}} -{\footnotesize\ttfamily int Fluid\+Tracer\+::get\+Number\+Of\+Particles (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const} - - - -Get the Number Of Particles object. - -\begin{DoxyReturn}{Returns} -int -\end{DoxyReturn} -\Hypertarget{classFluidTracer_a37ee0325d6af08be6eba8b073162342e}\label{classFluidTracer_a37ee0325d6af08be6eba8b073162342e} -\index{FluidTracer@{FluidTracer}!getParticlePosition@{getParticlePosition}} -\index{getParticlePosition@{getParticlePosition}!FluidTracer@{FluidTracer}} -\doxysubsubsection{\texorpdfstring{getParticlePosition()}{getParticlePosition()}} -{\footnotesize\ttfamily std\+::array$<$ double, 2 $>$ Fluid\+Tracer\+::get\+Particle\+Position (\begin{DoxyParamCaption}\item[{int}]{i }\end{DoxyParamCaption}) const} - - - -Get the Particle Position, index starts at 0. - - -\begin{DoxyParams}{Parameters} -{\em i} & \\ -\hline -\end{DoxyParams} -\begin{DoxyReturn}{Returns} -std\+::array$<$double, 2$>$ -\end{DoxyReturn} -\Hypertarget{classFluidTracer_aba4d452f26e9276b91256dd251789b90}\label{classFluidTracer_aba4d452f26e9276b91256dd251789b90} -\index{FluidTracer@{FluidTracer}!moveParticles@{moveParticles}} -\index{moveParticles@{moveParticles}!FluidTracer@{FluidTracer}} -\doxysubsubsection{\texorpdfstring{moveParticles()}{moveParticles()}} -{\footnotesize\ttfamily void Fluid\+Tracer\+::move\+Particles (\begin{DoxyParamCaption}\item[{double}]{dt }\end{DoxyParamCaption})} - - - -Update the position of the particles according to the velocity field and sets mask accordingly. - -get the velocity field \$u\$ and \$v\$ Checks for collision with border or obstacle and reflects the particle at this position Update the mask where there are new Air or Fluid cells - - -\begin{DoxyParams}{Parameters} -{\em dt} & \\ -\hline -\end{DoxyParams} - - -The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/surface/fluid\+\_\+tracer.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/surface/fluid\+\_\+tracer.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classGaussSeidel.eps b/documentation/latex/classGaussSeidel.eps deleted file mode 100644 index 3e8f9980..00000000 --- a/documentation/latex/classGaussSeidel.eps +++ /dev/null @@ -1,197 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: ClassName -%%Creator: Doxygen -%%CreationDate: Time -%%For: -%Magnification: 1.00 -%%Orientation: Portrait -%%BoundingBox: 0 0 500 370.370361 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%EndComments - -% ----- variables ----- - -/boxwidth 0 def -/boxheight 40 def -/fontheight 24 def -/marginwidth 10 def -/distx 20 def -/disty 40 def -/boundaspect 1.350000 def % aspect ratio of the BoundingBox (width/height) -/boundx 500 def -/boundy boundx boundaspect div def -/xspacing 0 def -/yspacing 0 def -/rows 2 def -/cols 1 def -/scalefactor 0 def -/boxfont /Times-Roman findfont fontheight scalefont def - -% ----- procedures ----- - -/dotted { [1 4] 0 setdash } def -/dashed { [5] 0 setdash } def -/solid { [] 0 setdash } def - -/max % result = MAX(arg1,arg2) -{ - /a exch def - /b exch def - a b gt {a} {b} ifelse -} def - -/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) -{ - 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max -} def - -/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) -{ - /str exch def - /boxwidth boxwidth str stringwidth pop max def -} def - -/box % draws a box with text 'arg1' at grid pos (arg2,arg3) -{ gsave - 2 setlinewidth - newpath - exch xspacing mul xoffset add - exch yspacing mul - moveto - boxwidth 0 rlineto - 0 boxheight rlineto - boxwidth neg 0 rlineto - 0 boxheight neg rlineto - closepath - dup stringwidth pop neg boxwidth add 2 div - boxheight fontheight 2 div sub 2 div - rmoveto show stroke - grestore -} def - -/mark -{ newpath - exch xspacing mul xoffset add boxwidth add - exch yspacing mul - moveto - 0 boxheight 4 div rlineto - boxheight neg 4 div boxheight neg 4 div rlineto - closepath - eofill - stroke -} def - -/arrow -{ newpath - moveto - 3 -8 rlineto - -6 0 rlineto - 3 8 rlineto - closepath - eofill - stroke -} def - -/out % draws an output connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight add - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/in % draws an input connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul disty 2 div sub - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/hedge -{ - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight 2 div sub - /y exch def - /x exch def - newpath - x y moveto - boxwidth 2 div distx add 0 rlineto - stroke - 1 eq - { newpath x boxwidth 2 div distx add add y moveto - -8 3 rlineto - 0 -6 rlineto - 8 3 rlineto - closepath - eofill - stroke - } if -} def - -/vedge -{ - /ye exch def - /ys exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add dup - ys yspacing mul boxheight 2 div sub - moveto - ye yspacing mul boxheight 2 div sub - lineto - stroke -} def - -/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' -{ - /ys exch def - /xe exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add - ys yspacing mul disty 2 div sub - moveto - xspacing xe xs sub mul 0 - rlineto - stroke -} def - -% ----- main ------ - -boxfont setfont -1 boundaspect scale -(GaussSeidel) cw -(PressureSolver) cw -/boxwidth boxwidth marginwidth 2 mul add def -/xspacing boxwidth distx add def -/yspacing boxheight disty add def -/scalefactor - boxwidth cols mul distx cols 1 sub mul add - boxheight rows mul disty rows 1 sub mul add boundaspect mul - max def -boundx scalefactor div boundy scalefactor div scale - -% ----- classes ----- - - (GaussSeidel) 0.000000 0.000000 box - (PressureSolver) 0.000000 1.000000 box - -% ----- relations ----- - -solid -0 0.000000 0.000000 out -solid -1 0.000000 1.000000 in diff --git a/documentation/latex/classGaussSeidel.pdf b/documentation/latex/classGaussSeidel.pdf deleted file mode 100644 index 2d57d158b42bb270dadbe93e7d3b8ecc698935a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5020 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 diff --git a/documentation/latex/classGaussSeidel.tex b/documentation/latex/classGaussSeidel.tex deleted file mode 100644 index d30b36f9..00000000 --- a/documentation/latex/classGaussSeidel.tex +++ /dev/null @@ -1,111 +0,0 @@ -\doxysection{Gauss\+Seidel Class Reference} -\hypertarget{classGaussSeidel}{}\label{classGaussSeidel}\index{GaussSeidel@{GaussSeidel}} - - -Standard Gauss-\/\+Seidel solver. - - - - -{\ttfamily \#include $<$gauss\+\_\+seidel.\+h$>$} - -Inheritance diagram for Gauss\+Seidel\+:\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[height=2.000000cm]{classGaussSeidel} -\end{center} -\end{figure} -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classGaussSeidel_af31cc1ace2d616ebb8e0592c06865b9c}{Gauss\+Seidel}} (const std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ \&data, double epsilon, int maximum\+Number\+Of\+Iterations, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ boundary) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item -void \mbox{\hyperlink{classGaussSeidel_a6f0eb0c6938a64f8ded186f88170a04b}{solve}} () override -\begin{DoxyCompactList}\small\item\em override function that starts solver. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058}{Pressure\+Solver}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, double epsilon, int maximum\+Number\+Of\+Iterations, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ boundary) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsubsection*{Additional Inherited Members} -\doxysubsection*{Public Attributes inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} -\begin{DoxyCompactItemize} -\item -double {\bfseries dx2} -\item -double {\bfseries dy2} -\begin{DoxyCompactList}\small\item\em squared mesh widths \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsection*{Protected Member Functions inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} -\begin{DoxyCompactItemize} -\item -void \mbox{\hyperlink{classPressureSolver_a458c383fcacaf54c1a333a271049ca93}{set\+Boundary\+Values}} () -\begin{DoxyCompactList}\small\item\em Set the \doxylink{classBoundary}{Boundary} Values. \end{DoxyCompactList}\item -double {\bfseries calculate\+Residuum} () -\begin{DoxyCompactList}\small\item\em calculate residuum of current time step \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} -\begin{DoxyCompactItemize} -\item -int {\bfseries i\+\_\+beg} -\begin{DoxyCompactList}\small\item\em begin of loop for rhs in x direction \end{DoxyCompactList}\item -int {\bfseries i\+\_\+end} -\begin{DoxyCompactList}\small\item\em end of loop for rhs in x direction \end{DoxyCompactList}\item -int {\bfseries j\+\_\+beg} -\begin{DoxyCompactList}\small\item\em begin of loop for rhs in y direction \end{DoxyCompactList}\item -int {\bfseries j\+\_\+end} -\begin{DoxyCompactList}\small\item\em end of loop for rhs in y direction \end{DoxyCompactList}\item -std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} -\begin{DoxyCompactList}\small\item\em object holding the needed field variables for rhs and p \end{DoxyCompactList}\item -std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ {\bfseries boundary\+\_\+} -\begin{DoxyCompactList}\small\item\em object managing boundary for obstacle and surface tension \end{DoxyCompactList}\item -double {\bfseries epsilon\+\_\+} -\begin{DoxyCompactList}\small\item\em tolerance for the solver \end{DoxyCompactList}\item -int {\bfseries maximum\+Number\+Of\+Iterations\+\_\+} -\begin{DoxyCompactList}\small\item\em maximum number of iterations \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\doxysubsection{Detailed Description} -Standard Gauss-\/\+Seidel solver. - -\doxysubsection{Constructor \& Destructor Documentation} -\Hypertarget{classGaussSeidel_af31cc1ace2d616ebb8e0592c06865b9c}\label{classGaussSeidel_af31cc1ace2d616ebb8e0592c06865b9c} -\index{GaussSeidel@{GaussSeidel}!GaussSeidel@{GaussSeidel}} -\index{GaussSeidel@{GaussSeidel}!GaussSeidel@{GaussSeidel}} -\doxysubsubsection{\texorpdfstring{GaussSeidel()}{GaussSeidel()}} -{\footnotesize\ttfamily Gauss\+Seidel\+::\+Gauss\+Seidel (\begin{DoxyParamCaption}\item[{const std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ \&}]{data, }\item[{double}]{epsilon, }\item[{int}]{maximum\+Number\+Of\+Iterations, }\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$}]{boundary }\end{DoxyParamCaption})} - - - -Constructor. - - -\begin{DoxyParams}{Parameters} -{\em data} & instance of \doxylink{classDiscretization}{Discretization} holding the needed field variables for rhs and p \\ -\hline -{\em epsilon} & tolerance for the solver \\ -\hline -{\em maximum\+Number\+Of\+Iterations} & maximum of iteration \\ -\hline -\end{DoxyParams} - - -\doxysubsection{Member Function Documentation} -\Hypertarget{classGaussSeidel_a6f0eb0c6938a64f8ded186f88170a04b}\label{classGaussSeidel_a6f0eb0c6938a64f8ded186f88170a04b} -\index{GaussSeidel@{GaussSeidel}!solve@{solve}} -\index{solve@{solve}!GaussSeidel@{GaussSeidel}} -\doxysubsubsection{\texorpdfstring{solve()}{solve()}} -{\footnotesize\ttfamily void Gauss\+Seidel\+::solve (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} - - - -override function that starts solver. - - - -Implements \mbox{\hyperlink{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0}{Pressure\+Solver}}. - - - -The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/gauss\+\_\+seidel.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/gauss\+\_\+seidel.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classMask.tex b/documentation/latex/classMask.tex deleted file mode 100644 index fd7e65db..00000000 --- a/documentation/latex/classMask.tex +++ /dev/null @@ -1,248 +0,0 @@ -\doxysection{Mask Class Reference} -\hypertarget{classMask}{}\label{classMask}\index{Mask@{Mask}} -\doxysubsubsection*{Public Types} -\begin{DoxyCompactItemize} -\item -\Hypertarget{classMask_ad74a26afe88ebadafebd733837f3252a}\label{classMask_ad74a26afe88ebadafebd733837f3252a} -enum {\bfseries Cell\+Type} \{ \newline -{\bfseries FLUID\+\_\+\+DROPLET} = 0 -, {\bfseries FLUID\+\_\+\+SINGLE\+\_\+\+LEFT} = 1 -, {\bfseries FLUID\+\_\+\+SINGLE\+\_\+\+TOP} = 2 -, {\bfseries FLUID\+\_\+\+SINGLE\+\_\+\+RIGHT} = 4 -, \newline -{\bfseries FLUID\+\_\+\+SINGLE\+\_\+\+BOTTOM} = 8 -, {\bfseries FLUID\+\_\+\+CORNER\+\_\+\+BOTTOM\+\_\+\+LEFT} = 6 -, {\bfseries FLUID\+\_\+\+CORNER\+\_\+\+TOP\+\_\+\+LEFT} = 12 -, {\bfseries FLUID\+\_\+\+CORNER\+\_\+\+TOP\+\_\+\+RIGHT} = 9 -, \newline -{\bfseries FLUID\+\_\+\+CORNER\+\_\+\+BOTTOM\+\_\+\+RIGHT} = 3 -, {\bfseries FLUID\+\_\+\+COLUMN\+\_\+\+HORIZONTAL} = 5 -, {\bfseries FLUID\+\_\+\+COLUMN\+\_\+\+VERTICAL} = 10 -, {\bfseries FLUID\+\_\+\+BORDER\+\_\+\+LEFT} = 14 -, \newline -{\bfseries FLUID\+\_\+\+BORDER\+\_\+\+TOP} = 13 -, {\bfseries FLUID\+\_\+\+BORDER\+\_\+\+RIGHT} = 11 -, {\bfseries FLUID\+\_\+\+BORDER\+\_\+\+BOTTOM} = 7 -, {\bfseries FLUID} = 15 -, \newline -{\bfseries FLUID\+\_\+\+TYPE} = 50 -, {\bfseries AIR} = 64 -, {\bfseries OBSTACLE} = 99 -, {\bfseries OBSTACLE\+\_\+\+INSIDE} = 100 -, \newline -{\bfseries OBSTACLE\+\_\+\+BORDER\+\_\+\+LEFT} = 101 -, {\bfseries OBSTACLE\+\_\+\+BORDER\+\_\+\+TOP} = 102 -, {\bfseries OBSTACLE\+\_\+\+CORNER\+\_\+\+TOP\+\_\+\+LEFT} = 103 -, {\bfseries OBSTACLE\+\_\+\+BORDER\+\_\+\+RIGHT} = 104 -, \newline -{\bfseries OBSTACLE\+\_\+\+CORNER\+\_\+\+TOP\+\_\+\+RIGHT} = 106 -, {\bfseries OBSTACLE\+\_\+\+BORDER\+\_\+\+BOTTOM} = 108 -, {\bfseries OBSTACLE\+\_\+\+CORNER\+\_\+\+BOTTOM\+\_\+\+LEFT} = 109 -, {\bfseries OBSTACLE\+\_\+\+CORNER\+\_\+\+BOTTOM\+\_\+\+RIGHT} = 112 -, \newline -{\bfseries DOMAIN\+\_\+\+BOUNDARY} = 200 -, {\bfseries DOMAIN\+\_\+\+LEFT\+\_\+\+NOSLIP} = 201 -, {\bfseries DOMAIN\+\_\+\+TOP\+\_\+\+NOSLIP} = 202 -, {\bfseries DOMAIN\+\_\+\+RIGHT\+\_\+\+NOSLIP} = 203 -, \newline -{\bfseries DOMAIN\+\_\+\+BOTTOM\+\_\+\+NOSLIP} = 204 -, {\bfseries DOMAIN\+\_\+\+LEFT\+\_\+\+PRESSURE} = 205 -, {\bfseries DOMAIN\+\_\+\+TOP\+\_\+\+PRESSURE} = 206 -, {\bfseries DOMAIN\+\_\+\+RIGHT\+\_\+\+PRESSURE} = 207 -, \newline -{\bfseries DOMAIN\+\_\+\+BOTTOM\+\_\+\+PRESSURE} = 208 - \} -\end{DoxyCompactItemize} -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classMask_a5d65d3a108a79864bc69994f5e56f6c3}{Mask}} (\mbox{\hyperlink{structSettings}{Settings}} settings) -\begin{DoxyCompactList}\small\item\em constructor. \end{DoxyCompactList}\item -int \& \mbox{\hyperlink{classMask_a6d612f1ac2185304b3ad7432d90dcd2b}{operator()}} (int i, int j) -\begin{DoxyCompactList}\small\item\em set array value. Overloads the () operator \end{DoxyCompactList}\item -int \mbox{\hyperlink{classMask_a154acb41f2695c2a6ace82b5ebccbb1c}{operator()}} (int i, int j) const -\begin{DoxyCompactList}\small\item\em get array value. Overloads the () operator \end{DoxyCompactList}\item -\Hypertarget{classMask_aafa0857af35b02ba6070e76f82d51c7b}\label{classMask_aafa0857af35b02ba6070e76f82d51c7b} -std\+::array$<$ int, 2 $>$ {\bfseries size} () const -\begin{DoxyCompactList}\small\item\em get size of array in x and y direction \end{DoxyCompactList}\item -\Hypertarget{classMask_ac30997cdd83faef98290733acb325cf8}\label{classMask_ac30997cdd83faef98290733acb325cf8} -void {\bfseries reset\+Mask} () -\begin{DoxyCompactList}\small\item\em sets all not obstacle cells to air \end{DoxyCompactList}\item -bool \mbox{\hyperlink{classMask_aadacef52f95b796920864b8519d0594b}{is\+Fluid}} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Cell at (i,j) is fluid or not. \end{DoxyCompactList}\item -bool \mbox{\hyperlink{classMask_a53e4e7c0b29234856cbee33386cc5c18}{is\+Obstacle}} (int i, int j) const -\begin{DoxyCompactList}\small\item\em True if Cell at (i,j) is either obstacle or boundary. \end{DoxyCompactList}\item -bool \mbox{\hyperlink{classMask_a7eb34f789ef96c622ab93718d5278d77}{is\+Air}} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Cell at (i,j) is a air cell or not. \end{DoxyCompactList}\item -\Hypertarget{classMask_a5f3d53087eb5a1d9427716804e280751}\label{classMask_a5f3d53087eb5a1d9427716804e280751} -bool {\bfseries is\+Inner\+Fluid} (int i, int j) const -\item -\Hypertarget{classMask_a9f76177c70d7cab7f268c8fd9a102e73}\label{classMask_a9f76177c70d7cab7f268c8fd9a102e73} -bool {\bfseries is\+Domain\+Boundary} (int i, int j) const -\item -\Hypertarget{classMask_ada8b2531a4a16703f145fd6f708f21ff}\label{classMask_ada8b2531a4a16703f145fd6f708f21ff} -bool {\bfseries is\+Obstacle\+Boundary} (int i, int j) const -\item -\Hypertarget{classMask_a2ffcf2b70edede392422ea692e49d313}\label{classMask_a2ffcf2b70edede392422ea692e49d313} -bool {\bfseries is\+Fluid\+Boundary} (int i, int j) const -\item -int \mbox{\hyperlink{classMask_a3471a6026ce7eab118f660557a8abac6}{get\+Number\+Of\+Fluid\+Cells}} () const -\begin{DoxyCompactList}\small\item\em number of fluid cells \end{DoxyCompactList}\item -\Hypertarget{classMask_a75a1750221e41c1b34f80d4d352163ac}\label{classMask_a75a1750221e41c1b34f80d4d352163ac} -void {\bfseries make\+Rectangular\+Obstacle} () -\item -\Hypertarget{classMask_ad69aefd91f740d6758cdedf0df8c8ca6}\label{classMask_ad69aefd91f740d6758cdedf0df8c8ca6} -void {\bfseries create\+Mask\+From\+PNGBit\+Map} () -\item -\Hypertarget{classMask_aacf4d2cfe1362df85ed08fd3b0fc6d6b}\label{classMask_aacf4d2cfe1362df85ed08fd3b0fc6d6b} -void {\bfseries set\+Domain\+BC} () -\item -\Hypertarget{classMask_a644a84aca88442b72b5cd87ee80f1724}\label{classMask_a644a84aca88442b72b5cd87ee80f1724} -void {\bfseries set\+Obstacle\+BC} () -\item -\Hypertarget{classMask_a41bf0aa100e2554eaea3ab29a999c0ee}\label{classMask_a41bf0aa100e2554eaea3ab29a999c0ee} -void {\bfseries set\+Fluid\+BC} () -\item -\Hypertarget{classMask_a372d2a81ff261f126b11fdfcfd2f845e}\label{classMask_a372d2a81ff261f126b11fdfcfd2f845e} -void {\bfseries print\+Mask} () const -\end{DoxyCompactItemize} -\doxysubsubsection*{Protected Attributes} -\begin{DoxyCompactItemize} -\item -\Hypertarget{classMask_a84bff46271e16eb8639c1831403c1bb9}\label{classMask_a84bff46271e16eb8639c1831403c1bb9} -std\+::array$<$ int, 2 $>$ {\bfseries size\+\_\+} -\begin{DoxyCompactList}\small\item\em size of array in x and y direction \end{DoxyCompactList}\item -\Hypertarget{classMask_acdb73aee935b502fecc8de6bf1e32a09}\label{classMask_acdb73aee935b502fecc8de6bf1e32a09} -std\+::vector$<$ int $>$ {\bfseries data\+\_\+} -\begin{DoxyCompactList}\small\item\em storage array values, in row-\/major order \end{DoxyCompactList}\item -\Hypertarget{classMask_a3c5a51f6d03bb4a5e1742537a22ec441}\label{classMask_a3c5a51f6d03bb4a5e1742537a22ec441} -std\+::vector$<$ int $>$ {\bfseries boundary\+\_\+list} -\begin{DoxyCompactList}\small\item\em stores the indices of the boundary cells \end{DoxyCompactList}\item -\Hypertarget{classMask_acb8b165d56689722fd836569e066fdd4}\label{classMask_acb8b165d56689722fd836569e066fdd4} -\mbox{\hyperlink{structSettings}{Settings}} {\bfseries settings\+\_\+} -\item -\Hypertarget{classMask_abe4f6f251b0517f01d0f58f9042d3af4}\label{classMask_abe4f6f251b0517f01d0f58f9042d3af4} -int {\bfseries forbidden\+Obstacle\+Fluid\+Combinations} \mbox{[}7\mbox{]} = \{105,107,110,111,113,114,115\} -\end{DoxyCompactItemize} - - -\doxysubsection{Constructor \& Destructor Documentation} -\Hypertarget{classMask_a5d65d3a108a79864bc69994f5e56f6c3}\label{classMask_a5d65d3a108a79864bc69994f5e56f6c3} -\index{Mask@{Mask}!Mask@{Mask}} -\index{Mask@{Mask}!Mask@{Mask}} -\doxysubsubsection{\texorpdfstring{Mask()}{Mask()}} -{\footnotesize\ttfamily Mask\+::\+Mask (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{structSettings}{Settings}}}]{settings }\end{DoxyParamCaption})} - - - -constructor. - - -\begin{DoxyParams}{Parameters} -{\em size} & size of array in x and y direction \\ -\hline -\end{DoxyParams} - - -\doxysubsection{Member Function Documentation} -\Hypertarget{classMask_a3471a6026ce7eab118f660557a8abac6}\label{classMask_a3471a6026ce7eab118f660557a8abac6} -\index{Mask@{Mask}!getNumberOfFluidCells@{getNumberOfFluidCells}} -\index{getNumberOfFluidCells@{getNumberOfFluidCells}!Mask@{Mask}} -\doxysubsubsection{\texorpdfstring{getNumberOfFluidCells()}{getNumberOfFluidCells()}} -{\footnotesize\ttfamily int Mask\+::get\+Number\+Of\+Fluid\+Cells (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const} - - - -number of fluid cells - -not efficient but is only used once in the creation of the fluid tracer \Hypertarget{classMask_a7eb34f789ef96c622ab93718d5278d77}\label{classMask_a7eb34f789ef96c622ab93718d5278d77} -\index{Mask@{Mask}!isAir@{isAir}} -\index{isAir@{isAir}!Mask@{Mask}} -\doxysubsubsection{\texorpdfstring{isAir()}{isAir()}} -{\footnotesize\ttfamily bool Mask\+::is\+Air (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} - - - -Cell at (i,j) is a air cell or not. - - -\begin{DoxyParams}{Parameters} -{\em i} & index in x direction \\ -\hline -{\em j} & index in y direction\\ -\hline -\end{DoxyParams} -If i and j are out of bond returns false \Hypertarget{classMask_aadacef52f95b796920864b8519d0594b}\label{classMask_aadacef52f95b796920864b8519d0594b} -\index{Mask@{Mask}!isFluid@{isFluid}} -\index{isFluid@{isFluid}!Mask@{Mask}} -\doxysubsubsection{\texorpdfstring{isFluid()}{isFluid()}} -{\footnotesize\ttfamily bool Mask\+::is\+Fluid (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} - - - -Cell at (i,j) is fluid or not. - - -\begin{DoxyParams}{Parameters} -{\em i} & index in x direction \\ -\hline -{\em j} & index in y direction\\ -\hline -\end{DoxyParams} -If i and j are out of bond returns false \Hypertarget{classMask_a53e4e7c0b29234856cbee33386cc5c18}\label{classMask_a53e4e7c0b29234856cbee33386cc5c18} -\index{Mask@{Mask}!isObstacle@{isObstacle}} -\index{isObstacle@{isObstacle}!Mask@{Mask}} -\doxysubsubsection{\texorpdfstring{isObstacle()}{isObstacle()}} -{\footnotesize\ttfamily bool Mask\+::is\+Obstacle (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} - - - -True if Cell at (i,j) is either obstacle or boundary. - - -\begin{DoxyParams}{Parameters} -{\em i} & index in x direction \\ -\hline -{\em j} & index in y direction \\ -\hline -\end{DoxyParams} -\Hypertarget{classMask_a6d612f1ac2185304b3ad7432d90dcd2b}\label{classMask_a6d612f1ac2185304b3ad7432d90dcd2b} -\index{Mask@{Mask}!operator()@{operator()}} -\index{operator()@{operator()}!Mask@{Mask}} -\doxysubsubsection{\texorpdfstring{operator()()}{operator()()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} -{\footnotesize\ttfamily int \& Mask\+::operator() (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption})} - - - -set array value. Overloads the () operator - - -\begin{DoxyParams}{Parameters} -{\em i} & index in x direction \\ -\hline -{\em j} & index in y direction \\ -\hline -\end{DoxyParams} -\Hypertarget{classMask_a154acb41f2695c2a6ace82b5ebccbb1c}\label{classMask_a154acb41f2695c2a6ace82b5ebccbb1c} -\index{Mask@{Mask}!operator()@{operator()}} -\index{operator()@{operator()}!Mask@{Mask}} -\doxysubsubsection{\texorpdfstring{operator()()}{operator()()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} -{\footnotesize\ttfamily int Mask\+::operator() (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} - - - -get array value. Overloads the () operator - - -\begin{DoxyParams}{Parameters} -{\em i} & index in x direction \\ -\hline -{\em j} & index in y direction \\ -\hline -\end{DoxyParams} - - -The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/boundary/mask.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/boundary/mask.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classOutputWriter.eps b/documentation/latex/classOutputWriter.eps deleted file mode 100644 index b542206f..00000000 --- a/documentation/latex/classOutputWriter.eps +++ /dev/null @@ -1,203 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: ClassName -%%Creator: Doxygen -%%CreationDate: Time -%%For: -%Magnification: 1.00 -%%Orientation: Portrait -%%BoundingBox: 0 0 500 138.888885 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%EndComments - -% ----- variables ----- - -/boxwidth 0 def -/boxheight 40 def -/fontheight 24 def -/marginwidth 10 def -/distx 20 def -/disty 40 def -/boundaspect 3.600000 def % aspect ratio of the BoundingBox (width/height) -/boundx 500 def -/boundy boundx boundaspect div def -/xspacing 0 def -/yspacing 0 def -/rows 2 def -/cols 2 def -/scalefactor 0 def -/boxfont /Times-Roman findfont fontheight scalefont def - -% ----- procedures ----- - -/dotted { [1 4] 0 setdash } def -/dashed { [5] 0 setdash } def -/solid { [] 0 setdash } def - -/max % result = MAX(arg1,arg2) -{ - /a exch def - /b exch def - a b gt {a} {b} ifelse -} def - -/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) -{ - 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max -} def - -/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) -{ - /str exch def - /boxwidth boxwidth str stringwidth pop max def -} def - -/box % draws a box with text 'arg1' at grid pos (arg2,arg3) -{ gsave - 2 setlinewidth - newpath - exch xspacing mul xoffset add - exch yspacing mul - moveto - boxwidth 0 rlineto - 0 boxheight rlineto - boxwidth neg 0 rlineto - 0 boxheight neg rlineto - closepath - dup stringwidth pop neg boxwidth add 2 div - boxheight fontheight 2 div sub 2 div - rmoveto show stroke - grestore -} def - -/mark -{ newpath - exch xspacing mul xoffset add boxwidth add - exch yspacing mul - moveto - 0 boxheight 4 div rlineto - boxheight neg 4 div boxheight neg 4 div rlineto - closepath - eofill - stroke -} def - -/arrow -{ newpath - moveto - 3 -8 rlineto - -6 0 rlineto - 3 8 rlineto - closepath - eofill - stroke -} def - -/out % draws an output connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight add - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/in % draws an input connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul disty 2 div sub - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/hedge -{ - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight 2 div sub - /y exch def - /x exch def - newpath - x y moveto - boxwidth 2 div distx add 0 rlineto - stroke - 1 eq - { newpath x boxwidth 2 div distx add add y moveto - -8 3 rlineto - 0 -6 rlineto - 8 3 rlineto - closepath - eofill - stroke - } if -} def - -/vedge -{ - /ye exch def - /ys exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add dup - ys yspacing mul boxheight 2 div sub - moveto - ye yspacing mul boxheight 2 div sub - lineto - stroke -} def - -/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' -{ - /ys exch def - /xe exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add - ys yspacing mul disty 2 div sub - moveto - xspacing xe xs sub mul 0 - rlineto - stroke -} def - -% ----- main ------ - -boxfont setfont -1 boundaspect scale -(OutputWriter) cw -(OutputWriterParaview) cw -(OutputWriterText) cw -/boxwidth boxwidth marginwidth 2 mul add def -/xspacing boxwidth distx add def -/yspacing boxheight disty add def -/scalefactor - boxwidth cols mul distx cols 1 sub mul add - boxheight rows mul disty rows 1 sub mul add boundaspect mul - max def -boundx scalefactor div boundy scalefactor div scale - -% ----- classes ----- - - (OutputWriter) 0.500000 1.000000 box - (OutputWriterParaview) 0.000000 0.000000 box - (OutputWriterText) 1.000000 0.000000 box - -% ----- relations ----- - -solid -1 0.500000 0.250000 out -solid -0.000000 1.000000 1.000000 conn -solid -0 0.000000 0.750000 in -solid -0 1.000000 0.750000 in diff --git a/documentation/latex/classOutputWriter.pdf b/documentation/latex/classOutputWriter.pdf deleted file mode 100644 index 763b8b367d4b3d60d4636492694b4f4b21502aec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5206 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 - -Inheritance diagram for Output\+Writer\+:\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[height=2.000000cm]{classOutputWriter} -\end{center} -\end{figure} -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}{Output\+Writer}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item -virtual void \mbox{\hyperlink{classOutputWriter_ac625c204affdc05919388a3549c2e945}{write\+File}} (double current\+Time)=0 -\begin{DoxyCompactList}\small\item\em Write current velocities to file. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsubsection*{Protected Attributes} -\begin{DoxyCompactItemize} -\item -\Hypertarget{classOutputWriter_a0587b2dc160a9b1393411433dfc23b68}\label{classOutputWriter_a0587b2dc160a9b1393411433dfc23b68} -std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} -\begin{DoxyCompactList}\small\item\em shared pointer, discretization object containing data to be written to file \end{DoxyCompactList}\item -\Hypertarget{classOutputWriter_a69d167e2526407602dce26ca7a2b9248}\label{classOutputWriter_a69d167e2526407602dce26ca7a2b9248} -int {\bfseries file\+No\+\_\+} -\begin{DoxyCompactList}\small\item\em a counter that increments for every file written to disk \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\doxysubsection{Detailed Description} -Inteface class for writing simulation data output. - -\doxysubsection{Constructor \& Destructor Documentation} -\Hypertarget{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}\label{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7} -\index{OutputWriter@{OutputWriter}!OutputWriter@{OutputWriter}} -\index{OutputWriter@{OutputWriter}!OutputWriter@{OutputWriter}} -\doxysubsubsection{\texorpdfstring{OutputWriter()}{OutputWriter()}} -{\footnotesize\ttfamily Output\+Writer\+::\+Output\+Writer (\begin{DoxyParamCaption}\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$}]{discretization }\end{DoxyParamCaption})} - - - -Constructor. - - -\begin{DoxyParams}{Parameters} -{\em discretization} & discretization object containing data to be written to file \\ -\hline -\end{DoxyParams} - - -\doxysubsection{Member Function Documentation} -\Hypertarget{classOutputWriter_ac625c204affdc05919388a3549c2e945}\label{classOutputWriter_ac625c204affdc05919388a3549c2e945} -\index{OutputWriter@{OutputWriter}!writeFile@{writeFile}} -\index{writeFile@{writeFile}!OutputWriter@{OutputWriter}} -\doxysubsubsection{\texorpdfstring{writeFile()}{writeFile()}} -{\footnotesize\ttfamily virtual void Output\+Writer\+::write\+File (\begin{DoxyParamCaption}\item[{double}]{current\+Time }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}} - - - -Write current velocities to file. - -Filename is output\+\_\+$<$file\+No\+\_\+$>$.\+vti - - -\begin{DoxyParams}{Parameters} -{\em current\+Time} & current time of simulation \\ -\hline -\end{DoxyParams} - - -Implemented in \mbox{\hyperlink{classOutputWriterParaview_a9e203b63d0e2f26ad53d18ee1821c6bb}{Output\+Writer\+Paraview}}, and \mbox{\hyperlink{classOutputWriterText_a25a12ea2524fc34e9acb19ef1f4c7431}{Output\+Writer\+Text}}. - - - -The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classOutputWriterParaview.eps b/documentation/latex/classOutputWriterParaview.eps deleted file mode 100644 index f7ed431b..00000000 --- a/documentation/latex/classOutputWriterParaview.eps +++ /dev/null @@ -1,197 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: ClassName -%%Creator: Doxygen -%%CreationDate: Time -%%For: -%Magnification: 1.00 -%%Orientation: Portrait -%%BoundingBox: 0 0 500 277.777771 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%EndComments - -% ----- variables ----- - -/boxwidth 0 def -/boxheight 40 def -/fontheight 24 def -/marginwidth 10 def -/distx 20 def -/disty 40 def -/boundaspect 1.800000 def % aspect ratio of the BoundingBox (width/height) -/boundx 500 def -/boundy boundx boundaspect div def -/xspacing 0 def -/yspacing 0 def -/rows 2 def -/cols 1 def -/scalefactor 0 def -/boxfont /Times-Roman findfont fontheight scalefont def - -% ----- procedures ----- - -/dotted { [1 4] 0 setdash } def -/dashed { [5] 0 setdash } def -/solid { [] 0 setdash } def - -/max % result = MAX(arg1,arg2) -{ - /a exch def - /b exch def - a b gt {a} {b} ifelse -} def - -/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) -{ - 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max -} def - -/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) -{ - /str exch def - /boxwidth boxwidth str stringwidth pop max def -} def - -/box % draws a box with text 'arg1' at grid pos (arg2,arg3) -{ gsave - 2 setlinewidth - newpath - exch xspacing mul xoffset add - exch yspacing mul - moveto - boxwidth 0 rlineto - 0 boxheight rlineto - boxwidth neg 0 rlineto - 0 boxheight neg rlineto - closepath - dup stringwidth pop neg boxwidth add 2 div - boxheight fontheight 2 div sub 2 div - rmoveto show stroke - grestore -} def - -/mark -{ newpath - exch xspacing mul xoffset add boxwidth add - exch yspacing mul - moveto - 0 boxheight 4 div rlineto - boxheight neg 4 div boxheight neg 4 div rlineto - closepath - eofill - stroke -} def - -/arrow -{ newpath - moveto - 3 -8 rlineto - -6 0 rlineto - 3 8 rlineto - closepath - eofill - stroke -} def - -/out % draws an output connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight add - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/in % draws an input connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul disty 2 div sub - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/hedge -{ - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight 2 div sub - /y exch def - /x exch def - newpath - x y moveto - boxwidth 2 div distx add 0 rlineto - stroke - 1 eq - { newpath x boxwidth 2 div distx add add y moveto - -8 3 rlineto - 0 -6 rlineto - 8 3 rlineto - closepath - eofill - stroke - } if -} def - -/vedge -{ - /ye exch def - /ys exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add dup - ys yspacing mul boxheight 2 div sub - moveto - ye yspacing mul boxheight 2 div sub - lineto - stroke -} def - -/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' -{ - /ys exch def - /xe exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add - ys yspacing mul disty 2 div sub - moveto - xspacing xe xs sub mul 0 - rlineto - stroke -} def - -% ----- main ------ - -boxfont setfont -1 boundaspect scale -(OutputWriterParaview) cw -(OutputWriter) cw -/boxwidth boxwidth marginwidth 2 mul add def -/xspacing boxwidth distx add def -/yspacing boxheight disty add def -/scalefactor - boxwidth cols mul distx cols 1 sub mul add - boxheight rows mul disty rows 1 sub mul add boundaspect mul - max def -boundx scalefactor div boundy scalefactor div scale - -% ----- classes ----- - - (OutputWriterParaview) 0.000000 0.000000 box - (OutputWriter) 0.000000 1.000000 box - -% ----- relations ----- - -solid -0 0.000000 0.000000 out -solid -1 0.000000 1.000000 in diff --git a/documentation/latex/classOutputWriterParaview.pdf b/documentation/latex/classOutputWriterParaview.pdf deleted file mode 100644 index c931c49e80453687d59e1460a92dda7e97ea4b04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4909 zcmb_Ad0Z3M*0nCrMsY1JSYbdkC?u0iNCJ^Wfduf$W)hZ)XhSlAlq3@~6A4NIEiH=+ z)D>ls0xD{25k)DAxE8S@>O&Bfg48MsE+`f&6yBY%+V=a}Ki*98n|sea`#JZ{IWyN^ z=s{!B*_62zZK=7GxpS9j*I;rPp~AF0C>)1qt09^~;_4w1gQu^bziWU*1V(PIQg<)# zbjLJ0fE=b$tB7cCbPcNJ17;8n7m5OxxQqBYg)&O7B2WPFGY~oh;h|Ea{6&Bg$d!ns z(j~s0k~y$WkAfc##3_7aMu{N|M+tv9!DliU0Ms}4z_bL;C-eruOd-;Qp$b>E`W>LF zfxyHVAtO+KSvZQ%fqgM8K&G%E284xuN^x<4y-{sA5dm=kL<|F62viTj9%?`$MCF(Q z6$mIep+{vJiZOGC|Bt>Snd47)*~g5UFz?#kAlr*yRd_V72+*8N@*;}&mHQQ?7TNpS z{VO%=Xn5Py1!2u!FauXmjAEPB9{%HI{%p2? zJh%E$PwTz%sEXLSGIeQH=jy2MeXL%jH<>$ZE11zPKAxR3p|WZFp(cFP4PkTB($XJx zT;E`pd)ZvZl#XUO_TpF7OUt2+)DOBV+Ha|>yP7IX>hEXz3W^VJyV|5lj#JUnTO33o zml9Hf4GS}`-qDYEI<55~6Mg#rWB<|&gRH0A7pwi^?Q^y$wN09zGfosTHR)+lQTC1V zJx9KIJ91Bj#vauw`uzY#r0+97x~P|4gdBNV~_%WM!o zgv+IKokA&KU5{!Bh(-FI0*g@`Gw9_g4x-|($K(=}2!TOTK(G`w5&)eHE#z!M22p|C z!4#0=5E)G|1%Ue1Ao=x07mxxyAd@0E1TR%7a43XAswt*~LV$w-aAXc6We$?|Q@YCt znHmcpV9~Ft4@$@sUh))qm`mZ3t3!&B)BZ&_8IF?nz{{73#mj^2r78`I z)5MrYrZw3qL~*%Zr6Vvs?QUD4PM5gmXRpAj}%H>dCQV6+5l2YI$Ag(I8t2SJXLJSHlAy7>q z#AG>BU>_BZ1A9!qgb+4Z4DM&+$N>}5@gOzrU_aO&4uWMc3aelptcMBM0Iz|g=9^3) zPc;_ABpo*_0Zj9L!c1eAK(iY>VdJ z!(B|@cw4iPQvzcXGy(O2rR(P*HHU7M9<+~Z*tL@P)I8u$PxiA#o!K}cc$B@aJkd5G za_m;yOScvj7v&X*4-4{tdvdm$f~=E8hKKd73(9F9I0rM#slTQdP2SiFZ7!?HUR4+8 z^4YTox6@;^^aI;1!r+QyU)z5blO2|fuWPpLoUjTGOcy;qXE(CpY~j`Sj*U)4{qo}Z z$c*)i1sC1U9JA!5v{u!OZVgW}SLl+nJtf+_d}3?G2ok5y#3d9J-tQx@d}`<>U9_zl!ntGG_W`F8P9R62LO-dCjU^D~&JT{zd9Sb5&*7F-t7d^9Ak5Cr1KSK2jV!J@Hu{Ev^BI-fQ3M ze@FfpPhZcuZS#sE^*om=Kc9&xLp<%{>1z)jy~?<=+ElYv9y*bI1bwAWt@!9-> z*|paMWumCusV!?XN?)e%d+oLA94h^KV}Nm%>SofFt@qYQ7w}6?2E5`)-C7eK?os`) zQ;FS(_?T$!yqX~R_S%`<1)qAn&Qc5%_UD$(QFLH6c#KMEGUoPWJwghoiI z>E7|s^|hI({^`~>PR`wgafP2;IrCZZ>O*5+EH7wTc>UwL@1Eb7HU8<-s{PB2Q}@U< zlGo!r%g5NpC;r@ACAbWgK5vmh@rfiUz0*x4Hg&?e5qP z$}cfL)t1+JMCGyaYAjFAZ9eUuS69$^TXLPN*b#)c~#YO3;2DD zy;Ht^`TI@gUTnPiy-)8PFU}ny37xjJ? zR{t5hY^3GsJYI$OZ=tfN+vW+~HF877{9pIQK791~@dub!$#REVGsiFYx#=X>?d|J5 zW2=Se8Mo`(_FIP4Tdmqd_LUqBAudfmwqZhP8_#3o-ixa)7mokEVcM*YWA4BG{y~>r z0%YJBZ;4Wyja)<3%(m(_!K)45Oxk-X!|5oEqocT;o@8?&=*u^gPGpoeC+*q4(Z4Eh zlf#1Mio4q5tv8-!7PO2=c{{}`ey7KD_x1artjJ_tv1`poldHO$dhX0j4UWOQPH%yF zMhb3OXvuQu-IC2ztqgzn4%9J2Z=PTu@4?p&!eR}+c3c)2buxJ*NdQ`I3S1Ml{DR)*-7YQgXi)5fyL}^Buj;1u#);I*-!h9Qd zvA2f}iD2XzH98F_ry!$7t;KmpKGj6R17i{lQy~)y5y__p`}jiyhN&Y}1ccC?=}a1v zqzqC%PQdz^Y)FNoT+Vf(9xV&>cafU|ASuAow;m z{aiq|^Ve*^0^q{}=7A9pl)DOp9M$uwp8npDX9R{5edQnIOlPy{3@Y4j*WZW(zWi%( zAOQVpy8s-X52)Cb(L&JV2oMJ1NMj&0hNBc=@DOJngKN)V@)!&k_z##MSb)?W^g^IF z`Uj-LFo%(1dMOB@K!_Qm!%=OY5EEwqf(uN#ahRR|&~lm1$LIgIU85nBiNxaxF}Xnl zYQZH!KGk4QDR?Z7lah-v6*Og77=y-SDxGNzaM8F3iYT1eOoalK{nH>QdRimUx9K?YM6j8`|N=&bj5g_4pI#7z5I&2tZ16AMx76}!hMg^v1c2yI71GS1w zE1p`W4d+vhGzF@Z8Po(-;I5Y8I9W9JIZv$;^bJge@DMXFl9S=X^nLs!=;{H+{S#Q5j>qu8;HtaPyrg)Xn%ttCF5*27{LM7nBJ~`ivS4tj1d6< z^96$b4%ethm7sZJA`~)9`!0yXX0zCk5*mPUIiN8nFGxE8b7VRG3C7?uK%@9B9)ryV zjqM*`2m)HSKfu^*;I%)%oYHSR#Z%T!dUlCx*zG<0y1xxN^8$CkBFu noLO#cH^j}A!)6Ko9wU_eLVy!8Jz;XZBb&(q-^E0J9+dwAr5`I^ diff --git a/documentation/latex/classOutputWriterParaview.tex b/documentation/latex/classOutputWriterParaview.tex deleted file mode 100644 index d23f68aa..00000000 --- a/documentation/latex/classOutputWriterParaview.tex +++ /dev/null @@ -1,88 +0,0 @@ -\doxysection{Output\+Writer\+Paraview Class Reference} -\hypertarget{classOutputWriterParaview}{}\label{classOutputWriterParaview}\index{OutputWriterParaview@{OutputWriterParaview}} - - -Write \texorpdfstring{$\ast$}{*}.vti files that can be viewed with Para\+View. - - - - -{\ttfamily \#include $<$output\+\_\+writer\+\_\+paraview.\+h$>$} - -Inheritance diagram for Output\+Writer\+Paraview\+:\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[height=2.000000cm]{classOutputWriterParaview} -\end{center} -\end{figure} -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classOutputWriterParaview_a7a599c2694986563c801806234eb07d7}{Output\+Writer\+Paraview}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$ mask) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item -void \mbox{\hyperlink{classOutputWriterParaview_a9e203b63d0e2f26ad53d18ee1821c6bb}{write\+File}} (double current\+Time) -\begin{DoxyCompactList}\small\item\em Write current velocities to file, filename is output\+\_\+$<$count$>$.\+vti. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classOutputWriter}{Output\+Writer}}} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}{Output\+Writer}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsubsection*{Additional Inherited Members} -\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classOutputWriter}{Output\+Writer}}} -\begin{DoxyCompactItemize} -\item -std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} -\begin{DoxyCompactList}\small\item\em shared pointer, discretization object containing data to be written to file \end{DoxyCompactList}\item -int {\bfseries file\+No\+\_\+} -\begin{DoxyCompactList}\small\item\em a counter that increments for every file written to disk \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\doxysubsection{Detailed Description} -Write \texorpdfstring{$\ast$}{*}.vti files that can be viewed with Para\+View. - -The mesh that can be visualized in Para\+View corresponds to the mesh of the computational domain. All values are given for the nodes of the mesh, i.\+e., the corners of each cell. This means, values will be interpolated because the values are stored at positions given by the staggered grid. - -\doxysubsection{Constructor \& Destructor Documentation} -\Hypertarget{classOutputWriterParaview_a7a599c2694986563c801806234eb07d7}\label{classOutputWriterParaview_a7a599c2694986563c801806234eb07d7} -\index{OutputWriterParaview@{OutputWriterParaview}!OutputWriterParaview@{OutputWriterParaview}} -\index{OutputWriterParaview@{OutputWriterParaview}!OutputWriterParaview@{OutputWriterParaview}} -\doxysubsubsection{\texorpdfstring{OutputWriterParaview()}{OutputWriterParaview()}} -{\footnotesize\ttfamily Output\+Writer\+Paraview\+::\+Output\+Writer\+Paraview (\begin{DoxyParamCaption}\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$}]{discretization, }\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$}]{mask }\end{DoxyParamCaption})} - - - -Constructor. - - -\begin{DoxyParams}{Parameters} -{\em discretization} & shared pointer to the discretization object that will contain all the data to be written to the file \\ -\hline -\end{DoxyParams} - - -\doxysubsection{Member Function Documentation} -\Hypertarget{classOutputWriterParaview_a9e203b63d0e2f26ad53d18ee1821c6bb}\label{classOutputWriterParaview_a9e203b63d0e2f26ad53d18ee1821c6bb} -\index{OutputWriterParaview@{OutputWriterParaview}!writeFile@{writeFile}} -\index{writeFile@{writeFile}!OutputWriterParaview@{OutputWriterParaview}} -\doxysubsubsection{\texorpdfstring{writeFile()}{writeFile()}} -{\footnotesize\ttfamily void Output\+Writer\+Paraview\+::write\+File (\begin{DoxyParamCaption}\item[{double}]{current\+Time }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}} - - - -Write current velocities to file, filename is output\+\_\+$<$count$>$.\+vti. - - -\begin{DoxyParams}{Parameters} -{\em current\+Time} & current time in simulation \\ -\hline -\end{DoxyParams} - - -Implements \mbox{\hyperlink{classOutputWriter_ac625c204affdc05919388a3549c2e945}{Output\+Writer}}. - - - -The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer\+\_\+paraview.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer\+\_\+paraview.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classOutputWriterText.eps b/documentation/latex/classOutputWriterText.eps deleted file mode 100644 index 3d9f5696..00000000 --- a/documentation/latex/classOutputWriterText.eps +++ /dev/null @@ -1,197 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: ClassName -%%Creator: Doxygen -%%CreationDate: Time -%%For: -%Magnification: 1.00 -%%Orientation: Portrait -%%BoundingBox: 0 0 500 350.877197 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%EndComments - -% ----- variables ----- - -/boxwidth 0 def -/boxheight 40 def -/fontheight 24 def -/marginwidth 10 def -/distx 20 def -/disty 40 def -/boundaspect 1.425000 def % aspect ratio of the BoundingBox (width/height) -/boundx 500 def -/boundy boundx boundaspect div def -/xspacing 0 def -/yspacing 0 def -/rows 2 def -/cols 1 def -/scalefactor 0 def -/boxfont /Times-Roman findfont fontheight scalefont def - -% ----- procedures ----- - -/dotted { [1 4] 0 setdash } def -/dashed { [5] 0 setdash } def -/solid { [] 0 setdash } def - -/max % result = MAX(arg1,arg2) -{ - /a exch def - /b exch def - a b gt {a} {b} ifelse -} def - -/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) -{ - 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max -} def - -/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) -{ - /str exch def - /boxwidth boxwidth str stringwidth pop max def -} def - -/box % draws a box with text 'arg1' at grid pos (arg2,arg3) -{ gsave - 2 setlinewidth - newpath - exch xspacing mul xoffset add - exch yspacing mul - moveto - boxwidth 0 rlineto - 0 boxheight rlineto - boxwidth neg 0 rlineto - 0 boxheight neg rlineto - closepath - dup stringwidth pop neg boxwidth add 2 div - boxheight fontheight 2 div sub 2 div - rmoveto show stroke - grestore -} def - -/mark -{ newpath - exch xspacing mul xoffset add boxwidth add - exch yspacing mul - moveto - 0 boxheight 4 div rlineto - boxheight neg 4 div boxheight neg 4 div rlineto - closepath - eofill - stroke -} def - -/arrow -{ newpath - moveto - 3 -8 rlineto - -6 0 rlineto - 3 8 rlineto - closepath - eofill - stroke -} def - -/out % draws an output connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight add - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/in % draws an input connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul disty 2 div sub - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/hedge -{ - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight 2 div sub - /y exch def - /x exch def - newpath - x y moveto - boxwidth 2 div distx add 0 rlineto - stroke - 1 eq - { newpath x boxwidth 2 div distx add add y moveto - -8 3 rlineto - 0 -6 rlineto - 8 3 rlineto - closepath - eofill - stroke - } if -} def - -/vedge -{ - /ye exch def - /ys exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add dup - ys yspacing mul boxheight 2 div sub - moveto - ye yspacing mul boxheight 2 div sub - lineto - stroke -} def - -/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' -{ - /ys exch def - /xe exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add - ys yspacing mul disty 2 div sub - moveto - xspacing xe xs sub mul 0 - rlineto - stroke -} def - -% ----- main ------ - -boxfont setfont -1 boundaspect scale -(OutputWriterText) cw -(OutputWriter) cw -/boxwidth boxwidth marginwidth 2 mul add def -/xspacing boxwidth distx add def -/yspacing boxheight disty add def -/scalefactor - boxwidth cols mul distx cols 1 sub mul add - boxheight rows mul disty rows 1 sub mul add boundaspect mul - max def -boundx scalefactor div boundy scalefactor div scale - -% ----- classes ----- - - (OutputWriterText) 0.000000 0.000000 box - (OutputWriter) 0.000000 1.000000 box - -% ----- relations ----- - -solid -0 0.000000 0.000000 out -solid -1 0.000000 1.000000 in diff --git a/documentation/latex/classOutputWriterText.pdf b/documentation/latex/classOutputWriterText.pdf deleted file mode 100644 index c1590e04fc57066ea49a1215b3468def2b8f4aeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4610 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 diff --git a/documentation/latex/classOutputWriterText.tex b/documentation/latex/classOutputWriterText.tex deleted file mode 100644 index 7df94ff3..00000000 --- a/documentation/latex/classOutputWriterText.tex +++ /dev/null @@ -1,85 +0,0 @@ -\doxysection{Output\+Writer\+Text Class Reference} -\hypertarget{classOutputWriterText}{}\label{classOutputWriterText}\index{OutputWriterText@{OutputWriterText}} - - -Write \texorpdfstring{$\ast$}{*}.txt files that are useful for debugging. - - - - -{\ttfamily \#include $<$output\+\_\+writer\+\_\+text.\+h$>$} - -Inheritance diagram for Output\+Writer\+Text\+:\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[height=2.000000cm]{classOutputWriterText} -\end{center} -\end{figure} -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -void \mbox{\hyperlink{classOutputWriterText_a25a12ea2524fc34e9acb19ef1f4c7431}{write\+File}} (double current\+Time) -\begin{DoxyCompactList}\small\item\em Write current velocities to file. \end{DoxyCompactList}\item -void \mbox{\hyperlink{classOutputWriterText_a3480b58a23fd158f16d0ef9c1b67cbfd}{write\+Pressure\+File}} () -\begin{DoxyCompactList}\small\item\em Write only current values of pressure to file. \end{DoxyCompactList}\item -\Hypertarget{classOutputWriterText_a4f3180552b8102c27e087357b9cdd1f7}\label{classOutputWriterText_a4f3180552b8102c27e087357b9cdd1f7} -{\bfseries Output\+Writer} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization) -\begin{DoxyCompactList}\small\item\em Default constructor. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classOutputWriter}{Output\+Writer}}} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}{Output\+Writer}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsubsection*{Additional Inherited Members} -\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classOutputWriter}{Output\+Writer}}} -\begin{DoxyCompactItemize} -\item -std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} -\begin{DoxyCompactList}\small\item\em shared pointer, discretization object containing data to be written to file \end{DoxyCompactList}\item -int {\bfseries file\+No\+\_\+} -\begin{DoxyCompactList}\small\item\em a counter that increments for every file written to disk \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\doxysubsection{Detailed Description} -Write \texorpdfstring{$\ast$}{*}.txt files that are useful for debugging. - -All values are written to the file as they are stored in the field variables, no interpolation takes place. - -\doxysubsection{Member Function Documentation} -\Hypertarget{classOutputWriterText_a25a12ea2524fc34e9acb19ef1f4c7431}\label{classOutputWriterText_a25a12ea2524fc34e9acb19ef1f4c7431} -\index{OutputWriterText@{OutputWriterText}!writeFile@{writeFile}} -\index{writeFile@{writeFile}!OutputWriterText@{OutputWriterText}} -\doxysubsubsection{\texorpdfstring{writeFile()}{writeFile()}} -{\footnotesize\ttfamily void Output\+Writer\+Text\+::write\+File (\begin{DoxyParamCaption}\item[{double}]{current\+Time }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}} - - - -Write current velocities to file. - -Filename is output\+\_\+$<$count$>$.\+vti - - -\begin{DoxyParams}{Parameters} -{\em current\+Time} & current time of simulation \\ -\hline -\end{DoxyParams} - - -Implements \mbox{\hyperlink{classOutputWriter_ac625c204affdc05919388a3549c2e945}{Output\+Writer}}. - -\Hypertarget{classOutputWriterText_a3480b58a23fd158f16d0ef9c1b67cbfd}\label{classOutputWriterText_a3480b58a23fd158f16d0ef9c1b67cbfd} -\index{OutputWriterText@{OutputWriterText}!writePressureFile@{writePressureFile}} -\index{writePressureFile@{writePressureFile}!OutputWriterText@{OutputWriterText}} -\doxysubsubsection{\texorpdfstring{writePressureFile()}{writePressureFile()}} -{\footnotesize\ttfamily void Output\+Writer\+Text\+::write\+Pressure\+File (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} - - - -Write only current values of pressure to file. - -Filename is pressure\+\_\+$<$count$>$.\+txt - -The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer\+\_\+text.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer\+\_\+text.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classPressureSolver.eps b/documentation/latex/classPressureSolver.eps deleted file mode 100644 index d140d710..00000000 --- a/documentation/latex/classPressureSolver.eps +++ /dev/null @@ -1,203 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: ClassName -%%Creator: Doxygen -%%CreationDate: Time -%%For: -%Magnification: 1.00 -%%Orientation: Portrait -%%BoundingBox: 0 0 500 185.185181 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%EndComments - -% ----- variables ----- - -/boxwidth 0 def -/boxheight 40 def -/fontheight 24 def -/marginwidth 10 def -/distx 20 def -/disty 40 def -/boundaspect 2.700000 def % aspect ratio of the BoundingBox (width/height) -/boundx 500 def -/boundy boundx boundaspect div def -/xspacing 0 def -/yspacing 0 def -/rows 2 def -/cols 2 def -/scalefactor 0 def -/boxfont /Times-Roman findfont fontheight scalefont def - -% ----- procedures ----- - -/dotted { [1 4] 0 setdash } def -/dashed { [5] 0 setdash } def -/solid { [] 0 setdash } def - -/max % result = MAX(arg1,arg2) -{ - /a exch def - /b exch def - a b gt {a} {b} ifelse -} def - -/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) -{ - 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max -} def - -/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) -{ - /str exch def - /boxwidth boxwidth str stringwidth pop max def -} def - -/box % draws a box with text 'arg1' at grid pos (arg2,arg3) -{ gsave - 2 setlinewidth - newpath - exch xspacing mul xoffset add - exch yspacing mul - moveto - boxwidth 0 rlineto - 0 boxheight rlineto - boxwidth neg 0 rlineto - 0 boxheight neg rlineto - closepath - dup stringwidth pop neg boxwidth add 2 div - boxheight fontheight 2 div sub 2 div - rmoveto show stroke - grestore -} def - -/mark -{ newpath - exch xspacing mul xoffset add boxwidth add - exch yspacing mul - moveto - 0 boxheight 4 div rlineto - boxheight neg 4 div boxheight neg 4 div rlineto - closepath - eofill - stroke -} def - -/arrow -{ newpath - moveto - 3 -8 rlineto - -6 0 rlineto - 3 8 rlineto - closepath - eofill - stroke -} def - -/out % draws an output connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight add - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/in % draws an input connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul disty 2 div sub - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/hedge -{ - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight 2 div sub - /y exch def - /x exch def - newpath - x y moveto - boxwidth 2 div distx add 0 rlineto - stroke - 1 eq - { newpath x boxwidth 2 div distx add add y moveto - -8 3 rlineto - 0 -6 rlineto - 8 3 rlineto - closepath - eofill - stroke - } if -} def - -/vedge -{ - /ye exch def - /ys exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add dup - ys yspacing mul boxheight 2 div sub - moveto - ye yspacing mul boxheight 2 div sub - lineto - stroke -} def - -/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' -{ - /ys exch def - /xe exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add - ys yspacing mul disty 2 div sub - moveto - xspacing xe xs sub mul 0 - rlineto - stroke -} def - -% ----- main ------ - -boxfont setfont -1 boundaspect scale -(PressureSolver) cw -(GaussSeidel) cw -(SOR) cw -/boxwidth boxwidth marginwidth 2 mul add def -/xspacing boxwidth distx add def -/yspacing boxheight disty add def -/scalefactor - boxwidth cols mul distx cols 1 sub mul add - boxheight rows mul disty rows 1 sub mul add boundaspect mul - max def -boundx scalefactor div boundy scalefactor div scale - -% ----- classes ----- - - (PressureSolver) 0.500000 1.000000 box - (GaussSeidel) 0.000000 0.000000 box - (SOR) 1.000000 0.000000 box - -% ----- relations ----- - -solid -1 0.500000 0.250000 out -solid -0.000000 1.000000 1.000000 conn -solid -0 0.000000 0.750000 in -solid -0 1.000000 0.750000 in diff --git a/documentation/latex/classPressureSolver.pdf b/documentation/latex/classPressureSolver.pdf deleted file mode 100644 index 93d429195579bdf935a200dfa551a2d888f11a1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5338 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 diff --git a/documentation/latex/classPressureSolver.tex b/documentation/latex/classPressureSolver.tex deleted file mode 100644 index a49141fc..00000000 --- a/documentation/latex/classPressureSolver.tex +++ /dev/null @@ -1,130 +0,0 @@ -\doxysection{Pressure\+Solver Class Reference} -\hypertarget{classPressureSolver}{}\label{classPressureSolver}\index{PressureSolver@{PressureSolver}} - - -Solves the Poisson problem for the pressure. - - - - -{\ttfamily \#include $<$pressure\+\_\+solver.\+h$>$} - -Inheritance diagram for Pressure\+Solver\+:\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[height=2.000000cm]{classPressureSolver} -\end{center} -\end{figure} -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058}{Pressure\+Solver}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, double epsilon, int maximum\+Number\+Of\+Iterations, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ boundary) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item -virtual void \mbox{\hyperlink{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0}{solve}} ()=0 -\begin{DoxyCompactList}\small\item\em virtual function that starts solver. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsubsection*{Public Attributes} -\begin{DoxyCompactItemize} -\item -\Hypertarget{classPressureSolver_a3c97c6f37cf2bdb3985f90afa6923f93}\label{classPressureSolver_a3c97c6f37cf2bdb3985f90afa6923f93} -double {\bfseries dx2} -\item -\Hypertarget{classPressureSolver_a25b7ff50bdaea53d1b5c7a5cf735c5b5}\label{classPressureSolver_a25b7ff50bdaea53d1b5c7a5cf735c5b5} -double {\bfseries dy2} -\begin{DoxyCompactList}\small\item\em squared mesh widths \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsubsection*{Protected Member Functions} -\begin{DoxyCompactItemize} -\item -void \mbox{\hyperlink{classPressureSolver_a458c383fcacaf54c1a333a271049ca93}{set\+Boundary\+Values}} () -\begin{DoxyCompactList}\small\item\em Set the \doxylink{classBoundary}{Boundary} Values. \end{DoxyCompactList}\item -\Hypertarget{classPressureSolver_afc51f4315c483988aeec327a16c5bb90}\label{classPressureSolver_afc51f4315c483988aeec327a16c5bb90} -double {\bfseries calculate\+Residuum} () -\begin{DoxyCompactList}\small\item\em calculate residuum of current time step \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsubsection*{Protected Attributes} -\begin{DoxyCompactItemize} -\item -\Hypertarget{classPressureSolver_af3ac2e53c6f49b9a362415a89595a7f0}\label{classPressureSolver_af3ac2e53c6f49b9a362415a89595a7f0} -int {\bfseries i\+\_\+beg} -\begin{DoxyCompactList}\small\item\em begin of loop for rhs in x direction \end{DoxyCompactList}\item -\Hypertarget{classPressureSolver_a41b263980e55591d1ffdc4837c252a61}\label{classPressureSolver_a41b263980e55591d1ffdc4837c252a61} -int {\bfseries i\+\_\+end} -\begin{DoxyCompactList}\small\item\em end of loop for rhs in x direction \end{DoxyCompactList}\item -\Hypertarget{classPressureSolver_aa309af30e5e63e09b77900091e562235}\label{classPressureSolver_aa309af30e5e63e09b77900091e562235} -int {\bfseries j\+\_\+beg} -\begin{DoxyCompactList}\small\item\em begin of loop for rhs in y direction \end{DoxyCompactList}\item -\Hypertarget{classPressureSolver_ac2402794034dd74073700998ee2860bf}\label{classPressureSolver_ac2402794034dd74073700998ee2860bf} -int {\bfseries j\+\_\+end} -\begin{DoxyCompactList}\small\item\em end of loop for rhs in y direction \end{DoxyCompactList}\item -\Hypertarget{classPressureSolver_af579ecebaaa8b11914293ef18af5fdc6}\label{classPressureSolver_af579ecebaaa8b11914293ef18af5fdc6} -std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} -\begin{DoxyCompactList}\small\item\em object holding the needed field variables for rhs and p \end{DoxyCompactList}\item -\Hypertarget{classPressureSolver_a0b17b46580d259e4bb3a05486bc06a60}\label{classPressureSolver_a0b17b46580d259e4bb3a05486bc06a60} -std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ {\bfseries boundary\+\_\+} -\begin{DoxyCompactList}\small\item\em object managing boundary for obstacle and surface tension \end{DoxyCompactList}\item -\Hypertarget{classPressureSolver_a22b723f3b3ba54e47f36cfc2b9576749}\label{classPressureSolver_a22b723f3b3ba54e47f36cfc2b9576749} -double {\bfseries epsilon\+\_\+} -\begin{DoxyCompactList}\small\item\em tolerance for the solver \end{DoxyCompactList}\item -\Hypertarget{classPressureSolver_af3b02d29bf1b21ad8b7e6edf8c2f4e87}\label{classPressureSolver_af3b02d29bf1b21ad8b7e6edf8c2f4e87} -int {\bfseries maximum\+Number\+Of\+Iterations\+\_\+} -\begin{DoxyCompactList}\small\item\em maximum number of iterations \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\doxysubsection{Detailed Description} -Solves the Poisson problem for the pressure. - -Interface for the pressure solver. It computes the pressure field variable such that the continuity equation is fulfilled. - -\doxysubsection{Constructor \& Destructor Documentation} -\Hypertarget{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058}\label{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058} -\index{PressureSolver@{PressureSolver}!PressureSolver@{PressureSolver}} -\index{PressureSolver@{PressureSolver}!PressureSolver@{PressureSolver}} -\doxysubsubsection{\texorpdfstring{PressureSolver()}{PressureSolver()}} -{\footnotesize\ttfamily Pressure\+Solver\+::\+Pressure\+Solver (\begin{DoxyParamCaption}\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$}]{discretization, }\item[{double}]{epsilon, }\item[{int}]{maximum\+Number\+Of\+Iterations, }\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$}]{boundary }\end{DoxyParamCaption})} - - - -Constructor. - - -\begin{DoxyParams}{Parameters} -{\em discretization} & instance of \doxylink{classDiscretization}{Discretization} holding the needed field variables for rhs and p \\ -\hline -{\em epsilon} & tolerance for the solver \\ -\hline -{\em maximum\+Number\+Of\+Iterations} & maximum of iteration \\ -\hline -{\em boundary} & object managing boundary for obstacle and surface tension \\ -\hline -\end{DoxyParams} - - -\doxysubsection{Member Function Documentation} -\Hypertarget{classPressureSolver_a458c383fcacaf54c1a333a271049ca93}\label{classPressureSolver_a458c383fcacaf54c1a333a271049ca93} -\index{PressureSolver@{PressureSolver}!setBoundaryValues@{setBoundaryValues}} -\index{setBoundaryValues@{setBoundaryValues}!PressureSolver@{PressureSolver}} -\doxysubsubsection{\texorpdfstring{setBoundaryValues()}{setBoundaryValues()}} -{\footnotesize\ttfamily void Pressure\+Solver\+::set\+Boundary\+Values (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [protected]}} - - - -Set the \doxylink{classBoundary}{Boundary} Values. - -Account for homogenous Neuman BC Has to be called every iteration \Hypertarget{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0}\label{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0} -\index{PressureSolver@{PressureSolver}!solve@{solve}} -\index{solve@{solve}!PressureSolver@{PressureSolver}} -\doxysubsubsection{\texorpdfstring{solve()}{solve()}} -{\footnotesize\ttfamily virtual void Pressure\+Solver\+::solve (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}} - - - -virtual function that starts solver. - - - -Implemented in \mbox{\hyperlink{classGaussSeidel_a6f0eb0c6938a64f8ded186f88170a04b}{Gauss\+Seidel}}, and \mbox{\hyperlink{classSOR_a860992d85d8aacf114a3a02b5831f728}{SOR}}. - - - -The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/pressure\+\_\+solver.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/pressure\+\_\+solver.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classSOR.eps b/documentation/latex/classSOR.eps deleted file mode 100644 index 3f4e542f..00000000 --- a/documentation/latex/classSOR.eps +++ /dev/null @@ -1,197 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: ClassName -%%Creator: Doxygen -%%CreationDate: Time -%%For: -%Magnification: 1.00 -%%Orientation: Portrait -%%BoundingBox: 0 0 500 370.370361 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%EndComments - -% ----- variables ----- - -/boxwidth 0 def -/boxheight 40 def -/fontheight 24 def -/marginwidth 10 def -/distx 20 def -/disty 40 def -/boundaspect 1.350000 def % aspect ratio of the BoundingBox (width/height) -/boundx 500 def -/boundy boundx boundaspect div def -/xspacing 0 def -/yspacing 0 def -/rows 2 def -/cols 1 def -/scalefactor 0 def -/boxfont /Times-Roman findfont fontheight scalefont def - -% ----- procedures ----- - -/dotted { [1 4] 0 setdash } def -/dashed { [5] 0 setdash } def -/solid { [] 0 setdash } def - -/max % result = MAX(arg1,arg2) -{ - /a exch def - /b exch def - a b gt {a} {b} ifelse -} def - -/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) -{ - 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max -} def - -/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) -{ - /str exch def - /boxwidth boxwidth str stringwidth pop max def -} def - -/box % draws a box with text 'arg1' at grid pos (arg2,arg3) -{ gsave - 2 setlinewidth - newpath - exch xspacing mul xoffset add - exch yspacing mul - moveto - boxwidth 0 rlineto - 0 boxheight rlineto - boxwidth neg 0 rlineto - 0 boxheight neg rlineto - closepath - dup stringwidth pop neg boxwidth add 2 div - boxheight fontheight 2 div sub 2 div - rmoveto show stroke - grestore -} def - -/mark -{ newpath - exch xspacing mul xoffset add boxwidth add - exch yspacing mul - moveto - 0 boxheight 4 div rlineto - boxheight neg 4 div boxheight neg 4 div rlineto - closepath - eofill - stroke -} def - -/arrow -{ newpath - moveto - 3 -8 rlineto - -6 0 rlineto - 3 8 rlineto - closepath - eofill - stroke -} def - -/out % draws an output connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight add - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/in % draws an input connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul disty 2 div sub - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/hedge -{ - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight 2 div sub - /y exch def - /x exch def - newpath - x y moveto - boxwidth 2 div distx add 0 rlineto - stroke - 1 eq - { newpath x boxwidth 2 div distx add add y moveto - -8 3 rlineto - 0 -6 rlineto - 8 3 rlineto - closepath - eofill - stroke - } if -} def - -/vedge -{ - /ye exch def - /ys exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add dup - ys yspacing mul boxheight 2 div sub - moveto - ye yspacing mul boxheight 2 div sub - lineto - stroke -} def - -/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' -{ - /ys exch def - /xe exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add - ys yspacing mul disty 2 div sub - moveto - xspacing xe xs sub mul 0 - rlineto - stroke -} def - -% ----- main ------ - -boxfont setfont -1 boundaspect scale -(SOR) cw -(PressureSolver) cw -/boxwidth boxwidth marginwidth 2 mul add def -/xspacing boxwidth distx add def -/yspacing boxheight disty add def -/scalefactor - boxwidth cols mul distx cols 1 sub mul add - boxheight rows mul disty rows 1 sub mul add boundaspect mul - max def -boundx scalefactor div boundy scalefactor div scale - -% ----- classes ----- - - (SOR) 0.000000 0.000000 box - (PressureSolver) 0.000000 1.000000 box - -% ----- relations ----- - -solid -0 0.000000 0.000000 out -solid -1 0.000000 1.000000 in diff --git a/documentation/latex/classSOR.pdf b/documentation/latex/classSOR.pdf deleted file mode 100644 index 368cf44a76641b7d5f8f66fa9725fb24291a87e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4725 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 - -Inheritance diagram for SOR\+:\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[height=2.000000cm]{classSOR} -\end{center} -\end{figure} -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classSOR_a357cfea8935f4b2dfee06f2d8e1461a8}{SOR}} (const std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ \&data, double epsilon, int maximum\+Number\+Of\+Iterations, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ boundary, double omega) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item -void \mbox{\hyperlink{classSOR_a860992d85d8aacf114a3a02b5831f728}{solve}} () override -\begin{DoxyCompactList}\small\item\em override function that starts solver. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058}{Pressure\+Solver}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, double epsilon, int maximum\+Number\+Of\+Iterations, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ boundary) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsubsection*{Additional Inherited Members} -\doxysubsection*{Public Attributes inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} -\begin{DoxyCompactItemize} -\item -double {\bfseries dx2} -\item -double {\bfseries dy2} -\begin{DoxyCompactList}\small\item\em squared mesh widths \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsection*{Protected Member Functions inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} -\begin{DoxyCompactItemize} -\item -void \mbox{\hyperlink{classPressureSolver_a458c383fcacaf54c1a333a271049ca93}{set\+Boundary\+Values}} () -\begin{DoxyCompactList}\small\item\em Set the \doxylink{classBoundary}{Boundary} Values. \end{DoxyCompactList}\item -double {\bfseries calculate\+Residuum} () -\begin{DoxyCompactList}\small\item\em calculate residuum of current time step \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} -\begin{DoxyCompactItemize} -\item -int {\bfseries i\+\_\+beg} -\begin{DoxyCompactList}\small\item\em begin of loop for rhs in x direction \end{DoxyCompactList}\item -int {\bfseries i\+\_\+end} -\begin{DoxyCompactList}\small\item\em end of loop for rhs in x direction \end{DoxyCompactList}\item -int {\bfseries j\+\_\+beg} -\begin{DoxyCompactList}\small\item\em begin of loop for rhs in y direction \end{DoxyCompactList}\item -int {\bfseries j\+\_\+end} -\begin{DoxyCompactList}\small\item\em end of loop for rhs in y direction \end{DoxyCompactList}\item -std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} -\begin{DoxyCompactList}\small\item\em object holding the needed field variables for rhs and p \end{DoxyCompactList}\item -std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ {\bfseries boundary\+\_\+} -\begin{DoxyCompactList}\small\item\em object managing boundary for obstacle and surface tension \end{DoxyCompactList}\item -double {\bfseries epsilon\+\_\+} -\begin{DoxyCompactList}\small\item\em tolerance for the solver \end{DoxyCompactList}\item -int {\bfseries maximum\+Number\+Of\+Iterations\+\_\+} -\begin{DoxyCompactList}\small\item\em maximum number of iterations \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\doxysubsection{Detailed Description} -Successive over-\/relaxation solver. - -\doxysubsection{Constructor \& Destructor Documentation} -\Hypertarget{classSOR_a357cfea8935f4b2dfee06f2d8e1461a8}\label{classSOR_a357cfea8935f4b2dfee06f2d8e1461a8} -\index{SOR@{SOR}!SOR@{SOR}} -\index{SOR@{SOR}!SOR@{SOR}} -\doxysubsubsection{\texorpdfstring{SOR()}{SOR()}} -{\footnotesize\ttfamily SOR\+::\+SOR (\begin{DoxyParamCaption}\item[{const std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ \&}]{data, }\item[{double}]{epsilon, }\item[{int}]{maximum\+Number\+Of\+Iterations, }\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$}]{boundary, }\item[{double}]{omega }\end{DoxyParamCaption})} - - - -Constructor. - - -\begin{DoxyParams}{Parameters} -{\em data} & instance of \doxylink{classDiscretization}{Discretization} holding the needed field variables for rhs and p \\ -\hline -{\em epsilon} & tolerance for the solver \\ -\hline -{\em maximum\+Number\+Of\+Iterations} & maximum of iteration \\ -\hline -{\em omega} & relaxation factor \\ -\hline -\end{DoxyParams} - - -\doxysubsection{Member Function Documentation} -\Hypertarget{classSOR_a860992d85d8aacf114a3a02b5831f728}\label{classSOR_a860992d85d8aacf114a3a02b5831f728} -\index{SOR@{SOR}!solve@{solve}} -\index{solve@{solve}!SOR@{SOR}} -\doxysubsubsection{\texorpdfstring{solve()}{solve()}} -{\footnotesize\ttfamily void SOR\+::solve (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} - - - -override function that starts solver. - - - -Implements \mbox{\hyperlink{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0}{Pressure\+Solver}}. - - - -The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/sor.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/sor.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classStaggeredGrid.eps b/documentation/latex/classStaggeredGrid.eps deleted file mode 100644 index 67d46456..00000000 --- a/documentation/latex/classStaggeredGrid.eps +++ /dev/null @@ -1,209 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: ClassName -%%Creator: Doxygen -%%CreationDate: Time -%%For: -%Magnification: 1.00 -%%Orientation: Portrait -%%BoundingBox: 0 0 500 236.220474 -%%Pages: 0 -%%BeginSetup -%%EndSetup -%%EndComments - -% ----- variables ----- - -/boxwidth 0 def -/boxheight 40 def -/fontheight 24 def -/marginwidth 10 def -/distx 20 def -/disty 40 def -/boundaspect 2.116667 def % aspect ratio of the BoundingBox (width/height) -/boundx 500 def -/boundy boundx boundaspect div def -/xspacing 0 def -/yspacing 0 def -/rows 3 def -/cols 2 def -/scalefactor 0 def -/boxfont /Times-Roman findfont fontheight scalefont def - -% ----- procedures ----- - -/dotted { [1 4] 0 setdash } def -/dashed { [5] 0 setdash } def -/solid { [] 0 setdash } def - -/max % result = MAX(arg1,arg2) -{ - /a exch def - /b exch def - a b gt {a} {b} ifelse -} def - -/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) -{ - 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max -} def - -/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) -{ - /str exch def - /boxwidth boxwidth str stringwidth pop max def -} def - -/box % draws a box with text 'arg1' at grid pos (arg2,arg3) -{ gsave - 2 setlinewidth - newpath - exch xspacing mul xoffset add - exch yspacing mul - moveto - boxwidth 0 rlineto - 0 boxheight rlineto - boxwidth neg 0 rlineto - 0 boxheight neg rlineto - closepath - dup stringwidth pop neg boxwidth add 2 div - boxheight fontheight 2 div sub 2 div - rmoveto show stroke - grestore -} def - -/mark -{ newpath - exch xspacing mul xoffset add boxwidth add - exch yspacing mul - moveto - 0 boxheight 4 div rlineto - boxheight neg 4 div boxheight neg 4 div rlineto - closepath - eofill - stroke -} def - -/arrow -{ newpath - moveto - 3 -8 rlineto - -6 0 rlineto - 3 8 rlineto - closepath - eofill - stroke -} def - -/out % draws an output connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight add - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/in % draws an input connector for the block at (arg1,arg2) -{ - newpath - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul disty 2 div sub - /y exch def - /x exch def - x y moveto - 0 disty 2 div rlineto - stroke - 1 eq { x y disty 2 div add arrow } if -} def - -/hedge -{ - exch xspacing mul xoffset add boxwidth 2 div add - exch yspacing mul boxheight 2 div sub - /y exch def - /x exch def - newpath - x y moveto - boxwidth 2 div distx add 0 rlineto - stroke - 1 eq - { newpath x boxwidth 2 div distx add add y moveto - -8 3 rlineto - 0 -6 rlineto - 8 3 rlineto - closepath - eofill - stroke - } if -} def - -/vedge -{ - /ye exch def - /ys exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add dup - ys yspacing mul boxheight 2 div sub - moveto - ye yspacing mul boxheight 2 div sub - lineto - stroke -} def - -/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' -{ - /ys exch def - /xe exch def - /xs exch def - newpath - xs xspacing mul xoffset add boxwidth 2 div add - ys yspacing mul disty 2 div sub - moveto - xspacing xe xs sub mul 0 - rlineto - stroke -} def - -% ----- main ------ - -boxfont setfont -1 boundaspect scale -(StaggeredGrid) cw -(Discretization) cw -(CentralDifferences) cw -(DonorCell) cw -/boxwidth boxwidth marginwidth 2 mul add def -/xspacing boxwidth distx add def -/yspacing boxheight disty add def -/scalefactor - boxwidth cols mul distx cols 1 sub mul add - boxheight rows mul disty rows 1 sub mul add boundaspect mul - max def -boundx scalefactor div boundy scalefactor div scale - -% ----- classes ----- - - (StaggeredGrid) 0.500000 2.000000 box - (Discretization) 0.500000 1.000000 box - (CentralDifferences) 0.000000 0.000000 box - (DonorCell) 1.000000 0.000000 box - -% ----- relations ----- - -solid -1 0.500000 1.250000 out -solid -0 0.500000 1.750000 in -solid -1 0.500000 0.250000 out -solid -0.000000 1.000000 1.000000 conn -solid -0 0.000000 0.750000 in -solid -0 1.000000 0.750000 in diff --git a/documentation/latex/classStaggeredGrid.pdf b/documentation/latex/classStaggeredGrid.pdf deleted file mode 100644 index d6c223284ab3b32012da18da4907a61286041944..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5761 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 - -Inheritance diagram for Staggered\+Grid\+:\begin{figure}[H] -\begin{center} -\leavevmode -\includegraphics[height=3.000000cm]{classStaggeredGrid} -\end{center} -\end{figure} -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -\mbox{\hyperlink{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}{Staggered\+Grid}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) -\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}\label{classStaggeredGrid_a330856d4efe952771daf0753ef84068e} -const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width} () const -\begin{DoxyCompactList}\small\item\em Get the length of a single cell in x and y directions. \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}\label{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf} -const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells} () const -\begin{DoxyCompactList}\small\item\em Get number of cells in x and y directions. \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a87cee12621c641ab143a8b1a61b2ef7e}\label{classStaggeredGrid_a87cee12621c641ab143a8b1a61b2ef7e} -const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries u} () const -\begin{DoxyCompactList}\small\item\em Get a reference to the field variable u. \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a26e478abba632554652c9e05a279d1ca}\label{classStaggeredGrid_a26e478abba632554652c9e05a279d1ca} -const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries v} () const -\begin{DoxyCompactList}\small\item\em Get a reference to the field variable v. \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_aafe6e0bb3509f6aad272b94f74e7ffec}\label{classStaggeredGrid_aafe6e0bb3509f6aad272b94f74e7ffec} -const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries p} () const -\begin{DoxyCompactList}\small\item\em Get a reference to the field variable p. \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a3f36422a02b9b18d1577d61e406f08cf}\label{classStaggeredGrid_a3f36422a02b9b18d1577d61e406f08cf} -const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries rhs} () const -\begin{DoxyCompactList}\small\item\em Get a reference to the field variable rhs. \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a0324ce4d1fe2343d8aa9514e460cc556}\label{classStaggeredGrid_a0324ce4d1fe2343d8aa9514e460cc556} -double {\bfseries u} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j), declared constant. \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a0ed62d6752b6b2b3ead5f654b515cd12}\label{classStaggeredGrid_a0ed62d6752b6b2b3ead5f654b515cd12} -double \& {\bfseries u} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j) \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_ac052d8803ff950aee04b86ac026c516b}\label{classStaggeredGrid_ac052d8803ff950aee04b86ac026c516b} -double {\bfseries v} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j), declared constant. \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a7746f703f32c2f20a4c77246eebac697}\label{classStaggeredGrid_a7746f703f32c2f20a4c77246eebac697} -double \& {\bfseries v} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j) \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_aa6a5d99d9b4fbd9bd9cfa6ec071918f9}\label{classStaggeredGrid_aa6a5d99d9b4fbd9bd9cfa6ec071918f9} -double {\bfseries p} (int i, int j) const -\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j), declared constant. \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_aa09a4ca67141589bae153797fbc4f3c5}\label{classStaggeredGrid_aa09a4ca67141589bae153797fbc4f3c5} -double \& {\bfseries p} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j) \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_adb05c59512dc8993367e4beddba05785}\label{classStaggeredGrid_adb05c59512dc8993367e4beddba05785} -double \& {\bfseries f} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of f in element (i,j) \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_aaf849bec40f7fa7c68823038f0877341}\label{classStaggeredGrid_aaf849bec40f7fa7c68823038f0877341} -double \& {\bfseries g} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of g in element (i,j) \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a761ea51f1e8fd1290b3adfe09942b0d3}\label{classStaggeredGrid_a761ea51f1e8fd1290b3adfe09942b0d3} -double \& {\bfseries rhs} (int i, int j) -\begin{DoxyCompactList}\small\item\em Access value of rhs in element (i,j) \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_aec8490affea703cdd73b1febaed68968}\label{classStaggeredGrid_aec8490affea703cdd73b1febaed68968} -double {\bfseries dx} () const -\begin{DoxyCompactList}\small\item\em Get the mesh width in x-\/direction. \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_abde2da10e0c130fb0f206de64c9b4956}\label{classStaggeredGrid_abde2da10e0c130fb0f206de64c9b4956} -double {\bfseries dy} () const -\begin{DoxyCompactList}\small\item\em Get the mesh width in y-\/direction. \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a31e2d3a0b6e03685380810a7c2f323e1}\label{classStaggeredGrid_a31e2d3a0b6e03685380810a7c2f323e1} -int {\bfseries u\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for u in x direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a641e473d72e1d02ba3de1c16e9d0d332}\label{classStaggeredGrid_a641e473d72e1d02ba3de1c16e9d0d332} -int {\bfseries u\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for u in x direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a9b0e97704e1871441a8e713ecaa2cff5}\label{classStaggeredGrid_a9b0e97704e1871441a8e713ecaa2cff5} -int {\bfseries u\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for u in y direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a3393aa91b17054d2d700de308ae25632}\label{classStaggeredGrid_a3393aa91b17054d2d700de308ae25632} -int {\bfseries u\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for u in y direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_ace7bf8cb1d279131739d5d12de302d09}\label{classStaggeredGrid_ace7bf8cb1d279131739d5d12de302d09} -int {\bfseries v\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for v in x direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_aa5a44aa088b5a7923fa952af1ecb5778}\label{classStaggeredGrid_aa5a44aa088b5a7923fa952af1ecb5778} -int {\bfseries v\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for v in x direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a7f8468d672411c0e3a5eeb67788fc826}\label{classStaggeredGrid_a7f8468d672411c0e3a5eeb67788fc826} -int {\bfseries v\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for v in y direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_ab67e8d9d8d76d34fb02d4d644f0b3795}\label{classStaggeredGrid_ab67e8d9d8d76d34fb02d4d644f0b3795} -int {\bfseries v\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for v in y direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a9922c955707f2a31a4a27d1d696f002e}\label{classStaggeredGrid_a9922c955707f2a31a4a27d1d696f002e} -int {\bfseries p\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for p in x direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a34f16fdf87971fe84ffc3c84722bb2c7}\label{classStaggeredGrid_a34f16fdf87971fe84ffc3c84722bb2c7} -int {\bfseries p\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for p in x direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_ae4c9ba16c5635dc1ffaa264fbcc3e034}\label{classStaggeredGrid_ae4c9ba16c5635dc1ffaa264fbcc3e034} -int {\bfseries p\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for p in y direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_ad9928ee522eedb7d7fd48ca0b92f2795}\label{classStaggeredGrid_ad9928ee522eedb7d7fd48ca0b92f2795} -int {\bfseries p\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for p in y direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a5cc368f9ede58a3cb689705df998f750}\label{classStaggeredGrid_a5cc368f9ede58a3cb689705df998f750} -int {\bfseries f\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for f in x direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a8162b849231354ba73aacb085b5cd665}\label{classStaggeredGrid_a8162b849231354ba73aacb085b5cd665} -int {\bfseries f\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for f in x direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_ab92aca90331200d0cc7bc0c0a857b4ef}\label{classStaggeredGrid_ab92aca90331200d0cc7bc0c0a857b4ef} -int {\bfseries f\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for f in y direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a7ac43ac86231987bc0bf6565589d52e1}\label{classStaggeredGrid_a7ac43ac86231987bc0bf6565589d52e1} -int {\bfseries f\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for f in y direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a061fb6d6948cdc3054171dd60842a8c3}\label{classStaggeredGrid_a061fb6d6948cdc3054171dd60842a8c3} -int {\bfseries g\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for g in x direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_aebc76693e5dd61db521d6763236bf664}\label{classStaggeredGrid_aebc76693e5dd61db521d6763236bf664} -int {\bfseries g\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for g in x direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a18ca3a121787b19c18886b0945aca2e3}\label{classStaggeredGrid_a18ca3a121787b19c18886b0945aca2e3} -int {\bfseries g\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for g in y direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a7a29456e1bce9efffa27de0b41957b50}\label{classStaggeredGrid_a7a29456e1bce9efffa27de0b41957b50} -int {\bfseries g\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for g in y direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_ad5c16b00d9dbf0f115e1ded81203edce}\label{classStaggeredGrid_ad5c16b00d9dbf0f115e1ded81203edce} -int {\bfseries rhs\+IBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for rhs in x direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_ae11e8842fdd508b914dc8f24b09b36a9}\label{classStaggeredGrid_ae11e8842fdd508b914dc8f24b09b36a9} -int {\bfseries rhs\+IEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in x direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a28c36939e3d3cc8df76e7aa91f0e0804}\label{classStaggeredGrid_a28c36939e3d3cc8df76e7aa91f0e0804} -int {\bfseries rhs\+JBegin} () const -\begin{DoxyCompactList}\small\item\em first valid index for rhs in y direction \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a953ec890a986473bffe87ea26dfcd782}\label{classStaggeredGrid_a953ec890a986473bffe87ea26dfcd782} -int {\bfseries rhs\+JEnd} () const -\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in y direction \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsubsection*{Protected Attributes} -\begin{DoxyCompactItemize} -\item -\Hypertarget{classStaggeredGrid_acacffb5739539d9015c986080bb5ed44}\label{classStaggeredGrid_acacffb5739539d9015c986080bb5ed44} -const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells\+\_\+} -\begin{DoxyCompactList}\small\item\em array containing number of cells in x and y directions \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a9603c3334440aab082dda48947e5ce6e}\label{classStaggeredGrid_a9603c3334440aab082dda48947e5ce6e} -const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width\+\_\+} -\begin{DoxyCompactList}\small\item\em array containing the sizes of cell edges in x and y directions \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_adcef36b4ce8cc6843a2b6f603b62c763}\label{classStaggeredGrid_adcef36b4ce8cc6843a2b6f603b62c763} -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries u\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable u \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a20ec43568fe937b194561e21a0b84ad9}\label{classStaggeredGrid_a20ec43568fe937b194561e21a0b84ad9} -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries v\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable v \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a2ea3c93dd401ac06461ade9a74e76459}\label{classStaggeredGrid_a2ea3c93dd401ac06461ade9a74e76459} -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries p\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable p \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a94933ac0c6e0d2a794f46c7a97d72f75}\label{classStaggeredGrid_a94933ac0c6e0d2a794f46c7a97d72f75} -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries f\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable f \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a5f5c88f603d4e503cba4c44ed43de46a}\label{classStaggeredGrid_a5f5c88f603d4e503cba4c44ed43de46a} -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries g\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable g \end{DoxyCompactList}\item -\Hypertarget{classStaggeredGrid_a496206955162452a0629a7742fe92a84}\label{classStaggeredGrid_a496206955162452a0629a7742fe92a84} -\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries rhs\+\_\+} -\begin{DoxyCompactList}\small\item\em instance of the field variable rhs \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\doxysubsection{Detailed Description} -Create field variables and define limits for the indices. - -Create the necessary u, v, p, f, g, rhs field variables and define the first valid index for each of the field variables, as well as the (one after) last valid index - -\doxysubsection{Constructor \& Destructor Documentation} -\Hypertarget{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}\label{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1} -\index{StaggeredGrid@{StaggeredGrid}!StaggeredGrid@{StaggeredGrid}} -\index{StaggeredGrid@{StaggeredGrid}!StaggeredGrid@{StaggeredGrid}} -\doxysubsubsection{\texorpdfstring{StaggeredGrid()}{StaggeredGrid()}} -{\footnotesize\ttfamily Staggered\+Grid\+::\+Staggered\+Grid (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{n\+Cells, }\item[{std\+::array$<$ double, 2 $>$}]{mesh\+Width }\end{DoxyParamCaption})} - - - -Constructor. - - -\begin{DoxyParams}{Parameters} -{\em n\+Cells} & array containing number of cells in x and y directions \\ -\hline -{\em mesh\+Width} & array containing the length of a single cell in x and y directions \\ -\hline -\end{DoxyParams} - - -The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/staggered\+\_\+grid.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/staggered\+\_\+grid.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/computation_8h_source.tex b/documentation/latex/computation_8h_source.tex deleted file mode 100644 index 88a761bf..00000000 --- a/documentation/latex/computation_8h_source.tex +++ /dev/null @@ -1,94 +0,0 @@ -\doxysection{computation.\+h} -\hypertarget{computation_8h_source}{}\label{computation_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/computation.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/computation.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} -\DoxyCodeLine{00002\ } -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}discretization/discretization.h"{}}} -\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ "{}discretization/donor\_cell.h"{}}} -\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ "{}discretization/central\_differences.h"{}}} -\DoxyCodeLine{00006\ } -\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ "{}solver/pressure\_solver.h"{}}} -\DoxyCodeLine{00008\ \textcolor{preprocessor}{\#include\ "{}solver/sor.h"{}}} -\DoxyCodeLine{00009\ \textcolor{preprocessor}{\#include\ "{}solver/gauss\_seidel.h"{}}} -\DoxyCodeLine{00010\ } -\DoxyCodeLine{00011\ \textcolor{preprocessor}{\#include\ "{}output\_writer/output\_writer\_paraview.h"{}}} -\DoxyCodeLine{00012\ \textcolor{preprocessor}{\#include\ "{}output\_writer/output\_writer\_text.h"{}}} -\DoxyCodeLine{00013\ \textcolor{preprocessor}{\#include\ "{}settings\_parser/settings.h"{}}} -\DoxyCodeLine{00014\ } -\DoxyCodeLine{00015\ \textcolor{preprocessor}{\#include\ "{}boundary/boundary.h"{}}} -\DoxyCodeLine{00016\ \textcolor{preprocessor}{\#include\ "{}boundary/mask.h"{}}} -\DoxyCodeLine{00017\ \textcolor{preprocessor}{\#include\ "{}surface/fluid\_tracer.h"{}}} -\DoxyCodeLine{00018\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00019\ } -\DoxyCodeLine{00020\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00021\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00022\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00023\ } - - - - - -\DoxyCodeLine{00030\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classComputation}{Computation}}} -\DoxyCodeLine{00031\ \{} -\DoxyCodeLine{00032\ \textcolor{keyword}{public}:} - - - - - -\DoxyCodeLine{00039\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classComputation_a4a344479797b15bd5c9ed2f262657339}{initialize}}(\textcolor{keywordtype}{int}\ argc,\ \textcolor{keywordtype}{char}\ *argv[]);} -\DoxyCodeLine{00040\ } - - - -\DoxyCodeLine{00045\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classComputation_ad20ce6e82ec9a918e6ac03840bc688d5}{runSimulation}}();} -\DoxyCodeLine{00046\ } -\DoxyCodeLine{00047\ } -\DoxyCodeLine{00048\ } -\DoxyCodeLine{00049\ \textcolor{keyword}{private}:} - - - - -\DoxyCodeLine{00055\ \ \ \ \ \textcolor{keywordtype}{void}\ computeTimeStepWidth(\textcolor{keywordtype}{double}\ currentTime);} -\DoxyCodeLine{00056\ } - - -\DoxyCodeLine{00060\ \ \ \ \ \textcolor{keywordtype}{void}\ applyBoundaryValues();} -\DoxyCodeLine{00061\ } - - -\DoxyCodeLine{00065\ \ \ \ \ \textcolor{keywordtype}{void}\ computePreliminaryVelocities();} -\DoxyCodeLine{00066\ } - - -\DoxyCodeLine{00070\ \ \ \ \ \textcolor{keywordtype}{void}\ computeRightHandSide();} -\DoxyCodeLine{00071\ } - - -\DoxyCodeLine{00075\ \ \ \ \ \textcolor{keywordtype}{void}\ computePressure();} -\DoxyCodeLine{00076\ } - - - -\DoxyCodeLine{00081\ \ \ \ \ \textcolor{keywordtype}{void}\ computeVelocities();} -\DoxyCodeLine{00082\ } -\DoxyCodeLine{00083\ \ \ \ \ \mbox{\hyperlink{structSettings}{Settings}}\ settings\_;} -\DoxyCodeLine{00084\ \ \ \ \ std::shared\_ptr\ discretization\_;\ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00085\ } -\DoxyCodeLine{00086\ \ \ \ \ std::shared\_ptr\ mask\_;} -\DoxyCodeLine{00087\ \ \ \ \ std::shared\_ptr\ boundary\_;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00088\ \ \ \ \ std::shared\_ptr\ fluidTracer\_;} -\DoxyCodeLine{00089\ } -\DoxyCodeLine{00090\ \ \ \ \ std::unique\_ptr\ pressureSolver\_;\ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00091\ \ \ \ \ std::unique\_ptr\ outputWriterParaview\_;\ } -\DoxyCodeLine{00092\ \ \ \ \ std::unique\_ptr\ outputWriterText\_;\ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00093\ \ \ \ \ std::array\ meshWidth\_;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00094\ \ \ \ \ \textcolor{keywordtype}{double}\ dt\_;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00095\ \};} -\DoxyCodeLine{00096\ } -\DoxyCodeLine{00097\ } - -\end{DoxyCode} diff --git a/documentation/latex/discretization_8h_source.tex b/documentation/latex/discretization_8h_source.tex deleted file mode 100644 index bfbb7467..00000000 --- a/documentation/latex/discretization_8h_source.tex +++ /dev/null @@ -1,66 +0,0 @@ -\doxysection{discretization.\+h} -\hypertarget{discretization_8h_source}{}\label{discretization_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/discretization/discretization.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/discretization/discretization.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} -\DoxyCodeLine{00002\ } -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ "{}staggered\_grid.h"{}}} -\DoxyCodeLine{00006\ } - - - - - - - -\DoxyCodeLine{00015\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classDiscretization}{Discretization}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classStaggeredGrid}{StaggeredGrid}}} -\DoxyCodeLine{00016\ \{} -\DoxyCodeLine{00017\ \textcolor{keyword}{public}:} - - - - - -\DoxyCodeLine{00024\ \ \ \ \ \mbox{\hyperlink{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c}{Discretization}}(std::array\ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{nCells}},\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{meshWidth}});} -\DoxyCodeLine{00025\ } - - -\DoxyCodeLine{00029\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_acca6bf193e0e91f645d292527299254b}{computeDu2Dx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const}\ =\ 0;} - - -\DoxyCodeLine{00033\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a69ba136ab7f8c09d805afca159cab428}{computeDv2Dy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const}\ =\ 0;} -\DoxyCodeLine{00034\ } - - -\DoxyCodeLine{00038\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795}{computeDuvDx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const}\ =\ 0;} - - -\DoxyCodeLine{00042\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84}{computeDuvDy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const}\ =\ 0;} -\DoxyCodeLine{00043\ } - - -\DoxyCodeLine{00047\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a6986501b0b5c96699ff3ac843c1a6ca2}{computeD2uDx2}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00051\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a446aabc55a9fb4b5cb2f476babc532f9}{computeD2uDy2}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00055\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a5119047788a34eadf37480e913bdc8ea}{computeD2vDx2}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00059\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a56678582a049b1b141621e41afff1438}{computeD2vDy2}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} -\DoxyCodeLine{00060\ } - - -\DoxyCodeLine{00064\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_aed3ad75ad6e647d14f118a12652c01b2}{computeDpDx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00068\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a859f4dc33f0ea91f5e6537be09ce4999}{computeDpDy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} -\DoxyCodeLine{00069\ } -\DoxyCodeLine{00070\ } -\DoxyCodeLine{00071\ \};} -\DoxyCodeLine{00072\ } - -\end{DoxyCode} diff --git a/documentation/latex/donor__cell_8h_source.tex b/documentation/latex/donor__cell_8h_source.tex deleted file mode 100644 index d6492030..00000000 --- a/documentation/latex/donor__cell_8h_source.tex +++ /dev/null @@ -1,50 +0,0 @@ -\doxysection{donor\+\_\+cell.\+h} -\hypertarget{donor__cell_8h_source}{}\label{donor__cell_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/discretization/donor\_cell.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/discretization/donor\_cell.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} -\DoxyCodeLine{00002\ } -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ "{}discretization.h"{}}} -\DoxyCodeLine{00007\ } - - - - - - -\DoxyCodeLine{00015\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classDonorCell}{DonorCell}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classDiscretization}{Discretization}}} -\DoxyCodeLine{00016\ \{} -\DoxyCodeLine{00017\ \textcolor{keyword}{public}:} - - - - - - -\DoxyCodeLine{00025\ \ \ \ \ \mbox{\hyperlink{classDonorCell_a4896ad035a5ac50c85e2b66d442a5312}{DonorCell}}(std::array\ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{nCells}},\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{meshWidth}},\ \textcolor{keywordtype}{double}\ alpha);} -\DoxyCodeLine{00026\ } - - - -\DoxyCodeLine{00031\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDonorCell_a265bdaf46ed8ba46a42ef0cb03807175}{computeDu2Dx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} - - - -\DoxyCodeLine{00036\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDonorCell_a01dcfb7fcf356d5ee412107a30c26fb3}{computeDv2Dy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} - - - -\DoxyCodeLine{00041\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDonorCell_ae41b5f85743ca7f148bd829561bd9cb5}{computeDuvDx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} - - - -\DoxyCodeLine{00046\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDonorCell_a285562312f08efde26afd160174d2843}{computeDuvDy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} -\DoxyCodeLine{00047\ } -\DoxyCodeLine{00048\ \textcolor{keyword}{private}:} -\DoxyCodeLine{00049\ \ \ \ \ \textcolor{keyword}{const}\ \textcolor{keywordtype}{double}\ alpha\_;\ } -\DoxyCodeLine{00050\ \};} - -\end{DoxyCode} diff --git a/documentation/latex/doxygen.sty b/documentation/latex/doxygen.sty deleted file mode 100644 index 4bfc17fa..00000000 --- a/documentation/latex/doxygen.sty +++ /dev/null @@ -1,694 +0,0 @@ -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{doxygen} - -% Packages used by this style file -\RequirePackage{alltt} -%%\RequirePackage{array} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package -\RequirePackage{calc} -\RequirePackage{float} -%%\RequirePackage{ifthen} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package -\RequirePackage{verbatim} -\RequirePackage[table]{xcolor} -\RequirePackage{longtable_doxygen} -\RequirePackage{tabu_doxygen} -\RequirePackage{fancyvrb} -\RequirePackage{tabularx} -\RequirePackage{multicol} -\RequirePackage{multirow} -\RequirePackage{hanging} -\RequirePackage{ifpdf} -\RequirePackage{adjustbox} -\RequirePackage{amssymb} -\RequirePackage{stackengine} -\RequirePackage{enumitem} -\RequirePackage{alphalph} -\RequirePackage[normalem]{ulem} % for strikeout, but don't modify emphasis - -%---------- Internal commands used in this style file ---------------- - -\newcommand{\ensurespace}[1]{% - \begingroup% - \setlength{\dimen@}{#1}% - \vskip\z@\@plus\dimen@% - \penalty -100\vskip\z@\@plus -\dimen@% - \vskip\dimen@% - \penalty 9999% - \vskip -\dimen@% - \vskip\z@skip% hide the previous |\vskip| from |\addvspace| - \endgroup% -} - -\newcommand{\DoxyHorRuler}[1]{% - \setlength{\parskip}{0ex plus 0ex minus 0ex}% - \ifthenelse{#1=0}% - {% - \hrule% - }% - {% - \hrulefilll% - }% -} -\newcommand{\DoxyLabelFont}{} -\newcommand{\entrylabel}[1]{% - {% - \parbox[b]{\labelwidth-4pt}{% - \makebox[0pt][l]{\DoxyLabelFont#1}% - \vspace{1.5\baselineskip}% - }% - }% -} - -\newenvironment{DoxyDesc}[1]{% - \ensurespace{4\baselineskip}% - \begin{list}{}{% - \settowidth{\labelwidth}{20pt}% - %\setlength{\parsep}{0pt}% - \setlength{\itemsep}{0pt}% - \setlength{\leftmargin}{\labelwidth+\labelsep}% - \renewcommand{\makelabel}{\entrylabel}% - }% - \item[#1]% -}{% - \end{list}% -} - -\newsavebox{\xrefbox} -\newlength{\xreflength} -\newcommand{\xreflabel}[1]{% - \sbox{\xrefbox}{#1}% - \setlength{\xreflength}{\wd\xrefbox}% - \ifthenelse{\xreflength>\labelwidth}{% - \begin{minipage}{\textwidth}% - \setlength{\parindent}{0pt}% - \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}% - \end{minipage}% - }{% - \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}% - }% -} - -%---------- Commands used by doxygen LaTeX output generator ---------- - -% Used by
     ... 
    -\newenvironment{DoxyPre}{% - \small% - \begin{alltt}% -}{% - \end{alltt}% - \normalsize% -} -% Necessary for redefining not defined characters, i.e. "Replacement Character" in tex output. -\newlength{\CodeWidthChar} -\newlength{\CodeHeightChar} -\settowidth{\CodeWidthChar}{?} -\settoheight{\CodeHeightChar}{?} -% Necessary for hanging indent -\newlength{\DoxyCodeWidth} - -\newcommand\DoxyCodeLine[1]{ - \ifthenelse{\equal{\detokenize{#1}}{}} - { - \vspace*{\baselineskip} - } - { - \hangpara{\DoxyCodeWidth}{1}{#1}\par - } -} - -\newcommand\NiceSpace{% - \discretionary{}{\kern\fontdimen2\font}{\kern\fontdimen2\font}% -} - -% Used by @code ... @endcode -\newenvironment{DoxyCode}[1]{% - \par% - \scriptsize% - \normalfont\ttfamily% - \rightskip0pt plus 1fil% - \settowidth{\DoxyCodeWidth}{000000}% - \settowidth{\CodeWidthChar}{?}% - \settoheight{\CodeHeightChar}{?}% - \setlength{\parskip}{0ex plus 0ex minus 0ex}% - \ifthenelse{\equal{#1}{0}} - { - {\lccode`~32 \lowercase{\global\let~}\NiceSpace}\obeyspaces% - } - { - {\lccode`~32 \lowercase{\global\let~}}\obeyspaces% - } - -}{% - \normalfont% - \normalsize% - \settowidth{\CodeWidthChar}{?}% - \settoheight{\CodeHeightChar}{?}% -} - -% Redefining not defined characters, i.e. "Replacement Character" in tex output. -\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{% - \textcolor{white}{\sffamily\bfseries\small ?}}{% - \rotatebox{45}{$\blacksquare$}}}} - -% Used by @example, @include, @includelineno and @dontinclude -\newenvironment{DoxyCodeInclude}[1]{% - \DoxyCode{#1}% -}{% - \endDoxyCode% -} - -% Used by @verbatim ... @endverbatim -\newenvironment{DoxyVerb}{% - \par% - \footnotesize% - \verbatim% -}{% - \endverbatim% - \normalsize% -} - -% Used by @verbinclude -\newenvironment{DoxyVerbInclude}{% - \DoxyVerb% -}{% - \endDoxyVerb% -} - -% Used by numbered lists (using '-#' or
      ...
    ) -\setlistdepth{12} -\newlist{DoxyEnumerate}{enumerate}{12} -\setlist[DoxyEnumerate,1]{label=\arabic*.} -\setlist[DoxyEnumerate,2]{label=(\enumalphalphcnt*)} -\setlist[DoxyEnumerate,3]{label=\roman*.} -\setlist[DoxyEnumerate,4]{label=\enumAlphAlphcnt*.} -\setlist[DoxyEnumerate,5]{label=\arabic*.} -\setlist[DoxyEnumerate,6]{label=(\enumalphalphcnt*)} -\setlist[DoxyEnumerate,7]{label=\roman*.} -\setlist[DoxyEnumerate,8]{label=\enumAlphAlphcnt*.} -\setlist[DoxyEnumerate,9]{label=\arabic*.} -\setlist[DoxyEnumerate,10]{label=(\enumalphalphcnt*)} -\setlist[DoxyEnumerate,11]{label=\roman*.} -\setlist[DoxyEnumerate,12]{label=\enumAlphAlphcnt*.} - -% Used by bullet lists (using '-', @li, @arg, or
      ...
    ) -\setlistdepth{12} -\newlist{DoxyItemize}{itemize}{12} -\setlist[DoxyItemize]{label=\textperiodcentered} - -\setlist[DoxyItemize,1]{label=\textbullet} -\setlist[DoxyItemize,2]{label=\normalfont\bfseries \textendash} -\setlist[DoxyItemize,3]{label=\textasteriskcentered} -\setlist[DoxyItemize,4]{label=\textperiodcentered} - -% Used by description lists (using
    ...
    ) -\newenvironment{DoxyDescription}{% - \description% -}{% - \enddescription% -} - -% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc -% (only if caption is specified) -\newenvironment{DoxyImage}{% - \begin{figure}[H]% - \centering% -}{% - \end{figure}% -} - -% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc -% (only if no caption is specified) -\newenvironment{DoxyImageNoCaption}{% - \begin{center}% -}{% - \end{center}% -} - -% Used by @image -% (only if inline is specified) -\newenvironment{DoxyInlineImage}{% -}{% -} - -% Used by @attention -\newenvironment{DoxyAttention}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @author and @authors -\newenvironment{DoxyAuthor}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @date -\newenvironment{DoxyDate}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @invariant -\newenvironment{DoxyInvariant}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @note -\newenvironment{DoxyNote}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @post -\newenvironment{DoxyPostcond}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @pre -\newenvironment{DoxyPrecond}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @copyright -\newenvironment{DoxyCopyright}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @remark -\newenvironment{DoxyRemark}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @return and @returns -\newenvironment{DoxyReturn}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @since -\newenvironment{DoxySince}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @see -\newenvironment{DoxySeeAlso}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @version -\newenvironment{DoxyVersion}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @warning -\newenvironment{DoxyWarning}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by @par and @paragraph -\newenvironment{DoxyParagraph}[1]{% - \begin{DoxyDesc}{#1}% -}{% - \end{DoxyDesc}% -} - -% Used by parameter lists -\newenvironment{DoxyParams}[2][]{% - \tabulinesep=1mm% - \par% - \ifthenelse{\equal{#1}{}}% - {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description - {\ifthenelse{\equal{#1}{1}}% - {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc - {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc - } - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% - \hline% - \endfirsthead% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% - \hline% - \endhead% -}{% - \end{longtabu*}% - \vspace{6pt}% -} - -% Used for fields of simple structs -\newenvironment{DoxyFields}[1]{% - \tabulinesep=1mm% - \par% - \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}% - \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endfirsthead% - \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endhead% -}{% - \end{longtabu*}% - \vspace{6pt}% -} - -% Used for fields simple class style enums -\newenvironment{DoxyEnumFields}[1]{% - \tabulinesep=1mm% - \par% - \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endfirsthead% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endhead% -}{% - \end{longtabu*}% - \vspace{6pt}% -} - -% Used for parameters within a detailed function description -\newenvironment{DoxyParamCaption}{% - \renewcommand{\item}[2][]{\\ \hspace*{2.0cm} ##1 {\em ##2}}% -}{% -} - -% Used by return value lists -\newenvironment{DoxyRetVals}[1]{% - \tabulinesep=1mm% - \par% - \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endfirsthead% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endhead% -}{% - \end{longtabu*}% - \vspace{6pt}% -} - -% Used by exception lists -\newenvironment{DoxyExceptions}[1]{% - \tabulinesep=1mm% - \par% - \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endfirsthead% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endhead% -}{% - \end{longtabu*}% - \vspace{6pt}% -} - -% Used by template parameter lists -\newenvironment{DoxyTemplParams}[1]{% - \tabulinesep=1mm% - \par% - \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endfirsthead% - \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% - \hline% - \endhead% -}{% - \end{longtabu*}% - \vspace{6pt}% -} - -% Used for member lists -\newenvironment{DoxyCompactItemize}{% - \begin{itemize}% - \setlength{\itemsep}{-3pt}% - \setlength{\parsep}{0pt}% - \setlength{\topsep}{0pt}% - \setlength{\partopsep}{0pt}% -}{% - \end{itemize}% -} - -% Used for member descriptions -\newenvironment{DoxyCompactList}{% - \begin{list}{}{% - \setlength{\leftmargin}{0.5cm}% - \setlength{\itemsep}{0pt}% - \setlength{\parsep}{0pt}% - \setlength{\topsep}{0pt}% - \renewcommand{\makelabel}{\hfill}% - }% -}{% - \end{list}% -} - -% Used for reference lists (@bug, @deprecated, @todo, etc.) -\newenvironment{DoxyRefList}{% - \begin{list}{}{% - \setlength{\labelwidth}{10pt}% - \setlength{\leftmargin}{\labelwidth}% - \addtolength{\leftmargin}{\labelsep}% - \renewcommand{\makelabel}{\xreflabel}% - }% -}{% - \end{list}% -} - -% Used by @bug, @deprecated, @todo, etc. -\newenvironment{DoxyRefDesc}[1]{% - \begin{list}{}{% - \renewcommand\makelabel[1]{\textbf{##1}}% - \settowidth\labelwidth{\makelabel{#1}}% - \setlength\leftmargin{\labelwidth+\labelsep}% - }% -}{% - \end{list}% -} - -% Used by parameter lists and simple sections -\newenvironment{Desc} -{\begin{list}{}{% - \settowidth{\labelwidth}{20pt}% - \setlength{\parsep}{0pt}% - \setlength{\itemsep}{0pt}% - \setlength{\leftmargin}{\labelwidth+\labelsep}% - \renewcommand{\makelabel}{\entrylabel}% - } -}{% - \end{list}% -} - -% Used by tables -\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}% -\newenvironment{TabularC}[1]% -{\tabulinesep=1mm -\begin{longtabu*}spread 0pt [c]{*#1{|X[-1]}|}}% -{\end{longtabu*}\par}% - -\newenvironment{TabularNC}[1]% -{\begin{tabu}spread 0pt [l]{*#1{|X[-1]}|}}% -{\end{tabu}\par}% - -% Used for member group headers -\newenvironment{Indent}{% - \begin{list}{}{% - \setlength{\leftmargin}{0.5cm}% - }% - \item[]\ignorespaces% -}{% - \unskip% - \end{list}% -} - -% Used when hyperlinks are turned on -\newcommand{\doxylink}[2]{% - \mbox{\hyperlink{#1}{#2}}% -} - -% Used when hyperlinks are turned on -% Third argument is the SectionType, see the doxygen internal -% documentation for the values (relevant: Page ... Subsubsection). -\newcommand{\doxysectlink}[3]{% - \mbox{\hyperlink{#1}{#2}}% -} -% Used when hyperlinks are turned off -\newcommand{\doxyref}[3]{% - \textbf{#1} (\textnormal{#2}\,\pageref{#3})% -} - -% Used when hyperlinks are turned off -% Fourth argument is the SectionType, see the doxygen internal -% documentation for the values (relevant: Page ... Subsubsection). -\newcommand{\doxysectref}[4]{% - \textbf{#1} (\textnormal{#2}\,\pageref{#3})% -} - -% Used to link to a table when hyperlinks are turned on -\newcommand{\doxytablelink}[2]{% - \ref{#1}% -} - -% Used to link to a table when hyperlinks are turned off -\newcommand{\doxytableref}[3]{% - \ref{#3}% -} - -% Used by @addindex -\newcommand{\lcurly}{\{} -\newcommand{\rcurly}{\}} - -% Colors used for syntax highlighting -\definecolor{comment}{rgb}{0.5,0.0,0.0} -\definecolor{keyword}{rgb}{0.0,0.5,0.0} -\definecolor{keywordtype}{rgb}{0.38,0.25,0.125} -\definecolor{keywordflow}{rgb}{0.88,0.5,0.0} -\definecolor{preprocessor}{rgb}{0.5,0.38,0.125} -\definecolor{stringliteral}{rgb}{0.0,0.125,0.25} -\definecolor{charliteral}{rgb}{0.0,0.5,0.5} -\definecolor{xmlcdata}{rgb}{0.0,0.0,0.0} -\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0} -\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43} -\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0} -\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0} - -% Color used for table heading -\newcommand{\tableheadbgcolor}{lightgray}% - -% Version of hypertarget with correct landing location -\newcommand{\Hypertarget}[1]{\Hy@raisedlink{\hypertarget{#1}{}}} - -% possibility to have sections etc. be within the margins -% unfortunately had to copy part of book.cls and add \raggedright -\makeatletter -\newcounter{subsubsubsection}[subsubsection] -\newcounter{subsubsubsubsection}[subsubsubsection] -\newcounter{subsubsubsubsubsection}[subsubsubsubsection] -\newcounter{subsubsubsubsubsubsection}[subsubsubsubsubsection] -\renewcommand{\thesubsubsubsection}{\thesubsubsection.\arabic{subsubsubsection}} -\renewcommand{\thesubsubsubsubsection}{\thesubsubsubsection.\arabic{subsubsubsubsection}} -\renewcommand{\thesubsubsubsubsubsection}{\thesubsubsubsubsection.\arabic{subsubsubsubsubsection}} -\renewcommand{\thesubsubsubsubsubsubsection}{\thesubsubsubsubsubsection.\arabic{subsubsubsubsubsubsection}} -\newcommand{\subsubsubsectionmark}[1]{} -\newcommand{\subsubsubsubsectionmark}[1]{} -\newcommand{\subsubsubsubsubsectionmark}[1]{} -\newcommand{\subsubsubsubsubsubsectionmark}[1]{} -\def\toclevel@subsubsubsection{4} -\def\toclevel@subsubsubsubsection{5} -\def\toclevel@subsubsubsubsubsection{6} -\def\toclevel@subsubsubsubsubsubsection{7} -\def\toclevel@paragraph{8} -\def\toclevel@subparagraph{9} - -\newcommand\doxysection{\@startsection {section}{1}{\z@}% - {-3.5ex \@plus -1ex \@minus -.2ex}% - {2.3ex \@plus.2ex}% - {\raggedright\normalfont\Large\bfseries}} -\newcommand\doxysubsection{\@startsection{subsection}{2}{\z@}% - {-3.25ex\@plus -1ex \@minus -.2ex}% - {1.5ex \@plus .2ex}% - {\raggedright\normalfont\large\bfseries}} -\newcommand\doxysubsubsection{\@startsection{subsubsection}{3}{\z@}% - {-3.25ex\@plus -1ex \@minus -.2ex}% - {1.5ex \@plus .2ex}% - {\raggedright\normalfont\normalsize\bfseries}} -\newcommand\doxysubsubsubsection{\@startsection{subsubsubsection}{4}{\z@}% - {-3.25ex\@plus -1ex \@minus -.2ex}% - {1.5ex \@plus .2ex}% - {\raggedright\normalfont\normalsize\bfseries}} -\newcommand\doxysubsubsubsubsection{\@startsection{subsubsubsubsection}{5}{\z@}% - {-3.25ex\@plus -1ex \@minus -.2ex}% - {1.5ex \@plus .2ex}% - {\raggedright\normalfont\normalsize\bfseries}} -\newcommand\doxysubsubsubsubsubsection{\@startsection{subsubsubsubsubsection}{6}{\z@}% - {-3.25ex\@plus -1ex \@minus -.2ex}% - {1.5ex \@plus .2ex}% - {\raggedright\normalfont\normalsize\bfseries}} -\newcommand\doxysubsubsubsubsubsubsection{\@startsection{subsubsubsubsubsubsection}{7}{\z@}% - {-3.25ex\@plus -1ex \@minus -.2ex}% - {1.5ex \@plus .2ex}% - {\raggedright\normalfont\normalsize\bfseries}} -\newcommand\doxyparagraph{\@startsection{paragraph}{8}{\z@}% - {-3.25ex\@plus -1ex \@minus -.2ex}% - {1.5ex \@plus .2ex}% - {\raggedright\normalfont\normalsize\bfseries}} -\newcommand\doxysubparagraph{\@startsection{subparagraph}{9}{\parindent}% - {-3.25ex\@plus -1ex \@minus -.2ex}% - {1.5ex \@plus .2ex}% - {\raggedright\normalfont\normalsize\bfseries}} - -\newcommand\l@subsubsubsection{\@dottedtocline{4}{6.1em}{7.8em}} -\newcommand\l@subsubsubsubsection{\@dottedtocline{5}{6.1em}{9.4em}} -\newcommand\l@subsubsubsubsubsection{\@dottedtocline{6}{6.1em}{11em}} -\newcommand\l@subsubsubsubsubsubsection{\@dottedtocline{7}{6.1em}{12.6em}} -\renewcommand\l@paragraph{\@dottedtocline{8}{6.1em}{14.2em}} -\renewcommand\l@subparagraph{\@dottedtocline{9}{6.1em}{15.8em}} -\makeatother -% the sectsty doesn't look to be maintained but gives, in our case, some warning like: -% LaTeX Warning: Command \underline has changed. -% Check if current package is valid. -% unfortunately had to copy the relevant part -\newcommand*{\doxypartfont} [1] - {\gdef\SS@partnumberfont{\SS@sectid{0}\SS@nopart\SS@makeulinepartchap#1} - \gdef\SS@parttitlefont{\SS@sectid{0}\SS@titlepart\SS@makeulinepartchap#1}} -\newcommand*{\doxychapterfont} [1] - {\gdef\SS@chapnumfont{\SS@sectid{1}\SS@nopart\SS@makeulinepartchap#1} - \gdef\SS@chaptitlefont{\SS@sectid{1}\SS@titlepart\SS@makeulinepartchap#1}} -\newcommand*{\doxysectionfont} [1] - {\gdef\SS@sectfont{\SS@sectid{2}\SS@rr\SS@makeulinesect#1}} -\newcommand*{\doxysubsectionfont} [1] - {\gdef\SS@subsectfont{\SS@sectid{3}\SS@rr\SS@makeulinesect#1}} -\newcommand*{\doxysubsubsectionfont} [1] - {\gdef\SS@subsubsectfont{\SS@sectid{4}\SS@rr\SS@makeulinesect#1}} -\newcommand*{\doxyparagraphfont} [1] - {\gdef\SS@parafont{\SS@sectid{5}\SS@rr\SS@makeulinesect#1}} -\newcommand*{\doxysubparagraphfont} [1] - {\gdef\SS@subparafont{\SS@sectid{6}\SS@rr\SS@makeulinesect#1}} -\newcommand*{\doxyminisecfont} [1] - {\gdef\SS@minisecfont{\SS@sectid{7}\SS@rr\SS@makeulinepartchap#1}} -\newcommand*{\doxyallsectionsfont} [1] {\doxypartfont{#1}% - \doxychapterfont{#1}% - \doxysectionfont{#1}% - \doxysubsectionfont{#1}% - \doxysubsubsectionfont{#1}% - \doxyparagraphfont{#1}% - \doxysubparagraphfont{#1}% - \doxyminisecfont{#1}}% -% Define caption that is also suitable in a table -\makeatletter -\def\doxyfigcaption{% -\H@refstepcounter{figure}% -\@dblarg{\@caption{figure}}} -\makeatother - -% Define alpha enumarative names for counters > 26 -\makeatletter -\def\enumalphalphcnt#1{\expandafter\@enumalphalphcnt\csname c@#1\endcsname} -\def\@enumalphalphcnt#1{\alphalph{#1}} -\def\enumAlphAlphcnt#1{\expandafter\@enumAlphAlphcnt\csname c@#1\endcsname} -\def\@enumAlphAlphcnt#1{\AlphAlph{#1}} -\makeatother -\AddEnumerateCounter{\enumalphalphcnt}{\@enumalphalphcnt}{aa} -\AddEnumerateCounter{\enumAlphAlphcnt}{\@enumAlphAlphcnt}{AA} diff --git a/documentation/latex/etoc_doxygen.sty b/documentation/latex/etoc_doxygen.sty deleted file mode 100644 index 5f7e1274..00000000 --- a/documentation/latex/etoc_doxygen.sty +++ /dev/null @@ -1,2178 +0,0 @@ -%% -%% This is file etoc_doxygen.sty -%% -%% Apart from this header notice and the renaming from etoc to -%% etoc_doxygen (also in \ProvidesPackage) it is an identical -%% copy of -%% -%% etoc.sty -%% -%% at version 1.2b of 2023/07/01. -%% -%% This file has been provided to Doxygen team courtesy of the -%% author for benefit of users having a LaTeX installation not -%% yet providing version 1.2a or later of etoc, whose -%% deeplevels feature is required. -%% -%% The original source etoc.dtx (only of the latest version at -%% any given time) is available at -%% -%% https://ctan.org/pkg/etoc -%% -%% and contains the terms for copying and modification as well -%% as author contact information. -%% -%% In brief any modified versions of this file must be renamed -%% with new filenames distinct from etoc.sty. -%% -%% Package: etoc -%% Version: 1.2b -%% License: LPPL 1.3c -%% Copyright (C) 2012-2023 Jean-Francois B. -\NeedsTeXFormat{LaTeX2e}[2003/12/01] -\ProvidesPackage{etoc_doxygen}[2023/07/01 v1.2b Completely customisable TOCs (JFB)] -\newif\ifEtoc@oldLaTeX -\@ifl@t@r\fmtversion{2020/10/01} - {} - {\Etoc@oldLaTeXtrue - \PackageInfo{etoc}{Old LaTeX (\fmtversion) detected!\MessageBreak - Since 1.1a (2023/01/14), etoc prefers LaTeX at least\MessageBreak - as recent as 2020-10-01, for reasons of the .toc file,\MessageBreak - and used to require it (from 1.1a to 1.2).\MessageBreak - This etoc (1.2b) does not *require* it, but has not been\MessageBreak - tested thoroughly on old LaTeX (especially if document\MessageBreak - does not use hyperref) and retrofitting was done only\MessageBreak - on basis of author partial remembrances of old context.\MessageBreak - Reported}} -\RequirePackage{kvoptions} -\SetupKeyvalOptions{prefix=Etoc@} -\newif\ifEtoc@lof -\DeclareVoidOption{lof}{\Etoc@loftrue - \PackageInfo{etoc}{Experimental support for \string\locallistoffigures.\MessageBreak - Barely tested, use at own risk}% -} -\newif\ifEtoc@lot -\DeclareVoidOption{lot}{\Etoc@lottrue - \PackageInfo{etoc}{Experimental support for \string\locallistoftables.\MessageBreak - Barely tested, use at own risk}% -} -\@ifclassloaded{memoir}{ -\PackageInfo{etoc} - {As this is with memoir class, all `...totoc' options\MessageBreak - are set true by default. Reported} -\DeclareBoolOption[true]{maintoctotoc} -\DeclareBoolOption[true]{localtoctotoc} -\DeclareBoolOption[true]{localloftotoc} -\DeclareBoolOption[true]{locallottotoc} -}{ -\DeclareBoolOption[false]{maintoctotoc} -\DeclareBoolOption[false]{localtoctotoc} -\DeclareBoolOption[false]{localloftotoc} -\DeclareBoolOption[false]{locallottotoc} -} -\DeclareBoolOption[true]{ouroboros} -\DeclareBoolOption[false]{deeplevels} -\DeclareDefaultOption{\PackageWarning{etoc}{Option `\CurrentOption' is unknown.}} -\ProcessKeyvalOptions* -\DisableKeyvalOption[action=error,package=etoc]{etoc}{lof} -\DisableKeyvalOption[action=error,package=etoc]{etoc}{lot} -\DisableKeyvalOption[action=error,package=etoc]{etoc}{deeplevels} -\def\etocsetup#1{\setkeys{etoc}{#1}} -\def\etocifmaintoctotoc{\ifEtoc@maintoctotoc - \expandafter\@firstoftwo - \else - \expandafter\@secondoftwo - \fi} -\def\etociflocaltoctotoc{\ifEtoc@localtoctotoc - \expandafter\@firstoftwo - \else - \expandafter\@secondoftwo - \fi} -\def\etociflocalloftotoc{\ifEtoc@localloftotoc - \expandafter\@firstoftwo - \else - \expandafter\@secondoftwo - \fi} -\def\etociflocallottotoc{\ifEtoc@locallottotoc - \expandafter\@firstoftwo - \else - \expandafter\@secondoftwo - \fi} -\RequirePackage{multicol} -\def\etoc@{\etoc@} -\long\def\Etoc@gobtoetoc@ #1\etoc@{} -\newtoks\Etoc@toctoks -\def\Etoc@par{\par} -\def\etocinline{\def\Etoc@par{}} -\let\etocnopar\etocinline -\def\etocdisplay{\def\Etoc@par{\par}} -\let\Etoc@global\@empty -\def\etocglobaldefs{\let\Etoc@global\global\let\tof@global\global} -\def\etoclocaldefs {\let\Etoc@global\@empty\let\tof@global\@empty} -\newif\ifEtoc@numbered -\newif\ifEtoc@hyperref -\newif\ifEtoc@parskip -\newif\ifEtoc@tocwithid -\newif\ifEtoc@standardlines -\newif\ifEtoc@etocstyle -\newif\ifEtoc@classstyle -\newif\ifEtoc@keeporiginaltoc -\newif\ifEtoc@skipprefix -\newif\ifEtoc@isfirst -\newif\ifEtoc@localtoc -\newif\ifEtoc@skipthisone -\newif\ifEtoc@stoptoc -\newif\ifEtoc@notactive -\newif\ifEtoc@mustclosegroup -\newif\ifEtoc@isemptytoc -\newif\ifEtoc@checksemptiness -\def\etocchecksemptiness {\Etoc@checksemptinesstrue } -\def\etocdoesnotcheckemptiness {\Etoc@checksemptinessfalse } -\newif\ifEtoc@notocifnotoc -\def\etocnotocifnotoc {\Etoc@checksemptinesstrue\Etoc@notocifnotoctrue } -\newcounter{etoc@tocid} -\def\Etoc@tocext{toc} -\def\Etoc@lofext{lof} -\def\Etoc@lotext{lot} -\let\Etoc@currext\Etoc@tocext -\def\etocifislocal{\ifEtoc@localtoc\expandafter\@firstoftwo\else - \expandafter\@secondoftwo\fi - } -\def\etocifislocaltoc{\etocifislocal{\ifx\Etoc@currext\Etoc@tocext - \expandafter\@firstoftwo\else - \expandafter\@secondoftwo\fi}% - {\@secondoftwo}% - } -\def\etocifislocallof{\etocifislocal{\ifx\Etoc@currext\Etoc@lofext - \expandafter\@firstoftwo\else - \expandafter\@secondoftwo\fi}% - {\@secondoftwo}% - } -\def\etocifislocallot{\etocifislocal{\ifx\Etoc@currext\Etoc@lotext - \expandafter\@firstoftwo\else - \expandafter\@secondoftwo\fi}% - {\@secondoftwo}% - } -\expandafter\def\csname Etoc@-3@@\endcsname {-\thr@@} -\expandafter\def\csname Etoc@-2@@\endcsname {-\tw@} -\expandafter\let\csname Etoc@-1@@\endcsname \m@ne -\expandafter\let\csname Etoc@0@@\endcsname \z@ -\expandafter\let\csname Etoc@1@@\endcsname \@ne -\expandafter\let\csname Etoc@2@@\endcsname \tw@ -\expandafter\let\csname Etoc@3@@\endcsname \thr@@ -\expandafter\chardef\csname Etoc@4@@\endcsname 4 -\expandafter\chardef\csname Etoc@5@@\endcsname 5 -\expandafter\chardef\csname Etoc@6@@\endcsname 6 -\ifEtoc@deeplevels - \expandafter\chardef\csname Etoc@7@@\endcsname 7 - \expandafter\chardef\csname Etoc@8@@\endcsname 8 - \expandafter\chardef\csname Etoc@9@@\endcsname 9 - \expandafter\chardef\csname Etoc@10@@\endcsname 10 - \expandafter\chardef\csname Etoc@11@@\endcsname 11 - \expandafter\chardef\csname Etoc@12@@\endcsname 12 -\fi -\expandafter\let\expandafter\Etoc@maxlevel - \csname Etoc@\ifEtoc@deeplevels12\else6\fi @@\endcsname -\edef\etocthemaxlevel{\number\Etoc@maxlevel} -\@ifclassloaded{memoir}{\def\Etoc@minf{-\thr@@}}{\def\Etoc@minf{-\tw@}} -\let\Etoc@none@@ \Etoc@minf -\expandafter\let\expandafter\Etoc@all@@ - \csname Etoc@\ifEtoc@deeplevels11\else5\fi @@\endcsname -\let\Etoc@dolevels\@empty -\def\Etoc@newlevel #1{\expandafter\def\expandafter\Etoc@dolevels\expandafter - {\Etoc@dolevels\Etoc@do{#1}}} -\ifdefined\expanded - \def\etocsetlevel#1#2{\expanded{\noexpand\etoc@setlevel{#1}{#2}}}% -\else - \def\etocsetlevel#1#2{{\edef\Etoc@tmp{\noexpand\etoc@setlevel{#1}{#2}}\expandafter}\Etoc@tmp}% -\fi -\def\etoc@setlevel#1#2{% - \edef\Etoc@tmp{\the\numexpr#2}% - \if1\ifnum\Etoc@tmp>\Etoc@maxlevel0\fi\unless\ifnum\Etoc@minf<\Etoc@tmp;\fi1% - \ifEtoc@deeplevels - \in@{.#1,}{.none,.all,.figure,.table,.-3,.-2,.-1,.0,.1,.2,.3,.4,.5,.6,% - .7,.8,.9,.10,.11,.12,}% - \else - \in@{.#1,}{.none,.all,.figure,.table,.-3,.-2,.-1,.0,.1,.2,.3,.4,.5,.6,}% - \fi - \ifin@\else\if\@car#1\@nil @\in@true\fi\fi - \ifin@ - \PackageWarning{etoc} - {Sorry, but `#1' is forbidden as level name.\MessageBreak - \if\@car#1\@nil @% - (because of the @ as first character)\MessageBreak\fi - Reported}% - \else - \etocifunknownlevelTF{#1}{\Etoc@newlevel{#1}}{}% - \expandafter\let\csname Etoc@#1@@\expandafter\endcsname - \csname Etoc@\Etoc@tmp @@\endcsname - \expandafter\edef\csname Etoc@@#1@@\endcsname - {\expandafter\noexpand\csname Etoc@#1@@\endcsname}% - \expandafter\edef\csname toclevel@@#1\endcsname - {\expandafter\noexpand\csname toclevel@#1\endcsname}% - \fi - \else - \PackageWarning{etoc} - {Argument `\detokenize{#2}' of \string\etocsetlevel\space should - represent one of\MessageBreak - \ifnum\Etoc@minf=-\thr@@-2, \fi-1, 0, 1, 2, \ifEtoc@deeplevels ...\else3, 4\fi, - \the\numexpr\Etoc@maxlevel-1, or \number\Etoc@maxlevel\space - but evaluates to \Etoc@tmp.\MessageBreak - The level of `#1' will be set to \number\Etoc@maxlevel.\MessageBreak - Tables of contents will ignore `#1' as long\MessageBreak - as its level is \number\Etoc@maxlevel\space (=\string\etocthemaxlevel).% - \MessageBreak - Reported}% - \etocifunknownlevelTF{#1}{\Etoc@newlevel{#1}}{}% - \expandafter\let\csname Etoc@#1@@\endcsname\Etoc@maxlevel - \fi -} -\def\etoclevel#1{\csname Etoc@#1@@\endcsname} -\def\etocthelevel#1{\number\csname Etoc@#1@@\endcsname} -\def\etocifunknownlevelTF#1{\@ifundefined{Etoc@#1@@}} -\@ifclassloaded{memoir}{\etocsetlevel{book}{-2}}{} -\etocsetlevel{part}{-1} -\etocsetlevel{chapter}{0} -\etocsetlevel{section}{1} -\etocsetlevel{subsection}{2} -\etocsetlevel{subsubsection}{3} -\etocsetlevel{paragraph}{4} -\etocsetlevel{subparagraph}{5} -\ifdefined\c@chapter - \etocsetlevel{appendix}{0} -\else - \etocsetlevel{appendix}{1} -\fi -\def\Etoc@do#1{\@namedef{l@@#1}{\csname l@#1\endcsname}} -\Etoc@dolevels -\let\Etoc@figure@@\Etoc@maxlevel -\let\Etoc@table@@ \Etoc@maxlevel -\let\Etoc@gobblethreeorfour\@gobblefour -\ifdefined\@gobblethree - \let\Etoc@gobblethree\@gobblethree -\else - \long\def\Etoc@gobblethree#1#2#3{}% -\fi -\AtBeginDocument{% -\@ifpackageloaded{parskip}{\Etoc@parskiptrue}{}% -\@ifpackageloaded{hyperref} - {\Etoc@hyperreftrue} - {\ifEtoc@oldLaTeX - \let\Etoc@gobblethreeorfour\Etoc@gobblethree - \let\Etoc@etoccontentsline@fourargs\Etoc@etoccontentsline@ - \long\def\Etoc@etoccontentsline@#1#2#3{% - \Etoc@etoccontentsline@fourargs{#1}{#2}{#3}{}% - }% - \fi - }% -} -\def\etocskipfirstprefix {\global\Etoc@skipprefixtrue } -\def\Etoc@updatestackofends#1\etoc@{\gdef\Etoc@stackofends{#1}} -\def\Etoc@stackofends{{-3}{}} -\def\Etoc@doendsandbegin{% - \expandafter\Etoc@traversestackofends\Etoc@stackofends\etoc@ -} -\def\Etoc@traversestackofends#1{% - \ifnum#1>\Etoc@level - \csname Etoc@end@#1\endcsname - \expandafter\Etoc@traversestackofends - \else - \Etoc@traversestackofends@done{#1}% - \fi -} -\def\Etoc@traversestackofends@done#1#2{#2% - \ifnum#1<\Etoc@level - \csname Etoc@begin@\the\numexpr\Etoc@level\endcsname - \Etoc@global\Etoc@isfirsttrue - \edef\Etoc@tmp{{\the\numexpr\Etoc@level}}% - \else - \Etoc@global\Etoc@isfirstfalse - \let\Etoc@tmp\@empty - \fi - \expandafter\Etoc@updatestackofends\Etoc@tmp{#1}% -} -\def\Etoc@etoccontentsline #1{% - \let\Etoc@next\Etoc@gobblethreeorfour - \ifnum\csname Etoc@#1@@\endcsname=\Etoc@maxlevel - \else - \Etoc@skipthisonefalse - \global\expandafter\let\expandafter\Etoc@level\csname Etoc@#1@@\endcsname - \if @\@car#1\@nil\else\global\let\Etoc@virtualtop\Etoc@level\fi - \ifEtoc@localtoc - \ifEtoc@stoptoc - \Etoc@skipthisonetrue - \else - \ifEtoc@notactive - \Etoc@skipthisonetrue - \else - \unless\ifnum\Etoc@level>\etoclocaltop - \Etoc@skipthisonetrue - \global\Etoc@stoptoctrue - \fi - \fi - \fi - \fi - \ifEtoc@skipthisone - \else - \unless\ifnum\Etoc@level>\c@tocdepth - \ifEtoc@standardlines - \let\Etoc@next\Etoc@savedcontentsline - \else - \let\Etoc@next\Etoc@etoccontentsline@ - \fi - \fi - \fi - \fi - \Etoc@next{#1}% -} -\def\Etoc@etoccontentsline@ #1#2#3#4{% - \Etoc@doendsandbegin - \Etoc@global\edef\Etoc@prefix {\expandafter\noexpand - \csname Etoc@prefix@\the\numexpr\Etoc@level\endcsname }% - \Etoc@global\edef\Etoc@contents{\expandafter\noexpand - \csname Etoc@contents@\the\numexpr\Etoc@level\endcsname }% - \ifEtoc@skipprefix \Etoc@global\def\Etoc@prefix{\@empty}\fi - \global\Etoc@skipprefixfalse - \Etoc@lxyz{#2}{#3}{#4}% - \Etoc@prefix - \Etoc@contents -} -\def\Etoc@lxyz #1#2#3{% - \ifEtoc@hyperref - \Etoc@global\def\etocthelink##1{\hyperlink{#3}{##1}}% - \else - \Etoc@global\let\etocthelink\@firstofone - \fi - \Etoc@global\def\etocthepage {#2}% - \ifEtoc@hyperref - \ifx\etocthepage\@empty - \Etoc@global\let\etocthelinkedpage\@empty - \else - \Etoc@global\def\etocthelinkedpage{\hyperlink {#3}{#2}}% - \fi - \else - \Etoc@global\let\etocthelinkedpage\etocthepage - \fi - \Etoc@global\def\etocthename{#1}% - \futurelet\Etoc@getnb@token\Etoc@@getnb #1\hspace\etoc@ - \ifEtoc@hyperref - \def\Etoc@tmp##1##2{\Etoc@global\def##2{\hyperlink{#3}{##1}}}% - \expandafter\Etoc@tmp\expandafter{\etocthename}\etocthelinkedname - \ifEtoc@numbered - \expandafter\Etoc@tmp\expandafter{\etocthenumber}\etocthelinkednumber - \else - \Etoc@global\let\etocthelinkednumber\@empty - \fi - \else - \Etoc@global\let\etocthelinkedname \etocthename - \Etoc@global\let\etocthelinkednumber\etocthenumber - \fi - \Etoc@global\expandafter\let\csname etoclink \endcsname \etocthelink - \Etoc@global\expandafter\let\csname etocname \endcsname \etocthename - \Etoc@global\expandafter\let\csname etocnumber \endcsname\etocthenumber - \Etoc@global\expandafter\let\csname etocpage \endcsname \etocthepage - \ifEtoc@hyperref - \Etoc@lxyz@linktoc - \fi -} -\def\Etoc@lxyz@linktoc{% - \ifcase\Hy@linktoc - \or - \Etoc@global\expandafter\let\csname etocname \endcsname\etocthelinkedname - \Etoc@global\expandafter\let\csname etocnumber \endcsname\etocthelinkednumber - \or % page - \Etoc@global\expandafter\let\csname etocpage \endcsname\etocthelinkedpage - \else % all - \Etoc@global\expandafter\let\csname etocname \endcsname\etocthelinkedname - \Etoc@global\expandafter\let\csname etocnumber \endcsname\etocthelinkednumber - \Etoc@global\expandafter\let\csname etocpage \endcsname\etocthelinkedpage - \fi -} -\def\Etoc@@getnb {% - \let\Etoc@next\Etoc@getnb - \ifx\Etoc@getnb@token\@sptoken\let\Etoc@next\Etoc@getnb@nonbr\fi - \ifx\Etoc@getnb@token\bgroup \let\Etoc@next\Etoc@getnb@nonbr\fi - \Etoc@next -} -\def\Etoc@getnb #1{% - \in@{#1}{\numberline\chapternumberline\partnumberline\booknumberline}% - \ifin@ - \let\Etoc@next\Etoc@getnb@nmbrd - \else - \ifnum\Etoc@level=\m@ne - \let\Etoc@next\Etoc@@getit - \else - \let\Etoc@next\Etoc@getnb@nonbr - \fi - \in@{#1}{\nonumberline}% - \ifin@ - \let\Etoc@next\Etoc@getnb@nonumberline - \fi - \fi - \Etoc@next #1% -} -\def\Etoc@getnb@nmbrd #1#2{% - \Etoc@global\Etoc@numberedtrue - \Etoc@global\def\etocthenumber {#2}% - \Etoc@getnb@nmbrd@getname\@empty -}% -\def\Etoc@getnb@nmbrd@getname #1\hspace\etoc@ {% - \Etoc@global\expandafter\def\expandafter\etocthename\expandafter{#1}% -} -\def\Etoc@getnb@nonbr #1\etoc@ {% - \Etoc@global\Etoc@numberedfalse - \Etoc@global\let\etocthenumber \@empty -} -\def\Etoc@getnb@nonumberline #1\hspace\etoc@ {% - \Etoc@global\Etoc@numberedfalse - \Etoc@global\let\etocthenumber \@empty - \Etoc@global\expandafter\def\expandafter\etocthename\expandafter{\@gobble#1}% -} -\def\Etoc@@getit #1\hspace#2{% - \ifx\etoc@#2% - \Etoc@global\Etoc@numberedfalse - \Etoc@global\let\etocthenumber \@empty - \else - \Etoc@global\Etoc@numberedtrue - \Etoc@global\def\etocthenumber {#1}% - \expandafter\Etoc@getit@getname \expandafter\@empty - \fi -} -\def\Etoc@getit@getname #1\hspace\etoc@ {% - \Etoc@global\expandafter\def\expandafter\etocthename\expandafter{#1}% -} -\let\etocthename \@empty -\let\etocthenumber \@empty -\let\etocthepage \@empty -\let\etocthelinkedname \@empty -\let\etocthelinkednumber \@empty -\let\etocthelinkedpage \@empty -\let\etocthelink \@firstofone -\DeclareRobustCommand*{\etocname} {} -\DeclareRobustCommand*{\etocnumber}{} -\DeclareRobustCommand*{\etocpage} {} -\DeclareRobustCommand*{\etoclink} {\@firstofone} -\DeclareRobustCommand*{\etocifnumbered} - {\ifEtoc@numbered\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi} -\expandafter\let\expandafter\etocxifnumbered\csname etocifnumbered \endcsname -\DeclareRobustCommand*{\etociffirst} - {\ifEtoc@isfirst\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi} -\expandafter\let\expandafter\etocxiffirst\csname etociffirst \endcsname -\def\Etoc@readtoc {% - \ifeof \Etoc@tf - \else - \read \Etoc@tf to \Etoc@buffer - \Etoc@toctoks=\expandafter\expandafter\expandafter - {\expandafter\the\expandafter\Etoc@toctoks\Etoc@buffer}% - \expandafter\Etoc@readtoc - \fi -} -\Etoc@toctoks {}% (superfluous, but for clarity) -\AtBeginDocument{\IfFileExists{\jobname.toc} - {{\endlinechar=\m@ne - \makeatletter - \newread\Etoc@tf - \openin\Etoc@tf\@filef@und - \Etoc@readtoc - \global\Etoc@toctoks=\expandafter{\the\Etoc@toctoks}% - \closein\Etoc@tf}} - {\typeout{No file \jobname.toc.}}} -\def\Etoc@openouttoc{% - \ifEtoc@hyperref - \ifx\hyper@last\@undefined - \IfFileExists{\jobname .toc} - {\Hy@WarningNoLine - {old toc file detected; run LaTeX again (cheers from `etoc')}% - \global\Etoc@toctoks={}% - } - {}% - \fi - \fi - \if@filesw - \newwrite \tf@toc - \immediate \openout \tf@toc \jobname .toc\relax - \fi - \global\let\Etoc@openouttoc\empty -} -\def\Etoc@toctoc{% - \gdef\Etoc@stackofends{{-3}{}}% - \global\let\Etoc@level\Etoc@minf - \global\let\Etoc@virtualtop\Etoc@minf - \the\Etoc@toctoks - \ifEtoc@notactive - \else - \gdef\Etoc@level{-\thr@@}% - \Etoc@doendsandbegin - \fi -} -\def\Etoc@@startlocaltoc#1#2{% - \ifEtoc@localtoc - \ifnum #1=#2\relax - \global\let\etoclocaltop\Etoc@virtualtop - \Etoc@@startlocaltochook - \etoclocaltableofcontentshook - \ifEtoc@etocstyle - \etocetoclocaltocmaketitle - \fi - \ifx\Etoc@aftertitlehook\@empty - \else - \ifEtoc@localtoctotoc - \ifEtoc@ouroboros - \else - \let\Etoc@tmp\contentsline - \def\contentsline{\let\contentsline\Etoc@tmp\Etoc@gobblethreeorfour}% - \fi - \fi - \fi - \global\Etoc@notactivefalse - \fi - \fi -} -\let\etoc@startlocaltoc\@gobble -\let\Etoc@@startlocaltoc@toc\Etoc@@startlocaltoc -\let\Etoc@@startlocaltochook\@empty -\unless\ifEtoc@deeplevels - \def\etocdivisionnameatlevel#1{% - \ifcase\numexpr#1\relax - \ifdefined\c@chapter chapter\else section\fi% - \or section% - \or subsection% - \or subsubsection% - \or paragraph% - \or subparagraph% - \or empty% - \else\ifnum\numexpr#1<\m@ne - book% - \else - part% - \fi - \fi - } -\else - \def\etocdivisionnameatlevel#1{% - \ifcase\numexpr#1\relax - \ifdefined\c@chapter chapter\else section\fi% - \or section% - \or subsection% - \or subsubsection% - \or subsubsubsection% - \or subsubsubsubsection% - \or subsubsubsubsubsection% - \or subsubsubsubsubsubsection% - \or paragraph% - \or subparagraph% - \else\ifnum\numexpr#1>\z@ - empty% - \else\ifnum\numexpr#1=\m@ne - part% - \else - book% - \fi\fi - \fi - } -\fi -\def\etoclocalheadtotoc#1#2{\addcontentsline{toc}{@#1}{#2}} -\def\etocglobalheadtotoc{\addcontentsline{toc}} -\providecommand*\UseName{\@nameuse} -\def\etocetoclocaltocmaketitle{% - \UseName{\etocdivisionnameatlevel{\etoclocaltop+1}}*{\localcontentsname}% - \if@noskipsec\leavevmode\par\fi - \etociflocaltoctotoc - {\etocifisstarred - {}% star variant, do not add to toc - {\etoclocalheadtotoc - {\etocdivisionnameatlevel{\etoclocaltop+1}}% - {\localcontentsname}% - }% - }% - {}% -}% -\def\localcontentsname {\contentsname}% -\let\etoclocaltableofcontentshook\@empty -\if1\ifEtoc@lof0\fi\ifEtoc@lot0\fi1% -\else -\AtBeginDocument{% - \let\Etoc@originaladdcontentsline\addcontentsline - \def\addcontentsline{\Etoc@hackedaddcontentsline}% -}% -\fi -\ifEtoc@lof - \ifEtoc@lot - \def\Etoc@hackedaddcontentsline#1{% - \expanded{\noexpand\in@{.#1,}}{.lof,.lot,}% - \ifin@\expandafter\Etoc@hackedaddcontentsline@i - \else\expandafter\Etoc@originaladdcontentsline - \fi {#1}} - \else - \def\Etoc@hackedaddcontentsline#1{% - \expanded{\noexpand\in@{.#1,}}{.lof,}% - \ifin@\expandafter\Etoc@hackedaddcontentsline@i - \else\expandafter\Etoc@originaladdcontentsline - \fi {#1}} - \fi -\else - \def\Etoc@hackedaddcontentsline#1{% - \expanded{\noexpand\in@{.#1,}}{.lot,}% - \ifin@\expandafter\Etoc@hackedaddcontentsline@i - \else\expandafter\Etoc@originaladdcontentsline - \fi {#1}} -\fi -\def\Etoc@hackedaddcontentsline@i#1#2#3{% - \expanded{\noexpand\in@{.#1;#2,}}{.lof;figure,.lot;table,}% - \ifin@ - \addtocontents {toc}{% - \protect\contentsline{#2}{#3}{\thepage}{\ifEtoc@hyperref\@currentHref\fi}% - \ifdefined\protected@file@percent\protected@file@percent\fi - }% - \fi - \Etoc@originaladdcontentsline{#1}{#2}{#3}% -} -\unless\ifdefined\expanded - \def\Etoc@hackedaddcontentsline#1{% - {\edef\Etoc@tmp{\noexpand\in@{.#1,}{\ifEtoc@lof.lof,\fi\ifEtoc@lot.lot,\fi}}\expandafter}% - \Etoc@tmp - \ifin@\expandafter\Etoc@hackedaddcontentsline@i - \else\expandafter\Etoc@originaladdcontentsline - \fi {#1}% - } - \def\Etoc@hackedaddcontentsline@i#1#2#3{% - {\edef\Etoc@tmp{\noexpand\in@{.#1;#2,}}\expandafter}% - \Etoc@tmp{.lof;figure,.lot;table,}% - \ifin@ - \addtocontents {toc}{% - \protect\contentsline{#2}{#3}{\thepage}{\ifEtoc@hyperref\@currentHref\fi}% - \ifdefined\protected@file@percent\protected@file@percent\fi - }% - \fi - \Etoc@originaladdcontentsline{#1}{#2}{#3}% - } -\fi -\def\Etoc@@startlocallistof#1#2#3{% - \ifEtoc@localtoc - \ifnum #2=#3\relax - \global\let\etoclocaltop\Etoc@virtualtop - \global\Etoc@notactivefalse - \Etoc@@startlocaltochook - \csname etoclocallistof#1shook\endcsname - \ifEtoc@etocstyle - \csname etocetoclistof#1smaketitle\endcsname - \fi - \fi - \fi -} -\def\Etoc@@startlocallistof@setlevels#1{% - \ifnum\etoclocaltop<\z@ - \expandafter\let\csname Etoc@#1@@\endcsname\@ne - \else - \expandafter\let\csname Etoc@#1@@\expandafter\endcsname - \csname Etoc@\the\numexpr\etoclocaltop+\@ne @@\endcsname - \fi - \def\Etoc@do##1{% - \ifnum\etoclevel{##1}>\etoclocaltop - \expandafter\let\csname Etoc@##1@@\endcsname\Etoc@maxlevel - \fi}% - \Etoc@dolevels -} -\def\etoclocallistoffigureshook{\etocstandardlines} -\def\etoclocallistoftableshook {\etocstandardlines} -\def\locallistfigurename{\listfigurename} -\def\locallisttablename {\listtablename} -\def\etocetoclistoffiguresmaketitle{% - \UseName{\etocdivisionnameatlevel{\etoclocaltop+1}}*{\locallistfigurename}% - \ifnum\etoclocaltop>\tw@\mbox{}\par\fi - \etociflocalloftotoc - {\etocifisstarred - {}% star variant, do not add to toc - {\etoclocalheadtotoc - {\etocdivisionnameatlevel{\etoclocaltop+1}}% - {\locallistfigurename}% - }% - }% - {}% -}% -\def\etocetoclistoftablesmaketitle{% - \UseName{\etocdivisionnameatlevel{\etoclocaltop+1}}*{\locallisttablename}% - \ifnum\etoclocaltop>\tw@\mbox{}\par\fi - \etociflocallottotoc - {\etocifisstarred - {}% star variant, do not add to toc - {\etoclocalheadtotoc - {\etocdivisionnameatlevel{\etoclocaltop+1}}% - {\locallisttablename}% - }% - }% - {}% -}% -\let\Etoc@listofreset\@empty -\ifEtoc@lof - \def\locallistoffigures{% - \def\Etoc@listofreset{% - \let\Etoc@currext\Etoc@tocext - \let\Etoc@@startlocaltoc\Etoc@@startlocaltoc@toc - \let\Etoc@@startlocaltochook\@empty - \let\Etoc@listofreset\@empty - \let\Etoc@listofhook\@empty - }% - \let\Etoc@currext\Etoc@lofext - \def\Etoc@@startlocaltoc{\Etoc@@startlocallistof{figure}}% - \def\Etoc@@startlocaltochook{\Etoc@@startlocallistof@setlevels{figure}}% - \def\Etoc@listofhook{% - \def\Etoc@do####1{% - \expandafter\let\csname Etoc@@####1@@\endcsname\Etoc@maxlevel - }% - \Etoc@dolevels - }% - \localtableofcontents - } -\else - \def\locallistoffigures{% - \PackageError{etoc}{% - \string\locallistoffigures \on@line\space but\MessageBreak - package was loaded without `lof' option}% - {Try again with \string\usepackage[lof]{etoc}}% - } -\fi -\ifEtoc@lot - \def\locallistoftables{% - \def\Etoc@listofreset{% - \let\Etoc@currext\Etoc@tocext - \let\Etoc@@startlocaltoc\Etoc@@startlocaltoc@toc - \let\Etoc@@startlocaltochook\@empty - \let\Etoc@listofreset\@empty - \let\Etoc@listofhook\@empty - }% - \let\Etoc@currext\Etoc@lotext - \def\Etoc@@startlocaltoc{\Etoc@@startlocallistof{table}}% - \def\Etoc@@startlocaltochook{\Etoc@@startlocallistof@setlevels{table}}% - \def\Etoc@listofhook{% - \def\Etoc@do####1{% - \expandafter\let\csname Etoc@@####1@@\endcsname\Etoc@maxlevel - }% - \Etoc@dolevels - }% - \localtableofcontents - } -\else - \def\locallistoftables{% - \PackageError{etoc}{% - \string\locallistoftable \on@line\space but\MessageBreak - package was loaded without `lot' option}% - {Try again with \string\usepackage[lot]{etoc}}% - } -\fi -\def\Etoc@checkifempty {% - \global\Etoc@isemptytoctrue - \global\Etoc@stoptocfalse - \global\let\Etoc@level\Etoc@minf - \global\let\Etoc@virtualtop\Etoc@minf - \gdef\Etoc@stackofends{{-3}{}}% - \begingroup - \ifEtoc@localtoc - \def\etoc@startlocaltoc##1{% - \ifnum##1=\Etoc@tocid\relax - \global\let\etoclocaltop\Etoc@virtualtop - \Etoc@@startlocaltochook - \global\Etoc@notactivefalse - \fi - }% - \let\contentsline\Etoc@testingcontentslinelocal - \else - \let\contentsline\Etoc@testingcontentsline - \fi - \Etoc@storetocdepth - \let\Etoc@setlocaltop@doendsandbegin\@empty - \the\Etoc@toctoks - \Etoc@restoretocdepth - \endgroup -} -\DeclareRobustCommand*\etocifwasempty - {\ifEtoc@isemptytoc\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi } -\expandafter\let\expandafter\etocxifwasempty\csname etocifwasempty \endcsname -\def\Etoc@testingcontentslinelocal #1{% - \ifEtoc@stoptoc - \else - \ifnum\csname Etoc@#1@@\endcsname=\Etoc@maxlevel - \else - \global\expandafter\let\expandafter\Etoc@level\csname Etoc@#1@@\endcsname - \if @\@car#1\@nil\else\global\let\Etoc@virtualtop\Etoc@level\fi - \ifEtoc@notactive - \else - \ifnum\Etoc@level>\etoclocaltop - \unless\ifnum\Etoc@level>\c@tocdepth - \global\Etoc@isemptytocfalse - \global\Etoc@stoptoctrue - \fi - \else - \global\Etoc@stoptoctrue - \fi - \fi - \fi - \fi - \Etoc@gobblethreeorfour{}% -} -\def\Etoc@testingcontentsline #1{% - \ifEtoc@stoptoc - \else - \ifnum\csname Etoc@#1@@\endcsname=\Etoc@maxlevel - \else - \unless\ifnum\csname Etoc@#1@@\endcsname>\c@tocdepth - \global\Etoc@isemptytocfalse - \global\Etoc@stoptoctrue - \fi - \fi - \fi - \Etoc@gobblethreeorfour{}% -} -\def\Etoc@localtableofcontents#1{% - \gdef\etoclocaltop{-\@m}% - \Etoc@localtoctrue - \global\Etoc@isemptytocfalse - \edef\Etoc@tocid{#1}% - \ifnum\Etoc@tocid<\@ne - \setbox0\hbox{\ref{Unknown toc ref \@secondoftwo#1. \space Rerun LaTeX}}% - \global\Etoc@stoptoctrue - \gdef\etoclocaltop{-\thr@@}% - \Etoc@tableofcontents - \expandafter\Etoc@gobtoetoc@ - \fi - \global\Etoc@notactivetrue - \ifEtoc@checksemptiness - \Etoc@checkifempty - \fi - \ifEtoc@isemptytoc - \ifEtoc@notactive - \setbox0\hbox{\ref{Unknown toc ID \number\Etoc@tocid. \space Rerun LaTeX}}% - \global\Etoc@isemptytocfalse - \global\Etoc@stoptoctrue - \gdef\etoclocaltop{-\thr@@}% - \Etoc@tableofcontents - \expandafter\expandafter\expandafter\Etoc@gobtoetoc@ - \fi - \else - \global\Etoc@stoptocfalse - \global\Etoc@notactivetrue - \edef\etoc@startlocaltoc##1% - {\noexpand\Etoc@@startlocaltoc{##1}{\Etoc@tocid}}% - \Etoc@tableofcontents - \fi - \@gobble\etoc@ - \endgroup\ifEtoc@mustclosegroup\endgroup\fi - \Etoc@tocdepthreset - \Etoc@listofreset - \etocaftertochook -}% \Etoc@localtableofcontents -\def\Etoc@getref #1{% - \@ifundefined{r@#1} - {0} - {\expandafter\Etoc@getref@i\romannumeral-`0% - \expandafter\expandafter\expandafter - \@car\csname r@#1\endcsname0\@nil\@etoc - }% -} -\def\Etoc@getref@i#1#2\@etoc{\ifnum9<1\string#1 #1#2\else 0\fi} -\def\Etoc@ref#1{\Etoc@localtableofcontents{\Etoc@getref{#1}}} -\def\Etoc@label#1{\label{#1}\futurelet\Etoc@nexttoken\Etoc@t@bleofcontents} -\@firstofone{\def\Etoc@again} {\futurelet\Etoc@nexttoken\Etoc@t@bleofcontents} -\def\Etoc@dothis #1#2\etoc@ {\fi #1} -\def\Etoc@t@bleofcontents{% - \gdef\etoclocaltop{-\@M}% - \ifx\Etoc@nexttoken\label\Etoc@dothis{\expandafter\Etoc@label\@gobble}\fi - \ifx\Etoc@nexttoken\@sptoken\Etoc@dothis{\Etoc@again}\fi - \ifx\Etoc@nexttoken\ref\Etoc@dothis{\expandafter\Etoc@ref\@gobble}\fi - \ifEtoc@tocwithid\Etoc@dothis{\Etoc@localtableofcontents{\c@etoc@tocid}}\fi - \global\Etoc@isemptytocfalse - \ifEtoc@checksemptiness\Etoc@checkifempty\fi - \ifEtoc@isemptytoc - \ifEtoc@notocifnotoc - \expandafter\expandafter\expandafter\@gobble - \fi - \fi - \Etoc@tableofcontents - \endgroup - \ifEtoc@mustclosegroup\endgroup\fi - \Etoc@tocdepthreset - \Etoc@listofreset - \etocaftertochook - \@gobble\etoc@ - }% \Etoc@t@bleofcontents -\def\Etoc@table@fcontents{% - \refstepcounter{etoc@tocid}% - \Etoc@tocwithidfalse - \futurelet\Etoc@nexttoken\Etoc@t@bleofcontents -} -\def\Etoc@localtable@fcontents{% - \refstepcounter{etoc@tocid}% - \addtocontents{toc}{\string\etoc@startlocaltoc{\the\c@etoc@tocid}}% - \Etoc@tocwithidtrue - \futurelet\Etoc@nexttoken\Etoc@t@bleofcontents -} -\def\etoctableofcontents{% - \Etoc@openouttoc - \Etoc@tocdepthset - \begingroup - \@ifstar - {\let\Etoc@aftertitlehook\@empty\Etoc@table@fcontents} - {\def\Etoc@aftertitlehook{\etocaftertitlehook}\Etoc@table@fcontents}% -}% \etoctableofcontents -\def\etocifisstarred{\ifx\Etoc@aftertitlehook\@empty - \expandafter\@firstoftwo\else - \expandafter\@secondoftwo - \fi} -\let\etocoriginaltableofcontents\tableofcontents -\let\tableofcontents\etoctableofcontents -\let\Etoc@listofhook\@empty -\newcommand*\localtableofcontents{% - \Etoc@openouttoc - \Etoc@tocdepthset - \begingroup - \Etoc@listofhook - \@ifstar - {\let\Etoc@aftertitlehook\@empty\Etoc@localtable@fcontents} - {\def\Etoc@aftertitlehook{\etocaftertitlehook}\Etoc@localtable@fcontents}% -}% \localtableofcontents -\newcommand*\localtableofcontentswithrelativedepth[1]{% - \def\Etoc@@startlocaltochook{% - \global\c@tocdepth\numexpr\etoclocaltop+#1\relax - }% - \def\Etoc@listofreset{\let\Etoc@@startlocaltochook\@empty - \let\Etoc@listofreset\@empty}% - \localtableofcontents -}% \localtableofcontentswithrelativedepth -\newcommand\etocsettocstyle[2]{% - \Etoc@etocstylefalse - \Etoc@classstylefalse - \def\Etoc@tableofcontents@user@before{#1}% - \def\Etoc@tableofcontents@user@after {#2}% -}% -\def\etocstoretocstyleinto#1{% -%% \@ifdefinable#1{% - \edef#1{\noexpand\Etoc@etocstylefalse\noexpand\Etoc@classstylefalse - \def\noexpand\Etoc@tableofcontents@user@before{% - \unexpanded\expandafter{\Etoc@tableofcontents@user@before}% - }% - \def\noexpand\Etoc@tableofcontents@user@after{% - \unexpanded\expandafter{\Etoc@tableofcontents@user@after}% - }% - }% -%% }% -}% -\def\Etoc@tableofcontents {% - \Etoc@tableofcontents@etoc@before - \ifEtoc@localtoc\ifEtoc@etocstyle\expandafter\expandafter\expandafter\@gobble\fi\fi - \Etoc@tableofcontents@user@before - \Etoc@tableofcontents@contents - \ifEtoc@localtoc\ifEtoc@etocstyle\expandafter\expandafter\expandafter\@gobble\fi\fi - \Etoc@tableofcontents@user@after - \Etoc@tableofcontents@etoc@after - \@gobble\etoc@ -} -\def\Etoc@tableofcontents@etoc@before{% - \ifnum\c@tocdepth>\Etoc@minf - \else - \expandafter\Etoc@gobtoetoc@ - \fi - \Etoc@par - \Etoc@beforetitlehook - \etocbeforetitlehook - \Etoc@storetocdepth - \let\Etoc@savedcontentsline\contentsline - \let\contentsline\Etoc@etoccontentsline - \ifEtoc@standardlines - \else - \def\Etoc@do##1{% - \expandafter\def\csname etocsaved##1tocline\endcsname - {\PackageError{etoc}{% - \expandafter\string\csname etocsaved##1tocline\endcsname\space - has been deprecated\MessageBreak - at 1.1a and is removed at 1.2.\MessageBreak - Use \expandafter\string\csname l@##1\endcsname\space directly.\MessageBreak - Reported \on@line}% - {I will use \expandafter\string - \csname l@##1\endcsname\space myself for this time.% - }% - \csname l@##1\endcsname - }% - }% - \Etoc@dolevels - \fi -}% -\def\Etoc@tableofcontents@contents{% - \Etoc@tocdepthset - \ifEtoc@parskip\parskip\z@skip\fi - \Etoc@aftertitlehook - \gdef\etoclocaltop{-\thr@@}% - \Etoc@toctoc - \etocaftercontentshook -}% -\def\Etoc@tableofcontents@etoc@after{% - \@nobreakfalse - \Etoc@restoretocdepth - \ifx\Etoc@global\global - \@ifundefined{tof@finish} - {} - {\ifx\tof@finish\@empty - \else - \global\let\contentsline\Etoc@savedcontentsline - \fi - }% - \fi -} -\def\etocsetstyle#1{\ifcsname Etoc@#1@@\endcsname - \expandafter\Etoc@setstyle@a - \else - \expandafter\Etoc@setstyle@error - \fi {#1}% -} -\def\Etoc@setstyle@error #1{% - \PackageWarning{etoc}{`#1' is unknown to etoc. \space Did you\MessageBreak - forget some \string\etocsetlevel{#1}{}?\MessageBreak - Reported}% - \@gobblefour -} -\def\Etoc@setstyle@a #1{% - \edef\Etoc@tmp{\the\numexpr\csname Etoc@#1@@\endcsname}% - \if1\unless\ifnum\Etoc@tmp<\Etoc@maxlevel 0\fi - \unless\ifnum\Etoc@tmp>\Etoc@minf 0\fi1% - \Etoc@standardlinesfalse - \expandafter\Etoc@setstyle@b\expandafter\Etoc@tmp - \else - \ifnum\Etoc@tmp=\Etoc@maxlevel - \in@{.#1,}{.figure,.table,}% - \ifin@ - \PackageWarning{etoc} - {You can not use \string\etocsetstyle\space with `#1'.\MessageBreak - Check the package documentation (in particular about\MessageBreak - \string\etoclocallistoffigureshook/\string\etoclocallistoftableshook)% - \MessageBreak on how to customize - figure and table entries in local\MessageBreak lists. Reported}% - \else - \PackageInfo{etoc} - {Attempt to set the style of `#1',\MessageBreak - whose level is currently the maximal one \etocthemaxlevel,\MessageBreak - which is never displayed. \space This will be ignored\MessageBreak - but note that we do quit compatibility mode.\MessageBreak - Reported}% - \Etoc@standardlinesfalse - \fi - \else - \PackageWarning{etoc}{This should not happen. Reported}% - \fi - \expandafter\@gobblefour - \fi -} -\long\def\Etoc@setstyle@b#1#2#3#4#5{% - \expandafter\def\csname Etoc@begin@#1\endcsname {#2}% - \expandafter\def\csname Etoc@prefix@#1\endcsname {#3}% - \expandafter\def\csname Etoc@contents@#1\endcsname {#4}% - \expandafter\def\csname Etoc@end@#1\endcsname {#5}% -} -\def\Etoc@setstyle@e#1{% - \expandafter\let\csname Etoc@begin@#1\endcsname \@empty - \expandafter\let\csname Etoc@prefix@#1\endcsname \@empty - \expandafter\let\csname Etoc@contents@#1\endcsname \@empty - \expandafter\let\csname Etoc@end@#1\endcsname \@empty -} -\def\Etoc@storelines@a#1{% - \noexpand\Etoc@setstyle@b{#1}% - {\expandafter\Etoc@expandonce\csname Etoc@begin@#1\endcsname}% - {\expandafter\Etoc@expandonce\csname Etoc@prefix@#1\endcsname}% - {\expandafter\Etoc@expandonce\csname Etoc@contents@#1\endcsname}% - {\expandafter\Etoc@expandonce\csname Etoc@end@#1\endcsname}% -} -\def\Etoc@expandonce#1{\unexpanded\expandafter{#1}} -\def\etocstorelinestylesinto#1{% - \edef#1{\Etoc@storelines@a{-2}\Etoc@storelines@a{-1}\Etoc@storelines@a{0}% - \Etoc@storelines@a {1}\Etoc@storelines@a {2}\Etoc@storelines@a{3}% - \Etoc@storelines@a {4}\Etoc@storelines@a {5}% - \ifEtoc@deeplevels - \Etoc@storelines@a{6}\Etoc@storelines@a{7}\Etoc@storelines@a{8}% - \Etoc@storelines@a{9}\Etoc@storelines@a{10}\Etoc@storelines@a{11}% - \fi - }% -} -\def\etocstorethislinestyleinto#1#2{% - \edef#2{\expandafter\Etoc@storelines@a\expandafter{\number\etoclevel{#1}}}% -}% -\def\etocfontminustwo {\normalfont \LARGE \bfseries} -\def\etocfontminusone {\normalfont \large \bfseries} -\def\etocfontzero {\normalfont \large \bfseries} -\def\etocfontone {\normalfont \normalsize \bfseries} -\def\etocfonttwo {\normalfont \normalsize} -\def\etocfontthree {\normalfont \footnotesize} -\def\etocsepminustwo {4ex \@plus .5ex \@minus .5ex} -\def\etocsepminusone {4ex \@plus .5ex \@minus .5ex} -\def\etocsepzero {2.5ex \@plus .4ex \@minus .4ex} -\def\etocsepone {1.5ex \@plus .3ex \@minus .3ex} -\def\etocseptwo {.5ex \@plus .1ex \@minus .1ex} -\def\etocsepthree {.25ex \@plus .05ex \@minus .05ex} -\def\etocbaselinespreadminustwo {1} -\def\etocbaselinespreadminusone {1} -\def\etocbaselinespreadzero {1} -\def\etocbaselinespreadone {1} -\def\etocbaselinespreadtwo {1} -\def\etocbaselinespreadthree {.9} -\def\etocminustwoleftmargin {1.5em plus 0.5fil} -\def\etocminustworightmargin {1.5em plus -0.5fil} -\def\etocminusoneleftmargin {1em} -\def\etocminusonerightmargin {1em} -\def\etoctoclineleaders - {\hbox{\normalfont\normalsize\hb@xt@2ex {\hss.\hss}}} -\def\etocabbrevpagename {p.~} -\def\etocpartname {Part} -\def\etocbookname {Book} -\def\etocdefaultlines{% - \Etoc@standardlinesfalse - \etocdefaultlines@setbook - \etocdefaultlines@setpart - \etocdefaultlines@setchapter - \etocdefaultlines@setsection - \etocdefaultlines@setsubsection - \etocdefaultlines@setsubsubsection - \etocdefaultlines@setdeeperones -} -\def\etocnoprotrusion{\leavevmode\kern-\p@\kern\p@} -\@ifclassloaded{memoir}{% - \def\etocdefaultlines@setbook{% - \Etoc@setstyle@b - {-2}% - {\addpenalty\@M\etocskipfirstprefix} - {\addpenalty\@secpenalty} - {\begingroup - \etocfontminustwo - \addvspace{\etocsepminustwo}% - \parindent \z@ - \leftskip \etocminustwoleftmargin - \rightskip \etocminustworightmargin - \parfillskip \@flushglue - \vbox{\etocifnumbered{\etoclink{\etocbookname\enspace\etocthenumber:\quad}}{}% - \etocname - \baselineskip\etocbaselinespreadminustwo\baselineskip - \par}% - \addpenalty\@M\addvspace{\etocsepminusone}% - \endgroup} - {}% - } - }{\let\etocdefaultlines@setbook\@empty} -\def\etocdefaultlines@setpart{% -\Etoc@setstyle@b - {-1}% - {\addpenalty\@M\etocskipfirstprefix} - {\addpenalty\@secpenalty} - {\begingroup - \etocfontminusone - \addvspace{\etocsepminusone}% - \parindent \z@ - \leftskip \etocminusoneleftmargin - \rightskip \etocminusonerightmargin - \parfillskip \@flushglue - \vbox{\etocifnumbered{\etoclink{\etocpartname\enspace\etocthenumber.\quad}}{}% - \etocname - \baselineskip\etocbaselinespreadminusone\baselineskip - \par}% - \addpenalty\@M\addvspace{\etocsepzero}% - \endgroup} - {}% -} -\def\etocdefaultlines@setchapter{% -\Etoc@setstyle@b - {0}% - {\addpenalty\@M\etocskipfirstprefix} - {\addpenalty\@itempenalty} - {\begingroup - \etocfontzero - \addvspace{\etocsepzero}% - \parindent \z@ \parfillskip \@flushglue - \vbox{\etocifnumbered{\etocnumber.\enspace}{}\etocname - \baselineskip\etocbaselinespreadzero\baselineskip - \par}% - \endgroup} - {\addpenalty{-\@highpenalty}\addvspace{\etocsepminusone}}% -} -\def\etocdefaultlines@setsection{% -\Etoc@setstyle@b - {1}% - {\addpenalty\@M\etocskipfirstprefix} - {\addpenalty\@itempenalty} - {\begingroup - \etocfontone - \addvspace{\etocsepone}% - \parindent \z@ \parfillskip \z@ - \setbox\z@\vbox{\parfillskip\@flushglue - \etocname\par - \setbox\tw@\lastbox - \global\setbox\@ne\hbox{\unhbox\tw@\ }}% - \dimen\z@=\wd\@ne - \setbox\z@=\etoctoclineleaders - \advance\dimen\z@\wd\z@ - \etocifnumbered - {\setbox\tw@\hbox{\etocnumber, \etocabbrevpagename\etocpage\etocnoprotrusion}} - {\setbox\tw@\hbox{\etocabbrevpagename\etocpage\etocnoprotrusion}}% - \advance\dimen\z@\wd\tw@ - \ifdim\dimen\z@ < \linewidth - \vbox{\etocname~% - \leaders\box\z@\hfil\box\tw@ - \baselineskip\etocbaselinespreadone\baselineskip - \par}% - \else - \vbox{\etocname~% - \leaders\copy\z@\hfil\break - \hbox{}\leaders\box\z@\hfil\box\tw@ - \baselineskip\etocbaselinespreadone\baselineskip - \par}% - \fi - \endgroup} - {\addpenalty\@secpenalty\addvspace{\etocsepzero}}% -} -\def\etocdefaultlines@setsubsection{% -\Etoc@setstyle@b - {2}% - {\addpenalty\@medpenalty\etocskipfirstprefix} - {\addpenalty\@itempenalty} - {\begingroup - \etocfonttwo - \addvspace{\etocseptwo}% - \parindent \z@ \parfillskip \z@ - \setbox\z@\vbox{\parfillskip\@flushglue - \etocname\par\setbox\tw@\lastbox - \global\setbox\@ne\hbox{\unhbox\tw@}}% - \dimen\z@=\wd\@ne - \setbox\z@=\etoctoclineleaders - \advance\dimen\z@\wd\z@ - \etocifnumbered - {\setbox\tw@\hbox{\etocnumber, \etocabbrevpagename\etocpage\etocnoprotrusion}} - {\setbox\tw@\hbox{\etocabbrevpagename\etocpage\etocnoprotrusion}}% - \advance\dimen\z@\wd\tw@ - \ifdim\dimen\z@ < \linewidth - \vbox{\etocname~% - \leaders\box\z@\hfil\box\tw@ - \baselineskip\etocbaselinespreadtwo\baselineskip - \par}% - \else - \vbox{\etocname~% - \leaders\copy\z@\hfil\break - \hbox{}\leaders\box\z@\hfil\box\tw@ - \baselineskip\etocbaselinespreadtwo\baselineskip - \par}% - \fi - \endgroup} - {\addpenalty\@secpenalty\addvspace{\etocsepone}}% -} -\def\etocdefaultlines@setsubsubsection{% -\Etoc@setstyle@b - {3}% - {\addpenalty\@M - \etocfontthree - \vspace{\etocsepthree}% - \noindent - \etocskipfirstprefix} - {\allowbreak\,--\,} - {\etocname} - {.\hfil - \begingroup - \baselineskip\etocbaselinespreadthree\baselineskip - \par - \endgroup - \addpenalty{-\@highpenalty}} -} -\def\etocdefaultlines@setdeeperones{% -\Etoc@setstyle@e{4}% -\Etoc@setstyle@e{5}% -\ifEtoc@deeplevels - \Etoc@setstyle@e{6}% - \Etoc@setstyle@e{7}% - \Etoc@setstyle@e{8}% - \Etoc@setstyle@e{9}% - \Etoc@setstyle@e{10}% - \Etoc@setstyle@e{11}% -\fi -} -\def\etocabovetocskip{3.5ex \@plus 1ex \@minus .2ex} -\def\etocbelowtocskip{3.5ex \@plus 1ex \@minus .2ex} -\def\etoccolumnsep{2em} -\def\etocmulticolsep{0ex} -\def\etocmulticolpretolerance{-1} -\def\etocmulticoltolerance{200} -\def\etocdefaultnbcol{2} -\def\etocinnertopsep{2ex} -\newcommand\etocmulticolstyle[2][\etocdefaultnbcol]{% -\etocsettocstyle - {\let\etocoldpar\par - \addvspace{\etocabovetocskip}% - \ifnum #1>\@ne - \expandafter\@firstoftwo - \else \expandafter\@secondoftwo - \fi - {\multicolpretolerance\etocmulticolpretolerance - \multicoltolerance\etocmulticoltolerance - \setlength{\columnsep}{\etoccolumnsep}% - \setlength{\multicolsep}{\etocmulticolsep}% - \begin{multicols}{#1}[#2\etocoldpar\addvspace{\etocinnertopsep}]} - {#2\ifvmode\else\begingroup\interlinepenalty\@M\parskip\z@skip - \@@par\endgroup - \fi - \nobreak\addvspace{\etocinnertopsep}% - \pretolerance\etocmulticolpretolerance - \tolerance\etocmulticoltolerance}% - }% - {\ifnum #1>\@ne - \expandafter\@firstofone - \else \expandafter\@gobble - \fi - {\end{multicols}}% - \addvspace{\etocbelowtocskip}}% -} -\def\etocinnerbottomsep{3.5ex} -\def\etocinnerleftsep{2em} -\def\etocinnerrightsep{2em} -\def\etoctoprule{\hrule} -\def\etocleftrule{\vrule} -\def\etocrightrule{\vrule} -\def\etocbottomrule{\hrule} -\def\etoctoprulecolorcmd{\relax} -\def\etocbottomrulecolorcmd{\relax} -\def\etocleftrulecolorcmd{\relax} -\def\etocrightrulecolorcmd{\relax} -\def\etoc@ruledheading #1{% - \hb@xt@\linewidth{\color@begingroup - \hss #1\hss\hskip-\linewidth - \etoctoprulecolorcmd\leaders\etoctoprule\hss - \phantom{#1}% - \leaders\etoctoprule\hss\color@endgroup}% - \nointerlineskip\nobreak\vskip\etocinnertopsep} -\newcommand*\etocruledstyle[2][\etocdefaultnbcol]{% -\etocsettocstyle - {\addvspace{\etocabovetocskip}% - \ifnum #1>\@ne - \expandafter\@firstoftwo - \else \expandafter\@secondoftwo - \fi - {\multicolpretolerance\etocmulticolpretolerance - \multicoltolerance\etocmulticoltolerance - \setlength{\columnsep}{\etoccolumnsep}% - \setlength{\multicolsep}{\etocmulticolsep}% - \begin{multicols}{#1}[\etoc@ruledheading{#2}]} - {\etoc@ruledheading{#2}% - \pretolerance\etocmulticolpretolerance - \tolerance\etocmulticoltolerance}} - {\ifnum #1>\@ne\expandafter\@firstofone - \else \expandafter\@gobble - \fi - {\end{multicols}}% - \addvspace{\etocbelowtocskip}}} -\def\etocframedmphook{\relax} -\long\def\etocbkgcolorcmd{\relax} -\long\def\Etoc@relax{\relax} -\newbox\etoc@framed@titlebox -\newbox\etoc@framed@contentsbox -\newcommand*\etocframedstyle[2][\etocdefaultnbcol]{% -\etocsettocstyle{% - \addvspace{\etocabovetocskip}% - \sbox\z@{#2}% - \dimen\z@\dp\z@ - \ifdim\wd\z@<\linewidth \dp\z@\z@ \else \dimen\z@\z@ \fi - \setbox\etoc@framed@titlebox=\hb@xt@\linewidth{\color@begingroup - \hss - \ifx\etocbkgcolorcmd\Etoc@relax - \else - \sbox\tw@{\color{white}% - \vrule\@width\wd\z@\@height\ht\z@\@depth\dimen\z@}% - \ifdim\wd\z@<\linewidth \dp\tw@\z@\fi - \box\tw@ - \hskip-\wd\z@ - \fi - \copy\z@ - \hss - \hskip-\linewidth - \etoctoprulecolorcmd\leaders\etoctoprule\hss - \hskip\wd\z@ - \etoctoprulecolorcmd\leaders\etoctoprule\hss\color@endgroup}% - \setbox\z@\hbox{\etocleftrule\etocrightrule}% - \dimen\tw@\linewidth\advance\dimen\tw@-\wd\z@ - \advance\dimen\tw@-\etocinnerleftsep - \advance\dimen\tw@-\etocinnerrightsep - \setbox\etoc@framed@contentsbox=\vbox\bgroup - \hsize\dimen\tw@ - \kern\dimen\z@ - \vskip\etocinnertopsep - \hbox\bgroup - \begin{minipage}{\hsize}% - \etocframedmphook - \ifnum #1>\@ne - \expandafter\@firstoftwo - \else \expandafter\@secondoftwo - \fi - {\multicolpretolerance\etocmulticolpretolerance - \multicoltolerance\etocmulticoltolerance - \setlength{\columnsep}{\etoccolumnsep}% - \setlength{\multicolsep}{\etocmulticolsep}% - \begin{multicols}{#1}} - {\pretolerance\etocmulticolpretolerance - \tolerance\etocmulticoltolerance}} - {\ifnum #1>\@ne\expandafter\@firstofone - \else \expandafter\@gobble - \fi - {\end{multicols}\unskip }% - \end{minipage}% - \egroup - \vskip\etocinnerbottomsep - \egroup - \vbox{\hsize\linewidth - \ifx\etocbkgcolorcmd\Etoc@relax - \else - \kern\ht\etoc@framed@titlebox - \kern\dp\etoc@framed@titlebox - \hb@xt@\linewidth{\color@begingroup - \etocleftrulecolorcmd\etocleftrule - \etocbkgcolorcmd - \leaders\vrule - \@height\ht\etoc@framed@contentsbox - \@depth\dp\etoc@framed@contentsbox - \hss - \etocrightrulecolorcmd\etocrightrule - \color@endgroup}\nointerlineskip - \vskip-\dp\etoc@framed@contentsbox - \vskip-\ht\etoc@framed@contentsbox - \vskip-\dp\etoc@framed@titlebox - \vskip-\ht\etoc@framed@titlebox - \fi - \box\etoc@framed@titlebox\nointerlineskip - \hb@xt@\linewidth{\color@begingroup - {\etocleftrulecolorcmd\etocleftrule}% - \hss\box\etoc@framed@contentsbox\hss - \etocrightrulecolorcmd\etocrightrule\color@endgroup} - \nointerlineskip - \vskip\ht\etoc@framed@contentsbox - \vskip\dp\etoc@framed@contentsbox - \hb@xt@\linewidth{\color@begingroup\etocbottomrulecolorcmd - \leaders\etocbottomrule\hss\color@endgroup}} - \addvspace{\etocbelowtocskip}}} -\newcommand\etoc@multicoltoc[2][\etocdefaultnbcol]{% - \etocmulticolstyle[#1]{#2}% - \tableofcontents} -\newcommand\etoc@multicoltoci[2][\etocdefaultnbcol]{% - \etocmulticolstyle[#1]{#2}% - \tableofcontents*} -\newcommand\etoc@local@multicoltoc[2][\etocdefaultnbcol]{% - \etocmulticolstyle[#1]{#2}% - \localtableofcontents} -\newcommand\etoc@local@multicoltoci[2][\etocdefaultnbcol]{% - \etocmulticolstyle[#1]{#2}% - \localtableofcontents*} -\newcommand*\etoc@ruledtoc[2][\etocdefaultnbcol]{% - \etocruledstyle[#1]{#2}% - \tableofcontents} -\newcommand*\etoc@ruledtoci[2][\etocdefaultnbcol]{% - \etocruledstyle[#1]{#2}% - \tableofcontents*} -\newcommand*\etoc@local@ruledtoc[2][\etocdefaultnbcol]{% - \etocruledstyle[#1]{#2}% - \localtableofcontents} -\newcommand*\etoc@local@ruledtoci[2][\etocdefaultnbcol]{% - \etocruledstyle[#1]{#2}% - \localtableofcontents*} -\newcommand*\etoc@framedtoc[2][\etocdefaultnbcol]{% - \etocframedstyle[#1]{#2}% - \tableofcontents} -\newcommand*\etoc@framedtoci[2][\etocdefaultnbcol]{% - \etocframedstyle[#1]{#2}% - \tableofcontents*} -\newcommand*\etoc@local@framedtoc[2][\etocdefaultnbcol]{% - \etocframedstyle[#1]{#2}% - \localtableofcontents} -\newcommand*\etoc@local@framedtoci[2][\etocdefaultnbcol]{% - \etocframedstyle[#1]{#2}% - \localtableofcontents*} -\def\etocmulticol{\begingroup - \Etoc@mustclosegrouptrue - \@ifstar - {\etoc@multicoltoci} - {\etoc@multicoltoc}} -\def\etocruled{\begingroup - \Etoc@mustclosegrouptrue - \@ifstar - {\etoc@ruledtoci} - {\etoc@ruledtoc}} -\def\etocframed{\begingroup - \Etoc@mustclosegrouptrue - \@ifstar - {\etoc@framedtoci} - {\etoc@framedtoc}} -\def\etoclocalmulticol{\begingroup - \Etoc@mustclosegrouptrue - \@ifstar - {\etoc@local@multicoltoci} - {\etoc@local@multicoltoc}} -\def\etoclocalruled{\begingroup - \Etoc@mustclosegrouptrue - \@ifstar - {\etoc@local@ruledtoci} - {\etoc@local@ruledtoc}} -\def\etoclocalframed{\begingroup - \Etoc@mustclosegrouptrue - \@ifstar - {\etoc@local@framedtoci} - {\etoc@local@framedtoc}} -\def\etocmemoirtoctotocfmt #1#2{% - \PackageWarning{etoc} - {\string\etocmemoirtoctotocfmt\space is deprecated.\MessageBreak - Use in its place \string\etocsettoclineforclasstoc,\MessageBreak - and \string\etocsettoclineforclasslistof{toc} (or {lof}, {lot}). - I will do this now.\MessageBreak - Reported}% - \etocsettoclineforclasstoc{#1}{#2}% - \etocsettoclineforclasslistof{toc}{#1}{#2}% -} -\def\etocsettoclineforclasstoc #1#2{% - \def\etocclassmaintocaddtotoc{\etocglobalheadtotoc{#1}{#2}}% -} -\def\etocsettoclineforclasslistof #1#2#3{% - \@namedef{etocclasslocal#1addtotoc}{\etoclocalheadtotoc{#2}{#3}}% -} -\let\etocclasslocaltocaddtotoc\@empty -\let\etocclasslocallofaddtotoc\@empty -\let\etocclasslocallotaddtotoc\@empty -\ifdefined\c@chapter - \def\etocclasslocaltocmaketitle{\section*{\localcontentsname}} - \def\etocclasslocallofmaketitle{\section*{\locallistfigurename}} - \def\etocclasslocallotmaketitle{\section*{\locallisttablename}} - \etocsettoclineforclasstoc {chapter}{\contentsname} - \etocsettoclineforclasslistof{toc}{section}{\localcontentsname} - \etocsettoclineforclasslistof{lof}{section}{\locallistfigurename} - \etocsettoclineforclasslistof{lot}{section}{\locallisttablename} -\else - \def\etocclasslocaltocmaketitle{\subsection*{\localcontentsname}}% - \def\etocclasslocallofmaketitle{\subsection*{\locallistfigurename}}% - \def\etocclasslocallotmaketitle{\subsection*{\locallisttablename}}% - \etocsettoclineforclasstoc {section}{\contentsname} - \etocsettoclineforclasslistof{toc}{subsection}{\localcontentsname} - \etocsettoclineforclasslistof{lof}{subsection}{\locallistfigurename} - \etocsettoclineforclasslistof{lot}{subsection}{\locallisttablename} -\fi -\def\etocclasslocalperhapsaddtotoc #1{% - \etocifisstarred - {} - {\csname ifEtoc@local#1totoc\endcsname - \csname etocclasslocal#1addtotoc\endcsname - \fi - }% -} -\def\etocarticlestyle{% - \etocsettocstyle - {\ifEtoc@localtoc - \@nameuse{etocclasslocal\Etoc@currext maketitle}% - \etocclasslocalperhapsaddtotoc\Etoc@currext - \else - \section *{\contentsname - \@mkboth {\MakeUppercase \contentsname} - {\MakeUppercase \contentsname}}% - \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}% - \fi - } - {}% -} -\def\etocarticlestylenomarks{% - \etocsettocstyle - {\ifEtoc@localtoc - \@nameuse{etocclasslocal\Etoc@currext maketitle}% - \etocclasslocalperhapsaddtotoc\Etoc@currext - \else - \section *{\contentsname}% - \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}% - \fi - } - {}% -} -\def\etocbookstyle{% - \etocsettocstyle - {\if@twocolumn \@restonecoltrue \onecolumn \else \@restonecolfalse \fi - \ifEtoc@localtoc - \@nameuse{etocclasslocal\Etoc@currext maketitle}% - \etocclasslocalperhapsaddtotoc\Etoc@currext - \else - \chapter *{\contentsname - \@mkboth {\MakeUppercase \contentsname} - {\MakeUppercase \contentsname}}% - \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}% - \fi - }% - {\if@restonecol \twocolumn \fi}% -} -\def\etocbookstylenomarks{% - \etocsettocstyle - {\if@twocolumn \@restonecoltrue \onecolumn \else \@restonecolfalse \fi - \ifEtoc@localtoc - \@nameuse{etocclasslocal\Etoc@currext maketitle}% - \etocclasslocalperhapsaddtotoc\Etoc@currext - \else - \chapter *{\contentsname}% - \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}% - \fi - }% - {\if@restonecol \twocolumn \fi}% -} -\let\etocreportstyle\etocbookstyle -\let\etocreportstylenomarks\etocbookstylenomarks -\def\etocmemoirstyle{% - \etocsettocstyle - {\ensureonecol \par \begingroup \phantomsection - \ifx\Etoc@aftertitlehook\@empty - \else - \ifmem@em@starred@listof - \else - \ifEtoc@localtoc - \etocclasslocalperhapsaddtotoc\Etoc@currext - \else - \ifEtoc@maintoctotoc - \etocclassmaintocaddtotoc - \fi - \fi - \fi - \fi - \ifEtoc@localtoc - \@namedef{@\Etoc@currext maketitle}{% - \@nameuse{etocclasslocal\Etoc@currext maketitle}% - }% - \fi - \@nameuse {@\Etoc@currext maketitle} %<< space token here from memoir code - \ifx\Etoc@aftertitlehook\@empty - \else - \Etoc@aftertitlehook \let \Etoc@aftertitlehook \relax - \fi - \parskip \cftparskip \@nameuse {cft\Etoc@currext beforelisthook}% - }% - {\@nameuse {cft\Etoc@currext afterlisthook}% - \endgroup\restorefromonecol - }% -} -\let\Etoc@beforetitlehook\@empty -\if1\@ifclassloaded{scrartcl}0{\@ifclassloaded{scrbook}0{\@ifclassloaded{scrreprt}01}}% -\expandafter\@gobble -\else - \ifdefined\setuptoc - \def\Etoc@beforetitlehook{% - \ifEtoc@localtoc - \etocclasslocalperhapsaddtotoc\Etoc@currext - \setuptoc{\Etoc@currext}{leveldown}% - \else - \etocifisstarred{}{\etocifmaintoctotoc{\setuptoc{toc}{totoc}}}% - \fi - }% - \fi -\expandafter\@firstofone -\fi -{\def\etocclasslocalperhapsaddtotoc #1{% - \etocifisstarred - {}% - {\csname ifEtoc@local#1totoc\endcsname - \setuptoc{\Etoc@currext}{totoc}% - \fi - }% - }% -} -\ifdefined\Iftocfeature - \def\etoc@Iftocfeature{\Iftocfeature}% -\else - \def\etoc@Iftocfeature{\iftocfeature}% -\fi -\def\etocscrartclstyle{% - \etocsettocstyle - {\ifx\Etoc@currext\Etoc@tocext - \expandafter\@firstofone - \else - \expandafter\@gobble - \fi - {\let\if@dynlist\if@tocleft}% - \edef\@currext{\Etoc@currext}% - \@ifundefined{listof\@currext name}% - {\def\list@fname{\listofname~\@currext}}% - {\expandafter\let\expandafter\list@fname - \csname listof\@currext name\endcsname}% - \etoc@Iftocfeature {\@currext}{onecolumn} - {\etoc@Iftocfeature {\@currext}{leveldown} - {} - {\if@twocolumn \aftergroup \twocolumn \onecolumn \fi }} - {}% - \etoc@Iftocfeature {\@currext}{numberline}% - {\def \nonumberline {\numberline {}}}{}% - \expandafter\tocbasic@listhead\expandafter {\list@fname}% - \begingroup \expandafter \expandafter \expandafter - \endgroup \expandafter - \ifx - \csname microtypesetup\endcsname \relax - \else - \etoc@Iftocfeature {\@currext}{noprotrusion}{} - {\microtypesetup {protrusion=false}% - \PackageInfo {tocbasic}% - {character protrusion at \@currext\space deactivated}}% - \fi - \etoc@Iftocfeature{\@currext}{noparskipfake}{}{% - \ifvmode \@tempskipa\lastskip \vskip-\lastskip - \addtolength{\@tempskipa}{\parskip}\vskip\@tempskipa\fi - }% - \setlength {\parskip }{\z@ }% - \setlength {\parindent }{\z@ }% - \setlength {\parfillskip }{\z@ \@plus 1fil}% - \csname tocbasic@@before@hook\endcsname - \csname tb@\@currext @before@hook\endcsname - }% end of before_toc - {% start of after_toc - \providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file - \edef\@currext{\Etoc@currext}% - \csname tb@\@currext @after@hook\endcsname - \csname tocbasic@@after@hook\endcsname - }% end of after_toc -} -\let\etocscrbookstyle\etocscrartclstyle -\let\etocscrreprtstyle\etocscrartclstyle -\def\etocclasstocstyle{\etocarticlestyle} -\newcommand*\etocmarkboth[1]{% - \@mkboth{\MakeUppercase{#1}}{\MakeUppercase{#1}}} -\newcommand*\etocmarkbothnouc[1]{\@mkboth{#1}{#1}} -\newcommand\etoctocstyle[3][section]{\etocmulticolstyle[#2]% - {\csname #1\endcsname *{#3}}} -\newcommand\etoctocstylewithmarks[4][section]{\etocmulticolstyle[#2]% - {\csname #1\endcsname *{#3\etocmarkboth{#4}}}} -\newcommand\etoctocstylewithmarksnouc[4][section]{\etocmulticolstyle[#2]% - {\csname #1\endcsname *{#3\etocmarkbothnouc{#4}}}} -\def\Etoc@redefetocstylesforchapters{% - \renewcommand\etoctocstylewithmarks[4][chapter]{% - \etocmulticolstyle[##2]{\csname ##1\endcsname *{##3\etocmarkboth{##4}}}% - } - \renewcommand\etoctocstylewithmarksnouc[4][chapter]{% - \etocmulticolstyle[##2]{\csname ##1\endcsname *{##3\etocmarkbothnouc{##4}}}% - } - \renewcommand\etoctocstyle[3][chapter]{% - \etocmulticolstyle[##2]{\csname ##1\endcsname *{##3}} - } -} -\@ifclassloaded{scrartcl} - {\renewcommand*\etocclasstocstyle{\etocscrartclstyle}}{} -\@ifclassloaded{book} - {\renewcommand*\etocfontone{\normalfont\normalsize} - \renewcommand*\etocclasstocstyle{\etocbookstyle} - \Etoc@redefetocstylesforchapters}{} -\@ifclassloaded{report} - {\renewcommand*\etocfontone{\normalfont\normalsize} - \renewcommand*\etocclasstocstyle{\etocreportstyle} - \Etoc@redefetocstylesforchapters}{} -\@ifclassloaded{scrbook} - {\renewcommand*\etocfontone{\normalfont\normalsize} - \renewcommand*\etocclasstocstyle{\etocscrbookstyle} - \Etoc@redefetocstylesforchapters}{} -\@ifclassloaded{scrreprt} - {\renewcommand*\etocfontone{\normalfont\normalsize} - \renewcommand*\etocclasstocstyle{\etocscrreprtstyle} - \Etoc@redefetocstylesforchapters}{} -\@ifclassloaded{memoir} - {\renewcommand*\etocfontone{\normalfont\normalsize} - \renewcommand*\etocclasstocstyle{\etocmemoirstyle} - \Etoc@redefetocstylesforchapters}{} -\def\etoctocloftstyle {% - \etocsettocstyle{% - \@cfttocstart - \par - \begingroup - \parindent\z@ \parskip\cftparskip - \@nameuse{@cftmake\Etoc@currext title}% - \ifEtoc@localtoc - \etoctocloftlocalperhapsaddtotoc\Etoc@currext - \else - \etocifisstarred {}{\ifEtoc@maintoctotoc\@cftdobibtoc\fi}% - \fi - }% - {% - \endgroup - \@cfttocfinish - }% -} -\def\etoctocloftlocalperhapsaddtotoc#1{% - \etocifisstarred - {}% - {\csname ifEtoc@local#1totoc\endcsname - \ifdefined\c@chapter\def\@tocextra{@section}\else\def\@tocextra{@subsection}\fi - \csname @cftdobib#1\endcsname - \fi - }% -} -\def\etoctocbibindstyle {% - \etocsettocstyle {% - \toc@start - \ifEtoc@localtoc - \@nameuse{etocclasslocal\Etoc@currext maketitle}% - \etocclasslocalperhapsaddtotoc\Etoc@currext - \else - \etoc@tocbibind@dotoctitle - \fi - }% - {\toc@finish}% -} -\def\etoc@tocbibind@dotoctitle {% - \if@bibchapter - \etocifisstarred - {\chapter*{\contentsname}\prw@mkboth{\contentsname} % id. - }% - {\ifEtoc@maintoctotoc - \toc@chapter{\contentsname} %<-space from original - \else - \chapter*{\contentsname}\prw@mkboth{\contentsname} % id. - \fi - }% - \else - \etocifisstarred - {\@nameuse{\@tocextra}*{\contentsname\prw@mkboth{\contentsname}} %<-space - } - {\ifEtoc@maintoctotoc - \toc@section{\@tocextra}{\contentsname} %<-space from original - \else - \@nameuse{\@tocextra}*{\contentsname\prw@mkboth{\contentsname}} % id. - \fi - }% - \fi -}% -\@ifclassloaded{memoir} -{} -{% memoir not loaded - \@ifpackageloaded{tocloft} - {\if@cftnctoc\else - \ifEtoc@keeporiginaltoc - \else - \AtBeginDocument{\let\tableofcontents\etoctableofcontents}% - \fi - \fi } - {\AtBeginDocument - {\@ifpackageloaded{tocloft} - {\if@cftnctoc\else - \PackageWarningNoLine {etoc} - {Package `tocloft' was loaded after `etoc'.\MessageBreak - To prevent it from overwriting \protect\tableofcontents, it will\MessageBreak - be tricked into believing to have been loaded with its\MessageBreak - option `titles'. \space But this will cause the `tocloft'\MessageBreak - customization of the titles of the main list of figures\MessageBreak - and list of tables to not apply either.\MessageBreak - You should load `tocloft' before `etoc'.}% - \AtEndDocument{\PackageWarning{etoc} - {Please load `tocloft' before `etoc'!\@gobbletwo}}% - \fi - \@cftnctoctrue }% - {}% - }% - }% -} -\@ifclassloaded{memoir} -{} -{% memoir not loaded - \AtBeginDocument{% - \@ifpackageloaded{tocloft} - {% - \def\etocclasstocstyle{% - \etoctocloftstyle - \Etoc@classstyletrue - }% - \ifEtoc@etocstyle - \ifEtoc@classstyle - \etocclasstocstyle - \Etoc@etocstyletrue - \fi - \else - \ifEtoc@classstyle - \etocclasstocstyle - \fi - \fi - }% - {% no tocloft - \@ifpackageloaded {tocbibind} - {\if@dotoctoc - \def\etocclasstocstyle{% - \etoctocbibindstyle - \Etoc@classstyletrue - }% - \ifEtoc@etocstyle - \ifEtoc@classstyle - \etocclasstocstyle - \Etoc@etocstyletrue - \fi - \else - \ifEtoc@classstyle - \etocclasstocstyle - \fi - \fi - \ifEtoc@keeporiginaltoc - \else - \let\tableofcontents\etoctableofcontents - \fi - }% - {}% - }% - \@ifpackageloaded{tocbibind} - {% tocbibind, perhaps with tocloft - \if@dotoctoc - \ifEtoc@keeporiginaltoc - \else - \let\tableofcontents\etoctableofcontents - \fi - \etocsetup{maintoctotoc,localtoctotoc}% - \PackageInfo{etoc}{% - Setting (or re-setting) the options `maintoctotoc' and\MessageBreak - `localtoctotoc' to true as tocbibind was detected and\MessageBreak - found to be configured for `TOC to toc'.\MessageBreak - Reported at begin document}% - \fi - \if@dotoclof - \ifEtoc@lof - \etocsetup{localloftotoc}% - \PackageInfo{etoc}{% - Setting (or re-setting) `localloftotoc=true' as the\MessageBreak - package tocbibind was detected and is configured for\MessageBreak - `LOF to toc'. Reported at begin document}% - \fi - \fi - \if@dotoclot - \ifEtoc@lot - \etocsetup{locallottotoc}% - \PackageInfo{etoc}{% - Setting (or re-setting) `locallottotoc=true' as the\MessageBreak - package tocbibind was detected and is configured for\MessageBreak - `LOT to toc'. Reported at begin document}% - \fi - \fi - }% end of tocbibind branch - {}% - }% end of at begin document -}% end of not with memoir branch -\def\Etoc@addtocontents #1#2{% - \addtocontents {toc}{% - \protect\contentsline{#1}{#2}{\thepage}{\ifEtoc@hyperref\@currentHref\fi}% - \ifdefined\protected@file@percent\protected@file@percent\fi - }% -} -\def\Etoc@addcontentsline@ #1#2#3{% - \@namedef{toclevel@#1}{#3}\addcontentsline {toc}{#1}{#2}% -} -\DeclareRobustCommand*{\etoctoccontentsline} - {\@ifstar{\Etoc@addcontentsline@}{\Etoc@addtocontents}} -\def\Etoc@addtocontents@immediately#1#2{% - \begingroup - \let\Etoc@originalwrite\write - \def\write{\immediate\Etoc@originalwrite}% - \Etoc@addtocontents{#1}{#2}% - \endgroup -} -\def\Etoc@addcontentsline@@immediately#1#2#3{% - \begingroup - \let\Etoc@originalwrite\write - \def\write{\immediate\Etoc@originalwrite}% - \Etoc@addcontentsline@{#1}{#2}{#3}% - \endgoroup -} -\DeclareRobustCommand*{\etocimmediatetoccontentsline} - {\@ifstar{\Etoc@addcontentsline@@immediately}{\Etoc@addtocontents@immediately}} -\def\Etoc@storetocdepth {\xdef\Etoc@savedtocdepth{\number\c@tocdepth}} -\def\Etoc@restoretocdepth {\global\c@tocdepth\Etoc@savedtocdepth\relax} -\def\etocobeytoctocdepth {\def\etoc@settocdepth - {\afterassignment\Etoc@@nottoodeep \global\c@tocdepth}} -\def\Etoc@@nottoodeep {\ifnum\Etoc@savedtocdepth<\c@tocdepth - \global\c@tocdepth\Etoc@savedtocdepth\relax\fi } -\def\etocignoretoctocdepth {\let\etoc@settocdepth\@gobble } -\def\etocsettocdepth {\futurelet\Etoc@nexttoken\Etoc@set@tocdepth } -\def\Etoc@set@tocdepth {\ifx\Etoc@nexttoken\bgroup - \expandafter\Etoc@set@tocdepth@ - \else\expandafter\Etoc@set@toctocdepth - \fi } -\def\Etoc@set@tocdepth@ #1{\@ifundefined {Etoc@#1@@} - {\PackageWarning{etoc} - {Unknown sectioning unit #1, \protect\etocsettocdepth\space ignored}} - {\global\c@tocdepth\csname Etoc@#1@@\endcsname}% -} -\def\Etoc@set@toctocdepth #1#{\Etoc@set@toctocdepth@ } -\def\Etoc@set@toctocdepth@ #1{% - \@ifundefined{Etoc@#1@@}% - {\PackageWarning{etoc} - {Unknown sectioning depth #1, \protect\etocsettocdepth.toc ignored}}% - {\addtocontents {toc} - {\protect\etoc@settocdepth\expandafter\protect\csname Etoc@#1@@\endcsname}}% -} -\def\etocimmediatesettocdepth #1#{\Etoc@set@toctocdepth@immediately} -\def\Etoc@set@toctocdepth@immediately #1{% - \@ifundefined{Etoc@#1@@}% - {\PackageWarning{etoc} - {Unknown sectioning depth #1, \protect\etocimmediatesettocdepth.toc ignored}}% - {\begingroup - \let\Etoc@originalwrite\write - \def\write{\immediate\Etoc@originalwrite}% - \addtocontents {toc} - {\protect\etoc@settocdepth\expandafter\protect - \csname Etoc@#1@@\endcsname}% - \endgroup - }% -} -\def\etocdepthtag #1#{\Etoc@depthtag } -\def\Etoc@depthtag #1{\addtocontents {toc}{\protect\etoc@depthtag {#1}}} -\def\etocimmediatedepthtag #1#{\Etoc@depthtag@immediately } -\def\Etoc@depthtag@immediately #1{% - \begingroup - \let\Etoc@originalwrite\write - \def\write{\immediate\Etoc@originalwrite}% - \addtocontents {toc}{\protect\etoc@depthtag {#1}}% - \endgroup -} -\def\etocignoredepthtags {\let\etoc@depthtag \@gobble } -\def\etocobeydepthtags {\let\etoc@depthtag \Etoc@depthtag@ } -\def\Etoc@depthtag@ #1{\@ifundefined{Etoc@depthof@#1}% - {}% ignore in silence if tag has no associated depth - {\afterassignment\Etoc@@nottoodeep - \global\c@tocdepth\csname Etoc@depthof@#1\endcsname}% -} -\def\etocsettagdepth #1#2{\@ifundefined{Etoc@#2@@}% - {\PackageWarning{etoc} - {Unknown sectioning depth #2, \protect\etocsettagdepth\space ignored}}% - {\@namedef{Etoc@depthof@#1}{\@nameuse{Etoc@#2@@}}}% -} -\def\Etoc@tocvsec@err #1{\PackageError {etoc} - {The command \protect#1\space is incompatible with `etoc'} - {Use \protect\etocsettocdepth.toc as replacement}% -}% -\AtBeginDocument {% - \@ifclassloaded{memoir} - {\PackageInfo {etoc} - {Regarding `memoir' class command \protect\settocdepth, consider\MessageBreak - \protect\etocsettocdepth.toc as a drop-in replacement with more\MessageBreak - capabilities (see `etoc' manual). \space - Also, \protect\etocsettocdepth\MessageBreak - and \protect\etocsetnexttocdepth\space should be used in place of\MessageBreak - `memoir' command \protect\maxtocdepth\@gobble}% - }% - {\@ifpackageloaded {tocvsec2}{% - \def\maxtocdepth #1{\Etoc@tocvsec@err \maxtocdepth }% - \def\settocdepth #1{\Etoc@tocvsec@err \settocdepth }% - \def\resettocdepth {\@ifstar {\Etoc@tocvsec@err \resettocdepth }% - {\Etoc@tocvsec@err \resettocdepth }% - }% - \def\save@tocdepth #1#2#3{}% - \let\reset@tocdepth\relax - \let\remax@tocdepth\relax - \let\tableofcontents\etoctableofcontents - \PackageWarningNoLine {etoc} - {Package `tocvsec2' detected and its modification of\MessageBreak - \protect\tableofcontents\space reverted. \space Use - \protect\etocsettocdepth.toc\MessageBreak as a replacement - for `tocvsec2' toc-related commands}% - }% tocvsec2 loaded - {}% tocvsec2 not loaded - }% -}% -\def\invisibletableofcontents {\etocsetnexttocdepth {-3}\tableofcontents }% -\def\invisiblelocaltableofcontents - {\etocsetnexttocdepth {-3}\localtableofcontents }% -\def\etocsetnexttocdepth #1{% - \@ifundefined{Etoc@#1@@} - {\PackageWarning{etoc} - {Unknown sectioning unit #1, \protect\etocsetnextocdepth\space ignored}} - {\Etoc@setnexttocdepth{\csname Etoc@#1@@\endcsname}}% -}% -\def\Etoc@setnexttocdepth#1{% - \def\Etoc@tocdepthset{% - \Etoc@tocdepthreset - \edef\Etoc@tocdepthreset {% - \global\c@tocdepth\the\c@tocdepth\space - \global\let\noexpand\Etoc@tocdepthreset\noexpand\@empty - }% - \global\c@tocdepth#1% - \global\let\Etoc@tocdepthset\@empty - }% -}% -\let\Etoc@tocdepthreset\@empty -\let\Etoc@tocdepthset \@empty -\def\etocsetlocaltop #1#{\Etoc@set@localtop}% -\def\Etoc@set@localtop #1{% - \@ifundefined{Etoc@#1@@}% - {\PackageWarning{etoc} - {Unknown sectioning depth #1, \protect\etocsetlocaltop.toc ignored}}% - {\addtocontents {toc} - {\protect\etoc@setlocaltop\expandafter\protect\csname Etoc@#1@@\endcsname}}% -}% -\def\etocimmediatesetlocaltop #1#{\Etoc@set@localtop@immediately}% -\def\Etoc@set@localtop@immediately #1{% - \@ifundefined{Etoc@#1@@}% - {\PackageWarning{etoc} - {Unknown sectioning depth #1, \protect\etocimmediatesetlocaltop.toc ignored}}% - {\begingroup - \let\Etoc@originalwrite\write - \def\write{\immediate\Etoc@originalwrite}% - \addtocontents {toc} - {\protect\etoc@setlocaltop\expandafter\protect - \csname Etoc@#1@@\endcsname}% - \endgroup - }% -}% -\def\etoc@setlocaltop #1{% - \ifnum#1=\Etoc@maxlevel - \Etoc@skipthisonetrue - \else - \Etoc@skipthisonefalse - \global\let\Etoc@level #1% - \global\let\Etoc@virtualtop #1% - \ifEtoc@localtoc - \ifEtoc@stoptoc - \Etoc@skipthisonetrue - \else - \ifEtoc@notactive - \Etoc@skipthisonetrue - \else - \unless\ifnum\Etoc@level>\etoclocaltop - \Etoc@skipthisonetrue - \global\Etoc@stoptoctrue - \fi - \fi - \fi - \fi - \fi - \let\Etoc@next\@empty - \ifEtoc@skipthisone - \else - \ifnum\Etoc@level>\c@tocdepth - \else - \ifEtoc@standardlines - \else - \let\Etoc@next\Etoc@setlocaltop@doendsandbegin - \fi - \fi - \fi - \Etoc@next -}% -\def\Etoc@setlocaltop@doendsandbegin{% - \Etoc@doendsandbegin - \global\Etoc@skipprefixfalse -} -\addtocontents {toc}{\protect\@ifundefined{etoctocstyle}% - {\let\protect\etoc@startlocaltoc\protect\@gobble - \let\protect\etoc@settocdepth\protect\@gobble - \let\protect\etoc@depthtag\protect\@gobble - \let\protect\etoc@setlocaltop\protect\@gobble}{}}% -\def\etocstandardlines {\Etoc@standardlinestrue} -\def\etoctoclines {\Etoc@standardlinesfalse} -\etocdefaultlines -\etocstandardlines -\def\etocstandarddisplaystyle{% - \PackageWarningNoLine{etoc}{% - \string\etocstandarddisplaystyle \on@line\MessageBreak - is deprecated. \space Please use \string\etocclasstocstyle}% -} -\expandafter\def\expandafter\etocclasstocstyle\expandafter{% - \etocclasstocstyle - \Etoc@classstyletrue -} -\def\etocetoclocaltocstyle{\Etoc@etocstyletrue} -\def\etocusertocstyle{\Etoc@etocstylefalse} -\etocclasstocstyle -\etocetoclocaltocstyle -\etocobeytoctocdepth -\etocobeydepthtags -\let\etocbeforetitlehook \@empty -\let\etocaftertitlehook \@empty -\let\etocaftercontentshook \@empty -\let\etocaftertochook \@empty -\def\etockeeporiginaltableofcontents - {\Etoc@keeporiginaltoctrue\let\tableofcontents\etocoriginaltableofcontents}% -\endinput -%% -%% End of file `etoc.sty'. diff --git a/documentation/latex/field__variable_8h_source.tex b/documentation/latex/field__variable_8h_source.tex deleted file mode 100644 index 02df5035..00000000 --- a/documentation/latex/field__variable_8h_source.tex +++ /dev/null @@ -1,51 +0,0 @@ -\doxysection{field\+\_\+variable.\+h} -\hypertarget{field__variable_8h_source}{}\label{field__variable_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/storage/field\_variable.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/storage/field\_variable.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} -\DoxyCodeLine{00002\ } -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ "{}array2D.h"{}}} -\DoxyCodeLine{00008\ } - - - - - - - -\DoxyCodeLine{00017\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classArray2D}{Array2D}}} -\DoxyCodeLine{00018\ \{} -\DoxyCodeLine{00019\ \textcolor{keyword}{public}:} - - - - - - -\DoxyCodeLine{00027\ \ \ \ \ \mbox{\hyperlink{classFieldVariable_aa0985778bc6331b74904a03c3ef67a98}{FieldVariable}}(std::array\ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}},\ std::array\ origin,\ std::array\ meshWidth);} -\DoxyCodeLine{00028\ } - - - - - - - -\DoxyCodeLine{00037\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classFieldVariable_a2949624f1d2d7e29872f743db0b1d83b}{interpolateAt}}(\textcolor{keywordtype}{double}\ x,\ \textcolor{keywordtype}{double}\ y)\ \textcolor{keyword}{const};} -\DoxyCodeLine{00038\ } - - - - -\DoxyCodeLine{00044\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classFieldVariable_a55168fd422c70c8386ba311909427cf7}{findAbsMax}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00045\ } -\DoxyCodeLine{00046\ \textcolor{keyword}{private}:} -\DoxyCodeLine{00047\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ origin\_;\ \ \ \ } -\DoxyCodeLine{00048\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ meshWidth\_;\ } -\DoxyCodeLine{00049\ \};} - -\end{DoxyCode} diff --git a/documentation/latex/files.tex b/documentation/latex/files.tex deleted file mode 100644 index 8dca0be9..00000000 --- a/documentation/latex/files.tex +++ /dev/null @@ -1,20 +0,0 @@ -\doxysection{File List} -Here is a list of all documented files with brief descriptions\+:\begin{DoxyCompactList} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/\mbox{\hyperlink{computation_8h_source}{computation.\+h}} }{\pageref{computation_8h_source}}{} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/boundary/\mbox{\hyperlink{boundary_8h_source}{boundary.\+h}} }{\pageref{boundary_8h_source}}{} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/boundary/\mbox{\hyperlink{mask_8h_source}{mask.\+h}} }{\pageref{mask_8h_source}}{} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/\mbox{\hyperlink{central__differences_8h_source}{central\+\_\+differences.\+h}} }{\pageref{central__differences_8h_source}}{} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/\mbox{\hyperlink{discretization_8h_source}{discretization.\+h}} }{\pageref{discretization_8h_source}}{} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/\mbox{\hyperlink{donor__cell_8h_source}{donor\+\_\+cell.\+h}} }{\pageref{donor__cell_8h_source}}{} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/discretization/\mbox{\hyperlink{staggered__grid_8h_source}{staggered\+\_\+grid.\+h}} }{\pageref{staggered__grid_8h_source}}{} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/\mbox{\hyperlink{output__writer_8h_source}{output\+\_\+writer.\+h}} }{\pageref{output__writer_8h_source}}{} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/\mbox{\hyperlink{output__writer__paraview_8h_source}{output\+\_\+writer\+\_\+paraview.\+h}} }{\pageref{output__writer__paraview_8h_source}}{} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/output\+\_\+writer/\mbox{\hyperlink{output__writer__text_8h_source}{output\+\_\+writer\+\_\+text.\+h}} }{\pageref{output__writer__text_8h_source}}{} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/settings\+\_\+parser/\mbox{\hyperlink{settings_8h_source}{settings.\+h}} }{\pageref{settings_8h_source}}{} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/\mbox{\hyperlink{gauss__seidel_8h_source}{gauss\+\_\+seidel.\+h}} }{\pageref{gauss__seidel_8h_source}}{} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/\mbox{\hyperlink{pressure__solver_8h_source}{pressure\+\_\+solver.\+h}} }{\pageref{pressure__solver_8h_source}}{} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/solver/\mbox{\hyperlink{sor_8h_source}{sor.\+h}} }{\pageref{sor_8h_source}}{} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/storage/\mbox{\hyperlink{array2D_8h_source}{array2\+D.\+h}} }{\pageref{array2D_8h_source}}{} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/storage/\mbox{\hyperlink{field__variable_8h_source}{field\+\_\+variable.\+h}} }{\pageref{field__variable_8h_source}}{} -\item\contentsline{section}{/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/surface/\mbox{\hyperlink{fluid__tracer_8h_source}{fluid\+\_\+tracer.\+h}} }{\pageref{fluid__tracer_8h_source}}{} -\end{DoxyCompactList} diff --git a/documentation/latex/fluid__tracer_8h_source.tex b/documentation/latex/fluid__tracer_8h_source.tex deleted file mode 100644 index dcd597e6..00000000 --- a/documentation/latex/fluid__tracer_8h_source.tex +++ /dev/null @@ -1,95 +0,0 @@ -\doxysection{fluid\+\_\+tracer.\+h} -\hypertarget{fluid__tracer_8h_source}{}\label{fluid__tracer_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/surface/fluid\_tracer.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/surface/fluid\_tracer.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} -\DoxyCodeLine{00002\ } -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00007\ } -\DoxyCodeLine{00008\ \textcolor{preprocessor}{\#include\ "{}../discretization/discretization.h"{}}} -\DoxyCodeLine{00009\ \textcolor{preprocessor}{\#include\ "{}../boundary/boundary.h"{}}} -\DoxyCodeLine{00010\ } -\DoxyCodeLine{00011\ } -\DoxyCodeLine{00012\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classFluidTracer}{FluidTracer}}\ \{} -\DoxyCodeLine{00013\ \ \ \ \ \textcolor{keyword}{public}:} -\DoxyCodeLine{00014\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classFluidTracer}{FluidTracer}}(\textcolor{keywordtype}{int}\ numParticlesperCell,} -\DoxyCodeLine{00015\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ discretization,} -\DoxyCodeLine{00016\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ mask);} -\DoxyCodeLine{00017\ } -\DoxyCodeLine{00018\ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ Mainly\ for\ testing\ purposes}} -\DoxyCodeLine{00019\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classFluidTracer}{FluidTracer}}(std::vector\ x,\ std::vector\ y,} -\DoxyCodeLine{00020\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ discretization,} -\DoxyCodeLine{00021\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ mask);} -\DoxyCodeLine{00022\ } - - - - - - - - -\DoxyCodeLine{00032\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classFluidTracer_aba4d452f26e9276b91256dd251789b90}{moveParticles}}(\textcolor{keywordtype}{double}\ dt);} -\DoxyCodeLine{00033\ } - - - - - -\DoxyCodeLine{00040\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classFluidTracer_ace163e1fe040acbd4c3122f082b08eea}{createParticles}}(\textcolor{keywordtype}{double}\ positionSourceX,\ \textcolor{keywordtype}{double}\ positionSourceY);} -\DoxyCodeLine{00041\ } - - - - -\DoxyCodeLine{00047\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classFluidTracer_adc687a4988f532e21e13c9aa0591d658}{getNumberOfParticles}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00048\ } -\DoxyCodeLine{00049\ } - - - - - -\DoxyCodeLine{00056\ \ \ \ \ \ \ \ \ std::array\ \mbox{\hyperlink{classFluidTracer_a37ee0325d6af08be6eba8b073162342e}{getParticlePosition}}(\textcolor{keywordtype}{int}\ i)\ \textcolor{keyword}{const};} -\DoxyCodeLine{00057\ } -\DoxyCodeLine{00058\ \ \ \ \ \ \ \ \ std::array\ cellOfParticle(\textcolor{keywordtype}{int}\ i);} -\DoxyCodeLine{00059\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ val2CellX(\textcolor{keywordtype}{double}\ xVal);} -\DoxyCodeLine{00060\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ val2CellY(\textcolor{keywordtype}{double}\ yVal);} -\DoxyCodeLine{00061\ } -\DoxyCodeLine{00062\ } -\DoxyCodeLine{00063\ } -\DoxyCodeLine{00064\ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ Only\ test}} -\DoxyCodeLine{00065\ \ \ \ \ \ \ \ \ std::array\ updateParticle(\textcolor{keywordtype}{int}\ i,\ std::array\ idx,\ \textcolor{keywordtype}{double}\ dt,\ std::array\ vel,\ \textcolor{keywordtype}{int}\ depth);} -\DoxyCodeLine{00066\ \ \ \ \ \ \ \ \ std::array\ \mbox{\hyperlink{classFluidTracer_aba4d452f26e9276b91256dd251789b90}{moveParticles}}(\textcolor{keywordtype}{double}\ dt,\ std::array\ vel);} -\DoxyCodeLine{00067\ } -\DoxyCodeLine{00068\ } -\DoxyCodeLine{00069\ \ \ \ \ \textcolor{keyword}{private}:} - - - - - - -\DoxyCodeLine{00077\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ initializeFluidCell(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j,\ \textcolor{keywordtype}{int}\ idx);} -\DoxyCodeLine{00078\ } -\DoxyCodeLine{00079\ \ \ \ \ \ \ \ \ std::array\ updateParticle(\textcolor{keywordtype}{int}\ i,\ std::array,\ \textcolor{keywordtype}{double}\ dt,\ std::array\ vel);} -\DoxyCodeLine{00080\ } -\DoxyCodeLine{00081\ } -\DoxyCodeLine{00082\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ numParticles\_;} -\DoxyCodeLine{00083\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ numParticlesPerCell\_;\ \textcolor{comment}{//\ \ }} -\DoxyCodeLine{00084\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ seedRelationDyDx\_;} -\DoxyCodeLine{00085\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ n\_x;} -\DoxyCodeLine{00086\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ n\_y;} -\DoxyCodeLine{00087\ } -\DoxyCodeLine{00088\ \ \ \ \ \ \ \ \ std::shared\_ptr\ discretization\_;} -\DoxyCodeLine{00089\ \ \ \ \ \ \ \ \ std::shared\_ptr\ mask\_;} -\DoxyCodeLine{00090\ \ \ \ \ \ \ \ \ std::vector\ x\_;} -\DoxyCodeLine{00091\ \ \ \ \ \ \ \ \ std::vector\ y\_;} -\DoxyCodeLine{00092\ } -\DoxyCodeLine{00093\ } -\DoxyCodeLine{00094\ \};} - -\end{DoxyCode} diff --git a/documentation/latex/gauss__seidel_8h_source.tex b/documentation/latex/gauss__seidel_8h_source.tex deleted file mode 100644 index c5e99414..00000000 --- a/documentation/latex/gauss__seidel_8h_source.tex +++ /dev/null @@ -1,34 +0,0 @@ -\doxysection{gauss\+\_\+seidel.\+h} -\hypertarget{gauss__seidel_8h_source}{}\label{gauss__seidel_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/solver/gauss\_seidel.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/solver/gauss\_seidel.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} -\DoxyCodeLine{00002\ } -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}pressure\_solver.h"{}}} -\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00005\ } - - - - -\DoxyCodeLine{00011\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classGaussSeidel}{GaussSeidel}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classPressureSolver}{PressureSolver}}} -\DoxyCodeLine{00012\ \{} -\DoxyCodeLine{00013\ } -\DoxyCodeLine{00014\ \textcolor{keyword}{public}:} - - - - - - -\DoxyCodeLine{00022\ \ \ \ \ \mbox{\hyperlink{classGaussSeidel_af31cc1ace2d616ebb8e0592c06865b9c}{GaussSeidel}}(\textcolor{keyword}{const}\ std::shared\_ptr\ \&data,} -\DoxyCodeLine{00023\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ epsilon,} -\DoxyCodeLine{00024\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ maximumNumberOfIterations,} -\DoxyCodeLine{00025\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ boundary);} - - - -\DoxyCodeLine{00030\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classGaussSeidel_a6f0eb0c6938a64f8ded186f88170a04b}{solve}}()\ \textcolor{keyword}{override};} -\DoxyCodeLine{00031\ \};} - -\end{DoxyCode} diff --git a/documentation/latex/hierarchy.tex b/documentation/latex/hierarchy.tex deleted file mode 100644 index 72064932..00000000 --- a/documentation/latex/hierarchy.tex +++ /dev/null @@ -1,31 +0,0 @@ -\doxysection{Class Hierarchy} -This inheritance list is sorted roughly, but not completely, alphabetically\+:\begin{DoxyCompactList} -\item \contentsline{section}{Array2D}{\pageref{classArray2D}}{} -\begin{DoxyCompactList} -\item \contentsline{section}{Field\+Variable}{\pageref{classFieldVariable}}{} -\end{DoxyCompactList} -\item \contentsline{section}{Boundary}{\pageref{classBoundary}}{} -\item \contentsline{section}{Computation}{\pageref{classComputation}}{} -\item \contentsline{section}{Fluid\+Tracer}{\pageref{classFluidTracer}}{} -\item \contentsline{section}{Settings\+::Line\+Content}{\pageref{structSettings_1_1LineContent}}{} -\item \contentsline{section}{Mask}{\pageref{classMask}}{} -\item \contentsline{section}{Output\+Writer}{\pageref{classOutputWriter}}{} -\begin{DoxyCompactList} -\item \contentsline{section}{Output\+Writer\+Paraview}{\pageref{classOutputWriterParaview}}{} -\item \contentsline{section}{Output\+Writer\+Text}{\pageref{classOutputWriterText}}{} -\end{DoxyCompactList} -\item \contentsline{section}{Pressure\+Solver}{\pageref{classPressureSolver}}{} -\begin{DoxyCompactList} -\item \contentsline{section}{Gauss\+Seidel}{\pageref{classGaussSeidel}}{} -\item \contentsline{section}{SOR}{\pageref{classSOR}}{} -\end{DoxyCompactList} -\item \contentsline{section}{Settings}{\pageref{structSettings}}{} -\item \contentsline{section}{Staggered\+Grid}{\pageref{classStaggeredGrid}}{} -\begin{DoxyCompactList} -\item \contentsline{section}{Discretization}{\pageref{classDiscretization}}{} -\begin{DoxyCompactList} -\item \contentsline{section}{Central\+Differences}{\pageref{classCentralDifferences}}{} -\item \contentsline{section}{Donor\+Cell}{\pageref{classDonorCell}}{} -\end{DoxyCompactList} -\end{DoxyCompactList} -\end{DoxyCompactList} diff --git a/documentation/latex/longtable_doxygen.sty b/documentation/latex/longtable_doxygen.sty deleted file mode 100644 index e94b78b6..00000000 --- a/documentation/latex/longtable_doxygen.sty +++ /dev/null @@ -1,456 +0,0 @@ -%% -%% This is file `longtable.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% longtable.dtx (with options: `package') -%% -%% This is a generated file. -%% -%% The source is maintained by the LaTeX Project team and bug -%% reports for it can be opened at http://latex-project.org/bugs.html -%% (but please observe conditions on bug reports sent to that address!) -%% -%% Copyright 1993-2016 -%% The LaTeX3 Project and any individual authors listed elsewhere -%% in this file. -%% -%% This file was generated from file(s) of the Standard LaTeX `Tools Bundle'. -%% -------------------------------------------------------------------------- -%% -%% It may be distributed and/or modified under the -%% conditions of the LaTeX Project Public License, either version 1.3c -%% of this license or (at your option) any later version. -%% The latest version of this license is in -%% http://www.latex-project.org/lppl.txt -%% and version 1.3c or later is part of all distributions of LaTeX -%% version 2005/12/01 or later. -%% -%% This file may only be distributed together with a copy of the LaTeX -%% `Tools Bundle'. You may however distribute the LaTeX `Tools Bundle' -%% without such generated files. -%% -%% The list of all files belonging to the LaTeX `Tools Bundle' is -%% given in the file `manifest.txt'. -%% -%% File: longtable.dtx Copyright (C) 1990-2001 David Carlisle -\NeedsTeXFormat{LaTeX2e}[1995/06/01] -\ProvidesPackage{longtable_doxygen} - [2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen] -\def\LT@err{\PackageError{longtable}} -\def\LT@warn{\PackageWarning{longtable}} -\def\LT@final@warn{% - \AtEndDocument{% - \LT@warn{Table \@width s have changed. Rerun LaTeX.\@gobbletwo}}% - \global\let\LT@final@warn\relax} -\DeclareOption{errorshow}{% - \def\LT@warn{\PackageInfo{longtable}}} -\DeclareOption{pausing}{% - \def\LT@warn#1{% - \LT@err{#1}{This is not really an error}}} -\DeclareOption{set}{} -\DeclareOption{final}{} -\ProcessOptions -\newskip\LTleft \LTleft=\fill -\newskip\LTright \LTright=\fill -\newskip\LTpre \LTpre=\bigskipamount -\newskip\LTpost \LTpost=\bigskipamount -\newcount\LTchunksize \LTchunksize=20 -\let\c@LTchunksize\LTchunksize -\newdimen\LTcapwidth \LTcapwidth=4in -\newbox\LT@head -\newbox\LT@firsthead -\newbox\LT@foot -\newbox\LT@lastfoot -\newcount\LT@cols -\newcount\LT@rows -\newcounter{LT@tables} -\newcounter{LT@chunks}[LT@tables] -\ifx\c@table\undefined - \newcounter{table} - \def\fnum@table{\tablename~\thetable} -\fi -\ifx\tablename\undefined - \def\tablename{Table} -\fi -\newtoks\LT@p@ftn -\mathchardef\LT@end@pen=30000 -\def\longtable{% - \par - \ifx\multicols\@undefined - \else - \ifnum\col@number>\@ne - \@twocolumntrue - \fi - \fi - \if@twocolumn - \LT@err{longtable not in 1-column mode}\@ehc - \fi - \begingroup - \@ifnextchar[\LT@array{\LT@array[x]}} -\def\LT@array[#1]#2{% - \refstepcounter{table}\stepcounter{LT@tables}% - \if l#1% - \LTleft\z@ \LTright\fill - \else\if r#1% - \LTleft\fill \LTright\z@ - \else\if c#1% - \LTleft\fill \LTright\fill - \fi\fi\fi - \let\LT@mcol\multicolumn - \let\LT@@tabarray\@tabarray - \let\LT@@hl\hline - \def\@tabarray{% - \let\hline\LT@@hl - \LT@@tabarray}% - \let\\\LT@tabularcr\let\tabularnewline\\% - \def\newpage{\noalign{\break}}% - \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}% - \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}% - \let\hline\LT@hline \let\kill\LT@kill\let\caption\LT@caption - \@tempdima\ht\strutbox - \let\@endpbox\LT@endpbox - \ifx\extrarowheight\@undefined - \let\@acol\@tabacol - \let\@classz\@tabclassz \let\@classiv\@tabclassiv - \def\@startpbox{\vtop\LT@startpbox}% - \let\@@startpbox\@startpbox - \let\@@endpbox\@endpbox - \let\LT@LL@FM@cr\@tabularcr - \else - \advance\@tempdima\extrarowheight - \col@sep\tabcolsep - \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr - \fi - \setbox\@arstrutbox\hbox{\vrule - \@height \arraystretch \@tempdima - \@depth \arraystretch \dp \strutbox - \@width \z@}% - \let\@sharp##\let\protect\relax - \begingroup - \@mkpream{#2}% - \xdef\LT@bchunk{% - \global\advance\c@LT@chunks\@ne - \global\LT@rows\z@\setbox\z@\vbox\bgroup - \LT@setprevdepth - \tabskip\LTleft \noexpand\halign to\hsize\bgroup - \tabskip\z@ \@arstrut \@preamble \tabskip\LTright \cr}% - \endgroup - \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols - \LT@make@row - \m@th\let\par\@empty - \everycr{}\lineskip\z@\baselineskip\z@ - \LT@bchunk} -\def\LT@no@pgbk#1[#2]{\penalty #1\@getpen{#2}\ifnum`{=0\fi}} -\def\LT@start{% - \let\LT@start\endgraf - \endgraf\penalty\z@\vskip\LTpre - \dimen@\pagetotal - \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi - \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi - \advance\dimen@ \ht\LT@foot - \dimen@ii\vfuzz - \vfuzz\maxdimen - \setbox\tw@\copy\z@ - \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox - \setbox\tw@\vbox{\unvbox\tw@}% - \vfuzz\dimen@ii - \advance\dimen@ \ht - \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi - \advance\dimen@\dp - \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi - \advance\dimen@ -\pagegoal - \ifdim \dimen@>\z@\vfil\break\fi - \global\@colroom\@colht - \ifvoid\LT@foot\else - \advance\vsize-\ht\LT@foot - \global\advance\@colroom-\ht\LT@foot - \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@ - \maxdepth\z@ - \fi - \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak - \output{\LT@output}} -\def\endlongtable{% - \crcr - \noalign{% - \let\LT@entry\LT@entry@chop - \xdef\LT@save@row{\LT@save@row}}% - \LT@echunk - \LT@start - \unvbox\z@ - \LT@get@widths - \if@filesw - {\let\LT@entry\LT@entry@write\immediate\write\@auxout{% - \gdef\expandafter\noexpand - \csname LT@\romannumeral\c@LT@tables\endcsname - {\LT@save@row}}}% - \fi - \ifx\LT@save@row\LT@@save@row - \else - \LT@warn{Column \@width s have changed\MessageBreak - in table \thetable}% - \LT@final@warn - \fi - \endgraf\penalty -\LT@end@pen - \endgroup - \global\@mparbottom\z@ - \pagegoal\vsize - \endgraf\penalty\z@\addvspace\LTpost - \ifvoid\footins\else\insert\footins{}\fi} -\def\LT@nofcols#1&{% - \futurelet\@let@token\LT@n@fcols} -\def\LT@n@fcols{% - \advance\LT@cols\@ne - \ifx\@let@token\LT@nofcols - \expandafter\@gobble - \else - \expandafter\LT@nofcols - \fi} -\def\LT@tabularcr{% - \relax\iffalse{\fi\ifnum0=`}\fi - \@ifstar - {\def\crcr{\LT@crcr\noalign{\nobreak}}\let\cr\crcr - \LT@t@bularcr}% - {\LT@t@bularcr}} -\let\LT@crcr\crcr -\let\LT@setprevdepth\relax -\def\LT@t@bularcr{% - \global\advance\LT@rows\@ne - \ifnum\LT@rows=\LTchunksize - \gdef\LT@setprevdepth{% - \prevdepth\z@\global - \global\let\LT@setprevdepth\relax}% - \expandafter\LT@xtabularcr - \else - \ifnum0=`{}\fi - \expandafter\LT@LL@FM@cr - \fi} -\def\LT@xtabularcr{% - \@ifnextchar[\LT@argtabularcr\LT@ntabularcr} -\def\LT@ntabularcr{% - \ifnum0=`{}\fi - \LT@echunk - \LT@start - \unvbox\z@ - \LT@get@widths - \LT@bchunk} -\def\LT@argtabularcr[#1]{% - \ifnum0=`{}\fi - \ifdim #1>\z@ - \unskip\@xargarraycr{#1}% - \else - \@yargarraycr{#1}% - \fi - \LT@echunk - \LT@start - \unvbox\z@ - \LT@get@widths - \LT@bchunk} -\def\LT@echunk{% - \crcr\LT@save@row\cr\egroup - \global\setbox\@ne\lastbox - \unskip - \egroup} -\def\LT@entry#1#2{% - \ifhmode\@firstofone{&}\fi\omit - \ifnum#1=\c@LT@chunks - \else - \kern#2\relax - \fi} -\def\LT@entry@chop#1#2{% - \noexpand\LT@entry - {\ifnum#1>\c@LT@chunks - 1}{0pt% - \else - #1}{#2% - \fi}} -\def\LT@entry@write{% - \noexpand\LT@entry^^J% - \@spaces} -\def\LT@kill{% - \LT@echunk - \LT@get@widths - \expandafter\LT@rebox\LT@bchunk} -\def\LT@rebox#1\bgroup{% - #1\bgroup - \unvbox\z@ - \unskip - \setbox\z@\lastbox} -\def\LT@blank@row{% - \xdef\LT@save@row{\expandafter\LT@build@blank - \romannumeral\number\LT@cols 001 }} -\def\LT@build@blank#1{% - \if#1m% - \noexpand\LT@entry{1}{0pt}% - \expandafter\LT@build@blank - \fi} -\def\LT@make@row{% - \global\expandafter\let\expandafter\LT@save@row - \csname LT@\romannumeral\c@LT@tables\endcsname - \ifx\LT@save@row\relax - \LT@blank@row - \else - {\let\LT@entry\or - \if!% - \ifcase\expandafter\expandafter\expandafter\LT@cols - \expandafter\@gobble\LT@save@row - \or - \else - \relax - \fi - !% - \else - \aftergroup\LT@blank@row - \fi}% - \fi} -\let\setlongtables\relax -\def\LT@get@widths{% - \setbox\tw@\hbox{% - \unhbox\@ne - \let\LT@old@row\LT@save@row - \global\let\LT@save@row\@empty - \count@\LT@cols - \loop - \unskip - \setbox\tw@\lastbox - \ifhbox\tw@ - \LT@def@row - \advance\count@\m@ne - \repeat}% - \ifx\LT@@save@row\@undefined - \let\LT@@save@row\LT@save@row - \fi} -\def\LT@def@row{% - \let\LT@entry\or - \edef\@tempa{% - \ifcase\expandafter\count@\LT@old@row - \else - {1}{0pt}% - \fi}% - \let\LT@entry\relax - \xdef\LT@save@row{% - \LT@entry - \expandafter\LT@max@sel\@tempa - \LT@save@row}} -\def\LT@max@sel#1#2{% - {\ifdim#2=\wd\tw@ - #1% - \else - \number\c@LT@chunks - \fi}% - {\the\wd\tw@}} -\def\LT@hline{% - \noalign{\ifnum0=`}\fi - \penalty\@M - \futurelet\@let@token\LT@@hline} -\def\LT@@hline{% - \ifx\@let@token\hline - \global\let\@gtempa\@gobble - \gdef\LT@sep{\penalty-\@medpenalty\vskip\doublerulesep}% - \else - \global\let\@gtempa\@empty - \gdef\LT@sep{\penalty-\@lowpenalty\vskip-\arrayrulewidth}% - \fi - \ifnum0=`{\fi}% - \multispan\LT@cols - \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr - \noalign{\LT@sep}% - \multispan\LT@cols - \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr - \noalign{\penalty\@M}% - \@gtempa} -\def\LT@caption{% - \noalign\bgroup - \@ifnextchar[{\egroup\LT@c@ption\@firstofone}\LT@capti@n} -\def\LT@c@ption#1[#2]#3{% - \LT@makecaption#1\fnum@table{#3}% - \def\@tempa{#2}% - \ifx\@tempa\@empty\else - {\let\\\space - \addcontentsline{lot}{table}{\protect\numberline{\thetable}{#2}}}% - \fi} -\def\LT@capti@n{% - \@ifstar - {\egroup\LT@c@ption\@gobble[]}% - {\egroup\@xdblarg{\LT@c@ption\@firstofone}}} -\def\LT@makecaption#1#2#3{% - \LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\LTcapwidth{% - \sbox\@tempboxa{#1{#2: }#3}% - \ifdim\wd\@tempboxa>\hsize - #1{#2: }#3% - \else - \hbox to\hsize{\hfil\box\@tempboxa\hfil}% - \fi - \endgraf\vskip\baselineskip}% - \hss}}} -\def\LT@output{% - \ifnum\outputpenalty <-\@Mi - \ifnum\outputpenalty > -\LT@end@pen - \LT@err{floats and marginpars not allowed in a longtable}\@ehc - \else - \setbox\z@\vbox{\unvbox\@cclv}% - \ifdim \ht\LT@lastfoot>\ht\LT@foot - \dimen@\pagegoal - \advance\dimen@-\ht\LT@lastfoot - \ifdim\dimen@<\ht\z@ - \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}% - \@makecol - \@outputpage - \setbox\z@\vbox{\box\LT@head}% - \fi - \fi - \global\@colroom\@colht - \global\vsize\@colht - \vbox - {\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}% - \fi - \else - \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}% - \@makecol - \@outputpage - \global\vsize\@colroom - \copy\LT@head\nobreak - \fi} -\def\LT@end@hd@ft#1{% - \LT@echunk - \ifx\LT@start\endgraf - \LT@err - {Longtable head or foot not at start of table}% - {Increase LTchunksize}% - \fi - \setbox#1\box\z@ - \LT@get@widths - \LT@bchunk} -\def\endfirsthead{\LT@end@hd@ft\LT@firsthead} -\def\endhead{\LT@end@hd@ft\LT@head} -\def\endfoot{\LT@end@hd@ft\LT@foot} -\def\endlastfoot{\LT@end@hd@ft\LT@lastfoot} -\def\LT@startpbox#1{% - \bgroup - \let\@footnotetext\LT@p@ftntext - \setlength\hsize{#1}% - \@arrayparboxrestore - \vrule \@height \ht\@arstrutbox \@width \z@} -\def\LT@endpbox{% - \@finalstrut\@arstrutbox - \egroup - \the\LT@p@ftn - \global\LT@p@ftn{}% - \hfil} -%% added \long to prevent: -% LaTeX Warning: Command \LT@p@ftntext has changed. -% -% from the original repository (https://github.com/latex3/latex2e/blob/develop/required/tools/longtable.dtx): -% \changes{v4.15}{2021/03/28} -% {make long for gh/364} -% Inside the `p' column, just save up the footnote text in a token -% register. -\long\def\LT@p@ftntext#1{% - \edef\@tempa{\the\LT@p@ftn\noexpand\footnotetext[\the\c@footnote]}% - \global\LT@p@ftn\expandafter{\@tempa{#1}}}% - -\@namedef{ver@longtable.sty}{2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen} -\endinput -%% -%% End of file `longtable.sty'. diff --git a/documentation/latex/mask_8h_source.tex b/documentation/latex/mask_8h_source.tex deleted file mode 100644 index 5af910f4..00000000 --- a/documentation/latex/mask_8h_source.tex +++ /dev/null @@ -1,172 +0,0 @@ -\doxysection{mask.\+h} -\hypertarget{mask_8h_source}{}\label{mask_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/boundary/mask.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/boundary/mask.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} -\DoxyCodeLine{00002\ } -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00007\ } -\DoxyCodeLine{00008\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00009\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00010\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00011\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00012\ \textcolor{preprocessor}{\#include\ "{}../settings\_parser/settings.h"{}}} -\DoxyCodeLine{00013\ } -\DoxyCodeLine{00014\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classMask}{Mask}}} -\DoxyCodeLine{00015\ \{} -\DoxyCodeLine{00016\ \textcolor{keyword}{public}:} - - - - -\DoxyCodeLine{00022\ \ \ \ \ \mbox{\hyperlink{classMask_a5d65d3a108a79864bc69994f5e56f6c3}{Mask}}(\mbox{\hyperlink{structSettings}{Settings}}\ settings);} -\DoxyCodeLine{00023\ } -\DoxyCodeLine{00024\ \ \ \ \ \textcolor{comment}{//\ TODO:\ it\ is\ weird\ but\ if\ we\ would\ use\ \`{}char`\ instead\ of\ int,\ we\ would\ use\ less\ memory}} -\DoxyCodeLine{00025\ } -\DoxyCodeLine{00026\ \ \ \ \ \textcolor{keyword}{enum}\ CellType} -\DoxyCodeLine{00027\ \ \ \ \ \{} -\DoxyCodeLine{00028\ \ \ \ \ \ \ \ \ FLUID\_DROPLET\ =\ 0,} -\DoxyCodeLine{00029\ } -\DoxyCodeLine{00030\ \ \ \ \ \ \ \ \ FLUID\_SINGLE\_LEFT\ =\ 1,} -\DoxyCodeLine{00031\ \ \ \ \ \ \ \ \ FLUID\_SINGLE\_TOP\ =\ 2,} -\DoxyCodeLine{00032\ \ \ \ \ \ \ \ \ FLUID\_SINGLE\_RIGHT\ =\ 4,} -\DoxyCodeLine{00033\ \ \ \ \ \ \ \ \ FLUID\_SINGLE\_BOTTOM\ =\ 8,} -\DoxyCodeLine{00034\ } -\DoxyCodeLine{00035\ \ \ \ \ \ \ \ \ FLUID\_CORNER\_BOTTOM\_LEFT\ =\ 6,} -\DoxyCodeLine{00036\ \ \ \ \ \ \ \ \ FLUID\_CORNER\_TOP\_LEFT\ =\ 12,} -\DoxyCodeLine{00037\ \ \ \ \ \ \ \ \ FLUID\_CORNER\_TOP\_RIGHT\ =\ 9,} -\DoxyCodeLine{00038\ \ \ \ \ \ \ \ \ FLUID\_CORNER\_BOTTOM\_RIGHT\ =\ 3,} -\DoxyCodeLine{00039\ } -\DoxyCodeLine{00040\ \ \ \ \ \ \ \ \ FLUID\_COLUMN\_HORIZONTAL\ =\ 5,} -\DoxyCodeLine{00041\ \ \ \ \ \ \ \ \ FLUID\_COLUMN\_VERTICAL\ =\ 10,} -\DoxyCodeLine{00042\ } -\DoxyCodeLine{00043\ \ \ \ \ \ \ \ \ FLUID\_BORDER\_LEFT\ =\ 14,} -\DoxyCodeLine{00044\ \ \ \ \ \ \ \ \ FLUID\_BORDER\_TOP\ =\ 13,} -\DoxyCodeLine{00045\ \ \ \ \ \ \ \ \ FLUID\_BORDER\_RIGHT\ =\ 11,} -\DoxyCodeLine{00046\ \ \ \ \ \ \ \ \ FLUID\_BORDER\_BOTTOM\ =\ 7,} -\DoxyCodeLine{00047\ } -\DoxyCodeLine{00048\ \ \ \ \ \ \ \ \ FLUID\ =\ 15,} -\DoxyCodeLine{00049\ \ \ \ \ \ \ \ \ FLUID\_TYPE\ =\ 50,} -\DoxyCodeLine{00050\ \ \ \ \ \ \ \ \ AIR\ =\ 64,} -\DoxyCodeLine{00051\ } -\DoxyCodeLine{00052\ \ \ \ \ \ \ \ \ OBSTACLE\ =\ 99,} -\DoxyCodeLine{00053\ \ \ \ \ \ \ \ \ OBSTACLE\_INSIDE\ =\ 100,} -\DoxyCodeLine{00054\ } -\DoxyCodeLine{00055\ \ \ \ \ \ \ \ \ OBSTACLE\_BORDER\_LEFT\ =\ 101,} -\DoxyCodeLine{00056\ \ \ \ \ \ \ \ \ OBSTACLE\_BORDER\_TOP\ =\ 102,} -\DoxyCodeLine{00057\ \ \ \ \ \ \ \ \ OBSTACLE\_CORNER\_TOP\_LEFT\ =\ 103,} -\DoxyCodeLine{00058\ \ \ \ \ \ \ \ \ OBSTACLE\_BORDER\_RIGHT\ =\ 104,} -\DoxyCodeLine{00059\ \ \ \ \ \ \ \ \ OBSTACLE\_CORNER\_TOP\_RIGHT\ =\ 106,} -\DoxyCodeLine{00060\ \ \ \ \ \ \ \ \ OBSTACLE\_BORDER\_BOTTOM\ =\ 108,} -\DoxyCodeLine{00061\ \ \ \ \ \ \ \ \ OBSTACLE\_CORNER\_BOTTOM\_LEFT\ =\ 109,} -\DoxyCodeLine{00062\ \ \ \ \ \ \ \ \ OBSTACLE\_CORNER\_BOTTOM\_RIGHT\ =\ 112,} -\DoxyCodeLine{00063\ } -\DoxyCodeLine{00064\ \ \ \ \ \ \ \ \ DOMAIN\_BOUNDARY\ =\ 200,} -\DoxyCodeLine{00065\ } -\DoxyCodeLine{00066\ \ \ \ \ \ \ \ \ DOMAIN\_LEFT\_NOSLIP\ =\ 201,} -\DoxyCodeLine{00067\ \ \ \ \ \ \ \ \ DOMAIN\_TOP\_NOSLIP\ =\ 202,} -\DoxyCodeLine{00068\ \ \ \ \ \ \ \ \ DOMAIN\_RIGHT\_NOSLIP\ =\ 203,} -\DoxyCodeLine{00069\ \ \ \ \ \ \ \ \ DOMAIN\_BOTTOM\_NOSLIP\ =\ 204,} -\DoxyCodeLine{00070\ } -\DoxyCodeLine{00071\ \ \ \ \ \ \ \ \ DOMAIN\_LEFT\_PRESSURE\ =\ 205,} -\DoxyCodeLine{00072\ \ \ \ \ \ \ \ \ DOMAIN\_TOP\_PRESSURE\ =\ 206,} -\DoxyCodeLine{00073\ \ \ \ \ \ \ \ \ DOMAIN\_RIGHT\_PRESSURE\ =\ 207,} -\DoxyCodeLine{00074\ \ \ \ \ \ \ \ \ DOMAIN\_BOTTOM\_PRESSURE\ =\ 208,} -\DoxyCodeLine{00075\ \ \ \ \ \};} -\DoxyCodeLine{00076\ } - - - - - - -\DoxyCodeLine{00084\ \ \ \ \ \textcolor{keywordtype}{int}\ \&\mbox{\hyperlink{classMask_a6d612f1ac2185304b3ad7432d90dcd2b}{operator()}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} -\DoxyCodeLine{00085\ } - - - - - - -\DoxyCodeLine{00093\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classMask_a6d612f1ac2185304b3ad7432d90dcd2b}{operator()}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} -\DoxyCodeLine{00094\ } - - -\DoxyCodeLine{00098\ \ \ \ \ std::array\ \mbox{\hyperlink{classMask_aafa0857af35b02ba6070e76f82d51c7b}{size}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00099\ } - - - -\DoxyCodeLine{00104\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classMask_ac30997cdd83faef98290733acb325cf8}{resetMask}}();} -\DoxyCodeLine{00105\ } -\DoxyCodeLine{00106\ \ \ \ \ \textcolor{comment}{//\ ********************************************************}} -\DoxyCodeLine{00107\ \ \ \ \ \textcolor{comment}{//\ R\ E\ Q\ U\ E\ S\ T\ S\ }} -\DoxyCodeLine{00108\ } - - - - - - - -\DoxyCodeLine{00117\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{classMask_aadacef52f95b796920864b8519d0594b}{isFluid}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} -\DoxyCodeLine{00118\ } - - - - - -\DoxyCodeLine{00125\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{classMask_a53e4e7c0b29234856cbee33386cc5c18}{isObstacle}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} -\DoxyCodeLine{00126\ } -\DoxyCodeLine{00127\ } - - - - - - - -\DoxyCodeLine{00136\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{classMask_a7eb34f789ef96c622ab93718d5278d77}{isAir}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} -\DoxyCodeLine{00137\ \ \ \ \ \textcolor{keywordtype}{bool}\ isInnerFluid(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} -\DoxyCodeLine{00138\ } -\DoxyCodeLine{00139\ } -\DoxyCodeLine{00140\ \ \ \ \ \textcolor{keywordtype}{bool}\ isDomainBoundary(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} -\DoxyCodeLine{00141\ \ \ \ \ \textcolor{keywordtype}{bool}\ isObstacleBoundary(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} -\DoxyCodeLine{00142\ \ \ \ \ \textcolor{keywordtype}{bool}\ isFluidBoundary(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} -\DoxyCodeLine{00143\ } -\DoxyCodeLine{00144\ } - - - - - -\DoxyCodeLine{00151\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classMask_a3471a6026ce7eab118f660557a8abac6}{getNumberOfFluidCells}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00152\ } -\DoxyCodeLine{00153\ \ \ \ \ \textcolor{comment}{//\ For\ initialization}} -\DoxyCodeLine{00154\ \ \ \ \ \textcolor{keywordtype}{void}\ makeRectangularObstacle();} -\DoxyCodeLine{00155\ \ \ \ \ \textcolor{keywordtype}{void}\ createMaskFromPNGBitMap();} -\DoxyCodeLine{00156\ } -\DoxyCodeLine{00157\ } -\DoxyCodeLine{00158\ } -\DoxyCodeLine{00159\ } -\DoxyCodeLine{00160\ \ \ \ \ \textcolor{comment}{//\ Sets\ Enums\ for\ Boundary\ Types\ from\ type\ FLUID,\ AIR,\ OBSTACLE,\ DOMAIN}} -\DoxyCodeLine{00161\ \ \ \ \ \textcolor{comment}{//\ \ -\/\ uses\ \`{}settings`\ and\ neighbours}} -\DoxyCodeLine{00162\ \ \ \ \ \textcolor{keywordtype}{void}\ setDomainBC();} -\DoxyCodeLine{00163\ \ \ \ \ \textcolor{keywordtype}{void}\ setObstacleBC();} -\DoxyCodeLine{00164\ \ \ \ \ \textcolor{keywordtype}{void}\ setFluidBC();} -\DoxyCodeLine{00165\ } -\DoxyCodeLine{00166\ \ \ \ \ \textcolor{keywordtype}{void}\ printMask()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00167\ } -\DoxyCodeLine{00168\ } -\DoxyCodeLine{00169\ \textcolor{keyword}{protected}:} -\DoxyCodeLine{00170\ \ \ \ \ std::array\ \mbox{\hyperlink{classMask_a84bff46271e16eb8639c1831403c1bb9}{size\_}};\ } -\DoxyCodeLine{00171\ \ \ \ \ std::vector\ \mbox{\hyperlink{classMask_acdb73aee935b502fecc8de6bf1e32a09}{data\_}};\ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00172\ \ \ \ \ std::vector\ \mbox{\hyperlink{classMask_a3c5a51f6d03bb4a5e1742537a22ec441}{boundary\_list}};\ } -\DoxyCodeLine{00173\ \ \ \ \ \mbox{\hyperlink{structSettings}{Settings}}\ settings\_;} -\DoxyCodeLine{00174\ \ \ \ \ \textcolor{keywordtype}{int}\ forbiddenObstacleFluidCombinations[7]\ =\ \{105,107,110,111,113,114,115\};} -\DoxyCodeLine{00175\ \};} - -\end{DoxyCode} diff --git a/documentation/latex/output__writer_8h_source.tex b/documentation/latex/output__writer_8h_source.tex deleted file mode 100644 index 727b14c7..00000000 --- a/documentation/latex/output__writer_8h_source.tex +++ /dev/null @@ -1,38 +0,0 @@ -\doxysection{output\+\_\+writer.\+h} -\hypertarget{output__writer_8h_source}{}\label{output__writer_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/output\_writer/output\_writer.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/output\_writer/output\_writer.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} -\DoxyCodeLine{00002\ } -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}../discretization/discretization.h"{}}} -\DoxyCodeLine{00004\ } -\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00008\ } - - - -\DoxyCodeLine{00013\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classOutputWriter}{OutputWriter}}} -\DoxyCodeLine{00014\ \{} -\DoxyCodeLine{00015\ \textcolor{keyword}{public}:} - - - - -\DoxyCodeLine{00021\ \ \ \mbox{\hyperlink{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}{OutputWriter}}(std::shared\_ptr\ discretization);} -\DoxyCodeLine{00022\ } - - - - - - -\DoxyCodeLine{00030\ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classOutputWriter_ac625c204affdc05919388a3549c2e945}{writeFile}}(\textcolor{keywordtype}{double}\ currentTime)\ =\ 0;} -\DoxyCodeLine{00031\ } -\DoxyCodeLine{00032\ \textcolor{keyword}{protected}:} -\DoxyCodeLine{00033\ \ \ std::shared\_ptr\ \mbox{\hyperlink{classOutputWriter_a0587b2dc160a9b1393411433dfc23b68}{discretization\_}};\ } -\DoxyCodeLine{00034\ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classOutputWriter_a69d167e2526407602dce26ca7a2b9248}{fileNo\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00035\ \};} - -\end{DoxyCode} diff --git a/documentation/latex/output__writer__paraview_8h_source.tex b/documentation/latex/output__writer__paraview_8h_source.tex deleted file mode 100644 index 54a24f27..00000000 --- a/documentation/latex/output__writer__paraview_8h_source.tex +++ /dev/null @@ -1,47 +0,0 @@ -\doxysection{output\+\_\+writer\+\_\+paraview.\+h} -\hypertarget{output__writer__paraview_8h_source}{}\label{output__writer__paraview_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/output\_writer/output\_writer\_paraview.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/output\_writer/output\_writer\_paraview.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} -\DoxyCodeLine{00002\ } -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}output\_writer.h"{}}} -\DoxyCodeLine{00004\ } -\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00008\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00009\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00010\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00011\ } -\DoxyCodeLine{00012\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00013\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00014\ \textcolor{preprocessor}{\#include\ "{}../boundary/mask.h"{}}} -\DoxyCodeLine{00015\ } - - - - - - - -\DoxyCodeLine{00024\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classOutputWriterParaview}{OutputWriterParaview}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classOutputWriter}{OutputWriter}}} -\DoxyCodeLine{00025\ \{} -\DoxyCodeLine{00026\ \textcolor{keyword}{public}:} - - - - -\DoxyCodeLine{00032\ \ \ \mbox{\hyperlink{classOutputWriterParaview_a7a599c2694986563c801806234eb07d7}{OutputWriterParaview}}(std::shared\_ptr\ discretization,\ std::shared\_ptr\ mask);} -\DoxyCodeLine{00033\ } - - - - -\DoxyCodeLine{00039\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classOutputWriterParaview_a9e203b63d0e2f26ad53d18ee1821c6bb}{writeFile}}(\textcolor{keywordtype}{double}\ currentTime);} -\DoxyCodeLine{00040\ } -\DoxyCodeLine{00041\ \textcolor{keyword}{private}:} -\DoxyCodeLine{00042\ \ \ vtkSmartPointer\ vtkWriter\_;\ } -\DoxyCodeLine{00043\ \ \ std::shared\_ptr\ mask\_;} -\DoxyCodeLine{00044\ \};} - -\end{DoxyCode} diff --git a/documentation/latex/output__writer__text_8h_source.tex b/documentation/latex/output__writer__text_8h_source.tex deleted file mode 100644 index 8c93c215..00000000 --- a/documentation/latex/output__writer__text_8h_source.tex +++ /dev/null @@ -1,41 +0,0 @@ -\doxysection{output\+\_\+writer\+\_\+text.\+h} -\hypertarget{output__writer__text_8h_source}{}\label{output__writer__text_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/output\_writer/output\_writer\_text.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/output\_writer/output\_writer\_text.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} -\DoxyCodeLine{00002\ } -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}output\_writer.h"{}}} -\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00008\ } - - - - - - -\DoxyCodeLine{00016\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classOutputWriterText}{OutputWriterText}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classOutputWriter}{OutputWriter}}} -\DoxyCodeLine{00017\ \{} -\DoxyCodeLine{00018\ \textcolor{keyword}{public}:} - - -\DoxyCodeLine{00022\ \ \ \textcolor{keyword}{using\ }\mbox{\hyperlink{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}{OutputWriter::OutputWriter}};} -\DoxyCodeLine{00023\ } - - - - - - -\DoxyCodeLine{00031\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classOutputWriterText_a25a12ea2524fc34e9acb19ef1f4c7431}{writeFile}}(\textcolor{keywordtype}{double}\ currentTime);} -\DoxyCodeLine{00032\ } - - - - -\DoxyCodeLine{00038\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classOutputWriterText_a3480b58a23fd158f16d0ef9c1b67cbfd}{writePressureFile}}();} -\DoxyCodeLine{00039\ \};} - -\end{DoxyCode} diff --git a/documentation/latex/pressure__solver_8h_source.tex b/documentation/latex/pressure__solver_8h_source.tex deleted file mode 100644 index 346dbb83..00000000 --- a/documentation/latex/pressure__solver_8h_source.tex +++ /dev/null @@ -1,70 +0,0 @@ -\doxysection{pressure\+\_\+solver.\+h} -\hypertarget{pressure__solver_8h_source}{}\label{pressure__solver_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/solver/pressure\_solver.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/solver/pressure\_solver.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} -\DoxyCodeLine{00002\ } -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00006\ } -\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ "{}../storage/field\_variable.h"{}}} -\DoxyCodeLine{00008\ \textcolor{preprocessor}{\#include\ "{}../discretization/discretization.h"{}}} -\DoxyCodeLine{00009\ \textcolor{preprocessor}{\#include\ "{}../boundary/boundary.h"{}}} -\DoxyCodeLine{00010\ } -\DoxyCodeLine{00011\ } - - - - - - - -\DoxyCodeLine{00020\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classPressureSolver}{PressureSolver}}} -\DoxyCodeLine{00021\ \{} -\DoxyCodeLine{00022\ \textcolor{keyword}{public}:} - - - - - - - -\DoxyCodeLine{00031\ \ \ \ \ \mbox{\hyperlink{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058}{PressureSolver}}(std::shared\_ptr\ discretization,} -\DoxyCodeLine{00032\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ epsilon,} -\DoxyCodeLine{00033\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ maximumNumberOfIterations,} -\DoxyCodeLine{00034\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ boundary);} -\DoxyCodeLine{00035\ \ } - - - -\DoxyCodeLine{00040\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0}{solve}}()\ =\ 0;} -\DoxyCodeLine{00041\ } -\DoxyCodeLine{00042\ \ \ \ \ \textcolor{keywordtype}{double}\ dx2,\ \mbox{\hyperlink{classPressureSolver_a25b7ff50bdaea53d1b5c7a5cf735c5b5}{dy2}};\ } -\DoxyCodeLine{00043\ } -\DoxyCodeLine{00044\ \textcolor{keyword}{protected}:} - - - - - -\DoxyCodeLine{00051\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classPressureSolver_a458c383fcacaf54c1a333a271049ca93}{setBoundaryValues}}();} -\DoxyCodeLine{00052\ } - - -\DoxyCodeLine{00056\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classPressureSolver_afc51f4315c483988aeec327a16c5bb90}{calculateResiduum}}();} -\DoxyCodeLine{00057\ } -\DoxyCodeLine{00058\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classPressureSolver_af3ac2e53c6f49b9a362415a89595a7f0}{i\_beg}};\ } -\DoxyCodeLine{00059\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classPressureSolver_a41b263980e55591d1ffdc4837c252a61}{i\_end}};\ } -\DoxyCodeLine{00060\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classPressureSolver_aa309af30e5e63e09b77900091e562235}{j\_beg}};\ } -\DoxyCodeLine{00061\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classPressureSolver_ac2402794034dd74073700998ee2860bf}{j\_end}};\ } -\DoxyCodeLine{00062\ } -\DoxyCodeLine{00063\ \ \ \ \ std::shared\_ptr\ \mbox{\hyperlink{classPressureSolver_af579ecebaaa8b11914293ef18af5fdc6}{discretization\_}};\ } -\DoxyCodeLine{00064\ \ \ \ \ std::shared\_ptr\ \mbox{\hyperlink{classPressureSolver_a0b17b46580d259e4bb3a05486bc06a60}{boundary\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00065\ } -\DoxyCodeLine{00066\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classPressureSolver_a22b723f3b3ba54e47f36cfc2b9576749}{epsilon\_}};\ } -\DoxyCodeLine{00067\ } -\DoxyCodeLine{00068\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classPressureSolver_af3b02d29bf1b21ad8b7e6edf8c2f4e87}{maximumNumberOfIterations\_}};\ } -\DoxyCodeLine{00069\ \};} - -\end{DoxyCode} diff --git a/documentation/latex/refman.tex b/documentation/latex/refman.tex deleted file mode 100644 index f37c07a9..00000000 --- a/documentation/latex/refman.tex +++ /dev/null @@ -1,262 +0,0 @@ - % Handle batch mode - % to overcome problems with too many open files - \let\mypdfximage\pdfximage\def\pdfximage{\immediate\mypdfximage} - \pdfminorversion=7 - % Set document class depending on configuration - \documentclass[twoside]{book} - %% moved from doxygen.sty due to workaround for LaTex 2019 version and unmaintained tabu package - \usepackage{ifthen} - \ifx\requestedLaTeXdate\undefined - \usepackage{array} - \else - \usepackage{array}[=2016-10-06] - \fi - %% - % Packages required by doxygen - \makeatletter - \providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion} - % suppress package identification of infwarerr as it contains the word "warning" - \let\@@protected@wlog\protected@wlog - \def\protected@wlog#1{\wlog{package info suppressed}} - \RequirePackage{infwarerr} - \let\protected@wlog\@@protected@wlog - \makeatother - \IfFormatAtLeastTF{2016/01/01}{}{\usepackage{fixltx2e}} % for \textsubscript - \IfFormatAtLeastTF{2015/01/01}{\pdfsuppresswarningpagegroup=1}{} - \usepackage{doxygen} - \usepackage{graphicx} - \usepackage[utf8]{inputenc} - \usepackage{makeidx} - \PassOptionsToPackage{warn}{textcomp} - \usepackage{textcomp} - \usepackage[nointegrals]{wasysym} - \usepackage{ifxetex} - % NLS support packages - % Define default fonts - % Font selection - \usepackage[T1]{fontenc} - % set main and monospaced font - \usepackage[scaled=.90]{helvet} -\usepackage{courier} -\renewcommand{\familydefault}{\sfdefault} - \doxyallsectionsfont{% - \fontseries{bc}\selectfont% - \color{darkgray}% - } - \renewcommand{\DoxyLabelFont}{% - \fontseries{bc}\selectfont% - \color{darkgray}% - } - \newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}} - % Arguments of doxygenemoji: - % 1) '::' form of the emoji, already LaTeX-escaped - % 2) file with the name of the emoji without the .png extension - % in case image exist use this otherwise use the '::' form - \newcommand{\doxygenemoji}[2]{% - \IfFileExists{./#2.png}{\raisebox{-0.1em}{\includegraphics[height=0.9em]{./#2.png}}}{#1}% - } - % Page & text layout - \usepackage{geometry} - \geometry{% - a4paper,% - top=2.5cm,% - bottom=2.5cm,% - left=2.5cm,% - right=2.5cm% - } - \usepackage{changepage} - % Allow a bit of overflow to go unnoticed by other means - \tolerance=750 - \hfuzz=15pt - \hbadness=750 - \setlength{\emergencystretch}{15pt} - \setlength{\parindent}{0cm} - \newcommand{\doxynormalparskip}{\setlength{\parskip}{3ex plus 2ex minus 2ex}} - \newcommand{\doxytocparskip}{\setlength{\parskip}{1ex plus 0ex minus 0ex}} - \doxynormalparskip - % Redefine paragraph/subparagraph environments, using sectsty fonts - \makeatletter - \renewcommand{\paragraph}{% - \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{% - \normalfont\normalsize\bfseries\SS@parafont% - }% - } - \renewcommand{\subparagraph}{% - \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{% - \normalfont\normalsize\bfseries\SS@subparafont% - }% - } - \makeatother - \makeatletter - \newcommand\hrulefilll{\leavevmode\leaders\hrule\hskip 0pt plus 1filll\kern\z@} - \makeatother - % Headers & footers - \usepackage{fancyhdr} - \pagestyle{fancyplain} - \renewcommand{\footrulewidth}{0.4pt} - \fancypagestyle{fancyplain}{ - \fancyhf{} - \fancyhead[LE, RO]{\bfseries\thepage} - \fancyhead[LO]{\bfseries\rightmark} - \fancyhead[RE]{\bfseries\leftmark} - \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen } - } - \fancypagestyle{plain}{ - \fancyhf{} - \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen } - \renewcommand{\headrulewidth}{0pt} - } - \pagestyle{fancyplain} - \renewcommand{\chaptermark}[1]{% - \markboth{#1}{}% - } - \renewcommand{\sectionmark}[1]{% - \markright{\thesection\ #1}% - } - % ToC, LoF, LoT, bibliography, and index - % Indices & bibliography - \usepackage{natbib} - \usepackage[titles]{tocloft} - \setcounter{tocdepth}{3} - \setcounter{secnumdepth}{5} - % creating indexes - \makeindex - \usepackage{newunicodechar} - \makeatletter - \def\doxynewunicodechar#1#2{% - \@tempswafalse - \edef\nuc@tempa{\detokenize{#1}}% - \if\relax\nuc@tempa\relax - \nuc@emptyargerr - \else - \edef\@tempb{\expandafter\@car\nuc@tempa\@nil}% - \nuc@check - \if@tempswa - \@namedef{u8:\nuc@tempa}{#2}% - \fi - \fi - } - \makeatother - \doxynewunicodechar{⁻}{${}^{-}$}% Superscript minus - \doxynewunicodechar{²}{${}^{2}$}% Superscript two - \doxynewunicodechar{³}{${}^{3}$}% Superscript three - % Hyperlinks - % Hyperlinks (required, but should be loaded last) - \ifpdf - \usepackage[pdftex,pagebackref=true]{hyperref} - \else - \ifxetex - \usepackage[pagebackref=true]{hyperref} - \else - \usepackage[ps2pdf,pagebackref=true]{hyperref} - \fi - \fi - \hypersetup{% - colorlinks=true,% - linkcolor=blue,% - citecolor=blue,% - unicode,% - pdftitle={Num\+Sim},% - pdfsubject={Numerical Simulation of fluid-\/flow}% - } - % Custom commands used by the header - % Custom commands - \newcommand{\clearemptydoublepage}{% - \newpage{\pagestyle{empty}\cleardoublepage}% - } - % caption style definition - \usepackage{caption} - \captionsetup{labelsep=space,justification=centering,font={bf},singlelinecheck=off,skip=4pt,position=top} - % in page table of contents - \IfFormatAtLeastTF{2023/05/01}{\usepackage[deeplevels]{etoc}}{\usepackage[deeplevels]{etoc_doxygen}} - \etocsettocstyle{\doxytocparskip}{\doxynormalparskip} - \etocsetlevel{subsubsubsection}{4} - \etocsetlevel{subsubsubsubsection}{5} - \etocsetlevel{subsubsubsubsubsection}{6} - \etocsetlevel{subsubsubsubsubsubsection}{7} - \etocsetlevel{paragraph}{8} - \etocsetlevel{subparagraph}{9} - % prevent numbers overlap the titles in toc - \renewcommand{\numberline}[1]{#1~} -% End of preamble, now comes the document contents -%===== C O N T E N T S ===== -\begin{document} - \raggedbottom - % Titlepage & ToC - % To avoid duplicate page anchors due to reuse of same numbers for - % the index (be it as roman numbers) - \hypersetup{pageanchor=false, - bookmarksnumbered=true, - pdfencoding=unicode - } - \pagenumbering{alph} - \begin{titlepage} - \vspace*{7cm} - \begin{center}% - {\Large Num\+Sim}\\ - [1ex]\large 1.\+0 \\ - \vspace*{1cm} - {\large Generated by Doxygen 1.10.0}\\ - \end{center} - \end{titlepage} - \clearemptydoublepage - \pagenumbering{roman} - \tableofcontents - \clearemptydoublepage - \pagenumbering{arabic} - % re-enable anchors again - \hypersetup{pageanchor=true} -%--- Begin generated contents --- -\chapter{Hierarchical Index} -\input{hierarchy} -\chapter{Class Index} -\input{annotated} -\chapter{File Index} -\input{files} -\chapter{Class Documentation} -\input{classArray2D} -\input{classBoundary} -\input{classCentralDifferences} -\input{classComputation} -\input{classDiscretization} -\input{classDonorCell} -\input{classFieldVariable} -\input{classFluidTracer} -\input{classGaussSeidel} -\input{structSettings_1_1LineContent} -\input{classMask} -\input{classOutputWriter} -\input{classOutputWriterParaview} -\input{classOutputWriterText} -\input{classPressureSolver} -\input{structSettings} -\input{classSOR} -\input{classStaggeredGrid} -\chapter{File Documentation} -\input{boundary_8h_source} -\input{mask_8h_source} -\input{computation_8h_source} -\input{central__differences_8h_source} -\input{discretization_8h_source} -\input{donor__cell_8h_source} -\input{staggered__grid_8h_source} -\input{output__writer_8h_source} -\input{output__writer__paraview_8h_source} -\input{output__writer__text_8h_source} -\input{settings_8h_source} -\input{gauss__seidel_8h_source} -\input{pressure__solver_8h_source} -\input{sor_8h_source} -\input{array2D_8h_source} -\input{field__variable_8h_source} -\input{fluid__tracer_8h_source} -%--- End generated contents --- -% Index - \backmatter - \newpage - \phantomsection - \clearemptydoublepage - \addcontentsline{toc}{chapter}{\indexname} - \printindex -% Required for some languages (in combination with latexdocumentpre from the header) -\end{document} diff --git a/documentation/latex/settings_8h_source.tex b/documentation/latex/settings_8h_source.tex deleted file mode 100644 index 87950f1a..00000000 --- a/documentation/latex/settings_8h_source.tex +++ /dev/null @@ -1,98 +0,0 @@ -\doxysection{settings.\+h} -\hypertarget{settings_8h_source}{}\label{settings_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/settings\_parser/settings.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/settings\_parser/settings.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} -\DoxyCodeLine{00002\ } -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00008\ } - - - -\DoxyCodeLine{00013\ \textcolor{keyword}{struct\ }\mbox{\hyperlink{structSettings}{Settings}}} -\DoxyCodeLine{00014\ \{} -\DoxyCodeLine{00015\ \ \ std::array\ \mbox{\hyperlink{structSettings_a43a0d2ee903496bfb86693a43a891a69}{nCells}};\ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00016\ \ \ std::array\ \mbox{\hyperlink{structSettings_a372a1549c306b12ca7bb0ed84f8a4cef}{physicalSize}};\ } -\DoxyCodeLine{00017\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a8b8330dfa04fe849291d68eacbc8dfec}{re}}\ =\ 1000;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00018\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a73cd9110793ede99e9ebe409e5e115fd}{endTime}}\ =\ 10.0;\ \ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00019\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_adaa611dc8c075474d40d7149afd310d1}{tau}}\ =\ 0.5;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00020\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a988b93fdeb6c91932043b3f746b45e86}{maximumDt}}\ =\ 0.1;\ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00021\ } -\DoxyCodeLine{00022\ \ \ std::array\ \mbox{\hyperlink{structSettings_a1a21237c7f5b7585e5a3545c7d4a4e8c}{g}}\{0.,\ 0.\};\ } -\DoxyCodeLine{00023\ } -\DoxyCodeLine{00024\ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{structSettings_a05bd5ffa1e1b48f5dc99878538596db3}{useDonorCell}}\ =\ \textcolor{keyword}{false};\ } -\DoxyCodeLine{00025\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a8b3721d24a5417caa0f2ad6f5eb85782}{alpha}}\ =\ 0.5;\ \ \ \ \ \ \ \ } -\DoxyCodeLine{00026\ } -\DoxyCodeLine{00027\ \ \ \textcolor{comment}{//\ Boundary\ Conditions\ Type}} -\DoxyCodeLine{00028\ \ \ std::string\ BCTop\ =\ \textcolor{stringliteral}{"{}NoSlip"{}};} -\DoxyCodeLine{00029\ \ \ std::string\ BCRight\ =\ \textcolor{stringliteral}{"{}NoSlip"{}};} -\DoxyCodeLine{00030\ \ \ std::string\ BCBottom\ =\ \textcolor{stringliteral}{"{}NoSlip"{}};} -\DoxyCodeLine{00031\ \ \ std::string\ BCLeft\ =\ \textcolor{stringliteral}{"{}NoSlip"{}};} -\DoxyCodeLine{00032\ } -\DoxyCodeLine{00033\ \ \ \textcolor{comment}{//\ NoSlip\ boundary\ conditions}} -\DoxyCodeLine{00034\ \ \ std::array\ \mbox{\hyperlink{structSettings_a8887591c6c157d7006051aa95896c284}{NoSlipVelTop}};\ \ \ \ } -\DoxyCodeLine{00035\ \ \ std::array\ \mbox{\hyperlink{structSettings_a2508aa084fe48e78d72b06e67c5a2006}{NoSlipVelRight}};\ \ } -\DoxyCodeLine{00036\ \ \ std::array\ \mbox{\hyperlink{structSettings_a13e254a0439df7f7bd24ffe4f919a1a4}{NoSlipVelBottom}};\ } -\DoxyCodeLine{00037\ \ \ std::array\ \mbox{\hyperlink{structSettings_aafaec8c10a728a0f115f3bed43a1c478}{NoSlipVelLeft}};\ \ \ } -\DoxyCodeLine{00038\ } -\DoxyCodeLine{00039\ \ \ \textcolor{comment}{//\ Pressure\ boundary\ conditions}} -\DoxyCodeLine{00040\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a5c8295a86e29ac27579058f07242e78c}{PressureTop}};\ \ \ \ } -\DoxyCodeLine{00041\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a8e7d49e95d30c9390fc5039f9326df32}{PressureRight}};\ \ } -\DoxyCodeLine{00042\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_acae74bcd333251c982ea347b8eb52017}{PressureBottom}};\ } -\DoxyCodeLine{00043\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a55f2fbdeb4d9c25bc679bd1fd42f1da7}{PressureLeft}};\ \ \ } -\DoxyCodeLine{00044\ } -\DoxyCodeLine{00045\ \ \ \textcolor{comment}{//\ Create\ rectangular\ obstacle\ in\ domain}} -\DoxyCodeLine{00046\ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{structSettings_a9e871c2bbb7d1b0131eac1f30f4f7788}{createRectangularObject}}\ =\ \textcolor{keyword}{false};\ } -\DoxyCodeLine{00047\ } -\DoxyCodeLine{00048\ \ \ \textcolor{comment}{//\ Create\ domain\ from\ PNGBitmap}} -\DoxyCodeLine{00049\ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{structSettings_a6300ad5a809cdaf480f4553c3e3dbf7c}{createDomainfromBitmap}}\ =\ \textcolor{keyword}{false};\ } -\DoxyCodeLine{00050\ \ \ std::string\ \mbox{\hyperlink{structSettings_a398d6490c8731b9b74115abc34700086}{pathToBitmap}};\ } -\DoxyCodeLine{00051\ } -\DoxyCodeLine{00052\ \ \ std::array\ \mbox{\hyperlink{structSettings_aff5a1563289e354946a164fd80da5bf6}{obstaclePosition}};\ } -\DoxyCodeLine{00053\ \ \ std::array\ \mbox{\hyperlink{structSettings_ae23782f18cddfea58cb843e98cb5854f}{obstacleDimension}};\ } -\DoxyCodeLine{00054\ } -\DoxyCodeLine{00055\ \ \ std::string\ \mbox{\hyperlink{structSettings_a888e2fca33db512d4e200b49f1f618f7}{pressureSolver}}\ =\ \textcolor{stringliteral}{"{}SOR"{}};\ \ } -\DoxyCodeLine{00056\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_af5ac13128e8c442ba45eedfab06ba14c}{omega}}\ =\ 1.0;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00057\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_aa02bd91d026d9ded9e36004b41b068b1}{epsilon}}\ =\ 1e-\/5;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00058\ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{structSettings_ac118e1c6052e35fb0ee38547a85d84ba}{maximumNumberOfIterations}}\ =\ 1e5;\ } -\DoxyCodeLine{00059\ } - - - - -\DoxyCodeLine{00065\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{structSettings_a55f95e3b6e7379bef4f8399a2cd670cc}{loadFromFile}}(std::string\ filename);} -\DoxyCodeLine{00066\ } - - -\DoxyCodeLine{00070\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{structSettings_a68ce38117dcef2cbdd3bd17f127b3078}{printSettings}}();} -\DoxyCodeLine{00071\ } - - - -\DoxyCodeLine{00076\ \ \ \textcolor{keyword}{struct\ }\mbox{\hyperlink{structSettings_1_1LineContent}{LineContent}}} -\DoxyCodeLine{00077\ \ \ \{} -\DoxyCodeLine{00078\ \ \ \ \ std::string\ \mbox{\hyperlink{structSettings_1_1LineContent_a2fa37c56a8ebe361c95b8332fa0262d3}{parameterName}};\ } -\DoxyCodeLine{00079\ \ \ \ \ std::string\ \mbox{\hyperlink{structSettings_1_1LineContent_a0bb96393366f2e5035379ab5b99d3ab2}{value}};\ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00080\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{structSettings_1_1LineContent_aa2af8a274c468eb68c61cd93171748e5}{isContent}};\ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00081\ \ \ \};} -\DoxyCodeLine{00082\ } - - - - -\DoxyCodeLine{00088\ \ \ \mbox{\hyperlink{structSettings_1_1LineContent}{LineContent}}\ \mbox{\hyperlink{structSettings_a6dbc25f91b99664976cd4a0a8af153c9}{readSingleLine}}(std::string\ line);} -\DoxyCodeLine{00089\ } -\DoxyCodeLine{00090\ \ \ \textcolor{comment}{//\ sets\ the\ parameter\ to\ the\ corresponding\ value}} - - - - - -\DoxyCodeLine{00097\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{structSettings_a588f30eb8d791c03ec811360386bff0d}{setParameter}}(std::string\ parameterName,\ std::string\ value);} -\DoxyCodeLine{00098\ \};} - -\end{DoxyCode} diff --git a/documentation/latex/sor_8h_source.tex b/documentation/latex/sor_8h_source.tex deleted file mode 100644 index 75054cea..00000000 --- a/documentation/latex/sor_8h_source.tex +++ /dev/null @@ -1,39 +0,0 @@ -\doxysection{sor.\+h} -\hypertarget{sor_8h_source}{}\label{sor_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/solver/sor.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/solver/sor.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} -\DoxyCodeLine{00002\ } -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}pressure\_solver.h"{}}} -\DoxyCodeLine{00004\ } - - - - -\DoxyCodeLine{00010\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classSOR}{SOR}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classPressureSolver}{PressureSolver}}} -\DoxyCodeLine{00011\ \{} -\DoxyCodeLine{00012\ } -\DoxyCodeLine{00013\ \textcolor{keyword}{public}:} - - - - - - - -\DoxyCodeLine{00022\ \ \ \ \ \mbox{\hyperlink{classSOR_a357cfea8935f4b2dfee06f2d8e1461a8}{SOR}}(\textcolor{keyword}{const}\ std::shared\_ptr\ \&data,} -\DoxyCodeLine{00023\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ epsilon,} -\DoxyCodeLine{00024\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ maximumNumberOfIterations,} -\DoxyCodeLine{00025\ \ \ \ \ \ \ \ \ std::shared\_ptr\ boundary,} -\DoxyCodeLine{00026\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ omega);} -\DoxyCodeLine{00027\ } - - - -\DoxyCodeLine{00032\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classSOR_a860992d85d8aacf114a3a02b5831f728}{solve}}()\ \textcolor{keyword}{override};} -\DoxyCodeLine{00033\ } -\DoxyCodeLine{00034\ \textcolor{keyword}{private}:} -\DoxyCodeLine{00035\ \ \ \ \ \textcolor{keywordtype}{double}\ omega\_;\ } -\DoxyCodeLine{00036\ \};} - -\end{DoxyCode} diff --git a/documentation/latex/staggered__grid_8h_source.tex b/documentation/latex/staggered__grid_8h_source.tex deleted file mode 100644 index e132f780..00000000 --- a/documentation/latex/staggered__grid_8h_source.tex +++ /dev/null @@ -1,180 +0,0 @@ -\doxysection{staggered\+\_\+grid.\+h} -\hypertarget{staggered__grid_8h_source}{}\label{staggered__grid_8h_source}\index{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/discretization/staggered\_grid.h@{/home/jonat/Documents/02\_Workspace/05\_NumSim\_misc/Project/NumSim/src/discretization/staggered\_grid.h}} - -\begin{DoxyCode}{0} -\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00002\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} -\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ "{}../storage/field\_variable.h"{}}} -\DoxyCodeLine{00005\ } - - - - - - - -\DoxyCodeLine{00014\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classStaggeredGrid}{StaggeredGrid}}} -\DoxyCodeLine{00015\ \{} -\DoxyCodeLine{00016\ \textcolor{keyword}{public}:} - - - - - -\DoxyCodeLine{00023\ \ \ \ \ \mbox{\hyperlink{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}{StaggeredGrid}}(std::array\ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{nCells}},\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{meshWidth}});} -\DoxyCodeLine{00024\ } - - -\DoxyCodeLine{00028\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{meshWidth}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00032\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{nCells}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00033\ } - - -\DoxyCodeLine{00037\ \ \ \ \ \textcolor{keyword}{const}\ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \&\mbox{\hyperlink{classStaggeredGrid_a87cee12621c641ab143a8b1a61b2ef7e}{u}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00041\ \ \ \ \ \textcolor{keyword}{const}\ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \&\mbox{\hyperlink{classStaggeredGrid_a26e478abba632554652c9e05a279d1ca}{v}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00045\ \ \ \ \ \textcolor{keyword}{const}\ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \&\mbox{\hyperlink{classStaggeredGrid_aafe6e0bb3509f6aad272b94f74e7ffec}{p}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00049\ \ \ \ \ \textcolor{keyword}{const}\ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \&\mbox{\hyperlink{classStaggeredGrid_a3f36422a02b9b18d1577d61e406f08cf}{rhs}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00050\ } - - -\DoxyCodeLine{00054\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classStaggeredGrid_a87cee12621c641ab143a8b1a61b2ef7e}{u}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00058\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_a87cee12621c641ab143a8b1a61b2ef7e}{u}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} -\DoxyCodeLine{00059\ } - - -\DoxyCodeLine{00063\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classStaggeredGrid_a26e478abba632554652c9e05a279d1ca}{v}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00067\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_a26e478abba632554652c9e05a279d1ca}{v}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} -\DoxyCodeLine{00068\ } - - -\DoxyCodeLine{00072\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classStaggeredGrid_aafe6e0bb3509f6aad272b94f74e7ffec}{p}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00076\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_aafe6e0bb3509f6aad272b94f74e7ffec}{p}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} -\DoxyCodeLine{00077\ } - - -\DoxyCodeLine{00081\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_adb05c59512dc8993367e4beddba05785}{f}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} - - -\DoxyCodeLine{00085\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_aaf849bec40f7fa7c68823038f0877341}{g}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} - - -\DoxyCodeLine{00089\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_a3f36422a02b9b18d1577d61e406f08cf}{rhs}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} -\DoxyCodeLine{00090\ } - - -\DoxyCodeLine{00094\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classStaggeredGrid_aec8490affea703cdd73b1febaed68968}{dx}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00098\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classStaggeredGrid_abde2da10e0c130fb0f206de64c9b4956}{dy}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00099\ } - - -\DoxyCodeLine{00103\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a31e2d3a0b6e03685380810a7c2f323e1}{uIBegin}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00107\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a641e473d72e1d02ba3de1c16e9d0d332}{uIEnd}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00108\ } - - -\DoxyCodeLine{00112\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a9b0e97704e1871441a8e713ecaa2cff5}{uJBegin}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00116\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a3393aa91b17054d2d700de308ae25632}{uJEnd}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00117\ } - - -\DoxyCodeLine{00121\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ace7bf8cb1d279131739d5d12de302d09}{vIBegin}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00125\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_aa5a44aa088b5a7923fa952af1ecb5778}{vIEnd}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00126\ } - - -\DoxyCodeLine{00130\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a7f8468d672411c0e3a5eeb67788fc826}{vJBegin}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00134\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ab67e8d9d8d76d34fb02d4d644f0b3795}{vJEnd}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00135\ } - - -\DoxyCodeLine{00139\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a9922c955707f2a31a4a27d1d696f002e}{pIBegin}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00143\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a34f16fdf87971fe84ffc3c84722bb2c7}{pIEnd}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00144\ } - - -\DoxyCodeLine{00148\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ae4c9ba16c5635dc1ffaa264fbcc3e034}{pJBegin}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00152\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ad9928ee522eedb7d7fd48ca0b92f2795}{pJEnd}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00153\ } - - -\DoxyCodeLine{00157\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a5cc368f9ede58a3cb689705df998f750}{fIBegin}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00161\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a8162b849231354ba73aacb085b5cd665}{fIEnd}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00162\ } - - -\DoxyCodeLine{00166\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ab92aca90331200d0cc7bc0c0a857b4ef}{fJBegin}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00170\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a7ac43ac86231987bc0bf6565589d52e1}{fJEnd}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00171\ } - - -\DoxyCodeLine{00175\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a061fb6d6948cdc3054171dd60842a8c3}{gIBegin}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00179\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_aebc76693e5dd61db521d6763236bf664}{gIEnd}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00180\ } - - -\DoxyCodeLine{00184\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a18ca3a121787b19c18886b0945aca2e3}{gJBegin}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00188\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a7a29456e1bce9efffa27de0b41957b50}{gJEnd}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00189\ } - - -\DoxyCodeLine{00193\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ad5c16b00d9dbf0f115e1ded81203edce}{rhsIBegin}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00197\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ae11e8842fdd508b914dc8f24b09b36a9}{rhsIEnd}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00198\ } - - -\DoxyCodeLine{00202\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a28c36939e3d3cc8df76e7aa91f0e0804}{rhsJBegin}}()\ \textcolor{keyword}{const};} - - -\DoxyCodeLine{00206\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a953ec890a986473bffe87ea26dfcd782}{rhsJEnd}}()\ \textcolor{keyword}{const};} -\DoxyCodeLine{00207\ } -\DoxyCodeLine{00208\ \textcolor{keyword}{protected}:} -\DoxyCodeLine{00209\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ \mbox{\hyperlink{classStaggeredGrid_acacffb5739539d9015c986080bb5ed44}{nCells\_}};\ \ \ \ \ \ \ } -\DoxyCodeLine{00210\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a9603c3334440aab082dda48947e5ce6e}{meshWidth\_}};\ } -\DoxyCodeLine{00211\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_adcef36b4ce8cc6843a2b6f603b62c763}{u\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00212\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_a20ec43568fe937b194561e21a0b84ad9}{v\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00213\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_a2ea3c93dd401ac06461ade9a74e76459}{p\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00214\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_a94933ac0c6e0d2a794f46c7a97d72f75}{f\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00215\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_a5f5c88f603d4e503cba4c44ed43de46a}{g\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00216\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_a496206955162452a0629a7742fe92a84}{rhs\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } -\DoxyCodeLine{00217\ \};} - -\end{DoxyCode} diff --git a/documentation/latex/structSettings.tex b/documentation/latex/structSettings.tex deleted file mode 100644 index 79e56f84..00000000 --- a/documentation/latex/structSettings.tex +++ /dev/null @@ -1,175 +0,0 @@ -\doxysection{Settings Struct Reference} -\hypertarget{structSettings}{}\label{structSettings}\index{Settings@{Settings}} - - -All settings that parametrize a simulation run. - - - - -{\ttfamily \#include $<$settings.\+h$>$} - -\doxysubsubsection*{Classes} -\begin{DoxyCompactItemize} -\item -struct \mbox{\hyperlink{structSettings_1_1LineContent}{Line\+Content}} -\begin{DoxyCompactList}\small\item\em Contains the content of a single line in a file. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsubsection*{Public Member Functions} -\begin{DoxyCompactItemize} -\item -void \mbox{\hyperlink{structSettings_a55f95e3b6e7379bef4f8399a2cd670cc}{load\+From\+File}} (std\+::string filename) -\begin{DoxyCompactList}\small\item\em Parse a text file with settings. \end{DoxyCompactList}\item -\Hypertarget{structSettings_a68ce38117dcef2cbdd3bd17f127b3078}\label{structSettings_a68ce38117dcef2cbdd3bd17f127b3078} -void {\bfseries print\+Settings} () -\begin{DoxyCompactList}\small\item\em Print all setting to terminal. \end{DoxyCompactList}\item -\mbox{\hyperlink{structSettings_1_1LineContent}{Line\+Content}} \mbox{\hyperlink{structSettings_a6dbc25f91b99664976cd4a0a8af153c9}{read\+Single\+Line}} (std\+::string line) -\begin{DoxyCompactList}\small\item\em Reads one line of the settings file. \end{DoxyCompactList}\item -void \mbox{\hyperlink{structSettings_a588f30eb8d791c03ec811360386bff0d}{set\+Parameter}} (std\+::string parameter\+Name, std\+::string value) -\begin{DoxyCompactList}\small\item\em Sets the parameter to the corresponding value. \end{DoxyCompactList}\end{DoxyCompactItemize} -\doxysubsubsection*{Public Attributes} -\begin{DoxyCompactItemize} -\item -\Hypertarget{structSettings_a43a0d2ee903496bfb86693a43a891a69}\label{structSettings_a43a0d2ee903496bfb86693a43a891a69} -std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells} -\begin{DoxyCompactList}\small\item\em number of cells in x and y direction \end{DoxyCompactList}\item -\Hypertarget{structSettings_a372a1549c306b12ca7bb0ed84f8a4cef}\label{structSettings_a372a1549c306b12ca7bb0ed84f8a4cef} -std\+::array$<$ double, 2 $>$ {\bfseries physical\+Size} -\begin{DoxyCompactList}\small\item\em physical size of the domain \end{DoxyCompactList}\item -\Hypertarget{structSettings_a8b8330dfa04fe849291d68eacbc8dfec}\label{structSettings_a8b8330dfa04fe849291d68eacbc8dfec} -double {\bfseries re} = 1000 -\begin{DoxyCompactList}\small\item\em reynolds number \end{DoxyCompactList}\item -\Hypertarget{structSettings_a73cd9110793ede99e9ebe409e5e115fd}\label{structSettings_a73cd9110793ede99e9ebe409e5e115fd} -double {\bfseries end\+Time} = 10.\+0 -\begin{DoxyCompactList}\small\item\em end time of the simulation \end{DoxyCompactList}\item -\Hypertarget{structSettings_adaa611dc8c075474d40d7149afd310d1}\label{structSettings_adaa611dc8c075474d40d7149afd310d1} -double {\bfseries tau} = 0.\+5 -\begin{DoxyCompactList}\small\item\em safety factor for time step width \end{DoxyCompactList}\item -\Hypertarget{structSettings_a988b93fdeb6c91932043b3f746b45e86}\label{structSettings_a988b93fdeb6c91932043b3f746b45e86} -double {\bfseries maximum\+Dt} = 0.\+1 -\begin{DoxyCompactList}\small\item\em maximum time step width \end{DoxyCompactList}\item -\Hypertarget{structSettings_a1a21237c7f5b7585e5a3545c7d4a4e8c}\label{structSettings_a1a21237c7f5b7585e5a3545c7d4a4e8c} -std\+::array$<$ double, 2 $>$ {\bfseries g} \{0., 0.\} -\begin{DoxyCompactList}\small\item\em external forces \end{DoxyCompactList}\item -\Hypertarget{structSettings_a05bd5ffa1e1b48f5dc99878538596db3}\label{structSettings_a05bd5ffa1e1b48f5dc99878538596db3} -bool {\bfseries use\+Donor\+Cell} = false -\begin{DoxyCompactList}\small\item\em if the donor cell scheme schould be used \end{DoxyCompactList}\item -\Hypertarget{structSettings_a8b3721d24a5417caa0f2ad6f5eb85782}\label{structSettings_a8b3721d24a5417caa0f2ad6f5eb85782} -double {\bfseries alpha} = 0.\+5 -\begin{DoxyCompactList}\small\item\em factor for donor-\/cell scheme \end{DoxyCompactList}\item -\Hypertarget{structSettings_a90549573af4f6c2c60ac640321fe1956}\label{structSettings_a90549573af4f6c2c60ac640321fe1956} -std\+::string {\bfseries BCTop} = "{}No\+Slip"{} -\item -\Hypertarget{structSettings_a4f6f4dbc9e08834584809de5e553e5cd}\label{structSettings_a4f6f4dbc9e08834584809de5e553e5cd} -std\+::string {\bfseries BCRight} = "{}No\+Slip"{} -\item -\Hypertarget{structSettings_a8003d11fa49639f3f827123d42f5f0ce}\label{structSettings_a8003d11fa49639f3f827123d42f5f0ce} -std\+::string {\bfseries BCBottom} = "{}No\+Slip"{} -\item -\Hypertarget{structSettings_ac411ff66a486b89fba9dc520b6e305e3}\label{structSettings_ac411ff66a486b89fba9dc520b6e305e3} -std\+::string {\bfseries BCLeft} = "{}No\+Slip"{} -\item -\Hypertarget{structSettings_a8887591c6c157d7006051aa95896c284}\label{structSettings_a8887591c6c157d7006051aa95896c284} -std\+::array$<$ double, 2 $>$ {\bfseries No\+Slip\+Vel\+Top} -\begin{DoxyCompactList}\small\item\em prescribed values of u,v at top of domain \end{DoxyCompactList}\item -\Hypertarget{structSettings_a2508aa084fe48e78d72b06e67c5a2006}\label{structSettings_a2508aa084fe48e78d72b06e67c5a2006} -std\+::array$<$ double, 2 $>$ {\bfseries No\+Slip\+Vel\+Right} -\begin{DoxyCompactList}\small\item\em prescribed values of u,v at right of domain \end{DoxyCompactList}\item -\Hypertarget{structSettings_a13e254a0439df7f7bd24ffe4f919a1a4}\label{structSettings_a13e254a0439df7f7bd24ffe4f919a1a4} -std\+::array$<$ double, 2 $>$ {\bfseries No\+Slip\+Vel\+Bottom} -\begin{DoxyCompactList}\small\item\em prescribed values of u,v at bottom of domain \end{DoxyCompactList}\item -\Hypertarget{structSettings_aafaec8c10a728a0f115f3bed43a1c478}\label{structSettings_aafaec8c10a728a0f115f3bed43a1c478} -std\+::array$<$ double, 2 $>$ {\bfseries No\+Slip\+Vel\+Left} -\begin{DoxyCompactList}\small\item\em prescribed values of u,v at left of domain \end{DoxyCompactList}\item -\Hypertarget{structSettings_a5c8295a86e29ac27579058f07242e78c}\label{structSettings_a5c8295a86e29ac27579058f07242e78c} -double {\bfseries Pressure\+Top} -\begin{DoxyCompactList}\small\item\em prescribed pressure BC top of domain \end{DoxyCompactList}\item -\Hypertarget{structSettings_a8e7d49e95d30c9390fc5039f9326df32}\label{structSettings_a8e7d49e95d30c9390fc5039f9326df32} -double {\bfseries Pressure\+Right} -\begin{DoxyCompactList}\small\item\em prescribed pressure BC right of domain \end{DoxyCompactList}\item -\Hypertarget{structSettings_acae74bcd333251c982ea347b8eb52017}\label{structSettings_acae74bcd333251c982ea347b8eb52017} -double {\bfseries Pressure\+Bottom} -\begin{DoxyCompactList}\small\item\em prescribed pressure BC bottom of domain \end{DoxyCompactList}\item -\Hypertarget{structSettings_a55f2fbdeb4d9c25bc679bd1fd42f1da7}\label{structSettings_a55f2fbdeb4d9c25bc679bd1fd42f1da7} -double {\bfseries Pressure\+Left} -\begin{DoxyCompactList}\small\item\em prescribed pressure BC left of domain \end{DoxyCompactList}\item -\Hypertarget{structSettings_a9e871c2bbb7d1b0131eac1f30f4f7788}\label{structSettings_a9e871c2bbb7d1b0131eac1f30f4f7788} -bool {\bfseries create\+Rectangular\+Object} = false -\begin{DoxyCompactList}\small\item\em wheter a rectangular object in domain should be created \end{DoxyCompactList}\item -\Hypertarget{structSettings_a6300ad5a809cdaf480f4553c3e3dbf7c}\label{structSettings_a6300ad5a809cdaf480f4553c3e3dbf7c} -bool {\bfseries create\+Domainfrom\+Bitmap} = false -\begin{DoxyCompactList}\small\item\em wheter domain should be created from bitmap \end{DoxyCompactList}\item -\Hypertarget{structSettings_a398d6490c8731b9b74115abc34700086}\label{structSettings_a398d6490c8731b9b74115abc34700086} -std\+::string {\bfseries path\+To\+Bitmap} -\begin{DoxyCompactList}\small\item\em path to bitmap \end{DoxyCompactList}\item -\Hypertarget{structSettings_aff5a1563289e354946a164fd80da5bf6}\label{structSettings_aff5a1563289e354946a164fd80da5bf6} -std\+::array$<$ double, 2 $>$ {\bfseries obstacle\+Position} -\begin{DoxyCompactList}\small\item\em x and y position of rectangular object \end{DoxyCompactList}\item -\Hypertarget{structSettings_ae23782f18cddfea58cb843e98cb5854f}\label{structSettings_ae23782f18cddfea58cb843e98cb5854f} -std\+::array$<$ double, 2 $>$ {\bfseries obstacle\+Dimension} -\begin{DoxyCompactList}\small\item\em x and y dimension of rectangular object \end{DoxyCompactList}\item -\Hypertarget{structSettings_a888e2fca33db512d4e200b49f1f618f7}\label{structSettings_a888e2fca33db512d4e200b49f1f618f7} -std\+::string {\bfseries pressure\+Solver} = "{}SOR"{} -\begin{DoxyCompactList}\small\item\em which pressure solver to use, "{}\+Gauss\+Seidel"{} or "{}\+SOR"{} \end{DoxyCompactList}\item -\Hypertarget{structSettings_af5ac13128e8c442ba45eedfab06ba14c}\label{structSettings_af5ac13128e8c442ba45eedfab06ba14c} -double {\bfseries omega} = 1.\+0 -\begin{DoxyCompactList}\small\item\em overrelaxation factor \end{DoxyCompactList}\item -\Hypertarget{structSettings_aa02bd91d026d9ded9e36004b41b068b1}\label{structSettings_aa02bd91d026d9ded9e36004b41b068b1} -double {\bfseries epsilon} = 1e-\/5 -\begin{DoxyCompactList}\small\item\em tolerance for the residual in the pressure solver \end{DoxyCompactList}\item -\Hypertarget{structSettings_ac118e1c6052e35fb0ee38547a85d84ba}\label{structSettings_ac118e1c6052e35fb0ee38547a85d84ba} -int {\bfseries maximum\+Number\+Of\+Iterations} = 1e5 -\begin{DoxyCompactList}\small\item\em maximum number of iterations in the solver \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\doxysubsection{Detailed Description} -All settings that parametrize a simulation run. - -\doxysubsection{Member Function Documentation} -\Hypertarget{structSettings_a55f95e3b6e7379bef4f8399a2cd670cc}\label{structSettings_a55f95e3b6e7379bef4f8399a2cd670cc} -\index{Settings@{Settings}!loadFromFile@{loadFromFile}} -\index{loadFromFile@{loadFromFile}!Settings@{Settings}} -\doxysubsubsection{\texorpdfstring{loadFromFile()}{loadFromFile()}} -{\footnotesize\ttfamily void Settings\+::load\+From\+File (\begin{DoxyParamCaption}\item[{std\+::string}]{filename }\end{DoxyParamCaption})} - - - -Parse a text file with settings. - -Each line contains "{}$<$parameter\+Name$>$ = $<$value$>$"{} \Hypertarget{structSettings_a6dbc25f91b99664976cd4a0a8af153c9}\label{structSettings_a6dbc25f91b99664976cd4a0a8af153c9} -\index{Settings@{Settings}!readSingleLine@{readSingleLine}} -\index{readSingleLine@{readSingleLine}!Settings@{Settings}} -\doxysubsubsection{\texorpdfstring{readSingleLine()}{readSingleLine()}} -{\footnotesize\ttfamily \mbox{\hyperlink{structSettings_1_1LineContent}{Settings\+::\+Line\+Content}} Settings\+::read\+Single\+Line (\begin{DoxyParamCaption}\item[{std\+::string}]{line }\end{DoxyParamCaption})} - - - -Reads one line of the settings file. - - -\begin{DoxyParams}{Parameters} -{\em line} & line of file to read \\ -\hline -\end{DoxyParams} -\Hypertarget{structSettings_a588f30eb8d791c03ec811360386bff0d}\label{structSettings_a588f30eb8d791c03ec811360386bff0d} -\index{Settings@{Settings}!setParameter@{setParameter}} -\index{setParameter@{setParameter}!Settings@{Settings}} -\doxysubsubsection{\texorpdfstring{setParameter()}{setParameter()}} -{\footnotesize\ttfamily void Settings\+::set\+Parameter (\begin{DoxyParamCaption}\item[{std\+::string}]{parameter\+Name, }\item[{std\+::string}]{value }\end{DoxyParamCaption})} - - - -Sets the parameter to the corresponding value. - - -\begin{DoxyParams}{Parameters} -{\em parameter\+Name} & paramter name \\ -\hline -{\em value} & of parameter \\ -\hline -\end{DoxyParams} - - -The documentation for this struct was generated from the following files\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/settings\+\_\+parser/settings.\+h\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/settings\+\_\+parser/settings.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/structSettings_1_1LineContent.tex b/documentation/latex/structSettings_1_1LineContent.tex deleted file mode 100644 index 72568299..00000000 --- a/documentation/latex/structSettings_1_1LineContent.tex +++ /dev/null @@ -1,31 +0,0 @@ -\doxysection{Settings\+::Line\+Content Struct Reference} -\hypertarget{structSettings_1_1LineContent}{}\label{structSettings_1_1LineContent}\index{Settings::LineContent@{Settings::LineContent}} - - -Contains the content of a single line in a file. - - - - -{\ttfamily \#include $<$settings.\+h$>$} - -\doxysubsubsection*{Public Attributes} -\begin{DoxyCompactItemize} -\item -\Hypertarget{structSettings_1_1LineContent_a2fa37c56a8ebe361c95b8332fa0262d3}\label{structSettings_1_1LineContent_a2fa37c56a8ebe361c95b8332fa0262d3} -std\+::string {\bfseries parameter\+Name} -\begin{DoxyCompactList}\small\item\em Name of parameter. \end{DoxyCompactList}\item -\Hypertarget{structSettings_1_1LineContent_a0bb96393366f2e5035379ab5b99d3ab2}\label{structSettings_1_1LineContent_a0bb96393366f2e5035379ab5b99d3ab2} -std\+::string {\bfseries value} -\begin{DoxyCompactList}\small\item\em value of the parameter \end{DoxyCompactList}\item -\Hypertarget{structSettings_1_1LineContent_aa2af8a274c468eb68c61cd93171748e5}\label{structSettings_1_1LineContent_aa2af8a274c468eb68c61cd93171748e5} -bool {\bfseries is\+Content} -\begin{DoxyCompactList}\small\item\em whether line is readable parameter or comment \end{DoxyCompactList}\end{DoxyCompactItemize} - - -\doxysubsection{Detailed Description} -Contains the content of a single line in a file. - -The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} -\item -/home/jonat/\+Documents/02\+\_\+\+Workspace/05\+\_\+\+Num\+Sim\+\_\+misc/\+Project/\+Num\+Sim/src/settings\+\_\+parser/settings.\+h\end{DoxyCompactItemize} diff --git a/documentation/latex/tabu_doxygen.sty b/documentation/latex/tabu_doxygen.sty deleted file mode 100644 index 3f17d1d0..00000000 --- a/documentation/latex/tabu_doxygen.sty +++ /dev/null @@ -1,2557 +0,0 @@ -%% -%% This is file `tabu.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% tabu.dtx (with options: `package') -%% -%% This is a generated file. -%% Copyright (FC) 2010-2011 - lppl -%% -%% tabu : 2011/02/26 v2.8 - tabu : Flexible LaTeX tabulars -%% -%% ********************************************************************************************** -%% \begin{tabu} { preamble } => default target: \linewidth or \linegoal -%% \begin{tabu} to { preamble } => target specified -%% \begin{tabu} spread { preamble } => target relative to the ``natural width'' -%% -%% tabu works in text and in math modes. -%% -%% X columns: automatic width adjustment + horizontal and vertical alignment -%% \begin{tabu} { X[4c] X[1c] X[-2ml] } -%% -%% Horizontal lines and / or leaders: -%% \hline\hline => double horizontal line -%% \firsthline\hline => for nested tabulars -%% \lasthline\hline => for nested tabulars -%% \tabucline[line spec]{column-column} => ``funny'' lines (dash/leader) -%% Automatic lines / leaders : -%% \everyrow{\hline\hline} -%% -%% Vertical lines and / or leaders: -%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt blue] } -%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt on 2pt off 4pt blue] } -%% -%% Fixed vertical spacing adjustment: -%% \extrarowheight= \extrarowdepth= -%% or: \extrarowsep= => may be prefixed by \global -%% -%% Dynamic vertical spacing adjustment: -%% \abovetabulinesep= \belowtabulinesep= -%% or: \tabulinesep= => may be prefixed by \global -%% -%% delarray.sty shortcuts: in math and text modes -%% \begin{tabu} .... \({ preamble }\) -%% -%% Algorithms reports: -%% \tracingtabu=1 \tracingtabu=2 -%% -%% ********************************************************************************************** -%% -%% This work may be distributed and/or modified under the -%% conditions of the LaTeX Project Public License, either -%% version 1.3 of this license or (at your option) any later -%% version. The latest version of this license is in -%% http://www.latex-project.org/lppl.txt -%% -%% This work consists of the main source file tabu.dtx -%% and the derived files -%% tabu.sty, tabu.pdf, tabu.ins -%% -%% tabu : Flexible LaTeX tabulars -%% lppl copyright 2010-2011 by FC -%% - -\NeedsTeXFormat{LaTeX2e}[2005/12/01] -\ProvidesPackage{tabu_doxygen}[2011/02/26 v2.8 - flexible LaTeX tabulars (FC), frozen version for doxygen] -\RequirePackage{array}[2008/09/09] -\RequirePackage{varwidth}[2009/03/30] -\AtEndOfPackage{\tabu@AtEnd \let\tabu@AtEnd \@undefined} -\let\tabu@AtEnd\@empty -\def\TMP@EnsureCode#1={% - \edef\tabu@AtEnd{\tabu@AtEnd - \catcode#1 \the\catcode#1}% - \catcode#1=% -}% \TMP@EnsureCode -\TMP@EnsureCode 33 = 12 % ! -\TMP@EnsureCode 58 = 12 % : (for siunitx) -\TMP@EnsureCode124 = 12 % | -\TMP@EnsureCode 36 = 3 % $ = math shift -\TMP@EnsureCode 38 = 4 % & = tab alignment character -\TMP@EnsureCode 32 = 10 % space -\TMP@EnsureCode 94 = 7 % ^ -\TMP@EnsureCode 95 = 8 % _ -%% Constants -------------------------------------------------------- -\newcount \c@taburow \def\thetaburow {\number\c@taburow} -\newcount \tabu@nbcols -\newcount \tabu@cnt -\newcount \tabu@Xcol -\let\tabu@start \@tempcnta -\let\tabu@stop \@tempcntb -\newcount \tabu@alloc \tabu@alloc=\m@ne -\newcount \tabu@nested -\def\tabu@alloc@{\global\advance\tabu@alloc \@ne \tabu@nested\tabu@alloc} -\newdimen \tabu@target -\newdimen \tabu@spreadtarget -\newdimen \tabu@naturalX -\newdimen \tabucolX -\let\tabu@DELTA \@tempdimc -\let\tabu@thick \@tempdima -\let\tabu@on \@tempdimb -\let\tabu@off \@tempdimc -\newdimen \tabu@Xsum -\newdimen \extrarowdepth -\newdimen \abovetabulinesep -\newdimen \belowtabulinesep -\newdimen \tabustrutrule \tabustrutrule \z@ -\newtoks \tabu@thebody -\newtoks \tabu@footnotes -\newsavebox \tabu@box -\newsavebox \tabu@arstrutbox -\newsavebox \tabu@hleads -\newsavebox \tabu@vleads -\newif \iftabu@colortbl -\newif \iftabu@siunitx -\newif \iftabu@measuring -\newif \iftabu@spread -\newif \iftabu@negcoef -\newif \iftabu@everyrow -\def\tabu@everyrowtrue {\global\let\iftabu@everyrow \iftrue} -\def\tabu@everyrowfalse{\global\let\iftabu@everyrow \iffalse} -\newif \iftabu@long -\newif \iftabuscantokens -\def\tabu@rescan {\tabu@verbatim \scantokens } -%% Utilities (for internal usage) ----------------------------------- -\def\tabu@gobblespace #1 {#1} -\def\tabu@gobbletoken #1#2{#1} -\def\tabu@gobbleX{\futurelet\@let@token \tabu@gobblex} -\def\tabu@gobblex{\if ^^J\noexpand\@let@token \expandafter\@gobble - \else\ifx \@sptoken\@let@token - \expandafter\tabu@gobblespace\expandafter\tabu@gobbleX - \fi\fi -}% \tabu@gobblex -\def\tabu@X{^^J} -{\obeyspaces -\global\let\tabu@spxiii= % saves an active space (for \ifx) -\gdef\tabu@@spxiii{ }} -\def\tabu@ifenvir {% only for \multicolumn - \expandafter\tabu@if@nvir\csname\@currenvir\endcsname -}% \tabu@ifenvir -\def\tabu@if@nvir #1{\csname @\ifx\tabu#1first\else - \ifx\longtabu#1first\else - second\fi\fi oftwo\endcsname -}% \tabu@ifenvir -\def\tabu@modulo #1#2{\numexpr\ifnum\numexpr#1=\z@ 0\else #1-(#1-(#2-1)/2)/(#2)*(#2)\fi} -{\catcode`\&=3 -\gdef\tabu@strtrim #1{% #1 = control sequence to trim - \ifodd 1\ifx #1\@empty \else \ifx #1\space \else 0\fi \fi - \let\tabu@c@l@r \@empty \let#1\@empty - \else \expandafter \tabu@trimspaces #1\@nnil - \fi -}% \tabu@strtrim -\gdef\tabu@trimspaces #1\@nnil{\let\tabu@c@l@r=#2\tabu@firstspace .#1& }% -\gdef\tabu@firstspace #1#2#3 &{\tabu@lastspace #2#3&} -\gdef\tabu@lastspace #1{\def #3{#1}% - \ifx #3\tabu@c@l@r \def\tabu@c@l@r{\protect\color{#1}}\expandafter\remove@to@nnil \fi - \tabu@trimspaces #1\@nnil} -}% \catcode -\def\tabu@sanitizearg #1#2{{% - \csname \ifcsname if@safe@actives\endcsname % - @safe@activestrue\else - relax\fi \endcsname - \edef#2{#1}\tabu@strtrim#2\@onelevel@sanitize#2% - \expandafter}\expandafter\def\expandafter#2\expandafter{#2}% -}% \tabu@sanitizearg -\def\tabu@textbar #1{\begingroup \endlinechar\m@ne \scantokens{\def\:{|}}% - \expandafter\endgroup \expandafter#1\:% !!! semi simple group !!! -}% \tabu@textbar -\def\tabu@everyrow@bgroup{\iftabu@everyrow \begingroup \else \noalign{\ifnum0=`}\fi \fi} -\def\tabu@everyrow@egroup{% - \iftabu@everyrow \expandafter \endgroup \the\toks@ - \else \ifnum0=`{\fi}% - \fi -}% \tabu@everyrow@egroup -\def\tabu@arstrut {\global\setbox\@arstrutbox \hbox{\vrule - height \arraystretch \dimexpr\ht\strutbox+\extrarowheight - depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth - width \z@}% -}% \tabu@arstrut -\def\tabu@rearstrut {% - \@tempdima \arraystretch\dimexpr\ht\strutbox+\extrarowheight \relax - \@tempdimb \arraystretch\dimexpr\dp\strutbox+\extrarowdepth \relax - \ifodd 1\ifdim \ht\@arstrutbox=\@tempdima - \ifdim \dp\@arstrutbox=\@tempdimb 0 \fi\fi - \tabu@mkarstrut - \fi -}% \tabu@rearstrut -\def\tabu@@DBG #1{\ifdim\tabustrutrule>\z@ \color{#1}\fi} -\def\tabu@DBG@arstrut {\global\setbox\@arstrutbox - \hbox to\z@{\hbox to\z@{\hss - {\tabu@DBG{cyan}\vrule - height \arraystretch \dimexpr\ht\strutbox+\extrarowheight - depth \z@ - width \tabustrutrule}\kern-\tabustrutrule - {\tabu@DBG{pink}\vrule - height \z@ - depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth - width \tabustrutrule}}}% -}% \tabu@DBG@arstrut -\def\tabu@save@decl{\toks\count@ \expandafter{\the\toks\expandafter\count@ - \@nextchar}}% -\def\tabu@savedecl{\ifcat$\d@llarend\else - \let\save@decl \tabu@save@decl \fi % no inversion of tokens in text mode -}% \tabu@savedecl -\def\tabu@finalstrut #1{\unskip\ifhmode\nobreak\fi\vrule height\z@ depth\z@ width\z@} -\newcommand*\tabuDisableCommands {\g@addto@macro\tabu@trialh@@k } -\let\tabu@trialh@@k \@empty -\def\tabu@nowrite #1#{{\afterassignment}\toks@} -\let\tabu@write\write -\let\tabu@immediate\immediate -\def\tabu@WRITE{\begingroup - \def\immediate\write{\aftergroup\endgroup - \tabu@immediate\tabu@write}% -}% \tabu@WRITE -\expandafter\def\expandafter\tabu@GenericError\expandafter{% - \expandafter\tabu@WRITE\GenericError} -\def\tabu@warn{\tabu@WRITE\PackageWarning{tabu}} -\def\tabu@noxfootnote [#1]{\@gobble} -\def\tabu@nocolor #1#{\@gobble} -\newcommand*\tabu@norowcolor[2][]{} -\def\tabu@maybesiunitx #1{\def\tabu@temp{#1}% - \futurelet\@let@token \tabu@m@ybesiunitx} -\def\tabu@m@ybesiunitx #1{\def\tabu@m@ybesiunitx {% - \ifx #1\@let@token \let\tabu@cellleft \@empty \let\tabu@cellright \@empty \fi - \tabu@temp}% \tabu@m@ybesiunitx -}\expandafter\tabu@m@ybesiunitx \csname siunitx_table_collect_begin:Nn\endcsname -\def\tabu@celllalign@def #1{\def\tabu@celllalign{\tabu@maybesiunitx{#1}}}% -%% Fixed vertical spacing adjustment: \extrarowsep ------------------ -\newcommand*\extrarowsep{\edef\tabu@C@extra{\the\numexpr\tabu@C@extra+1}% - \iftabu@everyrow \aftergroup\tabu@Gextra - \else \aftergroup\tabu@n@Gextra - \fi - \@ifnextchar={\tabu@gobbletoken\tabu@extra} \tabu@extra -}% \extrarowsep -\def\tabu@extra {\@ifnextchar_% - {\tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}} - {\ifx ^\@let@token \def\tabu@temp{% - \tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}}% - \else \let\tabu@temp \@empty - \afterassignment \tabu@setextrasep \extrarowdepth - \fi \tabu@temp}% -}% \tabu@extra -\def\tabu@setextra #1#2{\def\tabu@temp{\tabu@extr@#1#2}\afterassignment\tabu@temp#2} -\def\tabu@extr@ #1#2{\@ifnextchar^% - {\tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}} - {\ifx _\@let@token \def\tabu@temp{% - \tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}}% - \else \let\tabu@temp \@empty - \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth - \fi \tabu@temp}% -}% \tabu@extr@ -\def\tabu@setextrasep {\extrarowheight=\extrarowdepth - \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth -}% \tabu@setextrasep -\def\tabu@Gextra{\ifx \tabu@G@extra\@empty \else {\tabu@Rextra}\fi} -\def\tabu@n@Gextra{\ifx \tabu@G@extra\@empty \else \noalign{\tabu@Rextra}\fi} -\def\tabu@Rextra{\tabu@Grestore \tabu@G@extra \tabu@C@extra} -\let\tabu@C@extra \z@ -\let\tabu@G@extra \@empty -%% Dynamic vertical spacing adjustment: \tabulinesep ---------------- -\newcommand*\tabulinesep{\edef\tabu@C@linesep{\the\numexpr\tabu@C@linesep+1}% - \iftabu@everyrow \aftergroup\tabu@Glinesep - \else \aftergroup\tabu@n@Glinesep - \fi - \@ifnextchar={\tabu@gobbletoken\tabu@linesep} \tabu@linesep -}% \tabulinesep -\def\tabu@linesep {\@ifnextchar_% - {\tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}} - {\ifx ^\@let@token \def\tabu@temp{% - \tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}}% - \else \let\tabu@temp \@empty - \afterassignment \tabu@setlinesep \abovetabulinesep - \fi \tabu@temp}% -}% \tabu@linesep -\def\tabu@setsep #1#2{\def\tabu@temp{\tabu@sets@p#1#2}\afterassignment\tabu@temp#2} -\def\tabu@sets@p #1#2{\@ifnextchar^% - {\tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}} - {\ifx _\@let@token \def\tabu@temp{% - \tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}}% - \else \let\tabu@temp \@empty - \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep - \fi \tabu@temp}% -}% \tabu@sets@p -\def\tabu@setlinesep {\belowtabulinesep=\abovetabulinesep - \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep -}% \tabu@setlinesep -\def\tabu@Glinesep{\ifx \tabu@G@linesep\@empty \else {\tabu@Rlinesep}\fi} -\def\tabu@n@Glinesep{\ifx \tabu@G@linesep\@empty \else \noalign{\tabu@Rlinesep}\fi} -\def\tabu@Rlinesep{\tabu@Grestore \tabu@G@linesep \tabu@C@linesep} -\let\tabu@C@linesep \z@ -\let\tabu@G@linesep \@empty -%% \global\extrarowsep and \global\tabulinesep ------------------- -\def\tabu@Gsave #1#2#3#4{\xdef#1{#1% - \toks#2{\toks\the\currentgrouplevel{\global#3\the#3\global#4\the#4}}}% -}% \tabu@Gsave -\def\tabu@Grestore#1#2{% - \toks#2{}#1\toks\currentgrouplevel\expandafter{\expandafter}\the\toks#2\relax - \ifcat$\the\toks\currentgrouplevel$\else - \global\let#1\@empty \global\let#2\z@ - \the\toks\currentgrouplevel - \fi -}% \tabu@Grestore -%% Setting code for every row --------------------------------------- -\newcommand*\everyrow{\tabu@everyrow@bgroup - \tabu@start \z@ \tabu@stop \z@ \tabu@evrstartstop -}% \everyrow -\def\tabu@evrstartstop {\@ifnextchar^% - {\afterassignment \tabu@evrstartstop \tabu@stop=}% - {\ifx ^\@let@token - \afterassignment\tabu@evrstartstop \tabu@start=% - \else \afterassignment\tabu@everyr@w \toks@ - \fi}% -}% \tabu@evrstartstop -\def\tabu@everyr@w {% - \xdef\tabu@everyrow{% - \noexpand\tabu@everyrowfalse - \let\noalign \relax - \noexpand\tabu@rowfontreset - \iftabu@colortbl \noexpand\tabu@rc@ \fi % \taburowcolors - \let\noexpand\tabu@docline \noexpand\tabu@docline@evr - \the\toks@ - \noexpand\tabu@evrh@@k - \noexpand\tabu@rearstrut - \global\advance\c@taburow \@ne}% - \iftabu@everyrow \toks@\expandafter - {\expandafter\def\expandafter\tabu@evr@L\expandafter{\the\toks@}\ignorespaces}% - \else \xdef\tabu@evr@G{\the\toks@}% - \fi - \tabu@everyrow@egroup -}% \tabu@everyr@w -\def\tabu@evr {\def\tabu@evrh@@k} % for internal use only -\tabu@evr{} -%% line style and leaders ------------------------------------------- -\newcommand*\newtabulinestyle [1]{% - {\@for \@tempa :=#1\do{\expandafter\tabu@newlinestyle \@tempa==\@nil}}% -}% \newtabulinestyle -\def\tabu@newlinestyle #1=#2=#3\@nil{\tabu@getline {#2}% - \tabu@sanitizearg {#1}\@tempa - \ifodd 1\ifx \@tempa\@empty \ifdefined\tabu@linestyle@ 0 \fi\fi - \global\expandafter\let - \csname tabu@linestyle@\@tempa \endcsname =\tabu@thestyle \fi -}% \tabu@newlinestyle -\newcommand*\tabulinestyle [1]{\tabu@everyrow@bgroup \tabu@getline{#1}% - \iftabu@everyrow - \toks@\expandafter{\expandafter \def \expandafter - \tabu@ls@L\expandafter{\tabu@thestyle}\ignorespaces}% - \gdef\tabu@ls@{\tabu@ls@L}% - \else - \global\let\tabu@ls@G \tabu@thestyle - \gdef\tabu@ls@{\tabu@ls@G}% - \fi - \tabu@everyrow@egroup -}% \tabulinestyle -\newcommand*\taburulecolor{\tabu@everyrow@bgroup \tabu@textbar \tabu@rulecolor} -\def\tabu@rulecolor #1{\toks@{}% - \def\tabu@temp #1##1#1{\tabu@ruledrsc{##1}}\@ifnextchar #1% - \tabu@temp - \tabu@rulearc -}% \tabu@rulecolor -\def\tabu@ruledrsc #1{\edef\tabu@temp{#1}\tabu@strtrim\tabu@temp - \ifx \tabu@temp\@empty \def\tabu@temp{\tabu@rule@drsc@ {}{}}% - \else \edef\tabu@temp{\noexpand\tabu@rule@drsc@ {}{\tabu@temp}}% - \fi - \tabu@temp -}% \tabu@ruledrsc@ -\def\tabu@ruledrsc@ #1#{\tabu@rule@drsc@ {#1}} -\def\tabu@rule@drsc@ #1#2{% - \iftabu@everyrow - \ifx \\#1#2\\\toks@{\let\CT@drsc@ \relax}% - \else \toks@{\def\CT@drsc@{\color #1{#2}}}% - \fi - \else - \ifx \\#1#2\\\global\let\CT@drsc@ \relax - \else \gdef\CT@drsc@{\color #1{#2}}% - \fi - \fi - \tabu@rulearc -}% \tabu@rule@drsc@ -\def\tabu@rulearc #1#{\tabu@rule@arc@ {#1}} -\def\tabu@rule@arc@ #1#2{% - \iftabu@everyrow - \ifx \\#1#2\\\toks@\expandafter{\the\toks@ \def\CT@arc@{}}% - \else \toks@\expandafter{\the\toks@ \def\CT@arc@{\color #1{#2}}}% - \fi - \toks@\expandafter{\the\toks@ - \let\tabu@arc@L \CT@arc@ - \let\tabu@drsc@L \CT@drsc@ - \ignorespaces}% - \else - \ifx \\#1#2\\\gdef\CT@arc@{}% - \else \gdef\CT@arc@{\color #1{#2}}% - \fi - \global\let\tabu@arc@G \CT@arc@ - \global\let\tabu@drsc@G \CT@drsc@ - \fi - \tabu@everyrow@egroup -}% \tabu@rule@arc@ -\def\taburowcolors {\tabu@everyrow@bgroup \@testopt \tabu@rowcolors 1} -\def\tabu@rowcolors [#1]#2#{\tabu@rowc@lors{#1}{#2}} -\def\tabu@rowc@lors #1#2#3{% - \toks@{}\@defaultunits \count@ =\number0#2\relax \@nnil - \@defaultunits \tabu@start =\number0#1\relax \@nnil - \ifnum \count@<\tw@ \count@=\tw@ \fi - \advance\tabu@start \m@ne - \ifnum \tabu@start<\z@ \tabu@start \z@ \fi - \tabu@rowcolorseries #3\in@..\in@ \@nnil -}% \tabu@rowcolors -\def\tabu@rowcolorseries #1..#2\in@ #3\@nnil {% - \ifx \in@#1\relax - \iftabu@everyrow \toks@{\def\tabu@rc@{}\let\tabu@rc@L \tabu@rc@}% - \else \gdef\tabu@rc@{}\global\let\tabu@rc@G \tabu@rc@ - \fi - \else - \ifx \\#2\\\tabu@rowcolorserieserror \fi - \tabu@sanitizearg{#1}\tabu@temp - \tabu@sanitizearg{#2}\@tempa - \advance\count@ \m@ne - \iftabu@everyrow - \def\tabu@rc@ ##1##2##3##4{\def\tabu@rc@{% - \ifnum ##2=\c@taburow - \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{##3}{##4}\fi - \ifnum \c@taburow<##2 \else - \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\z@ - \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi - \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% - \rowcolor{tabu@rc@\the\tabu@nested}\fi}% - }\edef\x{\noexpand\tabu@rc@ {\the\count@} - {\the\tabu@start} - {\tabu@temp} - {\@tempa}% - }\x - \toks@\expandafter{\expandafter\def\expandafter\tabu@rc@\expandafter{\tabu@rc@}}% - \toks@\expandafter{\the\toks@ \let\tabu@rc@L \tabu@rc@ \ignorespaces}% - \else % inside \noalign - \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{\tabu@temp}{\@tempa}% - \expandafter\resetcolorseries\expandafter[\the\count@]{tabu@rcseries@\the\tabu@nested}% - \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% - \let\noalign \relax \rowcolor{tabu@rc@\the\tabu@nested}% - \def\tabu@rc@ ##1##2{\gdef\tabu@rc@{% - \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\@ne - \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi - \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% - \rowcolor{tabu@rc@\the\tabu@nested}}% - }\edef\x{\noexpand\tabu@rc@{\the\count@}{\the\c@taburow}}\x - \global\let\tabu@rc@G \tabu@rc@ - \fi - \fi - \tabu@everyrow@egroup -}% \tabu@rowcolorseries -\tabuDisableCommands {\let\tabu@rc@ \@empty } -\def\tabu@rowcolorserieserror {\PackageError{tabu} - {Invalid syntax for \string\taburowcolors - \MessageBreak Please look at the documentation!}\@ehd -}% \tabu@rowcolorserieserror -\newcommand*\tabureset {% - \tabulinesep=\z@ \extrarowsep=\z@ \extratabsurround=\z@ - \tabulinestyle{}\everyrow{}\taburulecolor||{}\taburowcolors{}% -}% \tabureset -%% Parsing the line styles ------------------------------------------ -\def\tabu@getline #1{\begingroup - \csname \ifcsname if@safe@actives\endcsname % - @safe@activestrue\else - relax\fi \endcsname - \edef\tabu@temp{#1}\tabu@sanitizearg{#1}\@tempa - \let\tabu@thestyle \relax - \ifcsname tabu@linestyle@\@tempa \endcsname - \edef\tabu@thestyle{\endgroup - \def\tabu@thestyle{\expandafter\noexpand - \csname tabu@linestyle@\@tempa\endcsname}% - }\tabu@thestyle - \else \expandafter\tabu@definestyle \tabu@temp \@nil - \fi -}% \tabu@getline -\def\tabu@definestyle #1#2\@nil {\endlinechar \m@ne \makeatletter - \tabu@thick \maxdimen \tabu@on \maxdimen \tabu@off \maxdimen - \let\tabu@c@lon \@undefined \let\tabu@c@loff \@undefined - \ifodd 1\ifcat .#1\else\ifcat\relax #1\else 0\fi\fi % catcode 12 or non expandable cs - \def\tabu@temp{\tabu@getparam{thick}}% - \else \def\tabu@temp{\tabu@getparam{thick}\maxdimen}% - \fi - {% - \let\tabu@ \relax - \def\:{\obeyspaces \tabu@oXIII \tabu@commaXIII \edef\:}% (space active \: happy ;-)) - \scantokens{\:{\tabu@temp #1#2 \tabu@\tabu@}}% - \expandafter}\expandafter - \def\expandafter\:\expandafter{\:}% line spec rewritten now ;-) - \def\;{\def\:}% - \scantokens\expandafter{\expandafter\;\expandafter{\:}}% space is now inactive (catcode 10) - \let\tabu@ \tabu@getcolor \:% all arguments are ready now ;-) - \ifdefined\tabu@c@lon \else \let\tabu@c@lon\@empty \fi - \ifx \tabu@c@lon\@empty \def\tabu@c@lon{\CT@arc@}\fi - \ifdefined\tabu@c@loff \else \let\tabu@c@loff \@empty \fi - \ifdim \tabu@on=\maxdimen \ifdim \tabu@off<\maxdimen - \tabu@on \tabulineon \fi\fi - \ifdim \tabu@off=\maxdimen \ifdim \tabu@on<\maxdimen - \tabu@off \tabulineoff \fi\fi - \ifodd 1\ifdim \tabu@off=\maxdimen \ifdim \tabu@on=\maxdimen 0 \fi\fi - \in@true % - \else \in@false % - \fi - \ifdim\tabu@thick=\maxdimen \def\tabu@thick{\arrayrulewidth}% - \else \edef\tabu@thick{\the\tabu@thick}% - \fi - \edef \tabu@thestyle ##1##2{\endgroup - \def\tabu@thestyle{% - \ifin@ \noexpand\tabu@leadersstyle {\tabu@thick} - {\the\tabu@on}{##1} - {\the\tabu@off}{##2}% - \else \noexpand\tabu@rulesstyle - {##1\vrule width \tabu@thick}% - {##1\leaders \hrule height \tabu@thick \hfil}% - \fi}% - }\expandafter \expandafter - \expandafter \tabu@thestyle \expandafter - \expandafter \expandafter - {\expandafter\tabu@c@lon\expandafter}\expandafter{\tabu@c@loff}% -}% \tabu@definestyle -{\catcode`\O=\active \lccode`\O=`\o \catcode`\,=\active - \lowercase{\gdef\tabu@oXIII {\catcode`\o=\active \let O=\tabu@oxiii}} - \gdef\tabu@commaXIII {\catcode`\,=\active \let ,=\space} -}% \catcode -\def\tabu@oxiii #1{% - \ifcase \ifx n#1\z@ \else - \ifx f#1\@ne\else - \tw@ \fi\fi - \expandafter\tabu@onxiii - \or \expandafter\tabu@ofxiii - \else o% - \fi#1}% -\def\tabu@onxiii #1#2{% - \ifcase \ifx !#2\tw@ \else - \ifcat.\noexpand#2\z@ \else - \ifx \tabu@spxiii#2\@ne\else - \tw@ \fi\fi\fi - \tabu@getparam{on}#2\expandafter\@gobble - \or \expandafter\tabu@onxiii % (space is active) - \else o\expandafter\@firstofone - \fi{#1#2}}% -\def\tabu@ofxiii #1#2{% - \ifx #2f\expandafter\tabu@offxiii - \else o\expandafter\@firstofone - \fi{#1#2}} -\def\tabu@offxiii #1#2{% - \ifcase \ifx !#2\tw@ \else - \ifcat.\noexpand#2\z@ \else - \ifx\tabu@spxiii#2\@ne \else - \tw@ \fi\fi\fi - \tabu@getparam{off}#2\expandafter\@gobble - \or \expandafter\tabu@offxiii % (space is active) - \else o\expandafter\@firstofone - \fi{#1#2}} -\def\tabu@getparam #1{\tabu@ \csname tabu@#1\endcsname=} -\def\tabu@getcolor #1{% \tabu@ <- \tabu@getcolor after \edef - \ifx \tabu@#1\else % no more spec - \let\tabu@theparam=#1\afterassignment \tabu@getc@l@r #1\fi -}% \tabu@getcolor -\def\tabu@getc@l@r #1\tabu@ {% - \def\tabu@temp{#1}\tabu@strtrim \tabu@temp - \ifx \tabu@temp\@empty - \else%\ifcsname \string\color@\tabu@temp \endcsname % if the color exists - \ifx \tabu@theparam \tabu@off \let\tabu@c@loff \tabu@c@l@r - \else \let\tabu@c@lon \tabu@c@l@r - \fi - %\else \tabu@warncolour{\tabu@temp}% - \fi%\fi - \tabu@ % next spec -}% \tabu@getc@l@r -\def\tabu@warncolour #1{\PackageWarning{tabu} - {Color #1 is not defined. Default color used}% -}% \tabu@warncolour -\def\tabu@leadersstyle #1#2#3#4#5{\def\tabu@leaders{{#1}{#2}{#3}{#4}{#5}}% - \ifx \tabu@leaders\tabu@leaders@G \else - \tabu@LEADERS{#1}{#2}{#3}{#4}{#5}\fi -}% \tabu@leadersstyle -\def\tabu@rulesstyle #1#2{\let\tabu@leaders \@undefined - \gdef\tabu@thevrule{#1}\gdef\tabu@thehrule{#2}% -}% \tabu@rulesstyle -%% The leaders boxes ------------------------------------------------ -\def\tabu@LEADERS #1#2#3#4#5{%% width, dash, dash color, gap, gap color - {\let\color \tabu@color % => during trials -> \color = \tabu@nocolor - {% % but the leaders boxes should have colors ! - \def\@therule{\vrule}\def\@thick{height}\def\@length{width}% - \def\@box{\hbox}\def\@unbox{\unhbox}\def\@elt{\wd}% - \def\@skip{\hskip}\def\@ss{\hss}\def\tabu@leads{\tabu@hleads}% - \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}% - \global\let\tabu@thehleaders \tabu@theleaders - }% - {% - \def\@therule{\hrule}\def\@thick{width}\def\@length{height}% - \def\@box{\vbox}\def\@unbox{\unvbox}\def\@elt{\ht}% - \def\@skip{\vskip}\def\@ss{\vss}\def\tabu@leads{\tabu@vleads}% - \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}% - \global\let\tabu@thevleaders \tabu@theleaders - }% - \gdef\tabu@leaders@G{{#1}{#2}{#3}{#4}{#5}}% - }% -}% \tabu@LEADERS -\def\tabu@therule #1#2{\@therule \@thick#1\@length\dimexpr#2/2 \@depth\z@} -\def\tabu@l@@d@rs #1#2#3#4#5{%% width, dash, dash color, gap, gap color - \global\setbox \tabu@leads=\@box{% - {#3\tabu@therule{#1}{#2}}% - \ifx\\#5\\\@skip#4\else{#5\tabu@therule{#1}{#4*2}}\fi - {#3\tabu@therule{#1}{#2}}}% - \global\setbox\tabu@leads=\@box to\@elt\tabu@leads{\@ss - {#3\tabu@therule{#1}{#2}}\@unbox\tabu@leads}% - \edef\tabu@theleaders ##1{\def\noexpand\tabu@theleaders {% - {##1\tabu@therule{#1}{#2}}% - \xleaders \copy\tabu@leads \@ss - \tabu@therule{0pt}{-#2}{##1\tabu@therule{#1}{#2}}}% - }\tabu@theleaders{#3}% -}% \tabu@l@@d@rs -%% \tabu \endtabu \tabu* \longtabu \endlongtabu \longtabu* ---------- -\newcommand*\tabu {\tabu@longfalse - \ifmmode \def\tabu@ {\array}\def\endtabu {\endarray}% - \else \def\tabu@ {\tabu@tabular}\def\endtabu {\endtabular}\fi - \expandafter\let\csname tabu*\endcsname \tabu - \expandafter\def\csname endtabu*\endcsname{\endtabu}% - \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget -}% {tabu} -\let\tabu@tabular \tabular % -\expandafter\def\csname tabu*\endcsname{\tabuscantokenstrue \tabu} -\newcommand*\longtabu {\tabu@longtrue - \ifmmode\PackageError{tabu}{longtabu not allowed in math mode}\fi - \def\tabu@{\longtable}\def\endlongtabu{\endlongtable}% - \LTchunksize=\@M - \expandafter\let\csname tabu*\endcsname \tabu - \expandafter\def\csname endlongtabu*\endcsname{\endlongtabu}% - \let\LT@startpbox \tabu@LT@startpbox % \everypar{ array struts } - \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget -}% {longtabu} -\expandafter\def\csname longtabu*\endcsname{\tabuscantokenstrue \longtabu} -\def\tabu@nolongtabu{\PackageError{tabu} - {longtabu requires the longtable package}\@ehd} -%% Read the target and then : \tabular or \@array ------------------ -\def\tabu@settarget {\futurelet\@let@token \tabu@sett@rget } -\def\tabu@sett@rget {\tabu@target \z@ - \ifcase \ifx \bgroup\@let@token \z@ \else - \ifx \@sptoken\@let@token \@ne \else - \if t\@let@token \tw@ \else - \if s\@let@token \thr@@\else - \z@\fi\fi\fi\fi - \expandafter\tabu@begin - \or \expandafter\tabu@gobblespace\expandafter\tabu@settarget - \or \expandafter\tabu@to - \or \expandafter\tabu@spread - \fi -}% \tabu@sett@rget -\def\tabu@to to{\def\tabu@halignto{to}\tabu@gettarget} -\def\tabu@spread spread{\tabu@spreadtrue\def\tabu@halignto{spread}\tabu@gettarget} -\def\tabu@gettarget {\afterassignment\tabu@linegoaltarget \tabu@target } -\def\tabu@linegoaltarget {\futurelet\tabu@temp \tabu@linegoalt@rget } -\def\tabu@linegoalt@rget {% - \ifx \tabu@temp\LNGL@setlinegoal - \LNGL@setlinegoal \expandafter \@firstoftwo \fi % @gobbles \LNGL@setlinegoal - \tabu@begin -}% \tabu@linegoalt@rget -\def\tabu@begin #1#{% - \iftabu@measuring \expandafter\tabu@nestedmeasure \fi - \ifdim \tabu@target=\z@ \let\tabu@halignto \@empty - \else \edef\tabu@halignto{\tabu@halignto\the\tabu@target}% - \fi - \@testopt \tabu@tabu@ \tabu@aligndefault #1\@nil -}% \tabu@begin -\long\def\tabu@tabu@ [#1]#2\@nil #3{\tabu@setup - \def\tabu@align {#1}\def\tabu@savedpream{\NC@find #3}% - \tabu@ [\tabu@align ]#2{#3\tabu@rewritefirst }% -}% \tabu@tabu@ -\def\tabu@nestedmeasure {% - \ifodd 1\iftabu@spread \else \ifdim\tabu@target=\z@ \else 0 \fi\fi\relax - \tabu@spreadtrue - \else \begingroup \iffalse{\fi \ifnum0=`}\fi - \toks@{}\def\tabu@stack{b}% - \expandafter\tabu@collectbody\expandafter\tabu@quickrule - \expandafter\endgroup - \fi -}% \tabu@nestedmeasure -\def\tabu@quickrule {\indent\vrule height\z@ depth\z@ width\tabu@target} -%% \tabu@setup \tabu@init \tabu@indent -\def\tabu@setup{\tabu@alloc@ - \ifcase \tabu@nested - \ifmmode \else \iftabu@spread\else \ifdim\tabu@target=\z@ - \let\tabu@afterendpar \par - \fi\fi\fi - \def\tabu@aligndefault{c}\tabu@init \tabu@indent - \else % - \def\tabu@aligndefault{t}\let\tabudefaulttarget \linewidth - \fi - \let\tabu@thetarget \tabudefaulttarget \let\tabu@restored \@undefined - \edef\tabu@NC@list{\the\NC@list}\NC@list{\NC@do \tabu@rewritefirst}% - \everycr{}\let\@startpbox \tabu@startpbox % for nested tabu inside longtabu... - \let\@endpbox \tabu@endpbox % idem " " " " " " - \let\@tabarray \tabu@tabarray % idem " " " " " " - \tabu@setcleanup \tabu@setreset -}% \tabu@setup -\def\tabu@init{\tabu@starttimer \tabu@measuringfalse - \edef\tabu@hfuzz {\the\dimexpr\hfuzz+1sp}\global\tabu@footnotes{}% - \let\firsthline \tabu@firsthline \let\lasthline \tabu@lasthline - \let\firstline \tabu@firstline \let\lastline \tabu@lastline - \let\hline \tabu@hline \let\@xhline \tabu@xhline - \let\color \tabu@color \let\@arstrutbox \tabu@arstrutbox - \iftabu@colortbl\else\let\LT@@hline \tabu@LT@@hline \fi - \tabu@trivlist % - \let\@footnotetext \tabu@footnotetext \let\@xfootnotetext \tabu@xfootnotetext - \let\@xfootnote \tabu@xfootnote \let\centering \tabu@centering - \let\raggedright \tabu@raggedright \let\raggedleft \tabu@raggedleft - \let\tabudecimal \tabu@tabudecimal \let\Centering \tabu@Centering - \let\RaggedRight \tabu@RaggedRight \let\RaggedLeft \tabu@RaggedLeft - \let\justifying \tabu@justifying \let\rowfont \tabu@rowfont - \let\fbox \tabu@fbox \let\color@b@x \tabu@color@b@x - \let\tabu@@everycr \everycr \let\tabu@@everypar \everypar - \let\tabu@prepnext@tokORI \prepnext@tok\let\prepnext@tok \tabu@prepnext@tok - \let\tabu@multicolumnORI\multicolumn \let\multicolumn \tabu@multicolumn - \let\tabu@startpbox \@startpbox % for nested tabu inside longtabu pfff !!! - \let\tabu@endpbox \@endpbox % idem " " " " " " " - \let\tabu@tabarray \@tabarray % idem " " " " " " " - \tabu@adl@fix \let\endarray \tabu@endarray % colortbl & arydshln (delarray) - \iftabu@colortbl\CT@everycr\expandafter{\expandafter\iftabu@everyrow \the\CT@everycr \fi}\fi -}% \tabu@init -\def\tabu@indent{% correction for indentation - \ifdim \parindent>\z@\ifx \linewidth\tabudefaulttarget - \everypar\expandafter{% - \the\everypar\everypar\expandafter{\the\everypar}% - \setbox\z@=\lastbox - \ifdim\wd\z@>\z@ \edef\tabu@thetarget - {\the\dimexpr -\wd\z@+\tabudefaulttarget}\fi - \box\z@}% - \fi\fi -}% \tabu@indent -\def\tabu@setcleanup {% saves last global assignments - \ifodd 1\ifmmode \else \iftabu@long \else 0\fi\fi\relax - \def\tabu@aftergroupcleanup{% - \def\tabu@aftergroupcleanup{\aftergroup\tabu@cleanup}}% - \else - \def\tabu@aftergroupcleanup{% - \aftergroup\aftergroup\aftergroup\tabu@cleanup - \let\tabu@aftergroupcleanup \relax}% - \fi - \let\tabu@arc@Gsave \tabu@arc@G - \let\tabu@arc@G \tabu@arc@L % - \let\tabu@drsc@Gsave \tabu@drsc@G - \let\tabu@drsc@G \tabu@drsc@L % - \let\tabu@ls@Gsave \tabu@ls@G - \let\tabu@ls@G \tabu@ls@L % - \let\tabu@rc@Gsave \tabu@rc@G - \let\tabu@rc@G \tabu@rc@L % - \let\tabu@evr@Gsave \tabu@evr@G - \let\tabu@evr@G \tabu@evr@L % - \let\tabu@celllalign@save \tabu@celllalign - \let\tabu@cellralign@save \tabu@cellralign - \let\tabu@cellleft@save \tabu@cellleft - \let\tabu@cellright@save \tabu@cellright - \let\tabu@@celllalign@save \tabu@@celllalign - \let\tabu@@cellralign@save \tabu@@cellralign - \let\tabu@@cellleft@save \tabu@@cellleft - \let\tabu@@cellright@save \tabu@@cellright - \let\tabu@rowfontreset@save \tabu@rowfontreset - \let\tabu@@rowfontreset@save\tabu@@rowfontreset - \let\tabu@rowfontreset \@empty - \edef\tabu@alloc@save {\the\tabu@alloc}% restore at \tabu@reset - \edef\c@taburow@save {\the\c@taburow}% - \edef\tabu@naturalX@save {\the\tabu@naturalX}% - \let\tabu@naturalXmin@save \tabu@naturalXmin - \let\tabu@naturalXmax@save \tabu@naturalXmax - \let\tabu@mkarstrut@save \tabu@mkarstrut - \edef\tabu@clarstrut{% - \extrarowheight \the\dimexpr \ht\@arstrutbox-\ht\strutbox \relax - \extrarowdepth \the\dimexpr \dp\@arstrutbox-\dp\strutbox \relax - \let\noexpand\@arraystretch \@ne \noexpand\tabu@rearstrut}% -}% \tabu@setcleanup -\def\tabu@cleanup {\begingroup - \globaldefs\@ne \tabu@everyrowtrue - \let\tabu@arc@G \tabu@arc@Gsave - \let\CT@arc@ \tabu@arc@G - \let\tabu@drsc@G \tabu@drsc@Gsave - \let\CT@drsc@ \tabu@drsc@G - \let\tabu@ls@G \tabu@ls@Gsave - \let\tabu@ls@ \tabu@ls@G - \let\tabu@rc@G \tabu@rc@Gsave - \let\tabu@rc@ \tabu@rc@G - \let\CT@do@color \relax - \let\tabu@evr@G \tabu@evr@Gsave - \let\tabu@celllalign \tabu@celllalign@save - \let\tabu@cellralign \tabu@cellralign@save - \let\tabu@cellleft \tabu@cellleft@save - \let\tabu@cellright \tabu@cellright@save - \let\tabu@@celllalign \tabu@@celllalign@save - \let\tabu@@cellralign \tabu@@cellralign@save - \let\tabu@@cellleft \tabu@@cellleft@save - \let\tabu@@cellright \tabu@@cellright@save - \let\tabu@rowfontreset \tabu@rowfontreset@save - \let\tabu@@rowfontreset \tabu@@rowfontreset@save - \tabu@naturalX =\tabu@naturalX@save - \let\tabu@naturalXmax \tabu@naturalXmax@save - \let\tabu@naturalXmin \tabu@naturalXmin@save - \let\tabu@mkarstrut \tabu@mkarstrut@save - \c@taburow =\c@taburow@save - \ifcase \tabu@nested \tabu@alloc \m@ne\fi - \endgroup % - \ifcase \tabu@nested - \the\tabu@footnotes \global\tabu@footnotes{}% - \tabu@afterendpar \tabu@elapsedtime - \fi - \tabu@clarstrut - \everyrow\expandafter {\tabu@evr@G}% -}% \tabu@cleanup -\let\tabu@afterendpar \relax -\def\tabu@setreset {% - \edef\tabu@savedparams {% \relax for \tabu@message@save - \ifmmode \col@sep \the\arraycolsep - \else \col@sep \the\tabcolsep \fi \relax - \arrayrulewidth \the\arrayrulewidth \relax - \doublerulesep \the\doublerulesep \relax - \extratabsurround \the\extratabsurround \relax - \extrarowheight \the\extrarowheight \relax - \extrarowdepth \the\extrarowdepth \relax - \abovetabulinesep \the\abovetabulinesep \relax - \belowtabulinesep \the\belowtabulinesep \relax - \def\noexpand\arraystretch{\arraystretch}% - \ifdefined\minrowclearance \minrowclearance\the\minrowclearance\relax\fi}% - \begingroup - \@temptokena\expandafter{\tabu@savedparams}% => only for \savetabu / \usetabu - \ifx \tabu@arc@L\relax \else \tabu@setsave \tabu@arc@L \fi - \ifx \tabu@drsc@L\relax \else \tabu@setsave \tabu@drsc@L \fi - \tabu@setsave \tabu@ls@L \tabu@setsave \tabu@evr@L - \expandafter \endgroup \expandafter - \def\expandafter\tabu@saved@ \expandafter{\the\@temptokena - \let\tabu@arc@G \tabu@arc@L - \let\tabu@drsc@G \tabu@drsc@L - \let\tabu@ls@G \tabu@ls@L - \let\tabu@rc@G \tabu@rc@L - \let\tabu@evr@G \tabu@evr@L}% - \def\tabu@reset{\tabu@savedparams - \tabu@everyrowtrue \c@taburow \z@ - \let\CT@arc@ \tabu@arc@L - \let\CT@drsc@ \tabu@drsc@L - \let\tabu@ls@ \tabu@ls@L - \let\tabu@rc@ \tabu@rc@L - \global\tabu@alloc \tabu@alloc@save - \everyrow\expandafter{\tabu@evr@L}}% -}% \tabu@reset -\def\tabu@setsave #1{\expandafter\tabu@sets@ve #1\@nil{#1}} -\long\def\tabu@sets@ve #1\@nil #2{\@temptokena\expandafter{\the\@temptokena \def#2{#1}}} -%% The Rewriting Process ------------------------------------------- -\def\tabu@newcolumntype #1{% - \expandafter\tabu@new@columntype - \csname NC@find@\string#1\expandafter\endcsname - \csname NC@rewrite@\string#1\endcsname - {#1}% -}% \tabu@newcolumntype -\def\tabu@new@columntype #1#2#3{% - \def#1##1#3{\NC@{##1}}% - \let#2\relax \newcommand*#2% -}% \tabu@new@columntype -\def\tabu@privatecolumntype #1{% - \expandafter\tabu@private@columntype - \csname NC@find@\string#1\expandafter\endcsname - \csname NC@rewrite@\string#1\expandafter\endcsname - \csname tabu@NC@find@\string#1\expandafter\endcsname - \csname tabu@NC@rewrite@\string#1\endcsname - {#1}% -}% \tabu@privatecolumntype -\def\tabu@private@columntype#1#2#3#4{% - \g@addto@macro\tabu@privatecolumns{\let#1#3\let#2#4}% - \tabu@new@columntype#3#4% -}% \tabu@private@columntype -\let\tabu@privatecolumns \@empty -\newcommand*\tabucolumn [1]{\expandafter \def \expandafter - \tabu@highprioritycolumns\expandafter{\tabu@highprioritycolumns - \NC@do #1}}% -\let\tabu@highprioritycolumns \@empty -%% The | ``column'' : rewriting process -------------------------- -\tabu@privatecolumntype |{\tabu@rewritevline} -\newcommand*\tabu@rewritevline[1][]{\tabu@vlinearg{#1}% - \expandafter \NC@find \tabu@rewritten} -\def\tabu@lines #1{% - \ifx|#1\else \tabu@privatecolumntype #1{\tabu@rewritevline}\fi - \NC@list\expandafter{\the\NC@list \NC@do #1}% -}% \tabu@lines@ -\def\tabu@vlinearg #1{% - \ifx\\#1\\\def\tabu@thestyle {\tabu@ls@}% - \else\tabu@getline {#1}% - \fi - \def\tabu@rewritten ##1{\def\tabu@rewritten{!{##1\tabu@thevline}}% - }\expandafter\tabu@rewritten\expandafter{\tabu@thestyle}% - \expandafter \tabu@keepls \tabu@thestyle \@nil -}% \tabu@vlinearg -\def\tabu@keepls #1\@nil{% - \ifcat $\@cdr #1\@nil $% - \ifx \relax#1\else - \ifx \tabu@ls@#1\else - \let#1\relax - \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer - \tabu@savels\noexpand#1}\fi\fi\fi -}% \tabu@keepls -\def\tabu@thevline {\begingroup - \ifdefined\tabu@leaders - \setbox\@tempboxa=\vtop to\dimexpr - \ht\@arstrutbox+\dp\@arstrutbox{{\tabu@thevleaders}}% - \ht\@tempboxa=\ht\@arstrutbox \dp\@tempboxa=\dp\@arstrutbox - \box\@tempboxa - \else - \tabu@thevrule - \fi \endgroup -}% \tabu@thevline -\def\tabu@savels #1{% - \expandafter\let\csname\string#1\endcsname #1% - \expandafter\def\expandafter\tabu@reset\expandafter{\tabu@reset - \tabu@resetls#1}}% -\def\tabu@resetls #1{\expandafter\let\expandafter#1\csname\string#1\endcsname}% -%% \multicolumn inside tabu environment ----------------------------- -\tabu@newcolumntype \tabu@rewritemulticolumn{% - \aftergroup \tabu@endrewritemulticolumn % after \@mkpream group - \NC@list{\NC@do *}\tabu@textbar \tabu@lines - \tabu@savedecl - \tabu@privatecolumns - \NC@list\expandafter{\the\expandafter\NC@list \tabu@NC@list}% - \let\tabu@savels \relax - \NC@find -}% \tabu@rewritemulticolumn -\def\tabu@endrewritemulticolumn{\gdef\tabu@mkpreambuffer{}\endgroup} -\def\tabu@multicolumn{\tabu@ifenvir \tabu@multic@lumn \tabu@multicolumnORI} -\long\def\tabu@multic@lumn #1#2#3{\multispan{#1}\begingroup - \tabu@everyrowtrue - \NC@list{\NC@do \tabu@rewritemulticolumn}% - \expandafter\@gobbletwo % gobbles \multispan{#1} - \tabu@multicolumnORI{#1}{\tabu@rewritemulticolumn #2}% - {\iftabuscantokens \tabu@rescan \else \expandafter\@firstofone \fi - {#3}}% -}% \tabu@multic@lumn -%% The X column(s): rewriting process ----------------------------- -\tabu@privatecolumntype X[1][]{\begingroup \tabu@siunitx{\endgroup \tabu@rewriteX {#1}}} -\def\tabu@nosiunitx #1{#1{}{}\expandafter \NC@find \tabu@rewritten } -\def\tabu@siunitx #1{\@ifnextchar \bgroup - {\tabu@rewriteX@Ss{#1}} - {\tabu@nosiunitx{#1}}} -\def\tabu@rewriteX@Ss #1#2{\@temptokena{}% - \@defaultunits \let\tabu@temp =#2\relax\@nnil - \ifodd 1\ifx S\tabu@temp \else \ifx s\tabu@temp \else 0 \fi\fi - \def\NC@find{\def\NC@find >####1####2<####3\relax{#1 {####1}{####3}% - }\expandafter\NC@find \the\@temptokena \relax - }\expandafter\NC@rewrite@S \@gobble #2\relax - \else \tabu@siunitxerror - \fi - \expandafter \NC@find \tabu@rewritten -}% \tabu@rewriteX@Ss -\def\tabu@siunitxerror {\PackageError{tabu}{Not a S nor s column ! - \MessageBreak X column can only embed siunitx S or s columns}\@ehd -}% \tabu@siunitxerror -\def\tabu@rewriteX #1#2#3{\tabu@Xarg {#1}{#2}{#3}% - \iftabu@measuring - \else \tabu@measuringtrue % first X column found in the preamble - \let\@halignto \relax \let\tabu@halignto \relax - \iftabu@spread \tabu@spreadtarget \tabu@target \tabu@target \z@ - \else \tabu@spreadtarget \z@ \fi - \ifdim \tabu@target=\z@ - \setlength\tabu@target \tabu@thetarget - \tabu@message{\tabu@message@defaulttarget}% - \else \tabu@message{\tabu@message@target}\fi - \fi -}% \tabu@rewriteX -\def\tabu@rewriteXrestore #1#2#3{\let\@halignto \relax - \def\tabu@rewritten{l}} -\def\tabu@Xarg #1#2#3{% - \advance\tabu@Xcol \@ne \let\tabu@Xlcr \@empty - \let\tabu@Xdisp \@empty \let\tabu@Xmath \@empty - \ifx\\#1\\% - \def\tabu@rewritten{p}\tabucolX \p@ % - \else - \let\tabu@rewritten \@empty \let\tabu@temp \@empty \tabucolX \z@ - \tabu@Xparse {}#1\relax - \fi - \tabu@Xrewritten{#2}{#3}% -}% \tabu@Xarg -\def\tabu@Xparse #1{\futurelet\@let@token \tabu@Xtest} -\expandafter\def\expandafter\tabu@Xparsespace\space{\tabu@Xparse{}} -\def\tabu@Xtest{% - \ifcase \ifx \relax\@let@token \z@ \else - \if ,\@let@token \m@ne\else - \if p\@let@token 1\else - \if m\@let@token 2\else - \if b\@let@token 3\else - \if l\@let@token 4\else - \if c\@let@token 5\else - \if r\@let@token 6\else - \if j\@let@token 7\else - \if L\@let@token 8\else - \if C\@let@token 9\else - \if R\@let@token 10\else - \if J\@let@token 11\else - \ifx \@sptoken\@let@token 12\else - \if .\@let@token 13\else - \if -\@let@token 13\else - \ifcat $\@let@token 14\else - 15\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax - \or \tabu@Xtype {p}% - \or \tabu@Xtype {m}% - \or \tabu@Xtype {b}% - \or \tabu@Xalign \raggedright\relax - \or \tabu@Xalign \centering\relax - \or \tabu@Xalign \raggedleft\relax - \or \tabu@Xalign \tabu@justify\relax - \or \tabu@Xalign \RaggedRight\raggedright - \or \tabu@Xalign \Centering\centering - \or \tabu@Xalign \RaggedLeft\raggedleft - \or \tabu@Xalign \justifying\tabu@justify - \or \expandafter \tabu@Xparsespace - \or \expandafter \tabu@Xcoef - \or \expandafter \tabu@Xm@th - \or \tabu@Xcoef{}% - \else\expandafter \tabu@Xparse - \fi -}% \tabu@Xtest -\def\tabu@Xalign #1#2{% - \ifx \tabu@Xlcr\@empty \else \PackageWarning{tabu} - {Duplicate horizontal alignment specification}\fi - \ifdefined#1\def\tabu@Xlcr{#1}\let#1\relax - \else \def\tabu@Xlcr{#2}\let#2\relax\fi - \expandafter\tabu@Xparse -}% \tabu@Xalign -\def\tabu@Xtype #1{% - \ifx \tabu@rewritten\@empty \else \PackageWarning{tabu} - {Duplicate vertical alignment specification}\fi - \def\tabu@rewritten{#1}\expandafter\tabu@Xparse -}% \tabu@Xtype -\def\tabu@Xcoef#1{\edef\tabu@temp{\tabu@temp#1}% - \afterassignment\tabu@Xc@ef \tabu@cnt\number\if-#10\fi -}% \tabu@Xcoef -\def\tabu@Xc@ef{\advance\tabucolX \tabu@temp\the\tabu@cnt\p@ - \tabu@Xparse{}% -}% \tabu@Xc@ef -\def\tabu@Xm@th #1{\futurelet \@let@token \tabu@Xd@sp} -\def\tabu@Xd@sp{\let\tabu@Xmath=$% - \ifx $\@let@token \def\tabu@Xdisp{\displaystyle}% - \expandafter\tabu@Xparse - \else \expandafter\tabu@Xparse\expandafter{\expandafter}% - \fi -}% \tabu@Xd@sp -\def\tabu@Xrewritten {% - \ifx \tabu@rewritten\@empty \def\tabu@rewritten{p}\fi - \ifdim \tabucolX<\z@ \tabu@negcoeftrue - \else\ifdim \tabucolX=\z@ \tabucolX \p@ - \fi\fi - \edef\tabu@temp{{\the\tabu@Xcol}{\tabu@strippt\tabucolX}}% - \edef\tabu@Xcoefs{\tabu@Xcoefs \tabu@ \tabu@temp}% - \edef\tabu@rewritten ##1##2{\def\noexpand\tabu@rewritten{% - >{\tabu@Xlcr \ifx$\tabu@Xmath$\tabu@Xdisp\fi ##1}% - \tabu@rewritten {\tabu@hsize \tabu@temp}% - <{##2\ifx$\tabu@Xmath$\fi}}% - }\tabu@rewritten -}% \tabu@Xrewritten -\def\tabu@hsize #1#2{% - \ifdim #2\p@<\z@ - \ifdim \tabucolX=\maxdimen \tabu@wd{#1}\else - \ifdim \tabu@wd{#1}<-#2\tabucolX \tabu@wd{#1}\else -#2\tabucolX\fi - \fi - \else #2\tabucolX - \fi -}% \tabu@hsize -%% \usetabu and \preamble: rewriting process --------------------- -\tabu@privatecolumntype \usetabu [1]{% - \ifx\\#1\\\tabu@saveerr{}\else - \@ifundefined{tabu@saved@\string#1} - {\tabu@saveerr{#1}} - {\let\tabu@rewriteX \tabu@rewriteXrestore - \csname tabu@saved@\string#1\expandafter\endcsname\expandafter\@ne}% - \fi -}% \NC@rewrite@\usetabu -\tabu@privatecolumntype \preamble [1]{% - \ifx\\#1\\\tabu@saveerr{}\else - \@ifundefined{tabu@saved@\string#1} - {\tabu@saveerr{#1}} - {\csname tabu@saved@\string#1\expandafter\endcsname\expandafter\z@}% - \fi -}% \NC@rewrite@\preamble -%% Controlling the rewriting process ------------------------------- -\tabu@newcolumntype \tabu@rewritefirst{% - \iftabu@long \aftergroup \tabu@longpream % - \else \aftergroup \tabu@pream - \fi - \let\tabu@ \relax \let\tabu@hsize \relax - \let\tabu@Xcoefs \@empty \let\tabu@savels \relax - \tabu@Xcol \z@ \tabu@cnt \tw@ - \gdef\tabu@mkpreambuffer{\tabu@{}}\tabu@measuringfalse - \global\setbox\@arstrutbox \box\@arstrutbox - \NC@list{\NC@do *}\tabu@textbar \tabu@lines - \NC@list\expandafter{\the\NC@list \NC@do X}% - \iftabu@siunitx % - \NC@list\expandafter{\the\NC@list \NC@do S\NC@do s}\fi - \NC@list\expandafter{\the\expandafter\NC@list \tabu@highprioritycolumns}% - \expandafter\def\expandafter\tabu@NC@list\expandafter{% - \the\expandafter\NC@list \tabu@NC@list}% % * | X S - \NC@list\expandafter{\expandafter \NC@do \expandafter\usetabu - \expandafter \NC@do \expandafter\preamble - \the\NC@list \NC@do \tabu@rewritemiddle - \NC@do \tabu@rewritelast}% - \tabu@savedecl - \tabu@privatecolumns - \edef\tabu@prev{\the\@temptokena}\NC@find \tabu@rewritemiddle -}% NC@rewrite@\tabu@rewritefirst -\tabu@newcolumntype \tabu@rewritemiddle{% - \edef\tabu@temp{\the\@temptokena}\NC@find \tabu@rewritelast -}% \NC@rewrite@\tabu@rewritemiddle -\tabu@newcolumntype \tabu@rewritelast{% - \ifx \tabu@temp\tabu@prev \advance\tabu@cnt \m@ne - \NC@list\expandafter{\tabu@NC@list \NC@do \tabu@rewritemiddle - \NC@do \tabu@rewritelast}% - \else \let\tabu@prev\tabu@temp - \fi - \ifcase \tabu@cnt \expandafter\tabu@endrewrite - \else \expandafter\NC@find \expandafter\tabu@rewritemiddle - \fi -}% \NC@rewrite@\tabu@rewritelast -%% Choosing the strategy -------------------------------------------- -\def\tabu@endrewrite {% - \let\tabu@temp \NC@find - \ifx \@arrayright\relax \let\@arrayright \@empty \fi - \count@=% - \ifx \@finalstrut\tabu@finalstrut \z@ % outer in mode 0 print - \iftabu@measuring - \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer - \tabu@target \csname tabu@\the\tabu@nested.T\endcsname - \tabucolX \csname tabu@\the\tabu@nested.X\endcsname - \edef\@halignto {\ifx\@arrayright\@empty to\tabu@target\fi}}% - \fi - \else\iftabu@measuring 4 % X columns - \xdef\tabu@mkpreambuffer{\tabu@{\tabu@mkpreambuffer - \tabu@target \the\tabu@target - \tabu@spreadtarget \the\tabu@spreadtarget}% - \def\noexpand\tabu@Xcoefs{\tabu@Xcoefs}% - \edef\tabu@halignto{\ifx \@arrayright\@empty to\tabu@target\fi}}% - \let\tabu@Xcoefs \relax - \else\ifcase\tabu@nested \thr@@ % outer, no X - \global\let\tabu@afterendpar \relax - \else \@ne % inner, no X, outer in mode 1 or 2 - \fi - \ifdefined\tabu@usetabu - \else \ifdim\tabu@target=\z@ - \else \let\tabu@temp \tabu@extracolsep - \fi\fi - \fi - \fi - \xdef\tabu@mkpreambuffer{\count@ \the\count@ \tabu@mkpreambuffer}% - \tabu@temp -}% \tabu@endrewrite -\def\tabu@extracolsep{\@defaultunits \expandafter\let - \expandafter\tabu@temp \expandafter=\the\@temptokena \relax\@nnil - \ifx \tabu@temp\@sptoken - \expandafter\tabu@gobblespace \expandafter\tabu@extracolsep - \else - \edef\tabu@temp{\noexpand\NC@find - \if |\noexpand\tabu@temp @% - \else\if !\noexpand\tabu@temp @% - \else !% - \fi\fi - {\noexpand\extracolsep\noexpand\@flushglue}}% - \fi - \tabu@temp -}% \tabu@extrac@lsep -%% Implementing the strategy ---------------------------------------- -\long\def\tabu@pream #1\@preamble {% - \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup - \NC@list\expandafter {\tabu@NC@list}% in case of nesting... - \ifdefined\tabu@usetabu \tabu@usetabu \tabu@target \z@ \fi - \let\tabu@savedpreamble \@preamble - \global\let\tabu@elapsedtime \relax - \tabu@thebody ={#1\tabu@aftergroupcleanup}% - \tabu@thebody =\expandafter{\the\expandafter\tabu@thebody - \@preamble}% - \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens ) - \tabu@select -}% \tabu@pream -\long\def\tabu@longpream #1\LT@bchunk #2\LT@bchunk{% - \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup - \NC@list\expandafter {\tabu@NC@list}% in case of nesting... - \let\tabu@savedpreamble \@preamble - \global\let\tabu@elapsedtime \relax - \tabu@thebody ={#1\LT@bchunk #2\tabu@aftergroupcleanup \LT@bchunk}% - \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens ) - \tabu@select -}% \tabu@longpream -\def\tabu@select {% - \ifnum\tabu@nested>\z@ \tabuscantokensfalse \fi - \ifnum \count@=\@ne \iftabu@measuring \count@=\tw@ \fi\fi - \ifcase \count@ - \global\let\tabu@elapsedtime \relax - \tabu@seteverycr - \expandafter \tabuthepreamble % vertical adjustment (inherited from outer) - \or % exit in vertical measure + struts per cell because no X and outer in mode 3 - \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}% - \def\tabu@cellralign{\tabu@verticalspacing}% - \tabu@seteverycr - \expandafter \tabuthepreamble - \or % exit without measure because no X and outer in mode 4 - \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty - \tabu@seteverycr - \expandafter \tabuthepreamble - \else % needs trials - \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty - \tabu@savecounters - \expandafter \tabu@setstrategy - \fi -}% \tabu@select -\def\tabu@@ {\gdef\tabu@mkpreambuffer} -%% Protections to set up before trials ------------------------------ -\def\tabu@setstrategy {\begingroup % - \tabu@trialh@@k \tabu@cnt \z@ % number of trials - \hbadness \@M \let\hbadness \@tempcnta - \hfuzz \maxdimen \let\hfuzz \@tempdima - \let\write \tabu@nowrite\let\GenericError \tabu@GenericError - \let\savetabu \@gobble \let\tabudefaulttarget \linewidth - \let\@footnotetext \@gobble \let\@xfootnote \tabu@xfootnote - \let\color \tabu@nocolor\let\rowcolor \tabu@norowcolor - \let\tabu@aftergroupcleanup \relax % only after the last trial - \tabu@mkpreambuffer - \ifnum \count@>\thr@@ \let\@halignto \@empty \tabucolX@init - \def\tabu@lasttry{\m@ne\p@}\fi - \begingroup \iffalse{\fi \ifnum0=`}\fi - \toks@{}\def\tabu@stack{b}\iftabuscantokens \endlinechar=10 \obeyspaces \fi % - \tabu@collectbody \tabu@strategy % -}% \tabu@setstrategy -\def\tabu@savecounters{% - \def\@elt ##1{\csname c@##1\endcsname\the\csname c@##1\endcsname}% - \edef\tabu@clckpt {\begingroup \globaldefs=\@ne \cl@@ckpt \endgroup}\let\@elt \relax -}% \tabu@savecounters -\def\tabucolX@init {% \tabucolX <= \tabu@target / (sum coefs > 0) - \dimen@ \z@ \tabu@Xsum \z@ \tabucolX \z@ \let\tabu@ \tabu@Xinit \tabu@Xcoefs - \ifdim \dimen@>\z@ - \@tempdima \dimexpr \tabu@target *\p@/\dimen@ + \tabu@hfuzz\relax - \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi - \fi -}% \tabucolX@init -\def\tabu@Xinit #1#2{\tabu@Xcol #1 \advance \tabu@Xsum - \ifdim #2\p@>\z@ #2\p@ \advance\dimen@ #2\p@ - \else -#2\p@ \tabu@negcoeftrue - \@tempdima \dimexpr \tabu@target*\p@/\dimexpr-#2\p@\relax \relax - \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi - \tabu@wddef{#1}{0pt}% - \fi -}% \tabu@Xinit -%% Collecting the environment body ---------------------------------- -\long\def\tabu@collectbody #1#2\end #3{% - \edef\tabu@stack{\tabu@pushbegins #2\begin\end\expandafter\@gobble\tabu@stack}% - \ifx \tabu@stack\@empty - \toks@\expandafter{\expandafter\tabu@thebody\expandafter{\the\toks@ #2}% - \def\tabu@end@envir{\end{#3}}% - \iftabuscantokens - \iftabu@long \def\tabu@endenvir {\end{#3}\tabu@gobbleX}% - \else \def\tabu@endenvir {\let\endarray \@empty - \end{#3}\tabu@gobbleX}% - \fi - \else \def\tabu@endenvir {\end{#3}}\fi}% - \let\tabu@collectbody \tabu@endofcollect - \else\def\tabu@temp{#3}% - \ifx \tabu@temp\@empty \toks@\expandafter{\the\toks@ #2\end }% - \else \ifx\tabu@temp\tabu@@spxiii \toks@\expandafter{\the\toks@ #2\end #3}% - \else \ifx\tabu@temp\tabu@X \toks@\expandafter{\the\toks@ #2\end #3}% - \else \toks@\expandafter{\the\toks@ #2\end{#3}}% - \fi\fi\fi - \fi - \tabu@collectbody{#1}% -}% \tabu@collectbody -\long\def\tabu@pushbegins#1\begin#2{\ifx\end#2\else b\expandafter\tabu@pushbegins\fi}% -\def\tabu@endofcollect #1{\ifnum0=`{}\fi - \expandafter\endgroup \the\toks@ #1% -}% \tabu@endofcollect -%% The trials: switching between strategies ------------------------- -\def\tabu@strategy {\relax % stops \count@ assignment ! - \ifcase\count@ % case 0 = print with vertical adjustment (outer is finished) - \expandafter \tabu@endoftrials - \or % case 1 = exit in vertical measure (outer in mode 3) - \expandafter\xdef\csname tabu@\the\tabu@nested.T\endcsname{\the\tabu@target}% - \expandafter\xdef\csname tabu@\the\tabu@nested.X\endcsname{\the\tabucolX}% - \expandafter \tabu@endoftrials - \or % case 2 = exit with a rule replacing the table (outer in mode 4) - \expandafter \tabu@quickend - \or % case 3 = outer is in mode 3 because of no X - \begingroup - \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}% - \def\tabu@cellralign{\tabu@verticalspacing}% - \expandafter \tabu@measuring - \else % case 4 = horizontal measure - \begingroup - \global\let\tabu@elapsedtime \tabu@message@etime - \long\def\multicolumn##1##2##3{\multispan{##1}}% - \let\tabu@startpboxORI \@startpbox - \iftabu@spread - \def\tabu@naturalXmax {\z@}% - \let\tabu@naturalXmin \tabu@naturalXmax - \tabu@evr{\global\tabu@naturalX \z@}% - \let\@startpbox \tabu@startpboxmeasure - \else\iftabu@negcoef - \let\@startpbox \tabu@startpboxmeasure - \else \let\@startpbox \tabu@startpboxquick - \fi\fi - \expandafter \tabu@measuring - \fi -}% \tabu@strategy -\def\tabu@measuring{\expandafter \tabu@trial \expandafter - \count@ \the\count@ \tabu@endtrial -}% \tabu@measuring -\def\tabu@trial{\iftabu@long \tabu@longtrial \else \tabu@shorttrial \fi} -\def\tabu@shorttrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr - \ifx \tabu@savecounters\relax \else - \let\tabu@savecounters \relax \tabu@clckpt \fi - $\iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi - \expandafter{\expandafter \tabuthepreamble - \the\tabu@thebody - \csname tabu@adl@endtrial\endcsname - \endarray}$\egroup % got \tabu@box -}% \tabu@shorttrial -\def\tabu@longtrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr - \ifx \tabu@savecounters\relax \else - \let\tabu@savecounters \relax \tabu@clckpt \fi - \iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi - \expandafter{\expandafter \tabuthepreamble - \the\tabu@thebody - \tabuendlongtrial}\egroup % got \tabu@box -}% \tabu@longtrial -\def\tabuendlongtrial{% no @ allowed for \scantokens - \LT@echunk \global\setbox\@ne \hbox{\unhbox\@ne}\kern\wd\@ne - \LT@get@widths -}% \tabuendlongtrial -\def\tabu@adl@endtrial{% - \crcr \noalign{\global\adl@ncol \tabu@nbcols}}% anything global is crap, junky and fails ! -\def\tabu@seteverycr {\tabu@reset - \everycr \expandafter{\the\everycr \tabu@everycr}% - \let\everycr \tabu@noeverycr % -}% \tabu@seteverycr -\def\tabu@noeverycr{{\aftergroup\tabu@restoreeverycr \afterassignment}\toks@} -\def\tabu@restoreeverycr {\let\everycr \tabu@@everycr} -\def\tabu@everycr {\iftabu@everyrow \noalign{\tabu@everyrow}\fi} -\def\tabu@endoftrials {% - \iftabuscantokens \expandafter\@firstoftwo - \else \expandafter\@secondoftwo - \fi - {\expandafter \tabu@closetrialsgroup \expandafter - \tabu@rescan \expandafter{% - \expandafter\tabuthepreamble - \the\expandafter\tabu@thebody - \iftabu@long \else \endarray \fi}} - {\expandafter\tabu@closetrialsgroup \expandafter - \tabuthepreamble - \the\tabu@thebody}% - \tabu@endenvir % Finish ! -}% \tabu@endoftrials -\def\tabu@closetrialsgroup {% - \toks@\expandafter{\tabu@endenvir}% - \edef\tabu@bufferX{\endgroup - \tabucolX \the\tabucolX - \tabu@target \the\tabu@target - \tabu@cnt \the\tabu@cnt - \def\noexpand\tabu@endenvir{\the\toks@}% - %Quid de \@halignto = \tabu@halignto ?? - }% \tabu@bufferX - \tabu@bufferX - \ifcase\tabu@nested % print out (outer in mode 0) - \global\tabu@cnt \tabu@cnt - \tabu@evr{\tabu@verticaldynamicadjustment}% - \tabu@celllalign@def{\everypar{}}\let\tabu@cellralign \@empty - \let\@finalstrut \tabu@finalstrut - \else % vertical measure of nested tabu - \tabu@evr{\tabu@verticalinit}% - \tabu@celllalign@def{\tabu@verticalmeasure}% - \def\tabu@cellralign{\tabu@verticalspacing}% - \fi - \tabu@clckpt \let\@halignto \tabu@halignto - \let\@halignto \@empty - \tabu@seteverycr - \ifdim \tabustrutrule>\z@ \ifnum\tabu@nested=\z@ - \setbox\@arstrutbox \box\voidb@x % force \@arstrutbox to be rebuilt (visible struts) - \fi\fi -}% \tabu@closetrialsgroup -\def\tabu@quickend {\expandafter \endgroup \expandafter - \tabu@target \the\tabu@target \tabu@quickrule - \let\endarray \relax \tabu@endenvir -}% \tabu@quickend -\def\tabu@endtrial {\relax % stops \count@ assignment ! - \ifcase \count@ \tabu@err % case 0 = impossible here - \or \tabu@err % case 1 = impossible here - \or \tabu@err % case 2 = impossible here - \or % case 3 = outer goes into mode 0 - \def\tabu@bufferX{\endgroup}\count@ \z@ - \else % case 4 = outer goes into mode 3 - \iftabu@spread \tabu@spreadarith % inner into mode 1 (outer in mode 3) - \else \tabu@arith % or 2 (outer in mode 4) - \fi - \count@=% - \ifcase\tabu@nested \thr@@ % outer goes into mode 3 - \else\iftabu@measuring \tw@ % outer is in mode 4 - \else \@ne % outer is in mode 3 - \fi\fi - \edef\tabu@bufferX{\endgroup - \tabucolX \the\tabucolX - \tabu@target \the\tabu@target}% - \fi - \expandafter \tabu@bufferX \expandafter - \count@ \the\count@ \tabu@strategy -}% \tabu@endtrial -\def\tabu@err{\errmessage{(tabu) Internal impossible error! (\count@=\the\count@)}} -%% The algorithms: compute the widths / stop or go on --------------- -\def\tabu@arithnegcoef {% - \@tempdima \z@ \dimen@ \z@ \let\tabu@ \tabu@arith@negcoef \tabu@Xcoefs -}% \tabu@arithnegcoef -\def\tabu@arith@negcoef #1#2{% - \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ % saturated by definition - \advance\@tempdima #2\tabucolX - \else - \ifdim -#2\tabucolX <\tabu@wd{#1}% c_i X < natural width <= \tabu@target-> saturated - \advance\dimen@ -#2\p@ - \advance\@tempdima -#2\tabucolX - \else - \advance\@tempdima \tabu@wd{#1}% natural width <= c_i X => neutralised - \ifdim \tabu@wd{#1}<\tabu@target \else % neutralised - \advance\dimen@ -#2\p@ % saturated (natural width = tabu@target) - \fi - \fi - \fi -}% \tabu@arith@negcoef -\def\tabu@givespace #1#2{% here \tabu@DELTA < \z@ - \ifdim \@tempdima=\z@ - \tabu@wddef{#1}{\the\dimexpr -\tabu@DELTA*\p@/\tabu@Xsum}% - \else - \tabu@wddef{#1}{\the\dimexpr \tabu@hsize{#1}{#2} - *(\p@ -\tabu@DELTA*\p@/\@tempdima)/\p@\relax}% - \fi -}% \tabu@givespace -\def\tabu@arith {\advance\tabu@cnt \@ne - \ifnum \tabu@cnt=\@ne \tabu@message{\tabu@titles}\fi - \tabu@arithnegcoef - \@tempdimb \dimexpr \wd\tabu@box -\@tempdima \relax % - \tabu@DELTA = \dimexpr \wd\tabu@box - \tabu@target \relax - \tabu@message{\tabu@message@arith}% - \ifdim \tabu@DELTA <\tabu@hfuzz - \ifdim \tabu@DELTA<\z@ % wd (tabu)<\tabu@target ? - \let\tabu@ \tabu@givespace \tabu@Xcoefs - \advance\@tempdima \@tempdimb \advance\@tempdima -\tabu@DELTA % for message - \else % already converged: nothing to do but nearly impossible... - \fi - \tabucolX \maxdimen - \tabu@measuringfalse - \else % need for narrower X columns - \tabucolX =\dimexpr (\@tempdima -\tabu@DELTA) *\p@/\tabu@Xsum \relax - \tabu@measuringtrue - \@whilesw \iftabu@measuring\fi {% - \advance\tabu@cnt \@ne - \tabu@arithnegcoef - \tabu@DELTA =\dimexpr \@tempdima+\@tempdimb -\tabu@target \relax % always < 0 here - \tabu@message{\tabu@header - \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@ - \tabu@msgalign \@tempdima+\@tempdimb { }{ }{ }{ }{ }\@@ - \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@ - \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@ - \ifdim -\tabu@DELTA<\tabu@hfuzz \tabu@spaces target ok\else - \tabu@msgalign \dimexpr -\tabu@DELTA *\p@/\dimen@ {}{}{}{}{}\@@ - \fi}% - \ifdim -\tabu@DELTA<\tabu@hfuzz - \advance\@tempdima \@tempdimb % for message - \tabu@measuringfalse - \else - \advance\tabucolX \dimexpr -\tabu@DELTA *\p@/\dimen@ \relax - \fi - }% - \fi - \tabu@message{\tabu@message@reached}% - \edef\tabu@bufferX{\endgroup \tabu@cnt \the\tabu@cnt - \tabucolX \the\tabucolX - \tabu@target \the\tabu@target}% -}% \tabu@arith -\def\tabu@spreadarith {% - \dimen@ \z@ \@tempdima \tabu@naturalXmax \let\tabu@ \tabu@spread@arith \tabu@Xcoefs - \edef\tabu@naturalXmin {\the\dimexpr\tabu@naturalXmin*\dimen@/\p@}% - \@tempdimc =\dimexpr \wd\tabu@box -\tabu@naturalXmax+\tabu@naturalXmin \relax - \iftabu@measuring - \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax - \edef\tabu@bufferX{\endgroup \tabucolX \the\tabucolX \tabu@target\the\tabu@target}% - \else - \tabu@message{\tabu@message@spreadarith}% - \ifdim \dimexpr \@tempdimc+\tabu@spreadtarget >\tabu@target - \tabu@message{(tabu) spread - \ifdim \@tempdimc>\tabu@target useless here: default target used% - \else too large: reduced to fit default target\fi.}% - \else - \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax - \tabu@message{(tabu) spread: New target set to \the\tabu@target^^J}% - \fi - \begingroup \let\tabu@wddef \@gobbletwo - \@tempdimb \@tempdima - \tabucolX@init - \tabu@arithnegcoef - \wd\tabu@box =\dimexpr \wd\tabu@box +\@tempdima-\@tempdimb \relax - \expandafter\endgroup \expandafter\tabucolX \the\tabucolX - \tabu@arith - \fi -}% \tabu@spreadarith -\def\tabu@spread@arith #1#2{% - \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ - \else \advance\@tempdima \tabu@wd{#1}\relax - \fi -}% \tabu@spread@arith -%% Reporting in the .log file --------------------------------------- -\def\tabu@message@defaulttarget{% - \ifnum\tabu@nested=\z@^^J(tabu) Default target: - \ifx\tabudefaulttarget\linewidth \string\linewidth - \ifdim \tabu@thetarget=\linewidth \else - -\the\dimexpr\linewidth-\tabu@thetarget\fi = - \else\ifx\tabudefaulttarget\linegoal\string\linegoal= - \fi\fi - \else (tabu) Default target (nested): \fi - \the\tabu@target \on@line - \ifnum\tabu@nested=\z@ , page \the\c@page\fi} -\def\tabu@message@target {^^J(tabu) Target specified: - \the\tabu@target \on@line, page \the\c@page} -\def\tabu@message@arith {\tabu@header - \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@ - \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{ }\@@ - \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@ - \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@ - \ifdim \tabu@DELTA<\tabu@hfuzz giving space\else - \tabu@msgalign \dimexpr (\@tempdima-\tabu@DELTA) *\p@/\tabu@Xsum -\tabucolX {}{}{}{}{}\@@ - \fi -}% \tabu@message@arith -\def\tabu@message@spreadarith {\tabu@spreadheader - \tabu@msgalign \tabu@spreadtarget { }{ }{ }{ }{}\@@ - \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{}\@@ - \tabu@msgalign -\tabu@naturalXmax { }{}{}{}{}\@@ - \tabu@msgalign \tabu@naturalXmin { }{ }{ }{ }{}\@@ - \tabu@msgalign \ifdim \dimexpr\@tempdimc>\tabu@target \tabu@target - \else \@tempdimc+\tabu@spreadtarget \fi - {}{}{}{}{}\@@} -\def\tabu@message@negcoef #1#2{ - \tabu@spaces\tabu@spaces\space * #1. X[\rem@pt#2]: - \space width = \tabu@wd {#1} - \expandafter\string\csname tabu@\the\tabu@nested.W\number#1\endcsname - \ifdim -\tabu@pt#2\tabucolX<\tabu@target - < \number-\rem@pt#2 X - = \the\dimexpr -\tabu@pt#2\tabucolX \relax - \else - <= \the\tabu@target\space < \number-\rem@pt#2 X\fi} -\def\tabu@message@reached{\tabu@header - ******* Reached Target: - hfuzz = \tabu@hfuzz\on@line\space *******} -\def\tabu@message@etime{\edef\tabu@stoptime{\the\pdfelapsedtime}% - \tabu@message{(tabu)\tabu@spaces Time elapsed during measure: - \the\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax sec - \the\numexpr\numexpr(\tabu@stoptime-\tabu@starttime) - -\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax*65536\relax - *1000/65536\relax ms \tabu@spaces(\the\tabu@cnt\space - cycle\ifnum\tabu@cnt>\@ne s\fi)^^J^^J}} -\def\tabu@message@verticalsp {% - \ifdim \@tempdima>\tabu@ht - \ifdim \@tempdimb>\tabu@dp - \expandafter\expandafter\expandafter\string\tabu@ht = - \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@ - \expandafter\expandafter\expandafter\string\tabu@dp = - \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J% - \else - \expandafter\expandafter\expandafter\string\tabu@ht = - \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@^^J% - \fi - \else\ifdim \@tempdimb>\tabu@dp - \tabu@spaces\tabu@spaces\tabu@spaces - \expandafter\expandafter\expandafter\string\tabu@dp = - \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J\fi - \fi -}% \tabu@message@verticalsp -\edef\tabu@spaces{\@spaces} -\def\tabu@strippt{\expandafter\tabu@pt\the} -{\@makeother\P \@makeother\T\lowercase{\gdef\tabu@pt #1PT{#1}}} -\def\tabu@msgalign{\expandafter\tabu@msg@align\the\dimexpr} -\def\tabu@msgalign@PT{\expandafter\tabu@msg@align\romannumeral-`\0\tabu@strippt} -\def\do #1{% - \def\tabu@msg@align##1.##2##3##4##5##6##7##8##9\@@{% - \ifnum##1<10 #1 #1\else - \ifnum##1<100 #1 \else - \ifnum##1<\@m #1\fi\fi\fi - ##1.##2##3##4##5##6##7##8#1}% - \def\tabu@header{(tabu) \ifnum\tabu@cnt<10 #1\fi\the\tabu@cnt) }% - \def\tabu@titles{\ifnum \tabu@nested=\z@ - (tabu) Try#1 #1 tabu X #1 #1 #1tabu Width #1 #1 Target - #1 #1 #1 Coefs #1 #1 #1 Update^^J\fi}% - \def\tabu@spreadheader{% - (tabu) Try#1 #1 Spread #1 #1 tabu Width #1 #1 #1 Nat. X #1 #1 #1 #1Nat. Min. - #1 New Target^^J% - (tabu) sprd} - \def\tabu@message@save {\begingroup - \def\x ####1{\tabu@msg@align ####1{ }{ }{ }{ }{}\@@} - \def\z ####1{\expandafter\x\expandafter{\romannumeral-`\0\tabu@strippt - \dimexpr####1\p@{ }{ }}}% - \let\color \relax \def\tabu@rulesstyle ####1####2{\detokenize{####1}}% - \let\CT@arc@ \relax \let\@preamble \@gobble - \let\tabu@savedpream \@firstofone - \let\tabu@savedparams \@firstofone - \def\tabu@target ####1\relax {(tabu) target #1 #1 #1 #1 #1 = \x{####1}^^J}% - \def\tabucolX ####1\relax {(tabu) X columns width#1 = \x{####1}^^J}% - \def\tabu@nbcols ####1\relax {(tabu) Number of columns: \z{####1}^^J}% - \def\tabu@aligndefault ####1{(tabu) Default alignment: #1 #1 ####1^^J}% - \def\col@sep ####1\relax {(tabu) column sep #1 #1 #1 = \x{####1}^^J}% - \def\arrayrulewidth ####1\relax{(tabu) arrayrulewidth #1 = \x{####1}}% - \def\doublerulesep ####1\relax { doublerulesep = \x{####1}^^J}% - \def\extratabsurround####1\relax{(tabu) extratabsurround = \x{####1}^^J}% - \def\extrarowheight ####1\relax{(tabu) extrarowheight #1 = \x{####1}}% - \def\extrarowdepth ####1\relax {extrarowdepth = \x{####1}^^J}% - \def\abovetabulinesep####1\relax{(tabu) abovetabulinesep=\x{####1} }% - \def\belowtabulinesep####1\relax{ belowtabulinesep=\x{####1}^^J}% - \def\arraystretch ####1{(tabu) arraystretch #1 #1 = \z{####1}^^J}% - \def\minrowclearance####1\relax{(tabu) minrowclearance #1 = \x{####1}^^J}% - \def\tabu@arc@L ####1{(tabu) taburulecolor #1 #1 = ####1^^J}% - \def\tabu@drsc@L ####1{(tabu) tabudoublerulecolor= ####1^^J}% - \def\tabu@evr@L ####1{(tabu) everyrow #1 #1 #1 #1 = \detokenize{####1}^^J}% - \def\tabu@ls@L ####1{(tabu) line style = \detokenize{####1}^^J}% - \def\NC@find ####1\@nil{(tabu) tabu preamble#1 #1 = \detokenize{####1}^^J}% - \def\tabu@wddef####1####2{(tabu) Natural width ####1 = \x{####2}^^J}% - \let\edef \@gobbletwo \let\def \@empty \let\let \@gobbletwo - \tabu@message{% - (tabu) \string\savetabu{\tabu@temp}: \on@line^^J% - \tabu@usetabu \@nil^^J}% - \endgroup} -}\do{ } -%% Measuring the natural width (varwidth) - store the results ------- -\def\tabu@startpboxmeasure #1{\bgroup % entering \vtop - \edef\tabu@temp{\expandafter\@secondoftwo \ifx\tabu@hsize #1\else\relax\fi}% - \ifodd 1\ifx \tabu@temp\@empty 0 \else % starts with \tabu@hsize ? - \iftabu@spread \else % if spread -> measure - \ifdim \tabu@temp\p@>\z@ 0 \fi\fi\fi% if coef>0 -> do not measure - \let\@startpbox \tabu@startpboxORI % restore immediately (nesting) - \tabu@measuringtrue % for the quick option... - \tabu@Xcol =\expandafter\@firstoftwo\ifx\tabu@hsize #1\fi - \ifdim \tabu@temp\p@>\z@ \ifdim \tabu@temp\tabucolX<\tabu@target - \tabu@target=\tabu@temp\tabucolX \fi\fi - \setbox\tabu@box \hbox \bgroup - \begin{varwidth}\tabu@target - \let\FV@ListProcessLine \tabu@FV@ListProcessLine % \hbox to natural width... - \narrowragged \arraybackslash \parfillskip \@flushglue - \ifdefined\pdfadjustspacing \pdfadjustspacing\z@ \fi - \bgroup \aftergroup\tabu@endpboxmeasure - \ifdefined \cellspacetoplimit \tabu@cellspacepatch \fi - \else \expandafter\@gobble - \tabu@startpboxquick{#1}% \@gobble \bgroup - \fi -}% \tabu@startpboxmeasure -\def\tabu@cellspacepatch{\def\bcolumn##1\@nil{}\let\ecolumn\@empty - \bgroup\color@begingroup} -\def\tabu@endpboxmeasure {% - \@finalstrut \@arstrutbox - \end{varwidth}\egroup % - \ifdim \tabu@temp\p@ <\z@ % neg coef - \ifdim \tabu@wd\tabu@Xcol <\wd\tabu@box - \tabu@wddef\tabu@Xcol {\the\wd\tabu@box}% - \tabu@debug{\tabu@message@endpboxmeasure}% - \fi - \else % spread coef>0 - \global\advance \tabu@naturalX \wd\tabu@box - \@tempdima =\dimexpr \wd\tabu@box *\p@/\dimexpr \tabu@temp\p@\relax \relax - \ifdim \tabu@naturalXmax <\tabu@naturalX - \xdef\tabu@naturalXmax {\the\tabu@naturalX}\fi - \ifdim \tabu@naturalXmin <\@tempdima - \xdef\tabu@naturalXmin {\the\@tempdima}\fi - \fi - \box\tabu@box \egroup % end of \vtop (measure) restore \tabu@target -}% \tabu@endpboxmeasure -\def\tabu@wddef #1{\expandafter\xdef - \csname tabu@\the\tabu@nested.W\number#1\endcsname} -\def\tabu@wd #1{\csname tabu@\the\tabu@nested.W\number#1\endcsname} -\def\tabu@message@endpboxmeasure{\tabu@spaces\tabu@spaces<-> % <-> save natural wd - \the\tabu@Xcol. X[\tabu@temp]: - target = \the\tabucolX \space - \expandafter\expandafter\expandafter\string\tabu@wd\tabu@Xcol - =\tabu@wd\tabu@Xcol -}% \tabu@message@endpboxmeasure -\def\tabu@startpboxquick {\bgroup - \let\@startpbox \tabu@startpboxORI % restore immediately - \let\tabu \tabu@quick % \begin is expanded before... - \expandafter\@gobble \@startpbox % gobbles \bgroup -}% \tabu@startpboxquick -\def\tabu@quick {\begingroup \iffalse{\fi \ifnum0=`}\fi - \toks@{}\def\tabu@stack{b}\tabu@collectbody \tabu@endquick -}% \tabu@quick -\def\tabu@endquick {% - \ifodd 1\ifx\tabu@end@envir\tabu@endtabu \else - \ifx\tabu@end@envir\tabu@endtabus \else 0\fi\fi\relax - \endgroup - \else \let\endtabu \relax - \tabu@end@envir - \fi -}% \tabu@quick -\def\tabu@endtabu {\end{tabu}} -\def\tabu@endtabus {\end{tabu*}} -%% Measuring the heights and depths - store the results ------------- -\def\tabu@verticalmeasure{\everypar{}% - \ifnum \currentgrouptype>12 % 14=semi-simple, 15=math shift group - \setbox\tabu@box =\hbox\bgroup - \let\tabu@verticalspacing \tabu@verticalsp@lcr - \d@llarbegin % after \hbox ... - \else - \edef\tabu@temp{\ifnum\currentgrouptype=5\vtop - \else\ifnum\currentgrouptype=12\vcenter - \else\vbox\fi\fi}% - \setbox\tabu@box \hbox\bgroup$\tabu@temp \bgroup - \let\tabu@verticalspacing \tabu@verticalsp@pmb - \fi -}% \tabu@verticalmeasure -\def\tabu@verticalsp@lcr{% - \d@llarend \egroup % - \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep - \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax - \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi - \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi - \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi - \noindent\vrule height\@tempdima depth\@tempdimb -}% \tabu@verticalsp@lcr -\def\tabu@verticalsp@pmb{% inserts struts as needed - \par \expandafter\egroup - \expandafter$\expandafter - \egroup \expandafter - \@tempdimc \the\prevdepth - \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep - \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax - \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi - \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi - \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi - \let\@finalstrut \@gobble - \hrule height\@tempdima depth\@tempdimb width\hsize -%% \box\tabu@box -}% \tabu@verticalsp@pmb - -\def\tabu@verticalinit{% - \ifnum \c@taburow=\z@ \tabu@rearstrut \fi % after \tabu@reset ! - \advance\c@taburow \@ne - \tabu@htdef{\the\ht\@arstrutbox}\tabu@dpdef{\the\dp\@arstrutbox}% - \advance\c@taburow \m@ne -}% \tabu@verticalinit -\def\tabu@htdef {\expandafter\xdef \csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname} -\def\tabu@ht {\csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname} -\def\tabu@dpdef {\expandafter\xdef \csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname} -\def\tabu@dp {\csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname} -\def\tabu@verticaldynamicadjustment {% - \advance\c@taburow \@ne - \extrarowheight \dimexpr\tabu@ht - \ht\strutbox - \extrarowdepth \dimexpr\tabu@dp - \dp\strutbox - \let\arraystretch \@empty - \advance\c@taburow \m@ne -}% \tabu@verticaldynamicadjustment -\def\tabuphantomline{\crcr \noalign{% - {\globaldefs \@ne - \setbox\@arstrutbox \box\voidb@x - \let\tabu@@celllalign \tabu@celllalign - \let\tabu@@cellralign \tabu@cellralign - \let\tabu@@cellleft \tabu@cellleft - \let\tabu@@cellright \tabu@cellright - \let\tabu@@thevline \tabu@thevline - \let\tabu@celllalign \@empty - \let\tabu@cellralign \@empty - \let\tabu@cellright \@empty - \let\tabu@cellleft \@empty - \let\tabu@thevline \relax}% - \edef\tabu@temp{\tabu@multispan \tabu@nbcols{\noindent &}}% - \toks@\expandafter{\tabu@temp \noindent\tabu@everyrowfalse \cr - \noalign{\tabu@rearstrut - {\globaldefs\@ne - \let\tabu@celllalign \tabu@@celllalign - \let\tabu@cellralign \tabu@@cellralign - \let\tabu@cellleft \tabu@@cellleft - \let\tabu@cellright \tabu@@cellright - \let\tabu@thevline \tabu@@thevline}}}% - \expandafter}\the\toks@ -}% \tabuphantomline -%% \firsthline and \lasthline corrections --------------------------- -\def\tabu@firstline {\tabu@hlineAZ \tabu@firsthlinecorrection {}} -\def\tabu@firsthline{\tabu@hlineAZ \tabu@firsthlinecorrection \hline} -\def\tabu@lastline {\tabu@hlineAZ \tabu@lasthlinecorrection {}} -\def\tabu@lasthline {\tabu@hlineAZ \tabu@lasthlinecorrection \hline} -\def\tabu@hline {% replaces \hline if no colortbl (see \AtBeginDocument) - \noalign{\ifnum0=`}\fi - {\CT@arc@\hrule height\arrayrulewidth}% - \futurelet \tabu@temp \tabu@xhline -}% \tabu@hline -\def\tabu@xhline{% - \ifx \tabu@temp \hline - {\ifx \CT@drsc@\relax \vskip - \else\ifx \CT@drsc@\@empty \vskip - \else \CT@drsc@\hrule height - \fi\fi - \doublerulesep}% - \fi - \ifnum0=`{\fi}% -}% \tabu@xhline -\def\tabu@hlineAZ #1#2{\noalign{\ifnum0=`}\fi \dimen@ \z@ \count@ \z@ - \toks@{}\def\tabu@hlinecorrection{#1}\def\tabu@temp{#2}% - \tabu@hlineAZsurround -}% \tabu@hlineAZ -\newcommand*\tabu@hlineAZsurround[1][\extratabsurround]{% - \extratabsurround #1\let\tabucline \tabucline@scan - \let\hline \tabu@hlinescan \let\firsthline \hline - \let\cline \tabu@clinescan \let\lasthline \hline - \expandafter \futurelet \expandafter \tabu@temp - \expandafter \tabu@nexthlineAZ \tabu@temp -}% \tabu@hlineAZsurround -\def\tabu@hlinescan {\tabu@thick \arrayrulewidth \tabu@xhlineAZ \hline} -\def\tabu@clinescan #1{\tabu@thick \arrayrulewidth \tabu@xhlineAZ {\cline{#1}}} -\def\tabucline@scan{\@testopt \tabucline@sc@n {}} -\def\tabucline@sc@n #1[#2]{\tabu@xhlineAZ {\tabucline[{#1}]{#2}}} -\def\tabu@nexthlineAZ{% - \ifx \tabu@temp\hline \else - \ifx \tabu@temp\cline \else - \ifx \tabu@temp\tabucline \else - \tabu@hlinecorrection - \fi\fi\fi -}% \tabu@nexthlineAZ -\def\tabu@xhlineAZ #1{% - \toks@\expandafter{\the\toks@ #1}% - \@tempdimc \tabu@thick % The last line width - \ifcase\count@ \@tempdimb \tabu@thick % The first line width - \else \advance\dimen@ \dimexpr \tabu@thick+\doublerulesep \relax - \fi - \advance\count@ \@ne \futurelet \tabu@temp \tabu@nexthlineAZ -}% \tabu@xhlineAZ -\def\tabu@firsthlinecorrection{% \count@ = number of \hline -1 - \@tempdima \dimexpr \ht\@arstrutbox+\dimen@ - \edef\firsthline{% - \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule - height \the\dimexpr\@tempdima+\extratabsurround - depth \dp\@arstrutbox - width \tabustrutrule}\hss}\cr - \noalign{\vskip -\the\dimexpr \@tempdima+\@tempdimb - +\dp\@arstrutbox \relax}% - \the\toks@ - }\ifnum0=`{\fi - \expandafter}\firsthline % we are then ! -}% \tabu@firsthlinecorrection -\def\tabu@lasthlinecorrection{% - \@tempdima \dimexpr \dp\@arstrutbox+\dimen@+\@tempdimb+\@tempdimc - \edef\lasthline{% - \the\toks@ - \noalign{\vskip -\the\dimexpr\dimen@+\@tempdimb+\dp\@arstrutbox}% - \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule - depth \the\dimexpr \dp\@arstrutbox+\@tempdimb+\dimen@ - +\extratabsurround-\@tempdimc - height \z@ - width \tabustrutrule}\hss}\cr - }\ifnum0=`{\fi - \expandafter}\lasthline % we are then ! -}% \tabu@lasthlinecorrection -\def\tabu@LT@@hline{% - \ifx\LT@next\hline - \global\let\LT@next \@gobble - \ifx \CT@drsc@\relax - \gdef\CT@LT@sep{% - \noalign{\penalty-\@medpenalty\vskip\doublerulesep}}% - \else - \gdef\CT@LT@sep{% - \multispan\LT@cols{% - \CT@drsc@\leaders\hrule\@height\doublerulesep\hfill}\cr}% - \fi - \else - \global\let\LT@next\empty - \gdef\CT@LT@sep{% - \noalign{\penalty-\@lowpenalty\vskip-\arrayrulewidth}}% - \fi - \ifnum0=`{\fi}% - \multispan\LT@cols - {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr - \CT@LT@sep - \multispan\LT@cols - {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr - \noalign{\penalty\@M}% - \LT@next -}% \tabu@LT@@hline -%% Horizontal lines : \tabucline ------------------------------------ -\let\tabu@start \@tempcnta -\let\tabu@stop \@tempcntb -\newcommand*\tabucline{\noalign{\ifnum0=`}\fi \tabu@cline} -\newcommand*\tabu@cline[2][]{\tabu@startstop{#2}% - \ifnum \tabu@stop<\z@ \toks@{}% - \else \tabu@clinearg{#1}\tabu@thestyle - \edef\tabucline{\toks@{% - \ifnum \tabu@start>\z@ \omit - \tabu@multispan\tabu@start {\span\omit}&\fi - \omit \tabu@multispan\tabu@stop {\span\omit}% - \tabu@thehline\cr - }}\tabucline - \tabu@tracinglines{(tabu:tabucline) Style: #1^^J\the\toks@^^J^^J}% - \fi - \futurelet \tabu@temp \tabu@xcline -}% \tabu@cline -\def\tabu@clinearg #1{% - \ifx\\#1\\\let\tabu@thestyle \tabu@ls@ - \else \@defaultunits \expandafter\let\expandafter\@tempa - \romannumeral-`\0#1\relax \@nnil - \ifx \hbox\@tempa \tabu@clinebox{#1}% - \else\ifx \box\@tempa \tabu@clinebox{#1}% - \else\ifx \vbox\@tempa \tabu@clinebox{#1}% - \else\ifx \vtop\@tempa \tabu@clinebox{#1}% - \else\ifx \copy\@tempa \tabu@clinebox{#1}% - \else\ifx \leaders\@tempa \tabu@clineleads{#1}% - \else\ifx \cleaders\@tempa \tabu@clineleads{#1}% - \else\ifx \xleaders\@tempa \tabu@clineleads{#1}% - \else\tabu@getline {#1}% - \fi\fi\fi\fi\fi\fi\fi\fi - \fi -}% \tabu@clinearg -\def\tabu@clinebox #1{\tabu@clineleads{\xleaders#1\hss}} -\def\tabu@clineleads #1{% - \let\tabu@thestyle \relax \let\tabu@leaders \@undefined - \gdef\tabu@thehrule{#1}} -\def\tabu@thehline{\begingroup - \ifdefined\tabu@leaders - \noexpand\tabu@thehleaders - \else \noexpand\tabu@thehrule - \fi \endgroup -}% \tabu@thehline -\def\tabu@xcline{% - \ifx \tabu@temp\tabucline - \toks@\expandafter{\the\toks@ \noalign - {\ifx\CT@drsc@\relax \vskip - \else \CT@drsc@\hrule height - \fi - \doublerulesep}}% - \fi - \tabu@docline -}% \tabu@xcline -\def\tabu@docline {\ifnum0=`{\fi \expandafter}\the\toks@} -\def\tabu@docline@evr {\xdef\tabu@doclineafter{\the\toks@}% - \ifnum0=`{\fi}\aftergroup\tabu@doclineafter} -\def\tabu@multispan #1#2{% - \ifnum\numexpr#1>\@ne #2\expandafter\tabu@multispan - \else \expandafter\@gobbletwo - \fi {#1-1}{#2}% -}% \tabu@multispan -\def\tabu@startstop #1{\tabu@start@stop #1\relax 1-\tabu@nbcols \@nnil} -\def\tabu@start@stop #1-#2\@nnil{% - \@defaultunits \tabu@start\number 0#1\relax \@nnil - \@defaultunits \tabu@stop \number 0#2\relax \@nnil - \tabu@stop \ifnum \tabu@start>\tabu@nbcols \m@ne - \else\ifnum \tabu@stop=\z@ \tabu@nbcols - \else\ifnum \tabu@stop>\tabu@nbcols \tabu@nbcols - \else \tabu@stop - \fi\fi\fi - \advance\tabu@start \m@ne - \ifnum \tabu@start>\z@ \advance\tabu@stop -\tabu@start \fi -}% \tabu@start@stop -%% Numbers: siunitx S columns (and \tabudecimal) ------------------- -\def\tabu@tabudecimal #1{% - \def\tabu@decimal{#1}\@temptokena{}% - \let\tabu@getdecimal@ \tabu@getdecimal@ignorespaces - \tabu@scandecimal -}% \tabu@tabudecimal -\def\tabu@scandecimal{\futurelet \tabu@temp \tabu@getdecimal@} -\def\tabu@skipdecimal#1{#1\tabu@scandecimal} -\def\tabu@getdecimal@ignorespaces{% - \ifcase 0\ifx\tabu@temp\ignorespaces\else - \ifx\tabu@temp\@sptoken1\else - 2\fi\fi\relax - \let\tabu@getdecimal@ \tabu@getdecimal - \expandafter\tabu@skipdecimal - \or \expandafter\tabu@gobblespace\expandafter\tabu@scandecimal - \else \expandafter\tabu@skipdecimal - \fi -}% \tabu@getdecimal@ignorespaces -\def\tabu@get@decimal#1{\@temptokena\expandafter{\the\@temptokena #1}% - \tabu@scandecimal} -\def\do#1{% - \def\tabu@get@decimalspace#1{% - \@temptokena\expandafter{\the\@temptokena #1}\tabu@scandecimal}% -}\do{ } -\let\tabu@@tabudecimal \tabu@tabudecimal -\def\tabu@getdecimal{% - \ifcase 0\ifx 0\tabu@temp\else - \ifx 1\tabu@temp\else - \ifx 2\tabu@temp\else - \ifx 3\tabu@temp\else - \ifx 4\tabu@temp\else - \ifx 5\tabu@temp\else - \ifx 6\tabu@temp\else - \ifx 7\tabu@temp\else - \ifx 8\tabu@temp\else - \ifx 9\tabu@temp\else - \ifx .\tabu@temp\else - \ifx ,\tabu@temp\else - \ifx -\tabu@temp\else - \ifx +\tabu@temp\else - \ifx e\tabu@temp\else - \ifx E\tabu@temp\else - \ifx\tabu@cellleft\tabu@temp1\else - \ifx\ignorespaces\tabu@temp1\else - \ifx\@sptoken\tabu@temp2\else - 3\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax - \expandafter\tabu@get@decimal - \or \expandafter\tabu@skipdecimal - \or \expandafter\tabu@get@decimalspace - \else\expandafter\tabu@printdecimal - \fi -}% \tabu@getdecimal -\def\tabu@printdecimal{% - \edef\tabu@temp{\the\@temptokena}% - \ifx\tabu@temp\@empty\else - \ifx\tabu@temp\space\else - \expandafter\tabu@decimal\expandafter{\the\@temptokena}% - \fi\fi -}% \tabu@printdecimal -%% Verbatim inside X columns ---------------------------------------- -\def\tabu@verbatim{% - \let\verb \tabu@verb - \let\FV@DefineCheckEnd \tabu@FV@DefineCheckEnd -}% \tabu@verbatim -\let\tabu@ltx@verb \verb -\def\tabu@verb{\@ifstar {\tabu@ltx@verb*} \tabu@ltx@verb} -\def\tabu@fancyvrb {% - \def\tabu@FV@DefineCheckEnd ##1{% - \def\tabu@FV@DefineCheckEnd{% - ##1% - \let\FV@CheckEnd \tabu@FV@CheckEnd - \let\FV@@CheckEnd \tabu@FV@@CheckEnd - \let\FV@@@CheckEnd \tabu@FV@@@CheckEnd - \edef\FV@EndScanning{% - \def\noexpand\next{\noexpand\end{\FV@EnvironName}}% - \global\let\noexpand\FV@EnvironName\relax - \noexpand\next}% - \xdef\FV@EnvironName{\detokenize\expandafter{\FV@EnvironName}}}% - }\expandafter\tabu@FV@DefineCheckEnd\expandafter{\FV@DefineCheckEnd} -}% \tabu@fancyvrb -\def\tabu@FV@CheckEnd #1{\expandafter\FV@@CheckEnd \detokenize{#1\end{}}\@nil} -\edef\tabu@FV@@@CheckEnd {\detokenize{\end{}}} -\begingroup -\catcode`\[1 \catcode`\]2 -\@makeother\{ \@makeother\} - \edef\x[\endgroup - \def\noexpand\tabu@FV@@CheckEnd ##1\detokenize[\end{]##2\detokenize[}]##3% - ]\x \@nil{\def\@tempa{#2}\def\@tempb{#3}} -\def\tabu@FV@ListProcessLine #1{% - \hbox {%to \hsize{% - \kern\leftmargin - \hbox {%to \linewidth{% - \FV@LeftListNumber - \FV@LeftListFrame - \FancyVerbFormatLine{#1}\hss -%% DG/SR modification begin - Jan. 28, 1998 (for numbers=right add-on) -%% \FV@RightListFrame}% - \FV@RightListFrame - \FV@RightListNumber}% -%% DG/SR modification end - \hss}} -%% \savetabu -------------------------------------------------------- -\newcommand*\savetabu[1]{\noalign{% - \tabu@sanitizearg{#1}\tabu@temp - \ifx \tabu@temp\@empty \tabu@savewarn{}{The tabu will not be saved}\else - \@ifundefined{tabu@saved@\tabu@temp}{}{\tabu@savewarn{#1}{Overwriting}}% - \ifdefined\tabu@restored \expandafter\let - \csname tabu@saved@\tabu@temp \endcsname \tabu@restored - \else {\tabu@save}% - \fi - \fi}% -}% \savetabu -\def\tabu@save {% - \toks0\expandafter{\tabu@saved@}% - \iftabu@negcoef - \let\tabu@wddef \relax \let\tabu@ \tabu@savewd \edef\tabu@savewd{\tabu@Xcoefs}% - \toks0\expandafter{\the\toks\expandafter0\tabu@savewd}\fi - \toks1\expandafter{\tabu@savedpream}% - \toks2\expandafter{\tabu@savedpreamble}% - \let\@preamble \relax - \let\tabu@savedpream \relax \let\tabu@savedparams \relax - \edef\tabu@preamble{% - \def\noexpand\tabu@aligndefault{\tabu@align}% - \def\tabu@savedparams {\noexpand\the\toks0}% - \def\tabu@savedpream {\noexpand\the\toks1}}% - \edef\tabu@usetabu{% - \def\@preamble {\noexpand\the\toks2}% - \tabu@target \the\tabu@target \relax - \tabucolX \the\tabucolX \relax - \tabu@nbcols \the\tabu@nbcols \relax - \def\noexpand\tabu@aligndefault{\tabu@align}% - \def\tabu@savedparams {\noexpand\the\toks0}% - \def\tabu@savedpream {\noexpand\the\toks1}}% - \let\tabu@aligndefault \relax \let\@sharp \relax - \edef\@tempa{\noexpand\tabu@s@ved - {\tabu@usetabu} - {\tabu@preamble} - {\the\toks1}}\@tempa - \tabu@message@save -}% \tabu@save -\long\def\tabu@s@ved #1#2#3{% - \def\tabu@usetabu{#1}% - \expandafter\gdef\csname tabu@saved@\tabu@temp\endcsname ##1{% - \ifodd ##1% \usetabu - \tabu@measuringfalse \tabu@spreadfalse % Just in case... - \gdef\tabu@usetabu {% - \ifdim \tabu@target>\z@ \tabu@warn@usetabu \fi - \global\let\tabu@usetabu \@undefined - \def\@halignto {to\tabu@target}% - #1% - \ifx \tabu@align\tabu@aligndefault@text - \ifnum \tabu@nested=\z@ - \let\tabu@align \tabu@aligndefault \fi\fi}% - \else % \preamble - \gdef\tabu@preamble {% - \global\let\tabu@preamble \@undefined - #2% - \ifx \tabu@align\tabu@aligndefault@text - \ifnum \tabu@nested=\z@ - \let\tabu@align \tabu@aligndefault \fi\fi}% - \fi - #3}% -}% \tabu@s@ved -\def\tabu@aligndefault@text {\tabu@aligndefault}% -\def\tabu@warn@usetabu {\PackageWarning{tabu} - {Specifying a target with \string\usetabu\space is useless - \MessageBreak The target cannot be changed!}} -\def\tabu@savewd #1#2{\ifdim #2\p@<\z@ \tabu@wddef{#1}{\tabu@wd{#1}}\fi} -\def\tabu@savewarn#1#2{\PackageInfo{tabu} - {User-name `#1' already used for \string\savetabu - \MessageBreak #2}}% -\def\tabu@saveerr#1{\PackageError{tabu} - {User-name `#1' is unknown for \string\usetabu - \MessageBreak I cannot restore an unknown preamble!}\@ehd} -%% \rowfont --------------------------------------------------------- -\newskip \tabu@cellskip -\def\tabu@rowfont{\ifdim \baselineskip=\z@\noalign\fi - {\ifnum0=`}\fi \tabu@row@font} -\newcommand*\tabu@row@font[2][]{% - \ifnum7=\currentgrouptype - \global\let\tabu@@cellleft \tabu@cellleft - \global\let\tabu@@cellright \tabu@cellright - \global\let\tabu@@celllalign \tabu@celllalign - \global\let\tabu@@cellralign \tabu@cellralign - \global\let\tabu@@rowfontreset\tabu@rowfontreset - \fi - \global\let\tabu@rowfontreset \tabu@rowfont@reset - \expandafter\gdef\expandafter\tabu@cellleft\expandafter{\tabu@cellleft #2}% - \ifcsname tabu@cell@#1\endcsname % row alignment - \csname tabu@cell@#1\endcsname \fi - \ifnum0=`{\fi}% end of group / noalign group -}% \rowfont -\def\tabu@ifcolorleavevmode #1{\let\color \tabu@leavevmodecolor #1\let\color\tabu@color}% -\def\tabu@rowfont@reset{% - \global\let\tabu@rowfontreset \tabu@@rowfontreset - \global\let\tabu@cellleft \tabu@@cellleft - \global\let\tabu@cellright \tabu@@cellright - \global\let\tabu@cellfont \@empty - \global\let\tabu@celllalign \tabu@@celllalign - \global\let\tabu@cellralign \tabu@@cellralign -}% \tabu@@rowfontreset -\let\tabu@rowfontreset \@empty % overwritten \AtBeginDocument if colortbl -%% \tabu@prepnext@tok ----------------------------------------------- -\newif \iftabu@cellright -\def\tabu@prepnext@tok{% - \ifnum \count@<\z@ % - \@tempcnta \@M % - \tabu@nbcols\z@ - \let\tabu@fornoopORI \@fornoop - \tabu@cellrightfalse - \else - \ifcase \numexpr \count@-\@tempcnta \relax % (case 0): prev. token is left - \advance \tabu@nbcols \@ne - \iftabu@cellright % before-previous token is right and is finished - \tabu@cellrightfalse % - \tabu@righttok - \fi - \tabu@lefttok - \or % (case 1) previous token is right - \tabu@cellrighttrue \let\@fornoop \tabu@lastnoop - \else % special column: do not change the token - \iftabu@cellright % before-previous token is right - \tabu@cellrightfalse - \tabu@righttok - \fi - \fi % \ifcase - \fi - \tabu@prepnext@tokORI -}% \tabu@prepnext@tok -\long\def\tabu@lastnoop#1\@@#2#3{\tabu@lastn@@p #2\@nextchar \in@\in@@} -\def\tabu@lastn@@p #1\@nextchar #2#3\in@@{% - \ifx \in@#2\else - \let\@fornoop \tabu@fornoopORI - \xdef\tabu@mkpreambuffer{\tabu@nbcols\the\tabu@nbcols \tabu@mkpreambuffer}% - \toks0\expandafter{\expandafter\tabu@everyrowtrue \the\toks0}% - \expandafter\prepnext@tok - \fi -}% \tabu@lastnoop -\def\tabu@righttok{% - \advance \count@ \m@ne - \toks\count@\expandafter {\the\toks\count@ \tabu@cellright \tabu@cellralign}% - \advance \count@ \@ne -}% \tabu@righttok -\def\tabu@lefttok{\toks\count@\expandafter{\expandafter\tabu@celllalign - \the\toks\count@ \tabu@cellleft}% after because of $ -}% \tabu@lefttok -%% Neutralisation of glues ------------------------------------------ -\let\tabu@cellleft \@empty -\let\tabu@cellright \@empty -\tabu@celllalign@def{\tabu@cellleft}% -\let\tabu@cellralign \@empty -\def\tabu@cell@align #1#2#3{% - \let\tabu@maybesiunitx \toks@ \tabu@celllalign - \global \expandafter \tabu@celllalign@def \expandafter {\the\toks@ #1}% - \toks@\expandafter{\tabu@cellralign #2}% - \xdef\tabu@cellralign{\the\toks@}% - \toks@\expandafter{\tabu@cellleft #3}% - \xdef\tabu@cellleft{\the\toks@}% -}% \tabu@cell@align -\def\tabu@cell@l{% force alignment to left - \tabu@cell@align - {\tabu@removehfil \raggedright \tabu@cellleft}% left - {\tabu@flush1\tabu@ignorehfil}% right - \raggedright -}% \tabu@cell@l -\def\tabu@cell@c{% force alignment to center - \tabu@cell@align - {\tabu@removehfil \centering \tabu@flush{.5}\tabu@cellleft} - {\tabu@flush{.5}\tabu@ignorehfil} - \centering -}% \tabu@cell@c -\def\tabu@cell@r{% force alignment to right - \tabu@cell@align - {\tabu@removehfil \raggedleft \tabu@flush1\tabu@cellleft} - \tabu@ignorehfil - \raggedleft -}% \tabu@cell@r -\def\tabu@cell@j{% force justification (for p, m, b columns) - \tabu@cell@align - {\tabu@justify\tabu@cellleft} - {} - \tabu@justify -}% \tabu@cell@j -\def\tabu@justify{% - \leftskip\z@skip \@rightskip\leftskip \rightskip\@rightskip - \parfillskip\@flushglue -}% \tabu@justify -%% ragged2e settings -\def\tabu@cell@L{% force alignment to left (ragged2e) - \tabu@cell@align - {\tabu@removehfil \RaggedRight \tabu@cellleft} - {\tabu@flush 1\tabu@ignorehfil} - \RaggedRight -}% \tabu@cell@L -\def\tabu@cell@C{% force alignment to center (ragged2e) - \tabu@cell@align - {\tabu@removehfil \Centering \tabu@flush{.5}\tabu@cellleft} - {\tabu@flush{.5}\tabu@ignorehfil} - \Centering -}% \tabu@cell@C -\def\tabu@cell@R{% force alignment to right (ragged2e) - \tabu@cell@align - {\tabu@removehfil \RaggedLeft \tabu@flush 1\tabu@cellleft} - \tabu@ignorehfil - \RaggedLeft -}% \tabu@cell@R -\def\tabu@cell@J{% force justification (ragged2e) - \tabu@cell@align - {\justifying \tabu@cellleft} - {} - \justifying -}% \tabu@cell@J -\def\tabu@flush#1{% - \iftabu@colortbl % colortbl uses \hfill rather than \hfil - \hskip \ifnum13<\currentgrouptype \stretch{#1}% - \else \ifdim#1pt<\p@ \tabu@cellskip - \else \stretch{#1} - \fi\fi \relax - \else % array.sty - \ifnum 13<\currentgrouptype - \hfil \hskip1sp \relax \fi - \fi -}% \tabu@flush -\let\tabu@hfil \hfil -\let\tabu@hfill \hfill -\let\tabu@hskip \hskip -\def\tabu@removehfil{% - \iftabu@colortbl - \unkern \tabu@cellskip =\lastskip - \ifnum\gluestretchorder\tabu@cellskip =\tw@ \hskip-\tabu@cellskip - \else \tabu@cellskip \z@skip - \fi - \else - \ifdim\lastskip=1sp\unskip\fi - \ifnum\gluestretchorder\lastskip =\@ne - \hfilneg % \hfilneg for array.sty but not for colortbl... - \fi - \fi -}% \tabu@removehfil -\def\tabu@ignorehfil{\aftergroup \tabu@nohfil} -\def\tabu@nohfil{% \hfil -> do nothing + restore original \hfil - \def\hfil{\let\hfil \tabu@hfil}% local to (alignment template) group -}% \tabu@nohfil -\def\tabu@colortblalignments {% if colortbl - \def\tabu@nohfil{% - \def\hfil {\let\hfil \tabu@hfil}% local to (alignment template) group - \def\hfill {\let\hfill \tabu@hfill}% (colortbl uses \hfill) pfff... - \def\hskip ####1\relax{\let\hskip \tabu@hskip}}% local -}% \tabu@colortblalignments -%% Taking care of footnotes and hyperfootnotes ---------------------- -\long\def\tabu@footnotetext #1{% - \edef\@tempa{\the\tabu@footnotes - \noexpand\footnotetext [\the\csname c@\@mpfn\endcsname]}% - \global\tabu@footnotes\expandafter{\@tempa {#1}}}% -\long\def\tabu@xfootnotetext [#1]#2{% - \global\tabu@footnotes\expandafter{\the\tabu@footnotes - \footnotetext [{#1}]{#2}}} -\let\tabu@xfootnote \@xfootnote -\long\def\tabu@Hy@ftntext{\tabu@Hy@ftntxt {\the \c@footnote }} -\long\def\tabu@Hy@xfootnote [#1]{% - \begingroup - \value\@mpfn #1\relax - \protected@xdef \@thefnmark {\thempfn}% - \endgroup - \@footnotemark \tabu@Hy@ftntxt {#1}% -}% \tabu@Hy@xfootnote -\long\def\tabu@Hy@ftntxt #1#2{% - \edef\@tempa{% - \the\tabu@footnotes - \begingroup - \value\@mpfn #1\relax - \noexpand\protected@xdef\noexpand\@thefnmark {\noexpand\thempfn}% - \expandafter \noexpand \expandafter - \tabu@Hy@footnotetext \expandafter{\Hy@footnote@currentHref}% - }% - \global\tabu@footnotes\expandafter{\@tempa {#2}% - \endgroup}% -}% \tabu@Hy@ftntxt -\long\def\tabu@Hy@footnotetext #1#2{% - \H@@footnotetext{% - \ifHy@nesting - \hyper@@anchor {#1}{#2}% - \else - \Hy@raisedlink{% - \hyper@@anchor {#1}{\relax}% - }% - \def\@currentHref {#1}% - \let\@currentlabelname \@empty - #2% - \fi - }% -}% \tabu@Hy@footnotetext -%% No need for \arraybackslash ! ------------------------------------ -\def\tabu@latextwoe {% -\def\tabu@temp##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}} -\tabu@temp \tabu@centering \centering \arraybackslash -\tabu@temp \tabu@raggedleft \raggedleft \arraybackslash -\tabu@temp \tabu@raggedright \raggedright \arraybackslash -}% \tabu@latextwoe -\def\tabu@raggedtwoe {% -\def\tabu@temp ##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}} -\tabu@temp \tabu@Centering \Centering \arraybackslash -\tabu@temp \tabu@RaggedLeft \RaggedLeft \arraybackslash -\tabu@temp \tabu@RaggedRight \RaggedRight \arraybackslash -\tabu@temp \tabu@justifying \justifying \arraybackslash -}% \tabu@raggedtwoe -\def\tabu@normalcrbackslash{\let\\\@normalcr} -\def\tabu@trivlist{\expandafter\def\expandafter\@trivlist\expandafter{% - \expandafter\tabu@normalcrbackslash \@trivlist}} -%% Utilities: \fbox \fcolorbox and \tabudecimal ------------------- -\def\tabu@fbox {\leavevmode\afterassignment\tabu@beginfbox \setbox\@tempboxa\hbox} -\def\tabu@beginfbox {\bgroup \kern\fboxsep - \bgroup\aftergroup\tabu@endfbox} -\def\tabu@endfbox {\kern\fboxsep\egroup\egroup - \@frameb@x\relax} -\def\tabu@color@b@x #1#2{\leavevmode \bgroup - \def\tabu@docolor@b@x{#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@}}% - \afterassignment\tabu@begincolor@b@x \setbox\z@ \hbox -}% \tabu@color@b@x -\def\tabu@begincolor@b@x {\kern\fboxsep \bgroup - \aftergroup\tabu@endcolor@b@x \set@color} -\def\tabu@endcolor@b@x {\kern\fboxsep \egroup - \dimen@\ht\z@ \advance\dimen@ \fboxsep \ht\z@ \dimen@ - \dimen@\dp\z@ \advance\dimen@ \fboxsep \dp\z@ \dimen@ - \tabu@docolor@b@x \egroup -}% \tabu@endcolor@b@x -%% Corrections (arydshln, delarray, colortbl) ----------------------- -\def\tabu@fix@arrayright {%% \@arrayright is missing from \endarray - \iftabu@colortbl - \ifdefined\adl@array % - \def\tabu@endarray{% - \adl@endarray \egroup \adl@arrayrestore \CT@end \egroup % - \@arrayright % - \gdef\@preamble{}}% - \else % - \def\tabu@endarray{% - \crcr \egroup \egroup % - \@arrayright % - \gdef\@preamble{}\CT@end}% - \fi - \else - \ifdefined\adl@array % - \def\tabu@endarray{% - \adl@endarray \egroup \adl@arrayrestore \egroup % - \@arrayright % - \gdef\@preamble{}}% - \else % - \PackageWarning{tabu} - {\string\@arrayright\space is missing from the - \MessageBreak definition of \string\endarray. - \MessageBreak Compatibility with delarray.sty is broken.}% - \fi\fi -}% \tabu@fix@arrayright -\def\tabu@adl@xarraydashrule #1#2#3{% - \ifnum\@lastchclass=\adl@class@start\else - \ifnum\@lastchclass=\@ne\else - \ifnum\@lastchclass=5 \else % @-arg (class 5) and !-arg (class 1) - \adl@leftrulefalse \fi\fi % must be treated the same - \fi - \ifadl@zwvrule\else \ifadl@inactive\else - \@addtopreamble{\vrule\@width\arrayrulewidth - \@height\z@ \@depth\z@}\fi \fi - \ifadl@leftrule - \@addtopreamble{\adl@vlineL{\CT@arc@}{\adl@dashgapcolor}% - {\number#1}#3}% - \else \@addtopreamble{\adl@vlineR{\CT@arc@}{\adl@dashgapcolor}% - {\number#2}#3} - \fi -}% \tabu@adl@xarraydashrule -\def\tabu@adl@act@endpbox {% - \unskip \ifhmode \nobreak \fi \@finalstrut \@arstrutbox - \egroup \egroup - \adl@colhtdp \box\adl@box \hfil -}% \tabu@adl@act@endpbox -\def\tabu@adl@fix {% - \let\adl@xarraydashrule \tabu@adl@xarraydashrule % arydshln - \let\adl@act@endpbox \tabu@adl@act@endpbox % arydshln - \let\adl@act@@endpbox \tabu@adl@act@endpbox % arydshln - \let\@preamerror \@preamerr % arydshln -}% \tabu@adl@fix -%% Correction for longtable' \@startbox definition ------------------ -%% => \everypar is ``missing'' : TeX should be in vertical mode -\def\tabu@LT@startpbox #1{% - \bgroup - \let\@footnotetext\LT@p@ftntext - \setlength\hsize{#1}% - \@arrayparboxrestore - \everypar{% - \vrule \@height \ht\@arstrutbox \@width \z@ - \everypar{}}% -}% \tabu@LT@startpbox -%% \tracingtabu and the package options ------------------ -\DeclareOption{delarray}{\AtEndOfPackage{\RequirePackage{delarray}}} -\DeclareOption{linegoal}{% - \AtEndOfPackage{% - \RequirePackage{linegoal}[2010/12/07]% - \let\tabudefaulttarget \linegoal% \linegoal is \linewidth if not pdfTeX -}} -\DeclareOption{scantokens}{\tabuscantokenstrue} -\DeclareOption{debugshow}{\AtEndOfPackage{\tracingtabu=\tw@}} -\def\tracingtabu {\begingroup\@ifnextchar=% - {\afterassignment\tabu@tracing\count@} - {\afterassignment\tabu@tracing\count@1\relax}} -\def\tabu@tracing{\expandafter\endgroup - \expandafter\tabu@tr@cing \the\count@ \relax -}% \tabu@tracing -\def\tabu@tr@cing #1\relax {% - \ifnum#1>\thr@@ \let\tabu@tracinglines\message - \else \let\tabu@tracinglines\@gobble - \fi - \ifnum#1>\tw@ \let\tabu@DBG \tabu@@DBG - \def\tabu@mkarstrut {\tabu@DBG@arstrut}% - \tabustrutrule 1.5\p@ - \else \let\tabu@DBG \@gobble - \def\tabu@mkarstrut {\tabu@arstrut}% - \tabustrutrule \z@ - \fi - \ifnum#1>\@ne \let\tabu@debug \message - \else \let\tabu@debug \@gobble - \fi - \ifnum#1>\z@ - \let\tabu@message \message - \let\tabu@tracing@save \tabu@message@save - \let\tabu@starttimer \tabu@pdftimer - \else - \let\tabu@message \@gobble - \let\tabu@tracing@save \@gobble - \let\tabu@starttimer \relax - \fi -}% \tabu@tr@cing -%% Setup \AtBeginDocument -\AtBeginDocument{\tabu@AtBeginDocument} -\def\tabu@AtBeginDocument{\let\tabu@AtBeginDocument \@undefined - \ifdefined\arrayrulecolor \tabu@colortbltrue % - \tabu@colortblalignments % different glues are used - \else \tabu@colortblfalse \fi - \ifdefined\CT@arc@ \else \let\CT@arc@ \relax \fi - \ifdefined\CT@drsc@\else \let\CT@drsc@ \relax \fi - \let\tabu@arc@L \CT@arc@ \let\tabu@drsc@L \CT@drsc@ - \ifodd 1\ifcsname siunitx_table_collect_begin:Nn\endcsname % - \expandafter\ifx - \csname siunitx_table_collect_begin:Nn\endcsname\relax 0\fi\fi\relax - \tabu@siunitxtrue - \else \let\tabu@maybesiunitx \@firstofone % - \let\tabu@siunitx \tabu@nosiunitx - \tabu@siunitxfalse - \fi - \ifdefined\adl@array % - \else \let\tabu@adl@fix \relax - \let\tabu@adl@endtrial \@empty \fi - \ifdefined\longtable % - \else \let\longtabu \tabu@nolongtabu \fi - \ifdefined\cellspacetoplimit \tabu@warn@cellspace\fi - \csname\ifcsname ifHy@hyperfootnotes\endcsname % - ifHy@hyperfootnotes\else iffalse\fi\endcsname - \let\tabu@footnotetext \tabu@Hy@ftntext - \let\tabu@xfootnote \tabu@Hy@xfootnote \fi - \ifdefined\FV@DefineCheckEnd% - \tabu@fancyvrb \fi - \ifdefined\color % - \let\tabu@color \color - \def\tabu@leavevmodecolor ##1{% - \def\tabu@leavevmodecolor {\leavevmode ##1}% - }\expandafter\tabu@leavevmodecolor\expandafter{\color}% - \else - \let\tabu@color \tabu@nocolor - \let\tabu@leavevmodecolor \@firstofone \fi - \tabu@latextwoe - \ifdefined\@raggedtwoe@everyselectfont % - \tabu@raggedtwoe - \else - \let\tabu@cell@L \tabu@cell@l - \let\tabu@cell@R \tabu@cell@r - \let\tabu@cell@C \tabu@cell@c - \let\tabu@cell@J \tabu@cell@j \fi - \expandafter\in@ \expandafter\@arrayright \expandafter{\endarray}% - \ifin@ \let\tabu@endarray \endarray - \else \tabu@fix@arrayright \fi% - \everyrow{}% -}% \tabu@AtBeginDocument -\def\tabu@warn@cellspace{% - \PackageWarning{tabu}{% - Package cellspace has some limitations - \MessageBreak And redefines some macros of array.sty. - \MessageBreak Please use \string\tabulinesep\space to control - \MessageBreak vertical spacing of lines inside tabu environment}% -}% \tabu@warn@cellspace -%% tabu Package initialisation -\tabuscantokensfalse -\let\tabu@arc@G \relax -\let\tabu@drsc@G \relax -\let\tabu@evr@G \@empty -\let\tabu@rc@G \@empty -\def\tabu@ls@G {\tabu@linestyle@}% -\let\tabu@@rowfontreset \@empty % -\let\tabu@@celllalign \@empty -\let\tabu@@cellralign \@empty -\let\tabu@@cellleft \@empty -\let\tabu@@cellright \@empty -\def\tabu@naturalXmin {\z@} -\def\tabu@naturalXmax {\z@} -\let\tabu@rowfontreset \@empty -\def\tabulineon {4pt}\let\tabulineoff \tabulineon -\tabu@everyrowtrue -\ifdefined\pdfelapsedtime % - \def\tabu@pdftimer {\xdef\tabu@starttime{\the\pdfelapsedtime}}% -\else \let\tabu@pdftimer \relax \let\tabu@message@etime \relax -\fi -\tracingtabu=\z@ -\newtabulinestyle {=\maxdimen}% creates the 'factory' settings \tabu@linestyle@ -\tabulinestyle{} -\taburowcolors{} -\let\tabudefaulttarget \linewidth -\ProcessOptions* % \ProcessOptions* is quicker ! -\endinput -%% -%% End of file `tabu.sty'. diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 092b668c..83ec01a8 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -194,6 +194,12 @@ void Boundary::setVelocityBoundaryValues() setVelocityObstacleBC(); } +void Boundary::setVelocityBoundaryValues(double dt){ + setVelocitySurfaceBC(dt); + setVelocityDomainBC(); + setVelocityObstacleBC(); +} + void Boundary::setVelocityDomainBC() { for (int idx : DomainBoundaryCells_) @@ -434,6 +440,257 @@ void Boundary::setVelocitySurfaceBC(){ discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; + if (mask_->isAir(i - 1, j - 1)){ + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + } + if (mask_->isAir(i + 1, j - 1)){ + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) + - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + } + break; + // case Mask::FLUID_SINGLE_LEFT: + // // v + // discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; + // discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; + // // u + // discretization_->u(i - 1, j) = discretization_->u(i, j) + // + dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); + // // others + // if (mask_->isAir(i - 1, j + 1)){ + // discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); + // discretization_->v(i - 1, j) = discretization_->v(i, j); + // } + // if (mask_->isAir(i - 1, j - 1)){ + // discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); + // discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); + // } + // break; + // case Mask::FLUID_SINGLE_TOP: + // // u + // discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; + // discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; + // // v + // discretization_->v(i, j) = discretization_->v(i, j - 1) + // - dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); + // // others + // if (mask_->isAir(i - 1, j + 1)){ + // discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); + // discretization_->v(i - 1, j) = discretization_->v(i, j); + // } + // if (mask_->isAir(i + 1, j + 1)){ + // discretization_->u(i, j + 1) = discretization_->u(i, j); + // discretization_->v(i + 1, j) = discretization_->v(i, j); + // } + + // // Tangential stress condition + // if (mask_->isAir(i - 1, j - 1)){ + // discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + // + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + // } + // if (mask_->isAir(i + 1, j - 1)){ + // discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) + // - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + // } + // break; + // case Mask::FLUID_SINGLE_RIGHT: + // // v + // discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; + // discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; + + // // u + // discretization_->u(i, j) = discretization_->u(i - 1, j) + // - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); + // // others + // if (mask_->isAir(i + 1, j + 1)){ + // discretization_->u(i, j + 1) = discretization_->u(i, j); + // discretization_->v(i + 1, j) = discretization_->v(i, j); + // } + // if (mask_->isAir(i + 1, j - 1)){ + // discretization_->u(i + 1, j - 1) = discretization_->u(i, j); + // discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); + // } + + // // Tangential stress condition + // if (mask_->isAir(i - 1, j - 1)){ + // discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + // + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); + // } + // if (mask_->isAir(i - 1, j + 1)){ + // discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) + // - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + // } + + // break; + // case Mask::FLUID_SINGLE_BOTTOM: + // // u + // discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; + // discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; + // // v + // discretization_->v(i, j - 1) = discretization_->v(i, j) + // + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); + // // others + // if (mask_->isAir(i - 1, j - 1)){ + // discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); + // discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); + // } + // if (mask_->isAir(i + 1, j - 1)){ + // discretization_->u(i, j - 1) = discretization_->u(i, j); + // discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); + // } + // case Mask::FLUID_DROPLET: + // // u + // discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; + // discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; + // // v + // discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; + // discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; + + // // others + // if (mask_->isAir(i - 1, j - 1)){ + // discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); + // discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); + // } + // if (mask_->isAir(i - 1, j + 1)){ + // discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); + // discretization_->v(i - 1, j) = discretization_->v(i, j); + // } + // if (mask_->isAir(i + 1, j + 1)){ + // discretization_->u(i, j + 1) = discretization_->u(i, j); + // discretization_->v(i + 1, j) = discretization_->v(i, j); + // } + // if (mask_->isAir(i + 1, j - 1)){ + // discretization_->u(i, j - 1) = discretization_->u(i, j); + // discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); + // } + // break; + default: + std::cout << "ERROR" << std::endl; + } + } +} + + + +void Boundary::setVelocitySurfaceBC(double dt){ + + double dxByDy = discretization_->dx() / discretization_->dy(); + double dyByDx = discretization_->dy() / discretization_->dx(); + // Should the dt update step happen here? Then per loop only one execution is allowed + + for (int idx : FluidBoundaryCells_) + { + int i = idx % mask_->size()[0]; + int j = idx / mask_->size()[0]; + + // should be solved in the following order: + // from left to right (increasing i) + // from bottom to top (increasing j) + + + switch ((*mask_)(i, j)) { + case Mask::FLUID_BORDER_LEFT: + // u + discretization_->u(i - 1, j) = discretization_->u(i, j) + + dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); + + // v + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + break; + + case Mask::FLUID_BORDER_TOP: + // v + discretization_->v(i, j) = discretization_->v(i, j - 1) + + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); + + // u + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) + - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + break; + case Mask::FLUID_BORDER_RIGHT: + // u + discretization_->u(i, j) = discretization_->u(i - 1, j) + - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); + + // v + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) + + dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + break; + case Mask::FLUID_BORDER_BOTTOM: + // v + discretization_->v(i, j - 1) = discretization_->v(i, j) + + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); + + // u + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); + break; + case Mask::FLUID_CORNER_TOP_LEFT: + // u + discretization_->u(i - 1, j) = discretization_->u(i, j); + // v + discretization_->v(i, j) = discretization_->v(i, j - 1); + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + if (mask_->isAir(i - 1, j + 1)) + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); // chain, u(i, j) is equvivalent + discretization_->v(i - 1, j) = discretization_->v(i, j); + break; + case Mask::FLUID_CORNER_TOP_RIGHT: + // u + discretization_->u(i, j) = discretization_->u(i - 1, j); + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) + - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + // v + discretization_->v(i, j) = discretization_->v(i, j - 1); + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) + - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + if (mask_->isAir(i + 1, j + 1)){ + discretization_->u(i, j + 1) = discretization_->u(i, j); + discretization_->v(i + 1, j) = discretization_->v(i, j); + } break; + case Mask::FLUID_CORNER_BOTTOM_RIGHT: + // u + discretization_->u(i, j) = discretization_->u(i - 1, j); + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); + // v + discretization_->v(i, j - 1) = discretization_->v(i, j); + if (mask_->isAir(i + 1, j - 1)){ + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); + discretization_->u(i, j - 1) = discretization_->u(i, j); + } break; + case Mask::FLUID_CORNER_BOTTOM_LEFT: + // u + discretization_->u(i - 1, j) = discretization_->u(i, j); + // v + discretization_->v(i, j - 1) = discretization_->v(i, j); + if (mask_->isAir(i - 1, j - 1)) + { + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); + + } break; + case Mask::FLUID_COLUMN_HORIZONTAL: + // v + discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; + discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; + // u + if (mask_->isAir(i - 1, j + 1)){ + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) + - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + } + if (mask_->isAir(i - 1, j - 1)){ + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); + } + break; + case Mask::FLUID_COLUMN_VERTICAL: + // u + discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; + discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; + if (mask_->isAir(i - 1, j - 1)){ discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); @@ -559,6 +816,7 @@ void Boundary::setVelocitySurfaceBC(){ } break; default: + std::cout << "ERROR" << std::endl; break; } @@ -570,6 +828,9 @@ void Boundary::setVelocitySurfaceBC(){ + + + bool Boundary::doCalculateF(int i, int j) const { if (mask_->isFluid(i, j) && mask_->isFluid(i + 1, j)){ return true; diff --git a/src/boundary/boundary.h b/src/boundary/boundary.h index f040d1d2..34ff65bb 100644 --- a/src/boundary/boundary.h +++ b/src/boundary/boundary.h @@ -12,6 +12,7 @@ class Boundary Boundary(std::shared_ptr mask, std::shared_ptr discretization, Settings settings); void setPressureBoundaryValues(); void setVelocityBoundaryValues(); + void setVelocityBoundaryValues(double dt); std::shared_ptr mask_; @@ -31,6 +32,7 @@ class Boundary void setVelocityDomainBC(); void setVelocityObstacleBC(); void setVelocitySurfaceBC(); + void setVelocitySurfaceBC(double dt); std::shared_ptr discretization_; diff --git a/src/computation.cpp b/src/computation.cpp index fa9b71a1..25dbcf34 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -67,7 +67,7 @@ void Computation::runSimulation() { double currentTime = 0.; - applyBoundaryValues(); + boundary_->setVelocityBoundaryValues(); do { @@ -86,9 +86,9 @@ void Computation::runSimulation() computePressure(); computeVelocities(); - applyBoundaryValues(); + boundary_->setVelocityBoundaryValues(); fluidTracer_->moveParticles(dt_); - applyBoundaryValues(); + boundary_->setVelocityBoundaryValues(dt_); @@ -110,6 +110,7 @@ void Computation::applyBoundaryValues() boundary_->setVelocityBoundaryValues(); } + void Computation::computeTimeStepWidth(double currentTime) { // Diffusion operator (always > 0) From efb95a3b52b9f702518c760d5341e92d2cb21786 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Mon, 5 Feb 2024 15:57:18 +0100 Subject: [PATCH 44/67] [Outputwriter Particles] updated the boundary cell --- build.sh | 4 +- ...ings_debug.txt => settings_debug_joni.txt} | 4 +- src/boundary/boundary.cpp | 53 ++++++++++++------- src/boundary/boundary.h | 7 +-- src/computation.cpp | 19 ++++--- src/output_writer/output_writer_paraview.cpp | 27 +++++++--- src/output_writer/output_writer_paraview.h | 6 ++- src/surface/fluid_tracer.cpp | 23 ++++++++ src/surface/fluid_tracer.h | 14 ++++- tests/CMakeLists.txt | 16 ++++-- tests/test_computation.cpp | 31 ++++++----- 11 files changed, 144 insertions(+), 60 deletions(-) rename input/{settings_debug.txt => settings_debug_joni.txt} (98%) diff --git a/build.sh b/build.sh index 20a2ddf2..f05a92da 100755 --- a/build.sh +++ b/build.sh @@ -17,7 +17,7 @@ fi make install -j4 -./numsim ../input/settings_debug.txt +./numsim ../input/settings_debug_joni.txt @@ -36,6 +36,6 @@ cd .. # cd .. # run tests -# build/tests/run_tests +build/tests/run_tests # zip -r submission.zip src/ CMakeLists.txt \ No newline at end of file diff --git a/input/settings_debug.txt b/input/settings_debug_joni.txt similarity index 98% rename from input/settings_debug.txt rename to input/settings_debug_joni.txt index 15bf2bbc..60e43344 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug_joni.txt @@ -7,7 +7,7 @@ physicalSizeY = 2.0 endTime = 10.0 # duration of the simulation re = 1000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity -gY = -10.0 +gY = 0.0 # Boundary Conditions Type @@ -24,7 +24,7 @@ NoSlipVelTopX = 0 NoSlipVelTopY = 0 NoSlipVelRightX = 0 NoSlipVelRightY = 0 -NoSlipVelBottomX = 0 +NoSlipVelBottomX = 0.1 NoSlipVelBottomY = 0 NoSlipVelLeftX = 0 NoSlipVelLeftY = 0 diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 83ec01a8..7e95c702 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -15,11 +15,11 @@ void Boundary::createBoundaryCellsLists() { int idx = i + j * mask_->size()[0]; if (mask_->isDomainBoundary(i, j)) - DomainBoundaryCells_.push_back(idx); + domainBoundaryCells_.push_back(idx); if (mask_->isObstacleBoundary(i, j)) - ObstacleBoundaryCells_.push_back(idx); + obstacleBoundaryCells_.push_back(idx); if (mask_->isFluidBoundary(i, j)) - FluidBoundaryCells_.push_back(idx); + fluidBoundaryCells_.push_back(idx); } } } @@ -31,9 +31,20 @@ void Boundary::setPressureBoundaryValues() setPressureObstacleBC(); } +void Boundary::updateBoundary(){ + fluidBoundaryCells_ = {}; + for (int i = 0; i < mask_->size()[0]; i++) { + for (int j = 0; j < mask_->size()[1]; j++) { + int idx = i + j * mask_->size()[0]; + if (mask_->isFluidBoundary(i, j)) + fluidBoundaryCells_.push_back(idx); + } + } +} + void Boundary::setPressureDomainBC() { - for (int idx : DomainBoundaryCells_) + for (int idx : domainBoundaryCells_) { int i = idx % mask_->size()[0]; int j = idx / mask_->size()[0]; @@ -70,7 +81,7 @@ void Boundary::setPressureDomainBC() void Boundary::setPressureObstacleBC() { - for (int idx : ObstacleBoundaryCells_) + for (int idx : obstacleBoundaryCells_) { int i = idx % mask_->size()[0]; int j = idx / mask_->size()[0]; @@ -109,7 +120,7 @@ void Boundary::setPressureSurfaceBC() double dx = discretization_->dx(); double dy = discretization_->dy(); - for (int idx : FluidBoundaryCells_) + for (int idx : fluidBoundaryCells_) { int i = idx % mask_->size()[0]; int j = idx / mask_->size()[0]; @@ -202,7 +213,7 @@ void Boundary::setVelocityBoundaryValues(double dt){ void Boundary::setVelocityDomainBC() { - for (int idx : DomainBoundaryCells_) + for (int idx : domainBoundaryCells_) { int i = idx % mask_->size()[0]; int j = idx / mask_->size()[0]; @@ -258,7 +269,7 @@ void Boundary::setVelocityDomainBC() void Boundary::setVelocityObstacleBC() { - for (int idx : ObstacleBoundaryCells_) + for (int idx : obstacleBoundaryCells_) { int i = idx % mask_->size()[0]; int j = idx / mask_->size()[0]; @@ -327,7 +338,7 @@ void Boundary::setVelocitySurfaceBC(){ // Should the dt update step happen here? Then per loop only one execution is allowed double dt = 1; - for (int idx : FluidBoundaryCells_) + for (int idx : fluidBoundaryCells_) { int i = idx % mask_->size()[0]; int j = idx / mask_->size()[0]; @@ -449,7 +460,7 @@ void Boundary::setVelocitySurfaceBC(){ - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); } break; - // case Mask::FLUID_SINGLE_LEFT: + case Mask::FLUID_SINGLE_LEFT: // // v // discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; // discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; @@ -465,8 +476,8 @@ void Boundary::setVelocitySurfaceBC(){ // discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); // discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); // } - // break; - // case Mask::FLUID_SINGLE_TOP: + break; + case Mask::FLUID_SINGLE_TOP: // // u // discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; // discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; @@ -492,8 +503,8 @@ void Boundary::setVelocitySurfaceBC(){ // discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) // - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); // } - // break; - // case Mask::FLUID_SINGLE_RIGHT: + break; + case Mask::FLUID_SINGLE_RIGHT: // // v // discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; // discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; @@ -521,8 +532,8 @@ void Boundary::setVelocitySurfaceBC(){ // - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); // } - // break; - // case Mask::FLUID_SINGLE_BOTTOM: + break; + case Mask::FLUID_SINGLE_BOTTOM: // // u // discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; // discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; @@ -538,7 +549,8 @@ void Boundary::setVelocitySurfaceBC(){ // discretization_->u(i, j - 1) = discretization_->u(i, j); // discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); // } - // case Mask::FLUID_DROPLET: + break; + case Mask::FLUID_DROPLET: // // u // discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; // discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; @@ -563,9 +575,9 @@ void Boundary::setVelocitySurfaceBC(){ // discretization_->u(i, j - 1) = discretization_->u(i, j); // discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); // } - // break; + break; default: - std::cout << "ERROR" << std::endl; + std::cout << "ERROR" << (*mask_)(i, j) << "i" << i << " j " << j << std::endl; } } } @@ -578,7 +590,7 @@ void Boundary::setVelocitySurfaceBC(double dt){ double dyByDx = discretization_->dy() / discretization_->dx(); // Should the dt update step happen here? Then per loop only one execution is allowed - for (int idx : FluidBoundaryCells_) + for (int idx : fluidBoundaryCells_) { int i = idx % mask_->size()[0]; int j = idx / mask_->size()[0]; @@ -789,6 +801,7 @@ void Boundary::setVelocitySurfaceBC(double dt){ discretization_->u(i, j - 1) = discretization_->u(i, j); discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); } + break; case Mask::FLUID_DROPLET: // u discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; diff --git a/src/boundary/boundary.h b/src/boundary/boundary.h index 34ff65bb..87dfc016 100644 --- a/src/boundary/boundary.h +++ b/src/boundary/boundary.h @@ -18,6 +18,7 @@ class Boundary bool doCalculateF(int i, int j) const; bool doCalculateG(int i, int j) const; + void updateBoundary(); private: void createBoundaryCellsLists(); @@ -38,8 +39,8 @@ class Boundary std::shared_ptr discretization_; Settings settings_; - std::vector DomainBoundaryCells_; - std::vector ObstacleBoundaryCells_; - std::vector FluidBoundaryCells_; + std::vector domainBoundaryCells_; + std::vector obstacleBoundaryCells_; + std::vector fluidBoundaryCells_; }; \ No newline at end of file diff --git a/src/computation.cpp b/src/computation.cpp index 25dbcf34..85a7b13c 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -59,7 +59,7 @@ void Computation::initialize(int argc, char *argv[]) boundary_); } - outputWriterParaview_ = std::make_unique(discretization_, mask_); + outputWriterParaview_ = std::make_unique(discretization_, mask_, fluidTracer_); outputWriterText_ = std::make_unique(discretization_); } @@ -74,10 +74,13 @@ void Computation::runSimulation() // fluidTracer_->createParticles(0.1, 1.4); //fluidTracer_->createAndKillParticles(dt_); - // std::cout << "Particles: " << fluidTracer_->getNumberOfParticles() << std::endl; - std::cout << "\033[2J\033[1;1H"; - mask_->printMask(); - // usleep(1000000); + // std::cout << "\033[2J\033[1;1H"; +#ifndef NDEBUG + std::cout << "Particles: " << fluidTracer_->getNumberOfParticles() << std::endl; + fluidTracer_->printParticles(); + usleep(100000); +#endif + // mask_->printMask(); computeTimeStepWidth(currentTime); @@ -86,9 +89,11 @@ void Computation::runSimulation() computePressure(); computeVelocities(); - boundary_->setVelocityBoundaryValues(); - fluidTracer_->moveParticles(dt_); boundary_->setVelocityBoundaryValues(dt_); + fluidTracer_->moveParticles(dt_); + boundary_->updateBoundary(); + // Update velocity without new timestep + boundary_->setVelocityBoundaryValues(); diff --git a/src/output_writer/output_writer_paraview.cpp b/src/output_writer/output_writer_paraview.cpp index edd84983..6e8762cf 100644 --- a/src/output_writer/output_writer_paraview.cpp +++ b/src/output_writer/output_writer_paraview.cpp @@ -1,6 +1,8 @@ #include "output_writer_paraview.h" -OutputWriterParaview::OutputWriterParaview(std::shared_ptr discretization, std::shared_ptr mask) : OutputWriter(discretization), mask_(mask) +OutputWriterParaview::OutputWriterParaview(std::shared_ptr discretization, + std::shared_ptr mask, + std::shared_ptr fluidTracer): OutputWriter(discretization), mask_(mask), fluidTracer_(fluidTracer) { // Create a vtkWriter_ vtkWriter_ = vtkSmartPointer::New(); @@ -39,35 +41,47 @@ void OutputWriterParaview::writeFile(double currentTime) // --------------------------- vtkSmartPointer arrayPressure = vtkDoubleArray::New(); vtkSmartPointer arrayMask = vtkDoubleArray::New(); + vtkSmartPointer arrayParticles = vtkDoubleArray::New(); // the pressure is a scalar which means the number of components is 1 arrayPressure->SetNumberOfComponents(1); arrayMask->SetNumberOfComponents(1); + arrayParticles->SetNumberOfComponents(1); // Set the number of pressure values and allocate memory for it. We already know the number, it has to be the same as there are nodes in the mesh. arrayPressure->SetNumberOfTuples(dataSet->GetNumberOfPoints()); arrayMask->SetNumberOfTuples(dataSet->GetNumberOfPoints()); + arrayParticles->SetNumberOfTuples(dataSet->GetNumberOfPoints()); arrayPressure->SetName("pressure"); arrayMask->SetName("mask"); + arrayParticles->SetName("particles"); // loop over the nodes of the mesh and assign the interpolated p values in the vtk data structure // we only consider the cells that are the actual computational domain, not the helper values in the "halo" // index for the vtk data structure, will be incremented in the inner loop - int index_ = 0; + int idxParticles = 0; for (int j = 0; j < n_cells_y; j++) { - for (int i = 0; i < n_cells_x; i++, index_++) + for (int i = 0; i < n_cells_x; i++, idxParticles++) { const double x = i * dx; const double y = j * dy; - arrayPressure->SetValue(index_, discretization_->p().interpolateAt(x, y)); + arrayPressure->SetValue(idxParticles, discretization_->p().interpolateAt(x, y)); + } + } + + // set the array to particles per cell + int index_ = 0; + for (int j = 2; j < n_cells_y + 2; j++) { + for (int i = 2; i < n_cells_x + 2; i++, index_++) { + arrayParticles->SetValue(index_, fluidTracer_->getNumberOfParticles(i/2, j/2)); } } - int OBSTACLE = 2; int FLUID = 1; + int OBSTACLE = 2; int AIR = 3; int index = 0; @@ -126,7 +140,7 @@ void OutputWriterParaview::writeFile(double currentTime) if (mask_->isObstacle(i_left, j_left) || mask_->isObstacle(i_left + 1, j_left)){ arrayMask->SetValue(index, OBSTACLE); } - else if (mask_->isAir(i_left, j_left) || mask_->isAir(i_left + 1, j_left)){ + else if (mask_->isAir(i_left, j_left) && mask_->isAir(i_left + 1, j_left)){ arrayMask->SetValue(index, AIR); } else { arrayMask->SetValue(index, FLUID); @@ -141,6 +155,7 @@ void OutputWriterParaview::writeFile(double currentTime) // add the field variable to the data set dataSet->GetPointData()->AddArray(arrayPressure); dataSet->GetPointData()->AddArray(arrayMask); + dataSet->GetPointData()->AddArray(arrayParticles); // add velocity field variable // --------------------------- diff --git a/src/output_writer/output_writer_paraview.h b/src/output_writer/output_writer_paraview.h index 0465f18e..043a6e2a 100644 --- a/src/output_writer/output_writer_paraview.h +++ b/src/output_writer/output_writer_paraview.h @@ -12,6 +12,7 @@ #include #include #include "../boundary/mask.h" +#include "../surface/fluid_tracer.h" /** * @class OutputWriterParaview @@ -29,7 +30,9 @@ class OutputWriterParaview : public OutputWriter * * @param discretization shared pointer to the discretization object that will contain all the data to be written to the file */ - OutputWriterParaview(std::shared_ptr discretization, std::shared_ptr mask); + OutputWriterParaview(std::shared_ptr discretization, + std::shared_ptr mask, + std::shared_ptr fluidTracer); /** * @brief Write current velocities to file, filename is output_.vti @@ -41,4 +44,5 @@ class OutputWriterParaview : public OutputWriter private: vtkSmartPointer vtkWriter_; //!< vtk writer to write ImageData std::shared_ptr mask_; + std::shared_ptr fluidTracer_; }; diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index 81344f79..55e7e846 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -12,6 +12,9 @@ FluidTracer::FluidTracer(std::vector x, std::vector y, numParticlesPerCell_ = 1; n_x = 1; n_y = 1; + // hack to init currentParticlesPerCell_ + currentParticlesPerCell_.resize(mask_->size()[0] * mask_->size()[1]); + moveParticles(0.0); } @@ -32,6 +35,7 @@ FluidTracer::FluidTracer(int numParticlesPerCell, // Resize for speed up x_.resize(numParticles_); y_.resize(numParticles_); + currentParticlesPerCell_.resize(mask_->size()[0] * mask_->size()[1]); int placedParticles = 0; for (int i = 1; i < mask_->size()[0] - 1; i++) { @@ -39,6 +43,7 @@ FluidTracer::FluidTracer(int numParticlesPerCell, if (mask_->isFluid(i, j)) { initializeFluidCell(i, j, placedParticles); placedParticles += numParticlesPerCell_; + currentParticlesPerCell_[i + j * mask_->size()[0]] = numParticlesPerCell_; } } } @@ -77,6 +82,10 @@ int FluidTracer::getNumberOfParticles() const { return numParticles_; } +int FluidTracer::getNumberOfParticles(int i, int j) const { + return currentParticlesPerCell_[i + j * mask_->size()[0]]; +} + std::array FluidTracer::cellOfParticle(int i){ return {val2CellX(x_[i]), val2CellY(y_[i])}; } @@ -94,9 +103,20 @@ std::array FluidTracer::getParticlePosition(int i) const { } +void FluidTracer::printParticles() { + for (int j = mask_->size()[1] - 1; j >= 0; j--){ + for (int i = 0; i < mask_->size()[0]; i++){ + std::cout << std::setw(5) << std::setfill(' ') << currentParticlesPerCell_[i + j * mask_->size()[0]] << " "; + } + std::cout << std::endl; + } +} + + void FluidTracer::moveParticles(double dt) { // Cells without particle are air or obstacle mask_->resetMask(); + std::fill(currentParticlesPerCell_.begin(), currentParticlesPerCell_.end(), 0); for (int i = 0; i < numParticles_; i++) { @@ -109,6 +129,9 @@ void FluidTracer::moveParticles(double dt) { if (!mask_->isObstacle(newIdx[0], newIdx[1])){ (*mask_)(newIdx[0], newIdx[1]) = Mask::FLUID; } + + currentParticlesPerCell_[newIdx[0] + newIdx[1] * mask_->size()[0]] += 1; + } mask_->setFluidBC(); } diff --git a/src/surface/fluid_tracer.h b/src/surface/fluid_tracer.h index 3f3a2f8e..e3aa5058 100644 --- a/src/surface/fluid_tracer.h +++ b/src/surface/fluid_tracer.h @@ -1,6 +1,8 @@ #pragma once #include +#include +#include #include #include #include @@ -40,12 +42,19 @@ class FluidTracer { void createParticles(double positionSourceX, double positionSourceY); /** - * @brief Get the Number Of Particles object + * @brief Total number of Particles * * @return int */ int getNumberOfParticles() const; + /** + * @brief Particles of specified cell + * + * uses mask Grid + */ + int getNumberOfParticles(int i, int j) const; + /** * @brief Get the Particle Position, index starts at 0 @@ -65,6 +74,8 @@ class FluidTracer { std::array updateParticle(int i, std::array idx, double dt, std::array vel, int depth); std::array moveParticles(double dt, std::array vel); + void printParticles(); + private: /** @@ -89,6 +100,7 @@ class FluidTracer { std::shared_ptr mask_; std::vector x_; std::vector y_; + std::vector currentParticlesPerCell_; }; \ No newline at end of file diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 164ed72d..d03705f9 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -3,9 +3,7 @@ cmake_minimum_required(VERSION 3.14) # 'Google_test' is the subproject name project(tests) -# 'lib' is the folder with Google Test sources -find_package(GTest REQUIRED) -include_directories(${GTEST_INCLUDE_DIRS}) + # 'Google_Tests_run' is the target name # 'test1.cpp test2.cpp' are source files with tests @@ -18,6 +16,7 @@ add_executable(run_tests test_mask.cpp test_boundary.cpp test_fluid_tracer.cpp + # test_computation.cpp ../src/storage/array2D.cpp ../src/storage/field_variable.cpp ../src/discretization/staggered_grid.cpp @@ -27,12 +26,21 @@ add_executable(run_tests ../src/boundary/mask.cpp ../src/boundary/boundary.cpp ../src/surface/fluid_tracer.cpp + # ../src/computation.cpp ) +# 'lib' is the folder with Google Test sources +find_package(GTest REQUIRED) +# find_package(VTK) find_package(PNG REQUIRED) -target_link_libraries(run_tests gtest gtest_main ${PNG_LIBRARIES}) + +include_directories(${GTEST_INCLUDE_DIRS}) # ${VTK_INCLUDE_DIRS} + + +# add the libraries for the linker +target_link_libraries(run_tests gtest gtest_main ${PNG_LIBRARIES}) # ${VTK_LIBRARIES} # Set the version of the C++ standard to use, we use C++17, published in 2014 set(CMAKE_CXX_STANDARD 17) diff --git a/tests/test_computation.cpp b/tests/test_computation.cpp index c5444efd..663326d7 100644 --- a/tests/test_computation.cpp +++ b/tests/test_computation.cpp @@ -1,22 +1,25 @@ -#include -#include "../src/computation.h" +// #include +// #include "../src/computation.h" // TEST(Computation, Initialize){ // Computation comp; -// char* argv[] = {"test", "../input/settings.txt"}; +// char* argv[] = {const_cast("test"), +// const_cast("/home/jonat/Documents/01_Studium/NumSim/input/settings_debug_joni.txt")}; // comp.initialize(2, argv); + +// comp.runSimulation(); // } -// std::cout << fluidTracer_->getNumberOfParticles() << std::endl; -// int particleInDomain = 0; -// int fluidCells = 0; -// for (int i = 0; i < fluidTracer_->getNumberOfParticles(); i++) -// { -// particleInDomain += fluidTracer_->getParticlePosition(i)[0] > 1.9 -// && fluidTracer_->getParticlePosition(i)[0] < settings_.physicalSize[0] -// && fluidTracer_->getParticlePosition(i)[1] > 0.0 -// && fluidTracer_->getParticlePosition(i)[1] < settings_.physicalSize[1]; -// } -// std::cout << particleInDomain << std::endl; \ No newline at end of file +// // std::cout << fluidTracer_->getNumberOfParticles() << std::endl; +// // int particleInDomain = 0; +// // int fluidCells = 0; +// // for (int i = 0; i < fluidTracer_->getNumberOfParticles(); i++) +// // { +// // particleInDomain += fluidTracer_->getParticlePosition(i)[0] > 1.9 +// // && fluidTracer_->getParticlePosition(i)[0] < settings_.physicalSize[0] +// // && fluidTracer_->getParticlePosition(i)[1] > 0.0 +// // && fluidTracer_->getParticlePosition(i)[1] < settings_.physicalSize[1]; +// // } +// // std::cout << particleInDomain << std::endl; \ No newline at end of file From 9684dc46e8ae7f370da5781a99031977db6dc0f8 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Mon, 5 Feb 2024 17:06:30 +0100 Subject: [PATCH 45/67] Validation with LidDrivenCavity --- input/settings_debug_joni.txt | 6 +-- src/computation.cpp | 7 ++- src/surface/fluid_tracer.cpp | 95 +++++++++++++++++++++++------------ src/surface/fluid_tracer.h | 19 ++++--- 4 files changed, 80 insertions(+), 47 deletions(-) diff --git a/input/settings_debug_joni.txt b/input/settings_debug_joni.txt index 60e43344..79aba4b5 100644 --- a/input/settings_debug_joni.txt +++ b/input/settings_debug_joni.txt @@ -20,11 +20,11 @@ BCLeft = NoSlip # NoSlip boundary conditions -NoSlipVelTopX = 0 +NoSlipVelTopX = 1 NoSlipVelTopY = 0 NoSlipVelRightX = 0 NoSlipVelRightY = 0 -NoSlipVelBottomX = 0.1 +NoSlipVelBottomX = 0 NoSlipVelBottomY = 0 NoSlipVelLeftX = 0 NoSlipVelLeftY = 0 @@ -48,7 +48,7 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap -createDomainfromBitmap = true +createDomainfromBitmap = false pathToBitmap = /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Bitmap/simple2.png # Discretization parameters diff --git a/src/computation.cpp b/src/computation.cpp index 85a7b13c..0e0a58f9 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -76,11 +76,10 @@ void Computation::runSimulation() // std::cout << "\033[2J\033[1;1H"; #ifndef NDEBUG - std::cout << "Particles: " << fluidTracer_->getNumberOfParticles() << std::endl; - fluidTracer_->printParticles(); - usleep(100000); -#endif + // fluidTracer_->printParticles(); // mask_->printMask(); + // usleep(1000000); +#endif computeTimeStepWidth(currentTime); diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index 55e7e846..58f59584 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -1,22 +1,5 @@ #include "fluid_tracer.h" -FluidTracer::FluidTracer(std::vector x, std::vector y, - std::shared_ptr discretization, - std::shared_ptr mask) { - x_ = x; - y_ = y; - discretization_ = discretization; - mask_ = mask; - numParticles_ = x_.size(); - - numParticlesPerCell_ = 1; - n_x = 1; - n_y = 1; - // hack to init currentParticlesPerCell_ - currentParticlesPerCell_.resize(mask_->size()[0] * mask_->size()[1]); - moveParticles(0.0); -} - FluidTracer::FluidTracer(int numParticlesPerCell, std::shared_ptr discretization, @@ -25,6 +8,10 @@ FluidTracer::FluidTracer(int numParticlesPerCell, discretization_ = discretization; mask_ = mask; + initializeHomogenousParticleDistribution(numParticlesPerCell); +} + +void FluidTracer::initializeHomogenousParticleDistribution(int numParticlesPerCell){ seedRelationDyDx_ = discretization_->dy()/ discretization_->dx(); n_x = static_cast(std::ceil(std::sqrt(numParticlesPerCell/seedRelationDyDx_))); n_y = static_cast(std::ceil(n_x * seedRelationDyDx_)); @@ -44,6 +31,7 @@ FluidTracer::FluidTracer(int numParticlesPerCell, initializeFluidCell(i, j, placedParticles); placedParticles += numParticlesPerCell_; currentParticlesPerCell_[i + j * mask_->size()[0]] = numParticlesPerCell_; + numFluidCells_++; } } } @@ -102,37 +90,51 @@ std::array FluidTracer::getParticlePosition(int i) const { return {x_[i], y_[i]}; } - -void FluidTracer::printParticles() { - for (int j = mask_->size()[1] - 1; j >= 0; j--){ - for (int i = 0; i < mask_->size()[0]; i++){ - std::cout << std::setw(5) << std::setfill(' ') << currentParticlesPerCell_[i + j * mask_->size()[0]] << " "; +int FluidTracer::getThresholdParticlesFluidCell() { + std::priority_queue, std::greater> heap; + for (int particles: currentParticlesPerCell_){ + heap.push(particles); + if (heap.size() > numFluidCells_) { + heap.pop(); } - std::cout << std::endl; } + + int threshold = heap.top(); + if (threshold < 1){ + threshold = 1; + std::cout << "DANGER: Threshold is 0" << std::endl; + } + return threshold; } + void FluidTracer::moveParticles(double dt) { - // Cells without particle are air or obstacle + // Reset mask_->resetMask(); std::fill(currentParticlesPerCell_.begin(), currentParticlesPerCell_.end(), 0); for (int i = 0; i < numParticles_; i++) { - std::array vel = {discretization_->u().interpolateAt(x_[i], y_[i]), discretization_->v().interpolateAt(x_[i], y_[i])}; std::array idx = cellOfParticle(i); std::array newIdx = updateParticle(i, idx, dt, vel); - // Safety feature -> can be removed for speed up - if (!mask_->isObstacle(newIdx[0], newIdx[1])){ - (*mask_)(newIdx[0], newIdx[1]) = Mask::FLUID; - } - currentParticlesPerCell_[newIdx[0] + newIdx[1] * mask_->size()[0]] += 1; } + + int threshold = getThresholdParticlesFluidCell(); + + for (int i = 0; i < mask_->size()[0]; i++){ + for (int j = 0; j < mask_->size()[1]; j++){ + if (currentParticlesPerCell_[i + j * mask_->size()[0]] >= threshold){ + (*mask_)(i, j) = Mask::FLUID; + } + } + } + // std::cout<< "Threshold: " << threshold << std::endl; + // Update BC in mask mask_->setFluidBC(); } @@ -300,14 +302,43 @@ std::array FluidTracer::updateParticle(int i, std::array idx, do } +////////////////////////////////////////////////////// - - +// T E S T I N G ////////////////////////////////////////////////////// // ONLY FOR TESTING PURPOSES + +void FluidTracer::printParticles() { + for (int j = mask_->size()[1] - 1; j >= 0; j--){ + for (int i = 0; i < mask_->size()[0]; i++){ + std::cout << std::setw(5) << std::setfill(' ') << currentParticlesPerCell_[i + j * mask_->size()[0]] << " "; + } + std::cout << std::endl; + } +} + + +FluidTracer::FluidTracer(std::vector x, std::vector y, + std::shared_ptr discretization, + std::shared_ptr mask) { + x_ = x; + y_ = y; + discretization_ = discretization; + mask_ = mask; + numParticles_ = x_.size(); + + numParticlesPerCell_ = 1; + n_x = 1; + n_y = 1; + // hack to init currentParticlesPerCell_ + currentParticlesPerCell_.resize(mask_->size()[0] * mask_->size()[1]); + moveParticles(0.0); +} + + std::array FluidTracer::moveParticles(double dt, std::array vel) { // Cells without particle are air or obstacle mask_->resetMask(); diff --git a/src/surface/fluid_tracer.h b/src/surface/fluid_tracer.h index e3aa5058..5a0c2653 100644 --- a/src/surface/fluid_tracer.h +++ b/src/surface/fluid_tracer.h @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -59,7 +60,6 @@ class FluidTracer { /** * @brief Get the Particle Position, index starts at 0 * - * @param i * @return std::array */ std::array getParticlePosition(int i) const; @@ -78,23 +78,27 @@ class FluidTracer { private: + void initializeHomogenousParticleDistribution(int numParticlesPerCell); /** * @brief initializes a single cell according to nx, ny and numParticlesPerCell_ - * - * @param i index of inner cells in x direction - * @param j index of inner cells in y direction - * @param idx current number of particles */ void initializeFluidCell(int i, int j, int idx); + + // Helper for move Particles + int getThresholdParticlesFluidCell(); std::array updateParticle(int i, std::array, double dt, std::array vel); int numParticles_; int numParticlesPerCell_; // + + // aspect ratio e.g. 1.0 for square cells and 0.5 for (dx = 2*dy) cells double seedRelationDyDx_; - int n_x; - int n_y; + // how many particles are placed in each direction per cell + int n_x, n_y; + // inital count of fluid cells + int numFluidCells_; std::shared_ptr discretization_; std::shared_ptr mask_; @@ -102,5 +106,4 @@ class FluidTracer { std::vector y_; std::vector currentParticlesPerCell_; - }; \ No newline at end of file From 895166207238c1409cd5aa75c6fd19bab1de195f Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Mon, 5 Feb 2024 21:36:37 +0100 Subject: [PATCH 46/67] [isINNERFluid bug] --- input/settings_debug_joni.txt | 16 +++++----- src/computation.cpp | 4 +-- src/solver/pressure_solver.cpp | 2 +- src/solver/sor.cpp | 2 +- tests/test_boundary.cpp | 55 ++++++++++++++++++++++++++++++++++ 5 files changed, 67 insertions(+), 12 deletions(-) diff --git a/input/settings_debug_joni.txt b/input/settings_debug_joni.txt index 79aba4b5..2251d88c 100644 --- a/input/settings_debug_joni.txt +++ b/input/settings_debug_joni.txt @@ -5,7 +5,7 @@ physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 endTime = 10.0 # duration of the simulation -re = 1000 # Reynolds number +re = 50 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity gY = 0.0 @@ -20,14 +20,14 @@ BCLeft = NoSlip # NoSlip boundary conditions -NoSlipVelTopX = 1 +NoSlipVelTopX = 0 NoSlipVelTopY = 0 NoSlipVelRightX = 0 -NoSlipVelRightY = 0 -NoSlipVelBottomX = 0 +NoSlipVelRightY = -0.2 +NoSlipVelBottomX = -0.2 NoSlipVelBottomY = 0 NoSlipVelLeftX = 0 -NoSlipVelLeftY = 0 +NoSlipVelLeftY = 0.2 # Pressure BoundaryConditions @@ -48,7 +48,7 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap -createDomainfromBitmap = false +createDomainfromBitmap = true pathToBitmap = /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Bitmap/simple2.png # Discretization parameters @@ -58,10 +58,10 @@ nCellsY = 20 useDonorCell = true # if donor cell discretization should be used, possible values: true false alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences tau = 0.5 # safety factor for time step width -maximumDt = 0.1 # maximum values for time step width +maximumDt = 0.05 # maximum values for time step width # Solver parameters pressureSolver = SOR # which pressure solver to use, possible values: GaussSeidel SOR CG omega = 1.6 # overrelaxation factor, only for SOR solver epsilon = 1e-5 # tolerance for 2-norm of residual -maximumNumberOfIterations = 1e4 # maximum number of iterations in the solver +maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver diff --git a/src/computation.cpp b/src/computation.cpp index 0e0a58f9..47355f4e 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -35,7 +35,7 @@ void Computation::initialize(int argc, char *argv[]) // create boundary and trace // TODO: read particles per cell from settings file - fluidTracer_ = std::make_shared(100, discretization_, mask_); + fluidTracer_ = std::make_shared(10, discretization_, mask_); // std::vector traceX = {1.8}; // std::vector traceY = {1.8}; @@ -92,7 +92,7 @@ void Computation::runSimulation() fluidTracer_->moveParticles(dt_); boundary_->updateBoundary(); // Update velocity without new timestep - boundary_->setVelocityBoundaryValues(); + // boundary_->setVelocityBoundaryValues(); diff --git a/src/solver/pressure_solver.cpp b/src/solver/pressure_solver.cpp index 1d054c5c..502db9a5 100644 --- a/src/solver/pressure_solver.cpp +++ b/src/solver/pressure_solver.cpp @@ -46,7 +46,7 @@ double PressureSolver::calculateResiduum() { for (int j = j_beg; j < j_end; j++) { - if(boundary_->mask_->isFluid(i,j)){ + if(boundary_->mask_->isInnerFluid(i,j)){ pxx = (discretization_->p(i - 1, j) - 2 * discretization_->p(i, j) + discretization_->p(i + 1, j)) / dx2; pyy = (discretization_->p(i, j - 1) - 2 * discretization_->p(i, j) + discretization_->p(i, j + 1)) / dy2; res_current_point = pxx + pyy - discretization_->rhs(i, j); diff --git a/src/solver/sor.cpp b/src/solver/sor.cpp index 6fbbb14e..ed440c9d 100644 --- a/src/solver/sor.cpp +++ b/src/solver/sor.cpp @@ -23,7 +23,7 @@ void SOR::solve() { for (int j = j_beg; j < j_end; j++) { - if (boundary_->mask_->isFluid(i, j)) + if (boundary_->mask_->isInnerFluid(i, j)) { p_x = 1 / dx2 * (discretization_->p(i + 1, j) + discretization_->p(i - 1, j)); p_y = 1 / dy2 * (discretization_->p(i, j + 1) + discretization_->p(i, j - 1)); diff --git a/tests/test_boundary.cpp b/tests/test_boundary.cpp index 1e3fc104..d5da3060 100644 --- a/tests/test_boundary.cpp +++ b/tests/test_boundary.cpp @@ -3,6 +3,19 @@ #include "../src/discretization/central_differences.h" TEST(Boundary, BoundaryCellsWithoutObstacle) { + Settings settings; + settings.nCells = {10, 10}; + settings.physicalSize = {1.0, 1.0}; + std::array meshWidth = {settings.physicalSize[0] / settings.nCells[0], settings.physicalSize[1] / settings.nCells[1]}; + + std::shared_ptr mask = std::make_shared(settings); + std::shared_ptr discretization = std::make_shared(settings.nCells, meshWidth); + + Boundary boundary(mask, discretization, settings); +}; + + +TEST(Boundary, BoundaryCellsWithObstacle) { Settings settings; settings.nCells = {10, 10}; settings.obstaclePosition = {0.45, 0.45}; @@ -11,8 +24,50 @@ TEST(Boundary, BoundaryCellsWithoutObstacle) { std::array meshWidth = {settings.physicalSize[0] / settings.nCells[0], settings.physicalSize[1] / settings.nCells[1]}; std::shared_ptr mask = std::make_shared(settings); + mask->makeRectangularObstacle(); std::shared_ptr discretization = std::make_shared(settings.nCells, meshWidth); Boundary boundary(mask, discretization, settings); }; + +TEST(Boundary, SurfacePressure) { + // Reset this grid with all 16 possibilities + + // A A A + // F F F + // F F A + + // (sourrounded by domain) + + Settings settings; + settings.nCells = {3, 3}; + settings.physicalSize = {1.0, 1.0}; + std::array meshWidth = {settings.physicalSize[0] / settings.nCells[0], settings.physicalSize[1] / settings.nCells[1]}; + + std::shared_ptr mask = std::make_shared(settings); + std::shared_ptr discretization = std::make_shared(settings.nCells, meshWidth); + Boundary boundary(mask, discretization, settings); + for (int i = 0; i < 16; i++) { + mask->resetMask(); + if (i%2 > 0){ + (*mask)(1, 0) = Mask::FLUID; + } + if (i%4 > 2){ + (*mask)(1, 1) = Mask::FLUID; + } + if (i%8 > 4){ + (*mask)(1, 2) = Mask::FLUID; + } + if (i%16 > 8){ + (*mask)(0, 1) = Mask::FLUID; + } + + // boundary.setSurfacePressure(); + // std::cout << "Case " << i << "\n"; + // mask_->printMask(); + + + } + +} \ No newline at end of file From 003b20612a46b40db456caa5ca976e211c15baf4 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Mon, 5 Feb 2024 21:37:03 +0100 Subject: [PATCH 47/67] [isINNERFluid bug] --- input/settings_debug_joni.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/input/settings_debug_joni.txt b/input/settings_debug_joni.txt index 2251d88c..4a63cc9c 100644 --- a/input/settings_debug_joni.txt +++ b/input/settings_debug_joni.txt @@ -5,7 +5,7 @@ physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 endTime = 10.0 # duration of the simulation -re = 50 # Reynolds number +re = 1000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity gY = 0.0 @@ -23,11 +23,11 @@ BCLeft = NoSlip NoSlipVelTopX = 0 NoSlipVelTopY = 0 NoSlipVelRightX = 0 -NoSlipVelRightY = -0.2 -NoSlipVelBottomX = -0.2 +NoSlipVelRightY = -0.1 +NoSlipVelBottomX = -0.1 NoSlipVelBottomY = 0 NoSlipVelLeftX = 0 -NoSlipVelLeftY = 0.2 +NoSlipVelLeftY = 0.1 # Pressure BoundaryConditions @@ -58,7 +58,7 @@ nCellsY = 20 useDonorCell = true # if donor cell discretization should be used, possible values: true false alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences tau = 0.5 # safety factor for time step width -maximumDt = 0.05 # maximum values for time step width +maximumDt = 0.01 # maximum values for time step width # Solver parameters pressureSolver = SOR # which pressure solver to use, possible values: GaussSeidel SOR CG From ee14c5c2b9c217d77fded7522049848edfad059b Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Mon, 5 Feb 2024 22:04:52 +0100 Subject: [PATCH 48/67] [ToDo fluidTracer Settings] --- input/settings_debug_joni.txt | 10 +++++----- src/computation.cpp | 4 +++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/input/settings_debug_joni.txt b/input/settings_debug_joni.txt index 4a63cc9c..5d0dbd3f 100644 --- a/input/settings_debug_joni.txt +++ b/input/settings_debug_joni.txt @@ -20,14 +20,14 @@ BCLeft = NoSlip # NoSlip boundary conditions -NoSlipVelTopX = 0 +NoSlipVelTopX = -0.1 NoSlipVelTopY = 0 NoSlipVelRightX = 0 -NoSlipVelRightY = -0.1 -NoSlipVelBottomX = -0.1 +NoSlipVelRightY = 0.1 +NoSlipVelBottomX = 0.1 NoSlipVelBottomY = 0 NoSlipVelLeftX = 0 -NoSlipVelLeftY = 0.1 +NoSlipVelLeftY = -0.1 # Pressure BoundaryConditions @@ -48,7 +48,7 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap -createDomainfromBitmap = true +createDomainfromBitmap = false pathToBitmap = /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Bitmap/simple2.png # Discretization parameters diff --git a/src/computation.cpp b/src/computation.cpp index 47355f4e..6db8abc5 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -35,7 +35,9 @@ void Computation::initialize(int argc, char *argv[]) // create boundary and trace // TODO: read particles per cell from settings file - fluidTracer_ = std::make_shared(10, discretization_, mask_); + if (settings_.useParticleTracer){ + fluidTracer_ = std::make_shared(settings_.particlesPerCell, discretization_, mask_); + } // std::vector traceX = {1.8}; // std::vector traceY = {1.8}; From b4e4102b263051b59110028df437551883e65cc1 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Mon, 5 Feb 2024 22:59:20 +0100 Subject: [PATCH 49/67] tried without majority vote in fluidTracer --- input/damBreak.png | Bin 0 -> 470 bytes input/settings_damBreak.txt | 67 ++++++++++++++++++++++++++++++++++ input/settings_debug_joni.txt | 16 ++++---- src/computation.cpp | 8 ++-- src/surface/fluid_tracer.cpp | 17 +++++---- 5 files changed, 88 insertions(+), 20 deletions(-) create mode 100644 input/damBreak.png create mode 100644 input/settings_damBreak.txt diff --git a/input/damBreak.png b/input/damBreak.png new file mode 100644 index 0000000000000000000000000000000000000000..78835570bcbc1df9739d4a991647a03994376994 GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^DImKNC66->Jjb0_IwdbP0l+XkKdfBII literal 0 HcmV?d00001 diff --git a/input/settings_damBreak.txt b/input/settings_damBreak.txt new file mode 100644 index 00000000..aaedba3d --- /dev/null +++ b/input/settings_damBreak.txt @@ -0,0 +1,67 @@ +# Settings file for numsim program +# Run ./numsim lid_driven_cavity.txt + +# Problem description +physicalSizeX = 4.0 # physical size of the domain +physicalSizeY = 4.0 +endTime = 10.0 # duration of the simulation +re = 1000 # Reynolds number +gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity +gY = -9.81 + + +# Boundary Conditions Type + +BCTop = NoSlip +BCRight = NoSlip +BCBottom = NoSlip +BCLeft = NoSlip + + +# NoSlip boundary conditions + +NoSlipVelTopX = 0 +NoSlipVelTopY = 0 +NoSlipVelRightX = 0 +NoSlipVelRightY = 0 +NoSlipVelBottomX = 0 +NoSlipVelBottomY = 0 +NoSlipVelLeftX = 0 +NoSlipVelLeftY = 0 + + +# Pressure BoundaryConditions + +PressureTop = 0 +PressureRight = 0 +PressureBottom = 0 +PressureLeft = 0 + +# Create Rectangular object in domain + +createRectangularObject = false + +obstaclePositionX = 2 +obstaclePositionY = 0 +obstacleDimensionX = 0.16 +obstacleDimensionY = 0.32 + +# Create domain from PNGBitmap 12 x 23 + +createDomainfromBitmap = true +pathToBitmap = ../input/damBreak.png + +# Discretization parameters +nCellsX = 100 # number of cells in x and y direction +nCellsY = 100 + +useDonorCell = true # if donor cell discretization should be used, possible values: true false +alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences +tau = 0.5 # safety factor for time step width +maximumDt = 0.1 # maximum values for time step width + +# Solver parameters +pressureSolver = SOR # which pressure solver to use, possible values: GaussSeidel SOR CG +omega = 1.6 # overrelaxation factor, only for SOR solver +epsilon = 1e-5 # tolerance for 2-norm of residual +maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver diff --git a/input/settings_debug_joni.txt b/input/settings_debug_joni.txt index 5d0dbd3f..187fe9c8 100644 --- a/input/settings_debug_joni.txt +++ b/input/settings_debug_joni.txt @@ -6,8 +6,8 @@ physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 endTime = 10.0 # duration of the simulation re = 1000 # Reynolds number -gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity -gY = 0.0 +gX = -1.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity +gY = 0 # Boundary Conditions Type @@ -20,14 +20,14 @@ BCLeft = NoSlip # NoSlip boundary conditions -NoSlipVelTopX = -0.1 +NoSlipVelTopX = 0 NoSlipVelTopY = 0 NoSlipVelRightX = 0 -NoSlipVelRightY = 0.1 -NoSlipVelBottomX = 0.1 +NoSlipVelRightY = 0 +NoSlipVelBottomX = 0 NoSlipVelBottomY = 0 NoSlipVelLeftX = 0 -NoSlipVelLeftY = -0.1 +NoSlipVelLeftY = 0 # Pressure BoundaryConditions @@ -48,8 +48,8 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap -createDomainfromBitmap = false -pathToBitmap = /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Bitmap/simple2.png +createDomainfromBitmap = true +pathToBitmap = /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Bitmap/drop2.png # Discretization parameters nCellsX = 20 # number of cells in x and y direction diff --git a/src/computation.cpp b/src/computation.cpp index 6db8abc5..57b0e018 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -35,9 +35,9 @@ void Computation::initialize(int argc, char *argv[]) // create boundary and trace // TODO: read particles per cell from settings file - if (settings_.useParticleTracer){ - fluidTracer_ = std::make_shared(settings_.particlesPerCell, discretization_, mask_); - } + // if (settings_.useParticleTracer){ + fluidTracer_ = std::make_shared(100, discretization_, mask_); + // } // std::vector traceX = {1.8}; // std::vector traceY = {1.8}; @@ -94,7 +94,7 @@ void Computation::runSimulation() fluidTracer_->moveParticles(dt_); boundary_->updateBoundary(); // Update velocity without new timestep - // boundary_->setVelocityBoundaryValues(); + boundary_->setVelocityBoundaryValues(); diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index 58f59584..cc1e4509 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -121,18 +121,19 @@ void FluidTracer::moveParticles(double dt) { std::array newIdx = updateParticle(i, idx, dt, vel); currentParticlesPerCell_[newIdx[0] + newIdx[1] * mask_->size()[0]] += 1; + (*mask_)(newIdx[0], newIdx[1]) = Mask::FLUID; } - int threshold = getThresholdParticlesFluidCell(); + // int threshold = getThresholdParticlesFluidCell(); - for (int i = 0; i < mask_->size()[0]; i++){ - for (int j = 0; j < mask_->size()[1]; j++){ - if (currentParticlesPerCell_[i + j * mask_->size()[0]] >= threshold){ - (*mask_)(i, j) = Mask::FLUID; - } - } - } + // for (int i = 0; i < mask_->size()[0]; i++){ + // for (int j = 0; j < mask_->size()[1]; j++){ + // if (currentParticlesPerCell_[i + j * mask_->size()[0]] >= threshold){ + // (*mask_)(i, j) = Mask::FLUID; + // } + // } + // } // std::cout<< "Threshold: " << threshold << std::endl; // Update BC in mask mask_->setFluidBC(); From 1e7e11ba5ad106dde71a9fa56ac66fa93fab3abd Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Tue, 6 Feb 2024 09:09:25 +0100 Subject: [PATCH 50/67] [update setVelocitySurfaceBC] prioritizes continuity --- input/settings_debug_joni.txt | 10 +- src/boundary/boundary.cpp | 242 ++++++++++++++++++++-------------- src/computation.cpp | 2 +- src/computation.h | 1 + src/storage/array2D.cpp | 6 + 5 files changed, 157 insertions(+), 104 deletions(-) diff --git a/input/settings_debug_joni.txt b/input/settings_debug_joni.txt index 187fe9c8..526dd7d5 100644 --- a/input/settings_debug_joni.txt +++ b/input/settings_debug_joni.txt @@ -5,9 +5,9 @@ physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 endTime = 10.0 # duration of the simulation -re = 1000 # Reynolds number -gX = -1.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity -gY = 0 +re = 100 # Reynolds number +gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity +gY = -10.0 # Boundary Conditions Type @@ -49,7 +49,7 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap createDomainfromBitmap = true -pathToBitmap = /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Bitmap/drop2.png +pathToBitmap = /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Bitmap/drop3.png # Discretization parameters nCellsX = 20 # number of cells in x and y direction @@ -58,7 +58,7 @@ nCellsY = 20 useDonorCell = true # if donor cell discretization should be used, possible values: true false alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences tau = 0.5 # safety factor for time step width -maximumDt = 0.01 # maximum values for time step width +maximumDt = 0.005 # maximum values for time step width # Solver parameters pressureSolver = SOR # which pressure solver to use, possible values: GaussSeidel SOR CG diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 7e95c702..4bd499fa 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -127,6 +127,8 @@ void Boundary::setPressureSurfaceBC() // u and v must be updated before p + + // NORMAL STRESS switch((*mask_)(i, j)){ case Mask::FLUID_BORDER_LEFT: discretization_->p(i, j) = 2/settings_.re*(discretization_->u(i, j) - discretization_->u(i - 1, j))/dx; @@ -350,115 +352,137 @@ void Boundary::setVelocitySurfaceBC(){ switch ((*mask_)(i, j)) { case Mask::FLUID_BORDER_LEFT: - // u + // u - CONTINUITY discretization_->u(i - 1, j) = discretization_->u(i, j) + dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); - // v - discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) - + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + // v - TANGENTIAL + if (mask_->isAir(i - 1, j - 1)){ + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + } break; case Mask::FLUID_BORDER_TOP: - // v + // v - CONTINUITY discretization_->v(i, j) = discretization_->v(i, j - 1) + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); - // u - discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + // u - TANGENTIAL + if (mask_->isAir(i - 1, j + 1)){ + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) + - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + } break; case Mask::FLUID_BORDER_RIGHT: - // u + // u - CONTINUITY discretization_->u(i, j) = discretization_->u(i - 1, j) - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); - // v - discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) - + dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + // v - TANGENTIAL + if (mask_->isAir(i + 1, j - 1)){ + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) + + dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + } break; case Mask::FLUID_BORDER_BOTTOM: - // v + // v - CONTINUITY discretization_->v(i, j - 1) = discretization_->v(i, j) + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); - // u - discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) - + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); + // u - TANGENTIAL + if (mask_->isAir(i - 1, j - 1)){ + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); + } break; case Mask::FLUID_CORNER_TOP_LEFT: - // u + // u & v - CONTINUITY (CHAIN) discretization_->u(i - 1, j) = discretization_->u(i, j); - // v discretization_->v(i, j) = discretization_->v(i, j - 1); - discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) - + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); - if (mask_->isAir(i - 1, j + 1)) + if (mask_->isAir(i - 1, j + 1)) { discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); // chain, u(i, j) is equvivalent discretization_->v(i - 1, j) = discretization_->v(i, j); + } + + // v - TANGENTIAL + if (mask_->isAir(i - 1, j - 1)) { + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + + } break; case Mask::FLUID_CORNER_TOP_RIGHT: - // u + // u & v - CONTINUITY (CHAIN) discretization_->u(i, j) = discretization_->u(i - 1, j); - discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); - // v discretization_->v(i, j) = discretization_->v(i, j - 1); - discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) - - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); if (mask_->isAir(i + 1, j + 1)){ discretization_->u(i, j + 1) = discretization_->u(i, j); discretization_->v(i + 1, j) = discretization_->v(i, j); - } break; + } + + // u & v - TANGENTIAL + if (mask_->isAir(i - 1, j + 1)) { + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) + - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + } + if (mask_->isAir(i + 1, j - 1)){ + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) + - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + } + break; case Mask::FLUID_CORNER_BOTTOM_RIGHT: - // u + // u & v - CONTINUITY (CHAIN) discretization_->u(i, j) = discretization_->u(i - 1, j); - discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) - + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); - // v discretization_->v(i, j - 1) = discretization_->v(i, j); if (mask_->isAir(i + 1, j - 1)){ discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); discretization_->u(i, j - 1) = discretization_->u(i, j); - } break; + } + + // u - TANGENTIAL + if (mask_->isAir(i - 1, j - 1)) { + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); + } + break; case Mask::FLUID_CORNER_BOTTOM_LEFT: - // u + // u & v - CONTINUITY (CHAIN) discretization_->u(i - 1, j) = discretization_->u(i, j); - // v discretization_->v(i, j - 1) = discretization_->v(i, j); if (mask_->isAir(i - 1, j - 1)) { discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); - - } break; + } + break; case Mask::FLUID_COLUMN_HORIZONTAL: - // v - discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; - discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; - // u - if (mask_->isAir(i - 1, j + 1)){ - discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); - } - if (mask_->isAir(i - 1, j - 1)){ - discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) - + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); - } + // // v + // discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; + // discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; + // // u + // if (mask_->isAir(i - 1, j + 1)){ + // discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) + // - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + // } + // if (mask_->isAir(i - 1, j - 1)){ + // discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + // + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); + // } break; case Mask::FLUID_COLUMN_VERTICAL: - // u - discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; - discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; - - if (mask_->isAir(i - 1, j - 1)){ - discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) - + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); - } - if (mask_->isAir(i + 1, j - 1)){ - discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) - - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); - } + // // u + // discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; + // discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; + + // if (mask_->isAir(i - 1, j - 1)){ + // discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + // + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + // } + // if (mask_->isAir(i + 1, j - 1)){ + // discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) + // - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + // } break; case Mask::FLUID_SINGLE_LEFT: // // v @@ -602,88 +626,110 @@ void Boundary::setVelocitySurfaceBC(double dt){ switch ((*mask_)(i, j)) { case Mask::FLUID_BORDER_LEFT: - // u + // u - CONTINUITY discretization_->u(i - 1, j) = discretization_->u(i, j) + dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); - // v - discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) - + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + // v - TANGENTIAL + if (mask_->isAir(i - 1, j - 1)){ + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + } break; case Mask::FLUID_BORDER_TOP: - // v + // v - CONTINUITY discretization_->v(i, j) = discretization_->v(i, j - 1) + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); - // u - discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + // u - TANGENTIAL + if (mask_->isAir(i - 1, j + 1)){ + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) + - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + } break; case Mask::FLUID_BORDER_RIGHT: - // u + // u - CONTINUITY discretization_->u(i, j) = discretization_->u(i - 1, j) - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); - // v - discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) - + dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + // v - TANGENTIAL + if (mask_->isAir(i + 1, j - 1)){ + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) + + dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + } break; case Mask::FLUID_BORDER_BOTTOM: - // v + // v - CONTINUITY discretization_->v(i, j - 1) = discretization_->v(i, j) + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); - // u - discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) - + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); + // u - TANGENTIAL + if (mask_->isAir(i - 1, j - 1)){ + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); + } break; case Mask::FLUID_CORNER_TOP_LEFT: - // u + // u & v - CONTINUITY (CHAIN) discretization_->u(i - 1, j) = discretization_->u(i, j); - // v discretization_->v(i, j) = discretization_->v(i, j - 1); - discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) - + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); - if (mask_->isAir(i - 1, j + 1)) + if (mask_->isAir(i - 1, j + 1)) { discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); // chain, u(i, j) is equvivalent discretization_->v(i - 1, j) = discretization_->v(i, j); + } + + // v - TANGENTIAL + if (mask_->isAir(i - 1, j - 1)) { + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + + } break; case Mask::FLUID_CORNER_TOP_RIGHT: - // u + // u & v - CONTINUITY (CHAIN) discretization_->u(i, j) = discretization_->u(i - 1, j); - discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); - // v discretization_->v(i, j) = discretization_->v(i, j - 1); - discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) - - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); if (mask_->isAir(i + 1, j + 1)){ discretization_->u(i, j + 1) = discretization_->u(i, j); discretization_->v(i + 1, j) = discretization_->v(i, j); - } break; + } + + // u & v - TANGENTIAL + if (mask_->isAir(i - 1, j + 1)) { + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) + - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + } + if (mask_->isAir(i + 1, j - 1)){ + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) + - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + } + break; case Mask::FLUID_CORNER_BOTTOM_RIGHT: - // u + // u & v - CONTINUITY (CHAIN) discretization_->u(i, j) = discretization_->u(i - 1, j); - discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) - + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); - // v discretization_->v(i, j - 1) = discretization_->v(i, j); if (mask_->isAir(i + 1, j - 1)){ discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); discretization_->u(i, j - 1) = discretization_->u(i, j); - } break; + } + + // u - TANGENTIAL + if (mask_->isAir(i - 1, j - 1)) { + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); + } + break; case Mask::FLUID_CORNER_BOTTOM_LEFT: - // u + // u & v - CONTINUITY (CHAIN) discretization_->u(i - 1, j) = discretization_->u(i, j); - // v discretization_->v(i, j - 1) = discretization_->v(i, j); if (mask_->isAir(i - 1, j - 1)) { discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); - - } break; + } + break; case Mask::FLUID_COLUMN_HORIZONTAL: // v discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; diff --git a/src/computation.cpp b/src/computation.cpp index 57b0e018..00850b52 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -1,6 +1,6 @@ #include "computation.h" -#include "surface/fluid_tracer.h" +#include "surface/fluid_tracer.h" #include void Computation::initialize(int argc, char *argv[]) diff --git a/src/computation.h b/src/computation.h index 258d70fa..20da0e37 100644 --- a/src/computation.h +++ b/src/computation.h @@ -21,6 +21,7 @@ #include #include + /** * @class Computation * @brief Computation of Simulation diff --git a/src/storage/array2D.cpp b/src/storage/array2D.cpp index 073f9e85..c628b27f 100644 --- a/src/storage/array2D.cpp +++ b/src/storage/array2D.cpp @@ -1,5 +1,7 @@ #include "array2D.h" +#include + Array2D::Array2D(std::array size) : size_(size) { assert(size[0] > 0 && size[1] > 0); @@ -23,6 +25,10 @@ double Array2D::operator()(int i, int j) const const int index = j * size_[0] + i; // Assert that indices are inside size of array + if (i < 0 || i >= size_[0]) + { + std::cout << "i: " << i << " size: " << size_[0] << std::endl; + } assert(0 <= i && i < size_[0]); assert(0 <= j && j < size_[1]); assert(j * size_[0] + i < (int)data_.size()); From ffab3c89d974f9477f987bc04b47ed9d7a545797 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Tue, 6 Feb 2024 12:05:21 +0100 Subject: [PATCH 51/67] update SINGLE and DROPLET Vel before lunch --- src/boundary/boundary.cpp | 499 +++++++++++------------------------ src/boundary/boundary.h | 4 +- src/surface/fluid_tracer.cpp | 1 + 3 files changed, 151 insertions(+), 353 deletions(-) diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 4bd499fa..3d1262a4 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -333,307 +333,101 @@ void Boundary::setVelocityObstacleBC() } } -void Boundary::setVelocitySurfaceBC(){ - double dxByDy = discretization_->dx() / discretization_->dy(); - double dyByDx = discretization_->dy() / discretization_->dx(); - // Should the dt update step happen here? Then per loop only one execution is allowed - double dt = 1; - - for (int idx : fluidBoundaryCells_) - { - int i = idx % mask_->size()[0]; - int j = idx / mask_->size()[0]; - - // should be solved in the following order: - // from left to right (increasing i) - // from bottom to top (increasing j) - - - switch ((*mask_)(i, j)) { - case Mask::FLUID_BORDER_LEFT: - // u - CONTINUITY - discretization_->u(i - 1, j) = discretization_->u(i, j) - + dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); - - // v - TANGENTIAL - if (mask_->isAir(i - 1, j - 1)){ - discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) - + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); +void Boundary::setAirCellsZero() { + for (int i = 1; i < mask_->size()[0] - 1; i++) { + for (int j = 1; j < mask_->size()[1] - 1; j++) { + if (mask_->isAir(i, j)) { + discretization_->p(i, j) = 0; + discretization_->u(i, j) = 0; + discretization_->v(i, j) = 0; + discretization_->f(i, j) = 0; + discretization_->g(i, j) = 0; + discretization_->rhs(i, j) = 0; } - break; + } + } +} - case Mask::FLUID_BORDER_TOP: - // v - CONTINUITY - discretization_->v(i, j) = discretization_->v(i, j - 1) - + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); +void Boundary::updateVelocitySurfaceBC(double dt){ - // u - TANGENTIAL - if (mask_->isAir(i - 1, j + 1)){ - discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); - } - break; - case Mask::FLUID_BORDER_RIGHT: - // u - CONTINUITY - discretization_->u(i, j) = discretization_->u(i - 1, j) - - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); + for (int idx : fluidBoundaryCells_){ - // v - TANGENTIAL - if (mask_->isAir(i + 1, j - 1)){ - discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) - + dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); - } - break; - case Mask::FLUID_BORDER_BOTTOM: - // v - CONTINUITY - discretization_->v(i, j - 1) = discretization_->v(i, j) - + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); - - // u - TANGENTIAL - if (mask_->isAir(i - 1, j - 1)){ - discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) - + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); - } - break; - case Mask::FLUID_CORNER_TOP_LEFT: - // u & v - CONTINUITY (CHAIN) - discretization_->u(i - 1, j) = discretization_->u(i, j); - discretization_->v(i, j) = discretization_->v(i, j - 1); - if (mask_->isAir(i - 1, j + 1)) { - discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); // chain, u(i, j) is equvivalent - discretization_->v(i - 1, j) = discretization_->v(i, j); - } - - // v - TANGENTIAL - if (mask_->isAir(i - 1, j - 1)) { - discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) - + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); - - } - break; - case Mask::FLUID_CORNER_TOP_RIGHT: - // u & v - CONTINUITY (CHAIN) - discretization_->u(i, j) = discretization_->u(i - 1, j); - discretization_->v(i, j) = discretization_->v(i, j - 1); - if (mask_->isAir(i + 1, j + 1)){ - discretization_->u(i, j + 1) = discretization_->u(i, j); - discretization_->v(i + 1, j) = discretization_->v(i, j); - } + int i = idx % mask_->size()[0]; + int j = idx / mask_->size()[0]; - // u & v - TANGENTIAL - if (mask_->isAir(i - 1, j + 1)) { - discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); - } - if (mask_->isAir(i + 1, j - 1)){ - discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) - - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); - } - break; - case Mask::FLUID_CORNER_BOTTOM_RIGHT: - // u & v - CONTINUITY (CHAIN) - discretization_->u(i, j) = discretization_->u(i - 1, j); - discretization_->v(i, j - 1) = discretization_->v(i, j); - if (mask_->isAir(i + 1, j - 1)){ - discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); - discretization_->u(i, j - 1) = discretization_->u(i, j); - } + switch ((*mask_)(i, j)){ + case Mask::FLUID_COLUMN_HORIZONTAL: + discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; + discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; + break; + case Mask::FLUID_COLUMN_VERTICAL: + discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; + discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; + break; + case Mask::FLUID_SINGLE_LEFT: + // v + discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; + discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; + break; + - // u - TANGENTIAL - if (mask_->isAir(i - 1, j - 1)) { - discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) - + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); - } - break; - case Mask::FLUID_CORNER_BOTTOM_LEFT: - // u & v - CONTINUITY (CHAIN) - discretization_->u(i - 1, j) = discretization_->u(i, j); - discretization_->v(i, j - 1) = discretization_->v(i, j); - if (mask_->isAir(i - 1, j - 1)) - { - discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); - discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); - } - break; - case Mask::FLUID_COLUMN_HORIZONTAL: - // // v - // discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; - // discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; - // // u - // if (mask_->isAir(i - 1, j + 1)){ - // discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - // - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); - // } - // if (mask_->isAir(i - 1, j - 1)){ - // discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) - // + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); - // } - break; - case Mask::FLUID_COLUMN_VERTICAL: - // // u - // discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; - // discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; - - // if (mask_->isAir(i - 1, j - 1)){ - // discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) - // + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); - // } - // if (mask_->isAir(i + 1, j - 1)){ - // discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) - // - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); - // } - break; - case Mask::FLUID_SINGLE_LEFT: - // // v - // discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; - // discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; - // // u - // discretization_->u(i - 1, j) = discretization_->u(i, j) - // + dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); - // // others - // if (mask_->isAir(i - 1, j + 1)){ - // discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); - // discretization_->v(i - 1, j) = discretization_->v(i, j); - // } - // if (mask_->isAir(i - 1, j - 1)){ - // discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); - // discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); - // } - break; - case Mask::FLUID_SINGLE_TOP: - // // u - // discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; - // discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; - // // v - // discretization_->v(i, j) = discretization_->v(i, j - 1) - // - dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); - // // others - // if (mask_->isAir(i - 1, j + 1)){ - // discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); - // discretization_->v(i - 1, j) = discretization_->v(i, j); - // } - // if (mask_->isAir(i + 1, j + 1)){ - // discretization_->u(i, j + 1) = discretization_->u(i, j); - // discretization_->v(i + 1, j) = discretization_->v(i, j); - // } - - // // Tangential stress condition - // if (mask_->isAir(i - 1, j - 1)){ - // discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) - // + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); - // } - // if (mask_->isAir(i + 1, j - 1)){ - // discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) - // - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); - // } - break; - case Mask::FLUID_SINGLE_RIGHT: - // // v - // discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; - // discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; - - // // u - // discretization_->u(i, j) = discretization_->u(i - 1, j) - // - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); - // // others - // if (mask_->isAir(i + 1, j + 1)){ - // discretization_->u(i, j + 1) = discretization_->u(i, j); - // discretization_->v(i + 1, j) = discretization_->v(i, j); - // } - // if (mask_->isAir(i + 1, j - 1)){ - // discretization_->u(i + 1, j - 1) = discretization_->u(i, j); - // discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); - // } - - // // Tangential stress condition - // if (mask_->isAir(i - 1, j - 1)){ - // discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) - // + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); - // } - // if (mask_->isAir(i - 1, j + 1)){ - // discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - // - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); - // } + case Mask::FLUID_SINGLE_BOTTOM: + // u + discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; + discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; + break; + + case Mask::FLUID_SINGLE_TOP: + // u + discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; + discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; + break; + case Mask::FLUID_SINGLE_RIGHT: + // v + discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; + discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; + case Mask::FLUID_DROPLET: + // u + discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; + discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; + // v + discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; + discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; + break; + default: + std::cout << " AHA " << std::endl; + break; - break; - case Mask::FLUID_SINGLE_BOTTOM: - // // u - // discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; - // discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; - // // v - // discretization_->v(i, j - 1) = discretization_->v(i, j) - // + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); - // // others - // if (mask_->isAir(i - 1, j - 1)){ - // discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); - // discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); - // } - // if (mask_->isAir(i + 1, j - 1)){ - // discretization_->u(i, j - 1) = discretization_->u(i, j); - // discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); - // } - break; - case Mask::FLUID_DROPLET: - // // u - // discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; - // discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; - // // v - // discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; - // discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; - - // // others - // if (mask_->isAir(i - 1, j - 1)){ - // discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); - // discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); - // } - // if (mask_->isAir(i - 1, j + 1)){ - // discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); - // discretization_->v(i - 1, j) = discretization_->v(i, j); - // } - // if (mask_->isAir(i + 1, j + 1)){ - // discretization_->u(i, j + 1) = discretization_->u(i, j); - // discretization_->v(i + 1, j) = discretization_->v(i, j); - // } - // if (mask_->isAir(i + 1, j - 1)){ - // discretization_->u(i, j - 1) = discretization_->u(i, j); - // discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); - // } - break; - default: - std::cout << "ERROR" << (*mask_)(i, j) << "i" << i << " j " << j << std::endl; - } + } } } - - -void Boundary::setVelocitySurfaceBC(double dt){ +void Boundary::setVelocitySurfaceBC(){ double dxByDy = discretization_->dx() / discretization_->dy(); double dyByDx = discretization_->dy() / discretization_->dx(); // Should the dt update step happen here? Then per loop only one execution is allowed - + for (int idx : fluidBoundaryCells_) { int i = idx % mask_->size()[0]; int j = idx / mask_->size()[0]; - - // should be solved in the following order: - // from left to right (increasing i) - // from bottom to top (increasing j) - switch ((*mask_)(i, j)) { case Mask::FLUID_BORDER_LEFT: // u - CONTINUITY discretization_->u(i - 1, j) = discretization_->u(i, j) + dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); + // f + discretization_->f(i - 1, j) = discretization_->u(i - 1, j); // v - TANGENTIAL if (mask_->isAir(i - 1, j - 1)){ discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + // g + discretization_->g(i - 1, j - 1) = discretization_->v(i - 1, j - 1); } break; @@ -641,39 +435,52 @@ void Boundary::setVelocitySurfaceBC(double dt){ // v - CONTINUITY discretization_->v(i, j) = discretization_->v(i, j - 1) + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); + // f + discretization_->f(i, j) = discretization_->u(i, j); // u - TANGENTIAL if (mask_->isAir(i - 1, j + 1)){ discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); + // g + discretization_->g(i - 1, j + 1) = discretization_->v(i - 1, j + 1); } break; case Mask::FLUID_BORDER_RIGHT: // u - CONTINUITY discretization_->u(i, j) = discretization_->u(i - 1, j) - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); + // f + discretization_->f(i, j) = discretization_->u(i, j); // v - TANGENTIAL if (mask_->isAir(i + 1, j - 1)){ discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) + dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + // g + discretization_->g(i + 1, j - 1) = discretization_->v(i + 1, j - 1); } break; case Mask::FLUID_BORDER_BOTTOM: // v - CONTINUITY discretization_->v(i, j - 1) = discretization_->v(i, j) + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); + // g + discretization_->g(i, j - 1) = discretization_->v(i, j - 1); // u - TANGENTIAL if (mask_->isAir(i - 1, j - 1)){ discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); + // f + discretization_->f(i - 1, j - 1) = discretization_->u(i - 1, j - 1); } break; case Mask::FLUID_CORNER_TOP_LEFT: - // u & v - CONTINUITY (CHAIN) + // u & v - CONTINUITY and TANGENTIAL -> 0 derivative discretization_->u(i - 1, j) = discretization_->u(i, j); discretization_->v(i, j) = discretization_->v(i, j - 1); + if (mask_->isAir(i - 1, j + 1)) { discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); // chain, u(i, j) is equvivalent discretization_->v(i - 1, j) = discretization_->v(i, j); @@ -687,7 +494,7 @@ void Boundary::setVelocitySurfaceBC(double dt){ } break; case Mask::FLUID_CORNER_TOP_RIGHT: - // u & v - CONTINUITY (CHAIN) + // u & v - CONTINUITY and TANGENTIAL -> 0 derivative discretization_->u(i, j) = discretization_->u(i - 1, j); discretization_->v(i, j) = discretization_->v(i, j - 1); if (mask_->isAir(i + 1, j + 1)){ @@ -706,7 +513,7 @@ void Boundary::setVelocitySurfaceBC(double dt){ } break; case Mask::FLUID_CORNER_BOTTOM_RIGHT: - // u & v - CONTINUITY (CHAIN) + // u & v - CONTINUITY and TANGENTIAL -> 0 derivative discretization_->u(i, j) = discretization_->u(i - 1, j); discretization_->v(i, j - 1) = discretization_->v(i, j); if (mask_->isAir(i + 1, j - 1)){ @@ -721,7 +528,7 @@ void Boundary::setVelocitySurfaceBC(double dt){ } break; case Mask::FLUID_CORNER_BOTTOM_LEFT: - // u & v - CONTINUITY (CHAIN) + // u & v - CONTINUITY and TANGENTIAL -> 0 derivative discretization_->u(i - 1, j) = discretization_->u(i, j); discretization_->v(i, j - 1) = discretization_->v(i, j); if (mask_->isAir(i - 1, j - 1)) @@ -731,10 +538,9 @@ void Boundary::setVelocitySurfaceBC(double dt){ } break; case Mask::FLUID_COLUMN_HORIZONTAL: - // v - discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; - discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; - // u + // v - ONLY SUBJECT TO GRAVITY -> no update necessary + + // u - TANGENTIAL if (mask_->isAir(i - 1, j + 1)){ discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); @@ -745,10 +551,9 @@ void Boundary::setVelocitySurfaceBC(double dt){ } break; case Mask::FLUID_COLUMN_VERTICAL: - // u - discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; - discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; + // u - ONLY SUBJECT TO GRAVITY -> no update necessary + // v - TANGENTIAL if (mask_->isAir(i - 1, j - 1)){ discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); @@ -759,68 +564,22 @@ void Boundary::setVelocitySurfaceBC(double dt){ } break; case Mask::FLUID_SINGLE_LEFT: - // v - discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; - discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; - // u - discretization_->u(i - 1, j) = discretization_->u(i, j) - + dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); - // others - if (mask_->isAir(i - 1, j + 1)){ - discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); - discretization_->v(i - 1, j) = discretization_->v(i, j); - } - if (mask_->isAir(i - 1, j - 1)){ - discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); - discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); - } - break; - case Mask::FLUID_SINGLE_TOP: - // u - discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; - discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; - // v - discretization_->v(i, j) = discretization_->v(i, j - 1) - - dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); - // others - if (mask_->isAir(i - 1, j + 1)){ - discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); - discretization_->v(i - 1, j) = discretization_->v(i, j); - } - if (mask_->isAir(i + 1, j + 1)){ - discretization_->u(i, j + 1) = discretization_->u(i, j); - discretization_->v(i + 1, j) = discretization_->v(i, j); - } + // v - ONLY SUBJECT TO GRAVITY -> no update necessary - // Tangential stress condition - if (mask_->isAir(i - 1, j - 1)){ - discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) - + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); - } - if (mask_->isAir(i + 1, j - 1)){ - discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) - - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); - } - break; - case Mask::FLUID_SINGLE_RIGHT: - // v - discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; - discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; - - // u + // u - CONTINUITY discretization_->u(i, j) = discretization_->u(i - 1, j) - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); - // others + // CHAIN if (mask_->isAir(i + 1, j + 1)){ discretization_->u(i, j + 1) = discretization_->u(i, j); discretization_->v(i + 1, j) = discretization_->v(i, j); } if (mask_->isAir(i + 1, j - 1)){ - discretization_->u(i + 1, j - 1) = discretization_->u(i, j); + discretization_->u(i, j - 1) = discretization_->u(i, j); discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); } - // Tangential stress condition + // u - TANGENTIAL if (mask_->isAir(i - 1, j - 1)){ discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); @@ -829,16 +588,13 @@ void Boundary::setVelocitySurfaceBC(double dt){ discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); } - break; - case Mask::FLUID_SINGLE_BOTTOM: - // u - discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; - discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; - // v + case Mask::FLUID_SINGLE_TOP: + // v - CONTINUITY discretization_->v(i, j - 1) = discretization_->v(i, j) + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); - // others + + // CHAIN if (mask_->isAir(i - 1, j - 1)){ discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); @@ -847,16 +603,57 @@ void Boundary::setVelocitySurfaceBC(double dt){ discretization_->u(i, j - 1) = discretization_->u(i, j); discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); } + + // Tangential stress is calculated by TOP cell + break; + case Mask::FLUID_SINGLE_RIGHT: + // v - ONLY SUBJECT TO GRAVITY -> no update necessary + + // u - CONTINUITY + discretization_->u(i - 1, j) = discretization_->u(i, j) + + dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); + + // Chain + if (mask_->isAir(i - 1, j - 1)){ + discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); + } + if (mask_->isAir(i - 1, j + 1)){ + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); + discretization_->v(i - 1, j) = discretization_->v(i, j); + } + + // Tangential stress is calculated by RIGHT cell + break; + case Mask::FLUID_SINGLE_BOTTOM: + // u - ONLY SUBJECT TO GRAVITY -> no update necessary + + // v - CONTINUITY + discretization_->v(i, j) = discretization_->v(i, j - 1) + - dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); + + // CHAIN + if (mask_->isAir(i - 1, j + 1)){ + discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); + discretization_->v(i - 1, j) = discretization_->v(i, j); + } + if (mask_->isAir(i + 1, j + 1)){ + discretization_->u(i, j + 1) = discretization_->u(i, j); + discretization_->v(i + 1, j) = discretization_->v(i, j); + } + + // v - TANGENTIAL + if (mask_->isAir(i - 1, j - 1)){ + discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); + } + if (mask_->isAir(i + 1, j - 1)){ + discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) + - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); + } break; case Mask::FLUID_DROPLET: - // u - discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; - discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; - // v - discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; - discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; - - // others + // CHAIN if (mask_->isAir(i - 1, j - 1)){ discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); @@ -875,11 +672,8 @@ void Boundary::setVelocitySurfaceBC(double dt){ } break; default: - std::cout << "ERROR" << std::endl; - break; + std::cout << "ERROR" << (*mask_)(i, j) << "i" << i << " j " << j << std::endl; } - - } } @@ -890,6 +684,7 @@ void Boundary::setVelocitySurfaceBC(double dt){ + bool Boundary::doCalculateF(int i, int j) const { if (mask_->isFluid(i, j) && mask_->isFluid(i + 1, j)){ return true; diff --git a/src/boundary/boundary.h b/src/boundary/boundary.h index 87dfc016..2f461568 100644 --- a/src/boundary/boundary.h +++ b/src/boundary/boundary.h @@ -33,7 +33,9 @@ class Boundary void setVelocityDomainBC(); void setVelocityObstacleBC(); void setVelocitySurfaceBC(); - void setVelocitySurfaceBC(double dt); + + void updateVelocitySurfaceBC(double dt); + void setAirCellsZero(); std::shared_ptr discretization_; diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index cc1e4509..b79a4aa2 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -121,6 +121,7 @@ void FluidTracer::moveParticles(double dt) { std::array newIdx = updateParticle(i, idx, dt, vel); currentParticlesPerCell_[newIdx[0] + newIdx[1] * mask_->size()[0]] += 1; + // TODO: uncomment this if threshold instead of singleParticle (*mask_)(newIdx[0], newIdx[1]) = Mask::FLUID; } From 409cc308851988a0fb8a47febf7cbd6dbb5b2550 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Tue, 6 Feb 2024 20:25:16 +0100 Subject: [PATCH 52/67] [read in settings FluidTracer] --- build.sh | 1 + input/settings_damBreak.txt | 2 +- input/settings_debug_joni.txt | 10 ++- src/boundary/boundary.cpp | 146 +++++++++++++------------------ src/boundary/boundary.h | 5 +- src/computation.cpp | 55 +++++++----- src/settings_parser/settings.cpp | 34 +++++-- src/settings_parser/settings.h | 14 +++ src/surface/fluid_tracer.cpp | 39 +++++---- src/surface/fluid_tracer.h | 2 +- 10 files changed, 169 insertions(+), 139 deletions(-) diff --git a/build.sh b/build.sh index f05a92da..14aefc47 100755 --- a/build.sh +++ b/build.sh @@ -18,6 +18,7 @@ fi make install -j4 ./numsim ../input/settings_debug_joni.txt +# ./numsim ../input/settings_damBreak.txt diff --git a/input/settings_damBreak.txt b/input/settings_damBreak.txt index aaedba3d..8f470a58 100644 --- a/input/settings_damBreak.txt +++ b/input/settings_damBreak.txt @@ -58,7 +58,7 @@ nCellsY = 100 useDonorCell = true # if donor cell discretization should be used, possible values: true false alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences tau = 0.5 # safety factor for time step width -maximumDt = 0.1 # maximum values for time step width +maximumDt = 0.005 # maximum values for time step width # Solver parameters pressureSolver = SOR # which pressure solver to use, possible values: GaussSeidel SOR CG diff --git a/input/settings_debug_joni.txt b/input/settings_debug_joni.txt index 526dd7d5..3a240a81 100644 --- a/input/settings_debug_joni.txt +++ b/input/settings_debug_joni.txt @@ -7,7 +7,7 @@ physicalSizeY = 2.0 endTime = 10.0 # duration of the simulation re = 100 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity -gY = -10.0 +gY = -0.5 # Boundary Conditions Type @@ -58,10 +58,16 @@ nCellsY = 20 useDonorCell = true # if donor cell discretization should be used, possible values: true false alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences tau = 0.5 # safety factor for time step width -maximumDt = 0.005 # maximum values for time step width +maximumDt = 0.0005 # maximum values for time step width # Solver parameters pressureSolver = SOR # which pressure solver to use, possible values: GaussSeidel SOR CG omega = 1.6 # overrelaxation factor, only for SOR solver epsilon = 1e-5 # tolerance for 2-norm of residual maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver + +# Particle Tracker +useFluidTracer = true +particlePerCell = 100 +fluidTracerMethod = single + diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 3d1262a4..cc3ee880 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -24,13 +24,6 @@ void Boundary::createBoundaryCellsLists() } } -void Boundary::setPressureBoundaryValues() -{ - setPressureSurfaceBC(); - setPressureDomainBC(); - setPressureObstacleBC(); -} - void Boundary::updateBoundary(){ fluidBoundaryCells_ = {}; for (int i = 0; i < mask_->size()[0]; i++) { @@ -42,6 +35,13 @@ void Boundary::updateBoundary(){ } } +void Boundary::setPressureBoundaryValues() +{ + setPressureDomainBC(); + setPressureObstacleBC(); +} + + void Boundary::setPressureDomainBC() { for (int idx : domainBoundaryCells_) @@ -143,35 +143,36 @@ void Boundary::setPressureSurfaceBC() discretization_->p(i, j) = 2/settings_.re*(discretization_->v(i, j) - discretization_->v(i, j - 1))/dy; break; case Mask::FLUID_CORNER_TOP_LEFT: + // the same calculation for all CORNERS discretization_->p(i, j) = -1/(2 * settings_.re) * ( 1/(2*dy) * (discretization_->u(i, j) + discretization_->u(i - 1, j) - +discretization_->u(i, j - 1) - discretization_->u(i - 1, j - 1)) + -discretization_->u(i, j - 1) - discretization_->u(i - 1, j - 1)) + 1/(2*dx) * (discretization_->v(i, j) + discretization_->v(i, j - 1) - +discretization_->v(i - 1, j) - discretization_->v(i - 1, j - 1)) + -discretization_->v(i - 1, j) - discretization_->v(i - 1, j - 1)) ); break; case Mask::FLUID_CORNER_TOP_RIGHT: discretization_->p(i, j) = 1/(2 * settings_.re) * ( 1/(2*dy) * (discretization_->u(i, j) + discretization_->u(i - 1, j) - +discretization_->u(i, j - 1) - discretization_->u(i - 1, j - 1)) + -discretization_->u(i, j - 1) - discretization_->u(i - 1, j - 1)) + 1/(2*dx) * (discretization_->v(i, j) + discretization_->v(i, j - 1) - +discretization_->v(i - 1, j) - discretization_->v(i - 1, j - 1)) + -discretization_->v(i - 1, j) - discretization_->v(i - 1, j - 1)) ); break; case Mask::FLUID_CORNER_BOTTOM_RIGHT: discretization_->p(i, j) =-1/(2 * settings_.re) * ( 1/(2*dy) * (discretization_->u(i, j) + discretization_->u(i - 1, j) - +discretization_->u(i, j - 1) - discretization_->u(i - 1, j - 1)) + -discretization_->u(i, j - 1) - discretization_->u(i - 1, j - 1)) + 1/(2*dx) * (discretization_->v(i, j) + discretization_->v(i, j - 1) - +discretization_->v(i - 1, j) - discretization_->v(i - 1, j - 1)) + -discretization_->v(i - 1, j) - discretization_->v(i - 1, j - 1)) ); break; case Mask::FLUID_CORNER_BOTTOM_LEFT: discretization_->p(i, j) = 1/(2 * settings_.re) * ( 1/(2*dy) * (discretization_->u(i, j) + discretization_->u(i - 1, j) - +discretization_->u(i, j - 1) - discretization_->u(i - 1, j - 1)) - + 1/(2*dy) * (discretization_->v(i, j) + discretization_->v(i, j - 1) - +discretization_->v(i - 1, j) - discretization_->v(i - 1, j - 1)) + -discretization_->u(i, j - 1) - discretization_->u(i - 1, j - 1)) + + 1/(2*dx) * (discretization_->v(i, j) + discretization_->v(i, j - 1) + -discretization_->v(i - 1, j) - discretization_->v(i - 1, j - 1)) ); break; case Mask::FLUID_COLUMN_VERTICAL: @@ -195,22 +196,24 @@ void Boundary::setPressureSurfaceBC() case Mask::FLUID_DROPLET: discretization_->p(i, j) = 0; break; - + default: + std::cout << "ERROR" << std::endl; + break; } } } void Boundary::setVelocityBoundaryValues() { + // setAirCellsZero(); setVelocitySurfaceBC(); setVelocityDomainBC(); setVelocityObstacleBC(); } void Boundary::setVelocityBoundaryValues(double dt){ - setVelocitySurfaceBC(dt); - setVelocityDomainBC(); - setVelocityObstacleBC(); + updateVelocitySurfaceBC(dt); + setVelocityBoundaryValues(); } void Boundary::setVelocityDomainBC() @@ -358,10 +361,12 @@ void Boundary::updateVelocitySurfaceBC(double dt){ switch ((*mask_)(i, j)){ case Mask::FLUID_COLUMN_HORIZONTAL: + // v discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; break; case Mask::FLUID_COLUMN_VERTICAL: + // u discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; break; @@ -370,8 +375,6 @@ void Boundary::updateVelocitySurfaceBC(double dt){ discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; break; - - case Mask::FLUID_SINGLE_BOTTOM: // u discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; @@ -396,9 +399,7 @@ void Boundary::updateVelocitySurfaceBC(double dt){ discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; break; default: - std::cout << " AHA " << std::endl; break; - } } } @@ -419,15 +420,11 @@ void Boundary::setVelocitySurfaceBC(){ // u - CONTINUITY discretization_->u(i - 1, j) = discretization_->u(i, j) + dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); - // f - discretization_->f(i - 1, j) = discretization_->u(i - 1, j); // v - TANGENTIAL - if (mask_->isAir(i - 1, j - 1)){ + if (!mask_->isFluid(i - 1, j - 1)){ discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); - // g - discretization_->g(i - 1, j - 1) = discretization_->v(i - 1, j - 1); } break; @@ -435,41 +432,31 @@ void Boundary::setVelocitySurfaceBC(){ // v - CONTINUITY discretization_->v(i, j) = discretization_->v(i, j - 1) + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); - // f - discretization_->f(i, j) = discretization_->u(i, j); // u - TANGENTIAL - if (mask_->isAir(i - 1, j + 1)){ + if (!mask_->isFluid(i - 1, j + 1)){ discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); - // g - discretization_->g(i - 1, j + 1) = discretization_->v(i - 1, j + 1); } break; case Mask::FLUID_BORDER_RIGHT: // u - CONTINUITY discretization_->u(i, j) = discretization_->u(i - 1, j) - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); - // f - discretization_->f(i, j) = discretization_->u(i, j); // v - TANGENTIAL - if (mask_->isAir(i + 1, j - 1)){ + if (!mask_->isFluid(i + 1, j - 1)){ discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) + dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); - // g - discretization_->g(i + 1, j - 1) = discretization_->v(i + 1, j - 1); } break; case Mask::FLUID_BORDER_BOTTOM: // v - CONTINUITY discretization_->v(i, j - 1) = discretization_->v(i, j) + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); - // g - discretization_->g(i, j - 1) = discretization_->v(i, j - 1); // u - TANGENTIAL - if (mask_->isAir(i - 1, j - 1)){ + if (!mask_->isFluid(i - 1, j - 1)){ discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); // f @@ -481,13 +468,13 @@ void Boundary::setVelocitySurfaceBC(){ discretization_->u(i - 1, j) = discretization_->u(i, j); discretization_->v(i, j) = discretization_->v(i, j - 1); - if (mask_->isAir(i - 1, j + 1)) { + if (!mask_->isFluid(i - 1, j + 1)) { discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); // chain, u(i, j) is equvivalent discretization_->v(i - 1, j) = discretization_->v(i, j); } // v - TANGENTIAL - if (mask_->isAir(i - 1, j - 1)) { + if (!mask_->isFluid(i - 1, j - 1)) { discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); @@ -497,17 +484,17 @@ void Boundary::setVelocitySurfaceBC(){ // u & v - CONTINUITY and TANGENTIAL -> 0 derivative discretization_->u(i, j) = discretization_->u(i - 1, j); discretization_->v(i, j) = discretization_->v(i, j - 1); - if (mask_->isAir(i + 1, j + 1)){ + if (!mask_->isFluid(i + 1, j + 1)){ discretization_->u(i, j + 1) = discretization_->u(i, j); discretization_->v(i + 1, j) = discretization_->v(i, j); } // u & v - TANGENTIAL - if (mask_->isAir(i - 1, j + 1)) { + if (!mask_->isFluid(i - 1, j + 1)) { discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); } - if (mask_->isAir(i + 1, j - 1)){ + if (!mask_->isFluid(i + 1, j - 1)){ discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); } @@ -516,13 +503,13 @@ void Boundary::setVelocitySurfaceBC(){ // u & v - CONTINUITY and TANGENTIAL -> 0 derivative discretization_->u(i, j) = discretization_->u(i - 1, j); discretization_->v(i, j - 1) = discretization_->v(i, j); - if (mask_->isAir(i + 1, j - 1)){ + if (!mask_->isFluid(i + 1, j - 1)){ discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); discretization_->u(i, j - 1) = discretization_->u(i, j); } // u - TANGENTIAL - if (mask_->isAir(i - 1, j - 1)) { + if (!mask_->isFluid(i - 1, j - 1)) { discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); } @@ -531,7 +518,7 @@ void Boundary::setVelocitySurfaceBC(){ // u & v - CONTINUITY and TANGENTIAL -> 0 derivative discretization_->u(i - 1, j) = discretization_->u(i, j); discretization_->v(i, j - 1) = discretization_->v(i, j); - if (mask_->isAir(i - 1, j - 1)) + if (!mask_->isFluid(i - 1, j - 1)) { discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); @@ -541,11 +528,11 @@ void Boundary::setVelocitySurfaceBC(){ // v - ONLY SUBJECT TO GRAVITY -> no update necessary // u - TANGENTIAL - if (mask_->isAir(i - 1, j + 1)){ + if (!mask_->isFluid(i - 1, j + 1)){ discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); } - if (mask_->isAir(i - 1, j - 1)){ + if (!mask_->isFluid(i - 1, j - 1)){ discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); } @@ -554,11 +541,11 @@ void Boundary::setVelocitySurfaceBC(){ // u - ONLY SUBJECT TO GRAVITY -> no update necessary // v - TANGENTIAL - if (mask_->isAir(i - 1, j - 1)){ + if (!mask_->isFluid(i - 1, j - 1)){ discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); } - if (mask_->isAir(i + 1, j - 1)){ + if (!mask_->isFluid(i + 1, j - 1)){ discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); } @@ -570,21 +557,21 @@ void Boundary::setVelocitySurfaceBC(){ discretization_->u(i, j) = discretization_->u(i - 1, j) - dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); // CHAIN - if (mask_->isAir(i + 1, j + 1)){ + if (!mask_->isFluid(i + 1, j + 1)){ discretization_->u(i, j + 1) = discretization_->u(i, j); discretization_->v(i + 1, j) = discretization_->v(i, j); } - if (mask_->isAir(i + 1, j - 1)){ + if (!mask_->isFluid(i + 1, j - 1)){ discretization_->u(i, j - 1) = discretization_->u(i, j); discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); } // u - TANGENTIAL - if (mask_->isAir(i - 1, j - 1)){ + if (!mask_->isFluid(i - 1, j - 1)){ discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) + dyByDx * (discretization_->v(i, j - 1) - discretization_->v(i - 1, j - 1)); } - if (mask_->isAir(i - 1, j + 1)){ + if (!mask_->isFluid(i - 1, j + 1)){ discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j) - dyByDx * (discretization_->v(i, j) - discretization_->v(i - 1, j)); } @@ -595,11 +582,11 @@ void Boundary::setVelocitySurfaceBC(){ + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); // CHAIN - if (mask_->isAir(i - 1, j - 1)){ + if (!mask_->isFluid(i - 1, j - 1)){ discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); } - if (mask_->isAir(i + 1, j - 1)){ + if (!mask_->isFluid(i + 1, j - 1)){ discretization_->u(i, j - 1) = discretization_->u(i, j); discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); } @@ -614,11 +601,11 @@ void Boundary::setVelocitySurfaceBC(){ + dxByDy * (discretization_->v(i, j) - discretization_->v(i, j - 1)); // Chain - if (mask_->isAir(i - 1, j - 1)){ + if (!mask_->isFluid(i - 1, j - 1)){ discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); } - if (mask_->isAir(i - 1, j + 1)){ + if (!mask_->isFluid(i - 1, j + 1)){ discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); discretization_->v(i - 1, j) = discretization_->v(i, j); } @@ -633,40 +620,40 @@ void Boundary::setVelocitySurfaceBC(){ - dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); // CHAIN - if (mask_->isAir(i - 1, j + 1)){ + if (!mask_->isFluid(i - 1, j + 1)){ discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); discretization_->v(i - 1, j) = discretization_->v(i, j); } - if (mask_->isAir(i + 1, j + 1)){ + if (!mask_->isFluid(i + 1, j + 1)){ discretization_->u(i, j + 1) = discretization_->u(i, j); discretization_->v(i + 1, j) = discretization_->v(i, j); } // v - TANGENTIAL - if (mask_->isAir(i - 1, j - 1)){ + if (!mask_->isFluid(i - 1, j - 1)){ discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1) + dxByDy * (discretization_->u(i - 1, j) - discretization_->u(i - 1, j - 1)); } - if (mask_->isAir(i + 1, j - 1)){ + if (!mask_->isFluid(i + 1, j - 1)){ discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1) - dxByDy * (discretization_->u(i, j) - discretization_->u(i, j - 1)); } break; case Mask::FLUID_DROPLET: // CHAIN - if (mask_->isAir(i - 1, j - 1)){ + if (!mask_->isFluid(i - 1, j - 1)){ discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j); discretization_->v(i - 1, j - 1) = discretization_->v(i, j - 1); } - if (mask_->isAir(i - 1, j + 1)){ + if (!mask_->isFluid(i - 1, j + 1)){ discretization_->u(i - 1, j + 1) = discretization_->u(i - 1, j); discretization_->v(i - 1, j) = discretization_->v(i, j); } - if (mask_->isAir(i + 1, j + 1)){ + if (!mask_->isFluid(i + 1, j + 1)){ discretization_->u(i, j + 1) = discretization_->u(i, j); discretization_->v(i + 1, j) = discretization_->v(i, j); } - if (mask_->isAir(i + 1, j - 1)){ + if (!mask_->isFluid(i + 1, j - 1)){ discretization_->u(i, j - 1) = discretization_->u(i, j); discretization_->v(i + 1, j - 1) = discretization_->v(i, j - 1); } @@ -678,25 +665,10 @@ void Boundary::setVelocitySurfaceBC(){ } - - - - - - - bool Boundary::doCalculateF(int i, int j) const { - if (mask_->isFluid(i, j) && mask_->isFluid(i + 1, j)){ - return true; - } else { - return false; - } + return (mask_->isFluid(i, j) && mask_->isFluid(i + 1, j)); } bool Boundary::doCalculateG(int i, int j) const { - if (mask_->isFluid(i, j) && mask_->isFluid(i, j + 1)){ - return true; - } else { - return false; - } + return (mask_->isFluid(i, j) && mask_->isFluid(i, j + 1)); } diff --git a/src/boundary/boundary.h b/src/boundary/boundary.h index 2f461568..4105270d 100644 --- a/src/boundary/boundary.h +++ b/src/boundary/boundary.h @@ -11,6 +11,10 @@ class Boundary public: Boundary(std::shared_ptr mask, std::shared_ptr discretization, Settings settings); void setPressureBoundaryValues(); + + // Only needs to be set once -> no need to update each solver iteration + void setPressureSurfaceBC(); + void setVelocityBoundaryValues(); void setVelocityBoundaryValues(double dt); std::shared_ptr mask_; @@ -26,7 +30,6 @@ class Boundary // Set Pressure void setPressureDomainBC(); void setPressureObstacleBC(); - void setPressureSurfaceBC(); // Set Velocity diff --git a/src/computation.cpp b/src/computation.cpp index 00850b52..db5ff1f3 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -17,12 +17,12 @@ void Computation::initialize(int argc, char *argv[]) // create boundary and tracer mask_ = std::make_shared(settings_); + // Read in nCells from BitMap std::array n_Cells = {mask_->size()[0]-2, mask_->size()[1]-2}; - std::cout << n_Cells[0] << " " << n_Cells[1] << "\n"; + + std::array meshWidth_ = {0.1, 0.1}; - std::array meshWidth_ = {(n_Cells[0]/10.0) / n_Cells[0], - (n_Cells[1]/10.0) / n_Cells[1]}; if (settings_.useDonorCell) { @@ -32,19 +32,10 @@ void Computation::initialize(int argc, char *argv[]) { discretization_ = std::make_shared(n_Cells, meshWidth_); } - - // create boundary and trace - // TODO: read particles per cell from settings file - // if (settings_.useParticleTracer){ - fluidTracer_ = std::make_shared(100, discretization_, mask_); - // } - - // std::vector traceX = {1.8}; - // std::vector traceY = {1.8}; - - + // Boundary boundary_ = std::make_shared(mask_, discretization_, settings_); + if (settings_.pressureSolver == "SOR") { pressureSolver_ = std::make_unique(discretization_, @@ -61,29 +52,41 @@ void Computation::initialize(int argc, char *argv[]) boundary_); } + // Fluid Tracker + if (settings_.useFluidTracer) + { + fluidTracer_ = std::make_shared(settings_.particlePerCell, discretization_, mask_); + } + + + // Output outputWriterParaview_ = std::make_unique(discretization_, mask_, fluidTracer_); outputWriterText_ = std::make_unique(discretization_); } void Computation::runSimulation() { + // setting + double printInterval = 0.005; + + // initialize double currentTime = 0.; + double printTime = 0.; + int stepsBetweenPrints = 0; boundary_->setVelocityBoundaryValues(); + boundary_->setPressureSurfaceBC(); do { - // fluidTracer_->createParticles(0.1, 1.4); - //fluidTracer_->createAndKillParticles(dt_); - // std::cout << "\033[2J\033[1;1H"; #ifndef NDEBUG - // fluidTracer_->printParticles(); + std::cout << settings_.useFluidTracer << settings_.particlePerCell << settings_.fluidTracerMethod << std::endl; // mask_->printMask(); - // usleep(1000000); + usleep(1000000); + std::cout << "\033[2J\033[1;1H"; #endif - computeTimeStepWidth(currentTime); computePreliminaryVelocities(); computeRightHandSide(); @@ -92,14 +95,24 @@ void Computation::runSimulation() boundary_->setVelocityBoundaryValues(dt_); fluidTracer_->moveParticles(dt_); + // TODO: make mask update explicit + boundary_->updateBoundary(); // Update velocity without new timestep boundary_->setVelocityBoundaryValues(); + // surface pressure is fix for one timestep + boundary_->setPressureSurfaceBC(); currentTime += dt_; - outputWriterParaview_->writeFile(currentTime); + if (currentTime > printTime) { + outputWriterParaview_->writeFile(currentTime); + printTime += printInterval; + std::cout << currentTime << " -> write file, took steps: " << stepsBetweenPrints << std::endl; + stepsBetweenPrints = 0; + } + stepsBetweenPrints++; #ifndef NDEBUG outputWriterText_->writeFile(currentTime); diff --git a/src/settings_parser/settings.cpp b/src/settings_parser/settings.cpp index 30a5138a..b7a3c7fa 100644 --- a/src/settings_parser/settings.cpp +++ b/src/settings_parser/settings.cpp @@ -138,21 +138,21 @@ void Settings::setParameter(std::string parameterName, std::string value) } // NoSlip boundary conditions - else if (parameterName == "NoSlipVelTopX") + else if (parameterName == "NoSlipVelTopX" || parameterName == "dirichletTopX") Settings::NoSlipVelTop[0] = atof(value.c_str()); - else if (parameterName == "NoSlipVelTopY") + else if (parameterName == "NoSlipVelTopY" || parameterName == "dirichtelTopY") Settings::NoSlipVelTop[1] = atof(value.c_str()); - else if (parameterName == "NoSlipVelRightX") + else if (parameterName == "NoSlipVelRightX" || parameterName == "dirichtelRightX") Settings::NoSlipVelRight[0] = atof(value.c_str()); - else if (parameterName == "NoSlipVelRightY") + else if (parameterName == "NoSlipVelRightY" || parameterName == "dirichtelRightY") Settings::NoSlipVelRight[1] = atof(value.c_str()); - else if (parameterName == "NoSlipVelBottomX") + else if (parameterName == "NoSlipVelBottomX" || parameterName == "dirichtelBottomX") Settings::NoSlipVelBottom[0] = atof(value.c_str()); - else if (parameterName == "NoSlipVelBottomY") + else if (parameterName == "NoSlipVelBottomY" || parameterName == "dirichtelBottomY") Settings::NoSlipVelBottom[1] = atof(value.c_str()); - else if (parameterName == "NoSlipVelLeftX") + else if (parameterName == "NoSlipVelLeftX" || parameterName == "dirichtelLeftX") Settings::NoSlipVelLeft[0] = atof(value.c_str()); - else if (parameterName == "NoSlipVelLeftY") + else if (parameterName == "NoSlipVelLeftY" || parameterName == "dirichtelLeftY") Settings::NoSlipVelLeft[1] = atof(value.c_str()); // Pressure BoundaryConditions. @@ -234,4 +234,22 @@ void Settings::setParameter(std::string parameterName, std::string value) Settings::epsilon = atof(value.c_str()); else if (parameterName == "maximumNumberOfIterations") Settings::maximumNumberOfIterations = atof(value.c_str()); + + + else if(parameterName == "useFluidTracer") + { + if (value == "true" || value == "True") + Settings::useFluidTracer = true; + else if (value == "false" || value == "False") + Settings::useFluidTracer = false; + else + throw std::invalid_argument("createDomainfromBitmap must be a boolean (true or false)."); + } + else if(parameterName == "particlePerCell") + particlePerCell = atof(value.c_str()); + else if(parameterName == "fluidTracerMethod") + if (value == "single" || value == "threshold") + Settings::fluidTracerMethod = value; + else + throw std::invalid_argument("Supported values for fluidTracerMethod are single and threshold"); } diff --git a/src/settings_parser/settings.h b/src/settings_parser/settings.h index 1def45c5..eae3d06f 100644 --- a/src/settings_parser/settings.h +++ b/src/settings_parser/settings.h @@ -57,6 +57,20 @@ struct Settings double epsilon = 1e-5; //!< tolerance for the residual in the pressure solver int maximumNumberOfIterations = 1e5; //!< maximum number of iterations in the solver + + // Fluid Tracer + bool useFluidTracer = true; //!< Enables Open Surface Evolution + int particlePerCell = 100; //!< Initializes with given virtual particles per cell + /** + * `single` -> one virtual particles is enough for fluid cell + * `threshold` -> aims at a constant amount of fluid cells + */ + std::string fluidTracerMethod = "single"; + + + + // Writer Options + /** * @brief Parse a text file with settings. * diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index b79a4aa2..5910f4ef 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -8,21 +8,24 @@ FluidTracer::FluidTracer(int numParticlesPerCell, discretization_ = discretization; mask_ = mask; - initializeHomogenousParticleDistribution(numParticlesPerCell); -} - -void FluidTracer::initializeHomogenousParticleDistribution(int numParticlesPerCell){ seedRelationDyDx_ = discretization_->dy()/ discretization_->dx(); n_x = static_cast(std::ceil(std::sqrt(numParticlesPerCell/seedRelationDyDx_))); n_y = static_cast(std::ceil(n_x * seedRelationDyDx_)); - numParticlesPerCell_ = n_x * n_y; numParticles_ = numParticlesPerCell_ * mask_->getNumberOfFluidCells(); - + // Resize for speed up x_.resize(numParticles_); y_.resize(numParticles_); + + initializeHomogenousParticleDistribution(); +} + +void FluidTracer::initializeHomogenousParticleDistribution(){ + + currentParticlesPerCell_.resize(mask_->size()[0] * mask_->size()[1]); + numFluidCells_ = 0; int placedParticles = 0; for (int i = 1; i < mask_->size()[0] - 1; i++) { @@ -35,7 +38,8 @@ void FluidTracer::initializeHomogenousParticleDistribution(int numParticlesPerCe } } } - assert(placedParticles == numParticles_); + numParticles_ = placedParticles; + // assert(placedParticles == numParticles_); } @@ -91,18 +95,17 @@ std::array FluidTracer::getParticlePosition(int i) const { } int FluidTracer::getThresholdParticlesFluidCell() { - std::priority_queue, std::greater> heap; - for (int particles: currentParticlesPerCell_){ - heap.push(particles); - if (heap.size() > numFluidCells_) { - heap.pop(); - } + std::vector copy = currentParticlesPerCell_; + std::sort(copy.begin(), copy.end(), std::greater()); + if (numFluidCells_ > copy.size()){ + std::cout << " WARNING, NO FLUID CELLS" << std::endl; + std::cout << numFluidCells_ << " " << std::endl; + return 1; } - - int threshold = heap.top(); + int threshold = copy[numFluidCells_ - 1]; if (threshold < 1){ - threshold = 1; - std::cout << "DANGER: Threshold is 0" << std::endl; + std::cout << " WARNING, THRESHOLD LOW" << std::endl; + return 1; } return threshold; } @@ -110,6 +113,7 @@ int FluidTracer::getThresholdParticlesFluidCell() { void FluidTracer::moveParticles(double dt) { + // initializeHomogenousParticleDistribution(); // Reset mask_->resetMask(); std::fill(currentParticlesPerCell_.begin(), currentParticlesPerCell_.end(), 0); @@ -125,7 +129,6 @@ void FluidTracer::moveParticles(double dt) { (*mask_)(newIdx[0], newIdx[1]) = Mask::FLUID; } - // int threshold = getThresholdParticlesFluidCell(); // for (int i = 0; i < mask_->size()[0]; i++){ diff --git a/src/surface/fluid_tracer.h b/src/surface/fluid_tracer.h index 5a0c2653..6f5028ba 100644 --- a/src/surface/fluid_tracer.h +++ b/src/surface/fluid_tracer.h @@ -78,7 +78,7 @@ class FluidTracer { private: - void initializeHomogenousParticleDistribution(int numParticlesPerCell); + void initializeHomogenousParticleDistribution(); /** * @brief initializes a single cell according to nx, ny and numParticlesPerCell_ */ From 72d8ff6051fe002577f72089d7e8126386fdbba2 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Tue, 6 Feb 2024 22:54:41 +0100 Subject: [PATCH 53/67] [Correction BV for diag p] --- input/settings_debug_joni.txt | 2 +- input/settings_drop.txt | 73 ++++++++++++++++++++++++++++++++++ src/boundary/boundary.cpp | 17 ++++---- src/computation.cpp | 19 ++++----- src/settings_parser/settings.h | 2 + src/surface/fluid_tracer.cpp | 12 +++++- 6 files changed, 105 insertions(+), 20 deletions(-) create mode 100644 input/settings_drop.txt diff --git a/input/settings_debug_joni.txt b/input/settings_debug_joni.txt index 3a240a81..f7c45ac5 100644 --- a/input/settings_debug_joni.txt +++ b/input/settings_debug_joni.txt @@ -68,6 +68,6 @@ maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver # Particle Tracker useFluidTracer = true -particlePerCell = 100 +particlePerCell = 10 fluidTracerMethod = single diff --git a/input/settings_drop.txt b/input/settings_drop.txt new file mode 100644 index 00000000..f7c45ac5 --- /dev/null +++ b/input/settings_drop.txt @@ -0,0 +1,73 @@ +# Settings file for numsim program +# Run ./numsim lid_driven_cavity.txt + +# Problem description +physicalSizeX = 2.0 # physical size of the domain +physicalSizeY = 2.0 +endTime = 10.0 # duration of the simulation +re = 100 # Reynolds number +gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity +gY = -0.5 + + +# Boundary Conditions Type + +BCTop = NoSlip +BCRight = NoSlip +BCBottom = NoSlip +BCLeft = NoSlip + + +# NoSlip boundary conditions + +NoSlipVelTopX = 0 +NoSlipVelTopY = 0 +NoSlipVelRightX = 0 +NoSlipVelRightY = 0 +NoSlipVelBottomX = 0 +NoSlipVelBottomY = 0 +NoSlipVelLeftX = 0 +NoSlipVelLeftY = 0 + + +# Pressure BoundaryConditions + +PressureTop = 0 +PressureRight = 0.0 +PressureBottom = 0 +PressureLeft = 100.0 + +# Create Rectangular object in domain + +createRectangularObject = false + +obstaclePositionX = 0.75 +obstaclePositionY = 0.75 +obstacleDimensionX = 0.5 +obstacleDimensionY = 0.5 + +# Create domain from PNGBitmap + +createDomainfromBitmap = true +pathToBitmap = /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Bitmap/drop3.png + +# Discretization parameters +nCellsX = 20 # number of cells in x and y direction +nCellsY = 20 + +useDonorCell = true # if donor cell discretization should be used, possible values: true false +alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences +tau = 0.5 # safety factor for time step width +maximumDt = 0.0005 # maximum values for time step width + +# Solver parameters +pressureSolver = SOR # which pressure solver to use, possible values: GaussSeidel SOR CG +omega = 1.6 # overrelaxation factor, only for SOR solver +epsilon = 1e-5 # tolerance for 2-norm of residual +maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver + +# Particle Tracker +useFluidTracer = true +particlePerCell = 10 +fluidTracerMethod = single + diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index cc3ee880..04722c7c 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -147,8 +147,9 @@ void Boundary::setPressureSurfaceBC() discretization_->p(i, j) = -1/(2 * settings_.re) * ( 1/(2*dy) * (discretization_->u(i, j) + discretization_->u(i - 1, j) -discretization_->u(i, j - 1) - discretization_->u(i - 1, j - 1)) - + 1/(2*dx) * (discretization_->v(i, j) + discretization_->v(i, j - 1) - -discretization_->v(i - 1, j) - discretization_->v(i - 1, j - 1)) + + 1/(2*dx) * (discretization_->v(i + 1, j) + discretization_->v(i + 1, j - 1) + -discretization_->v(i, j) - discretization_->v(i, j - 1)) + ); break; case Mask::FLUID_CORNER_TOP_RIGHT: @@ -161,18 +162,18 @@ void Boundary::setPressureSurfaceBC() break; case Mask::FLUID_CORNER_BOTTOM_RIGHT: discretization_->p(i, j) =-1/(2 * settings_.re) * ( - 1/(2*dy) * (discretization_->u(i, j) + discretization_->u(i - 1, j) - -discretization_->u(i, j - 1) - discretization_->u(i - 1, j - 1)) + 1/(2*dy) * (discretization_->u(i, j + 1) + discretization_->u(i - 1, j + 1) + -discretization_->u(i, j) - discretization_->u(i - 1, j)) + 1/(2*dx) * (discretization_->v(i, j) + discretization_->v(i, j - 1) -discretization_->v(i - 1, j) - discretization_->v(i - 1, j - 1)) ); break; case Mask::FLUID_CORNER_BOTTOM_LEFT: discretization_->p(i, j) = 1/(2 * settings_.re) * ( - 1/(2*dy) * (discretization_->u(i, j) + discretization_->u(i - 1, j) - -discretization_->u(i, j - 1) - discretization_->u(i - 1, j - 1)) - + 1/(2*dx) * (discretization_->v(i, j) + discretization_->v(i, j - 1) - -discretization_->v(i - 1, j) - discretization_->v(i - 1, j - 1)) + 1/(2*dy) * (discretization_->u(i, j + 1) + discretization_->u(i - 1, j + 1) + -discretization_->u(i, j) - discretization_->u(i - 1, j)) + + 1/(2*dx) * (discretization_->v(i + 1, j) + discretization_->v(i + 1, j - 1) + -discretization_->v(i, j) - discretization_->v(i, j - 1)) ); break; case Mask::FLUID_COLUMN_VERTICAL: diff --git a/src/computation.cpp b/src/computation.cpp index db5ff1f3..e224d9e0 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -81,10 +81,9 @@ void Computation::runSimulation() // fluidTracer_->createParticles(0.1, 1.4); #ifndef NDEBUG - std::cout << settings_.useFluidTracer << settings_.particlePerCell << settings_.fluidTracerMethod << std::endl; // mask_->printMask(); - usleep(1000000); - std::cout << "\033[2J\033[1;1H"; + // usleep(1000000); + // std::cout << "\033[2J\033[1;1H"; #endif computeTimeStepWidth(currentTime); @@ -93,14 +92,16 @@ void Computation::runSimulation() computePressure(); computeVelocities(); - boundary_->setVelocityBoundaryValues(dt_); - fluidTracer_->moveParticles(dt_); - // TODO: make mask update explicit - + if (settings_.useFluidTracer) + { + // if (settings_.useParticleSource) { + // fluidTracer_->createParticles(settings_.particleSource[0], settings_.particleSource[1]); + // } + boundary_->setVelocityBoundaryValues(dt_); + fluidTracer_->moveParticles(dt_); + } boundary_->updateBoundary(); - // Update velocity without new timestep boundary_->setVelocityBoundaryValues(); - // surface pressure is fix for one timestep boundary_->setPressureSurfaceBC(); diff --git a/src/settings_parser/settings.h b/src/settings_parser/settings.h index eae3d06f..01b982f0 100644 --- a/src/settings_parser/settings.h +++ b/src/settings_parser/settings.h @@ -66,6 +66,8 @@ struct Settings * `threshold` -> aims at a constant amount of fluid cells */ std::string fluidTracerMethod = "single"; + // bool useParticleSource = false; //!< Enables virtual particles source + // std::array particleSource = {0.5, 0.5}; //!< Source of virtual particles diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index 5910f4ef..9a1ec814 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -124,9 +124,17 @@ void FluidTracer::moveParticles(double dt) { std::array idx = cellOfParticle(i); std::array newIdx = updateParticle(i, idx, dt, vel); - currentParticlesPerCell_[newIdx[0] + newIdx[1] * mask_->size()[0]] += 1; // TODO: uncomment this if threshold instead of singleParticle - (*mask_)(newIdx[0], newIdx[1]) = Mask::FLUID; + if (mask_->isObstacle(newIdx[0], newIdx[1])){ + std::cout<< "???????????????????ERROR???????????????????" << std::endl; + // remove from domain + x_[i] = 0.5; + y_[i] = 0.5; + + } else { + currentParticlesPerCell_[newIdx[0] + newIdx[1] * mask_->size()[0]] += 1; + (*mask_)(newIdx[0], newIdx[1]) = Mask::FLUID; + } } // int threshold = getThresholdParticlesFluidCell(); From d53d3f758d8c83425b5dab406f68d41af1d48cac Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Wed, 7 Feb 2024 10:04:54 +0100 Subject: [PATCH 54/67] fluidTracker tested for LidDrivenCavity --- build.sh | 5 ++- input/settings_debug_joni.txt | 2 +- input/settings_drop.txt | 2 +- input/settings_tap.txt | 73 +++++++++++++++++++++++++++++++++++ src/surface/fluid_tracer.cpp | 23 +++++++++-- src/surface/fluid_tracer.h | 3 +- 6 files changed, 101 insertions(+), 7 deletions(-) create mode 100644 input/settings_tap.txt diff --git a/build.sh b/build.sh index 14aefc47..839ff580 100755 --- a/build.sh +++ b/build.sh @@ -17,8 +17,11 @@ fi make install -j4 -./numsim ../input/settings_debug_joni.txt +# ./numsim ../input/settings_debug_joni.txt +./numsim ../input/settings.txt +./numsim ../input/settings_v3.txt # ./numsim ../input/settings_damBreak.txt +# ./numsim ../input/settings_drop.txt diff --git a/input/settings_debug_joni.txt b/input/settings_debug_joni.txt index f7c45ac5..3a240a81 100644 --- a/input/settings_debug_joni.txt +++ b/input/settings_debug_joni.txt @@ -68,6 +68,6 @@ maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver # Particle Tracker useFluidTracer = true -particlePerCell = 10 +particlePerCell = 100 fluidTracerMethod = single diff --git a/input/settings_drop.txt b/input/settings_drop.txt index f7c45ac5..c80d0df3 100644 --- a/input/settings_drop.txt +++ b/input/settings_drop.txt @@ -68,6 +68,6 @@ maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver # Particle Tracker useFluidTracer = true -particlePerCell = 10 +particlePerCell = 200 fluidTracerMethod = single diff --git a/input/settings_tap.txt b/input/settings_tap.txt new file mode 100644 index 00000000..37e1d95e --- /dev/null +++ b/input/settings_tap.txt @@ -0,0 +1,73 @@ +# Settings file for numsim program +# Run ./numsim lid_driven_cavity.txt + +# Problem description +physicalSizeX = 2.0 # physical size of the domain +physicalSizeY = 2.0 +endTime = 10.0 # duration of the simulation +re = 100 # Reynolds number +gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity +gY = -0.5 + + +# Boundary Conditions Type + +BCTop = NoSlip +BCRight = NoSlip +BCBottom = NoSlip +BCLeft = NoSlip + + +# NoSlip boundary conditions + +NoSlipVelTopX = 0 +NoSlipVelTopY = 0 +NoSlipVelRightX = 0 +NoSlipVelRightY = 0 +NoSlipVelBottomX = 0 +NoSlipVelBottomY = 0 +NoSlipVelLeftX = 0 +NoSlipVelLeftY = 0 + + +# Pressure BoundaryConditions + +PressureTop = 0 +PressureRight = 0.0 +PressureBottom = 0 +PressureLeft = 100.0 + +# Create Rectangular object in domain + +createRectangularObject = false + +obstaclePositionX = 0.75 +obstaclePositionY = 0.75 +obstacleDimensionX = 0.5 +obstacleDimensionY = 0.5 + +# Create domain from PNGBitmap + +createDomainfromBitmap = true +pathToBitmap = /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Bitmap/drop3.png + +# Discretization parameters +nCellsX = 20 # number of cells in x and y direction +nCellsY = 20 + +useDonorCell = true # if donor cell discretization should be used, possible values: true false +alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences +tau = 0.5 # safety factor for time step width +maximumDt = 0.0005 # maximum values for time step width + +# Solver parameters +pressureSolver = SOR # which pressure solver to use, possible values: GaussSeidel SOR CG +omega = 1.6 # overrelaxation factor, only for SOR solver +epsilon = 1e-5 # tolerance for 2-norm of residual +maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver + +# Fluid Tracker +useFluidTracer = true +particlePerCell = 100 +fluidTracerMethod = single + diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index 9a1ec814..ddb9a307 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -97,6 +97,7 @@ std::array FluidTracer::getParticlePosition(int i) const { int FluidTracer::getThresholdParticlesFluidCell() { std::vector copy = currentParticlesPerCell_; std::sort(copy.begin(), copy.end(), std::greater()); + if (numFluidCells_ > copy.size()){ std::cout << " WARNING, NO FLUID CELLS" << std::endl; std::cout << numFluidCells_ << " " << std::endl; @@ -122,14 +123,15 @@ void FluidTracer::moveParticles(double dt) { std::array vel = {discretization_->u().interpolateAt(x_[i], y_[i]), discretization_->v().interpolateAt(x_[i], y_[i])}; std::array idx = cellOfParticle(i); + std::array newIdx = updateParticle(i, idx, dt, vel); // TODO: uncomment this if threshold instead of singleParticle if (mask_->isObstacle(newIdx[0], newIdx[1])){ - std::cout<< "???????????????????ERROR???????????????????" << std::endl; + std::cout<< "CFL Violated" << std::endl; // remove from domain - x_[i] = 0.5; - y_[i] = 0.5; + x_[i] = 0; + y_[i] = 0; } else { currentParticlesPerCell_[newIdx[0] + newIdx[1] * mask_->size()[0]] += 1; @@ -147,11 +149,26 @@ void FluidTracer::moveParticles(double dt) { // } // } // std::cout<< "Threshold: " << threshold << std::endl; + + resetVelocityInAirCells(); + // Update BC in mask mask_->setFluidBC(); } +void FluidTracer::resetVelocityInAirCells(){ + for (int i = 1; i < mask_->size()[0]-1; i++){ + for (int j = 1; j < mask_->size()[1]-1; j++){ + if (mask_->isAir(i, j) && mask_->isAir(i + 1, j)){ + discretization_->u(i, j) = 0; + } + if (mask_->isAir(i, j) && mask_->isAir(i, j + 1)){ + discretization_->v(i, j) = 0; + } + } + } +} std::array FluidTracer::updateParticle(int i, std::array idx, double dt, std::array vel) { diff --git a/src/surface/fluid_tracer.h b/src/surface/fluid_tracer.h index 6f5028ba..fc82c305 100644 --- a/src/surface/fluid_tracer.h +++ b/src/surface/fluid_tracer.h @@ -87,7 +87,8 @@ class FluidTracer { // Helper for move Particles int getThresholdParticlesFluidCell(); - std::array updateParticle(int i, std::array, double dt, std::array vel); + std::array updateParticle(int i, std::array idx, double dt, std::array vel); + void resetVelocityInAirCells(); int numParticles_; From ac577a7bef9eb0954dcce0d425d54db4529a9e12 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Wed, 7 Feb 2024 10:14:47 +0100 Subject: [PATCH 55/67] added settings with bitmap --- build.sh | 8 +++++--- input/{ => bitmap}/damBreak.png | Bin input/bitmap/drop3.png | Bin 0 -> 177 bytes input/bitmap/dropWater.png | Bin 0 -> 184 bytes input/settings_damBreak.txt | 2 +- input/settings_drop.txt | 3 ++- 6 files changed, 8 insertions(+), 5 deletions(-) rename input/{ => bitmap}/damBreak.png (100%) create mode 100644 input/bitmap/drop3.png create mode 100644 input/bitmap/dropWater.png diff --git a/build.sh b/build.sh index 839ff580..c04eb285 100755 --- a/build.sh +++ b/build.sh @@ -18,10 +18,12 @@ fi make install -j4 # ./numsim ../input/settings_debug_joni.txt -./numsim ../input/settings.txt -./numsim ../input/settings_v3.txt + +# ./numsim ../input/settings.txt +# ./numsim ../input/settings_v3.txt + +./numsim ../input/settings_drop.txt # ./numsim ../input/settings_damBreak.txt -# ./numsim ../input/settings_drop.txt diff --git a/input/damBreak.png b/input/bitmap/damBreak.png similarity index 100% rename from input/damBreak.png rename to input/bitmap/damBreak.png diff --git a/input/bitmap/drop3.png b/input/bitmap/drop3.png new file mode 100644 index 0000000000000000000000000000000000000000..0b6a1d086e30c57eb07314e154ca2066791bc19b GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{1|(OCFP#RY7>k44ofy`glX(f`WP7?ehFJI~ z|M~y_e?6NPvzt@fucx&KHxyk~k=t|bK(>Y%bKt2dX3t2I5@drttz Date: Wed, 7 Feb 2024 10:43:44 +0100 Subject: [PATCH 56/67] juhuu its working again --- build.sh | 4 +- input/settings_debug.txt | 72 ++++++++++++++++++++ src/computation.cpp | 7 +- src/output_writer/output_writer_paraview.cpp | 5 +- 4 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 input/settings_debug.txt diff --git a/build.sh b/build.sh index c04eb285..247f9d4a 100755 --- a/build.sh +++ b/build.sh @@ -22,7 +22,7 @@ make install -j4 # ./numsim ../input/settings.txt # ./numsim ../input/settings_v3.txt -./numsim ../input/settings_drop.txt +./numsim ../input/settings_debug.txt # ./numsim ../input/settings_damBreak.txt @@ -42,6 +42,6 @@ cd .. # cd .. # run tests -build/tests/run_tests +#build/tests/run_tests # zip -r submission.zip src/ CMakeLists.txt \ No newline at end of file diff --git a/input/settings_debug.txt b/input/settings_debug.txt new file mode 100644 index 00000000..5444be80 --- /dev/null +++ b/input/settings_debug.txt @@ -0,0 +1,72 @@ +# Settings file for numsim program +# Run ./numsim lid_driven_cavity.txt + +# Problem description +physicalSizeX = 2.0 # physical size of the domain +physicalSizeY = 2.0 +endTime = 10.0 # duration of the simulation +re = 1000 # Reynolds number +gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity +gY = 0.0 + + +# Boundary Conditions Type + +BCTop = NoSlip +BCRight = NoSlip +BCBottom = NoSlip +BCLeft = NoSlip + + +# NoSlip boundary conditions + +NoSlipVelTopX = 1 +NoSlipVelTopY = 0 +NoSlipVelRightX = 0 +NoSlipVelRightY = 0 +NoSlipVelBottomX = -1 +NoSlipVelBottomY = 0 +NoSlipVelLeftX = 0 +NoSlipVelLeftY = 0 + + +# Pressure BoundaryConditions + +PressureTop = 0 +PressureRight = 100.0 +PressureBottom = 0 +PressureLeft = 200.0 + +# Create Rectangular object in domain + +createRectangularObject = false + +obstaclePositionX = 1.5 +obstaclePositionY = 1.5 +obstacleDimensionX = 0.5 +obstacleDimensionY = 0.5 + +# Create domain from PNGBitmap + +createDomainfromBitmap = true +pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/quadruple_cavity.png + +# Discretization parameters +nCellsX = 40 # number of cells in x and y direction +nCellsY = 40 +useDonorCell = true # if donor cell discretization should be used, possible values: true false +alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences +tau = 0.5 # safety factor for time step width +maximumDt = 0.1 # maximum values for time step width + +# Solver parameters +pressureSolver = SOR # which pressure solver to use, possible values: GaussSeidel SOR CG +omega = 1.6 # overrelaxation factor, only for SOR solver +epsilon = 1e-5 # tolerance for 2-norm of residual +maximumNumberOfIterations = 1e4 # maximum number of iterations in the solver + +# Particle Tracker +useFluidTracer = false +particlePerCell = 100 +fluidTracerMethod = single + diff --git a/src/computation.cpp b/src/computation.cpp index e224d9e0..6c6e4fd5 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -100,9 +100,9 @@ void Computation::runSimulation() boundary_->setVelocityBoundaryValues(dt_); fluidTracer_->moveParticles(dt_); } - boundary_->updateBoundary(); + //boundary_->updateBoundary(); boundary_->setVelocityBoundaryValues(); - boundary_->setPressureSurfaceBC(); + //boundary_->setPressureSurfaceBC(); @@ -110,9 +110,10 @@ void Computation::runSimulation() if (currentTime > printTime) { outputWriterParaview_->writeFile(currentTime); printTime += printInterval; - std::cout << currentTime << " -> write file, took steps: " << stepsBetweenPrints << std::endl; + // std::cout << currentTime << " -> write file, took steps: " << stepsBetweenPrints << std::endl; stepsBetweenPrints = 0; } + stepsBetweenPrints++; #ifndef NDEBUG diff --git a/src/output_writer/output_writer_paraview.cpp b/src/output_writer/output_writer_paraview.cpp index 6e8762cf..1140bd95 100644 --- a/src/output_writer/output_writer_paraview.cpp +++ b/src/output_writer/output_writer_paraview.cpp @@ -76,7 +76,10 @@ void OutputWriterParaview::writeFile(double currentTime) int index_ = 0; for (int j = 2; j < n_cells_y + 2; j++) { for (int i = 2; i < n_cells_x + 2; i++, index_++) { - arrayParticles->SetValue(index_, fluidTracer_->getNumberOfParticles(i/2, j/2)); + if (fluidTracer_.get() == nullptr) + arrayParticles->SetValue(index_, 0.0); + else + arrayParticles->SetValue(index_, fluidTracer_->getNumberOfParticles(i/2, j/2)); } } From 1768ae5debe7c8a1ecd85921cb2bfed4a72c3584 Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Wed, 7 Feb 2024 12:48:02 +0100 Subject: [PATCH 57/67] first iteration of documentation done. Fluid tracer still missing --- src/boundary/boundary.h | 121 ++++++++++++++++----- src/boundary/mask.h | 88 +++++++++++---- src/computation.h | 15 +-- src/output_writer/output_writer_paraview.h | 4 +- 4 files changed, 168 insertions(+), 60 deletions(-) diff --git a/src/boundary/boundary.h b/src/boundary/boundary.h index 4105270d..6793ab4e 100644 --- a/src/boundary/boundary.h +++ b/src/boundary/boundary.h @@ -6,46 +6,111 @@ #include #include +/** + * @class Boundary + * @brief Class responsible to caluclate boundary conditions + * + */ class Boundary { - public: - Boundary(std::shared_ptr mask, std::shared_ptr discretization, Settings settings); - void setPressureBoundaryValues(); - - // Only needs to be set once -> no need to update each solver iteration - void setPressureSurfaceBC(); +public: + /** + * @brief Constructor. + * + * @param discretization instance of Discretization holding the needed field variables for rhs and p + * @param mask instance of mask holding the boundary condition enums for each cell tolerance for the solver + * @param settings holding the necessary domainn boundary condition + */ + Boundary(std::shared_ptr mask, std::shared_ptr discretization, Settings settings); - void setVelocityBoundaryValues(); - void setVelocityBoundaryValues(double dt); - std::shared_ptr mask_; + /** + * @brief calculates and sets the pressure boundary values for obstacles and domain boundary + */ + void setPressureBoundaryValues(); + /** + * @brief calculates and sets the pressure boundary values for surface boundary + * + * Only needs to be set once -> no need to update each solver iteration + */ + void setPressureSurfaceBC(); - bool doCalculateF(int i, int j) const; - bool doCalculateG(int i, int j) const; - void updateBoundary(); + /** + * @brief calculates and sets the velocity boundary values for surface, obstacle and domain boundary + */ + void setVelocityBoundaryValues(); - private: - void createBoundaryCellsLists(); + /** + * @brief overloaded function that sets velocity boundary + * + * necessary when fluid tracker is used + * + * @param dt current time step + */ + void setVelocityBoundaryValues(double dt); - // Set Pressure - void setPressureDomainBC(); - void setPressureObstacleBC(); + /** + * @brief returns true if cell left and rigt of F value are fluid (not a boundary value) + */ + bool doCalculateF(int i, int j) const; + /** + * @brief returns true if cell top and bottom of G value are fluid (not a boundary value) + */ + bool doCalculateG(int i, int j) const; - // Set Velocity - void setVelocityDomainBC(); - void setVelocityObstacleBC(); - void setVelocitySurfaceBC(); + /** + * @brief updates fluid boundary cell list + */ + void updateBoundary(); - void updateVelocitySurfaceBC(double dt); - void setAirCellsZero(); + std::shared_ptr mask_; //!< shared pointer to mask entity +private: + /** + * @brief creates 3 lists for all fluid, obstacle and domain boundary cells + */ + void createBoundaryCellsLists(); - std::shared_ptr discretization_; - Settings settings_; + /** + * @brief Set pressure values at domain boundary + */ + void setPressureDomainBC(); - std::vector domainBoundaryCells_; - std::vector obstacleBoundaryCells_; - std::vector fluidBoundaryCells_; + /** + * @brief Set pressure values at obstacle boundary + */ + void setPressureObstacleBC(); + /** + * @brief Set velocity values at domain boundary + */ + void setVelocityDomainBC(); + + /** + * @brief Set velocity values at obstacle boundary + */ + void setVelocityObstacleBC(); + + /** + * @brief Set velocity values at surface boundary + */ + void setVelocitySurfaceBC(); + + /** + * @brief Update velocity boundary conditions at surface + */ + void updateVelocitySurfaceBC(double dt); + + /** + * @brief set values in dirscretization for all air cells to zero + */ + void setAirCellsZero(); + + std::shared_ptr discretization_; //!< shared pointer to discretization entity + Settings settings_; //!< settings loaded from settings file + + std::vector domainBoundaryCells_; //!< indice list of all domain boundary cells + std::vector obstacleBoundaryCells_; //!< indice list of all obstacle boundary cells + std::vector fluidBoundaryCells_; //!< indice list of all fluid boundary cells }; \ No newline at end of file diff --git a/src/boundary/mask.h b/src/boundary/mask.h index e2def4ca..f93f1d28 100644 --- a/src/boundary/mask.h +++ b/src/boundary/mask.h @@ -17,13 +17,11 @@ class Mask /** * @brief constructor. * - * @param size size of array in x and y direction + * @param setting settings containing necessary user input */ Mask(Settings settings); - // TODO: it is weird but if we would use `char` instead of int, we would use less memory - - enum CellType + enum CellType //!< enums used to encode cell type and boundary condition { FLUID_DROPLET = 0, @@ -104,7 +102,7 @@ class Mask void resetMask(); // ******************************************************** - // R E Q U E S T S + // R E Q U E S T S /** * @brief Cell at (i,j) is fluid or not @@ -124,7 +122,6 @@ class Mask */ bool isObstacle(int i, int j) const; - /** * @brief Cell at (i,j) is a air cell or not * @@ -134,13 +131,44 @@ class Mask * If i and j are out of bond returns false */ bool isAir(int i, int j) const; - bool isInnerFluid(int i, int j) const; + /** + * @brief Cell at (i,j) is a inner fluid cell or not + * + * @param i index in x direction + * @param j index in y direction + * + * Checks if fluid is sourrounded by only fluid cells + * If i and j are out of bond returns false + */ + bool isInnerFluid(int i, int j) const; + /** + * @brief Cecks if cell at index is domain boundary + * + * @param i index in x direction + * @param j index in y direction + * + */ bool isDomainBoundary(int i, int j) const; + + /** + * @brief Cecks if cell at index is obstacle boundary + * + * @param i index in x direction + * @param j index in y direction + * + */ bool isObstacleBoundary(int i, int j) const; - bool isFluidBoundary(int i, int j) const; + /** + * @brief Cecks if cell at index is fluid boundary + * + * @param i index in x direction + * @param j index in y direction + * + */ + bool isFluidBoundary(int i, int j) const; /** * @brief number of fluid cells @@ -150,26 +178,46 @@ class Mask */ int getNumberOfFluidCells() const; - // For initialization + /** + * @brief creates rectangulat objecct inside domain + * + * location and size are specified in settings file by user + */ void makeRectangularObstacle(); - void createMaskFromPNGBitMap(); - - + /** + * @brief creates mask by reading in bitmap + * + * path to bitmap saved as png is specified in settings file by user + */ + void createMaskFromPNGBitMap(); - // Sets Enums for Boundary Types from type FLUID, AIR, OBSTACLE, DOMAIN - // - uses `settings` and neighbours + /** + * @brief sets enums for all cells that belong to domain boundary + * + * type of domain boundary condition is specified in settings file by user + */ void setDomainBC(); + + /** + * @brief sets enums for all cells that belong to an obstacle + */ void setObstacleBC(); + + /** + * @brief sets enums for all fluid cells that belong are located at a surface + */ void setFluidBC(); + /** + * @brief print mask enums to terminal + */ void printMask() const; - protected: - std::array size_; //!< size of array in x and y direction - std::vector data_; //!< storage array values, in row-major order - std::vector boundary_list; //!< stores the indices of the boundary cells - Settings settings_; - int forbiddenObstacleFluidCombinations[7] = {105,107,110,111,113,114,115}; + std::array size_; //!< size of array in x and y direction + std::vector data_; //!< storage array values, in row-major order + std::vector boundary_list; //!< stores the indices of the boundary cells + Settings settings_; //!< settings entity + int forbiddenObstacleFluidCombinations[7] = {105, 107, 110, 111, 113, 114, 115}; //!< enums that singnal forbidden obstacle - fluid cell combinations }; \ No newline at end of file diff --git a/src/computation.h b/src/computation.h index 20da0e37..95c2cf00 100644 --- a/src/computation.h +++ b/src/computation.h @@ -21,7 +21,6 @@ #include #include - /** * @class Computation * @brief Computation of Simulation @@ -45,8 +44,6 @@ class Computation */ void runSimulation(); - - private: /** * @brief Compute the time step width dt from maximum velocities @@ -81,12 +78,12 @@ class Computation */ void computeVelocities(); - Settings settings_; - std::shared_ptr discretization_; //!< discretization instance + Settings settings_; //!< setttings instance + std::shared_ptr discretization_; //!< discretization instance - std::shared_ptr mask_; - std::shared_ptr boundary_; //!< boundary instance - std::shared_ptr fluidTracer_; + std::shared_ptr mask_; //!< mask instance + std::shared_ptr boundary_; //!< boundary instance + std::shared_ptr fluidTracer_; //!< fluid tracer instance std::unique_ptr pressureSolver_; //!< pressureSolver instance std::unique_ptr outputWriterParaview_; //!< outputWriterParaview instance @@ -94,5 +91,3 @@ class Computation std::array meshWidth_; //!< mesh width of domain in x and y direction double dt_; //!< iteration time step }; - - diff --git a/src/output_writer/output_writer_paraview.h b/src/output_writer/output_writer_paraview.h index 043a6e2a..c86ce170 100644 --- a/src/output_writer/output_writer_paraview.h +++ b/src/output_writer/output_writer_paraview.h @@ -43,6 +43,6 @@ class OutputWriterParaview : public OutputWriter private: vtkSmartPointer vtkWriter_; //!< vtk writer to write ImageData - std::shared_ptr mask_; - std::shared_ptr fluidTracer_; + std::shared_ptr mask_; //!< mask used to display different cell types in ParaView + std::shared_ptr fluidTracer_; //!< fluid tracer used to display fluid particles in ParaView }; From ca678fb251f4d66634e1ca61ce84e7bc8d90cfe6 Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Wed, 7 Feb 2024 16:39:13 +0100 Subject: [PATCH 58/67] added readme docu --- README.md | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++--- mask.png | Bin 0 -> 501182 bytes 2 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 mask.png diff --git a/README.md b/README.md index 392ce24b..2ed6cc9a 100644 --- a/README.md +++ b/README.md @@ -5,12 +5,97 @@ Project for the lecture Numerische Simulation at the University of Stuttgart. De * `gcc` * `cmake` * `libvtk` +* `libpng` -## TODO -* Documentation with **doxygen** -* Testing -* Visualization with **Paraview** +## Run the simulation +We recommend to run the simulation using the provided bash script "build.sh". In that file enter the path of the settings file you would like to use. You can uncomment the doxygen part to build the documentation. Tests can be executed by uncommenting the run_test line + +## Adjust the settings file +For the user there is the settings.txt file that can be adjusted to +fit the specific simulation needs. + +The first part of the settings file specifies the general geometry +of the simulation domain: + +* **physicalSizeX** and **physicalSizeY**: The domain size in meters. +* **endTime**: The endtime of the simulation in seconds. +* **re**: The reynolds number (specfies indirectly the viscosity of the fluid). +* **gX** and **gY**: Acceleration resulting from external forces. + +Subsequently the domain boundary conditions are specified. You can choose between Pressure and NoSlip. + +* **BcTop**, **BcRight**, **BcBottom** and **BCLeft**: Type of boundary condition on either side of the domain. Can be either "NoSlip" or Pressure. + +Then the specific values for the NoSlip domain boundary conditions follow. + +* **NoSlipVelTopX/Y**: Noslip boundary velocities directly at the domain top in m/s. +* **NoSlipVelRightX/Y**: Noslip boundary velocities directly at the domain right in m/s. +* **NoSlipVelBottomX/Y**: Noslip boundary velocities directly at the domain bottom in m/s. +* **NoSlipVelLeftX/Y**: Noslip boundary velocities directly at the domain left in m/s. + +Then the specific values for the Pressure domain boundary conditions follow. + +* **PressureTop**: Pressure directly at the top of the domain in Pa +* **PressureRight**: Pressure directly at the right of the domain in Pa +* **PressureBottom**: Pressure directly at the bottom of the domain in Pa +* **PressureLeft**: Pressure directly at the left of the domain in Pa + +If you want to put a rectangular object in the domain you can specfiy its location +and dimension with the following setting. + +* **createRectangularObject**: Set to true if you want to add a rectangular object +* **obstaclePositionX/Y**: Position of the left lower corner of the rectangle in the domain in m +* **obstacleDimensionX/Y**: Dimension of the object in x and y direction in m + +In the following you can specify wheter you want to load your domain from a bitmap. + +* **createDomainfromBitmap**: Set to true if you want to load your domain from a bitmap + +* **pathToBitmap**: path to the location of the bitmap saved as a png. + +Then follows more paramters considering the discretization + +* **nCellsX/Y**: Number of cells in x and y direction as int +* **useDonorCell**: Set to true if you want to use the Donor Cell scheme +* **alpha**: Factor for donor-cell scheme between 0 and 1. 0 is equivalent to central differences +* **epsilon**: Tolerance of the 2-norm residual +* **maximumNumberOfIterations**: Maximum number of iterations of the pressure solver + +Finally a few parameters for open surfaces follow: + +* **useFluidTracer**: Set to true if you want to simulate free surfaces +* **particlesPerCell**: Number of fluid particles per cell as integer + + + +## Creating a domain using a bitmap +An easy way to introduce new obstacles into the domain, changing the domain +geometry or adding air cells to the domain for free surfaces simulation is to use +a bitmap. In gerneral you can use any program to create a bitmap however we recommend +[Pixilart](https://www.pixilart.com/). Here you can specify the number of pixels +in x and y direction when creating a new bitmap. These pixel numbers directly correlate to the number of cells **inside** the simulation domain. Use the Bucket +tool to fill your image with either white pixels (r:255, g:255, b:255) for air cells +or blue pixels (any color apart from white and black actually works) for fluid cells. +Then use the drawing tool to add black obstacle cells (r:0, g:0, b:0). When saving +the file, all pixels need to have a color value. If there are only black and white +pixels you will essentially simulate an empty space, so always add colored pixels +for fluid as well. + +Safe the bitmap as a png, specify the path to that file in the settings.txt file +and set **createDomainfromBitmap** to true. In the bitmap folder you can find +example files that you can simulate as well + + +## Display simulation results in ParaView +You can display your simulation results using ParaView. The necessary vtk files +will be written to the build/out folder during simulation. + +When the files are loaded into paraview you should apply a threshold to the mask +field to make obstacle visible in paraview (see image). Then use the threshold field to perform further visualizations. + +![mask](mask.png) + ## Contributors diff --git a/mask.png b/mask.png new file mode 100644 index 0000000000000000000000000000000000000000..be261016a614e2302ab89f940ec2885ccb6339bf GIT binary patch literal 501182 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 U`KYEJR zwVg`Do8Z~eD%mWdW!;q}TY=l(iv2WEqN9NKk>Zx5oJz1$$Z~^8mmNw;Juj*_;=1=b z;YAH5-TwAUz7VA|y!Bw)8)_U{XLail6Tkk7}Z`4t~qs!*$Gv(}N ztS4kqUC3K@j`^l{e0he%j9=&+tgKo>c62n7TN<4V@q|396;_I5!>cGaf(u zR=H;VTwSPIEd@EO^9%uBLnQQBEUpSeWVo9I%Q#s}#K8mrwi>0p-wQ)lS#n5;mx(LA zzIgF`%w611xgHRo^9lJeDLuk%w3;sF7t59wJ;tOyWMsNNe?uH^Ejcc+&3Uqs}(LXqtgywbO4cwTQ zum|`@6{sb+sMAj^Dhu1;j3xDMO`uP(m>YdwG4^Z39hM&%Jp}l&#^R}ESX@@EQw*L891)wrG35XYyuFq zfw-ohFs$(H3$?Ph8f1L2JIhz-A1sW!=487&ztUh^-2s@Ov-*1rU$4e)T?ihK3Whzu ztS$ozAl3nsfOlCI`BzsDOO(@BEQ6T=F-8w&UrxrQeqmy(JbiXB(|-shsxU!2FV~i3 zH&{6pyMH0pe_$Noo3cm7{dI-mSvN}S@O)~mz-{)!=l{djSq8<`wCg&-9fG^NLkKPj z?(XjH?gV!m+}$m>LvRfagS)%CoXNY-K6T!`zpC|vHAT%@-P8Sa_apZuko`ee1JFOI zmW>)EN2A)^`G~2heOaPB=5YH}ODDm;`;%j=h)m!BOTaS) zZPN8-QV1s-Uv?8bqFLPI9NX^o5+YXszO;IfvV+J->ycchP~sAp6SI4^*3dPsToR{)@0r9Lg!PH z`ilEW6^D9iju_Cza^c#BkV`h)(-%-rG;V-klgpHCKut>W|EC4^8ws*}Kgn}jgW+*= zz8tKP`|9Bu*DO~_*2E=bM=LC@rf_+s0}XVscqGa9%#?p2Cexv;pVy!in`CWt;ZgV| zE8XZ&g^#9I?Pyz$kOdAZDxM`!WYz}B<|ufFiZ(`>Xs}JOCbs>BEOh>L?h%@jVQ;fiJS{)vj3xtAP)6%LQExT? z_i}T)*`KV*dvKj;brV==+i?~_Pi%`YNH_OI>ozd(;CJooEmNg#R{$*8K64;Utr6xk zoGR1<$P2i)v_gV?@GB%6Tg3BH$;(Phb<<3*=o8cqQq?2k78k|XGf0asxhPBsyDp|0 zj@27+8z+P8F_d-sfCbLgczHW>CJj;tTs*!>=Pf_Vzebe>Xf>B=-BW4!^CwrREJRr=R1#P2cv@-3;cRvA8)Tc4W}^d>14*R;BPa`^$wF z*u#9Q8h=>TlqONK)MSHKUR>*QAbWoy@agxZeJ1EsR;El!7+vSk=gAA~JY&Du-6|PE zha7;(1F5L+XYXvbGFGn@df(wI0n4@3ny-5watxI0GVkqS#Y@bMui5#<@7Y^@>)<51>{UQ!GyJj^kK8XM)AJ8oyx9z;M)qpuVWh}^yNNDQewzAJ$OX+lqpnd9mk z7vT#s`JPEaV>7pVZ^1mIhN4}k+xI?A@_&#|@;CZ3D)n?2QTshPU{8X!$-KRB`)GXw zE+I>G43V}U;0wJPgEfC@8yb*eAtLn5uC}4IA2)T@xxAuBT1lla@U)`imfmHW_+D(@ z_kf;9G4rJiviAFD99*8)U?r6MBOHjmOD?yz%YWXnx_j2|vZ8|E*e2gn^}5)5@KSd0 zA8S6Ove#zDV$gpM&9pXiI$g^6vb9E1>GA%4=xR?u!a!h>v$$vLe%k3aW^2GQxv;yb z>6(`1^-HIt+Bg70i{Z4Z>gVkjh|U-{cl};?W4admTh{viUuCUXZl)>=KDltzpHx~t zgOPs^fMAMmn^z>7JxHBg5^HLIh$@GraasR%rBW8VizW8-^_Umk@ zZ3MtwZ`0>b_n7jj zJOWiZp7%2JbyJ?I=1#cFQN-d03dB|hsR0C@xNG-##d-n0%Xc>pnsG$O^Ie8&-$$%h zkwToOM%i`oLUX%FRIc`(%S(bm$94&>&&Rv0oKEzN46OVo`s}7*1Edff2kN}pzM9j6ryTrz zA@Eq#-)NYUhSAhhCP#4S5?;Ql+k@}P;8mew}2T+Ui>G@@YgMd+V;J${&nttVK ze|472sr2dQrjtw*0nz><&qw&jMWKU03bf=Z#ZR6OaDXp2}uS*YdI-kNLQ7UzV9q`D_7THDd_kmC4PWuqsBq06t| zP#76y^S;st-+Z*EHg@1yNB92@I;20#{Gy^1ToNpHX{Q zgL#OY8b!C)#ABkmBt(z`af+Msau)8}PYF6kcepo=vy9I6skHfA07kR? zmUtgQMwCU(k3+8-?yk<%Q8|$LXjGP3GNV=^|y3LFr5G0_|^H8K;KR&wUAQD zkq^QLvYgJX<#AfXcG4^F4u+}2Id#35S)%@Xbpe!?FW%9uPIXp`xYTMflaA1El{{k- zH4m+8A1J)+W?!fiJi{%O26NOe!TxcNsRXRKnl9q!Mjp6g9a%nvig=bXF?7a|wpKhA<1(2fBl_e(tuTf#+iM3S+bR}Sje}Ym zsL!;%r$#or%H@~jRl|;QU8$g*ZQyO1;B5sM%z|F3=MkSN-&C#G-Gj;d`E-W338n?l zhoLgdA_Fhg^2D&??xdOwPkG+!$Lo{-;{e-9{j*@w4SEtF1%GmK0Ts{Wku=KDu^&%pekM zbIZi>GD=^G8jTgD*ozj|;auDuAAzA(#MM^6-n(zZ~W=_9AanFu_fmFCQChD|n*m?Bp0PQx$jvaq31Mu{p`J}(b~yU&JgPisSu>U4hdgxSFF}w$ zsNIb+O~ysBV60_{XBCHcjEYFxq!e|qQf9`;YPjVv{L^P8k$4Jwc=Ux59G)jDS%erT zi;f^1i+mE*0fv2b9sJ!v3H6cD)EZEJZ%fM)MzNjt=E5a+U&asCXqt|Yh;u|EF`q{n z1xOHGeQQPbjtcf$+Nsnq@z|lF|FtEbDZ7-zI~Z2zVCt#OPwAh7)tIQwl=`QbZf4gF zbmRK6ob@gwZbg!)7mgco)lab)!~_Yy(@gj)@>{0f}g}7l1!D z)+%a}WSXLe;Jh=sO6x~W7pi4$wtDDaFZp`=2=#53%evq_BTVBB^l5ElUyj}U) z<8U^_%WL@AOaeXQ>p8s}H#c5)1W3t@N<=J;+eP6(U1t$rYUAVGlwn!j{nvJ2OPNYp za^!9@kXqF9kN|sgPsgP}B)a4yvY~!-e}>e|PuGO^kmOgVf8kGK#qI};He~)Gr&?WC zLR~UFg{Q}J`Z2ZjJs=qsiwZ1F^Y8spZVbODea`RVe&f~l00i~^jP^wbbAk5tZ2hA_ z=vT)h+8;WD!LpVFXsH`pmDskDJ@hra@rb+pVL0{6lwHoVE5DBA#;A~ z2V+!{!hQdtWffVeioKM)BSSu-i!kq3akq13wxj|on}jyMP? zs_3dqxRI9bR}eFYg) z%6NjqkPw+wQNCkI+RG$O+NO=1g-3t&3cvdZ1G+5>HzHocldbZ<@t0KVZO&byiVC46 z4++s{7IfGLpBzkFo?m&Pdv;H*ck1Aq-|UPaIov%$XL5Um>=2p4K!Dw{mE<^v0S0amqP$RtOEk&nS$mz$ldPsq zTPHl@J^rGWjTF~tYLABpev?U7mC8B< z?n5&fU1#e`a)h9lCA{D(H~9LhZVo(7cABZnC_T^UgpHzw3sSM|1U(w;WfWy2WXu1M`;%}z;^1)4}m5ns1Z9Pw8fd~)mUsbC7dd+T>#I-ma zan?WesArbex@?T1#i}7VOAUQPOy*dit{_ZIhf>^PhV71O*ETh(3aWew<6uL9g}l;u zZklYY`9Ncgm!45L++L{4Kn8316fO*iiJ5?QV*tU;VE+GWLr@cjXQ|Jhqo9B0z?{=3 zq@F_*CnLkqu|Qm8hQ&uga0Df~DR_uAt_r0mtHwzj_RGER@JflDqnUT$G#~^=c6Qk> z@x3q9!$U2zrHX7TKvT{LXp2-=G5lDVsj($+h)l)e_dH9hH zaiV2jBUi|VG7)W4Q3h@??7))(NX}$|0NFJ^n&3rm^LKn8FYuJgnD0G^Ttf(P4z(tu zz}GPO_0Z^2eIi}x!8I&ryGRgvft@| zKav@s-`L3Nw)6~aISfW{o3aV%4A~-e-s6Iw!Ey&YIFZaVImtl&Knb#|7p}vM1&)cj z29}M$ii(P6FN@A9lWxI`ETa?X@Vx(c_69Ho+3UDfc%G%~fSoVY41A*{>)x#TcoCX- zPYU1WZixxp8Ew%FTRz8fe`-zfs27m1lJ>`VfY-5!HaUrvbxrGiMOV_mpg^OV)s6&C z#jVNF$#{T*P;4fKsVVy!S{kO@7c6yl@i?YTh zNsUJis@F==gfEk;o!3^rc~YgQT3g%KxKfcGquFdyCnndB&<$1f8|i&EJAUq#gs)81 z@GBD+c_GN@EiJaejq@s|RH8KWvi93G)lMgie*JMjpjIWrM+fmEmpCf)QdB@*h4m`D|x*5#ds7fdy>e-73TS-Ng?34Flje^FC!*;IC*HIWR)mu*Q& z&rWgoRbx1V1rI+qvrz%3SQW3!3qHSxV$+UODIA45UKI%mp=@cuCV4B!x$O0q)wO&u z7)Fxi7B&(JJ3ZBN^l}VS!t&(2)da|s3)8Ca&dotYO1UIvp=kOB6z#cCVp15pCEqog zh*FIqxPOxzi>#EHU={;7lS?WI3hFHvs+TLyz0R?-Ddkw?xAq7-DsfU1Tcx%|wKESs zcS>avs@k_dT=!nQr4}%-eFcU>{;B4eVm65)Fw(Z@}v+W47@&uX!TB;SGKUK%JYz) zX*U-~oXOWS-d*5Ss*)JJg4>%mz*I9>TIn5=VgI%dG2o>nZHke&kIPy`(=k}0MLa_6 z5jNj%F(J&tG+x)%G44#rx-W2x>rf@!)x(uy;l4)H~&Zw!uZz@zv8zZ{W&I~*px z*moz#A~1!~;dJq(vbxfH>k2edeP8!4(4q&rwiNzlP(d%RmtIJwA%W|uN4f0yGccHR zz%ePJK4~Qm14HHO6a!w4jlmczt8OpD%TmJPkCO^WxIJ17H9=Kpgc{@;o1F*mw%HR^ zg^2H_0`1#bY#qw|EMVCD8DU~j5@HWU=Dd$er0rdkW38kV&~YltYrS=Ej~)AR39&&N85-Pa?$R2_uzd;Ac~^9h+erECiiGo9Kf0e>ifZr<*+*sVm<0>$0J3O zzRN(Y$WN_eU#$~ebtb29-OiF0MFfHqOAOZq7%pNH5>5XMzu!FZ!142B`XlhF^lls~ zJQqOA8ewXc@z|BYXI}dpp*3*TbfMd?(>MYq3B8M`S53B2^dWYVy;s$n~4$(&DbWBYXMIeSaB)e3z(|o{x`LCRn@He*t%wIjg^UWd$n# zJ#Z}Cc-q_}ot8A)A*+-;&+Sl12&&9csaCvEK6__|3byF+d%tioYOQQ8(^#G;IyVop zm_X_@GxPesZs8uM^H^9~6@9bZnkAQf$gn}&+G3{tG!G|RCY%QcC^txlsw3y4enMtV zFE&WWb!-#{C2jAvaL(M{I1-(!&cvy}#}?&EV$cqdngH{(X_OdM%TUN?;_@16k~9&c zpmUBHtLX|}ti;_!#9vH??RXxl9#6?A_bg()?^|B44$?~1!&iD~TJS87-SEL`=5tpHwCZM5 znwuA6jTvoTjc!g~ErB`#n;fmBXLt@BUMjjWNqK*8NF!56-+*zb=)rfQSA^;PB|$l} zbz*fGt^%HroxQFSJ@1(U{2PG2;1Dz9sAp%Xe8PHeE>3&^cEpME3BN)k#d6%h$s>NL z)~mAm8K>(Sb|{Ianoi43zvP#wtucUSha1u;eos418;3BXF1e|x0SP!iJ+~&V?5a>< zLR*C2+6als0f%l@WB;zrK-fy)=Y=v^B13^A@pVcDzGf&8OuU72iM2IN0TUCRUP{7~ z8`oTVDD3eZxz{>3U9YG>*2LQ(Ev?o=wOr?Mhh@fvl4w%;SI6S0;IxprXJS$2XkB-- z>jt{5OVZUeB-|14e36JLB^Gs%8(P$W#cf8aE!xPgPC7U+t^JX(mIe@;W{sKmQPu za4hiP-2?uwnRA@yJs)JK&hn0Z*x(*0`hy}`nlusRU;ca9K6s>-X8*hfLucUob<@<8 zx|rJzG4Nv5*sv~Ugq}W%XHBGoNrVMb~Fu&w89&IF@B%z77$ro zH+FJJbP|HEtjz2`DSv%&B3yPQ$}O@ZYTsdPdcPBKtY1QeV$#{3DT1eGr2jNEvn)v( zZ+tmJQMZH$+Lv&;p87mLyBe)@)tt3O!zOD43apR+mg1WevkusvAo!Q>0L2$5fhrCaVxzxEA~-oG{-gfYJeg?Y>%2jn zJcB^f-cXG1m06vkK9phV=f~dIZu=I0Q=B-+EKuF0V%L5kIy==~qz zchfJuU*3<9Jz>gmn}DH1_g{Xwu!*c=zB^~H=Twqfafg5nNTvzqh3(L48HBtT%saM9 z=gAK$c$cO}FbYuUAFJ9|h`@=2mRIB-;vT;V*OzORN+t?Veu;UXC34`TMqA|90t8ha zW52`j8zuD4DGf5&1T*edp|&a$JY3PNhT`Ry!lfSxT{X`-T$=cPAm1yL*djxM147Di z7QYA(>WDO_AG%YB=uD!#H8VQi&%w%Ow+`=tlDfVjKrZF-6OiQDuKC|qDKTtUuNxfB zaNf8f8aJJPQbNR|TNOXa?mOkOk0U$#VwjDOchYU}0f6!h(5Dt>Jyq1vF#OuydH;|sU}v=d*b3fXpn}Pz7Z-%qg0tVf<=H|B5CWC zkW?fx8ceU$tTr;C-A?rL%~=}>=`*SVybd7eI(gL>(By5AG5i&}BZOp6g|aBTP*3e||{BqSn;HJT{A{U=XF_kl}p2qCXg6 zs;N_`4eQ@7#1lGnqtwvQ*0*K|;o%;YT*_aa67wUS{FP~9Y8(~)IdrC%bY~Wi+Qq`~ z3R_~fe~R1U7~kk(k+ZwYCFDfPXk4agc70yR%?s@;4dUvjELXFHtx4J+$K=+l6Jy{I zw$I@O3>Gl{ib7DmJnGp+R~@vCzX14!brTXj;m7)J53SEBueaqLj2*7Wh2x-9cUZn^cAYt_ zhry$rO^>N=L8mpjej-&78x(2nW~{QUlDc^S7L`YkNQna?@`tJGgj&@LwX5a#98Tt| zwCV~$s}QW2Rp?JMb@uio-id2O+bo}y?vE!8(URoh6OlQ6{|7&s0#y!bTU+MN!(6No z81$6Kd6A4-$2dVtCIW+BcT_UBvw9FKv5TwYAeDo^Ds1v9N&3vfb{n=JMxDBjj*0Uw zVe2X-7E>k_YRpt?!OIcVla|tFv+$*r1FoCMX09BUC2A~cteeV8jQI1)uV39ltyoL5 zT~TdBw!O4qLq%Xf{?vb4gul02?S~ogTas{xpI@iR%bdx+Xb7fY7>kG|6qxm&17rwM?+==@Q<`XvB~gP*vVTStmYFN!lxP>r+uLh{ z!oVB}pD_H0zsvCcbhYuwV>RV~?YV+pDrV3~1*w zFK~}H^jiEnHAWYz1tY$){<}JoPUA2e#U=Vj{$N73@yWUHEEYMSk|M9o-N7M?`xrMP zyuxIA2DgA{!_cxWD=(Tr*n2~GTe3F>h%(8BQnPO2WDt^JbeCusU4O)mc6M4^W9z?~ zMf(t9$I`B=?_nE!#g*kQm+mfuE~FTr2!rUQOC`S{Gc+Y*s|(5t)uMWQ+=kASBq~0e zdU#B@Xhd<)(PoP~vEcia^0tAOyY_R^wb-*-z%Z}G;(#NSN#Vqq7C~r=Y zF@6l|@hU@rB+CMX`~jUmp?c$u}k1hCajXGRj z-1Bx7m+?&vc5wwh{KS|&pDq0EQ23gHY#wW09n!b?dr5!N{m%moXlD{|nRUB}a-Q;$ z?^%%*1W^}Jew145-^$1QNNjv*pAp)=Q!>$Be9>9iTN{A%y>(XFZz8FpoyM zms&BkeIhME?a5f0Vy-hmT8U2rvf)}aG)XWyN$a3hMQJ-9wWmg9_zwcB_YnluAO`K( z-R-F*x%m;cDxZI`&h5P3&haS*W7myUI$f6Y9AvmUYa;tnr6#9mTyfhc!nf%kU);Qy ze>~)Sk_r1T&ffH`a=8Ic{LwXX0{7dL-w=ab4z@g6iJ-3Li^?v}^PXF%7GXHzjYUoH47d3MEArYlTNq`F1iADIox88oPki4s zUrou6@FdZxaRD3>q-#CZ@3w+n0oD^1?}V=B8&6`S<+wY5Fl=|R@ezj)dC zRjAOB^p7wS>msP;MTL~2p3mkt3#;rKY;g~1OLO?UZABJTx~n@#=#8 zAUZCLJdgZhyCTvKyKw*MS0OPSZitwemnE~hpsKR6j@X8-%F?y`^$LV^Zeoctt({HI zTYn+)aCrzujJ_A)dxQsIR6aPX6twt!RkikH=qYNvbPXWmhS^e?}|TxPOoVCCAf_QoGu{G+HjPlwK2F9;E+&#)w ze>yCUXiXM4Zg!;@W9r`$v;^Uc!i}E~?RZCmkKi*O?|6@cQl8H>JzaxpWiT{ijl_6x z7Inr}JHMRczu>J$5E#fwr50)sb2ud_Q8C_3mx`L3G0Dgv&XvQp?NZ^!&Zb@yZ}5%X z-LTuuOE?S5bVxG`uuMAU3HCf$Lm97x;=rP+4ykv!B{;citP%Yc_D|F1QS0k#L45|O z-@cVbj4pP1rG~_qq|13xykZXjlwpqVfg>+-`>g>?olAaN)a;Qg963EM;h_F9rHrmJ zRL92lr5EFWteDxssC|0vIco27`h0cZevu&?C?CW0e`oxLX)MB)@BF88p>MVP42t&+ z-+BrJD_1^pgD!)X4+ZKn@=jIGb-iMZh!Rur!U45T)(D_H=|+)|Len7 zr28-6=C(IUZoAYldh6(tTPhL@ zDAoLUbK{_2JbjO64ugHVnl5-cu4T3{Uj-a8R+KQVT|p9vfVeyZPou=0KhDMI`wJm0 z9<{xLVbbL^f?8gvel3CNzd5f?ZESON47?}gdVqpX1v$dvD{uxXk?4|0MR29>=w$?r zb92SR%;VcU@T=`^DdBgdGSkfO#tae{%wu?T(lWMja>DU81Um7*s}x;Kv?clqMyOFq zgFuVOWtGZjvxMO36K$?@10`@PFBo7#KM~w?PC1n#Uj8)Cz;3G?r&gwrCH&5O`S@Cv zsk080kcblh%Gviiz+yPT=>?+G!y`cqqAVF5U&GwoY(niNHY&A2#}?9k=hS3YG~H^~ zGZF|+W@t+;TAyX)b4Y$rL+_|&X>gF|>$$AdZwv`bRQpWH?U`QI?GQRL1}C7#aa8kw zCV#M)+BKxCP@IpGnjS1o{A=)ir)9sHrdS1&m;a`9Oe@h3ke_E3F_ObaS+zSf+fdTtDCN>BCf4~ z9D(e>E|0NTdhGo|YLK?c(R>j0?+8u6rB2b{71d71wHbK#S^Ph1^<|WAXcuns^eN{E z*+6cL!{%gX==f*8E(xFL*z0=9Zmj@~Ia@L3= zs?~Qe9q1GHYGsOR={{s5u{N&feXGiDpY%PYi>r!{NB-(_s<>lgU`Bh`)7T@?v~t}s zEQi3P+=o|qdhEpIR@sU6(*O=X4R<01Vjo`7k^Ilj_^iZoOj(1hKTBGxkB>%-8(R7X z^@1vj)0M>j!gyZmuOyR1ho(aZbY;F~T$Qq`hIey3nQ`gnF=eSmT*XXXV`64zEoa4x zofT=$Lg=#zR83Yt_cQ3oZMFAz^**9j-I=U9Ei5}(6%C>d%LGX}5(bUKic6!&(+=B0 z%FwB$*9;AL2hM`238txRre7<`zYofOi$6XqI7tBc$1jE6yW|V)-Jz?#v6FNPTG;pp zlze7bmXynivEe=H<=(WeYh@j}?KF6e2-Ka3*VEJY*oF!;n{YZZO*X8HR4$LfjO|Bj z2Pgj%s11~p8e{GRo?mXg2<-Gl`*7kB7x7K^}?vP!1!@oQf!@46HOAOqS zAFYBsDg`9_)eNZ|e}h_|e75WIR%+pvF^1oUQz`7gG$c#LpL4nmm8jphTwcy{-yLtS1##<4n~BqDGHkzTT+R zdggEQi~K~B1RmLAfmp4qoWogpB=|!fmOQglpgD`rd5a$|d~HRT^gpKM|Go9@?Ak}E zhA8dliDkZ=MbWf?K3i*a&v_o`3ObHPS$RQt1x%W)cj__*t&5iL>L zvw=_>QJlPd)F=OttXuqR{UOc6Obt^mEpol2xNl5d#&nHoyTL0%lA%SV~>Qqam4|9T8HV2`!-*3Q*NCgG$mrb==9$k+zW zKAeOu8$0pK-6Ysej5oDBid4efHBnp-ylF#BY3|dA6nRo!V|(!2lY(i8oztr$!wC2S zu*sx(Tk4Aq*Kazz%AIzWv9qN}ZBM(fjF5=D;h(~}^Aw#G{!Kw4SdWJ2W+!}wY23O- z*-Lm-ocDU7*oi+}2v#kFEosI~xnxVtuzb9ru@@D@)FJOIs7O!5O+op3;P?|MOS}So zqlYy7x*emC19=^3Md}e#_AM!VFK#UIb_OS`sHo|CRILS(yU`xKdlZrkHbH0-xYCe9 zaEeM=LQYorZq_(@)Uw4T(JjD!Ku=YoL)};Djjn+ssjrFXkmS(K+PS|@6(ya2@zkfp zgr$^<^=ZwHbX|1HUajifdKpD!>zLd}#1zpC|HMBdUEj{@yKQr|JW5Y4Je5$;$j=%wz)c=~bDwkzTuD@$zU4i=vZ(9FTA5 zkC9X*)(=)P2uoIH;8R$7Y&HYMjI80q#Z^g2=rVy#;WtA_qGB)xs&v~k9G7J$C6oi@8nTT==Yg=1To@vf4{U`Ne5l(!{ zcyU7yUorluXmbBS@Q$m=ujXm0itBQH%b-&e2O8kS&7^^1yOAZqTH6VDiRpcAi` z!|MylYNy|@l~;~)CITS5+ZOu0ji77>@#WzlVB;kP%#P#F0(>TD%@vzc{b!OVX_fHFuDHaa{T5hy+0sA zX83k5C*2b&UQ95@y0qAb!87vd&i6sFsl?CVBMEsX&BDy6zqwu0>6)pq32~^jlK&=Y zaO2s50(fJp+C${aixR+hjC;nMy_iHZSK9=|fxxX;REckZ7zh}TZ{)^tHr~_ZjYqUW z2;PHD@wAxfRFe6%{)VK|{fY9%aktc6g#&pPR*SVxizQ4>KHiDpf8a#ahAxLBsHEn0 zc(3>>J^LO3ILn%2s~I{5@5^BIpkWYxezk=Rlm{*gX+1C^-8ReP)m@5Xd>?r3ZMCKf zG)A*q3B-WQOC_>*y+l$IElH&=OWhJhWoYNT-G;wyo}0pryJ$|4M__ti;Me3 zo@U7+Nf7wT!()%`p|PVw5G07K=%FdD)GK{Aop`*X*L_>r`4UdCJmT%((HI?gl1P(6 zpj`qgcaq>gkXPsvM%8V*Z=9Y%+1kP=L;#2o&kKRBgL=kxaoAEnXiI&~n=40)jf_*&vUG z-QuxZr11i(b>&{P-_;6X_U@k#dGnkWw|{d;+eg^ZhR8+kV`u8+_AN?^`_ z_KnS=g}z%JU+ZqHk6Bt8DZ-9vB&heN?xGczGHhQA_cJVUpUFA%20FiR#||mwdi@^>z#K2ra0x@LBMY_c@Tb4AYjRm8yrR zu|xC={L<|g_;OC@b@HV*TBdRmZ+_&uN@AR~(U$xw;e7v0BfkGTqrWK!KDIQy?^PP8$a*h0a!-_^ayaMYr`sUX8<*ZBVvR7LJgQOmEcpTXTIfkMn~cS z<_?DYE_WdOKnf((-$3>{bkF-#^>wIrGfMY9QwnVcxgrT_1w~am4@c+sC1Uc#_o% z-1ycvojMg*;H3x*pA#OA$jzo4+xEu$Ws{+2guxCXP+`Sf{=~~ON>S07O^V7GGRFcR zU}|8F`K@cQPXMO>7Z^)EG9oaNX?p<6Ls%>#c)u1T4%hwoRYG*8!#z;9qsI(;j%+w2 z+G25z?`5|RqfvzgoMn76XABETMS%^2=d=e&!0G|6l>b$M=v^$U>AY{wXHLL!91vjq zc!l>a*5o4$9_J#hHPj%)YZDght@C&5`N`V2J}Nf4zNsmu+_&+kWs#zZjZ0Fr^?fsH zuS+DnwY2Wuqh7Xwxo_}*V)&`!r;4H+;63tG+Amm(e9X50I2(vzkY8d#?J?qPUTe7( z|ELs(g>RsIhWjU?5X2+}WII-LL1xDTX{{(%%u_XaU^Y#Lp4}*5%q1iio2U=zIn+Re~=3S$0%SZ zuU0nBlt9jGly|@T^OvEzuQI1E54-j^RruV>F2orgoPDr7U)w7bG&SlF@Eqfaf5)8? z0pICfkr%tMReyaJ`q=?RZ$VOJMt@e#K7kP0H%FdfTyk7q?S8UvKf$*ou*zLhkv_ks zqEkEa0FFXjZoBa^*GdHfc=N{+!%PD3^JISa?~;G)T)Z>>*d#I%jx|r8=-=IqH{@lr z@(;(`dENOqqIw1D3R9n$t7aS4exHWWkrXxyuJKn|1JM=#Lpy`)f@+KlixXz`VkInb z3h{%l@Pl=#j=Kr{R-PPen@hN54W4;k7X+9ORdkDgjIo)hMn z6zlvwX;Vzf32xM_pi{SQPumLvA~K2Xca{I}JczB1<%FP@JIUV|6OsV(10y29(6C(0 zm6qSf8J_?@RxRv?`@ufv7tqTF*~Q&HzmV#L>J_SkQs@5n>vvgnDZ;9uWUJv12`dPr ziy{Y$h58g z&$DL}bp7-iM2xn5|I?Epw!EJuQL9roG5(?g`W>PUJeaf<1Bo*sHInPeSD6tUbRH^& zP$9M;L163jVv@0IG(9p2Q1m{_P&vTfR~!J6Ne?m@)@OFl!|WZdlg17SG6*~HxP5u6 zN0RtgOM|dL*vi!6r#X-R+y1R5V~LidKdJz7rtzQ#dw$S&*{p!bLIu+(FR{el&e?Fum~OY%(BuY8Hf@vKqATmR^ped}@$Ki#rRc*=~dX#2$%3r(yQwZgF*$ z_r(6+9qir%V)iy#0e{)NR0{p=5>No3*Q-L7d4Ekmu?q^S{Sh5E{tTsD{tE=zzK^B3~)` zhXT6w%3vKmND17?$jCfB`K@dAXv(tj@-LeS^o}LCL_aOkHKIUpCBxd(H(BexKo4)c z=c-n) zU?W`eUQ7ko#h|8`XrvZP@aLEr8X8Xez(hsZ-@Uw5(!SYq@-{AlghyuCoOL#u11>#c z&RW9AwYSs@CH@%>#F=ujdKHtF6kY$e>b)GnCvCScKKMf*s71uUb{e{PoCyf~S`VS1 zkvy{Jc-SV}y-~7pfhMAmY>o=iQ#J^lYoVF^ICJJ2o*(ATAA9j)h(|cJv%)NaIyf{W z_v+-c0fLql7Z-zoovFnh+c`9Ue|#zsz@lx9QAIF?QD*A z3se(>KXmKK2jbVtQ-hrLmxr485I>Tw(_O!CT3CdFfUI?vk0A!e@ct7{)jpW6U&;~C&Q3c^5MXsw!gn*yS2sn6nWI2;Lj|YF((q0M41S{ae!aaRC z4gwS#ZuDuo9yPjbqmeg&9Q5X(ulZy8wPFUjKv?Y`j-_F3ONr-&#gS`!!-|bI5Tu3A zC(&~7t!alGVE-RYD8yE3kxG}TnHdNmXhwjPBnhda(&~0WXn+kMhXrXRfIyrX89ebp zL48v$Sx-+Ms%mN$>>2$I^i5kNXX_znt}n{v| z-xKoR*5`@*HS3?eY!fLYMwbmT_eZLW8gpaltFL$()5g{t=4 zi9f`j^&Tw&Fb2-oSXsAk++1N#_SOFP*yw#qQGHib!4OfHAV1RQ5K)jbqjW5$ygm4_jq zsp3z<5oZBGtC76ADS%NcaQRDfMrk4cb7uykcmgGn$i#hzGQN~7+2ObKjoV0Gdy zidWt5Hw}wFMYxY$QMrxpBb6?LYf$6avX#9Iy~bCs>zgz*0pnJ(pLkt?HRKFQVfR_M zoso++)%8c;l@wIk`4y#5*hr`4PiKQh+YwJ+pRZOM7~3!SZUNNnbu&twUdxX11U$pb zb*T?Tmp<@iz^I04hUUwU+CNPuS> z@Bt+yC1y{UMp*lzne+*S7_ac9x?IRaZ@2IwdZ>p*!41K1Ga?kH_A7!u(=!G718ps> zCLn+UdQHGg8$dv)9~&1f?CfHVssN-2I8(73wuISa+;of|9563CrZUC=#*hli%2or0 z1(TnBe9{5?-eeYS@7wKEAQTb(3q?NhY+zhKrvg0l*4@=1kW7FaK56|qgC4Li2C}B+ zo+?>wy-VzSijMK$@ccn$fx2FWZLSY9@^Pt_9NcycZxPnmc=~s~o%6r%&k2?uv$pz4 zWs}jl6(y(Z?Rg$mUy1*ooh2Y8CH2l3$aLxe*XRgOTrq%gfw-atV*q#e_oJ||u1AMMA*J(KG2(woBrE&)*kP8Bmm>b`NFym1@*HsSf3*PF*%qFj*E$1%IUZs_ zwoBNYfFtUVh?Qx;YFdMgsUzg_e60*;!imYr$@T`1RQOWs!^tc_%%bh{Aj?S#%lz-{ zXe+$#Vc+k;*Fx5h=q&>-r2P8{=Q5^hohSkT$zZRrDNaVU==Glbqt|5DXIt)%;sGjWg}Vk zXlQ>&*8JL2frbHVn8a;1zBmf0qthhD1)lJEmy{5P8A;hHC_eOA-O`ehFT*CD1-_C z&{i(Va&%ZdA0Z&Xo_Knng9r=o#IpSbyaxzez`+ITmQSkgTQP`Tfre$y9N6Y16-wxf zcd3DaqhidvO8S7JKe?J6ML+%?ZsOZxX;I7_h3Ru*-S}v1}g*bDeD1JBs16lHGtFMyYeutnET?*nfKWR(01of0}(y#+PeV2KnE z$mZEaK{u&}Emp2jqD13i7(RVqgBs2A?j`k=Z+2i1_ld7YgvrkyX%4;1xEls;?u6IAW8>*xB-aj!nUu*fGs$#*5JkgY6PJ>?T7?c# z#vdOnO>YWxoQ($3OTmDaVWMr*gqr+7Y~S&=-!zH8y=-^`G#2~Ww>iywU1)_<%^Bur zS9QY-nUjHk4p4j6FTNE2h%Ys;GP-Mnpm8DlR}TYb&;6P?AaW=0KxqzdYTz8U*L~l% z&&tm|*o&Q`X`fW9$Jde3$Bfut!$_x^9x+94V9%t_TkT)9ewZzyl;-CX3zSQQ5BEw{ zc3g?9+?;sbu9vwfq$(U$c_0?Uel~yFtP|U`5>xjn;U3?B|2FN;;neM`R7>mVkB1dA z8f2JHrA+iHR{cxZZO*e=+P53CRt9a}No6qOVO&d~+97T6&QZ=1CLx>Qj^~fj(QO$Y z9_G684K3ME7eTKB@aWXG6n#+0N@f;9wM1@mXx*>ORS4;0=Q6d zI%iIrfP#*=kWFd|d|A(PdE!0Y085mAuH@e5&Hl9VsFKpqBDxpaE4~@@77GQr!H$PF zg_6VF5MOa%aQh>~oZ{x@ z=JFU*=G<|y8r!-e8|4aL0RM9;LK$Ni2|5M$T~*$j+NW3m+rz|f_Ohr()ULC$H0&Af z+Y?umHIv;g+6P?zI8SV@XDjdXHK@{s-@-bi^0*Ql(~Nz_H)AUFD%6;hIlM}1MryM( zv*Yv8-aF6R3vXSA>X$dd3p8=%)OjOJka19`6JSM?hF1JUxOXoaj7-Zp`s^)&W1+D0 zN+aRxIe?Q=f=u4p`epJb09W?A`#KE-^j79=FDHc6D*5duBZ;9gs>t7QQR&eRS=LFYmswO8_-L!1e$*rNO~$(epYG075{RUpT%_VktaH zV5_(x3V)HX2_(?E!-vfpo&yitUu@i(;z`o?Wvn9uB>D$uX4EmX0FW^uGtr^<6pgeY zBDyP(i!JuR_Rrw9aR7Y6hXPdbEoNSOuEK9Ray^LVoPsC#^t<;oa)ddD*6aHK>Pzr% z3fz3x=!$7~rEUt2(9!q%J(}5>KWzg6aYmTny%aUsGh2LRfbei%{;pA)UpfHge`W$ zH>xn=3~+`^tdnMk9o~xq04nkgWo>gaxC%CM0-HW$6VCW62h9Zh#Q}IX9})>HQ7qlS z0BDX_+FZudv&XNpQ^2g*qKe8`Q*E0wzcLAfHE-rpYh&2v-6v)1=|dm(4!%#S8r;ht zr>~s~$_BX_3f;DcyF0*5<51y)dkU5}lvDPeM84yWuOC>8^0>6vR9Oi+AYu3AeP4D> z9?pds){1i9=Nu~OY`ksq;5}K%voije%c2S_adPugN{B{6wYq;{=MYK{CGsKHOcwCU z>tKYW@yA3Z$%0;KreL=yJ^erm>9v~BF$=JXkKAElHBu|dIRq`egrqUbMVWo&v8Zp_ zBJ2Cw%O2P{cK0ag>X8xS$muY&xAFTeHdS^pT95Pik~_YXPD9yKe*o+VANc)ke3lz z{g3l6q~W*{L4yraq&bv^ln3uguu}Ti%ev};pyJGF*_wWGlq1Us}({Pzv zn~?w|^0bwVL}pXh5`z6a(I{HAoXk_a|86HC^Pjaeo}G~q=?P-$f4>dSlYCJK>)Odzzp#~J7baRGiMl4ByE*bm$ z1%CfCLwc-XX!}C9HjWhx`dGDCIB#nK79P)ZhBQ#V4xy6IP=v;;sY->o7aHghgH`eW z8L!4wX?*uEBph(5&AeS6vK)tWJoonYDwQoivWNq9#MYL1itINK`eR`3y0dJvfi&#O zer7!s^^K0ceh){S2s+n(X=h0Z6JT5q^qh#45@^R1)sOM8(O)zoXHN+0>Lg+Jk{3>I=a9tzGk-QQ)wI!>VNXt;Ut%@ z0eZheNtX-)#}(}>E20Qhz?Tssg7GAo@aGV3kMJzZ>b%n4_nl+Cmq5XkqD7|&Eeo~} zM*2e7WY3-2r2U-c@yy%WV z@3E7ZHttECX)H915o_{w=+F?@-Eh40XM7UA)fyeRDxIgWXegG-%Ru9VQ*!l$yEMWlwgY2u<^uy zsQ;QELCCz^VB=t$h1HIBB2ffD<8AsFrTnnZuuQ3L@cYc=uwQ9I0u*-p z`}^hRr+ka+W9`M;KEMl5pJ{2QHu+o_wk%`E#=gIpl6U&NC}03Hv9pU$6bnrCLx?iO zNOW9PtbSKv%$74y#jk1ePfZjB9v|0bvp>_I^%~%jrw%=IjE&cKMiEVZ2!h&jXW%z; z*Xt+1BDvgZZ3qZ(SO!dPt+`16|B1>&plJNS$(f`HQf3(h@+FW20Hpt~Aoxd^P!720 z=;#1KT%#-i-gt}m-LyL_=(Dg^&FufIv)+ttYghShU9!tRB+btVBj0EeRd<6;#6J?^ zJHlqIXZbir$+izbh39h}RTmtl5BF`>s$O)^3&%z&J3FYJPcZm7D_0+y)(fA8`(g=K)0fV*#JFT+p6POesFPOn z>U?9R?V=RZyG>t=s`Un>o+{Y5+Lg@=$Cv^@6$yPZ)NLWJraHai{oa?5a30=~zA{*| zt4FZB#cTCsDl%NJ)TRKx=yAuYsUrb?BUzjgS>J?>8{ug}0`J>?q-i>6NJE+L$E~+l zvw)^OSI8?x*Xeo>6(d?TpUW-Y?)`h`0GA91hV9hAv7^g#kFrm7!>Dho@+xLD2)T}H zbld5fH#VCH_f5WL$HU0#?sG!N)-E&A0jO_?#UJjqvXfs6uDyE|bm^G8G^5>oJ$7hN zL&v)P^^Btz&Np|nLGP6^+tfLqNBN&#f`LawtkV<9`*CgEpIJSm|LX?ckPubq#MXE+ ze=V~8wc>AK!cS8pih#6!AdthaGKV>cKhhvWb2Rrd*ENk@NswnE?D(ZK@mzN-CN z@Rwe^vRLy_PqIZ^HX^s(`!*WxV*u1e$DX8;FeZo!;DQ+=VV?%76((^%_S{GK7QAz+ zjmx(ktc|0533?Pwu}B)<20+7HTT>=nbo3g>uSESn^W7UqCOppkgZ?%+S&{agG3GI2^{@^xR~Rh8ubjztn;S+= z8Y_xy#_h8y1~^^F-by9voiNA5u(BvCJjg*S6E>)7L=vHK6)Gd*Izw9e$a|$jXodN z-vgqqGN-OBd`Py8;HO$ElAcX--TvBg)(-axHW5_O{d;A?-b>$hT5bF#@=T$<8uvrm zh&Lzsm-kpz?FzTuG}~wURlPf&8SW>6((Bi|-ith18&Q4Q9j|I#?Q04>onocSx~A^v z;S~)!CnZ?b;Zydrdk7&Qa+9R88(R4KQfO*2;ma|`4By>xC4Bg7W)@zi?UZG$ zpq$y}Jt?F~26V%@GZlGxd4T{vFHsC6LHk93@G7^xcPuUC`tU)rL?d6TY|@_BhMOd< zD7x|x&@$jPHv-K@egV$4>85+p+^5^|n>WUndy3C#v8xojclHS(eFBOo;L`&yAi~5N z``0V!cYfU8V0l?Mlk2pO7^ILvlk0_57k-~FIr==t|w({^ue*K29_RWqqc5? z9htx`hI(do!lJayDpPsq4O-%80=kT!iSf+R9ZR)k;rj8MI{8N5w>tp=;?YQ9Ny1^Q&IM;ea{A5lSd& z*{%LV(_!)0b9RX5MO^j!iIKTBbgumOYDbY zL&C}!F@V+XS05mtE})-)AVdY%2jtAD)v{7rA6a^7u5AA7_R~PE8ewMoPROW1pO&3j zz#NK#GwQafr{HD*_2YALc^;!Dty1D7^U}Gyg8&GJ||VSuW!CNREBqKAMOe?&bK$4KTK6561U<`3NlT4(h6U+6Z_$(l)MM z*qb_|{>$=hXJrF5=!)T`XHsL40)`rC@e?upxpj4OTugtvE=8G03S^tGvGlq_I}meP zfe}xlt*>X?mV4IGRQCHGEWP7NvcDrJwAMXxUFJC<=uDY6{U*C}VAbcA$5IhpUeG|e zxmw)on7;D~@f;xrOdC*ET{%mj_pz$BJBK>WSE;ZjOW{`jV?MHwRuN|r>^Zx24IR=2 zGaId|&##L-nIqDR`f?uz#CGbG#i-FjklS}B5c_b@9UI$n@$|6@b4rujE^ntVB6a@o zEux(OtXr4E#`v!b^l@%}Y|h;J_*rS-$^0Jq#T8!8s~~x4}Xj z@*S?>2H0@7WGkgm-3y0M{k{-p9T|q$s)HdMWY{t@K3>d=MHRo-Rl|q5nHVafGPQ~n z7ddjn>ZgnsP<$O6;zyI;-5nET%e@=r_z0;D8?WbbTxc;^@OcA<>>=*MOk|6fQKT!@ z2m1SKV`3PRCoY;)%iJl)-Mkso?ObG)uSbLJC#iICYn65FBoKQHh3|u0ChpEA`)mDditM#I0y+g3b0l!S(bIg zl-epN{P}Kkho|qAJBz4fWNxu2NKnKDp+{#AP-On*$Q6F;{ulUk6Aq$@RozqSAzbmj zNiQMcp8;d-3k=>^gUPNM@@7K!QnL6Fy}dWlv71-Us1CSH(y-Ue$r#~k#8RsBa|i!GZI;4IGBaH*&up}i&+aFwAa_Ml!&tW16(Io*tRGA3 zkpHF+Rz5a__#?vdDi7y91`s0tt9`YugXd3XST?whL=*wy6DM<7fr+S%q7sh}>M@U^ zuJLrs6TH$|v~EJh#U6>NmKF!6gS=72R%>2$&4wO97Gn*Z7wG-9lhz?k@?bg}@=n zsUkvncV+tg-%I^{)7Ul!D|^SEzkkUhI0YLITEuH~fb5c^RVLoJICiqFwD40uB9?VT zgLxB(zCbP2d_=^pm}%<~GBiX?A!-2dF64~F68wQSGQoh-0BF#3z}1XUO$rz14m(>fyMuHspGIG^w2*8jKe%_LcppTx)@o?G7!VbiWiH~XzCHMc-!#zMZM;1L3 z*aqPuT}_UdyvU9sEKyrxeiiHpLFtcd-4)8nf4A;w?j_Cm1p>ajJ)KGU!Pzh$IZj+JqHC)cbn72nvTwsW5@zP0YRb8n`DussFt-^2?lEAju3&FFC;1 zW>2a1*x!O`CW5H3BX2Tu-4M{ownpxcb&A|l3w1%VG12BmI}w1HbeU<67Vb%P-|XXJ zIpd3H;c@vo^x|ou?L!*sX#f0cNnWiM|H*O{Z;zzmi>S4cr@@* zRIlXFT4ioIxD?@DrxFM|8>Vt#rRSu-klx(4$wT!ip3@|X0D9!_;^lTZ>a!i~%gV}h zCrj$<=1s`9D5%;a<#tDMuf2{bBz+bn?h5F;i#p{u1*1X};930vlan$tbm(BxUu`p6 zs&;++Bpa=4ypF4;g$^5r4|Wg5VjaW&x;=jtf25Z!rKJ$_!cV*4kLrQX+OJoRl}>jO zpGm~Bco`!X%L7jd{m(~&MxL+wn4jQJw1M}@x<->okQI_&@$_ZcxT()Ot7|jzW(Ezy z53|UQK@Y^a&)e{`AmKgrd%vLUht)@dI+DE}o{TqvU7dGU&mjoCcY@QMqfXBim-jL}WQZ{1ZwESYS!?gO7YxV2C zJjzdP@2je|p2VjUL~~_G1wl;=9_tuBu(Z@8S22Z*D`$RIk>cqAaoaAY*Owa<3xDWw zy4d-V@D3XcBEPUr2iGk9uL-Fn_5W!szydXA_iQ@%=>_5Ld*`d+ca_WD+Y|8H1-mMB z=9K?&R)AY{+bMB4kTHQzJ`Md(Q?=Sn01(yyEm5!oKaic6K96 z%@<7BN>F|!#?&%{_B)K&SiWk9%$XUwj)!yl3axA^v?L33Lq5jT0f3j;9Zn|Qa=m4s z_a%=3QKu73ZoSN_3@!h%fJpQ`{LE>+1b?j1--)EUyO;1j4g3ur%i5fJc4&FenVdEXSDo4J{}v@!|ADG4i_v7T^jKr8r9k*CJZ zr*u1ZF9Hxc7QEYuk-!O)5#8|`AOMJ`DzRSVA7@OLCB&E6doqsN=S)fL&QO zdxvaUb0P#8o6;EPB|r*&)(~meVGXqSk45pfp^tZ}Wm&&nRhy(}=ks3UE}$Fz-4{zZ zw42B~3NU29$#LXy_60j^sBB24#u|LxKNKR`N=l;v4Nc8 zFA4|>`BV5iuyb~o{Ph04WJt%3yS7~~c;6gI$~d#FO&f+-xQSED*qlaenv!W&8LRaD||AT*>o19KRKN zzN%`z`mCb!_W$h#i1i&e*^~JMi7}ni>2smqt#ZCCg!$Y@imkwa>CTMy=)6vBT{#trS?mtg z{~7)y`7}bx3~kZkZh@ST_o_je2Tx z+t;qw&v9Aaq+p)I(-H^kMQYUfU8G$rc(W%&J0ruFv8DXRVr&T?%}F& zgHCB%g2O9@tp~meu^kaea(!R6uj!bNJWDM}i03Snw|=ko^!;1Upti36Ju{RpcB3-; z6GTG=Q-huvUzzrW_Dz2h53<`1u34D~b0!b(Y-`-Sz>d9oR#jL4phN-0CaPo~cttyk zi8OrSYxknZ*Vf`KrKR8G3T4djg|Y=V`7KRNL-G!5fh8Re4-a`Q9U_N07iZy8`($^} zADir`C8qb~QXf&9DV26VVRISXc)Om~8Tkb=ub=Np^T*KU^MhPlFG*SK1JBqSPwZ=$ zQq!_1i`8n9HrSA0)GEcCJF8pA@Q$%xU_8l`s5qCHA!J{9_yu97?{5-V`tv&c6xw-? z3oCLzH_5&$k2|k>b8}l^d@+Iugw9JOq!O4xCTLITXqvl^>{i#~VLRS+L~pO{4ATE_ z>fgM2K7e&@j3~c9J>)aqt}@h!<~^wiybxJ2oLwt~-A=CFl|Ag;@#ERPaSDj>e`FW) ztM1B1h;4TncMj@^(j*8kb>aBfrkrU94hpTZaAl(ELR3ctxMlJak<_9OmfjiNjS00? zNQ!GEX_7Ba<*M|H^^0f-Usx{_ERTB33SmsI>TPYqA5m7*RhU44&;g2%`OV%XgAfqW zgiWiIIb1kixIt~c%p zBWITtppqCDdyWe1jI2z=owxnv@lRj(uF{}6coXX<%&uN<5g)^1cpH6#zi6g(dY}7D zI8{Eil2b$^NVsc=E7~UM$d`!xf8y_MM(HtaPK?c)K4t)|eFf3@b#JJ{_$H2% zf}i=;oNxHxCIQPX!T|Cnt&X1wY7m)c|u1-5F+w|p|uijW_wua>ek7nTFF<9Bc~vn?Lxx=s}? zb2_}vWXPZ+yGfd_6el^|V-2Vyi{K7*pjZ2=cmA;O0khaU!|u`761vh{4%HXc9Z03p zYRr-~3i+js0MU9_P|62}ur zj5<=Qitn+@L(#MT6+}$el@K4V%7~xfUkUJgr8cZ>=e(1>Sdhcd1_nR4IOB!(>iiJ| zMxCLR`wB)K(j8o5zu*s1YkILdGpd;H$h@M;e-04n+ahW{lh7w;DV9ukiT6X zGTgsjR=L=q5_e!bJK$K=zTGJE>dK;_VRnK$dwyQtdSUY9)l~Qwo0Vm*&9zN~hz^9IyP?cN5aem?tgiq>EURO@ z`hD@(GPhGGg`w}Jeiiv9XS^r*9X&n0PMd2y2t(IUxBm^&iuZ-0YqLzO9DKEPq$iR^ zL0M6iDRq4csnZ`psKA%0{18`H6@uCOHhTK|v~Aro^5Z#8U8+?RuR2k-x>+s>C?@uv4pUYPw>P3$}RA_k^iEZ2pxro`30Lq6{&z2aqrwBa|p zS2L`i30V}z6x13#?B7wD&Q(r3*sCA%V@14p8auq2!tXmHCZK0kpaY$wy4&)QRInd+ z;k+mLRm^uzN5Au4g=hLWbL|)3&t;$7H+&M@x-=;~+-0&BrXe+F7#5P!A{(MUH^-C^ ztV4IffCJ>@?mic}Lg5H3E>5LK>f>WJiaWeG*>ISrfUo2&kkMm&Q#ev{UhIPmOUlHK)uQJI=J<_bS2 zQlGZKh=_P9A9w|poWaxpG-TxOIXbKuwUNM5e3z3 z)PSUslZTioI_i-kTRPOY9qhNZ9*Hv|n4xK5YME71!qxEbWKL4nEqvgcCGAV z%hVjwqoYJYPmhe@UjDkiVsdyvX;omAQr&#f$`R)&5)HRGt#XH8U$0JZ4I~;vHd=<` zsP^%5ytLOxSfcby84o6{cD^7_kIrPieSAmUgw2Ngf&E{R=%81QqLqIy$@64 zg5HNNWG=6{W6ZNcQp_uOD4J{fTHN%f3daCbvTNKfZITi<2BIQg z2FsNvy18^ntQ$p+JqndyMi``rO$umtGsdZAcMkW((qHslV#*QO7OaNGm=H3>D{~Y{ zy1=}eo+m66;J?q7EDI5faed4`=~LdCSmSb`N85iUV4h0}&Kp*iz4_nLto5c}Lga$W z6rC51ougY@8rK(MPX%IIn~7rPc5cwF??HPA9xSMxc9r_#f~n2^Q$cPfJ*?8u%GLE; zXG07F$QVE$D?~d9%_Fm#OTJR&$M-VE+Auvv+;^Dv%O~sCz@R{{IexZxz64Q(uKcdM zN0teZki%dcE9Wq`VnbtNUDzxzYW8Vm`YZhazN-N1@)!PKeiZ390{^OQZtGu*z`nVB zV%buqtX}WO7piNC%=hu}dB^op%21cqZ0sJx8L0B`&-f~t_Kv=t9g^v3w?E^?{T!?- z0SM)}CI6^OQiG=Ik7P1o>p#iQwzgPdmF+Qy*gAT5kjOWwL|DGo8C^Fwm)dw^3DLkz zAu6)DZeLcp=^sN2#vz>+IbHSW;dcuzQ7{|xH+4C?*$06y%#&L^^|6oY zg4XU!HQSz=C|+%%$6dTN__)2I;;sLb`Bc#@KO<)gb4VW zlAtm4*~>lDO_gS>{(> zwOXjLVB+eU($`nFcQ+((EQXG3veSe2C75W&!pkf69^o`;JELnLJn-<4zN<7yd_CRX z-abhr)+_$@(S)d_3;TXRe6Qt6B|L6-`0cqyoD`6dh;;W?P8z~-VDz%QMz3vPRQY5IpZ@&8hh7^?;Z^tVp5ul+Pd|5G zc1Ijsbc;0zf&AB~Or4?#){kM>9n;10M-z>P24YlbJ;7@#va-W#LN(r5<_h9T6y=f< zRgsJE344!yA<;_8FIzRbwo}ej{O%Y0Arn0(9(%up-0!d}Dc@32mkCO9n4B21 zV4=02tTnnj07ltwBtp<|xMGN9ynV*n1bhCpJJkOo7~AoP(RXsITmO&__I1Qcy|JlOvf^5>>8d|TOgNRgWLO@8Qe`_mWy*#6hd8QahMk+;w_vxDJd zd=m2(n1~rjo@Jlf9j0C1#T~t5l4mGE`2;i)EmLhrXup|)>X;zt=q0|9t&~sSav%2? z9!__)n;KzxClXOE`CM~7r#kEOZ8%AXHT-1M6alIk;d?kKJzGDDJ)H0$VJ3TVg#Eg@ zy3(-R&Z%yWr{eX7TsT*LkMtF;Ni+Io_SzYLfo=V$67o1BN*sqQtcu$c9|UXvdtg^` z%ZwL7%vUzpw03~m<$3Rt*a`7?>R}sE;lu=|Q<&+I%kW{;9t?(pDl&y+cQBPEMOcl_ZzsyTm1oL47n?fFoHj{tkQ`+~hyd2-6ejiVXfp3%Y6|3%#0#Q$ksjECPLVptCXW)13J4+-xCN*GBC13&e<6!0Rv5-)_f5# zY!t;>E0d)umuNQ1TKDaV`q(J+xPq&JVcLOvZrPxxlHhjR*l>48`5CUttBK$A@)&n} zjQ`-Ta7BmmYJ3#AOSYBF%bWUyK88=}1}4|>jouf_o$H%k&yeTCF-_6HLx&aL`&j?= zZj2Fu_&KqXmKVkReN0OKVsde`R^1Sy^I3#!F_2OJk$-i0Nk{B*wexNab~BaQ;RGz{PG^B7VWQx9|G<=}!YvHJBwE7yB==B8TgkV&r%;%>o0{ zIk14KH!!3*=$U@zfTG=qbVM%a#?-p^g?QK}(9qA);U6WY!??9Lp;p}KAcfu2mMc{s z$7%m&y6o3IR7u`z`TY1V9PC#t93BZw@YTwa_kCag;fRgAZqWNmSoiC=n~y6a}uc( z)jvetZu`YtvX)ppP;oFQ3Cm2ws04NhsHSAPTcEuYx|g53LpLvV4Lkd^e3By!yVH`A z?g&b0&00kaV8rN~AyiaYl3eM3q7xG(9RV|q5sZ}N-`u8*F)@dN-pjl|lf6x&Ta8;# zpY-zl)l~Y!Ao01BOK9Z1glOh&erety*M*-&Mmx%fW^SupOWmvtX_&j-F-of+>5^e< z1fEBdJJr{(NXg&QH>djELlw-Ge!QP+P^{20b8~|Ncnv2+hc#l8pSHLtlt{2+u>lYn z7knxl?|H$8h6D__ZMzaXh}BpVeIzF(HS_m>2&da43*RO7Gv>~*ItoZSMJD8Pek%)1 zCNop!tZ&>?Bo9;YIr?|E`|(Mm>$$mEP1F+}3O|Fqb4GS{0xFH4(<&-72?)n)YF&eC zYKF$qJQHK{7B42cuBak1F%nzWkP6O26E@d;R;)z%6y54=F3RC?p-T~tyW^PDFC$EZ z`S=zaWRM=cg_W3-O@Sv+EBRCf+dP;l`!hOv2DD(1RG5>cmDW%vt+_d{LetZUf%NO= z=U1;+kqT+^j#1CrXe68B-`{V%sd{RB4)z+`(Jhj;yU>2v6B65icRo`ivS<$N?EG)` z*`IGOxdmvu9pKfs0I76RCAPDytUdoz;H57h1>qWT3Iyg--GZw+L?zXbnj00(9=U>^ zvyGj%PY4c^366~tJ5YnoO}7bjeD3wzu6|XWYm#D=x{&E{2c)@s&&*oHqf==kxXPz_D>LL$kV_32JHo2dv$dCt#}gLNoAr zhRjD^%9}iE6mfgXM|n|)aH`f?Dp)$2^rV@ldsw4%tSiz=EBkS~ z(dRP7gv{paJ2wCH+OzV3_W5r0DXeUfWa@i;+WC+C!&4B#_*^E)J>qiwnKJO^5pff1Y(KT< zcas!GBjx@6_v1B{Xkycr3Cx$IcwSOez{K)?SGX4)G3Z1#6EQjI*fU_tD?DI@6-){2 z#9WO?gpfa!tTr~g9P+mM`2o#8ucvFLn|{8IzWKUcV8-nU`S8#Vm=cR$Y)nr}r%N79 z=(ulgT?VX|C5Q+zioU<{AQ4*pTT7p9kkdqig0v8cBk{MO!zFX(kgs`G4wq7_XI^^> z^eK1tguZb3e(6Dn=2APV*b)q;V&Sa+i$BeRelGu3A|YytKG`&B`P{J5Se}Y@kgj&` zW-gmP-Zr!-jk=S6tlJzZ{y(Oa9$6Bi7)i5ZY&%$`OY@KK7DZ|8{L-`Ez9I#GRh(jq zPqXa_9HpU4q2>A2>)O=|JepBx`-~>@VF-(1wD|_Bx?bGPh`|bqXkeN6YC?4~esoxj z4O&jcdzqV2@{B{+?WGZvN}%tOuqZudgfS0w@TWj%6a8^#qUU^zUuY(bkCC_zfHAsb zhm18}CHBdd0-#Z8_WFzx^(+BJGM#^N{-j6_C*k^H=Eg4*~o!{hO(rqZMMw zTu5_^9h@Q_ow-;0GB7qUAe6N8_UlZ<_Yy@8#4wSKyfpNs5e`G{uPCrgB-*b(tedy* z*hh6i?!>y2Do`ITm(zRA2C>K2e7t`4a|BS#kv|OPf2!r(?BbW>Ne$R}&^zu3)2Ssim9myh-|GhfWc$h zbOk^M6=6d41(-4exHvK12>AWKr7*hm$#O}fmbuLvi_jfr6QYETCuO(Fbr+dYu^e7{ zpT7bTGkMr}>%5tY*Vos8M+!j8t+%j?<52w{n$9vPuC8m^34sK6cNru&1lQmU?!gHf z++Bma%>;LM4{pKTAvgqgcmK})eD(gJD5?gksF{6wuho5Z5Pn}%hyaUj(@#^uu=S28 z_k)>OBuGScVM==DM*R*OGFW5=`C1cV((q?C<%+SQyjs8vqQuV;E1)F~d^Teu$@=2d zac1J&s~c(k^YcpS3sIGwlw$q}Q(B>Yr6Y{MpehW22iQ3zB@KFHVH50voqvw1u)`cC zNd+h=#k{S2Q=2zN)OL*FG`FkX74UqtLkA zSIem1Y9H@d(tCL5V>w4ZU#a{4Uw3dM%Ox!_0tIX>Xagy%8yy4A#3dz&4_@KV9~?uT zP@fcvKfrY)J1xEP2rc2OptaMJsqyb(^ngJQggZQi%srG9kHGKb`iUIr+xXh-k!Jnz zVq_BB2u8U2Ws*fR!E}VCUr|4FvQVAV_x|y5v$V{#c8zl83k89HFUwnd{ku()F_k(E z{~);hHOvY>&?Z-oMvR=|{B< z(ZrRcLgJ@^HRwMs=P3E28F&hcGo)i2u{Au$;o{N|!_@t!fHR69P@D;AYrfx_@-;cP zv(G=|&tU1&hZnQ1ZEI4k8T3z0UZj9ui^Q- z&8UEnF~oilZV`uFI(LY)<9fc*(~(_DpCS&qa;lTdS6!$Sqt7IVj(;coXo#;=XN60S`;@5FTR!00!c_jqq1sYIVIx%L$gDb8aRC&~E zR1+WBc+>(wC8mf07zM6`GBDRKoIeu$?J;|H2jowBjo6}mq*4qG{`+WNw8r@V0SR~Z zb}w3tk8paHVBW30h5aI=SVje6hZ@T?@PbQ3^O|q>1KxL^IyYaA(pHvjHs1L*1=cqA z{k07@+w06e^-J@+wG1g&&1-anj&wetoUO0rEZo5VWQ7l-6v?-%(K%8oX_y=p-Z}YV z%$UMuc*OP1_d(3}`i1PGj-jkv{gFe@-*SIYBx@4E;lqI;hV5+LI-TR&kM*4aVZYcc zZ}+rTFTux5MbHpz8vk*^(ebJJd9Lt=EW;M#XTirbGN-FNw}&Z3J5@{PeGdv!OiaYF z>mw7EUgg5hKi$tH`b2NZW(D#kn%lbx>XudM)LCIUo<0F5M*updQl0Xcb>Ml07_Wm> zil&gFRWMy6LAza2%NE_v+2Q#o>+zJGkl@~WS{xf^aB;23j&H2xH#4(}K86_r+yuTp zoo~%PH-z)9wEKE2mwjKhcv47j>WRu%+lFtv^m3bJy?K?uM}#Ha*jr9jHI5FM#{m*g z;LrM&WmICS06Y!-2Z^m_UU9V7 z@BK#J8`0e8klq(Bw-OC{-HvC3)>i)Vs;a32=dgh-UGEpnFLh36K6j0TkN{SsDEYs< zGtN!x`le5kSd9P<14;n}Llvl{@!4xZ=>Af(t2rvAwOVjKw(%v+;BoBDWQgnpat$c- za8-}6o=s+zfKfJ^j;1u>hY^kZpzr9wSv)p#>GBR#JKD@EUE!Am4u;`BELaTx6e>=k zu}x9j;CCh@U`)DO=7e@kB2zRA>);_^8dWp{;y}O%5tlYkj9~sA_m^6!g2T+ve~~vZ z9~b@h&?NWcw|Sd}k=9?!k@@9eO|P}LG?d-se-3W#KZIT5v&oBk?e4gU|GTc?XVPvE zH=-Z8UlI7?fWUMa-VKjTA{IF5W-oK}YuM(t4SQ=30Lcu0Nl;UMCPwhacFQ>O@|x{e z{k=PrAB*`#QZPMc>;=tFes#J=(vZWyTnAJ%!IlvD#THgvAx*zgY9ul22hE^j^p_;n zco;k~6l@at_npcG?R8zAeFL&%taaXrJK-R(m?#cLM^*MfRDAf_2D-E-@fX3aZM6tF zIT3gS@RZUseftuwRhmm`RJ=CNNXi%E?Jaigg@Pn(>Ba_47Mw*o=J;98ewxtz{SP9A-na?ct&!152uj#DVnGLMFvn4?K=Ks~hky67uUOB2PT}-DR zqM$NR;?u2PG<>U&ab;}W%Yh>y8<(OcEgm497)Oc5k81?x@|w4DPP4Im2`jHZ`%47t zuDQ()SBSSa_?eu73WTB>A7d_sqa`25EXT%{NX~-vRa6-V)alpu!-5&i$E9HCiCMH< z*iqlV_JZm-k?qu|Ap1E^N85~#h_+$`{%(jEn~l|7nFD2&W3pSQ<7m=}N_0m__DuCT z#uz_ORUHQm1So2V)~_aS$MQnv0>6KM2k>M*h2JTQ|0XL6$L}5IJaMln2}A%ZVz!WC zZwP@k8BV^zxu@pW4(L5uG@%Gz-7RnZ>-5ST7#~MHIs!6F>KyU_zs@+72H19--IdH) z{u%*JHdh|6TgDpA-3b~Vm#us6QC%%LN%Jw~IWBautDJ({uu zedd+giU;q1udM=Nz7FjlMes3W`~EamACoht*?$7}-VKYZ76S11G~dQR`|f;nIe*x((%3|@fPh)Z>q2QP44>?*u(=29*}XZfbUHZMhM1x!M|AI`lh2Csq~J)d6#n zQ4IiVG1kI8xZZ*y17xOkAXR-AZ|b22vEq?B1fs1SX%l+}3s0=@Fu+m_V5Z^sODhqE zY|!2FV~@4VVVqvYw6kDN@ZWaeD^O&f)dClQBCAgEcy$x7nSfv*Wf__ve+L;LeSok! zVT)~b+cTl8?4E)46A9cvP02h%dF2{q7K{DsGqssnBI_8m0(#rjah)%8TfY8O6qCcs z6G5q_E-~{vp1~d;z!eDsi*o?B1-K6Zd~5jswsV5N8}MoPQK6qh(zrfBx&OC|tL&z= z*O_hLrt8;ZEC|-In%r->mllTz6^Ef?4Jt>r6Lszep1o50y=-Bc##1Y6nl*o?r!mPcQN%xs>7?!MOCm$+U)1*TV=MP>bsvN)>;)inqOR7F+Cfeu$bjbu6iL& zaZY`>;CiVyINz9fi|>4FMf(gPPt5x6DkLv+FjH}=ymsVkmc`*{`MZ(j>U8}T$M5YG zmyAQsu`Y7dOie{4>GF}jmD_im#dV}f6%X9IH7d`uP~e3%*5O#ZW#*hfS zbE=y8<0^C{xB_J@G$(XQxcYg2qkswq3%HtR4c4@W~;5R0nCm+I%7B@M-+B zhc>QHgfl4|4zgkhf^ACK_%z|a!gtT6&VH9Tivqzx69gcpW*N5k>E2fw+hRWiOkYXq z+RD=)&k`_euY}1CiT?w1sF_XYNvmwvBgpX2TG_}bqz@H1F)~Kg#3c&zXFiBwFw=zu zClFAjDT4_D=nNr-p(^czwlxZMM^jGzNt*8fTPg8!S1c%~G!Kk9e8or+#4))}M-c%V z5C#u7$Dxb^CxHo%vEfF-*Qzs{hH7Jxo)8sm3QxH{(DRksIG-ulzKSm_2QCg>AXCR= z>!$U1#YQ!;;Dba3=(l@J0GHHgEk5^8^SI)wVt@pV4v&r)K|obFIC%MWdB$SS{PaZW z784uMDc#E@TuU#T%qdMm8nM>QsGpHhmOzk7q%mA?*{}}P$TlGOYEP5+8`vBsmtz~b z%{A24BjM%*v0fL`ulu>2%6_u%NS)5MaX)3m1lM5a*eJEUKp^+i<;LWsH+;N&tA5dM zy`m~PHk?=}=eu<(bi&$r8XE+e4CZK=jE*taN~F z%7*7!g7xC*(pl`yOheiVzDs{fJ9Z!@{i>pdttW;fPr2UXN=3OPopAfvSBecg7Bxf5 zR7-McJ(860Gf&Ky(kNWmu0PqIk)?3DLf8cV^8};KyC|#QXgXvUVf;gVBZKYA0dK_` z4f?sC4qSMoS_zNs#nRM$68T!UXyWCSwz{gf?Njvc;J^Yh1ZuERt!_3VPQ*)}+X z`LHFSYrBEb9$Jao?hJMsN-;?=;?FlA77eElk z8JTmB2K=xT<*?m%jxN-E?ys(5t0#r(eSX#Q- zayrNcNIQxVb|7RF*(cczfYbn}a&Qxh5QFY~f!(tBPYde!8Mwy~1z_=ZbofV}OQo7B z3Df9b;*$sTV>fGegI9UQ>h9xBEUSEEb2IhsUXm2$J zeX+wU<06IkkUvYs;0;0RfJ=Tpe<@Y+?+-9F6hGvmxoIPF^MO1lh!F_{?q@Zk6V0nv z&09agP{mP`kOETfi1vO&N_J`sOM29`-oKhS(ESD3buBD#3=o^^A3uu+?A%+i1TR-3 z$CZ}Gk^n*54;0lTKUgcuGgcCVCo z7wt|rFOs&uqv>XiPtu4p+l>|Q-Jj;hmH-foJPQY)VhwcR*Y{JS#2a{iXrD9ujT5EO z0)Bet4Ogu{NwqkV*vMs5qnNyOy~N{$D`7Z4GEpk_%ofCdx43^ZBtOqz&&fHPv742) zvx~Q>UyueJjIrb~rH*E`e?`BC2Tq*p5uC@DSJ|yw4)}ndl6eubWP%mspEq-C8LZgj znfH10bk9tNv(Z-VLMgXto8QYqf(k7_P_UYMU+qWc>mE>{VVpbu^NU{3!Gf27d&h{a z541s5Y#+n--(;=T>=JctxP#hGSIeNo<8N)0#~0GzZe-vIKV`7lvP*aUq(>Ny*l`AA z7gHCuy|^^-K(<(k#Ws8K?wjCuBm9Qc(FQSHTFbxh0b-0#X!G}{FM7!N#|~#)qW0XO~O&Vl!N(Ok>9PyU#F59Zlkgr%b~MlohQ> z&DxJ2p}{hL2{})0vqRz zt&G#Ohw^CuHZ@M=si47&rrq}Q)gMx}HjFQsC1|fove6{-dxdn1ld7`C*W!8X*ktw1 zKbb!gRxFH^*q(EY8?qdxeqt*xzG>P*d$U#&l$miJUHE|oYzBoWM3H6wkroM(&W8X< z57>5EifVkl(9j9a=c~H<4S(bNV_p{hHgWnCAc+5HE=**o9)Dz8#9E7p1S z&&|(^B8QrGC<}bGGjzpaiDS8gx#Jjqc|v(KkFx1h<#2k;$gstpJ4c95>&&;%`5KGO z31@@fjil#2pR;-~o7_w$tP}f^lNzCEQNItG8IhbF%=%% zdxbLa#79LibbMcv?O?$yNfZ(%ha?Z3qQYB`JU4JeUHGbrgDHtAni!uY%R)D);xVoI zMXt)=ht~_@*|*z;%oIa2vxt&#wpumkX+O3n)TYbUkkoWhfX!1pi{Q z{Cn1m7GzZ5qUPs(VndU6=je$bS%H1{^EUR6TErGco(5t-1J@W+dSOv*Da22JCyl zjy&Mn8$2+9h1xPjiv3pzHFn%9)A{(yp2(N0{2eDySOHA)2&4O@f2NJ>NEfI8d|Kef zdnlb+hygrILf{5=ZUuPyOGSTzsLGc96o>|F+1v>r^YTl19$?xr>+TJYoBCe0pM6;u z9$0ih87Wh0zxv|)FhtYXZZWQ>ZRo%pN|D~x&3?GyytMMPZCnYqDgTTmXsz7*fF$&C zV+xQbX;aWGf+%foZiAm^jN4-$P$V41AK8lx9;(2oDm-uGM19tM5^xz5Rs$>cie@N+3 z@684!<)1q}&&<%hPerzS|M%o>BM17obB?gN|AJ|tz$g&u7X!}92WrNd66~!l?k_pQbQ5HH9K=OkfdXrmdm)vB>(6JfK2u{L+IBEiD0JifyvEnFp7voV$)6jX?nui~6IZ!y5+SsH;G z36&`tI&Q6L-~ajjKhRv{p2w5v;9NXaGP)6H9AMo^C`(d~06=z&)T}4TCy{S!bcpeJ zap{$DYCA94fBra#Vj2lg68fAvb&7mGz;!#-HT8L6HpD+4W-$0}W`@ucM$(*o;e)nJ z%A@uNuBy5kzy`H|Senh-Q!Ot7>voPu>-JVsSJJ+qRDG%`I z%CLrE`E=3|Fw-9z*Na5(Lz*i22cKie}-6|#KX zA~{Or5tN%3JiyS-vVPy04_K7sDBa6VcRLJRQZxdj{~+=&yt0#)Q#PD~jOFMP+wk78 zo~B8*bqd%a+eLd*95=yEM4M9`|2&y@EQ2M>!nayL&FejOg-Rp_X1&$HoFA z5`}R#Ha2Jn4aq-CWcXVI~FHp8k$=&*AMFx`cOVL4S z=q6gQk{bYF(`2|}&0EyAcgPk@cg;BFC#`?qsb@LgEn_fAK;1|XXk=0{?fTI3H%{Lr z_VSRVAnF`3p1QUtYXzkZOswo0OF|61_~~o z8NobkDUVzbf0zYHR$a7}Ns4gepY1u4*<5)mW9YDD;Oal2yF=#auaXHL0@_{ZfmrD` zu)~i$v3i0YX*q}66&~moZf)Gxnrh7NeK_Yhvq^D9UP=O<<{oQ!4)U3d_U_kbQV7A+ z;Qok#p>5i%G@W)r49^TP!2Re++M?<6Jy zH}>Fs@-`)KRuyfP{h7Ii)>bh-S(YJ zWg&wV4WpSHULkU&EBVv47r>6Ke&pCTmW{1*P)vZ3rxN=lCIO8ZdoRk)PrA=A zCX|~|@;|@~ikN>&2ekvPdpV#Fun!+*+$lgHc`^0guPdd6L*wa&68rlFG!-4udMyL1 zOQ>EC7X3vKLEKh3)qefbU4* zI|IoowS1i9zcvw z3`iXd9}OHwigi&2dOhfDo;XFUiy|}Ji5rGlq~_g=VM~~|D2&#=1CZo_n&#Ms$uxqYuiu~F2X?SStRO@1ahHPy($!QuDb?e7%@7#7<4GZkv2$N%#JpojG$4+V2S zEa`OS-*(}iy>0S8Yc3UNPJ+Ftxr85ivuqC*zSv#vG>+TbGDnZDy=E^A93(d1b+z`k zNO)r5)?|;{S{FvU}V!JL1>jH-h)EszdAd=a;Jn@k|lZ%+qipkIwYe%HmnP>{kDu1JN zWfa1+w1G}n#6HZ$_)p5Qv%R-XdAb|1{sf+eZf&zWjH(V?{ofixAD;aH+1S{FYkodC z19(c?X37cq?bk$0lKk|o8aP~C4)UM49%U@OJr6nSa)KEh9fL}v46`N4cmW+QO-&qp zdyh*mfY!(-2V>^!sc5$cn`+-1V-2>5_}!3p-B^vHcIhj zkcQiIfM1C~XUs=RWQ9=*^n~?n%*{ zb6um+z!eh-iUgvfyQQ*O2wSS6N9J)ac5{i=FQ52cuoIGCsHY!{FU;VU!UBc(phO8=#N4W%3|I&V{$Jqm?izxS)F=}D;~BhQI{ zlb2&sU{9pZ@@_!slWK;$fVDKlG#I>3RhYExIynk5v;JpKRQK;|^Oc6xKi~LeJW*8f zG)xG(bc=s&Q&c*U82)Yt`rQGmbn5=`r)k(oq#tauG+uK|-V+o6e~eCin)2h+GyL*_ z;XWS}ine5wJjsr1TQGAFk8ermOo(WZb?f69mqu>1IqFf$7O7v<_xvzFw2jpCLfW_d z&7yo&>{2kGv9rIo8xac&D{yc0ZvPJO0qFrmEFkp;-$;Ra3kN%!DqmSuS=aKdaMdk& zn8w4!Ff(`vK}}r@7crjSJ~FAht56&p#!!4;qPP~wb+Oo_dtiq6sKfs!nBt|;f!oSi zF5Y`E1lZ~WD+~auY6UMA8=igy&&2)j-oYdlB@+oAi(jB*TTIra^`HZQhk4p-u;EN z#yZoTOOY`_WM(XMcPb(mGnN*RFqF`ttfqH&*_yA)?{7o~;s-YVJ#Ukv(hvi05JSu@ zu(f#9Fq05%<3`ho$C`NsUhDv1D_OYxU^r|aXyxSvScIDFH(-Ef3ZRl^Z4GDyfymJS z;1pm=dWaW_Q2W27ONAYvcq;VTbQsC;FXQ-F=fh z+oc-!s4PAXEy7(s5PPVTv(cG8En0k)?p)2)r=M~15vYpkbPK-gaEe4L2uvVwWLKIxA5DfTWrg#oh)3_dsu1umIRSTb`zT26v9a52!6G-)$H0d2?eu32^b2r;ZeMC zeIpBjp`h0k>~AJxU*|+Qw6Wc|wc6Xe^fx(of9&ye#!;0Z1xz!^Sh+3Q3ROTWzOoiq zQ-{N2Jlwy2{rV)gsl}FzhD3Tqav@5APFEVhD0(gs;6rh$BtehBhK~P9NCf}i6)Z)i zQBIK@F3UDS*_ra{=UO1|+^-N`5zQpC_BOGW_A=;L_`|nz;Vx{YuJ-ojI8?rN(Yj&q zlr%b@)B==kiV*T0&3b|GsGId4k}>nK*OT9Q0h^P>hubL0kWaVf`O1y642#D-VwcwH zF5@NbwT=dq?6?LdrnRM-%e+MqCT@El;$Ru5D6^g^JE+&rJhJ9R0J z8EuTS7yR~j$wzo{iq5qvMjZUXRTV~8YF-$;!^2b5;TcK3&(o(>K8hbajH`1r;eLBf zpqN!v+rDg4_j$upbx^c(x)D9JS6Mvy>m^L1=D)h;!~72BFqL(mgzL&U>_C`s@%Vp+SDfvK;v zQoBpFlwfia$$-cV2Y^X5#0TuGDRO4`q4JweXKmi-I`Jk17u0u^EVT-}jIM%;L0&wr zUTfMX>`f%N8#Mnb4VpPX4|$>QJ8|{WB;bxQ1`4h?0JZ`#5)zUa#%ZLZm%6tFr7kSi zm)73-x8p3a17Qf@BWVUHXzb___B~sE-Xij#A&#F=p`i|=40;^! zesnu?>eMd68KPSQ^#!kQ2|ol1Z?0C2)nxnA1bml+q`WcvUE)#pb-u9qU7-OE`}Nnb z&MRY4H4grfl}6pQ;kCY4WM+0N_*>$GhqH4jzjN$|Pj?T?oo`9cWn?mgw;TlpjrVJp zX(qq7dq4WJ2@!&wLRSI)1?}6JF{v%51uTLzVT%r>@Kfx4kMJ|sx~C1HViWoeh9tgW z5b$LKj*VY9)^z##m{xf6hw#g1;rlMMaX~4Fxb@8TI}aUTRp8BH7hO zsIZxv8&t(2b#c)O2r^YP#4)pe^s})_CBmBjD+rm5}fWKSY8?^^b!J z%ZVhXeH~#FV&-;c&JkZ-T^&H$qEBE?RnDI}t=2$L+Cj0dh%9hT0ozs2Km6P)dyiFT zhZWM!!YIn;o#r^v*vkqmlID)1OLaC8^Kya1uwX!?vxV_Vnej`v=vzN6>J zuqaT3X5Z8SY7*?+@YBX?bgjv0<7lupBDZufR9Bq^y8L=*ocZ?84lJxKcIu2qIS_i9 zMUFm5X(%MMcjt>|<@m90Ka$s3Z=eCN^Ag7(RSlm=JbZ9|K}E}2$vd<&j^v%YUq^pwTvm*Sx(1Ez4OVE%oC~5_#pC! z0~u(BW4*dpZz36=B!!QY8#DBM=28u&_RLXioPYlnVq&5!A^<90T3yZ4w_@ewbRbv2 zdKxDP^b;qL@NAA=oNySyQ&P3SCXYA4?3BHJ8n?p~KU*b0x<%GZvgf35DPyym-)oN)w8G6U*`OiKCxO0$I7bJ7&Il z1XsbBy!M4tn70{C;gmSE8UxFP3WA?Y8kCVdi54#!9wiuJ(_*l|2kq#%_h_SGkev$FS&Cv)Z#<2%I??KanecpF~6R zJNvWhsU&)KzffR77-HBq{WPMrq7RqUB|q;1L@gt3%I4^SX?8NQBQek>laWDky4pGb zFg3XC)?gnIJQl4JwE;HFqBsNuAbVJ&l6JYe;i;ZezcR+9dPC3NBHz+=x}L;^UxgnG z-p+9TTAH?aF$k>L*3KY<`bBn;SthZmW3Ft-lKhesVT<5fE3#u+|#~7U?ZdM3hO?j4E zVz|6AR1SP_w?A>Xl3v{V1}vD@ZpE@W$s7BUzV5zxC_HQotWZrrUzpW@gpZD*BszVR z*ec6OeyGi`pK#g`R?fB;=ywG3jEvnJUnyAj)UAdX>^=_Ftb6m=y8Uh5i?B!Y(XG(9 zFYA2fE*I1zdOaCmZDnLK*s6NHTvuW~Q!Z0~X!Lui^0;fa`@-FM&MVaEi5_P|^d+rJ zJyRJKhHn*}*Cx+OeY;7%l_5TiCZ>!y-QnK(Jp}@Kz{d=QB#q)N1xBS*dN%dRxS$~Y z`R>M9JjYrb5W<+l4zCB4G`^CuuR1vs0=?K!r78cjkxn z{mKvX)Ry%*jNCH0#6gWg%+)fpMp5YdP8XKY;=*^9A8ZNitRzVC#}H?2XK@r|H+x~) z!d-G2w?(^P%3SO3`Lrp&ueN1oMos-jSv2^|D};^9v~tOh77{~#&s2GFKHa7fZ8=woPC_0V{emz1G z^chv`fg&y9i5wXi(INyJEWJc`HpOu)a`-S6;R7jYQBOlr=j~j|-2CsIlXbty(PtKQ zew+;z36wALKe>0bZeIM0v(Y+x({Dc7{gns&jr14eDA8~9tr~Y;M?Gb6i0}{{JOgZu(P5y_tW9M zd(C60x9r`l0^fqXlpEh7`)8RqrGKJ_b5o>=SFQxg(S9^sNS%RBQ4E+<}d z!|UB6sipRvT3E?G$l}CbUdgq+3i?hg?Aq3gwa(*h5bDPt-y@H>6(*0T806-9{-;O) zS>oHCbM)~+)c=UvR+&+K-&x2&?t}-3bT=^4(9k;Qogp>vngVi9U?zX+!XeW(zM>I9 zB3`#3eD!cz*|eed^DR5G;CwJhfx<`L4?xlof%l|8+ zK`$u7<3DPN+2WBpEg^^BPxY_7k$@>Qq(WeS^+h8@xP}FZ^mAAX+?n7>fFVHbMnVwI zKr=$X&+_8Ih={I{yS#tXM_0l)*cMH2Hu(MMN|L?&m-0B3R|I zfYxa;vH=%h!r!4LGVJjT%{LJBcDnj}vnG_A5$D`m^tUl0ASfGareq*UKC7XrhsDn$ z_TfQ7V8YAv^@E`!q?f~utHke_qW_jgB(E#6kP30cyv1X)xk4inz?TjW1I-%QmW0jL zi9RHtygM4$pc6Z&AhXu9U)7{Gm5U4r~HT5xI6q4+P zIGTUZ#>Cje6@j25e-N45CmEFp^!QVAqB?9M`@M5TlNX)%hGfWV(9vMloRF(+|}y$HVwp`W0)LBB$tv}0IQ!6t=)c++_6a5x)>)YYLic*G&+?Gd#)kS zfg(;NKCwOJjMX_~bd!g6{*9EfG1XeHQ{Hgn;~7L4PR}WSQmSVY;!6%C3y503isgCfQlNEENy zy3w`C7pREoe`D%ZS9jU(=H34U6q`K>0sk$a+;x*ja)twFIfM=YN#=r&ax6~AObIec z(`GM+C>sSa?La49Qa@9a=kXl(VtHkDAvTBD(bGGGYyv*f&8zZfbXnQ>D;jhOjPwic=Vtdf%@f%h=2@4|s0>^IUhc`sBs`2OPH^}3CuZ>#W)uN;ywA9iQd~&y06`Dn75meAJYU+q`RjOO=rj`( zutb_Jn}Ey*Fd%xAoOeuX?U^~>KhueW42gtY(Z?vS2%u_2t_lxkBLA}G-2M6wB2Cpm zi!@1fH8#QdONF=FRDb7-+?R&gd@WCZhS}=4HzT*S1!4z+`12FjH*Tzq84EeZ$q`zD zFvL$8RcCmub7Z!1<*CihT{9o5{GuN|d2I{noBC}Hc%MT_y%bWSJ<&XjVuo7n9NNFD zPEMprNjM)-^T-m`)`?qqrxU5dWR+LeG+?S!m2pIIr?e&P9X0X^JZ&JhDrVVt)`}Gn zWa|?Bcz#5ovHq~fprmkJMxH7l8|Tok^-XNI+^+521WT-WT+m>v@wzi|o&c znp|$DYdhns^K`foZBJ{B4?Cfq{~oS>ycnzP3^ucLKOjl1P#v7seLGRHpx#dmFC3<$ zME`VOFMs>@uJ|KNF@2&{j#)pr$ZDILyQETZGi6dFmYrwGzswwaM&8+4c7PKu4%-AQ zN|V1@JXxMLtM^GhfNp=|juNuHS%WR25~s42uZnZ2qw|Z*Z`g7{JX3C?7}E&zCe7fE zHGjlnxwmS%dP%TQ?>kC)aXmxvQ{=rvnXqes5a8gB<|wljU_O5l_244{z7MVLSZ$3e>h7UX{mGtyuQg_o3nOpt{Qi+f zfMJ8A=!y-x^U|ysoO0si_Uk${@UEIQCTt59JT=)*BW)+#Q*K-LY7W<|0~*r8uYITd zm6%rC5^+SSMiE_&R6?Bi!8y%^P}?zpRQsz6C$@xSblUGF3??!)JrUfk524FJJW*ku z7#J|6Y5jD#Lqf|r?e)V&WF@^4coX}=S<2{CX*8v#xsd~XHSD>?#wqMZ^$J#d1V^nf zhTlZ6azgz-FPNubVjb8t5T*${ZL3bV3-IcQM(g~()zDlnuElHJmgQwH=@{R0VxrJ0 z)`$s*$k){>J`DK?%@q+$EH$+RB?pNIM39%bn;ERoB48LgWtj^3m6TiG4ZsR%yS<{IL%yfSLZh;N=%*VPO`Z@9MY;A$x2}5J%d&W%D)LnZ!cL#^~f&%L4gX?Pcg>bOWw>GYppYY!(06lfd zy|#4{sjoiCrsA~nkSDw+X8;oUNGxZ5@|q2GB(8arnA21RW)(0arlg(5XZ4S zD}ZD-UU$ChA%$lz3+H>+DHItWWNk9E{%CXA_^%x+_TsyDir?)L!zDrM`0;{^**b6R z9XwSOD{xVYvR9vU2|VJq^VzBLAc&*JP{qASC6Up=DQqlzL3uBdT{d*QtDDI@QQgWK zcvwiGfKJGH7^{)&@tnRXnKDiBM+){cVh^mZj!I}1(o?q>*0lo+R z{iF+yyz+Su>-^HW1sOpFx(%=1T_( z`X6%qZ93bWZY7%9k(txd$}RU}0uP(ayN6(IG!wwqpCo4DO@kBHje(*W%lZh$k)}$d zpGPfKqrf2KZXh@rgb_zY!l^V-t00Pum8&4_RVMOJ$~hnP?sQdZ##vyZ^;g4*@Ewdu zok&w-WMiw?ykqgPZ9KDF_ve$9qZ`2aA=WkW)%-JjH$$Th1mu$xApbcGwc+GVWM)YNo-ctnJQN zv>8?$j#H+1@=V$?1gUve`*)WiaDRdK{eydhe)HVC4oc_ zI9oIMt2(F9D+lH2F;)ZLZ>}_0-yp`oNt?-Z^AFw>TcZ~EO$fl$O}hfu5Fd4d#3R%BtO#6qN?J}n$S}fh&1;DGu9IS&K zs+Q(;+}L1#eM|5~hAuSdA+=HjQr+A-u5TPD*&1M67?vAGzCUe!E3y9a=Yc`_ff$m1 zrn|bf-s9II>frUM%qwnx;h?&-_}3S$0N2Ptd9NUy6Q} z$!AtrU)-O)rlR3StN{BnyP~2YJj78COs^YMJ>mQvtK<@xhw>1S*lN|BvM7oc)hI2* z7QYtwJCow#mhs*dP+vFSk_@!JhwN%7l-HNF%87r@*toS@|5Nw= z>sjwyg-EkpszqKzY9i`z1RbVs`0Wye%gpep5=Y0wLom8Ba_I93KzMWShTO#65#4#5 zgL{n;0tSt2ZR4%%R!x^U9VT=|Z~F|)b|rXq@Qsjxn#ynlTju5G)@Z#J68EH5|W3QZkZhnFFW9$yOb*w^Nn#U!+P?P#xtp{~YXHGkQHvdUva_5Tz580mCaRLIH}&q1sEK zGp&*TpzK;robW#Y5pmekmjI!SQdftF&TuihA8qkiA?ZRE(lrHr8&FAQW`;z5YMC-a4+T zuH70|K&4A0q(fR-S~{ddy1Tm@>F(~5ZjdgeJB1BwLb^dfy1wcCocBEEdC&X(<8RA` zwdR^@&TC#Vt}%uguWugEEl(}!JzpqV2w1u%6?ff-ULAZMT}on#z;il1f9c^*LE2_6 zZHUHN^||`y+cXBQcT2H_XLAtQi-YHFNhm7ENEGkzHDyBEoLw}T{iyQ>9~vVTKWMb! zS9~ynllUR;SJUUyBKmP|k`RApQsE6s2a|B#ypgSIP*g+6WEIBG&zxnU=(oM06y`~% znURHAI$=et0w23`#~=G0H;V)}1_@?z2BMsva~#D*U6vlQsWFD^HU`u8|Kcb)xpRU; znQ^XF#v2*Sr<{@Ax>N(~^oKrylY8v;?m;5fS4J;)dPTq9`>z z=_)Efgoh`UylZZlc=qz<4_y7{a;I#Fd*dy0OwdbZ&Hm7gpL41U6;gr6aGw+K9B4L- zOf{!On9rm~ld12Zhey1drv+cc`ret+eUgY#8_VT(N0t$ra+dxqR&gx9ELY!|BgUAj zmIl+eXCJOfmw1(ZMzTMJ2bl9QxWe|Fh5y{cWgFy;ybV5zmrTROZ&PYAA}Zs<6BgS` zGFMG^GJGx*AC1tZi|kKLx@b;dilkar)73c4+9jDe9qL^ZZunISuMWp2nF2XaSYF52 zv8}tlRdB5zx$u46av=CnJ360GvklubkF91q1DeX#Mm z|3L>IKDt1>O)SF0EUr;|sQHPxZy&V z^NpzJOr#VNF52*LbWF@^xF0prL+YXVL`QRM6RHGY%hPW+*8F5h-e%2NHm-M%nH7h* z@p>+*Fm+K*r^#dY>f-@Xbc)IEB{soosm$I`|Io5swPeqIuJHW!I@Zm;#Os+56y5!#3w!uB#C&1&v@%YG}-AdTM9Eq>6a-I#_~$2B3y2T zuC7DR&2WQLrW*rlHI--e@rs#{7Zw+VAkF~1AIFTDt5SY?eQKD^=MBgNH_zQy+%`~v z2U)nXQBB+AXXwVA)qmbjF4zg$XX_UzkcB~gFwKc*KmtRQw9KKEx*T#)TVEewp8i#_ zRA1L;%KZ=763nXU@nuG+>x#%Tr5=%F<@5$`5mA8j(eMu~$@o;~Wxn*1b4iYH#(;NA zacQNWDxbW~=wT<){o~ofsGZNqSETlvTTh@5>cjtVFmbzw^Km>gSf`r9OZHWm6iC%G zA$R@JE6k@B7nuoxzDMqnLMaK)cQZG%T{YM6F}Cq1$*0~2;eSeBHBpIv z=-d&ylSZIElNJOEabv!*CkkJ;r}35SNWtQ2ZLl$GxhLi98}H?_{-SDn9|>;`lvUv&aP zCELyt2WfT;R@<6ye;ijjE?jwUb0y00Fy3L~Le$kXHk(#P*V1!z@iXBHuk$la2M@?{ z6;e};ZjM>fh#w*=B?T(du~MoP(mVS_Tq4@e*<%{vj;lvVCP2&YP*w&}GK06V$@Obd z)SXaboqZnJmTh;-?gZ@~hN#872%>8<9n1kg^%HlYcq9e<%$&^otCV$D_;`xA5t9;S zI^O#~ualFjnYmcSv8bA>TsQBbuE#YsHKA3OR<_o4x0?u!=6agjg^2;3v=s2Y{{Fak zlZ$%ZZNgBrJyC=(5>iXb;E&^*%c9$+18HL=W_6J)4UrX^pU|>vI_vvxJCs%O14WeN zN7?3@qq8pIzyb9Tbq9C4<7@4l=m`q(9%_ysM5N&)jcLAyHCVFlq3}1-(SUU$dfyq0=*%F?JDQ=ULmbR z>iz_D0|ns^5u@Rh7I|N&5C(xtxRO)G(z>-txA-@H z@9{Zt9$s-Vmg)H!?sQ|O*{;b{(a@#Jsi-fwkIqC9p^>8-q0~D?O=pf6=?siTF*B>`Z>&%zEx+f}8B;i8 zbMi#CmE5T8)ibtEXc!COT}0mNg9-bZ|JIyR6s_=?J=q3UaT-|>5x+^teW)AK^|z#_f& zZ*|38XG<$yw{BTsD%#O{c?W84mV64buQ=36Wo%bhElsV%$py?hsU*$}A@t_8k_9@Z z)#gcaTn=7#a3~R_JnnD8Y zva%X8pn3aO&Wv4p`JwU#Q?Ve~jlfr4ri2nD+TGUi1S+{flX|Z^=qgY}T9+#S!iKpP z{ZHimukaf#ODt<{j~9UFvN(kr)xeseO>aZ&eT0ck8V@X`XcX{gk5Y15yx@;ebDlJ8S#q zdj_Dy}j0gAb@fSn64BMHo~0cc!Oa_n(RYLYzx+Q8{J zmqs5`XDSXM=!!MQlbMN5q~QX`7kZIms8Cmj>#(mJ?b7!T+#-XY!h@+L4i75|_AZmc z?HI|rr$4|dD}?3SrJB=9u;jaWtiDaW>$I?83>euqDP#$aKp+%O?+Oj9MGY-k@18b7ivk$81X-5vXMd&}Kg)y49}*TmPg z)QcQSrr#8h@jjLzvcUYdCUM#x^e7pt=U75Veo?~1BpajL-Rapd%K#GBU`N6Fg|7=% zFvx^2EgKf)b9KvSf%?p}XtS=d4HW`-iDc1+0Cd=(fdT~ec+p1c7_nWS8}a9)rirjO!arA@p3i@mvjtEr*-w<{wi&=_8xXT=>(G z9D{6^=3>f{Ix%gp@wSWlr<9zjbCs|ze)@Q*Z;XC_?-pyucHL2I-G~ZP4$E9l9WGqF z%7l#26YJ42J~uZv*|4SzJuzmYHa_7Tx68r~CIu0qdNRma@3#7wTaJ|Ddg?YjA^N)+ z8=j0foO^0p9I<$gISVyJ7%xy&35rPc)>$tmVQbEQ*lyz(;^b~T(oaXtrzQzc$+>68 zmBN(ifv}M&82vKEM}qOoN8jZRuOgSoY49uBD=7;Y$%ZO``S7=UKJ~O2+h27HSJxDc%HSe%pi#cYGqcMF5Kr*pq@;M}ERa;=AkIt>u#U96~UtCLd43Vn?Zheo%<%$ID+VwyV)dlf0`q(Ry=>gZ(v+6eX)lM4GX1!|D+L}$tMGifiFl2^+jMQQK!UCaXZT3zyqb7 z29t;?lMOB3jKV_EX4ytQ29|D&j0?Xn|*KR2aPZ6|`Y?e|D z?uSs%Wc@kqLxAw8&CVO-tr6n83ED1C(YFv*sfX-~s|jD98{~ulU&5!V`amMnCVhvO zPbt4rC; zILtWO4&7LUT+T(vWMOdH%60FOtQ#IvK}ZF~X{2vtd&q+_nT&*tG>v8{f3#gM{;j3F zwF?3`{$k_UUXv#k@9upP>dLR*#vU9ST$)5md`q|}_$d({K0lDc5)>r7XaeZML(SX@ zMYq3VMRSjzy1baNs~`7@k>d5I%;WVm}S4&B9@e`#I+d4 zd%8R{o4i~SGs8q|qpwP69Y%4ivP1!J?}L(b*XJOPaAK%*)p>N7@jPNC$CmB-10`w9 zbw#0MWokF-MJK7$+BmlK0iOOyHc#D{gEWffF|~)-_-z?V=h$}}>@;{r3c~Dwm$Qm| zUQ}^IhFefN@L7IfMTwa#D#wvQ8B2W94}4t{33J8$%iAN;LF(YBt)ihfpTE)rNRfd2 zR0oW^`iqakc`HQ=dl-}?pJ>C^eqmcpZ<`Ncz~omHL@(|jUX3td54F;k zDUooH+G~%Yu*4+YszbOq1s#DUd~My> z(a4d8S6hh75MLbK*oalQ2rhhEFXn@pi^nwv39Xq95u<579ZT6~5*~5~O`56iq7K%` zqC$yS00m)VfiX1--pIFB(hgiq1+h7+=^%P_83AlKBk~~aOjFX@PmuJV(C7L~zC~~n zVk*+@LU9!|xuGP5RD+BoUIm-+v_-WHWb$uBVr4SB*=FLS<83GZkb8uI()`zf>8~F! z)ThxI|IpKXiVxs%Pbkd%@in`6a}U>H^}V{hmEuMO{V=M>0J(C_lqiM*XNIukK8EVt zLbVIEI8jS2mbsj`L1HUU_X6%=81YJ%igJ=sJxlp? zC;4?vtUhv7TUh-89MW!U0=UntX~>$In&1Sz`+`H2nBz>a(`)%caME>B3Ui%;6j9ho zn<`@rHAo3|ZOWGH<<-slu?l6G2hxn>>7(4D66~iyYYm0BJy`>drt?r}-^CdgBIB{K zqXKfaJ|JK0a1B_c9Kmrte%ma8y2Mo-4omP3y~BndqD3qV>u ziH2FINCQY8G%Bb6ktOP9LRM1lz;YebePJ`e{K*3EPZ!|fXk7-bjUg@-PZC(#f5`_ta$ z@YZJDD_;Vx34nZ6DR=Iz{q=2?uLOM(q)3MZZ@hdsO&c{T^>0|gVTOg+WBNM+s{-ZN zmp!A83E6Aa)Ymu1qCv76f=`K$*FXDiATzkUvpD2b8Q&8>3sG~n_-7lSHtLOh4a3hF zg(5hgw`^0dy4oxMo|n$E5S8d*r(ZzAG>=ovvP*~zG1Oj&LgIRX-oTz<%tZm~V$hxB z%vkySW4W*Ql=n&bOHrVEhuC9ZuEkK_)+SY`n5RasNR0(FMbwgm0Agk=`QhOqPs+w^ zSKHjmD$lY&GJ%bbS=@%_U9=oq;9HPTX_TZ15Z8{6$8Mh^He7{c|SO3=Y&S}kw z{ls0iwQd|f+TJ*7$%>jxOB(vt#3Ziz;fHUydM2grH7WnCSyXWwN?BH@8hh>ZJ4qx+ zniRfU_!kf1d!&s0eBWu` z)~hrntlB!d>>hwWVQAC$eEOoPrGsrO|D9dkR4%-~UlyUM!QR^ul%#u+Xnz_K-yixP z6wuK{pLapG*?w3u?qUvL=wqS75w>RahYj2;%krP@z1wcD7r}_9zz`>0mOT%u_9U?X zDI70rvxyTnMTFf>Y0pBheP4E3{^L#=v#Yu0icGe>waRg0+xkOQPY6!g{#FYE z$i^=N6mI>BIuz$gj42PN|SERk;IVIaMr!ErnVV8P@2|-GaC~XHoRR?Kf~CZuDP-L+^-%yq}O3oSjqN(zYe^FiuG z@RXS{R)^IIv1@nT&U3D+)Lxel;C`SbuDy!}b_9 zp#5O~yecOo7uT%sfF4VKt=lvS*HJ1m%iZx6oUzD9VHdJ9ePUnyM^blj0yHL)XXLzjq0ckmFyGO~fvKs)< zcjR4$KS9l5pdl8vSw+l?jO2QjwK3Du!K4j z5+FHSA-j5EE;nMJN{WT}$u%ib#$v9QGS`i8*q!&$?a+>}0IVp0aa>+qh4{^pz{@K; zU!TQG7Me9de_Ax;2^jxYZ-RC>xPH;89@yTdY_$HXfatg*%g@6IAF8YPj2<2)pCYex zU%sRP$X!>e;3xkfS~HMWj?(hU%^0V=y4o>##_J<^np#)jLf zY0xh@JMKUO98{d*z9wzpT2XLEgT&wWSuSJUK+V-7`EDk9wn|1LS8dnpb{*`d4euY5 zD9Jl1sTtYi(HouTr+5Hpv48{mFjdMGsv#i;OWYNDd|lUUoveCewl%=E z_@=i?pm>V=+->zlh~oF@qMW?Qi;3aR!--ZVI6*xt7YvYztCN&p@v9N9*x$7EiRy!_ zbk{6ZSHPb$RaXbvtjic79D45%TPHFh zHmotq&(iv(m~|{ehdjR0j}5-vwys|OOq8-VQi^#~--9J3VJ#D*sJ<`Xbk0Ps22yF|*uS>_aWp8_Ktp4h-5#WH|!~X#g zB7qb%W<>$|JZ}Ad5xKc!xErGYfp{j>)#thVB^QSl)J0dWL;GR7p!))JsF3~To`95mr zJbT^eM7>FH8yw5nf5VE&)js5UQ{Zc#b#jaFQDR^S#|{NUVQ{VeLienA#CO=X={4L( z8E)g8<6$Z@lCkr}lP4}m+b5bQQF<~SJbF1w$8gK7@?Z2gs@f1HwzRRG9Lxc#YFMu> z;a_)wf=FGTi`&ot^lpeKe4oT}()QG+TAJZ|Es6oLFPWpQ;9cUmSc(u*rclg|qRu8r z_*mXLaLO)?8j0wk@Ag%4uv|}G@GDNRx9h>{z~*W)COkbCpX_zDz3ymG@y;tjEHcjW zyf<5Bg@G?AYUMl^igO=#|Fg>c_IG5A+yRHZ=XG!~DL(8n zj@NZe=r6hsPl%gWfc6;Nk04z#hT$g&q4y43mX;69sxOj+%*LzdceAJs+f;|gHgU2$ zrwl-E0t%zTcG)*i~@YO*p7UBz=rDngX13)Mn-bdDGtvi(ZTY2lL zy!(iPz!fRc800WOf}J`%))-GzVUi7Hr0y>*|I8k6539ZI?|_*b6^C5pvEJ)t9$a`F zo}8d%seCR~(ha?R5k}mFxFoxeRHP4*4`%F|x)!>)i63U1y>YDw>^KoX=deu^g1;WM z!<;i=4->fdHGM9(8+)~)nKxka76DgPbCVb9oY{+&EUfyr*zF!mfdFlk0EK@&=e`Z7 zYLI3>jf3GnivQrN=OSx|7xJ0CvGA$s0j4`3&8_<~IU%2|De@~dTqUIl#vo$pI%nEC z+?gu1f=sfpVkuTWwT~=876k$TJ+>aF%%OGB$}1-+(Tc`X0CAZHjlu;hFua)d4Fvy5 zxyVU2f&o06&aX4(ps-`>#q&2ANK(R{Zo!(sefn8I$kD+}HhMHnb#k(Ux79W7qa@O7 zZK_j0-&0(L{-z0&Y#Pyv(v$D0%rnKmIrk`@!=WrsO=gY080WF;zHnpS;a(7N9!>Ct zAjC#uCC3>YQ_v0JZ1Zx;3C{7>&8#3?2?{#&5AtXY3ZAo4X~FVnwo(VEcAMwJPMoKv zrR779vft80CInJM`*m6#n;*3P&{#Zg$8kyeICi0|fYm=B}bi%Onpo7Y~q@z zJtkYv!0>q>rA8Gi>%Cv65E?0pL(VpiHkJL0N(zakU?%Zn7F)p|$R1nUV;L@4jr@%$ zkF_<7k{GRo&@9kB9-&g{5jXsdu}20y&~c+Pz``~Fu~b&*>HlB>Tmo=g%F23H9r1<~ z83PnH&HoFz{TIGX{@X!R(sf0k$(n#8=*X?4%%|*kjn4b}j?+lBc=;U@<`kRQwDi6j z9UV1S1!RJkfG`bmfFhNoQa-D{fB+JT-SN-YIVq7rk!W0=;+kd4{*`gv1RW0hJUUV0 zCzKv^Wo6yc-a&!(S&%jB@+L`bv3l%6Ko9IhceS{Exi<5&mttZZkQ%l4qk{4 zgoV7ToiA85pC4vF+(fm2%CuE$~SKStgB zS^dfAX^nr=GN}psCZcav_B#jC+GXqTWuxiQ?Cb&45)b=G9Wcb@tGW}Yk^oW$W$)?f z0T#J@)<92BPkVc<_+a0gx?QK*)>0d4wu&7bk#T$-U?DSOi#OkqVg>zij8C!JL_pJ; z!-Kc&CvF+O zoZ_yo93|R@R=(FlyzL-fW@Tk{YFoZw5asZ4jCnlNN6cDIB0E?I`YJ*ruvgTTUfc2i?-G(hD*nV z%gcRtHH!o9$8%B0PEOU4PCR-Qx)3~RV6$wVZ>)4xOUll%wHtt=goYn53*X4`b zkbY`p3atU2@Gb2xjMdsPD)XA{cOWuG`fw zt-K=rzPn2eUdeo;_iBz5e#>K&7IYaTMIIl0I&WvIt6bDNR#kIWtD@90tf5wm-@^R- zo_8}*Bn(-lGR(IU0u_4ywLCMM*KU?`JsYsPKQcwNOT zq;zU(YIa%1!vp6HZg6d@VJN!L=;-M0hZEl%z>!?xO0)j_oAZGRkYIXpaUOfmp1p!< zwB-q^ltvq?Pk8?&WEpKHpbVtwHnItHrF~e3a9dBlD9J++i zIa)2wO*H+k8gbg=Rxarjp+^vxCe_K6(kQJbv8p4RKdlzq=Qk)gR*Rtxd#$o$ao_9c z*E##^Do_+~DzyJ@cDrKBw3VaRVZA7}Ge~fkHeGR6KQG3_+`aF3uUgryxfJM*^P_s#VRSY<_v)$(e6i=mcb;|u zo>nJbuKb^w@71P3MOGld)i_~MX`<0SdH;n!Mjsd0$-0HZk8N_=5Q#!X0L1Wg$yu*Y z-bwP}rRhx>6FZJKB7m9v~^3jz}7azCQ95Se>q$j4t&PmR?~ia%&W?$`zG% zh>lw)hER9MKv!cGe$-m0x938W?E}mu+BEKpZKL(ZU!^1T;JkKK93l8q0i>Q-pg^g8 z)f&tay%GC~LIs~;ueEcVP#b#0p1lLabgSBaudvC`k942&CMsI`C`1>TyJd?5DVDm5 z38(Jml7?lex?7CD_T(R<^56d)GeaBs>+$cr}wLqzX)8-z6&^w+dDf`&JV3N^&QKf zaImpKTn;$s01(5TVD&29qpfV%s@0p+p^d6N zjcL-`t@hACFkZ~=H~+8kj?~rAM}WGOVmMgT+sj?Q5`LS3@}N$2_1r8{>}{u9p`toU zN<|6@Jn)6DJG%}L> zlBV_0sgFy6i2xj6aNd!?!~5%vb${(>5U(b$*2gVhJ*i9s4x>IUrYMF!Zk4)qk+}hG zzs3B;;>Ex}3+TVB_J2?C-}$zW;ffA8Xa)D2&HdrwVqXb403kQ%cC{w}+28pW34uT2pZYX0AI+50hBwpg|4eHG+@ z{{8z(Db89PS|Hs8?uv{1-C5g78=RNKJxrhs4(uY>B;e$>)FAf4RAZM(0FFSO{C74P zFu>n?%!daDn)OxfMds71t8%q!V3yZ8lV$(jl88FJDDU8QAL8NCh=WFy_Wu7h3=`a! zfRT|J3s7N_!2kC49qS3}I7;%=#BBpMGpN>By`1oK4^!`zcQ=#P%&i_*??O3qnsk** zHdvG1;LWBNRSp?mH4goqjzBkD33%1NFLs@D=BWE;V)RbsScvWayzS|4mM@(b4E`A$ zCNkAtmBgzdE_Y(9V3iQ&5cP-%86M1Cl#Bm!1$|Odt-m`aG-Px%a{Q_*=hsrpMU}|k z@BV$ktDeiF-zQHGi!R9jdjJ+%&AE>IiBA95TJDT=(w;i%-@WxvCHs4=(=8VW=@PXH z8#muF6IrCe{inP{Etz*VV?UkgKliXWDK?6BKOQ;K@YSno8%0UV`hXc>~zK5KHF@)R^;%j+;!g9QK{q(4k}lCDQ5J6xXTE35qY`dJ7N|AG6q}Zi zS<)DutsRTKafmXke~UQJoJwV$(Q7Xaw9DHZ!gMGTNV8;L2d~{?zh`gP!5NY*uIKh8 z7!ZUw10M;*epc)Xk_zxd`b5?U)l6K>pa1FZ6b+daR_d5mQ7&1U)^ye5DHLJpDkw zVABLh#yO*VzJGuA@Q`zK{JuA8$xNs6-3*((w(A)2Kl|w4OU2dJ{YuW9kK*qm)Xp8# z25O#Mvpq0Oe9YE!`wsKM4>9??30Q580zW_5#Sfe{RDB`D&S@DJ@cCQOagsDZ8a88W z8Umrpy6GikmPzRByuUeU zbqvw}L@*E;9SuM`bG1UJB&}2JnExKwzdzwamV@k|&ygBXB{;$i1+hYUX_N0On?Jlj zFR*;M@YRo4Y*a{$^yu^l@35dI?+pfA6gwWS61ysb%eT(1>8;C()}ihEw!V1?s}d z4-v^Y3RNM2r&L*X-m6sM?8ljkl6mHf9x0?YWa0S}fp$DVA%p~46WaC~pn7bsT3fK- zo`WFLZOd6&ORhAPQ^$v4zcsjM??7v+|J?mt@;`0Rzb3#+%k@q73wcDWaJBco2=-J? z0?QNwWr>Ti%M_l@=0GrL3FXkl(Ug3g?o{ulo$KeFFH2WdaUzf#_F8@Qz0sO}BpEU> zLF)LA@%#6j{_|=5hdqQ;>zX3=`a7I>B3ZP-I+M`zBI~?8OgIg+a46bh734lVKh&m4 z3WS5uBg|k@eO#E_0|5B}N<~!%@grMy1h0CS<_cA64`uzm(MAuF=b6}K+A6P?oc%Y!0K-_zgl`43LWE*)zA0ov8UcI9@`|1i7%J-&IjV?lV= zcLED{izF%mKNO@1M0*t?!{6k}*ODO$lkvl`O+RoUA7pRFL39WTx>0rLz8(Z*$?0pp zoP(_!Y4V?49g(qZLUpukaWwq0;|`MdRXQD#1ygD$>oDcdwV;hd|LmYRK%`8WpqBhj zn+PINEp>XdWbOQ{{ z`JWHlNpB#}Hzpb6Q79oLl`w8fgQYmXcxKar#x6?WWS(ML>gvqxk#67{{ngsw0J4fI z)NT=E(jmA^9Y0dEJ2KC!WvUtkPBO+W&lv=cV9sDS*cYFauwLKt9ce_!R!S7Fbe}jW zD8Ny(31fulwJ^AF`<>^yFkF0GznRJ8(^^0L_M?d3Cw;6yJvj4%;qY=dy>S}FwS(@a zf&^YoO-;|nCc3Xr6gXFc=vt5#u&;hPX90F$uo!^*ySAnu91>D%?fDT+(2D6u1$M&n zGd-%F1|$Tfhbg!Hn*doHMZ$Zl$!D%1vJbSyzIU&qn+8hJjscbz-9;jkA2It#KpSYkPSQ@`)=&)U}nnj z1F~9vuaIi#OXh7IUmm3($5&7MsE_N;KDyU*o#$f@_ZLzbOoIM@U7g;P!HYJOsN7Ez%hc52Dg8IZcPCTBY4dsWQj96Yy-E4 z36xMMFvC8Sdmi=m>VLwbNi;XyeT$z*vwviD(3yNryX%tL#rf8(Jeh>~XwL{w9mC;bsK&49yAaOB1u18UP3MEsw|m~s zjk|DppDc?);di=HaSoXzXu4~$|S-iveR1@|zs6)r|y+u@) zQ(b*OoQeNj@`ZEmPHLsD?+<)fIbfIgv$gB9LDzoY%gF^hy0Rzo=9lu0db^k3xlWK` zf#=SSGFa*GwQI}X@T!$?;y=&2Y_S9finYzTzPHR~3+nP9nnd5^Brk zo8KPIRtb@H2|LzC?;MD@#NP`b4zTm7i&QeddD(k`nY1Tbr88VtK)5E3_!BnP2o}rY z-FNQ@Xr%&YDGp`ztcA3k94iM$$c{U8AqY=^YeSpVT}KbR`)I>|6$F6zEp9OI`tzx~ znUDd$l05;N%$>B|U(=2pnxD$ld3pV97HSz>>&2fQ+&Se_XyJ|@SG6;>Cl))pu}B%_ ziG9=+F`d|IF7NOjw%Mmi*jhijTzsX-`49DJH(6BL#}ZR7Y3K_qBvU#2i!6??=qwR@ zf?Q>WHBN?`ANp2TCZxx>T?%>1n)&T#ORD>eEr$AB3}Hqfh>`#>bZ5|-s$2@wEgLo6 z=csjhSBm0tT5yfj@u$2-xY;SXG-f!HZo$fP%bfi}y%|m5vjc+EidKQTp}zUcRWm=r zJVU`Tk_oiqtX#HCl>&f-H^Q3f2}4 zlt;2(h{Z%|VU~Y5C~m$w`%1vngBqn6R0QcmGBjXg>*;sE{OZ6pjew+zw5POF>i(99 z=Jr)R1wjJfU@X%to&j#Hf?67VS|$IC$we!Y51ix8G53&f5`&C)&1i*Qynh>oeGwc&94t~xrt-zcphbcJ zLMn*U1)M_^_#>}N>kS&$=}0Q!Rzd@zZGp?!Nft=e2d_n# z?JMMW0TS^HxFHqxoF zi|x7t9qBM<^vTfjGE$gUI%jyP>_h;}@?=VYxc~v(ePfKxS9?~P$#2l|j}?>6fQ9#I zV}gq>qma2VhX0W`NB>SFd7b;k03SjPEtZA*^IRC@Ve^c4*Z;nl{Mhx4nVoEL_x3svJD^$v+2NP1r>u- zYx~o#=Sq2+r#p1W%mQy~$jmG~+D1c77KS5@EMp|zfj;v>(qlC=TwXB2q(QO;+W@7I zdbb}IBR{YqL-jnRIMwHb@EZh;*~KJWsj|smfKA6DS4aE0U<|clMRQ2T?kz<89B%Hnz9N@RvNn4rr?0?2eIZ`CQ^-owN6?aQ$eO zv^-_AefWh#z-J%5!77!AuMI;kV`9Z|_muGz#-I9UVeaE_jPDsGadu00p<+}pPQlW9 z6Jz*8c2{kj}j441f~tr19Syb~d^OW?k~`JdQm5 zh>7OOoV+^ccseIOy)GgPpu2!mT{Yf6(mn5bl1hn7d5X1t%&@KJFOTc^!DaW6^^4}A zVTFBY{mIuGPt(x*E06IbR)(hH3-_B4_p=+E zn`73E$Zdj(Tv6UDh7euv5Zw-!%#nyUw3VnjB?T?sk-TScP*-c?CYQLhQlv~?&!h#5 z6i#Mo{Slo@-yP5PKi8DmZ{;epsZ{hc^iDYkP&@h#s=Fq{Q*hJ{HF`@i`iZ^$aCF^+ ztNGg^FvNQha7uK1a)=)We1DnMM7T{5pPfA3GdH3X**HYzIR0EljJiSc`m=&jWyTXa zfcm>~fMv7obK-dCi0|VmPbM#ak5!>;4^r443R$1TspW~&ZaUqqz8xZCvb;634rZ&* z+1#UhO}bmEw%)y^Y1~rUNKL+UJUKpb4-@45S(ny|m`LgF%#7WI7 zUv_|#(~E1_893Cw4Ml=OE3o4F(oHLcng_o;pVKOuwFW0K38Ep~v&;5(52cQfE+tt? zDOKz?3dgI%Qe_Fu*fL&YGK?$U?7~s;Wv?C1y64x8pT@YxNm5WFSAD*dEA%*p9z3nW z#&7I7cXufGpDcn1`J4^_{*#l{G&Df8ou5dSCjB=MBqaRnI!aRp{7q$olNA6&cqcTE zeA)>7qs`efK*JZ%91|862DOFdxB>f5^VTzaFP#iCl%{n$-{H_dQNy)EXqjq>HusM>DTdSIEZ(cL=h@{s1s97j zpLb9l@27oUI&g&tC2^W54U}td{%jM!cKeZ=nPoK7EYn>l@n!&boU8c<+gLdjm)9nn zYB$#9Jo(`#-1+TiH*0+160f0=Q==3^oeE-2Exj8UwENSvj8mx|8LGbV-Jv<;7e<&6 zgj30LK9FPrFhu35j95)AcDjK-kzXxM>#gSc`r@Zj_{kBm!Tcoxx3Z*a zQS-WK=u3@}tl&2sTx;#q?u`ohopwo5pK+S)^ur@kOj8+LYZ|dr>2Cw=BP~+Q#xmD; z?@ZH3g&o!vTow^On*D09p!d19M73Z>`8eX+;TyVE5oV!kp7}s%+v$<2x|(J1gFf~x zzR~wccul0l=%?(}QN~Gx&XM|<$g|xq(PANsqc0c;o?_8 zo#lepA|fClhXqHmx>{94hQvDeOP3S03dArN;_B)A8HC?GZtnOm*d|esq5U#c_McI! zO7jjDC9gCoYU{rIA1r{1aD^m|($9BR?mw}iA}*M$8SgSCnNX~^)P%TaUmkgcR3(rn z*$;jlbw+UY!Ti;B1E*20r-%**%GrvQDhU4102s!k9vKadm7P6!gOj=tpqnikhDS${ z9UUEkC-Dpz5`EnDJ3c{l`BEjouxC(vorYeeXyGoq&)%9*z!dw={9xB!1nbr*{ewmn z zy(Kp8owaj9Q4%3=`<5Z|w&RG^0L55sJ`6ccI$e5Edu6e}b+)hALcYUSmDvx{Ysp^H z#N+gkD(`2~N->S6n6@R`9_%B7V>|n9mx0-LjeaMJTkU0fG6gh;YBhy4k0x=o-ObDMl0!qCw|vn`kPt6&_CN6huC0akNi z`IZ((_Q}6sK+f*)Crm=m1FweK@o*VU%y&9wZ~I`AOT3q;_b+@sa=(8P(%+}NRLkyk z2yie?j!^af)-h3Y)wa6bXCD&D!t{qC09N8mB{D5d59(*j(yUA6Vx8GMJnGrC9sof* zMSG=Nz{%Hp={@ngckT#ztDJKOC`sAW)zGX@eM2o1HZJY`BOO$8!gc%dW$LFd-U$h@ z>C19O%_%sYcepsKUKzKxXlIKDP>B|X*FhMFIiCAcudG;lcosaqzjG!D(Kkz7evvGD zpPBQtPGL)^u{rsef_r#icqb5Qky4VJk=V|A*L6F<`?O2#iTNQtMQ4YDpJ%Wd&Aa#K zw(aRO-7B}f8*AhiA}L}(K!QfJnSe`TIwLzd4?UdP zDJxB)3d?s|JTBqH`FZ=p>d&>Rs55In^48HwFxSWHpW zy4h<{5H=A(Qs>7<_%+(l+2Pfh>*JGS_80GS7SK!)@G)qphKf$@K`roEp+i_f9=JwGB>=UDe$?S~qw zl-P&G^AxVji4ZPli)5(?ne@sp@JQrIyruJ0p$-+137Y;Vgv1!y9Wn`PEJ@eY^t!$g^FQ&dwUabb|E1l=1ovg00y;Q zpl`M36uNQk7_I-Vy<~4UIO>SAIXcWwsFXqiLbA4hty&(Kg&L(IFvrIH0p(3dpiY#S zAy?}B1vweA6OSO-XOa||co~fmTdmO00EVM|%nPxM;GNgKAhPC`Q0yZ;qX~&Dcpg4z zJ7WzgozwWn^W3LIJ~$|0G=6yd|D)@yFm&@CultGny59TwhyDzE_St8hz1RA!?~mGu#LAH8sNVB4i{i@a zi0+S?LY9KPZ<0T`KbDq7e$UY_{mOfcxd3;|BLd)`LQ~dI^ZoSvFSa?_De9OjNXg=< zesv3H)98Q*yx250jx${Ea8cA5>U``EK8?p5%H%~-(U|z*_+*4Z2|q;-I;xGMh!6UV z!{0Nh>*4>z_V$|#_=@cw?(&c<>J~Vh54oMg4D|7fK%2ijAv^9MvOS)+l;8%L`zZCj zlL}`=%!W4KhMT(WG%SWS64vIIhAx&mFRGx4Jq5+~umy6vZGQzjtkaw3@5S*^jkdo^Dkd4$3>VPM_MK$e<#b@-TCQ z8yAS!a2t8Rh){Mi_(zaR@#seKNm{0W4^N2#sUOBHf4#qF=>u@w)EuGvTP0K^D4Y&? z%E-hbB({$cW_`^jPD$lf67??LD`a3GhoAG3rOeAU=0$2~wTsRBB9N@O@OwpKW3#@s z{iS##`kd_S>^VkvqQUK~y#AL!5__p-pYS(L5+Nb4NvDn=SvtO+fqVwOLP~&K_oqtX z@lwQLk;CN%tEvU3yw&_j|F6EVUS%!*ruO}5MOgGxcdZ}IUsiWL!+;G?s}K14R5Q?m zoz9ozo?@&ytKTv4Qt0J@# zhGg$WeZ#EXqrK1C_SaGeeLh71NuaICz+8hMz!^DxWntXKb?=~ySfH+Zqfypo$i~_8 zAho%A>lG=Kw_mT~BWEn-Ua67sFJb8z5@OSn9FN(lvRJO#aYC~9O?Iyz?sz4}(qK}S zOorfR#ka3)iTTH-T**?~&hT#c;D`DbW+`!`SOS&tX^4lYo%;l`mJ`N;I-F#WV^ndK z(GQmS;pz+B{R!#&UREzCS;p%JX0u=m!I?_5BM#Rh*tQhmpgzN?zRM%*{f8wL=Qj2} zZw{`W9YZpEST~K_-8P5Lov=^G!OiT+>EjHqbDDFRQTl;r(upSZuI|B` zl)j(q1m{eE<_D=)mMwDinc5m9PH&6wD#L#~mz^yCqqP8O18S!u{zzay3NX?0l*~E4 z0Y-g0aJZ?XV_aTd-qc%L;yyn*XtC~c`d7%kLya$_G-qeV`J}qs`h~QrALtXlIJI$B zC!=tIWS&;eLEqC9-*ml(9P@>aVg{cO1&xT3978`+aFblad_Iw-nOsP2X|{P*DrG`N zrGEgB4GT4Ck!xAX&p~G&`k+tug&50`==Tu$_MK5IC(TL9`*93((}|4gvI2 zhuN=`tE4*bQ&G%xT8GAryn3go*4ZvwE_Lqv7nl};UzKiqeDnh*wb-1dI5@ifAgoi7 z-aQ?v%Ue?y1?B}31hay@t_#`fjoqgnZChKoFE7gOqo}wpSmuYYEG5%^<7;Lt47sw% zj(^UYgU$+!OK@7f9`SDXC?j3JK#6o9A2bZ#HyX=-)Ykg>s#CLBy;P6lA*KwTzJeh4 zkX_1Ju%TKA@R!+|TQJ+X2*L(h|Dns^jj93fZ?CLM3`3Xj@L)@ai&xq^K zY|C?*+mDe?E2SkopSk#yOAHk}xHJO_kfi5u!9 z>v^424K~UUoU=SJ6UMYWtpRMWBM-2p)@st@g#4gp+5?Bg%gZ0WTl5MRDAn(XCTn&w z`{(Ebv#r5?ype#$uZFM!DKuP)+hM*}? zNT4)ODIEgQaMAuQ=BV!Z@cQ7;>9N+gU+jhJlfUca^!7c%#szLZ8`~npH^o)h4hZ#P z7pr4O*`|>wk6hvd_^LxI zs2uONZ$Z0(jK}A;;I7rhWlHsv;QIU-#dYkOQoF0m)aH|2Va#-0gVy=p7b0<}Iz^wj zMx!uuHb`6=6w?eE_{!I2b6+c-SD=e)9v znI*rPugQT5TEy3)jj%8kJxA)`aLl>}^4gFmUruP*ludb@kI^OvBwP(n*7)xxUhs27 z8!{(SCfk8z4>E$rJqc9QS=0}!P6%? zo4-~yd&*4dn7mmXPWRqtXR|*Kot`0U&FvHDn+u*{9s#Dx&&YdO#(`Gy0CAM<7p7*- zpb%v|Li){@NAUu&pUTNcK`(%|0ltfT>{5d(gLGGnuJ?50Y}zyB453=1S(Aw1_u)Pw zuYQ?(SUZlqJ?D7NfR-v=zOa#hsfcgLyJ`Jn#eDNSqZv@%5T5{~h)`R45u;m(nNhb^t#lOvztt#6}Pz$J(3% zzRKm*)!nD3r>02tIXO9DVPOjNZ&aT&&2LqEx2&>IyGuGNuz-kP1q!B{_=-b>=_XjL zQ$KZnoO$OtmNRww`~ayzE5SzuO?u{6yuWoa5Mrga*J}8`hef=R=vI^oi?D`r2S1HK z4X9O$%+E1riH1*>aBTa%(cqQWC6^xLVBt`R2uFMWMIjI7<`~PVKhdeiLkaXt$-bDZ ztYG*!slu8S0yX1oVVpM9VQ3R>JmXiG@myTjX#g9k9%|FXofk#bMR!R>unO)+wan&L z)_<&l8tb34Cq@u&7S@Fx=srAYy_oTCR}H~b_u{+nf7Fu~Tdiw*(u;V>qq^L86eXFm zN2WsaHYumU@%zkj{U;g#NPEB2w&77`WpMK?R5bk{73XYTNcm>RZ4}Htv=OYIvA9Hp zirpm@OG0d7W);R#j0ZdXm6o|SYYDe+6%2A%f!=OpHn*?EiXEHy&GUx*O7O_0HJSjpTw2>yk;)nBXxwY#u9y`QXRNDTFdZCB-Qz=U5t0 z`sDb38&2OeA($h5{wHqyRjVZZ#3J0(v3~;xAvz_}QfNTuLSC6Jv4HVT@ij&x1o`A^ z_-0-xIw=FfVEK`kOL}Mc<4k|-Kqg$e7CA*7|7}Td!Si3oe%RE>tr%i|*u4ey=sn3B*vY0S}Ar zDRxIui5YeU#92YV?Oxpcfw-pA$G%^}qOXcCV;6JVw$=Qt8>h?}iTOHF0$(~@`oPCPQfXt6h?cxnyHVb6CyCnMglT?wKuu)>PhUd-EjhfQTxy(oW`u0JLw~OH_u$ zob3joUK%IFQCT0gGpFtS)0d;uGL@@rdZZzCIe7Ts`MQj{-?G9dt z_?=?X_jd%x8i9j(&vvy*IJgJxIw-eFb+=6$)+}ugJ?|$BINIyQId&T(O80=aQTzb* zR9PvYy2i#9CzUt#$c8iZzvO5DT{GVtC^e#s0-ExJ{NlY#dNLuN088FS5+vWVhGAN% zDcL!IHU|^cH;S3PoRwfAnSy}G5$XHethFn@pOVF-Kc0ohKl}ME0?CspxAmc?3t|Er;42)R%d5x{f!^dQbc$)rhm&KdgbTzQ<_90p!HZY7pU$pUd(%EwV=CI8Y)X&<%tc4h2y}Hrv&x2 z(f~6oi|A3stGB2zS=1PTInkd62qXJQ$)Kh-`_eZPF0~KO$#k!X$NUos+(r?zY%${R zK3K5hJbry6@+e$qe6fb9!PKgZsgkt`t>sN)VB^T(x>U6vk=6-}$71jSJJ(*lNo_4c(W_CM}Bae9B4*(TUSrFV*cF@Ty z37sIx`(qt)4_IU~ptP;5F2Dy=4}N?n*v#yg{gnr|D?mo9vl@H#*GXVU%&T z*2e>eF$Yq1dhyi(f)?1S`wG?}5F+2Bt%CKvEH1B*d^>8b_{X{`=@%-cxp5ECH;b&t z9JXqrY#7HIj|nohCGjtLa0`ZZrvwLL-oZH~yRcv%kX1(=R!_EyxX^wVBXi7C+MSH$ zIH{96E99{3z-&*|)#h@s3%ajH`jQ}e2P5BpK9dUt8le>u#fZ%vsBDK>OW`Up);d8d68=p}aXJ zEb3{M4bx(D0m^TTXvA-3g@ZNn#EVv5%^@2rRnotgWVN5nnc2m5X}w%{Gy7&~x`1QD zm0RD(fIDk$Z$dp(@_Q5*=QT2UHXJrj;Fb}S8^BH)^)qbb(;{K$G-hpHxp=yYg#HNv ztJxvRT__ys*99ThO9w3i!~Ti5csjg>`)j7c=6lMiA+AE3>c{=`vW-(bbEB*!^khpe z_h{-dc8fI~PCFf(s)N(*TQB3wWaJQ4 z#UX`$+~RAzx4~^Y;f`|o4C7FlMy`I7IICuJQiY2*Gk^Ydab0grfyo`mOU%A$<{s;_ zn!U?0e-708RVt|~k9tCmLE!hF_ONZ`xR5Cc?H_;NefV9*4C^J24i+?@jUz*j>$oo# z|A1?h{F7nlS9BPN-mf;d8@vz4s+P@X9h#oC*X(Q`d~ZHlj&+>wTwGT-X6*(hrSWtl zl2PADXVa7`q9K4;I#5*Ez{)LHoMisY&_Y$Vu?8-U2-GwDGH zNyV-g=&MV|w4H?DyXSocT5ot?Xx$$@Ddl%dP{0dv6q(kA!Saed9rK>W2Aa!EC!gbt zmev)t>{;hcazesicwWLE!rHFR3YtAyq?H5)f(vw4{B2wN>6p^=TXnKFrB79W#IMD9 zDYlK^?Hp5Yl65+ct&-I0Ea#a9350`a#ECV)ddGzyRhKh#n z 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
      9-gR;}2iJY*lBaPY-N)yM*r7y;o_9 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

      A76X0O*Nxx)&#&a8ZaKOMT$S5i6ZSNh+ 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

      -$x?8%y#hXaIu`Y*un4p67DWPl9 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 Date: Wed, 7 Feb 2024 16:50:35 +0100 Subject: [PATCH 59/67] added more documentation --- README.md | 4 +- build.sh | 2 +- input/bitmap/aerodynamic_obstacle.png | Bin 0 -> 172 bytes input/bitmap/quadruple_cavity.png | Bin 0 -> 185 bytes input/different_re/2000.txt | 34 ---------- input/different_re/500.txt | 34 ---------- input/different_resolutions/settings_02.txt | 34 ---------- input/different_resolutions/settings_03.txt | 34 ---------- input/different_resolutions/settings_05.txt | 34 ---------- input/different_resolutions/settings_06.txt | 34 ---------- input/donor_cell.md | 14 ----- ....txt => settings_aerodynamic_obstacle.txt} | 58 ++++++++++++++---- ...00.txt => settings_cavity_with_a_step.txt} | 56 +++++++++++++---- ...ettings_lid_driven_cavity_with_a_step.txt} | 56 +++++++++++++---- ...s_04.txt => settings_quadruple_cavity.txt} | 52 +++++++++++++--- input/settings_v3.txt | 34 ---------- 16 files changed, 178 insertions(+), 302 deletions(-) create mode 100644 input/bitmap/aerodynamic_obstacle.png create mode 100644 input/bitmap/quadruple_cavity.png delete mode 100644 input/different_re/2000.txt delete mode 100644 input/different_re/500.txt delete mode 100644 input/different_resolutions/settings_02.txt delete mode 100644 input/different_resolutions/settings_03.txt delete mode 100644 input/different_resolutions/settings_05.txt delete mode 100644 input/different_resolutions/settings_06.txt delete mode 100644 input/donor_cell.md rename input/{different_re/100.txt => settings_aerodynamic_obstacle.txt} (50%) rename input/{different_re/10000.txt => settings_cavity_with_a_step.txt} (50%) rename input/{different_resolutions/settings_01.txt => settings_lid_driven_cavity_with_a_step.txt} (52%) rename input/{different_resolutions/settings_04.txt => settings_quadruple_cavity.txt} (57%) delete mode 100644 input/settings_v3.txt diff --git a/README.md b/README.md index 2ed6cc9a..0c61bfe0 100644 --- a/README.md +++ b/README.md @@ -83,8 +83,8 @@ pixels you will essentially simulate an empty space, so always add colored pixel for fluid as well. Safe the bitmap as a png, specify the path to that file in the settings.txt file -and set **createDomainfromBitmap** to true. In the bitmap folder you can find -example files that you can simulate as well +and set **createDomainfromBitmap** to true. In the input/ bitmap folder you can find +example files that you can simulate. ## Display simulation results in ParaView diff --git a/build.sh b/build.sh index 247f9d4a..9f6797ac 100755 --- a/build.sh +++ b/build.sh @@ -22,7 +22,7 @@ make install -j4 # ./numsim ../input/settings.txt # ./numsim ../input/settings_v3.txt -./numsim ../input/settings_debug.txt +./numsim ../input/settings_aerodynamic_obstacle.txt # ./numsim ../input/settings_damBreak.txt diff --git a/input/bitmap/aerodynamic_obstacle.png b/input/bitmap/aerodynamic_obstacle.png new file mode 100644 index 0000000000000000000000000000000000000000..5de5d25d2b8ec3e6e59105b4e7497af99a8dc4dd GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^MnEjW!3HGHpURsBq>4RV978<3ldqW1{y9HUg5g+T zKhLHJncj(xVv0N=ofEs4U)uPKd&d74&*Hmmn@$VAuv@ToxyC1sjq?_?FK0WVyye4< z748lTt#T%bY0i_pGE;WiwRYE!-rKvH8eBzEza4zUIlHTw1`D#da Date: Wed, 7 Feb 2024 16:52:17 +0100 Subject: [PATCH 60/67] moooore stuff --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0c61bfe0..e48c13f4 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Project for the lecture Numerische Simulation at the University of Stuttgart. De ## Run the simulation -We recommend to run the simulation using the provided bash script "build.sh". In that file enter the path of the settings file you would like to use. You can uncomment the doxygen part to build the documentation. Tests can be executed by uncommenting the run_test line +We recommend to run the simulation using the provided bash script `build.sh`. In that file enter the path of the settings file you would like to use. You can uncomment the doxygen part to build the documentation. Tests can be executed by uncommenting the run_test line ## Adjust the settings file For the user there is the settings.txt file that can be adjusted to From ba62e687bd8e58d5c7ecb07c94a224fda165b659 Mon Sep 17 00:00:00 2001 From: Lukas Harsch Date: Wed, 7 Feb 2024 16:57:14 +0100 Subject: [PATCH 61/67] mooooooooore --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e48c13f4..607a0c70 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Project for the lecture Numerische Simulation at the University of Stuttgart. De ## Run the simulation -We recommend to run the simulation using the provided bash script `build.sh`. In that file enter the path of the settings file you would like to use. You can uncomment the doxygen part to build the documentation. Tests can be executed by uncommenting the run_test line +We recommend to run the simulation using the provided bash script `build.sh`. In that file enter the path of the settings file you would like to use. You can uncomment the **doxygen** part to build the documentation. **Tests** using gtest can be executed by uncommenting the run_test line ## Adjust the settings file For the user there is the settings.txt file that can be adjusted to From 728277744dd1ef4923df0620e08bdc8d3745b907 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Thu, 8 Feb 2024 10:43:37 +0100 Subject: [PATCH 62/67] Adapted Bug in Obstacle init and FluidBorderTop --- src/boundary/boundary.cpp | 7 ++++-- src/boundary/mask.cpp | 8 +++---- src/computation.cpp | 33 +++++++++++++++------------- src/surface/fluid_tracer.cpp | 42 +++++++++++++++++++++++------------- 4 files changed, 54 insertions(+), 36 deletions(-) diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index 04722c7c..acf6d10f 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -14,6 +14,7 @@ void Boundary::createBoundaryCellsLists() for (int j = 0; j < mask_->size()[1]; j++) { int idx = i + j * mask_->size()[0]; + if (mask_->isDomainBoundary(i, j)) domainBoundaryCells_.push_back(idx); if (mask_->isObstacleBoundary(i, j)) @@ -143,7 +144,6 @@ void Boundary::setPressureSurfaceBC() discretization_->p(i, j) = 2/settings_.re*(discretization_->v(i, j) - discretization_->v(i, j - 1))/dy; break; case Mask::FLUID_CORNER_TOP_LEFT: - // the same calculation for all CORNERS discretization_->p(i, j) = -1/(2 * settings_.re) * ( 1/(2*dy) * (discretization_->u(i, j) + discretization_->u(i - 1, j) -discretization_->u(i, j - 1) - discretization_->u(i - 1, j - 1)) @@ -206,6 +206,8 @@ void Boundary::setPressureSurfaceBC() void Boundary::setVelocityBoundaryValues() { + setVelocityDomainBC(); + setVelocityObstacleBC(); // setAirCellsZero(); setVelocitySurfaceBC(); setVelocityDomainBC(); @@ -432,7 +434,7 @@ void Boundary::setVelocitySurfaceBC(){ case Mask::FLUID_BORDER_TOP: // v - CONTINUITY discretization_->v(i, j) = discretization_->v(i, j - 1) - + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); + - dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); // u - TANGENTIAL if (!mask_->isFluid(i - 1, j + 1)){ @@ -456,6 +458,7 @@ void Boundary::setVelocitySurfaceBC(){ discretization_->v(i, j - 1) = discretization_->v(i, j) + dyByDx * (discretization_->u(i, j) - discretization_->u(i - 1, j)); + // u - TANGENTIAL if (!mask_->isFluid(i - 1, j - 1)){ discretization_->u(i - 1, j - 1) = discretization_->u(i - 1, j) diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index e5435506..d08ce4f5 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -227,7 +227,7 @@ void Mask::setDomainBC() for (int i = 0; i < size_[0]; i++) { // Bottom Domain Boundary - if (data_[i + size_[0]] != FLUID) + if (data_[i + size_[0]] > OBSTACLE) data_[i] = OBSTACLE_INSIDE; else if (settings_.BCBottom == "NoSlip") data_[i] = DOMAIN_BOTTOM_NOSLIP; @@ -235,7 +235,7 @@ void Mask::setDomainBC() data_[i] = DOMAIN_BOTTOM_PRESSURE; // Top Domain Boundary - if (data_[i + (size_[1] - 2) * size_[0]] != FLUID) + if (data_[i + (size_[1] - 2) * size_[0]] > OBSTACLE) data_[i + (size_[1] - 1) * size_[0]] = OBSTACLE_INSIDE; else if (settings_.BCTop == "NoSlip") data_[i + (size_[1] - 1) * size_[0]] = DOMAIN_TOP_NOSLIP; @@ -246,7 +246,7 @@ void Mask::setDomainBC() for (int j = 0; j < size_[1]; j++) { // Left Domain Boundary - if (data_[j * size_[0] + 1] != FLUID) + if (data_[j * size_[0] + 1] > OBSTACLE) data_[j * size_[0]] = OBSTACLE_INSIDE; else if (settings_.BCLeft == "NoSlip") data_[j * size_[0]] = DOMAIN_LEFT_NOSLIP; @@ -254,7 +254,7 @@ void Mask::setDomainBC() data_[j * size_[0]] = DOMAIN_LEFT_PRESSURE; // Right Domain Boundary - if (data_[(size_[0] - 2) + j * size_[0]] != FLUID) + if (data_[(size_[0] - 2) + j * size_[0]] > OBSTACLE) data_[(size_[0] - 1) + j * size_[0]] = OBSTACLE_INSIDE; else if (settings_.BCRight == "NoSlip") data_[(size_[0] - 1) + j * size_[0]] = DOMAIN_RIGHT_NOSLIP; diff --git a/src/computation.cpp b/src/computation.cpp index 6c6e4fd5..bf371552 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -17,20 +17,22 @@ void Computation::initialize(int argc, char *argv[]) // create boundary and tracer mask_ = std::make_shared(settings_); - // Read in nCells from BitMap - std::array n_Cells = {mask_->size()[0]-2, mask_->size()[1]-2}; - - - std::array meshWidth_ = {0.1, 0.1}; + if (settings_.createDomainfromBitmap){ + settings_.nCells = {mask_->size()[0]-2, mask_->size()[1]-2}; + settings_.physicalSize = {settings_.physicalSize[0], settings_.physicalSize[0] * settings_.nCells[1] / settings_.nCells[0]}; + } + meshWidth_ = {settings_.physicalSize[0] / settings_.nCells[0], settings_.physicalSize[1] / settings_.nCells[1]}; + std::cout << "Meshwidth: " << meshWidth_[0] << " " << meshWidth_[1] << std::endl; + usleep(1000000); if (settings_.useDonorCell) { - discretization_ = std::make_shared(n_Cells, meshWidth_, settings_.alpha); + discretization_ = std::make_shared(settings_.nCells, meshWidth_, settings_.alpha); } else { - discretization_ = std::make_shared(n_Cells, meshWidth_); + discretization_ = std::make_shared(settings_.nCells, meshWidth_); } // Boundary boundary_ = std::make_shared(mask_, discretization_, settings_); @@ -67,7 +69,7 @@ void Computation::initialize(int argc, char *argv[]) void Computation::runSimulation() { // setting - double printInterval = 0.005; + double printInterval = 0.05; // initialize double currentTime = 0.; @@ -80,11 +82,9 @@ void Computation::runSimulation() { // fluidTracer_->createParticles(0.1, 1.4); -#ifndef NDEBUG // mask_->printMask(); - // usleep(1000000); + // usleep(100000000); // std::cout << "\033[2J\033[1;1H"; -#endif computeTimeStepWidth(currentTime); computePreliminaryVelocities(); @@ -98,19 +98,21 @@ void Computation::runSimulation() // fluidTracer_->createParticles(settings_.particleSource[0], settings_.particleSource[1]); // } boundary_->setVelocityBoundaryValues(dt_); + currentTime += dt_; + computeTimeStepWidth(currentTime); fluidTracer_->moveParticles(dt_); } - //boundary_->updateBoundary(); + boundary_->updateBoundary(); boundary_->setVelocityBoundaryValues(); - //boundary_->setPressureSurfaceBC(); + boundary_->setPressureSurfaceBC(); - currentTime += dt_; + // currentTime += dt_; if (currentTime > printTime) { outputWriterParaview_->writeFile(currentTime); printTime += printInterval; - // std::cout << currentTime << " -> write file, took steps: " << stepsBetweenPrints << std::endl; + std::cout << currentTime << " -> write file, took steps: " << stepsBetweenPrints << std::endl; stepsBetweenPrints = 0; } @@ -120,6 +122,7 @@ void Computation::runSimulation() outputWriterText_->writeFile(currentTime); outputWriterText_->writePressureFile(); std::cout << currentTime << std::endl; + // usleep(100000000); #endif } while (currentTime < settings_.endTime); diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index ddb9a307..aee1b89e 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -124,14 +124,18 @@ void FluidTracer::moveParticles(double dt) { discretization_->v().interpolateAt(x_[i], y_[i])}; std::array idx = cellOfParticle(i); - std::array newIdx = updateParticle(i, idx, dt, vel); + // std::array newIdx = updateParticle(i, idx, dt, vel); + x_[i] += vel[0] * dt; + y_[i] += vel[1] * dt; + std::array newIdx = cellOfParticle(i); + // TODO: uncomment this if threshold instead of singleParticle if (mask_->isObstacle(newIdx[0], newIdx[1])){ std::cout<< "CFL Violated" << std::endl; // remove from domain - x_[i] = 0; - y_[i] = 0; + x_.erase(x_.begin() + i); + y_.erase(y_.begin() + i); } else { currentParticlesPerCell_[newIdx[0] + newIdx[1] * mask_->size()[0]] += 1; @@ -159,10 +163,17 @@ void FluidTracer::moveParticles(double dt) { void FluidTracer::resetVelocityInAirCells(){ for (int i = 1; i < mask_->size()[0]-1; i++){ for (int j = 1; j < mask_->size()[1]-1; j++){ - if (mask_->isAir(i, j) && mask_->isAir(i + 1, j)){ + if (!mask_->isFluid(i- 1, j - 1) + && !mask_->isFluid(i, j - 1) + && !mask_->isFluid(i + 1, j - 1) + && !mask_->isFluid(i - 1, j) + && !mask_->isFluid(i, j) + && !mask_->isFluid(i + 1, j) + && !mask_->isFluid(i - 1, j + 1) + && !mask_->isFluid(i, j + 1) + && !mask_->isFluid(i + 1, j + 1) + ){ discretization_->u(i, j) = 0; - } - if (mask_->isAir(i, j) && mask_->isAir(i, j + 1)){ discretization_->v(i, j) = 0; } } @@ -200,9 +211,10 @@ std::array FluidTracer::updateParticle(int i, std::array idx, do std::array newVel = vel; // if any collision - double eps = 1e-10; + double eps = 1e-14; if (dt < eps){ + // Source of error return newIdx; } @@ -227,7 +239,7 @@ std::array FluidTracer::updateParticle(int i, std::array idx, do dtBeforeCollision = dt_y; } else { // collision RIGHT - if (mask_->isObstacle(idx[0] + 1, idx[1])){ //TODO: change + if (mask_->isObstacle(idx[0] + 1, idx[1])){ newVel[0] = -vel[0]; } else { newIdx[0] += 1; @@ -249,7 +261,7 @@ std::array FluidTracer::updateParticle(int i, std::array idx, do dtBeforeCollision = dt_y; } else { // collision RIGHT - if (mask_->isObstacle(idx[0] + 1, idx[1])){ // TODO: change + if (mask_->isObstacle(idx[0] + 1, idx[1])){ newVel[0] = -vel[0]; } else { newIdx[0] += 1; @@ -277,7 +289,7 @@ std::array FluidTracer::updateParticle(int i, std::array idx, do dtBeforeCollision = dt_y; } else { // collision LEFT - if (mask_->isObstacle(idx[0] - 1, idx[1])){ // TODO: change + if (mask_->isObstacle(idx[0] - 1, idx[1])){ newVel[0] = -vel[0]; } else { newIdx[0] -= 1; @@ -299,7 +311,7 @@ std::array FluidTracer::updateParticle(int i, std::array idx, do dtBeforeCollision = dt_y; } else { // collision LEFT - if (mask_->isObstacle(idx[0] - 1, idx[1])){ //TODO: change + if (mask_->isObstacle(idx[0] - 1, idx[1])){ newVel[0] = -vel[0]; } else { newIdx[0] -= 1; @@ -456,7 +468,7 @@ std::array FluidTracer::updateParticle(int i, std::array idx, dtBeforeCollision = dt_y; } else { // collision RIGHT - if (mask_->isObstacle(idx[0] + 1, idx[1])){ //TODO: change + if (mask_->isObstacle(idx[0] + 1, idx[1])){ newVel[0] = -vel[0]; } else { newIdx[0] += 1; @@ -478,7 +490,7 @@ std::array FluidTracer::updateParticle(int i, std::array idx, dtBeforeCollision = dt_y; } else { // collision RIGHT - if (mask_->isObstacle(idx[0] + 1, idx[1])){ // TODO: change + if (mask_->isObstacle(idx[0] + 1, idx[1])){ newVel[0] = -vel[0]; } else { newIdx[0] += 1; @@ -506,7 +518,7 @@ std::array FluidTracer::updateParticle(int i, std::array idx, dtBeforeCollision = dt_y; } else { // collision LEFT - if (mask_->isObstacle(idx[0] - 1, idx[1])){ // TODO: change + if (mask_->isObstacle(idx[0] - 1, idx[1])){ newVel[0] = -vel[0]; } else { newIdx[0] -= 1; @@ -528,7 +540,7 @@ std::array FluidTracer::updateParticle(int i, std::array idx, dtBeforeCollision = dt_y; } else { // collision LEFT - if (mask_->isObstacle(idx[0] - 1, idx[1])){ //TODO: change + if (mask_->isObstacle(idx[0] - 1, idx[1])){ newVel[0] = -vel[0]; } else { newIdx[0] -= 1; From 426832bace3d2a534860ae5f420779df093889cd Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Thu, 8 Feb 2024 16:02:21 +0100 Subject: [PATCH 63/67] [It works][Rocket debug] --- build.sh | 29 +- documentation/html/annotated.html | 105 + documentation/html/array2D_8h_source.html | 122 + documentation/html/bc_s.png | Bin 0 -> 676 bytes documentation/html/bc_sd.png | Bin 0 -> 635 bytes documentation/html/boundary_8h_source.html | 157 + .../html/central__differences_8h_source.html | 119 + documentation/html/classArray2D-members.html | 92 + documentation/html/classArray2D.html | 238 ++ documentation/html/classArray2D.png | Bin 0 -> 455 bytes documentation/html/classBoundary-members.html | 95 + documentation/html/classBoundary.html | 231 ++ .../html/classCentralDifferences-members.html | 148 + .../html/classCentralDifferences.html | 558 ++++ .../html/classCentralDifferences.png | Bin 0 -> 799 bytes .../html/classComputation-members.html | 88 + documentation/html/classComputation.html | 147 + .../html/classDiscretization-members.html | 147 + documentation/html/classDiscretization.html | 555 ++++ documentation/html/classDiscretization.png | Bin 0 -> 1039 bytes .../html/classDonorCell-members.html | 148 + documentation/html/classDonorCell.html | 565 ++++ documentation/html/classDonorCell.png | Bin 0 -> 690 bytes .../html/classFieldVariable-members.html | 95 + documentation/html/classFieldVariable.html | 250 ++ documentation/html/classFieldVariable.png | Bin 0 -> 454 bytes .../html/classFluidTracer-members.html | 99 + documentation/html/classFluidTracer.html | 264 ++ .../html/classGaussSeidel-members.html | 101 + documentation/html/classGaussSeidel.html | 253 ++ documentation/html/classGaussSeidel.png | Bin 0 -> 502 bytes documentation/html/classMask-members.html | 148 + documentation/html/classMask.html | 679 +++++ .../html/classOutputWriter-members.html | 90 + documentation/html/classOutputWriter.html | 194 ++ documentation/html/classOutputWriter.png | Bin 0 -> 884 bytes .../classOutputWriterParaview-members.html | 91 + .../html/classOutputWriterParaview.html | 213 ++ .../html/classOutputWriterParaview.png | Bin 0 -> 611 bytes .../html/classOutputWriterText-members.html | 91 + documentation/html/classOutputWriterText.html | 195 ++ documentation/html/classOutputWriterText.png | Bin 0 -> 534 bytes .../html/classPressureSolver-members.html | 100 + documentation/html/classPressureSolver.html | 286 ++ documentation/html/classPressureSolver.png | Bin 0 -> 675 bytes documentation/html/classSOR-members.html | 101 + documentation/html/classSOR.html | 260 ++ documentation/html/classSOR.png | Bin 0 -> 441 bytes .../html/classStaggeredGrid-members.html | 136 + documentation/html/classStaggeredGrid.html | 354 +++ documentation/html/classStaggeredGrid.png | Bin 0 -> 1049 bytes documentation/html/classes.html | 119 + documentation/html/clipboard.js | 61 + documentation/html/closed.png | Bin 0 -> 132 bytes documentation/html/computation_8h_source.html | 154 + .../dir_041db6ad6a3d44280e40e5af409429cb.html | 97 + .../dir_2725064ac5d6db7b2425ad4e379e8748.html | 95 + .../dir_29398f723566cb24cda620b0fb0566c4.html | 93 + .../dir_452baf35e1d7639c9f2a5ece4ec85855.html | 95 + .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 110 + .../dir_93b0d6a552827721ec9247642283aaa7.html | 93 + .../dir_b0b9c4b8ebed4a07d44b9aa635c19fe7.html | 97 + .../dir_e7c1ed2d2d4c4bb5d8a9744d9e98c346.html | 99 + .../html/discretization_8h_source.html | 137 + documentation/html/doc.svg | 12 + documentation/html/docd.svg | 12 + documentation/html/donor__cell_8h_source.html | 123 + documentation/html/doxygen.css | 2080 ++++++++++++++ documentation/html/doxygen.svg | 28 + documentation/html/dynsections.js | 194 ++ .../html/field__variable_8h_source.html | 121 + documentation/html/files.html | 112 + .../html/fluid__tracer_8h_source.html | 176 ++ documentation/html/folderclosed.svg | 11 + documentation/html/folderclosedd.svg | 11 + documentation/html/folderopen.svg | 17 + documentation/html/folderopend.svg | 12 + documentation/html/functions.html | 312 ++ documentation/html/functions_enum.html | 83 + documentation/html/functions_func.html | 245 ++ documentation/html/functions_vars.html | 208 ++ .../html/gauss__seidel_8h_source.html | 113 + documentation/html/hierarchy.html | 105 + documentation/html/index.html | 83 + documentation/html/jquery.js | 91 + documentation/html/mask_8h_source.html | 237 ++ documentation/html/menu.js | 134 + documentation/html/menudata.js | 92 + documentation/html/minus.svg | 8 + documentation/html/minusd.svg | 8 + documentation/html/nav_f.png | Bin 0 -> 153 bytes documentation/html/nav_fd.png | Bin 0 -> 169 bytes documentation/html/nav_g.png | Bin 0 -> 95 bytes documentation/html/nav_h.png | Bin 0 -> 98 bytes documentation/html/nav_hd.png | Bin 0 -> 114 bytes documentation/html/open.png | Bin 0 -> 123 bytes .../html/output__writer_8h_source.html | 118 + .../output__writer__paraview_8h_source.html | 128 + .../html/output__writer__text_8h_source.html | 116 + documentation/html/plus.svg | 9 + documentation/html/plusd.svg | 9 + .../html/pressure__solver_8h_source.html | 148 + documentation/html/search/all_0.js | 5 + documentation/html/search/all_1.js | 6 + documentation/html/search/all_10.js | 4 + documentation/html/search/all_11.js | 12 + documentation/html/search/all_12.js | 10 + documentation/html/search/all_13.js | 5 + documentation/html/search/all_2.js | 21 + documentation/html/search/all_3.js | 12 + documentation/html/search/all_4.js | 6 + documentation/html/search/all_5.js | 15 + documentation/html/search/all_6.js | 13 + documentation/html/search/all_7.js | 15 + documentation/html/search/all_8.js | 5 + documentation/html/search/all_9.js | 5 + documentation/html/search/all_a.js | 12 + documentation/html/search/all_b.js | 9 + documentation/html/search/all_c.js | 10 + documentation/html/search/all_d.js | 20 + documentation/html/search/all_e.js | 13 + documentation/html/search/all_f.js | 18 + documentation/html/search/classes_0.js | 4 + documentation/html/search/classes_1.js | 4 + documentation/html/search/classes_2.js | 5 + documentation/html/search/classes_3.js | 5 + documentation/html/search/classes_4.js | 5 + documentation/html/search/classes_5.js | 4 + documentation/html/search/classes_6.js | 4 + documentation/html/search/classes_7.js | 4 + documentation/html/search/classes_8.js | 6 + documentation/html/search/classes_9.js | 4 + documentation/html/search/classes_a.js | 6 + documentation/html/search/close.svg | 18 + documentation/html/search/enums_0.js | 4 + documentation/html/search/functions_0.js | 4 + documentation/html/search/functions_1.js | 4 + documentation/html/search/functions_10.js | 5 + documentation/html/search/functions_2.js | 17 + documentation/html/search/functions_3.js | 9 + documentation/html/search/functions_4.js | 10 + documentation/html/search/functions_5.js | 12 + documentation/html/search/functions_6.js | 12 + documentation/html/search/functions_7.js | 4 + documentation/html/search/functions_8.js | 7 + documentation/html/search/functions_9.js | 4 + documentation/html/search/functions_a.js | 6 + documentation/html/search/functions_b.js | 11 + documentation/html/search/functions_c.js | 11 + documentation/html/search/functions_d.js | 15 + documentation/html/search/functions_e.js | 9 + documentation/html/search/functions_f.js | 8 + documentation/html/search/mag.svg | 24 + documentation/html/search/mag_d.svg | 24 + documentation/html/search/mag_sel.svg | 31 + documentation/html/search/mag_seld.svg | 31 + documentation/html/search/search.css | 291 ++ documentation/html/search/search.js | 694 +++++ documentation/html/search/searchdata.js | 27 + documentation/html/search/variables_0.js | 4 + documentation/html/search/variables_1.js | 5 + documentation/html/search/variables_10.js | 6 + documentation/html/search/variables_11.js | 5 + documentation/html/search/variables_2.js | 5 + documentation/html/search/variables_3.js | 6 + documentation/html/search/variables_4.js | 6 + documentation/html/search/variables_5.js | 7 + documentation/html/search/variables_6.js | 5 + documentation/html/search/variables_7.js | 6 + documentation/html/search/variables_8.js | 5 + documentation/html/search/variables_9.js | 8 + documentation/html/search/variables_a.js | 9 + documentation/html/search/variables_b.js | 6 + documentation/html/search/variables_c.js | 13 + documentation/html/search/variables_d.js | 5 + documentation/html/search/variables_e.js | 5 + documentation/html/search/variables_f.js | 4 + documentation/html/settings_8h_source.html | 217 ++ documentation/html/sor_8h_source.html | 117 + documentation/html/splitbar.png | Bin 0 -> 314 bytes documentation/html/splitbard.png | Bin 0 -> 282 bytes .../html/staggered__grid_8h_source.html | 219 ++ .../html/structSettings-members.html | 123 + documentation/html/structSettings.html | 352 +++ ...structSettings_1_1LineContent-members.html | 93 + .../html/structSettings_1_1LineContent.html | 116 + documentation/html/sync_off.png | Bin 0 -> 853 bytes documentation/html/sync_on.png | Bin 0 -> 845 bytes documentation/html/tab_a.png | Bin 0 -> 142 bytes documentation/html/tab_ad.png | Bin 0 -> 135 bytes documentation/html/tab_b.png | Bin 0 -> 169 bytes documentation/html/tab_bd.png | Bin 0 -> 173 bytes documentation/html/tab_h.png | Bin 0 -> 177 bytes documentation/html/tab_hd.png | Bin 0 -> 180 bytes documentation/html/tab_s.png | Bin 0 -> 184 bytes documentation/html/tab_sd.png | Bin 0 -> 188 bytes documentation/html/tabs.css | 1 + documentation/latex/Makefile | 27 + documentation/latex/annotated.tex | 21 + documentation/latex/array2D_8h_source.tex | 52 + documentation/latex/boundary_8h_source.tex | 105 + .../latex/central__differences_8h_source.tex | 45 + documentation/latex/classArray2D.eps | 197 ++ documentation/latex/classArray2D.pdf | Bin 0 -> 4942 bytes documentation/latex/classArray2D.tex | 104 + documentation/latex/classBoundary.tex | 102 + .../latex/classCentralDifferences.eps | 203 ++ .../latex/classCentralDifferences.pdf | Bin 0 -> 5704 bytes .../latex/classCentralDifferences.tex | 244 ++ documentation/latex/classComputation.tex | 50 + documentation/latex/classDiscretization.eps | 209 ++ documentation/latex/classDiscretization.pdf | Bin 0 -> 5766 bytes documentation/latex/classDiscretization.tex | 245 ++ documentation/latex/classDonorCell.eps | 203 ++ documentation/latex/classDonorCell.pdf | Bin 0 -> 5600 bytes documentation/latex/classDonorCell.tex | 246 ++ documentation/latex/classFieldVariable.eps | 197 ++ documentation/latex/classFieldVariable.pdf | Bin 0 -> 4939 bytes documentation/latex/classFieldVariable.tex | 110 + documentation/latex/classFluidTracer.tex | 111 + documentation/latex/classGaussSeidel.eps | 197 ++ documentation/latex/classGaussSeidel.pdf | Bin 0 -> 5020 bytes documentation/latex/classGaussSeidel.tex | 111 + documentation/latex/classMask.tex | 339 +++ documentation/latex/classOutputWriter.eps | 203 ++ documentation/latex/classOutputWriter.pdf | Bin 0 -> 5206 bytes documentation/latex/classOutputWriter.tex | 84 + .../latex/classOutputWriterParaview.eps | 197 ++ .../latex/classOutputWriterParaview.pdf | Bin 0 -> 4909 bytes .../latex/classOutputWriterParaview.tex | 88 + documentation/latex/classOutputWriterText.eps | 197 ++ documentation/latex/classOutputWriterText.pdf | Bin 0 -> 4610 bytes documentation/latex/classOutputWriterText.tex | 85 + documentation/latex/classPressureSolver.eps | 203 ++ documentation/latex/classPressureSolver.pdf | Bin 0 -> 5338 bytes documentation/latex/classPressureSolver.tex | 130 + documentation/latex/classSOR.eps | 197 ++ documentation/latex/classSOR.pdf | Bin 0 -> 4725 bytes documentation/latex/classSOR.tex | 113 + documentation/latex/classStaggeredGrid.eps | 209 ++ documentation/latex/classStaggeredGrid.pdf | Bin 0 -> 5761 bytes documentation/latex/classStaggeredGrid.tex | 203 ++ documentation/latex/computation_8h_source.tex | 90 + .../latex/discretization_8h_source.tex | 66 + documentation/latex/donor__cell_8h_source.tex | 50 + documentation/latex/doxygen.sty | 694 +++++ documentation/latex/etoc_doxygen.sty | 2178 ++++++++++++++ .../latex/field__variable_8h_source.tex | 51 + documentation/latex/files.tex | 20 + .../latex/fluid__tracer_8h_source.tex | 110 + .../latex/gauss__seidel_8h_source.tex | 34 + documentation/latex/hierarchy.tex | 31 + documentation/latex/longtable_doxygen.sty | 456 +++ documentation/latex/mask_8h_source.tex | 210 ++ .../latex/output__writer_8h_source.tex | 38 + .../output__writer__paraview_8h_source.tex | 51 + .../latex/output__writer__text_8h_source.tex | 41 + .../latex/pressure__solver_8h_source.tex | 70 + documentation/latex/refman.tex | 262 ++ documentation/latex/settings_8h_source.tex | 113 + documentation/latex/sor_8h_source.tex | 39 + .../latex/staggered__grid_8h_source.tex | 180 ++ documentation/latex/structSettings.tex | 192 ++ .../latex/structSettings_1_1LineContent.tex | 31 + documentation/latex/tabu_doxygen.sty | 2557 +++++++++++++++++ input/bitmap/doubleDam/doubleDam.png | Bin 0 -> 150 bytes input/bitmap/doubleDam/doubleDam.txt | 73 + input/bitmap/doubleDam/doubleDamLeft.png | Bin 0 -> 144 bytes input/bitmap/doubleDam/doubleDamLeft.txt | 73 + input/bitmap/doubleDam/doubleDamRight.png | Bin 0 -> 140 bytes input/bitmap/doubleDam/doubleDamRight.txt | 73 + input/bitmap/doubleDam/doubleDamTop.png | Bin 0 -> 153 bytes input/bitmap/doubleDam/doubleDamTop.txt | 73 + input/bitmap/doubleDam/small.png | Bin 0 -> 192 bytes input/bitmap/doubleDam/smallLeft.png | Bin 0 -> 189 bytes input/bitmap/doubleDam/smallRight.png | Bin 0 -> 240 bytes input/bitmap/doubleDam/smallTop.png | Bin 0 -> 191 bytes input/bitmap/dropWaterHighResolution.png | Bin 0 -> 749 bytes input/settings_debug_joni.txt | 2 +- input/settings_drop.txt | 8 +- src/boundary/boundary.cpp | 14 +- src/computation.cpp | 3 + src/surface/fluid_tracer.cpp | 47 +- 283 files changed, 29788 insertions(+), 26 deletions(-) create mode 100644 documentation/html/annotated.html create mode 100644 documentation/html/array2D_8h_source.html create mode 100644 documentation/html/bc_s.png create mode 100644 documentation/html/bc_sd.png create mode 100644 documentation/html/boundary_8h_source.html create mode 100644 documentation/html/central__differences_8h_source.html create mode 100644 documentation/html/classArray2D-members.html create mode 100644 documentation/html/classArray2D.html create mode 100644 documentation/html/classArray2D.png create mode 100644 documentation/html/classBoundary-members.html create mode 100644 documentation/html/classBoundary.html create mode 100644 documentation/html/classCentralDifferences-members.html create mode 100644 documentation/html/classCentralDifferences.html create mode 100644 documentation/html/classCentralDifferences.png create mode 100644 documentation/html/classComputation-members.html create mode 100644 documentation/html/classComputation.html create mode 100644 documentation/html/classDiscretization-members.html create mode 100644 documentation/html/classDiscretization.html create mode 100644 documentation/html/classDiscretization.png create mode 100644 documentation/html/classDonorCell-members.html create mode 100644 documentation/html/classDonorCell.html create mode 100644 documentation/html/classDonorCell.png create mode 100644 documentation/html/classFieldVariable-members.html create mode 100644 documentation/html/classFieldVariable.html create mode 100644 documentation/html/classFieldVariable.png create mode 100644 documentation/html/classFluidTracer-members.html create mode 100644 documentation/html/classFluidTracer.html create mode 100644 documentation/html/classGaussSeidel-members.html create mode 100644 documentation/html/classGaussSeidel.html create mode 100644 documentation/html/classGaussSeidel.png create mode 100644 documentation/html/classMask-members.html create mode 100644 documentation/html/classMask.html create mode 100644 documentation/html/classOutputWriter-members.html create mode 100644 documentation/html/classOutputWriter.html create mode 100644 documentation/html/classOutputWriter.png create mode 100644 documentation/html/classOutputWriterParaview-members.html create mode 100644 documentation/html/classOutputWriterParaview.html create mode 100644 documentation/html/classOutputWriterParaview.png create mode 100644 documentation/html/classOutputWriterText-members.html create mode 100644 documentation/html/classOutputWriterText.html create mode 100644 documentation/html/classOutputWriterText.png create mode 100644 documentation/html/classPressureSolver-members.html create mode 100644 documentation/html/classPressureSolver.html create mode 100644 documentation/html/classPressureSolver.png create mode 100644 documentation/html/classSOR-members.html create mode 100644 documentation/html/classSOR.html create mode 100644 documentation/html/classSOR.png create mode 100644 documentation/html/classStaggeredGrid-members.html create mode 100644 documentation/html/classStaggeredGrid.html create mode 100644 documentation/html/classStaggeredGrid.png create mode 100644 documentation/html/classes.html create mode 100644 documentation/html/clipboard.js create mode 100644 documentation/html/closed.png create mode 100644 documentation/html/computation_8h_source.html create mode 100644 documentation/html/dir_041db6ad6a3d44280e40e5af409429cb.html create mode 100644 documentation/html/dir_2725064ac5d6db7b2425ad4e379e8748.html create mode 100644 documentation/html/dir_29398f723566cb24cda620b0fb0566c4.html create mode 100644 documentation/html/dir_452baf35e1d7639c9f2a5ece4ec85855.html create mode 100644 documentation/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html create mode 100644 documentation/html/dir_93b0d6a552827721ec9247642283aaa7.html create mode 100644 documentation/html/dir_b0b9c4b8ebed4a07d44b9aa635c19fe7.html create mode 100644 documentation/html/dir_e7c1ed2d2d4c4bb5d8a9744d9e98c346.html create mode 100644 documentation/html/discretization_8h_source.html create mode 100644 documentation/html/doc.svg create mode 100644 documentation/html/docd.svg create mode 100644 documentation/html/donor__cell_8h_source.html create mode 100644 documentation/html/doxygen.css create mode 100644 documentation/html/doxygen.svg create mode 100644 documentation/html/dynsections.js create mode 100644 documentation/html/field__variable_8h_source.html create mode 100644 documentation/html/files.html create mode 100644 documentation/html/fluid__tracer_8h_source.html create mode 100644 documentation/html/folderclosed.svg create mode 100644 documentation/html/folderclosedd.svg create mode 100644 documentation/html/folderopen.svg create mode 100644 documentation/html/folderopend.svg create mode 100644 documentation/html/functions.html create mode 100644 documentation/html/functions_enum.html create mode 100644 documentation/html/functions_func.html create mode 100644 documentation/html/functions_vars.html create mode 100644 documentation/html/gauss__seidel_8h_source.html create mode 100644 documentation/html/hierarchy.html create mode 100644 documentation/html/index.html create mode 100644 documentation/html/jquery.js create mode 100644 documentation/html/mask_8h_source.html create mode 100644 documentation/html/menu.js create mode 100644 documentation/html/menudata.js create mode 100644 documentation/html/minus.svg create mode 100644 documentation/html/minusd.svg create mode 100644 documentation/html/nav_f.png create mode 100644 documentation/html/nav_fd.png create mode 100644 documentation/html/nav_g.png create mode 100644 documentation/html/nav_h.png create mode 100644 documentation/html/nav_hd.png create mode 100644 documentation/html/open.png create mode 100644 documentation/html/output__writer_8h_source.html create mode 100644 documentation/html/output__writer__paraview_8h_source.html create mode 100644 documentation/html/output__writer__text_8h_source.html create mode 100644 documentation/html/plus.svg create mode 100644 documentation/html/plusd.svg create mode 100644 documentation/html/pressure__solver_8h_source.html create mode 100644 documentation/html/search/all_0.js create mode 100644 documentation/html/search/all_1.js create mode 100644 documentation/html/search/all_10.js create mode 100644 documentation/html/search/all_11.js create mode 100644 documentation/html/search/all_12.js create mode 100644 documentation/html/search/all_13.js create mode 100644 documentation/html/search/all_2.js create mode 100644 documentation/html/search/all_3.js create mode 100644 documentation/html/search/all_4.js create mode 100644 documentation/html/search/all_5.js create mode 100644 documentation/html/search/all_6.js create mode 100644 documentation/html/search/all_7.js create mode 100644 documentation/html/search/all_8.js create mode 100644 documentation/html/search/all_9.js create mode 100644 documentation/html/search/all_a.js create mode 100644 documentation/html/search/all_b.js create mode 100644 documentation/html/search/all_c.js create mode 100644 documentation/html/search/all_d.js create mode 100644 documentation/html/search/all_e.js create mode 100644 documentation/html/search/all_f.js create mode 100644 documentation/html/search/classes_0.js create mode 100644 documentation/html/search/classes_1.js create mode 100644 documentation/html/search/classes_2.js create mode 100644 documentation/html/search/classes_3.js create mode 100644 documentation/html/search/classes_4.js create mode 100644 documentation/html/search/classes_5.js create mode 100644 documentation/html/search/classes_6.js create mode 100644 documentation/html/search/classes_7.js create mode 100644 documentation/html/search/classes_8.js create mode 100644 documentation/html/search/classes_9.js create mode 100644 documentation/html/search/classes_a.js create mode 100644 documentation/html/search/close.svg create mode 100644 documentation/html/search/enums_0.js create mode 100644 documentation/html/search/functions_0.js create mode 100644 documentation/html/search/functions_1.js create mode 100644 documentation/html/search/functions_10.js create mode 100644 documentation/html/search/functions_2.js create mode 100644 documentation/html/search/functions_3.js create mode 100644 documentation/html/search/functions_4.js create mode 100644 documentation/html/search/functions_5.js create mode 100644 documentation/html/search/functions_6.js create mode 100644 documentation/html/search/functions_7.js create mode 100644 documentation/html/search/functions_8.js create mode 100644 documentation/html/search/functions_9.js create mode 100644 documentation/html/search/functions_a.js create mode 100644 documentation/html/search/functions_b.js create mode 100644 documentation/html/search/functions_c.js create mode 100644 documentation/html/search/functions_d.js create mode 100644 documentation/html/search/functions_e.js create mode 100644 documentation/html/search/functions_f.js create mode 100644 documentation/html/search/mag.svg create mode 100644 documentation/html/search/mag_d.svg create mode 100644 documentation/html/search/mag_sel.svg create mode 100644 documentation/html/search/mag_seld.svg create mode 100644 documentation/html/search/search.css create mode 100644 documentation/html/search/search.js create mode 100644 documentation/html/search/searchdata.js create mode 100644 documentation/html/search/variables_0.js create mode 100644 documentation/html/search/variables_1.js create mode 100644 documentation/html/search/variables_10.js create mode 100644 documentation/html/search/variables_11.js create mode 100644 documentation/html/search/variables_2.js create mode 100644 documentation/html/search/variables_3.js create mode 100644 documentation/html/search/variables_4.js create mode 100644 documentation/html/search/variables_5.js create mode 100644 documentation/html/search/variables_6.js create mode 100644 documentation/html/search/variables_7.js create mode 100644 documentation/html/search/variables_8.js create mode 100644 documentation/html/search/variables_9.js create mode 100644 documentation/html/search/variables_a.js create mode 100644 documentation/html/search/variables_b.js create mode 100644 documentation/html/search/variables_c.js create mode 100644 documentation/html/search/variables_d.js create mode 100644 documentation/html/search/variables_e.js create mode 100644 documentation/html/search/variables_f.js create mode 100644 documentation/html/settings_8h_source.html create mode 100644 documentation/html/sor_8h_source.html create mode 100644 documentation/html/splitbar.png create mode 100644 documentation/html/splitbard.png create mode 100644 documentation/html/staggered__grid_8h_source.html create mode 100644 documentation/html/structSettings-members.html create mode 100644 documentation/html/structSettings.html create mode 100644 documentation/html/structSettings_1_1LineContent-members.html create mode 100644 documentation/html/structSettings_1_1LineContent.html create mode 100644 documentation/html/sync_off.png create mode 100644 documentation/html/sync_on.png create mode 100644 documentation/html/tab_a.png create mode 100644 documentation/html/tab_ad.png create mode 100644 documentation/html/tab_b.png create mode 100644 documentation/html/tab_bd.png create mode 100644 documentation/html/tab_h.png create mode 100644 documentation/html/tab_hd.png create mode 100644 documentation/html/tab_s.png create mode 100644 documentation/html/tab_sd.png create mode 100644 documentation/html/tabs.css create mode 100644 documentation/latex/Makefile create mode 100644 documentation/latex/annotated.tex create mode 100644 documentation/latex/array2D_8h_source.tex create mode 100644 documentation/latex/boundary_8h_source.tex create mode 100644 documentation/latex/central__differences_8h_source.tex create mode 100644 documentation/latex/classArray2D.eps create mode 100644 documentation/latex/classArray2D.pdf create mode 100644 documentation/latex/classArray2D.tex create mode 100644 documentation/latex/classBoundary.tex create mode 100644 documentation/latex/classCentralDifferences.eps create mode 100644 documentation/latex/classCentralDifferences.pdf create mode 100644 documentation/latex/classCentralDifferences.tex create mode 100644 documentation/latex/classComputation.tex create mode 100644 documentation/latex/classDiscretization.eps create mode 100644 documentation/latex/classDiscretization.pdf create mode 100644 documentation/latex/classDiscretization.tex create mode 100644 documentation/latex/classDonorCell.eps create mode 100644 documentation/latex/classDonorCell.pdf create mode 100644 documentation/latex/classDonorCell.tex create mode 100644 documentation/latex/classFieldVariable.eps create mode 100644 documentation/latex/classFieldVariable.pdf create mode 100644 documentation/latex/classFieldVariable.tex create mode 100644 documentation/latex/classFluidTracer.tex create mode 100644 documentation/latex/classGaussSeidel.eps create mode 100644 documentation/latex/classGaussSeidel.pdf create mode 100644 documentation/latex/classGaussSeidel.tex create mode 100644 documentation/latex/classMask.tex create mode 100644 documentation/latex/classOutputWriter.eps create mode 100644 documentation/latex/classOutputWriter.pdf create mode 100644 documentation/latex/classOutputWriter.tex create mode 100644 documentation/latex/classOutputWriterParaview.eps create mode 100644 documentation/latex/classOutputWriterParaview.pdf create mode 100644 documentation/latex/classOutputWriterParaview.tex create mode 100644 documentation/latex/classOutputWriterText.eps create mode 100644 documentation/latex/classOutputWriterText.pdf create mode 100644 documentation/latex/classOutputWriterText.tex create mode 100644 documentation/latex/classPressureSolver.eps create mode 100644 documentation/latex/classPressureSolver.pdf create mode 100644 documentation/latex/classPressureSolver.tex create mode 100644 documentation/latex/classSOR.eps create mode 100644 documentation/latex/classSOR.pdf create mode 100644 documentation/latex/classSOR.tex create mode 100644 documentation/latex/classStaggeredGrid.eps create mode 100644 documentation/latex/classStaggeredGrid.pdf create mode 100644 documentation/latex/classStaggeredGrid.tex create mode 100644 documentation/latex/computation_8h_source.tex create mode 100644 documentation/latex/discretization_8h_source.tex create mode 100644 documentation/latex/donor__cell_8h_source.tex create mode 100644 documentation/latex/doxygen.sty create mode 100644 documentation/latex/etoc_doxygen.sty create mode 100644 documentation/latex/field__variable_8h_source.tex create mode 100644 documentation/latex/files.tex create mode 100644 documentation/latex/fluid__tracer_8h_source.tex create mode 100644 documentation/latex/gauss__seidel_8h_source.tex create mode 100644 documentation/latex/hierarchy.tex create mode 100644 documentation/latex/longtable_doxygen.sty create mode 100644 documentation/latex/mask_8h_source.tex create mode 100644 documentation/latex/output__writer_8h_source.tex create mode 100644 documentation/latex/output__writer__paraview_8h_source.tex create mode 100644 documentation/latex/output__writer__text_8h_source.tex create mode 100644 documentation/latex/pressure__solver_8h_source.tex create mode 100644 documentation/latex/refman.tex create mode 100644 documentation/latex/settings_8h_source.tex create mode 100644 documentation/latex/sor_8h_source.tex create mode 100644 documentation/latex/staggered__grid_8h_source.tex create mode 100644 documentation/latex/structSettings.tex create mode 100644 documentation/latex/structSettings_1_1LineContent.tex create mode 100644 documentation/latex/tabu_doxygen.sty create mode 100644 input/bitmap/doubleDam/doubleDam.png create mode 100644 input/bitmap/doubleDam/doubleDam.txt create mode 100644 input/bitmap/doubleDam/doubleDamLeft.png create mode 100644 input/bitmap/doubleDam/doubleDamLeft.txt create mode 100644 input/bitmap/doubleDam/doubleDamRight.png create mode 100644 input/bitmap/doubleDam/doubleDamRight.txt create mode 100644 input/bitmap/doubleDam/doubleDamTop.png create mode 100644 input/bitmap/doubleDam/doubleDamTop.txt create mode 100644 input/bitmap/doubleDam/small.png create mode 100644 input/bitmap/doubleDam/smallLeft.png create mode 100644 input/bitmap/doubleDam/smallRight.png create mode 100644 input/bitmap/doubleDam/smallTop.png create mode 100644 input/bitmap/dropWaterHighResolution.png diff --git a/build.sh b/build.sh index 9f6797ac..d3320078 100755 --- a/build.sh +++ b/build.sh @@ -17,16 +17,37 @@ fi make install -j4 -# ./numsim ../input/settings_debug_joni.txt # ./numsim ../input/settings.txt -# ./numsim ../input/settings_v3.txt +# ./numsim ../input/settings_aerodynamic_obstacle.txt +./numsim ../input/settings_damBreak.txt + +###################### +## DEBUG -> DELETE ## +###################### +# dir="/home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Simulations/data" + +# ./numsim ../input/bitmap/doubleDam/doubleDam.txt +# rm -rf "$dir"/doubleDam/* +# cp -r out "$dir"/doubleDam/ + +# ./numsim ../input/bitmap/doubleDam/doubleDamLeft.txt +# rm -rf "$dir"/doubleDamLeft/* +# cp -r out "$dir"/doubleDamLeft/ -./numsim ../input/settings_aerodynamic_obstacle.txt -# ./numsim ../input/settings_damBreak.txt +# ./numsim ../input/bitmap/doubleDam/doubleDamRight.txt +# rm -rf "$dir"/doubleDamRight/* +# cp -r out "$dir"/doubleDamRight/ +# ./numsim ../input/bitmap/doubleDam/doubleDamTop.txt +# rm -rf "$dir"/doubleDamTop/* +# cp -r out "$dir"/doubleDamTop/out + + +# ./numsim ../input/settings_debug_joni.txt +######################## cd .. # directly open output in paraview diff --git a/documentation/html/annotated.html b/documentation/html/annotated.html new file mode 100644 index 00000000..99e38136 --- /dev/null +++ b/documentation/html/annotated.html @@ -0,0 +1,105 @@ + + + + + + + +NumSim: Class List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + +
      + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      Class List
      +
      +
      +
      Here are the classes, structs, unions and interfaces with brief descriptions:
      +
      [detail level 12]
      + + + + + + + + + + + + + + + + + + +
       CArray2DThis class represents a 2D array of double values
       CBoundaryClass responsible to caluclate boundary conditions
       CCentralDifferencesDiscretizes the problem using the central differences scheme
       CComputationComputation of Simulation
       CDiscretizationComputes derivatives included in governing equations
       CDonorCellDiscretizes the problem using the donor cell scheme
       CFieldVariableDiscretization of a scalar function
       CFluidTracer
       CGaussSeidelStandard Gauss-Seidel solver
       CMask
       COutputWriterInteface class for writing simulation data output
       COutputWriterParaviewWrite *.vti files that can be viewed with ParaView
       COutputWriterTextWrite *.txt files that are useful for debugging
       CPressureSolverSolves the Poisson problem for the pressure
       CSettingsAll settings that parametrize a simulation run
       CLineContentContains the content of a single line in a file
       CSORSuccessive over-relaxation solver
       CStaggeredGridCreate field variables and define limits for the indices
      +
      +
      + +
      + + diff --git a/documentation/html/array2D_8h_source.html b/documentation/html/array2D_8h_source.html new file mode 100644 index 00000000..f3f26112 --- /dev/null +++ b/documentation/html/array2D_8h_source.html @@ -0,0 +1,122 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/storage/array2D.h Source File + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      array2D.h
      +
      +
      +
      1#pragma once
      +
      2
      +
      3#include <vector>
      +
      4#include <array>
      +
      5#include <cassert>
      +
      6
      +
      7
      +
      + +
      16{
      +
      17public:
      +
      23 Array2D(std::array<int, 2> size);
      +
      24
      +
      32 double &operator()(int i, int j);
      +
      33
      +
      41 double operator()(int i, int j) const;
      +
      42
      +
      46 std::array<int, 2> size() const;
      +
      47
      +
      48protected:
      +
      49 const std::array<int, 2> size_;
      +
      50 std::vector<double> data_;
      +
      51};
      +
      +
      This class represents a 2D array of double values.
      Definition array2D.h:16
      +
      Array2D(std::array< int, 2 > size)
      constructor.
      Definition array2D.cpp:5
      +
      const std::array< int, 2 > size_
      size of array in x and y direction
      Definition array2D.h:49
      +
      double & operator()(int i, int j)
      set array value. Overloads the () operator
      Definition array2D.cpp:11
      +
      std::array< int, 2 > size() const
      get size of array in x and y direction
      Definition array2D.cpp:39
      +
      std::vector< double > data_
      storage array values, in row-major order
      Definition array2D.h:50
      +
      + + + + diff --git a/documentation/html/bc_s.png b/documentation/html/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/documentation/html/bc_sd.png b/documentation/html/bc_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..31ca888dc71049713b35c351933a8d0f36180bf1 GIT binary patch literal 635 zcmV->0)+jEP)Jwi0r1~gdSq#w{Bu1q z`craw(p2!hu$4C_$Oc3X(sI6e=9QSTwPt{G) z=htT&^~&c~L2~e{r5_5SYe7#Is-$ln>~Kd%$F#tC65?{LvQ}8O`A~RBB0N~`2M+waajO;5>3B&-viHGJeEK2TQOiPRa zfDKyqwMc4wfaEh4jt>H`nW_Zidwk@Bowp`}(VUaj-pSI(-1L>FJVsX}Yl9~JsqgsZ zUD9(rMwf23Gez6KPa|wwInZodP-2}9@fK0Ga_9{8SOjU&4l`pH4@qlQp83>>HT$xW zER^U>)MyV%t(Lu=`d=Y?{k1@}&r7ZGkFQ%z%N+sE9BtYjovzxyxCPxN6&@wLK{soQ zSmkj$aLI}miuE^p@~4}mg9OjDfGEkgY4~^XzLRUBB*O{+&vq<3v(E%+k_i%=`~j%{ Vj14gnt9}3g002ovPDHLkV1n!oC4m3{ literal 0 HcmV?d00001 diff --git a/documentation/html/boundary_8h_source.html b/documentation/html/boundary_8h_source.html new file mode 100644 index 00000000..da5f9357 --- /dev/null +++ b/documentation/html/boundary_8h_source.html @@ -0,0 +1,157 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/boundary/boundary.h Source File + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      boundary.h
      +
      +
      +
      1#pragma once
      +
      2
      +
      3#include "mask.h"
      +
      4#include "../discretization/discretization.h"
      +
      5#include "../settings_parser/settings.h"
      +
      6#include <vector>
      +
      7#include <memory>
      +
      8
      +
      + +
      15{
      +
      16public:
      +
      24 Boundary(std::shared_ptr<Mask> mask, std::shared_ptr<Discretization> discretization, Settings settings);
      +
      25
      + +
      30
      + +
      37
      + +
      42
      +
      50 void setVelocityBoundaryValues(double dt);
      +
      51
      +
      55 bool doCalculateF(int i, int j) const;
      +
      56
      +
      60 bool doCalculateG(int i, int j) const;
      +
      61
      +
      65 void updateBoundary();
      +
      66
      +
      67 std::shared_ptr<Mask> mask_;
      +
      68
      +
      69private:
      +
      73 void createBoundaryCellsLists();
      +
      74
      +
      78 void setPressureDomainBC();
      +
      79
      +
      83 void setPressureObstacleBC();
      +
      84
      +
      88 void setVelocityDomainBC();
      +
      89
      +
      93 void setVelocityObstacleBC();
      +
      94
      +
      98 void setVelocitySurfaceBC();
      +
      99
      +
      103 void updateVelocitySurfaceBC(double dt);
      +
      104
      +
      108 void setAirCellsZero();
      +
      109
      +
      110 std::shared_ptr<Discretization> discretization_;
      +
      111 Settings settings_;
      +
      112
      +
      113 std::vector<int> domainBoundaryCells_;
      +
      114 std::vector<int> obstacleBoundaryCells_;
      +
      115 std::vector<int> fluidBoundaryCells_;
      +
      116};
      +
      +
      Class responsible to caluclate boundary conditions.
      Definition boundary.h:15
      +
      std::shared_ptr< Mask > mask_
      shared pointer to mask entity
      Definition boundary.h:67
      +
      Boundary(std::shared_ptr< Mask > mask, std::shared_ptr< Discretization > discretization, Settings settings)
      Constructor.
      Definition boundary.cpp:3
      +
      void setPressureBoundaryValues()
      calculates and sets the pressure boundary values for obstacles and domain boundary
      Definition boundary.cpp:38
      +
      void updateBoundary()
      updates fluid boundary cell list
      Definition boundary.cpp:27
      +
      bool doCalculateG(int i, int j) const
      returns true if cell top and bottom of G value are fluid (not a boundary value)
      Definition boundary.cpp:673
      +
      void setVelocityBoundaryValues()
      calculates and sets the velocity boundary values for surface, obstacle and domain boundary
      Definition boundary.cpp:207
      +
      void setPressureSurfaceBC()
      calculates and sets the pressure boundary values for surface boundary
      Definition boundary.cpp:118
      +
      bool doCalculateF(int i, int j) const
      returns true if cell left and rigt of F value are fluid (not a boundary value)
      Definition boundary.cpp:669
      +
      All settings that parametrize a simulation run.
      Definition settings.h:14
      +
      + + + + diff --git a/documentation/html/central__differences_8h_source.html b/documentation/html/central__differences_8h_source.html new file mode 100644 index 00000000..06dd6ccb --- /dev/null +++ b/documentation/html/central__differences_8h_source.html @@ -0,0 +1,119 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/discretization/central_differences.h Source File + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      central_differences.h
      +
      +
      +
      1#pragma once
      +
      2
      +
      3#include <array>
      +
      4#include <vector>
      +
      5#include "discretization.h"
      +
      6
      +
      + +
      15{
      +
      16public:
      +
      23 CentralDifferences(std::array<int, 2> nCells, std::array<double, 2> meshWidth);
      +
      24
      +
      29 double computeDu2Dx(int i, int j) const override;
      +
      34 double computeDv2Dy(int i, int j) const override;
      +
      39 double computeDuvDx(int i, int j) const override;
      +
      44 double computeDuvDy(int i, int j) const override;
      +
      45};
      +
      +
      Discretizes the problem using the central differences scheme.
      Definition central_differences.h:15
      +
      double computeDuvDy(int i, int j) const override
      Calculate first derivative of u*v with respect to y with the central differences Scheme.
      Definition central_differences.cpp:32
      +
      double computeDv2Dy(int i, int j) const override
      Calculate first derivative of v^2 with respect to y with the central differences Scheme.
      Definition central_differences.cpp:14
      +
      double computeDuvDx(int i, int j) const override
      Calculate first derivative of u*v with respect to x with the central differences Scheme.
      Definition central_differences.cpp:21
      +
      CentralDifferences(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
      Constructor.
      Definition central_differences.cpp:3
      +
      double computeDu2Dx(int i, int j) const override
      Calculate first derivative of u^2 with respect to x with the central differences Scheme.
      Definition central_differences.cpp:7
      +
      Computes derivatives included in governing equations.
      Definition discretization.h:16
      +
      const std::array< double, 2 > meshWidth() const
      Get the length of a single cell in x and y directions.
      Definition staggered_grid.cpp:14
      +
      const std::array< int, 2 > nCells() const
      Get number of cells in x and y directions.
      Definition staggered_grid.cpp:19
      +
      + + + + diff --git a/documentation/html/classArray2D-members.html b/documentation/html/classArray2D-members.html new file mode 100644 index 00000000..b1ed0030 --- /dev/null +++ b/documentation/html/classArray2D-members.html @@ -0,0 +1,92 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      +
      Array2D Member List
      +
      +
      + +

      This is the complete list of members for Array2D, including all inherited members.

      + + + + + + + +
      Array2D(std::array< int, 2 > size)Array2D
      data_Array2Dprotected
      operator()(int i, int j)Array2D
      operator()(int i, int j) constArray2D
      size() constArray2D
      size_Array2Dprotected
      + + + + diff --git a/documentation/html/classArray2D.html b/documentation/html/classArray2D.html new file mode 100644 index 00000000..06918d52 --- /dev/null +++ b/documentation/html/classArray2D.html @@ -0,0 +1,238 @@ + + + + + + + +NumSim: Array2D Class Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      + +
      + +

      This class represents a 2D array of double values. + More...

      + +

      #include <array2D.h>

      +
      +Inheritance diagram for Array2D:
      +
      +
      + + +FieldVariable + +
      + + + + + + + + + + + + + + +

      +Public Member Functions

       Array2D (std::array< int, 2 > size)
       constructor.
       
      double & operator() (int i, int j)
       set array value. Overloads the () operator
       
      double operator() (int i, int j) const
       get array value. Overloads the () operator
       
      +std::array< int, 2 > size () const
       get size of array in x and y direction
       
      + + + + + + + +

      +Protected Attributes

      +const std::array< int, 2 > size_
       size of array in x and y direction
       
      +std::vector< double > data_
       storage array values, in row-major order
       
      +

      Detailed Description

      +

      This class represents a 2D array of double values.

      +

      Internally they are stored consecutively in memory. The entries can be accessed by two indices i,j.

      +

      Constructor & Destructor Documentation

      + +

      ◆ Array2D()

      + +
      +
      + + + + + + + + +
      Array2D::Array2D (std::array< int, 2 > size)
      +
      + +

      constructor.

      +
      Parameters
      + + +
      sizesize of array in x and y direction
      +
      +
      + +
      +
      +

      Member Function Documentation

      + +

      ◆ operator()() [1/2]

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      double & Array2D::operator() (int i,
      int j 
      )
      +
      + +

      set array value. Overloads the () operator

      +
      Parameters
      + + + +
      iindex in x direction
      jindex in y direction
      +
      +
      + +
      +
      + +

      ◆ operator()() [2/2]

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      double Array2D::operator() (int i,
      int j 
      ) const
      +
      + +

      get array value. Overloads the () operator

      +
      Parameters
      + + + +
      iindex in x direction
      jindex in y direction
      +
      +
      + +
      +
      +
      The documentation for this class was generated from the following files:
        +
      • /home/jonat/Documents/01_Studium/NumSim/src/storage/array2D.h
      • +
      • /home/jonat/Documents/01_Studium/NumSim/src/storage/array2D.cpp
      • +
      +
      + + + + diff --git a/documentation/html/classArray2D.png b/documentation/html/classArray2D.png new file mode 100644 index 0000000000000000000000000000000000000000..c9e0e4f3fd8ffc5a396c96d152a76113e65387ee GIT binary patch literal 455 zcmV;&0XY7NP)vTJr#LVva2S`&=)l0h|Ns9}lGCUF000SeQchC<|NsC0|NsC0Hv*f~0003} zNkl3lJRwZB0`v_l|O)%RuKKLkI# z@4R;3x?WYa(H)q^WJe8ezX3deUGE#8V4|HV6Qw zbpXH)?E)XiCh{)u$=yTV2L8aRFtC9Eppk(M3;?wZY+wMWW#In;77>}%AtEv<2s88h zGVm{g$$ic~ZG}-<%R9|92X?{C%#|L%y}%LpyLYLFk?&%F-#N!&Jp>l-)xH&=hgi9Wmh0y_zJswp> xK80T>i@<#cRl&^srVMOgX69Nu!6G6X^aayqN|$%m@09=m002ovPDHLkV1h~+$&>&9 literal 0 HcmV?d00001 diff --git a/documentation/html/classBoundary-members.html b/documentation/html/classBoundary-members.html new file mode 100644 index 00000000..758c368e --- /dev/null +++ b/documentation/html/classBoundary-members.html @@ -0,0 +1,95 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      +
      Boundary Member List
      +
      +
      + +

      This is the complete list of members for Boundary, including all inherited members.

      + + + + + + + + + + +
      Boundary(std::shared_ptr< Mask > mask, std::shared_ptr< Discretization > discretization, Settings settings)Boundary
      doCalculateF(int i, int j) constBoundary
      doCalculateG(int i, int j) constBoundary
      mask_Boundary
      setPressureBoundaryValues()Boundary
      setPressureSurfaceBC()Boundary
      setVelocityBoundaryValues()Boundary
      setVelocityBoundaryValues(double dt)Boundary
      updateBoundary()Boundary
      + + + + diff --git a/documentation/html/classBoundary.html b/documentation/html/classBoundary.html new file mode 100644 index 00000000..12f3a06c --- /dev/null +++ b/documentation/html/classBoundary.html @@ -0,0 +1,231 @@ + + + + + + + +NumSim: Boundary Class Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      + +
      Boundary Class Reference
      +
      +
      + +

      Class responsible to caluclate boundary conditions. + More...

      + +

      #include <boundary.h>

      + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Public Member Functions

       Boundary (std::shared_ptr< Mask > mask, std::shared_ptr< Discretization > discretization, Settings settings)
       Constructor.
       
      +void setPressureBoundaryValues ()
       calculates and sets the pressure boundary values for obstacles and domain boundary
       
      void setPressureSurfaceBC ()
       calculates and sets the pressure boundary values for surface boundary
       
      +void setVelocityBoundaryValues ()
       calculates and sets the velocity boundary values for surface, obstacle and domain boundary
       
      void setVelocityBoundaryValues (double dt)
       overloaded function that sets velocity boundary
       
      +bool doCalculateF (int i, int j) const
       returns true if cell left and rigt of F value are fluid (not a boundary value)
       
      +bool doCalculateG (int i, int j) const
       returns true if cell top and bottom of G value are fluid (not a boundary value)
       
      +void updateBoundary ()
       updates fluid boundary cell list
       
      + + + + +

      +Public Attributes

      +std::shared_ptr< Maskmask_
       shared pointer to mask entity
       
      +

      Detailed Description

      +

      Class responsible to caluclate boundary conditions.

      +

      Constructor & Destructor Documentation

      + +

      ◆ Boundary()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      Boundary::Boundary (std::shared_ptr< Maskmask,
      std::shared_ptr< Discretizationdiscretization,
      Settings settings 
      )
      +
      + +

      Constructor.

      +
      Parameters
      + + + + +
      discretizationinstance of Discretization holding the needed field variables for rhs and p
      maskinstance of mask holding the boundary condition enums for each cell tolerance for the solver
      settingsholding the necessary domainn boundary condition
      +
      +
      + +
      +
      +

      Member Function Documentation

      + +

      ◆ setPressureSurfaceBC()

      + +
      +
      + + + + + + + +
      void Boundary::setPressureSurfaceBC ()
      +
      + +

      calculates and sets the pressure boundary values for surface boundary

      +

      Only needs to be set once -> no need to update each solver iteration

      + +
      +
      + +

      ◆ setVelocityBoundaryValues()

      + +
      +
      + + + + + + + + +
      void Boundary::setVelocityBoundaryValues (double dt)
      +
      + +

      overloaded function that sets velocity boundary

      +

      necessary when fluid tracker is used

      +
      Parameters
      + + +
      dtcurrent time step
      +
      +
      + +
      +
      +
      The documentation for this class was generated from the following files:
        +
      • /home/jonat/Documents/01_Studium/NumSim/src/boundary/boundary.h
      • +
      • /home/jonat/Documents/01_Studium/NumSim/src/boundary/boundary.cpp
      • +
      +
      + + + + diff --git a/documentation/html/classCentralDifferences-members.html b/documentation/html/classCentralDifferences-members.html new file mode 100644 index 00000000..66f6e3a4 --- /dev/null +++ b/documentation/html/classCentralDifferences-members.html @@ -0,0 +1,148 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      +
      CentralDifferences Member List
      +
      +
      + +

      This is the complete list of members for CentralDifferences, including all inherited members.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      CentralDifferences(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)CentralDifferences
      computeD2uDx2(int i, int j) constDiscretizationvirtual
      computeD2uDy2(int i, int j) constDiscretizationvirtual
      computeD2vDx2(int i, int j) constDiscretizationvirtual
      computeD2vDy2(int i, int j) constDiscretizationvirtual
      computeDpDx(int i, int j) constDiscretizationvirtual
      computeDpDy(int i, int j) constDiscretizationvirtual
      computeDu2Dx(int i, int j) const overrideCentralDifferencesvirtual
      computeDuvDx(int i, int j) const overrideCentralDifferencesvirtual
      computeDuvDy(int i, int j) const overrideCentralDifferencesvirtual
      computeDv2Dy(int i, int j) const overrideCentralDifferencesvirtual
      Discretization(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)Discretization
      dx() constStaggeredGrid
      dy() constStaggeredGrid
      f(int i, int j)StaggeredGrid
      f_StaggeredGridprotected
      fIBegin() constStaggeredGrid
      fIEnd() constStaggeredGrid
      fJBegin() constStaggeredGrid
      fJEnd() constStaggeredGrid
      g(int i, int j)StaggeredGrid
      g_StaggeredGridprotected
      gIBegin() constStaggeredGrid
      gIEnd() constStaggeredGrid
      gJBegin() constStaggeredGrid
      gJEnd() constStaggeredGrid
      meshWidth() constStaggeredGrid
      meshWidth_StaggeredGridprotected
      nCells() constStaggeredGrid
      nCells_StaggeredGridprotected
      p() constStaggeredGrid
      p(int i, int j) constStaggeredGrid
      p(int i, int j)StaggeredGrid
      p_StaggeredGridprotected
      pIBegin() constStaggeredGrid
      pIEnd() constStaggeredGrid
      pJBegin() constStaggeredGrid
      pJEnd() constStaggeredGrid
      rhs() constStaggeredGrid
      rhs(int i, int j)StaggeredGrid
      rhs_StaggeredGridprotected
      rhsIBegin() constStaggeredGrid
      rhsIEnd() constStaggeredGrid
      rhsJBegin() constStaggeredGrid
      rhsJEnd() constStaggeredGrid
      StaggeredGrid(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)StaggeredGrid
      u() constStaggeredGrid
      u(int i, int j) constStaggeredGrid
      u(int i, int j)StaggeredGrid
      u_StaggeredGridprotected
      uIBegin() constStaggeredGrid
      uIEnd() constStaggeredGrid
      uJBegin() constStaggeredGrid
      uJEnd() constStaggeredGrid
      v() constStaggeredGrid
      v(int i, int j) constStaggeredGrid
      v(int i, int j)StaggeredGrid
      v_StaggeredGridprotected
      vIBegin() constStaggeredGrid
      vIEnd() constStaggeredGrid
      vJBegin() constStaggeredGrid
      vJEnd() constStaggeredGrid
      + + + + diff --git a/documentation/html/classCentralDifferences.html b/documentation/html/classCentralDifferences.html new file mode 100644 index 00000000..de6e40e1 --- /dev/null +++ b/documentation/html/classCentralDifferences.html @@ -0,0 +1,558 @@ + + + + + + + +NumSim: CentralDifferences Class Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      + +
      CentralDifferences Class Reference
      +
      +
      + +

      Discretizes the problem using the central differences scheme. + More...

      + +

      #include <central_differences.h>

      +
      +Inheritance diagram for CentralDifferences:
      +
      +
      + + +Discretization +StaggeredGrid + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Public Member Functions

       CentralDifferences (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
       Constructor.
       
      double computeDu2Dx (int i, int j) const override
       Calculate first derivative of u^2 with respect to x with the central differences Scheme.
       
      double computeDv2Dy (int i, int j) const override
       Calculate first derivative of v^2 with respect to y with the central differences Scheme.
       
      double computeDuvDx (int i, int j) const override
       Calculate first derivative of u*v with respect to x with the central differences Scheme.
       
      double computeDuvDy (int i, int j) const override
       Calculate first derivative of u*v with respect to y with the central differences Scheme.
       
      - Public Member Functions inherited from Discretization
       Discretization (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
       Constructor.
       
      +virtual double computeD2uDx2 (int i, int j) const
       Calculate second derivative of u with respect to x.
       
      +virtual double computeD2uDy2 (int i, int j) const
       Calculate second derivative of u with respect to y.
       
      +virtual double computeD2vDx2 (int i, int j) const
       Calculate second derivative of v with respect to x.
       
      +virtual double computeD2vDy2 (int i, int j) const
       Calculate second derivative of v with respect to y.
       
      +virtual double computeDpDx (int i, int j) const
       Calculate first derivative of p with respect to x.
       
      +virtual double computeDpDy (int i, int j) const
       Calculate first derivative of p with respect to y.
       
      - Public Member Functions inherited from StaggeredGrid
       StaggeredGrid (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
       Constructor.
       
      +const std::array< double, 2 > meshWidth () const
       Get the length of a single cell in x and y directions.
       
      +const std::array< int, 2 > nCells () const
       Get number of cells in x and y directions.
       
      +const FieldVariableu () const
       Get a reference to the field variable u.
       
      +const FieldVariablev () const
       Get a reference to the field variable v.
       
      +const FieldVariablep () const
       Get a reference to the field variable p.
       
      +const FieldVariablerhs () const
       Get a reference to the field variable rhs.
       
      +double u (int i, int j) const
       Access value of u in element (i,j), declared constant.
       
      +double & u (int i, int j)
       Access value of u in element (i,j)
       
      +double v (int i, int j) const
       Access value of v in element (i,j), declared constant.
       
      +double & v (int i, int j)
       Access value of v in element (i,j)
       
      +double p (int i, int j) const
       Access value of p in element (i,j), declared constant.
       
      +double & p (int i, int j)
       Access value of p in element (i,j)
       
      +double & f (int i, int j)
       Access value of f in element (i,j)
       
      +double & g (int i, int j)
       Access value of g in element (i,j)
       
      +double & rhs (int i, int j)
       Access value of rhs in element (i,j)
       
      +double dx () const
       Get the mesh width in x-direction.
       
      +double dy () const
       Get the mesh width in y-direction.
       
      +int uIBegin () const
       first valid index for u in x direction
       
      +int uIEnd () const
       one after last valid index for u in x direction
       
      +int uJBegin () const
       first valid index for u in y direction
       
      +int uJEnd () const
       one after last valid index for u in y direction
       
      +int vIBegin () const
       first valid index for v in x direction
       
      +int vIEnd () const
       one after last valid index for v in x direction
       
      +int vJBegin () const
       first valid index for v in y direction
       
      +int vJEnd () const
       one after last valid index for v in y direction
       
      +int pIBegin () const
       first valid index for p in x direction
       
      +int pIEnd () const
       one after last valid index for p in x direction
       
      +int pJBegin () const
       first valid index for p in y direction
       
      +int pJEnd () const
       one after last valid index for p in y direction
       
      +int fIBegin () const
       first valid index for f in x direction
       
      +int fIEnd () const
       one after last valid index for f in x direction
       
      +int fJBegin () const
       first valid index for f in y direction
       
      +int fJEnd () const
       one after last valid index for f in y direction
       
      +int gIBegin () const
       first valid index for g in x direction
       
      +int gIEnd () const
       one after last valid index for g in x direction
       
      +int gJBegin () const
       first valid index for g in y direction
       
      +int gJEnd () const
       one after last valid index for g in y direction
       
      +int rhsIBegin () const
       first valid index for rhs in x direction
       
      +int rhsIEnd () const
       one after last valid index for rhs in x direction
       
      +int rhsJBegin () const
       first valid index for rhs in y direction
       
      +int rhsJEnd () const
       one after last valid index for rhs in y direction
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Additional Inherited Members

      - Protected Attributes inherited from StaggeredGrid
      +const std::array< int, 2 > nCells_
       array containing number of cells in x and y directions
       
      +const std::array< double, 2 > meshWidth_
       array containing the sizes of cell edges in x and y directions
       
      +FieldVariable u_
       instance of the field variable u
       
      +FieldVariable v_
       instance of the field variable v
       
      +FieldVariable p_
       instance of the field variable p
       
      +FieldVariable f_
       instance of the field variable f
       
      +FieldVariable g_
       instance of the field variable g
       
      +FieldVariable rhs_
       instance of the field variable rhs
       
      +

      Detailed Description

      +

      Discretizes the problem using the central differences scheme.

      +

      Implements the first derivatives of u^2, v^2 and u*v according to the central differences scheme

      +

      Constructor & Destructor Documentation

      + +

      ◆ CentralDifferences()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      CentralDifferences::CentralDifferences (std::array< int, 2 > nCells,
      std::array< double, 2 > meshWidth 
      )
      +
      + +

      Constructor.

      +
      Parameters
      + + + +
      nCellsarray containing number of cells in x and y directions
      meshWidtharray containing the length of a single cell in x and y directions
      +
      +
      + +
      +
      +

      Member Function Documentation

      + +

      ◆ computeDu2Dx()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      double CentralDifferences::computeDu2Dx (int i,
      int j 
      ) const
      +
      +overridevirtual
      +
      + +

      Calculate first derivative of u^2 with respect to x with the central differences Scheme.

      + +

      Implements Discretization.

      + +
      +
      + +

      ◆ computeDuvDx()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      double CentralDifferences::computeDuvDx (int i,
      int j 
      ) const
      +
      +overridevirtual
      +
      + +

      Calculate first derivative of u*v with respect to x with the central differences Scheme.

      + +

      Implements Discretization.

      + +
      +
      + +

      ◆ computeDuvDy()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      double CentralDifferences::computeDuvDy (int i,
      int j 
      ) const
      +
      +overridevirtual
      +
      + +

      Calculate first derivative of u*v with respect to y with the central differences Scheme.

      + +

      Implements Discretization.

      + +
      +
      + +

      ◆ computeDv2Dy()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      double CentralDifferences::computeDv2Dy (int i,
      int j 
      ) const
      +
      +overridevirtual
      +
      + +

      Calculate first derivative of v^2 with respect to y with the central differences Scheme.

      + +

      Implements Discretization.

      + +
      +
      +
      The documentation for this class was generated from the following files:
        +
      • /home/jonat/Documents/01_Studium/NumSim/src/discretization/central_differences.h
      • +
      • /home/jonat/Documents/01_Studium/NumSim/src/discretization/central_differences.cpp
      • +
      +
      + + + + diff --git a/documentation/html/classCentralDifferences.png b/documentation/html/classCentralDifferences.png new file mode 100644 index 0000000000000000000000000000000000000000..047955ca06d1a3cca14ed0fcc1092b365f8bddea GIT binary patch literal 799 zcmeAS@N?(olHy`uVBq!ia0vp^666=m0OW&#In(Sb3=B-GJY5_^Dj46+&F(v_z|+$1 z*j4jiIA6|&r_p4s*NQFcj9R5Wu%~VMEq<@s-tmLV&mBG9lOBJKj@e$ftxe^9_I$Z% z&m63MCs(Wd=#ZX1@6yC8{_}U|+t%csooHsJSZ}MSyls9K>&ZtiuUdXOEcxxvu1?GI z!XaHU>L;CS<6r*P-L%@x+dOmaEU!%!zv|9Ko{M?9`$D*I)NjR;PU~x~+GO~ITuTwy zUb^44F0`q5PRhra{reBDJN{_e{80NJW@oP7tA1bSx#_~uc*aRJ{^mRN^SV{;U%vZ! zSyml;_Wyp5PmF(^*L}Zdug~x!gqy+Vg37y1XBhn-t-GQ5Ao5QA^Yq6|2bhiY7<#4` zGA8Wl;bwT88p9x=4-~DC6lXYgdIv*6Fp9UcW470R zj4yor?(oTE#%(XI-QU;uY{nGl#CNyezkSSSZks8*aDG=*`=kE4tNBHttityFD;G|> zt^en*mH3^-+g!6`e+g~hu+nQ;u=(phirc5Yj(J|gd;h_!@7q5Wf6IRR{O*BU=ktp_ zi?@iZ`^g~*)O9TPv!Ql+^Ko%3ETRWbw_)J*S)T}^{v+`+|GLbcAxrB#k + + + + + + +NumSim: Member List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      +
      Computation Member List
      +
      +
      + +

      This is the complete list of members for Computation, including all inherited members.

      + + + +
      initialize(int argc, char *argv[])Computation
      runSimulation()Computation
      + + + + diff --git a/documentation/html/classComputation.html b/documentation/html/classComputation.html new file mode 100644 index 00000000..eb082e75 --- /dev/null +++ b/documentation/html/classComputation.html @@ -0,0 +1,147 @@ + + + + + + + +NumSim: Computation Class Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      + +
      Computation Class Reference
      +
      +
      + +

      Computation of Simulation. + More...

      + +

      #include <computation.h>

      + + + + + + + + +

      +Public Member Functions

      void initialize (int argc, char *argv[])
       Initialize the simulation with settings from .txt file.
       
      +void runSimulation ()
       run the whole simulation until t_end
       
      +

      Detailed Description

      +

      Computation of Simulation.

      +

      Combines discretization, pressure solver and outputwriter

      +

      Member Function Documentation

      + +

      ◆ initialize()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void Computation::initialize (int argc,
      char * argv[] 
      )
      +
      + +

      Initialize the simulation with settings from .txt file.

      +
      Parameters
      + + + +
      argccounts of CLI commands
      argvvalues of CLI commands, expect settings.txt filename
      +
      +
      + +
      +
      +
      The documentation for this class was generated from the following files:
        +
      • /home/jonat/Documents/01_Studium/NumSim/src/computation.h
      • +
      • /home/jonat/Documents/01_Studium/NumSim/src/computation.cpp
      • +
      +
      + + + + diff --git a/documentation/html/classDiscretization-members.html b/documentation/html/classDiscretization-members.html new file mode 100644 index 00000000..6971d969 --- /dev/null +++ b/documentation/html/classDiscretization-members.html @@ -0,0 +1,147 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      +
      Discretization Member List
      +
      +
      + +

      This is the complete list of members for Discretization, including all inherited members.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      computeD2uDx2(int i, int j) constDiscretizationvirtual
      computeD2uDy2(int i, int j) constDiscretizationvirtual
      computeD2vDx2(int i, int j) constDiscretizationvirtual
      computeD2vDy2(int i, int j) constDiscretizationvirtual
      computeDpDx(int i, int j) constDiscretizationvirtual
      computeDpDy(int i, int j) constDiscretizationvirtual
      computeDu2Dx(int i, int j) const =0Discretizationpure virtual
      computeDuvDx(int i, int j) const =0Discretizationpure virtual
      computeDuvDy(int i, int j) const =0Discretizationpure virtual
      computeDv2Dy(int i, int j) const =0Discretizationpure virtual
      Discretization(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)Discretization
      dx() constStaggeredGrid
      dy() constStaggeredGrid
      f(int i, int j)StaggeredGrid
      f_StaggeredGridprotected
      fIBegin() constStaggeredGrid
      fIEnd() constStaggeredGrid
      fJBegin() constStaggeredGrid
      fJEnd() constStaggeredGrid
      g(int i, int j)StaggeredGrid
      g_StaggeredGridprotected
      gIBegin() constStaggeredGrid
      gIEnd() constStaggeredGrid
      gJBegin() constStaggeredGrid
      gJEnd() constStaggeredGrid
      meshWidth() constStaggeredGrid
      meshWidth_StaggeredGridprotected
      nCells() constStaggeredGrid
      nCells_StaggeredGridprotected
      p() constStaggeredGrid
      p(int i, int j) constStaggeredGrid
      p(int i, int j)StaggeredGrid
      p_StaggeredGridprotected
      pIBegin() constStaggeredGrid
      pIEnd() constStaggeredGrid
      pJBegin() constStaggeredGrid
      pJEnd() constStaggeredGrid
      rhs() constStaggeredGrid
      rhs(int i, int j)StaggeredGrid
      rhs_StaggeredGridprotected
      rhsIBegin() constStaggeredGrid
      rhsIEnd() constStaggeredGrid
      rhsJBegin() constStaggeredGrid
      rhsJEnd() constStaggeredGrid
      StaggeredGrid(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)StaggeredGrid
      u() constStaggeredGrid
      u(int i, int j) constStaggeredGrid
      u(int i, int j)StaggeredGrid
      u_StaggeredGridprotected
      uIBegin() constStaggeredGrid
      uIEnd() constStaggeredGrid
      uJBegin() constStaggeredGrid
      uJEnd() constStaggeredGrid
      v() constStaggeredGrid
      v(int i, int j) constStaggeredGrid
      v(int i, int j)StaggeredGrid
      v_StaggeredGridprotected
      vIBegin() constStaggeredGrid
      vIEnd() constStaggeredGrid
      vJBegin() constStaggeredGrid
      vJEnd() constStaggeredGrid
      + + + + diff --git a/documentation/html/classDiscretization.html b/documentation/html/classDiscretization.html new file mode 100644 index 00000000..e76e7937 --- /dev/null +++ b/documentation/html/classDiscretization.html @@ -0,0 +1,555 @@ + + + + + + + +NumSim: Discretization Class Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      + +
      Discretization Class Referenceabstract
      +
      +
      + +

      Computes derivatives included in governing equations. + More...

      + +

      #include <discretization.h>

      +
      +Inheritance diagram for Discretization:
      +
      +
      + + +StaggeredGrid +CentralDifferences +DonorCell + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Public Member Functions

       Discretization (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
       Constructor.
       
      virtual double computeDu2Dx (int i, int j) const =0
       Calculate first derivative of u^2 with respect to x.
       
      virtual double computeDv2Dy (int i, int j) const =0
       Calculate first derivative of v^2 with respect to y.
       
      virtual double computeDuvDx (int i, int j) const =0
       Calculate first derivative of u*v with respect to x.
       
      virtual double computeDuvDy (int i, int j) const =0
       Calculate first derivative of u*v with respect to y.
       
      +virtual double computeD2uDx2 (int i, int j) const
       Calculate second derivative of u with respect to x.
       
      +virtual double computeD2uDy2 (int i, int j) const
       Calculate second derivative of u with respect to y.
       
      +virtual double computeD2vDx2 (int i, int j) const
       Calculate second derivative of v with respect to x.
       
      +virtual double computeD2vDy2 (int i, int j) const
       Calculate second derivative of v with respect to y.
       
      +virtual double computeDpDx (int i, int j) const
       Calculate first derivative of p with respect to x.
       
      +virtual double computeDpDy (int i, int j) const
       Calculate first derivative of p with respect to y.
       
      - Public Member Functions inherited from StaggeredGrid
       StaggeredGrid (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
       Constructor.
       
      +const std::array< double, 2 > meshWidth () const
       Get the length of a single cell in x and y directions.
       
      +const std::array< int, 2 > nCells () const
       Get number of cells in x and y directions.
       
      +const FieldVariableu () const
       Get a reference to the field variable u.
       
      +const FieldVariablev () const
       Get a reference to the field variable v.
       
      +const FieldVariablep () const
       Get a reference to the field variable p.
       
      +const FieldVariablerhs () const
       Get a reference to the field variable rhs.
       
      +double u (int i, int j) const
       Access value of u in element (i,j), declared constant.
       
      +double & u (int i, int j)
       Access value of u in element (i,j)
       
      +double v (int i, int j) const
       Access value of v in element (i,j), declared constant.
       
      +double & v (int i, int j)
       Access value of v in element (i,j)
       
      +double p (int i, int j) const
       Access value of p in element (i,j), declared constant.
       
      +double & p (int i, int j)
       Access value of p in element (i,j)
       
      +double & f (int i, int j)
       Access value of f in element (i,j)
       
      +double & g (int i, int j)
       Access value of g in element (i,j)
       
      +double & rhs (int i, int j)
       Access value of rhs in element (i,j)
       
      +double dx () const
       Get the mesh width in x-direction.
       
      +double dy () const
       Get the mesh width in y-direction.
       
      +int uIBegin () const
       first valid index for u in x direction
       
      +int uIEnd () const
       one after last valid index for u in x direction
       
      +int uJBegin () const
       first valid index for u in y direction
       
      +int uJEnd () const
       one after last valid index for u in y direction
       
      +int vIBegin () const
       first valid index for v in x direction
       
      +int vIEnd () const
       one after last valid index for v in x direction
       
      +int vJBegin () const
       first valid index for v in y direction
       
      +int vJEnd () const
       one after last valid index for v in y direction
       
      +int pIBegin () const
       first valid index for p in x direction
       
      +int pIEnd () const
       one after last valid index for p in x direction
       
      +int pJBegin () const
       first valid index for p in y direction
       
      +int pJEnd () const
       one after last valid index for p in y direction
       
      +int fIBegin () const
       first valid index for f in x direction
       
      +int fIEnd () const
       one after last valid index for f in x direction
       
      +int fJBegin () const
       first valid index for f in y direction
       
      +int fJEnd () const
       one after last valid index for f in y direction
       
      +int gIBegin () const
       first valid index for g in x direction
       
      +int gIEnd () const
       one after last valid index for g in x direction
       
      +int gJBegin () const
       first valid index for g in y direction
       
      +int gJEnd () const
       one after last valid index for g in y direction
       
      +int rhsIBegin () const
       first valid index for rhs in x direction
       
      +int rhsIEnd () const
       one after last valid index for rhs in x direction
       
      +int rhsJBegin () const
       first valid index for rhs in y direction
       
      +int rhsJEnd () const
       one after last valid index for rhs in y direction
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Additional Inherited Members

      - Protected Attributes inherited from StaggeredGrid
      +const std::array< int, 2 > nCells_
       array containing number of cells in x and y directions
       
      +const std::array< double, 2 > meshWidth_
       array containing the sizes of cell edges in x and y directions
       
      +FieldVariable u_
       instance of the field variable u
       
      +FieldVariable v_
       instance of the field variable v
       
      +FieldVariable p_
       instance of the field variable p
       
      +FieldVariable f_
       instance of the field variable f
       
      +FieldVariable g_
       instance of the field variable g
       
      +FieldVariable rhs_
       instance of the field variable rhs
       
      +

      Detailed Description

      +

      Computes derivatives included in governing equations.

      +

      Interface for the discretization. Computes the needed derivatives to solve the Poisson and continuity equations.

      +

      Constructor & Destructor Documentation

      + +

      ◆ Discretization()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      Discretization::Discretization (std::array< int, 2 > nCells,
      std::array< double, 2 > meshWidth 
      )
      +
      + +

      Constructor.

      +
      Parameters
      + + + +
      nCellsarray containing number of cells in x and y directions
      meshWidtharray containing the length of a single cell in x and y directions
      +
      +
      + +
      +
      +

      Member Function Documentation

      + +

      ◆ computeDu2Dx()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      virtual double Discretization::computeDu2Dx (int i,
      int j 
      ) const
      +
      +pure virtual
      +
      + +

      Calculate first derivative of u^2 with respect to x.

      + +

      Implemented in CentralDifferences, and DonorCell.

      + +
      +
      + +

      ◆ computeDuvDx()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      virtual double Discretization::computeDuvDx (int i,
      int j 
      ) const
      +
      +pure virtual
      +
      + +

      Calculate first derivative of u*v with respect to x.

      + +

      Implemented in CentralDifferences, and DonorCell.

      + +
      +
      + +

      ◆ computeDuvDy()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      virtual double Discretization::computeDuvDy (int i,
      int j 
      ) const
      +
      +pure virtual
      +
      + +

      Calculate first derivative of u*v with respect to y.

      + +

      Implemented in CentralDifferences, and DonorCell.

      + +
      +
      + +

      ◆ computeDv2Dy()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      virtual double Discretization::computeDv2Dy (int i,
      int j 
      ) const
      +
      +pure virtual
      +
      + +

      Calculate first derivative of v^2 with respect to y.

      + +

      Implemented in CentralDifferences, and DonorCell.

      + +
      +
      +
      The documentation for this class was generated from the following files:
        +
      • /home/jonat/Documents/01_Studium/NumSim/src/discretization/discretization.h
      • +
      • /home/jonat/Documents/01_Studium/NumSim/src/discretization/discretization.cpp
      • +
      +
      + + + + diff --git a/documentation/html/classDiscretization.png b/documentation/html/classDiscretization.png new file mode 100644 index 0000000000000000000000000000000000000000..d491366f744153de2fc8baf4dd88ade26458eea9 GIT binary patch literal 1039 zcmeAS@N?(olHy`uVBq!ia0vp^KY+M{gBeKv)x8GdNC)_Yxc>kDAIN<1=4)yHq2(3^ zngtTm&%8Kr-~doOc+%w+KsnBmAirP+ARi3OnPy*MU|^o*>Eakt!T5IW>!LLZ0&KVY zwYtC8KYD!E@n%XsyNS=KI1Z*uMm_b6c1kS*S_}cx6+Dj?7B*Pz*r6hN_$cG63BvE& z_HUf9k9tg{IPS}k6rbr@2yuf*w**;W4him zzv|1E%2(J|32qm-zwWKB&R5-a{l2g5`F=Yj$a0HG6Nbsj~+<=g)kQr(oj7hvFVjc_)tipn68fNnOcDRaaW*>3IS*0wbYG;$z;A$xB+CPk(rSBR5O7 z{#aDn6qUbcxF6kSR(&a$IlnM;(ii64Kh%^n_ZvN0R#`NC$@EHBo81PU&#b;wy58xT zbuV`Nn`b7+qi(0qncco^X)Q0)<>E{$k^CYnQRd#>wQ{Vc3$K&^DU*(r?kNo>G;QukndW+4TFLpln z2%2`L{Eo|7PuXBL`?}+A9dFFfKVGlAI{*HQKWBa(-LIhMd9=bYX41a?Ztoz+m^;7# rQ2+bP0l+XkKjGpu- literal 0 HcmV?d00001 diff --git a/documentation/html/classDonorCell-members.html b/documentation/html/classDonorCell-members.html new file mode 100644 index 00000000..01049bd1 --- /dev/null +++ b/documentation/html/classDonorCell-members.html @@ -0,0 +1,148 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      +
      DonorCell Member List
      +
      +
      + +

      This is the complete list of members for DonorCell, including all inherited members.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      computeD2uDx2(int i, int j) constDiscretizationvirtual
      computeD2uDy2(int i, int j) constDiscretizationvirtual
      computeD2vDx2(int i, int j) constDiscretizationvirtual
      computeD2vDy2(int i, int j) constDiscretizationvirtual
      computeDpDx(int i, int j) constDiscretizationvirtual
      computeDpDy(int i, int j) constDiscretizationvirtual
      computeDu2Dx(int i, int j) const overrideDonorCellvirtual
      computeDuvDx(int i, int j) const overrideDonorCellvirtual
      computeDuvDy(int i, int j) const overrideDonorCellvirtual
      computeDv2Dy(int i, int j) const overrideDonorCellvirtual
      Discretization(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)Discretization
      DonorCell(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth, double alpha)DonorCell
      dx() constStaggeredGrid
      dy() constStaggeredGrid
      f(int i, int j)StaggeredGrid
      f_StaggeredGridprotected
      fIBegin() constStaggeredGrid
      fIEnd() constStaggeredGrid
      fJBegin() constStaggeredGrid
      fJEnd() constStaggeredGrid
      g(int i, int j)StaggeredGrid
      g_StaggeredGridprotected
      gIBegin() constStaggeredGrid
      gIEnd() constStaggeredGrid
      gJBegin() constStaggeredGrid
      gJEnd() constStaggeredGrid
      meshWidth() constStaggeredGrid
      meshWidth_StaggeredGridprotected
      nCells() constStaggeredGrid
      nCells_StaggeredGridprotected
      p() constStaggeredGrid
      p(int i, int j) constStaggeredGrid
      p(int i, int j)StaggeredGrid
      p_StaggeredGridprotected
      pIBegin() constStaggeredGrid
      pIEnd() constStaggeredGrid
      pJBegin() constStaggeredGrid
      pJEnd() constStaggeredGrid
      rhs() constStaggeredGrid
      rhs(int i, int j)StaggeredGrid
      rhs_StaggeredGridprotected
      rhsIBegin() constStaggeredGrid
      rhsIEnd() constStaggeredGrid
      rhsJBegin() constStaggeredGrid
      rhsJEnd() constStaggeredGrid
      StaggeredGrid(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)StaggeredGrid
      u() constStaggeredGrid
      u(int i, int j) constStaggeredGrid
      u(int i, int j)StaggeredGrid
      u_StaggeredGridprotected
      uIBegin() constStaggeredGrid
      uIEnd() constStaggeredGrid
      uJBegin() constStaggeredGrid
      uJEnd() constStaggeredGrid
      v() constStaggeredGrid
      v(int i, int j) constStaggeredGrid
      v(int i, int j)StaggeredGrid
      v_StaggeredGridprotected
      vIBegin() constStaggeredGrid
      vIEnd() constStaggeredGrid
      vJBegin() constStaggeredGrid
      vJEnd() constStaggeredGrid
      + + + + diff --git a/documentation/html/classDonorCell.html b/documentation/html/classDonorCell.html new file mode 100644 index 00000000..1f68fdb8 --- /dev/null +++ b/documentation/html/classDonorCell.html @@ -0,0 +1,565 @@ + + + + + + + +NumSim: DonorCell Class Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      + +
      DonorCell Class Reference
      +
      +
      + +

      Discretizes the problem using the donor cell scheme. + More...

      + +

      #include <donor_cell.h>

      +
      +Inheritance diagram for DonorCell:
      +
      +
      + + +Discretization +StaggeredGrid + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Public Member Functions

       DonorCell (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth, double alpha)
       Constructor.
       
      double computeDu2Dx (int i, int j) const override
       Calculate first derivative of u^2 with respect to x with the donor cell Scheme.
       
      double computeDv2Dy (int i, int j) const override
       Calculate first derivative of v^2 with respect to y with the donor cell Scheme.
       
      double computeDuvDx (int i, int j) const override
       Calculate first derivative of u*v with respect to x with the donor cell Scheme.
       
      double computeDuvDy (int i, int j) const override
       Calculate first derivative of u*v with respect to y with the donor cell Scheme.
       
      - Public Member Functions inherited from Discretization
       Discretization (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
       Constructor.
       
      +virtual double computeD2uDx2 (int i, int j) const
       Calculate second derivative of u with respect to x.
       
      +virtual double computeD2uDy2 (int i, int j) const
       Calculate second derivative of u with respect to y.
       
      +virtual double computeD2vDx2 (int i, int j) const
       Calculate second derivative of v with respect to x.
       
      +virtual double computeD2vDy2 (int i, int j) const
       Calculate second derivative of v with respect to y.
       
      +virtual double computeDpDx (int i, int j) const
       Calculate first derivative of p with respect to x.
       
      +virtual double computeDpDy (int i, int j) const
       Calculate first derivative of p with respect to y.
       
      - Public Member Functions inherited from StaggeredGrid
       StaggeredGrid (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
       Constructor.
       
      +const std::array< double, 2 > meshWidth () const
       Get the length of a single cell in x and y directions.
       
      +const std::array< int, 2 > nCells () const
       Get number of cells in x and y directions.
       
      +const FieldVariableu () const
       Get a reference to the field variable u.
       
      +const FieldVariablev () const
       Get a reference to the field variable v.
       
      +const FieldVariablep () const
       Get a reference to the field variable p.
       
      +const FieldVariablerhs () const
       Get a reference to the field variable rhs.
       
      +double u (int i, int j) const
       Access value of u in element (i,j), declared constant.
       
      +double & u (int i, int j)
       Access value of u in element (i,j)
       
      +double v (int i, int j) const
       Access value of v in element (i,j), declared constant.
       
      +double & v (int i, int j)
       Access value of v in element (i,j)
       
      +double p (int i, int j) const
       Access value of p in element (i,j), declared constant.
       
      +double & p (int i, int j)
       Access value of p in element (i,j)
       
      +double & f (int i, int j)
       Access value of f in element (i,j)
       
      +double & g (int i, int j)
       Access value of g in element (i,j)
       
      +double & rhs (int i, int j)
       Access value of rhs in element (i,j)
       
      +double dx () const
       Get the mesh width in x-direction.
       
      +double dy () const
       Get the mesh width in y-direction.
       
      +int uIBegin () const
       first valid index for u in x direction
       
      +int uIEnd () const
       one after last valid index for u in x direction
       
      +int uJBegin () const
       first valid index for u in y direction
       
      +int uJEnd () const
       one after last valid index for u in y direction
       
      +int vIBegin () const
       first valid index for v in x direction
       
      +int vIEnd () const
       one after last valid index for v in x direction
       
      +int vJBegin () const
       first valid index for v in y direction
       
      +int vJEnd () const
       one after last valid index for v in y direction
       
      +int pIBegin () const
       first valid index for p in x direction
       
      +int pIEnd () const
       one after last valid index for p in x direction
       
      +int pJBegin () const
       first valid index for p in y direction
       
      +int pJEnd () const
       one after last valid index for p in y direction
       
      +int fIBegin () const
       first valid index for f in x direction
       
      +int fIEnd () const
       one after last valid index for f in x direction
       
      +int fJBegin () const
       first valid index for f in y direction
       
      +int fJEnd () const
       one after last valid index for f in y direction
       
      +int gIBegin () const
       first valid index for g in x direction
       
      +int gIEnd () const
       one after last valid index for g in x direction
       
      +int gJBegin () const
       first valid index for g in y direction
       
      +int gJEnd () const
       one after last valid index for g in y direction
       
      +int rhsIBegin () const
       first valid index for rhs in x direction
       
      +int rhsIEnd () const
       one after last valid index for rhs in x direction
       
      +int rhsJBegin () const
       first valid index for rhs in y direction
       
      +int rhsJEnd () const
       one after last valid index for rhs in y direction
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Additional Inherited Members

      - Protected Attributes inherited from StaggeredGrid
      +const std::array< int, 2 > nCells_
       array containing number of cells in x and y directions
       
      +const std::array< double, 2 > meshWidth_
       array containing the sizes of cell edges in x and y directions
       
      +FieldVariable u_
       instance of the field variable u
       
      +FieldVariable v_
       instance of the field variable v
       
      +FieldVariable p_
       instance of the field variable p
       
      +FieldVariable f_
       instance of the field variable f
       
      +FieldVariable g_
       instance of the field variable g
       
      +FieldVariable rhs_
       instance of the field variable rhs
       
      +

      Detailed Description

      +

      Discretizes the problem using the donor cell scheme.

      +

      Implements the first derivatives of u^2, v^2 and u*v according to the donor cell scheme

      +

      Constructor & Destructor Documentation

      + +

      ◆ DonorCell()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      DonorCell::DonorCell (std::array< int, 2 > nCells,
      std::array< double, 2 > meshWidth,
      double alpha 
      )
      +
      + +

      Constructor.

      +
      Parameters
      + + + + +
      nCellsarray containing number of cells in x and y directions
      meshWidtharray containing the length of a single cell in x and y directions
      alphaweight factor between central differences and donor cell schemes
      +
      +
      + +
      +
      +

      Member Function Documentation

      + +

      ◆ computeDu2Dx()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      double DonorCell::computeDu2Dx (int i,
      int j 
      ) const
      +
      +overridevirtual
      +
      + +

      Calculate first derivative of u^2 with respect to x with the donor cell Scheme.

      + +

      Implements Discretization.

      + +
      +
      + +

      ◆ computeDuvDx()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      double DonorCell::computeDuvDx (int i,
      int j 
      ) const
      +
      +overridevirtual
      +
      + +

      Calculate first derivative of u*v with respect to x with the donor cell Scheme.

      + +

      Implements Discretization.

      + +
      +
      + +

      ◆ computeDuvDy()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      double DonorCell::computeDuvDy (int i,
      int j 
      ) const
      +
      +overridevirtual
      +
      + +

      Calculate first derivative of u*v with respect to y with the donor cell Scheme.

      + +

      Implements Discretization.

      + +
      +
      + +

      ◆ computeDv2Dy()

      + +
      +
      + + + + + +
      + + + + + + + + + + + + + + + + + + +
      double DonorCell::computeDv2Dy (int i,
      int j 
      ) const
      +
      +overridevirtual
      +
      + +

      Calculate first derivative of v^2 with respect to y with the donor cell Scheme.

      + +

      Implements Discretization.

      + +
      +
      +
      The documentation for this class was generated from the following files:
        +
      • /home/jonat/Documents/01_Studium/NumSim/src/discretization/donor_cell.h
      • +
      • /home/jonat/Documents/01_Studium/NumSim/src/discretization/donor_cell.cpp
      • +
      +
      + + + + diff --git a/documentation/html/classDonorCell.png b/documentation/html/classDonorCell.png new file mode 100644 index 0000000000000000000000000000000000000000..20dde334a1660559f4a7d4aaf585c66f6d93b870 GIT binary patch literal 690 zcmeAS@N?(olHy`uVBq!ia0vp^aX{R`!3-oLv)AMSDd_;85ZC|z{{xvX-h3_XKeXJ! zK(jz%`k5C84jcfA2T!`Z0w~8>666=m0OW&#In(Sb3=B-Ro-U3d6^w7^zAaj9z{A?# zpDwZYzi|8k`4b5jCxz{tymFF`*|t45oZjX?nX_5`gvv|T7oL|M2l0_U;YyMK53usUYl=g?wbecM+b*(UzT-_vAtqI?uw@i0sdaq~nD(smb zzxLc;g}`1n^V+psdqd6%)?8g39{*b_;akM(tA5+>1{uuzkp3(39ec0Uh0>a+?^_ML z&a5d4*&pW7dwqTVtm;WJ68}9sK1rJY%2xCIBw4=uy=KKtx&IS9FFktv)$;ipHU^tS zMh5$uucsfq`hInNng9OH{|;-be_==vtYR?Wuw{^Fkz?R-;%8u6$j;Dwfw|$}{Y%f0 zyw>|`OYJv4PpLJ<&tIOr5b}TOtr`0xi!N^8d!=~GEqlBAc;v5t zug|agJFoL|z;4N)(#7G&-}PHQyK-fP{HD_Ra~$J^j3mBXF#a1LkkxDEGr4&EeBGUD z&rjTC-n;I1@Kc$oh3n?*4JmmVQ8npLs+0dDwuS1R%=NYBEO#?9_(w1t;E(^iX~(bH zudDA~e!u4bhf|!k3=wE$(N>gPdi-=w2s+b9b>7awBPxKs|$~lzEaYI_5PZw=KmP;B$HTk Tq?ZW;Qx}7$tDnm{r-UW|1!Yj+ literal 0 HcmV?d00001 diff --git a/documentation/html/classFieldVariable-members.html b/documentation/html/classFieldVariable-members.html new file mode 100644 index 00000000..a9dcfae0 --- /dev/null +++ b/documentation/html/classFieldVariable-members.html @@ -0,0 +1,95 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      +
      FieldVariable Member List
      +
      +
      + +

      This is the complete list of members for FieldVariable, including all inherited members.

      + + + + + + + + + + +
      Array2D(std::array< int, 2 > size)Array2D
      data_Array2Dprotected
      FieldVariable(std::array< int, 2 > size, std::array< double, 2 > origin, std::array< double, 2 > meshWidth)FieldVariable
      findAbsMax() constFieldVariable
      interpolateAt(double x, double y) constFieldVariable
      operator()(int i, int j)Array2D
      operator()(int i, int j) constArray2D
      size() constArray2D
      size_Array2Dprotected
      + + + + diff --git a/documentation/html/classFieldVariable.html b/documentation/html/classFieldVariable.html new file mode 100644 index 00000000..fcefd336 --- /dev/null +++ b/documentation/html/classFieldVariable.html @@ -0,0 +1,250 @@ + + + + + + + +NumSim: FieldVariable Class Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      + +
      FieldVariable Class Reference
      +
      +
      + +

      Discretization of a scalar function. + More...

      + +

      #include <field_variable.h>

      +
      +Inheritance diagram for FieldVariable:
      +
      +
      + + +Array2D + +
      + + + + + + + + + + + + + + + + + + + + + + + + +

      +Public Member Functions

       FieldVariable (std::array< int, 2 > size, std::array< double, 2 > origin, std::array< double, 2 > meshWidth)
       Constructor.
       
      double interpolateAt (double x, double y) const
       Interpolates value of field variable in domain using x and y coordinates.
       
      double findAbsMax () const
       Find point in Array2D of Fieldvariable with maximum value.
       
      - Public Member Functions inherited from Array2D
       Array2D (std::array< int, 2 > size)
       constructor.
       
      double & operator() (int i, int j)
       set array value. Overloads the () operator
       
      double operator() (int i, int j) const
       get array value. Overloads the () operator
       
      +std::array< int, 2 > size () const
       get size of array in x and y direction
       
      + + + + + + + + +

      +Additional Inherited Members

      - Protected Attributes inherited from Array2D
      +const std::array< int, 2 > size_
       size of array in x and y direction
       
      +std::vector< double > data_
       storage array values, in row-major order
       
      +

      Detailed Description

      +

      Discretization of a scalar function.

      +

      A field variable is the discretization of a scalar function f(x) with x in the computational domain. More specifically, a scalar value is stored at discrete nodes/points. The nodes are arranged in an equidistant mesh with specified mesh width.

      +

      Constructor & Destructor Documentation

      + +

      ◆ FieldVariable()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      FieldVariable::FieldVariable (std::array< int, 2 > size,
      std::array< double, 2 > origin,
      std::array< double, 2 > meshWidth 
      )
      +
      + +

      Constructor.

      +
      Parameters
      + + + + +
      sizenumber of cells in x and y direction
      originorgin of Fieldvariable relative to domain origin
      meshwidthmesh width in x and y direction
      +
      +
      + +
      +
      +

      Member Function Documentation

      + +

      ◆ findAbsMax()

      + +
      +
      + + + + + + + +
      double FieldVariable::findAbsMax () const
      +
      + +

      Find point in Array2D of Fieldvariable with maximum value.

      +

      Finds maximum by iterating through all values in FielVariable

      + +
      +
      + +

      ◆ interpolateAt()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      double FieldVariable::interpolateAt (double x,
      double y 
      ) const
      +
      + +

      Interpolates value of field variable in domain using x and y coordinates.

      +

      Interpolates by using bilinear interpolation.

      +
      Parameters
      + + + +
      xx postion of point to interpolate
      yy postion of point to interpolate
      +
      +
      + +
      +
      +
      The documentation for this class was generated from the following files:
        +
      • /home/jonat/Documents/01_Studium/NumSim/src/storage/field_variable.h
      • +
      • /home/jonat/Documents/01_Studium/NumSim/src/storage/field_variable.cpp
      • +
      +
      + + + + diff --git a/documentation/html/classFieldVariable.png b/documentation/html/classFieldVariable.png new file mode 100644 index 0000000000000000000000000000000000000000..39c18d0f1b691be9faa9372616fc41ecf7fc3d45 GIT binary patch literal 454 zcmV;%0XhDOP)vTJr#LVva2S`&=)l0h|Ns9}lGCUF000SeQchC<|NsC0|NsC0Hv*f~0003| zNkl`s*4$)%wb>B7(iI9gc13fh$(Z#%W@grP^X7aT{E)j0e#-T~%?}5M z5Q2dK;ITFUu#gpa+l2w3u5@+C7jHTzR6pn?SjsnhE`AZ^l zQdvGyx{0&L3b?QMe6QwTRa}m-T5$N>xKwT%a9*ES(bZDG!w%FPE_vKGh60{@JnM>@ wo+jERh@VMUh={yX4tB7JNH0q;5s`tu0C3Dm#*)<23jhEB07*qoM6N<$g7tvVw*UYD literal 0 HcmV?d00001 diff --git a/documentation/html/classFluidTracer-members.html b/documentation/html/classFluidTracer-members.html new file mode 100644 index 00000000..38b6a622 --- /dev/null +++ b/documentation/html/classFluidTracer-members.html @@ -0,0 +1,99 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      +
      FluidTracer Member List
      +
      +
      + +

      This is the complete list of members for FluidTracer, including all inherited members.

      + + + + + + + + + + + + + + +
      cellOfParticle(int i) (defined in FluidTracer)FluidTracer
      createParticles(double positionSourceX, double positionSourceY)FluidTracer
      FluidTracer(int numParticlesperCell, std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask) (defined in FluidTracer)FluidTracer
      FluidTracer(std::vector< double > x, std::vector< double > y, std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask) (defined in FluidTracer)FluidTracer
      getNumberOfParticles() constFluidTracer
      getNumberOfParticles(int i, int j) constFluidTracer
      getParticlePosition(int i) constFluidTracer
      moveParticles(double dt)FluidTracer
      moveParticles(double dt, std::array< double, 2 > vel) (defined in FluidTracer)FluidTracer
      printParticles() (defined in FluidTracer)FluidTracer
      updateParticle(int i, std::array< int, 2 > idx, double dt, std::array< double, 2 > vel, int depth) (defined in FluidTracer)FluidTracer
      val2CellX(double xVal) (defined in FluidTracer)FluidTracer
      val2CellY(double yVal) (defined in FluidTracer)FluidTracer
      + + + + diff --git a/documentation/html/classFluidTracer.html b/documentation/html/classFluidTracer.html new file mode 100644 index 00000000..49aafc60 --- /dev/null +++ b/documentation/html/classFluidTracer.html @@ -0,0 +1,264 @@ + + + + + + + +NumSim: FluidTracer Class Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      + +
      FluidTracer Class Reference
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Public Member Functions

      FluidTracer (int numParticlesperCell, std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask)
       
      FluidTracer (std::vector< double > x, std::vector< double > y, std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask)
       
      void moveParticles (double dt)
       Update the position of the particles according to the velocity field and sets mask accordingly.
       
      void createParticles (double positionSourceX, double positionSourceY)
       can be used to create a source cell for particles
       
      int getNumberOfParticles () const
       Total number of Particles.
       
      int getNumberOfParticles (int i, int j) const
       Particles of specified cell.
       
      std::array< double, 2 > getParticlePosition (int i) const
       Get the Particle Position, index starts at 0.
       
      +std::array< int, 2 > cellOfParticle (int i)
       
      +int val2CellX (double xVal)
       
      +int val2CellY (double yVal)
       
      +std::array< double, 2 > updateParticle (int i, std::array< int, 2 > idx, double dt, std::array< double, 2 > vel, int depth)
       
      +std::array< double, 2 > moveParticles (double dt, std::array< double, 2 > vel)
       
      +void printParticles ()
       
      +

      Member Function Documentation

      + +

      ◆ createParticles()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      void FluidTracer::createParticles (double positionSourceX,
      double positionSourceY 
      )
      +
      + +

      can be used to create a source cell for particles

      +

      fills the cell homogenously with particles by cell

      + +
      +
      + +

      ◆ getNumberOfParticles() [1/2]

      + +
      +
      + + + + + + + +
      int FluidTracer::getNumberOfParticles () const
      +
      + +

      Total number of Particles.

      +
      Returns
      int
      + +
      +
      + +

      ◆ getNumberOfParticles() [2/2]

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      int FluidTracer::getNumberOfParticles (int i,
      int j 
      ) const
      +
      + +

      Particles of specified cell.

      +

      uses mask Grid

      + +
      +
      + +

      ◆ getParticlePosition()

      + +
      +
      + + + + + + + + +
      std::array< double, 2 > FluidTracer::getParticlePosition (int i) const
      +
      + +

      Get the Particle Position, index starts at 0.

      +
      Returns
      std::array<double, 2>
      + +
      +
      + +

      ◆ moveParticles()

      + +
      +
      + + + + + + + + +
      void FluidTracer::moveParticles (double dt)
      +
      + +

      Update the position of the particles according to the velocity field and sets mask accordingly.

      +

      get the velocity field $u$ and $v$ Checks for collision with border or obstacle and reflects the particle at this position Update the mask where there are new Air or Fluid cells

      +
      Parameters
      + + +
      dt
      +
      +
      + +
      +
      +
      The documentation for this class was generated from the following files:
        +
      • /home/jonat/Documents/01_Studium/NumSim/src/surface/fluid_tracer.h
      • +
      • /home/jonat/Documents/01_Studium/NumSim/src/surface/fluid_tracer.cpp
      • +
      +
      + + + + diff --git a/documentation/html/classGaussSeidel-members.html b/documentation/html/classGaussSeidel-members.html new file mode 100644 index 00000000..ece7c0c4 --- /dev/null +++ b/documentation/html/classGaussSeidel-members.html @@ -0,0 +1,101 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      +
      GaussSeidel Member List
      +
      +
      + +

      This is the complete list of members for GaussSeidel, including all inherited members.

      + + + + + + + + + + + + + + + + +
      boundary_PressureSolverprotected
      calculateResiduum()PressureSolverprotected
      discretization_PressureSolverprotected
      dx2 (defined in PressureSolver)PressureSolver
      dy2PressureSolver
      epsilon_PressureSolverprotected
      GaussSeidel(const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)GaussSeidel
      i_begPressureSolverprotected
      i_endPressureSolverprotected
      j_begPressureSolverprotected
      j_endPressureSolverprotected
      maximumNumberOfIterations_PressureSolverprotected
      PressureSolver(std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)PressureSolver
      setBoundaryValues()PressureSolverprotected
      solve() overrideGaussSeidelvirtual
      + + + + diff --git a/documentation/html/classGaussSeidel.html b/documentation/html/classGaussSeidel.html new file mode 100644 index 00000000..57198a55 --- /dev/null +++ b/documentation/html/classGaussSeidel.html @@ -0,0 +1,253 @@ + + + + + + + +NumSim: GaussSeidel Class Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      + +
      GaussSeidel Class Reference
      +
      +
      + +

      Standard Gauss-Seidel solver. + More...

      + +

      #include <gauss_seidel.h>

      +
      +Inheritance diagram for GaussSeidel:
      +
      +
      + + +PressureSolver + +
      + + + + + + + + + + + + +

      +Public Member Functions

       GaussSeidel (const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
       Constructor.
       
      void solve () override
       override function that starts solver.
       
      - Public Member Functions inherited from PressureSolver
       PressureSolver (std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
       Constructor.
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Additional Inherited Members

      - Public Attributes inherited from PressureSolver
      +double dx2
       
      +double dy2
       squared mesh widths
       
      - Protected Member Functions inherited from PressureSolver
      void setBoundaryValues ()
       Set the Boundary Values.
       
      +double calculateResiduum ()
       calculate residuum of current time step
       
      - Protected Attributes inherited from PressureSolver
      +int i_beg
       begin of loop for rhs in x direction
       
      +int i_end
       end of loop for rhs in x direction
       
      +int j_beg
       begin of loop for rhs in y direction
       
      +int j_end
       end of loop for rhs in y direction
       
      +std::shared_ptr< Discretizationdiscretization_
       object holding the needed field variables for rhs and p
       
      +std::shared_ptr< Boundaryboundary_
       object managing boundary for obstacle and surface tension
       
      +double epsilon_
       tolerance for the solver
       
      +int maximumNumberOfIterations_
       maximum number of iterations
       
      +

      Detailed Description

      +

      Standard Gauss-Seidel solver.

      +

      Constructor & Destructor Documentation

      + +

      ◆ GaussSeidel()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      GaussSeidel::GaussSeidel (const std::shared_ptr< Discretization > & data,
      double epsilon,
      int maximumNumberOfIterations,
      std::shared_ptr< Boundaryboundary 
      )
      +
      + +

      Constructor.

      +
      Parameters
      + + + + +
      datainstance of Discretization holding the needed field variables for rhs and p
      epsilontolerance for the solver
      maximumNumberOfIterationsmaximum of iteration
      +
      +
      + +
      +
      +

      Member Function Documentation

      + +

      ◆ solve()

      + +
      +
      + + + + + +
      + + + + + + + +
      void GaussSeidel::solve ()
      +
      +overridevirtual
      +
      + +

      override function that starts solver.

      + +

      Implements PressureSolver.

      + +
      +
      +
      The documentation for this class was generated from the following files:
        +
      • /home/jonat/Documents/01_Studium/NumSim/src/solver/gauss_seidel.h
      • +
      • /home/jonat/Documents/01_Studium/NumSim/src/solver/gauss_seidel.cpp
      • +
      +
      + + + + diff --git a/documentation/html/classGaussSeidel.png b/documentation/html/classGaussSeidel.png new file mode 100644 index 0000000000000000000000000000000000000000..9e4343d96a3cf9222d8ea21fcd5152dba5a1bd44 GIT binary patch literal 502 zcmVvTJr#LVva2S`&=)l0h|Ns9}lGCUF000SeQchC<|NsC0|NsC0Hv*f~0004j zNklO-DKSIBE0NqV`EGZ5RZImPB$Ri?|T<*}G@V73e()of%t{B+KtcYE*n zOq#Uo8l>^4ev<>puv~RFxdNkd^-bcJ?!sR~+-bV(^7Ov(BgD1BbBK|CIM4vn_Rl-W zpu4tf2`tm)-gk6!yz9SK6P^@Aim zSMSJQ>l+_EfZSiaq>LSBAdUB)ZqZ}u{n0xt-@5ttkZiBFGBVIjbzVtzj3K4uKCsz? zha9}`cal*xuq{{N7stMO4GBW}?EFlV@nH+W?&=F%)2(?QkLygi9w)M&%p=;DYyX}6 sxVt3jm$e|06xM=BQdn0(%*-b13+#APiE!I&tN;K207*qoM6N<$f|&&HtN;K2 literal 0 HcmV?d00001 diff --git a/documentation/html/classMask-members.html b/documentation/html/classMask-members.html new file mode 100644 index 00000000..7210cd32 --- /dev/null +++ b/documentation/html/classMask-members.html @@ -0,0 +1,148 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      +
      Mask Member List
      +
      +
      + +

      This is the complete list of members for Mask, including all inherited members.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      AIR enum value (defined in Mask)Mask
      boundary_listMaskprotected
      CellType enum nameMask
      createMaskFromPNGBitMap()Mask
      data_Maskprotected
      DOMAIN_BOTTOM_NOSLIP enum value (defined in Mask)Mask
      DOMAIN_BOTTOM_PRESSURE enum value (defined in Mask)Mask
      DOMAIN_BOUNDARY enum value (defined in Mask)Mask
      DOMAIN_LEFT_NOSLIP enum value (defined in Mask)Mask
      DOMAIN_LEFT_PRESSURE enum value (defined in Mask)Mask
      DOMAIN_RIGHT_NOSLIP enum value (defined in Mask)Mask
      DOMAIN_RIGHT_PRESSURE enum value (defined in Mask)Mask
      DOMAIN_TOP_NOSLIP enum value (defined in Mask)Mask
      DOMAIN_TOP_PRESSURE enum value (defined in Mask)Mask
      FLUID enum value (defined in Mask)Mask
      FLUID_BORDER_BOTTOM enum value (defined in Mask)Mask
      FLUID_BORDER_LEFT enum value (defined in Mask)Mask
      FLUID_BORDER_RIGHT enum value (defined in Mask)Mask
      FLUID_BORDER_TOP enum value (defined in Mask)Mask
      FLUID_COLUMN_HORIZONTAL enum value (defined in Mask)Mask
      FLUID_COLUMN_VERTICAL enum value (defined in Mask)Mask
      FLUID_CORNER_BOTTOM_LEFT enum value (defined in Mask)Mask
      FLUID_CORNER_BOTTOM_RIGHT enum value (defined in Mask)Mask
      FLUID_CORNER_TOP_LEFT enum value (defined in Mask)Mask
      FLUID_CORNER_TOP_RIGHT enum value (defined in Mask)Mask
      FLUID_DROPLET enum value (defined in Mask)Mask
      FLUID_SINGLE_BOTTOM enum value (defined in Mask)Mask
      FLUID_SINGLE_LEFT enum value (defined in Mask)Mask
      FLUID_SINGLE_RIGHT enum value (defined in Mask)Mask
      FLUID_SINGLE_TOP enum value (defined in Mask)Mask
      FLUID_TYPE enum value (defined in Mask)Mask
      forbiddenObstacleFluidCombinationsMaskprotected
      getNumberOfFluidCells() constMask
      isAir(int i, int j) constMask
      isDomainBoundary(int i, int j) constMask
      isFluid(int i, int j) constMask
      isFluidBoundary(int i, int j) constMask
      isInnerFluid(int i, int j) constMask
      isObstacle(int i, int j) constMask
      isObstacleBoundary(int i, int j) constMask
      makeRectangularObstacle()Mask
      Mask(Settings settings)Mask
      OBSTACLE enum value (defined in Mask)Mask
      OBSTACLE_BORDER_BOTTOM enum value (defined in Mask)Mask
      OBSTACLE_BORDER_LEFT enum value (defined in Mask)Mask
      OBSTACLE_BORDER_RIGHT enum value (defined in Mask)Mask
      OBSTACLE_BORDER_TOP enum value (defined in Mask)Mask
      OBSTACLE_CORNER_BOTTOM_LEFT enum value (defined in Mask)Mask
      OBSTACLE_CORNER_BOTTOM_RIGHT enum value (defined in Mask)Mask
      OBSTACLE_CORNER_TOP_LEFT enum value (defined in Mask)Mask
      OBSTACLE_CORNER_TOP_RIGHT enum value (defined in Mask)Mask
      OBSTACLE_INSIDE enum value (defined in Mask)Mask
      operator()(int i, int j)Mask
      operator()(int i, int j) constMask
      printMask() constMask
      resetMask()Mask
      setDomainBC()Mask
      setFluidBC()Mask
      setObstacleBC()Mask
      settings_Maskprotected
      size() constMask
      size_Maskprotected
      + + + + diff --git a/documentation/html/classMask.html b/documentation/html/classMask.html new file mode 100644 index 00000000..efa2e348 --- /dev/null +++ b/documentation/html/classMask.html @@ -0,0 +1,679 @@ + + + + + + + +NumSim: Mask Class Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      + +
      + + + + + +

      +Public Types

      enum  CellType {
      +  FLUID_DROPLET = 0 +, FLUID_SINGLE_LEFT = 1 +, FLUID_SINGLE_TOP = 2 +, FLUID_SINGLE_RIGHT = 4 +,
      +  FLUID_SINGLE_BOTTOM = 8 +, FLUID_CORNER_BOTTOM_LEFT = 6 +, FLUID_CORNER_TOP_LEFT = 12 +, FLUID_CORNER_TOP_RIGHT = 9 +,
      +  FLUID_CORNER_BOTTOM_RIGHT = 3 +, FLUID_COLUMN_HORIZONTAL = 5 +, FLUID_COLUMN_VERTICAL = 10 +, FLUID_BORDER_LEFT = 14 +,
      +  FLUID_BORDER_TOP = 13 +, FLUID_BORDER_RIGHT = 11 +, FLUID_BORDER_BOTTOM = 7 +, FLUID = 15 +,
      +  FLUID_TYPE = 50 +, AIR = 64 +, OBSTACLE = 99 +, OBSTACLE_INSIDE = 100 +,
      +  OBSTACLE_BORDER_LEFT = 101 +, OBSTACLE_BORDER_TOP = 102 +, OBSTACLE_CORNER_TOP_LEFT = 103 +, OBSTACLE_BORDER_RIGHT = 104 +,
      +  OBSTACLE_CORNER_TOP_RIGHT = 106 +, OBSTACLE_BORDER_BOTTOM = 108 +, OBSTACLE_CORNER_BOTTOM_LEFT = 109 +, OBSTACLE_CORNER_BOTTOM_RIGHT = 112 +,
      +  DOMAIN_BOUNDARY = 200 +, DOMAIN_LEFT_NOSLIP = 201 +, DOMAIN_TOP_NOSLIP = 202 +, DOMAIN_RIGHT_NOSLIP = 203 +,
      +  DOMAIN_BOTTOM_NOSLIP = 204 +, DOMAIN_LEFT_PRESSURE = 205 +, DOMAIN_TOP_PRESSURE = 206 +, DOMAIN_RIGHT_PRESSURE = 207 +,
      +  DOMAIN_BOTTOM_PRESSURE = 208 +
      + }
       < enums used to encode cell type and boundary condition
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Public Member Functions

       Mask (Settings settings)
       constructor.
       
      int & operator() (int i, int j)
       set array value. Overloads the () operator
       
      int operator() (int i, int j) const
       get array value. Overloads the () operator
       
      +std::array< int, 2 > size () const
       get size of array in x and y direction
       
      +void resetMask ()
       sets all not obstacle cells to air
       
      bool isFluid (int i, int j) const
       Cell at (i,j) is fluid or not.
       
      bool isObstacle (int i, int j) const
       True if Cell at (i,j) is either obstacle or boundary.
       
      bool isAir (int i, int j) const
       Cell at (i,j) is a air cell or not.
       
      bool isInnerFluid (int i, int j) const
       Cell at (i,j) is a inner fluid cell or not.
       
      bool isDomainBoundary (int i, int j) const
       Cecks if cell at index is domain boundary.
       
      bool isObstacleBoundary (int i, int j) const
       Cecks if cell at index is obstacle boundary.
       
      bool isFluidBoundary (int i, int j) const
       Cecks if cell at index is fluid boundary.
       
      int getNumberOfFluidCells () const
       number of fluid cells
       
      void makeRectangularObstacle ()
       creates rectangulat objecct inside domain
       
      void createMaskFromPNGBitMap ()
       creates mask by reading in bitmap
       
      void setDomainBC ()
       sets enums for all cells that belong to domain boundary
       
      +void setObstacleBC ()
       sets enums for all cells that belong to an obstacle
       
      +void setFluidBC ()
       sets enums for all fluid cells that belong are located at a surface
       
      +void printMask () const
       print mask enums to terminal
       
      + + + + + + + + + + + + + + + + +

      +Protected Attributes

      +std::array< int, 2 > size_
       size of array in x and y direction
       
      +std::vector< int > data_
       storage array values, in row-major order
       
      +std::vector< int > boundary_list
       stores the indices of the boundary cells
       
      +Settings settings_
       settings entity
       
      +int forbiddenObstacleFluidCombinations [7] = {105, 107, 110, 111, 113, 114, 115}
       enums that singnal forbidden obstacle - fluid cell combinations
       
      +

      Constructor & Destructor Documentation

      + +

      ◆ Mask()

      + +
      +
      + + + + + + + + +
      Mask::Mask (Settings settings)
      +
      + +

      constructor.

      +
      Parameters
      + + +
      settingsettings containing necessary user input
      +
      +
      + +
      +
      +

      Member Function Documentation

      + +

      ◆ createMaskFromPNGBitMap()

      + +
      +
      + + + + + + + +
      void Mask::createMaskFromPNGBitMap ()
      +
      + +

      creates mask by reading in bitmap

      +

      path to bitmap saved as png is specified in settings file by user

      + +
      +
      + +

      ◆ getNumberOfFluidCells()

      + +
      +
      + + + + + + + +
      int Mask::getNumberOfFluidCells () const
      +
      + +

      number of fluid cells

      +

      not efficient but is only used once in the creation of the fluid tracer

      + +
      +
      + +

      ◆ isAir()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      bool Mask::isAir (int i,
      int j 
      ) const
      +
      + +

      Cell at (i,j) is a air cell or not.

      +
      Parameters
      + + + +
      iindex in x direction
      jindex in y direction
      +
      +
      +

      If i and j are out of bond returns false

      + +
      +
      + +

      ◆ isDomainBoundary()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      bool Mask::isDomainBoundary (int i,
      int j 
      ) const
      +
      + +

      Cecks if cell at index is domain boundary.

      +
      Parameters
      + + + +
      iindex in x direction
      jindex in y direction
      +
      +
      + +
      +
      + +

      ◆ isFluid()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      bool Mask::isFluid (int i,
      int j 
      ) const
      +
      + +

      Cell at (i,j) is fluid or not.

      +
      Parameters
      + + + +
      iindex in x direction
      jindex in y direction
      +
      +
      +

      If i and j are out of bond returns false

      + +
      +
      + +

      ◆ isFluidBoundary()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      bool Mask::isFluidBoundary (int i,
      int j 
      ) const
      +
      + +

      Cecks if cell at index is fluid boundary.

      +
      Parameters
      + + + +
      iindex in x direction
      jindex in y direction
      +
      +
      + +
      +
      + +

      ◆ isInnerFluid()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      bool Mask::isInnerFluid (int i,
      int j 
      ) const
      +
      + +

      Cell at (i,j) is a inner fluid cell or not.

      +
      Parameters
      + + + +
      iindex in x direction
      jindex in y direction
      +
      +
      +

      Checks if fluid is sourrounded by only fluid cells If i and j are out of bond returns false

      + +
      +
      + +

      ◆ isObstacle()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      bool Mask::isObstacle (int i,
      int j 
      ) const
      +
      + +

      True if Cell at (i,j) is either obstacle or boundary.

      +
      Parameters
      + + + +
      iindex in x direction
      jindex in y direction
      +
      +
      + +
      +
      + +

      ◆ isObstacleBoundary()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      bool Mask::isObstacleBoundary (int i,
      int j 
      ) const
      +
      + +

      Cecks if cell at index is obstacle boundary.

      +
      Parameters
      + + + +
      iindex in x direction
      jindex in y direction
      +
      +
      + +
      +
      + +

      ◆ makeRectangularObstacle()

      + +
      +
      + + + + + + + +
      void Mask::makeRectangularObstacle ()
      +
      + +

      creates rectangulat objecct inside domain

      +

      location and size are specified in settings file by user

      + +
      +
      + +

      ◆ operator()() [1/2]

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      int & Mask::operator() (int i,
      int j 
      )
      +
      + +

      set array value. Overloads the () operator

      +
      Parameters
      + + + +
      iindex in x direction
      jindex in y direction
      +
      +
      + +
      +
      + +

      ◆ operator()() [2/2]

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      int Mask::operator() (int i,
      int j 
      ) const
      +
      + +

      get array value. Overloads the () operator

      +
      Parameters
      + + + +
      iindex in x direction
      jindex in y direction
      +
      +
      + +
      +
      + +

      ◆ setDomainBC()

      + +
      +
      + + + + + + + +
      void Mask::setDomainBC ()
      +
      + +

      sets enums for all cells that belong to domain boundary

      +

      type of domain boundary condition is specified in settings file by user

      + +
      +
      +
      The documentation for this class was generated from the following files:
        +
      • /home/jonat/Documents/01_Studium/NumSim/src/boundary/mask.h
      • +
      • /home/jonat/Documents/01_Studium/NumSim/src/boundary/mask.cpp
      • +
      +
      + + + + diff --git a/documentation/html/classOutputWriter-members.html b/documentation/html/classOutputWriter-members.html new file mode 100644 index 00000000..a07d193b --- /dev/null +++ b/documentation/html/classOutputWriter-members.html @@ -0,0 +1,90 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      +
      OutputWriter Member List
      +
      +
      + +

      This is the complete list of members for OutputWriter, including all inherited members.

      + + + + + +
      discretization_OutputWriterprotected
      fileNo_OutputWriterprotected
      OutputWriter(std::shared_ptr< Discretization > discretization)OutputWriter
      writeFile(double currentTime)=0OutputWriterpure virtual
      + + + + diff --git a/documentation/html/classOutputWriter.html b/documentation/html/classOutputWriter.html new file mode 100644 index 00000000..62415c92 --- /dev/null +++ b/documentation/html/classOutputWriter.html @@ -0,0 +1,194 @@ + + + + + + + +NumSim: OutputWriter Class Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      + +
      OutputWriter Class Referenceabstract
      +
      +
      + +

      Inteface class for writing simulation data output. + More...

      + +

      #include <output_writer.h>

      +
      +Inheritance diagram for OutputWriter:
      +
      +
      + + +OutputWriterParaview +OutputWriterText + +
      + + + + + + + + +

      +Public Member Functions

       OutputWriter (std::shared_ptr< Discretization > discretization)
       Constructor.
       
      virtual void writeFile (double currentTime)=0
       Write current velocities to file.
       
      + + + + + + + +

      +Protected Attributes

      +std::shared_ptr< Discretizationdiscretization_
       shared pointer, discretization object containing data to be written to file
       
      +int fileNo_
       a counter that increments for every file written to disk
       
      +

      Detailed Description

      +

      Inteface class for writing simulation data output.

      +

      Constructor & Destructor Documentation

      + +

      ◆ OutputWriter()

      + +
      +
      + + + + + + + + +
      OutputWriter::OutputWriter (std::shared_ptr< Discretizationdiscretization)
      +
      + +

      Constructor.

      +
      Parameters
      + + +
      discretizationdiscretization object containing data to be written to file
      +
      +
      + +
      +
      +

      Member Function Documentation

      + +

      ◆ writeFile()

      + +
      +
      + + + + + +
      + + + + + + + + +
      virtual void OutputWriter::writeFile (double currentTime)
      +
      +pure virtual
      +
      + +

      Write current velocities to file.

      +

      Filename is output_<fileNo_>.vti

      +
      Parameters
      + + +
      currentTimecurrent time of simulation
      +
      +
      + +

      Implemented in OutputWriterParaview, and OutputWriterText.

      + +
      +
      +
      The documentation for this class was generated from the following files:
        +
      • /home/jonat/Documents/01_Studium/NumSim/src/output_writer/output_writer.h
      • +
      • /home/jonat/Documents/01_Studium/NumSim/src/output_writer/output_writer.cpp
      • +
      +
      + + + + diff --git a/documentation/html/classOutputWriter.png b/documentation/html/classOutputWriter.png new file mode 100644 index 0000000000000000000000000000000000000000..8c067052c2fdcc564b3d4ff58012906745de570c GIT binary patch literal 884 zcmeAS@N?(olHy`uVBq!ia0y~yV3Y!~12~w06FES8t zp%Uy zGk)zmHG_HUyq$-xB*oFLY0rt|k?J*(YlqhmHrI*Z#S>y`AWZStR% zW##OCy3}o3?R1#)?A&^D<-O4zJSXTZ&_A3EKOEc|SQe;XWpL?9-o?n_VagyFpLU7& zfbL4R2Yi}r3My9_T9!yPObB5Xn3Tof6vXS`v5Jwy)09DRC7Z&N&sTaLTg>BWFfQ0P zeJ+MHUcDemnMr|~OaDySI3=j=1gEjqq%Xg(WU0LT?rAznWKx!jrpi^1AdgiOmrU?F z`{8T&)GOz+6S~%hEZh}zy<27L9nHH7pLMY4|NJU>Ofxr2?`h~#Tjl#nqRs< z?wnQW6`Rm|-u9aPbI$zr+xqWr$zT4lX_mO~ny~m_Jx|^Kt6v(w`ravt>)p4vIpOm6 zzj>8=mp%Ku~vvT$o+1x zaqrg!|`8Ot4}rXIZ8*#oaWkT$>4FO;(?w0*P6)|{+uldJ4r zZs$(mc2T}A?y!5|D&~#5q-VW;ZJpKUX|QAAG(Q#7`Ch#$TaTEjzN{!)F>%SX{j(B4 zVHKk6smOoTzopr E0Fh&y9smFU literal 0 HcmV?d00001 diff --git a/documentation/html/classOutputWriterParaview-members.html b/documentation/html/classOutputWriterParaview-members.html new file mode 100644 index 00000000..8545541e --- /dev/null +++ b/documentation/html/classOutputWriterParaview-members.html @@ -0,0 +1,91 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      +
      OutputWriterParaview Member List
      +
      +
      + +

      This is the complete list of members for OutputWriterParaview, including all inherited members.

      + + + + + + +
      discretization_OutputWriterprotected
      fileNo_OutputWriterprotected
      OutputWriter(std::shared_ptr< Discretization > discretization)OutputWriter
      OutputWriterParaview(std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask, std::shared_ptr< FluidTracer > fluidTracer)OutputWriterParaview
      writeFile(double currentTime)OutputWriterParaviewvirtual
      + + + + diff --git a/documentation/html/classOutputWriterParaview.html b/documentation/html/classOutputWriterParaview.html new file mode 100644 index 00000000..35bca98a --- /dev/null +++ b/documentation/html/classOutputWriterParaview.html @@ -0,0 +1,213 @@ + + + + + + + +NumSim: OutputWriterParaview Class Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      + +
      OutputWriterParaview Class Reference
      +
      +
      + +

      Write *.vti files that can be viewed with ParaView. + More...

      + +

      #include <output_writer_paraview.h>

      +
      +Inheritance diagram for OutputWriterParaview:
      +
      +
      + + +OutputWriter + +
      + + + + + + + + + + + + +

      +Public Member Functions

       OutputWriterParaview (std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask, std::shared_ptr< FluidTracer > fluidTracer)
       Constructor.
       
      void writeFile (double currentTime)
       Write current velocities to file, filename is output_<count>.vti.
       
      - Public Member Functions inherited from OutputWriter
       OutputWriter (std::shared_ptr< Discretization > discretization)
       Constructor.
       
      + + + + + + + + +

      +Additional Inherited Members

      - Protected Attributes inherited from OutputWriter
      +std::shared_ptr< Discretizationdiscretization_
       shared pointer, discretization object containing data to be written to file
       
      +int fileNo_
       a counter that increments for every file written to disk
       
      +

      Detailed Description

      +

      Write *.vti files that can be viewed with ParaView.

      +

      The mesh that can be visualized in ParaView corresponds to the mesh of the computational domain. All values are given for the nodes of the mesh, i.e., the corners of each cell. This means, values will be interpolated because the values are stored at positions given by the staggered grid.

      +

      Constructor & Destructor Documentation

      + +

      ◆ OutputWriterParaview()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      OutputWriterParaview::OutputWriterParaview (std::shared_ptr< Discretizationdiscretization,
      std::shared_ptr< Maskmask,
      std::shared_ptr< FluidTracerfluidTracer 
      )
      +
      + +

      Constructor.

      +
      Parameters
      + + +
      discretizationshared pointer to the discretization object that will contain all the data to be written to the file
      +
      +
      + +
      +
      +

      Member Function Documentation

      + +

      ◆ writeFile()

      + +
      +
      + + + + + +
      + + + + + + + + +
      void OutputWriterParaview::writeFile (double currentTime)
      +
      +virtual
      +
      + +

      Write current velocities to file, filename is output_<count>.vti.

      +
      Parameters
      + + +
      currentTimecurrent time in simulation
      +
      +
      + +

      Implements OutputWriter.

      + +
      +
      +
      The documentation for this class was generated from the following files:
        +
      • /home/jonat/Documents/01_Studium/NumSim/src/output_writer/output_writer_paraview.h
      • +
      • /home/jonat/Documents/01_Studium/NumSim/src/output_writer/output_writer_paraview.cpp
      • +
      +
      + + + + diff --git a/documentation/html/classOutputWriterParaview.png b/documentation/html/classOutputWriterParaview.png new file mode 100644 index 0000000000000000000000000000000000000000..b855af00854c54a33e2348e52457f01c4aab678a GIT binary patch literal 611 zcmeAS@N?(olHy`uVBq!ia0vp^9Y7qw!3-q7a-LNJQqloFA+G=b{|7Q(y!l$%e`vXd zfo6fk^fNCG95?_J51w>+1yGK&B*-tA0mugfbEer>7#JAedAc};R4~4s`?_znfk3mY za%kOu^?R2XB-w8i-I{kd!*uG|RF6Z`Q`-I=HSxX7am;1X{`V}3nO*{umU$~Y{nx!+ z#rOLGnP^!jmCCc>4syzEiR&9=OqEXt$1_B--MMF`f4=5UTr9KTGP4=gSC+0h@A>J9 zeuK@HIb|PrP5$`p;q%p>wLIh_rYF9=&^Y1A_kZUVyl4Ga@t9G$Jy@RkW9B!@O)+zu zYw}zVl`om*zIv9J1yg6J^Q8N~j_SYOU#sl#X{K5O@S&ezt2^e^`^VSwCT~`S|WDG{l0R*TA@(4cKJ8$1xlrT$~V{WtyWWUKU~LF6mUap zQssPyjfW2+h0Eh;;ZM7kE}MQuu|s8N{insVfsX(AUi;(}Ag$auCFm5xKPJY~0+}0< SI + + + + + + +NumSim: Member List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      +
      OutputWriterText Member List
      +
      +
      + +

      This is the complete list of members for OutputWriterText, including all inherited members.

      + + + + + + +
      discretization_OutputWriterprotected
      fileNo_OutputWriterprotected
      OutputWriter(std::shared_ptr< Discretization > discretization)OutputWriterText
      writeFile(double currentTime)OutputWriterTextvirtual
      writePressureFile()OutputWriterText
      + + + + diff --git a/documentation/html/classOutputWriterText.html b/documentation/html/classOutputWriterText.html new file mode 100644 index 00000000..bedaafe8 --- /dev/null +++ b/documentation/html/classOutputWriterText.html @@ -0,0 +1,195 @@ + + + + + + + +NumSim: OutputWriterText Class Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      + +
      OutputWriterText Class Reference
      +
      +
      + +

      Write *.txt files that are useful for debugging. + More...

      + +

      #include <output_writer_text.h>

      +
      +Inheritance diagram for OutputWriterText:
      +
      +
      + + +OutputWriter + +
      + + + + + + + + + + + + + + + +

      +Public Member Functions

      void writeFile (double currentTime)
       Write current velocities to file.
       
      void writePressureFile ()
       Write only current values of pressure to file.
       
      OutputWriter (std::shared_ptr< Discretization > discretization)
       Default constructor.
       
      - Public Member Functions inherited from OutputWriter
       OutputWriter (std::shared_ptr< Discretization > discretization)
       Constructor.
       
      + + + + + + + + +

      +Additional Inherited Members

      - Protected Attributes inherited from OutputWriter
      +std::shared_ptr< Discretizationdiscretization_
       shared pointer, discretization object containing data to be written to file
       
      +int fileNo_
       a counter that increments for every file written to disk
       
      +

      Detailed Description

      +

      Write *.txt files that are useful for debugging.

      +

      All values are written to the file as they are stored in the field variables, no interpolation takes place.

      +

      Member Function Documentation

      + +

      ◆ writeFile()

      + +
      +
      + + + + + +
      + + + + + + + + +
      void OutputWriterText::writeFile (double currentTime)
      +
      +virtual
      +
      + +

      Write current velocities to file.

      +

      Filename is output_<count>.vti

      +
      Parameters
      + + +
      currentTimecurrent time of simulation
      +
      +
      + +

      Implements OutputWriter.

      + +
      +
      + +

      ◆ writePressureFile()

      + +
      +
      + + + + + + + +
      void OutputWriterText::writePressureFile ()
      +
      + +

      Write only current values of pressure to file.

      +

      Filename is pressure_<count>.txt

      + +
      +
      +
      The documentation for this class was generated from the following files:
        +
      • /home/jonat/Documents/01_Studium/NumSim/src/output_writer/output_writer_text.h
      • +
      • /home/jonat/Documents/01_Studium/NumSim/src/output_writer/output_writer_text.cpp
      • +
      +
      + + + + diff --git a/documentation/html/classOutputWriterText.png b/documentation/html/classOutputWriterText.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb73cca6234b65ec1dd053aa25f1cba6f2c682c GIT binary patch literal 534 zcmV+x0_pvUP)vTJr#LVva2S`&=)l0h|Ns9}lGCUF000SeQchC<|NsC0|NsC0Hv*f~0004@ zNkl5QK*zY3Bd`;wvtcm14Aqp~)SF(K5U|?7H?dVvKQ)5J_@|7K$VX z^mSBtUcO6m*Pcf5ikwA~2kN4>HE!V*RBswd*LtYDeo zuAsJ-A8)?p+jlp0BD{=hjS@;((4a`N(cP$AQ1_zT>6?6hfZ89meOLL{G3t}3+;?TA zRx7X?J(RCNlHBX+zs1QnLy~9u-zbtC)IyQufaaoNjB$zp;B!3yV28n(i}HH-WBL4!$cZwOWDI=%IWCy1P4ETY-|)>fS$+e~6N#`?OG!G@!Yt5JH%u YAFnW1BtDjmU;qFB07*qoM6N<$g7_EsVgLXD literal 0 HcmV?d00001 diff --git a/documentation/html/classPressureSolver-members.html b/documentation/html/classPressureSolver-members.html new file mode 100644 index 00000000..16f89391 --- /dev/null +++ b/documentation/html/classPressureSolver-members.html @@ -0,0 +1,100 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      +
      PressureSolver Member List
      +
      +
      + +

      This is the complete list of members for PressureSolver, including all inherited members.

      + + + + + + + + + + + + + + + +
      boundary_PressureSolverprotected
      calculateResiduum()PressureSolverprotected
      discretization_PressureSolverprotected
      dx2 (defined in PressureSolver)PressureSolver
      dy2PressureSolver
      epsilon_PressureSolverprotected
      i_begPressureSolverprotected
      i_endPressureSolverprotected
      j_begPressureSolverprotected
      j_endPressureSolverprotected
      maximumNumberOfIterations_PressureSolverprotected
      PressureSolver(std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)PressureSolver
      setBoundaryValues()PressureSolverprotected
      solve()=0PressureSolverpure virtual
      + + + + diff --git a/documentation/html/classPressureSolver.html b/documentation/html/classPressureSolver.html new file mode 100644 index 00000000..af1d8d08 --- /dev/null +++ b/documentation/html/classPressureSolver.html @@ -0,0 +1,286 @@ + + + + + + + +NumSim: PressureSolver Class Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      + +
      + +

      Solves the Poisson problem for the pressure. + More...

      + +

      #include <pressure_solver.h>

      +
      +Inheritance diagram for PressureSolver:
      +
      +
      + + +GaussSeidel +SOR + +
      + + + + + + + + +

      +Public Member Functions

       PressureSolver (std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
       Constructor.
       
      virtual void solve ()=0
       virtual function that starts solver.
       
      + + + + + + +

      +Public Attributes

      +double dx2
       
      +double dy2
       squared mesh widths
       
      + + + + + + + +

      +Protected Member Functions

      void setBoundaryValues ()
       Set the Boundary Values.
       
      +double calculateResiduum ()
       calculate residuum of current time step
       
      + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Protected Attributes

      +int i_beg
       begin of loop for rhs in x direction
       
      +int i_end
       end of loop for rhs in x direction
       
      +int j_beg
       begin of loop for rhs in y direction
       
      +int j_end
       end of loop for rhs in y direction
       
      +std::shared_ptr< Discretizationdiscretization_
       object holding the needed field variables for rhs and p
       
      +std::shared_ptr< Boundaryboundary_
       object managing boundary for obstacle and surface tension
       
      +double epsilon_
       tolerance for the solver
       
      +int maximumNumberOfIterations_
       maximum number of iterations
       
      +

      Detailed Description

      +

      Solves the Poisson problem for the pressure.

      +

      Interface for the pressure solver. It computes the pressure field variable such that the continuity equation is fulfilled.

      +

      Constructor & Destructor Documentation

      + +

      ◆ PressureSolver()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      PressureSolver::PressureSolver (std::shared_ptr< Discretizationdiscretization,
      double epsilon,
      int maximumNumberOfIterations,
      std::shared_ptr< Boundaryboundary 
      )
      +
      + +

      Constructor.

      +
      Parameters
      + + + + + +
      discretizationinstance of Discretization holding the needed field variables for rhs and p
      epsilontolerance for the solver
      maximumNumberOfIterationsmaximum of iteration
      boundaryobject managing boundary for obstacle and surface tension
      +
      +
      + +
      +
      +

      Member Function Documentation

      + +

      ◆ setBoundaryValues()

      + +
      +
      + + + + + +
      + + + + + + + +
      void PressureSolver::setBoundaryValues ()
      +
      +protected
      +
      + +

      Set the Boundary Values.

      +

      Account for homogenous Neuman BC Has to be called every iteration

      + +
      +
      + +

      ◆ solve()

      + +
      +
      + + + + + +
      + + + + + + + +
      virtual void PressureSolver::solve ()
      +
      +pure virtual
      +
      + +

      virtual function that starts solver.

      + +

      Implemented in GaussSeidel, and SOR.

      + +
      +
      +
      The documentation for this class was generated from the following files:
        +
      • /home/jonat/Documents/01_Studium/NumSim/src/solver/pressure_solver.h
      • +
      • /home/jonat/Documents/01_Studium/NumSim/src/solver/pressure_solver.cpp
      • +
      +
      + + + + diff --git a/documentation/html/classPressureSolver.png b/documentation/html/classPressureSolver.png new file mode 100644 index 0000000000000000000000000000000000000000..c4c751c264dc13283a3b381339d7aaa6caf83ff6 GIT binary patch literal 675 zcmeAS@N?(olHy`uVBq!ia0vp^mw-5cgBeIh+uvRcq@)9ULR|m<{|{uoc=NTi|Il&^ z1I+@7>1SRXIB)=1df`A*p zeCN#X^^bPvMzUy75|@cT$#-EbJr!SEeT-h`7LOp%Il7^O}Q(@3*0lCjzouRJ-rn7=<3oXqAPcuUvlNm&$MT=WA191 zvL=fyO}Hl4d#x`hGWA)|t(6tqi{;Yt&RyTNO#JqzZm+bo^oK|eYSErK^DD@OEdqyb zGWeWjD$rfGe2dQX;$8DD^D zE0r(3{WX7E`Tn4~gYVD2{dIgnoQAEOqUZS={T2b5`xB~_J=fpV5>?)P-dpW#m}HPk zOUcSx?Ne5LwRh9x&D;A#`K76E=$a*8E7U*sg`KLr&9^yXepsfkb(q|#r~CYG9Ej5r zd+=|{+#}idf_JQmJ*Iu{*McOGNnhCYr@We(A6<5T$I9B~rwHq)$ literal 0 HcmV?d00001 diff --git a/documentation/html/classSOR-members.html b/documentation/html/classSOR-members.html new file mode 100644 index 00000000..98ccee2b --- /dev/null +++ b/documentation/html/classSOR-members.html @@ -0,0 +1,101 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      +
      SOR Member List
      +
      +
      + +

      This is the complete list of members for SOR, including all inherited members.

      + + + + + + + + + + + + + + + + +
      boundary_PressureSolverprotected
      calculateResiduum()PressureSolverprotected
      discretization_PressureSolverprotected
      dx2 (defined in PressureSolver)PressureSolver
      dy2PressureSolver
      epsilon_PressureSolverprotected
      i_begPressureSolverprotected
      i_endPressureSolverprotected
      j_begPressureSolverprotected
      j_endPressureSolverprotected
      maximumNumberOfIterations_PressureSolverprotected
      PressureSolver(std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)PressureSolver
      setBoundaryValues()PressureSolverprotected
      solve() overrideSORvirtual
      SOR(const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary, double omega)SOR
      + + + + diff --git a/documentation/html/classSOR.html b/documentation/html/classSOR.html new file mode 100644 index 00000000..4db90542 --- /dev/null +++ b/documentation/html/classSOR.html @@ -0,0 +1,260 @@ + + + + + + + +NumSim: SOR Class Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      + +
      SOR Class Reference
      +
      +
      + +

      Successive over-relaxation solver. + More...

      + +

      #include <sor.h>

      +
      +Inheritance diagram for SOR:
      +
      +
      + + +PressureSolver + +
      + + + + + + + + + + + + +

      +Public Member Functions

       SOR (const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary, double omega)
       Constructor.
       
      void solve () override
       override function that starts solver.
       
      - Public Member Functions inherited from PressureSolver
       PressureSolver (std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
       Constructor.
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Additional Inherited Members

      - Public Attributes inherited from PressureSolver
      +double dx2
       
      +double dy2
       squared mesh widths
       
      - Protected Member Functions inherited from PressureSolver
      void setBoundaryValues ()
       Set the Boundary Values.
       
      +double calculateResiduum ()
       calculate residuum of current time step
       
      - Protected Attributes inherited from PressureSolver
      +int i_beg
       begin of loop for rhs in x direction
       
      +int i_end
       end of loop for rhs in x direction
       
      +int j_beg
       begin of loop for rhs in y direction
       
      +int j_end
       end of loop for rhs in y direction
       
      +std::shared_ptr< Discretizationdiscretization_
       object holding the needed field variables for rhs and p
       
      +std::shared_ptr< Boundaryboundary_
       object managing boundary for obstacle and surface tension
       
      +double epsilon_
       tolerance for the solver
       
      +int maximumNumberOfIterations_
       maximum number of iterations
       
      +

      Detailed Description

      +

      Successive over-relaxation solver.

      +

      Constructor & Destructor Documentation

      + +

      ◆ SOR()

      + +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SOR::SOR (const std::shared_ptr< Discretization > & data,
      double epsilon,
      int maximumNumberOfIterations,
      std::shared_ptr< Boundaryboundary,
      double omega 
      )
      +
      + +

      Constructor.

      +
      Parameters
      + + + + + +
      datainstance of Discretization holding the needed field variables for rhs and p
      epsilontolerance for the solver
      maximumNumberOfIterationsmaximum of iteration
      omegarelaxation factor
      +
      +
      + +
      +
      +

      Member Function Documentation

      + +

      ◆ solve()

      + +
      +
      + + + + + +
      + + + + + + + +
      void SOR::solve ()
      +
      +overridevirtual
      +
      + +

      override function that starts solver.

      + +

      Implements PressureSolver.

      + +
      +
      +
      The documentation for this class was generated from the following files:
        +
      • /home/jonat/Documents/01_Studium/NumSim/src/solver/sor.h
      • +
      • /home/jonat/Documents/01_Studium/NumSim/src/solver/sor.cpp
      • +
      +
      + + + + diff --git a/documentation/html/classSOR.png b/documentation/html/classSOR.png new file mode 100644 index 0000000000000000000000000000000000000000..78abfb4799f77e7cea02bd428cd48ca3c484962c GIT binary patch literal 441 zcmeAS@N?(olHy`uVBq!ia0vp^DL@>+!3-pCTvxaYq@)9ULR|m<{|{uoc=NTi|Il&^ z1I+@7>1SRXIB)c)B=-R4~4s`!?^e0*~u@ z{h*Tj|2wDW@Gvc1Y0PUWzh3=0C?%h1 zZaIOcfAu@H`3GL?xTW-RdETYfDyVt(B{PkG9xaU136_uCI)~aYOHIZc4agvQ;bEM+UZLHHoC*3u?zscp3+f`8^ zh7ZC*3 + + + + + + +NumSim: Member List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      +
      StaggeredGrid Member List
      +
      +
      + +

      This is the complete list of members for StaggeredGrid, including all inherited members.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      dx() constStaggeredGrid
      dy() constStaggeredGrid
      f(int i, int j)StaggeredGrid
      f_StaggeredGridprotected
      fIBegin() constStaggeredGrid
      fIEnd() constStaggeredGrid
      fJBegin() constStaggeredGrid
      fJEnd() constStaggeredGrid
      g(int i, int j)StaggeredGrid
      g_StaggeredGridprotected
      gIBegin() constStaggeredGrid
      gIEnd() constStaggeredGrid
      gJBegin() constStaggeredGrid
      gJEnd() constStaggeredGrid
      meshWidth() constStaggeredGrid
      meshWidth_StaggeredGridprotected
      nCells() constStaggeredGrid
      nCells_StaggeredGridprotected
      p() constStaggeredGrid
      p(int i, int j) constStaggeredGrid
      p(int i, int j)StaggeredGrid
      p_StaggeredGridprotected
      pIBegin() constStaggeredGrid
      pIEnd() constStaggeredGrid
      pJBegin() constStaggeredGrid
      pJEnd() constStaggeredGrid
      rhs() constStaggeredGrid
      rhs(int i, int j)StaggeredGrid
      rhs_StaggeredGridprotected
      rhsIBegin() constStaggeredGrid
      rhsIEnd() constStaggeredGrid
      rhsJBegin() constStaggeredGrid
      rhsJEnd() constStaggeredGrid
      StaggeredGrid(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)StaggeredGrid
      u() constStaggeredGrid
      u(int i, int j) constStaggeredGrid
      u(int i, int j)StaggeredGrid
      u_StaggeredGridprotected
      uIBegin() constStaggeredGrid
      uIEnd() constStaggeredGrid
      uJBegin() constStaggeredGrid
      uJEnd() constStaggeredGrid
      v() constStaggeredGrid
      v(int i, int j) constStaggeredGrid
      v(int i, int j)StaggeredGrid
      v_StaggeredGridprotected
      vIBegin() constStaggeredGrid
      vIEnd() constStaggeredGrid
      vJBegin() constStaggeredGrid
      vJEnd() constStaggeredGrid
      + + + + diff --git a/documentation/html/classStaggeredGrid.html b/documentation/html/classStaggeredGrid.html new file mode 100644 index 00000000..d97a9704 --- /dev/null +++ b/documentation/html/classStaggeredGrid.html @@ -0,0 +1,354 @@ + + + + + + + +NumSim: StaggeredGrid Class Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      + +
      StaggeredGrid Class Reference
      +
      +
      + +

      Create field variables and define limits for the indices. + More...

      + +

      #include <staggered_grid.h>

      +
      +Inheritance diagram for StaggeredGrid:
      +
      +
      + + +Discretization +CentralDifferences +DonorCell + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Public Member Functions

       StaggeredGrid (std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
       Constructor.
       
      +const std::array< double, 2 > meshWidth () const
       Get the length of a single cell in x and y directions.
       
      +const std::array< int, 2 > nCells () const
       Get number of cells in x and y directions.
       
      +const FieldVariableu () const
       Get a reference to the field variable u.
       
      +const FieldVariablev () const
       Get a reference to the field variable v.
       
      +const FieldVariablep () const
       Get a reference to the field variable p.
       
      +const FieldVariablerhs () const
       Get a reference to the field variable rhs.
       
      +double u (int i, int j) const
       Access value of u in element (i,j), declared constant.
       
      +double & u (int i, int j)
       Access value of u in element (i,j)
       
      +double v (int i, int j) const
       Access value of v in element (i,j), declared constant.
       
      +double & v (int i, int j)
       Access value of v in element (i,j)
       
      +double p (int i, int j) const
       Access value of p in element (i,j), declared constant.
       
      +double & p (int i, int j)
       Access value of p in element (i,j)
       
      +double & f (int i, int j)
       Access value of f in element (i,j)
       
      +double & g (int i, int j)
       Access value of g in element (i,j)
       
      +double & rhs (int i, int j)
       Access value of rhs in element (i,j)
       
      +double dx () const
       Get the mesh width in x-direction.
       
      +double dy () const
       Get the mesh width in y-direction.
       
      +int uIBegin () const
       first valid index for u in x direction
       
      +int uIEnd () const
       one after last valid index for u in x direction
       
      +int uJBegin () const
       first valid index for u in y direction
       
      +int uJEnd () const
       one after last valid index for u in y direction
       
      +int vIBegin () const
       first valid index for v in x direction
       
      +int vIEnd () const
       one after last valid index for v in x direction
       
      +int vJBegin () const
       first valid index for v in y direction
       
      +int vJEnd () const
       one after last valid index for v in y direction
       
      +int pIBegin () const
       first valid index for p in x direction
       
      +int pIEnd () const
       one after last valid index for p in x direction
       
      +int pJBegin () const
       first valid index for p in y direction
       
      +int pJEnd () const
       one after last valid index for p in y direction
       
      +int fIBegin () const
       first valid index for f in x direction
       
      +int fIEnd () const
       one after last valid index for f in x direction
       
      +int fJBegin () const
       first valid index for f in y direction
       
      +int fJEnd () const
       one after last valid index for f in y direction
       
      +int gIBegin () const
       first valid index for g in x direction
       
      +int gIEnd () const
       one after last valid index for g in x direction
       
      +int gJBegin () const
       first valid index for g in y direction
       
      +int gJEnd () const
       one after last valid index for g in y direction
       
      +int rhsIBegin () const
       first valid index for rhs in x direction
       
      +int rhsIEnd () const
       one after last valid index for rhs in x direction
       
      +int rhsJBegin () const
       first valid index for rhs in y direction
       
      +int rhsJEnd () const
       one after last valid index for rhs in y direction
       
      + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Protected Attributes

      +const std::array< int, 2 > nCells_
       array containing number of cells in x and y directions
       
      +const std::array< double, 2 > meshWidth_
       array containing the sizes of cell edges in x and y directions
       
      +FieldVariable u_
       instance of the field variable u
       
      +FieldVariable v_
       instance of the field variable v
       
      +FieldVariable p_
       instance of the field variable p
       
      +FieldVariable f_
       instance of the field variable f
       
      +FieldVariable g_
       instance of the field variable g
       
      +FieldVariable rhs_
       instance of the field variable rhs
       
      +

      Detailed Description

      +

      Create field variables and define limits for the indices.

      +

      Create the necessary u, v, p, f, g, rhs field variables and define the first valid index for each of the field variables, as well as the (one after) last valid index

      +

      Constructor & Destructor Documentation

      + +

      ◆ StaggeredGrid()

      + +
      +
      + + + + + + + + + + + + + + + + + + +
      StaggeredGrid::StaggeredGrid (std::array< int, 2 > nCells,
      std::array< double, 2 > meshWidth 
      )
      +
      + +

      Constructor.

      +
      Parameters
      + + + +
      nCellsarray containing number of cells in x and y directions
      meshWidtharray containing the length of a single cell in x and y directions
      +
      +
      + +
      +
      +
      The documentation for this class was generated from the following files:
        +
      • /home/jonat/Documents/01_Studium/NumSim/src/discretization/staggered_grid.h
      • +
      • /home/jonat/Documents/01_Studium/NumSim/src/discretization/staggered_grid.cpp
      • +
      +
      + + + + diff --git a/documentation/html/classStaggeredGrid.png b/documentation/html/classStaggeredGrid.png new file mode 100644 index 0000000000000000000000000000000000000000..372a826c21c16a55ad438007dec0da6cc630b22d GIT binary patch literal 1049 zcmeAS@N?(olHy`uVBq!ia0vp^KY+M{gBeKv)x8GdNC)_Yxc>kDAIN<1=4)yHq2(3^ zngtTm&%8Kr-~doOc+%w+KsnBmAirP+ARi3OnPy*MU|?S2>Eakt!T5IW>q)B>1lVr( zYh~a2-|24>$L3sCY%MVT<|gLuhAljg;~Tb1v?XRRI7G7^#(r$izdjF$pW_)=3saNav zrMzFd-@ifK`f*yCq~40NXYM`Ld9;5{gz@I*7H9kN8UISY4{qHx^X74m!UnUJ9Wx_M zon#j99yZ|NWw6jycIf}2W!E=%)_1MCkMAz;iT-%v6+^AyBL-U%@N(s)Q{qy5G?$7q zW_V9p0tv8~NvnWH8v-i!YC{dMkd`4G|KH*Nv$SZW_NBi~4x4{@$N5*! zg{Lq1@7ck;Me&I0N^mR+Oka`(iq;^nm5dC_Q(0b2j5~UKWANv=qx$!1XO(NqManMF z2L_Wm0zdHSd2F$bbphkqa-AcLT0)N)bb$fd1vG^ls7MKzHkt(3S9kzzQ2KmdRO%En38+y~&r`JU(c!25lZ^Our`IpfD}MdO_$t?8m6z%B z1n$decz!?e+h_HpCGt0pnoD~A4izXryLq>Y?OEeTM_WCMt}i@q{3!3rpLcDk=Fcs! z-LiYU_2;E+Th=>1sM7Oof8_d6b)T1U{QRnjKirRAA9(#hci#4wb9S(49{+l#N~V3k zO5B{v>a=Y?%8zV*q);8c$HFeZCf+7Kvh2=1q5aP~7yq~xB@$oMy;}arb-wp4zmy-f zr+Nj={M2_p=MMA2I*+pL*7L6Zd)&8w*46qs_tL+%JO33<|MTvQ-ookgls#R!?iY%0 z)hj(C`R9l1clN~kee(Z1*X*lZeA;-r`2Ut2Dxr@#3q60?fI@)tBQO%WKw>IKq`Q_+ i396k_;iY-?x%__hDNh>;QdR>qF@vY8pUXO@geCw>hW{)8 literal 0 HcmV?d00001 diff --git a/documentation/html/classes.html b/documentation/html/classes.html new file mode 100644 index 00000000..7297e602 --- /dev/null +++ b/documentation/html/classes.html @@ -0,0 +1,119 @@ + + + + + + + +NumSim: Class Index + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + +
      + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      Class Index
      +
      + + + + + diff --git a/documentation/html/clipboard.js b/documentation/html/clipboard.js new file mode 100644 index 00000000..42c1fb0e --- /dev/null +++ b/documentation/html/clipboard.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Copy to clipboard" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +$(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + $(clipboard_div).click(function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/documentation/html/closed.png b/documentation/html/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/documentation/html/computation_8h_source.html b/documentation/html/computation_8h_source.html new file mode 100644 index 00000000..33f49605 --- /dev/null +++ b/documentation/html/computation_8h_source.html @@ -0,0 +1,154 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/computation.h Source File + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      computation.h
      +
      +
      +
      1#pragma once
      +
      2
      +
      3#include "discretization/discretization.h"
      +
      4#include "discretization/donor_cell.h"
      +
      5#include "discretization/central_differences.h"
      +
      6
      +
      7#include "solver/pressure_solver.h"
      +
      8#include "solver/sor.h"
      +
      9#include "solver/gauss_seidel.h"
      +
      10
      +
      11#include "output_writer/output_writer_paraview.h"
      +
      12#include "output_writer/output_writer_text.h"
      +
      13#include "settings_parser/settings.h"
      +
      14
      +
      15#include "boundary/boundary.h"
      +
      16#include "boundary/mask.h"
      +
      17#include "surface/fluid_tracer.h"
      +
      18#include <unistd.h>
      +
      19
      +
      20#include <cmath>
      +
      21#include <algorithm>
      +
      22#include <iostream>
      +
      23
      +
      + +
      31{
      +
      32public:
      +
      39 void initialize(int argc, char *argv[]);
      +
      40
      +
      45 void runSimulation();
      +
      46
      +
      47private:
      +
      53 void computeTimeStepWidth(double currentTime);
      +
      54
      +
      58 void applyBoundaryValues();
      +
      59
      +
      63 void computePreliminaryVelocities();
      +
      64
      +
      68 void computeRightHandSide();
      +
      69
      +
      73 void computePressure();
      +
      74
      +
      79 void computeVelocities();
      +
      80
      +
      81 Settings settings_;
      +
      82 std::shared_ptr<Discretization> discretization_;
      +
      83
      +
      84 std::shared_ptr<Mask> mask_;
      +
      85 std::shared_ptr<Boundary> boundary_;
      +
      86 std::shared_ptr<FluidTracer> fluidTracer_;
      +
      87
      +
      88 std::unique_ptr<PressureSolver> pressureSolver_;
      +
      89 std::unique_ptr<OutputWriterParaview> outputWriterParaview_;
      +
      90 std::unique_ptr<OutputWriterText> outputWriterText_;
      +
      91 std::array<double, 2> meshWidth_;
      +
      92 double dt_;
      +
      93};
      +
      +
      Computation of Simulation.
      Definition computation.h:31
      +
      void initialize(int argc, char *argv[])
      Initialize the simulation with settings from .txt file.
      Definition computation.cpp:6
      +
      void runSimulation()
      run the whole simulation until t_end
      Definition computation.cpp:67
      +
      All settings that parametrize a simulation run.
      Definition settings.h:14
      +
      + + + + diff --git a/documentation/html/dir_041db6ad6a3d44280e40e5af409429cb.html b/documentation/html/dir_041db6ad6a3d44280e40e5af409429cb.html new file mode 100644 index 00000000..5d8432d6 --- /dev/null +++ b/documentation/html/dir_041db6ad6a3d44280e40e5af409429cb.html @@ -0,0 +1,97 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/solver Directory Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      solver Directory Reference
      +
      +
      + + + + + + + + +

      +Files

       gauss_seidel.h
       
       pressure_solver.h
       
       sor.h
       
      +
      + + + + diff --git a/documentation/html/dir_2725064ac5d6db7b2425ad4e379e8748.html b/documentation/html/dir_2725064ac5d6db7b2425ad4e379e8748.html new file mode 100644 index 00000000..b6eba009 --- /dev/null +++ b/documentation/html/dir_2725064ac5d6db7b2425ad4e379e8748.html @@ -0,0 +1,95 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/boundary Directory Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      boundary Directory Reference
      +
      +
      + + + + + + +

      +Files

       boundary.h
       
       mask.h
       
      +
      + + + + diff --git a/documentation/html/dir_29398f723566cb24cda620b0fb0566c4.html b/documentation/html/dir_29398f723566cb24cda620b0fb0566c4.html new file mode 100644 index 00000000..b23354e5 --- /dev/null +++ b/documentation/html/dir_29398f723566cb24cda620b0fb0566c4.html @@ -0,0 +1,93 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/settings_parser Directory Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      settings_parser Directory Reference
      +
      +
      + + + + +

      +Files

       settings.h
       
      +
      + + + + diff --git a/documentation/html/dir_452baf35e1d7639c9f2a5ece4ec85855.html b/documentation/html/dir_452baf35e1d7639c9f2a5ece4ec85855.html new file mode 100644 index 00000000..1c5fedbe --- /dev/null +++ b/documentation/html/dir_452baf35e1d7639c9f2a5ece4ec85855.html @@ -0,0 +1,95 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/storage Directory Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      storage Directory Reference
      +
      +
      + + + + + + +

      +Files

       array2D.h
       
       field_variable.h
       
      +
      + + + + diff --git a/documentation/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/documentation/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 00000000..c3b9eb33 --- /dev/null +++ b/documentation/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,110 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src Directory Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      src Directory Reference
      +
      +
      + + + + + + + + + + + + + + + + +

      +Directories

       boundary
       
       discretization
       
       output_writer
       
       settings_parser
       
       solver
       
       storage
       
       surface
       
      + + + +

      +Files

       computation.h
       
      +
      + + + + diff --git a/documentation/html/dir_93b0d6a552827721ec9247642283aaa7.html b/documentation/html/dir_93b0d6a552827721ec9247642283aaa7.html new file mode 100644 index 00000000..301faaa0 --- /dev/null +++ b/documentation/html/dir_93b0d6a552827721ec9247642283aaa7.html @@ -0,0 +1,93 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/surface Directory Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      surface Directory Reference
      +
      +
      + + + + +

      +Files

       fluid_tracer.h
       
      +
      + + + + diff --git a/documentation/html/dir_b0b9c4b8ebed4a07d44b9aa635c19fe7.html b/documentation/html/dir_b0b9c4b8ebed4a07d44b9aa635c19fe7.html new file mode 100644 index 00000000..35414c01 --- /dev/null +++ b/documentation/html/dir_b0b9c4b8ebed4a07d44b9aa635c19fe7.html @@ -0,0 +1,97 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/output_writer Directory Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      output_writer Directory Reference
      +
      +
      + + + + + + + + +

      +Files

       output_writer.h
       
       output_writer_paraview.h
       
       output_writer_text.h
       
      +
      + + + + diff --git a/documentation/html/dir_e7c1ed2d2d4c4bb5d8a9744d9e98c346.html b/documentation/html/dir_e7c1ed2d2d4c4bb5d8a9744d9e98c346.html new file mode 100644 index 00000000..95868c54 --- /dev/null +++ b/documentation/html/dir_e7c1ed2d2d4c4bb5d8a9744d9e98c346.html @@ -0,0 +1,99 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/discretization Directory Reference + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      discretization Directory Reference
      +
      +
      + + + + + + + + + + +

      +Files

       central_differences.h
       
       discretization.h
       
       donor_cell.h
       
       staggered_grid.h
       
      +
      + + + + diff --git a/documentation/html/discretization_8h_source.html b/documentation/html/discretization_8h_source.html new file mode 100644 index 00000000..1994adb4 --- /dev/null +++ b/documentation/html/discretization_8h_source.html @@ -0,0 +1,137 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/discretization/discretization.h Source File + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      discretization.h
      +
      +
      +
      1#pragma once
      +
      2
      +
      3#include <array>
      +
      4#include <vector>
      +
      5#include "staggered_grid.h"
      +
      6
      +
      + +
      16{
      +
      17public:
      +
      24 Discretization(std::array<int, 2> nCells, std::array<double, 2> meshWidth);
      +
      25
      +
      29 virtual double computeDu2Dx(int i, int j) const = 0;
      +
      33 virtual double computeDv2Dy(int i, int j) const = 0;
      +
      34
      +
      38 virtual double computeDuvDx(int i, int j) const = 0;
      +
      42 virtual double computeDuvDy(int i, int j) const = 0;
      +
      43
      +
      47 virtual double computeD2uDx2(int i, int j) const;
      +
      51 virtual double computeD2uDy2(int i, int j) const;
      +
      55 virtual double computeD2vDx2(int i, int j) const;
      +
      59 virtual double computeD2vDy2(int i, int j) const;
      +
      60
      +
      64 virtual double computeDpDx(int i, int j) const;
      +
      68 virtual double computeDpDy(int i, int j) const;
      +
      69
      +
      70
      +
      71};
      +
      +
      72
      +
      Computes derivatives included in governing equations.
      Definition discretization.h:16
      +
      virtual double computeDuvDy(int i, int j) const =0
      Calculate first derivative of u*v with respect to y.
      +
      virtual double computeD2uDy2(int i, int j) const
      Calculate second derivative of u with respect to y.
      Definition discretization.cpp:12
      +
      Discretization(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
      Constructor.
      Definition discretization.cpp:3
      +
      virtual double computeD2vDx2(int i, int j) const
      Calculate second derivative of v with respect to x.
      Definition discretization.cpp:17
      +
      virtual double computeD2vDy2(int i, int j) const
      Calculate second derivative of v with respect to y.
      Definition discretization.cpp:22
      +
      virtual double computeD2uDx2(int i, int j) const
      Calculate second derivative of u with respect to x.
      Definition discretization.cpp:7
      +
      virtual double computeDv2Dy(int i, int j) const =0
      Calculate first derivative of v^2 with respect to y.
      +
      virtual double computeDpDy(int i, int j) const
      Calculate first derivative of p with respect to y.
      Definition discretization.cpp:32
      +
      virtual double computeDuvDx(int i, int j) const =0
      Calculate first derivative of u*v with respect to x.
      +
      virtual double computeDu2Dx(int i, int j) const =0
      Calculate first derivative of u^2 with respect to x.
      +
      virtual double computeDpDx(int i, int j) const
      Calculate first derivative of p with respect to x.
      Definition discretization.cpp:27
      +
      Create field variables and define limits for the indices.
      Definition staggered_grid.h:15
      +
      const std::array< double, 2 > meshWidth() const
      Get the length of a single cell in x and y directions.
      Definition staggered_grid.cpp:14
      +
      const std::array< int, 2 > nCells() const
      Get number of cells in x and y directions.
      Definition staggered_grid.cpp:19
      +
      + + + + diff --git a/documentation/html/doc.svg b/documentation/html/doc.svg new file mode 100644 index 00000000..0b928a53 --- /dev/null +++ b/documentation/html/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/documentation/html/docd.svg b/documentation/html/docd.svg new file mode 100644 index 00000000..ac18b275 --- /dev/null +++ b/documentation/html/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/documentation/html/donor__cell_8h_source.html b/documentation/html/donor__cell_8h_source.html new file mode 100644 index 00000000..a69ecec9 --- /dev/null +++ b/documentation/html/donor__cell_8h_source.html @@ -0,0 +1,123 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/discretization/donor_cell.h Source File + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      donor_cell.h
      +
      +
      +
      1#pragma once
      +
      2
      +
      3#include <array>
      +
      4#include <vector>
      +
      5#include <cmath>
      +
      6#include "discretization.h"
      +
      7
      +
      + +
      16{
      +
      17public:
      +
      25 DonorCell(std::array<int, 2> nCells, std::array<double, 2> meshWidth, double alpha);
      +
      26
      +
      31 double computeDu2Dx(int i, int j) const override;
      +
      36 double computeDv2Dy(int i, int j) const override;
      +
      41 double computeDuvDx(int i, int j) const override;
      +
      46 double computeDuvDy(int i, int j) const override;
      +
      47
      +
      48private:
      +
      49 const double alpha_;
      +
      50};
      +
      +
      Computes derivatives included in governing equations.
      Definition discretization.h:16
      +
      Discretizes the problem using the donor cell scheme.
      Definition donor_cell.h:16
      +
      double computeDv2Dy(int i, int j) const override
      Calculate first derivative of v^2 with respect to y with the donor cell Scheme.
      Definition donor_cell.cpp:49
      +
      double computeDu2Dx(int i, int j) const override
      Calculate first derivative of u^2 with respect to x with the donor cell Scheme.
      Definition donor_cell.cpp:36
      +
      double computeDuvDy(int i, int j) const override
      Calculate first derivative of u*v with respect to y with the donor cell Scheme.
      Definition donor_cell.cpp:22
      +
      DonorCell(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth, double alpha)
      Constructor.
      Definition donor_cell.cpp:3
      +
      double computeDuvDx(int i, int j) const override
      Calculate first derivative of u*v with respect to x with the donor cell Scheme.
      Definition donor_cell.cpp:8
      +
      const std::array< double, 2 > meshWidth() const
      Get the length of a single cell in x and y directions.
      Definition staggered_grid.cpp:14
      +
      const std::array< int, 2 > nCells() const
      Get number of cells in x and y directions.
      Definition staggered_grid.cpp:19
      +
      + + + + diff --git a/documentation/html/doxygen.css b/documentation/html/doxygen.css new file mode 100644 index 00000000..9193852a --- /dev/null +++ b/documentation/html/doxygen.css @@ -0,0 +1,2080 @@ +/* The standard CSS for doxygen 1.10.0*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--fragment-copy-ok-color: #2EC82E; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: black; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--fragment-copy-ok-color: #0EA80E; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: underline; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; + overflow-y: hidden; + position: relative; + min-height: 28px; + margin: 4px 4px 4px 2px; + padding: 2px 2px 3px 2px; + border: 1px solid var(--fragment-border-color); + background-color: var(--fragment-background-color); + border-radius : 2px; + color: var(--fragment-foreground-color); +} + +pre.fragment { + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: var(--font-family-monospace); +} + +.clipboard { + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; + overflow: auto; + fill: var(--fragment-foreground-color); + justify-content: center; + align-items: center; + cursor: pointer; +} + +.clipboard.success { + border: 1px solid var(--fragment-foreground-color); + border-radius: 4px; +} + +.fragment:hover .clipboard, .clipboard.success { + opacity: .28; +} + +.clipboard:hover, .clipboard.success { + opacity: 1 !important; +} + +.clipboard:active:not([class~=success]) svg { + transform: scale(.91); +} + +.clipboard.success svg { + fill: var(--fragment-copy-ok-color); +} + +.clipboard.success { + border-color: var(--fragment-copy-ok-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: var(--memdef-param-name-color); + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + +body { + scrollbar-color: var(--scrollbar-thumb-color) var(--scrollbar-background-color); +} + +::-webkit-scrollbar { + background-color: var(--scrollbar-background-color); + height: 12px; + width: 12px; +} +::-webkit-scrollbar-thumb { + border-radius: 6px; + box-shadow: inset 0 0 12px 12px var(--scrollbar-thumb-color); + border: solid 2px transparent; +} +::-webkit-scrollbar-corner { + background-color: var(--scrollbar-background-color); +} + diff --git a/documentation/html/doxygen.svg b/documentation/html/doxygen.svg new file mode 100644 index 00000000..79a76354 --- /dev/null +++ b/documentation/html/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/html/dynsections.js b/documentation/html/dynsections.js new file mode 100644 index 00000000..8f493264 --- /dev/null +++ b/documentation/html/dynsections.js @@ -0,0 +1,194 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +let dynsection = { + + // helper function + updateStripes : function() { + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); + }, + + toggleVisibility : function(linkObj) { + const base = $(linkObj).attr('id'); + const summary = $('#'+base+'-summary'); + const content = $('#'+base+'-content'); + const trigger = $('#'+base+'-trigger'); + const src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; + }, + + toggleLevel : function(level) { + $('table.directory tr').each(function() { + const l = this.id.split('_').length-1; + const i = $('#img'+this.id.substring(3)); + const a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + const id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = $(this).attr('data-start'); + const end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + const line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',codefold.plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); + }, +}; +/* @license-end */ diff --git a/documentation/html/field__variable_8h_source.html b/documentation/html/field__variable_8h_source.html new file mode 100644 index 00000000..7c9903a9 --- /dev/null +++ b/documentation/html/field__variable_8h_source.html @@ -0,0 +1,121 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/storage/field_variable.h Source File + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      field_variable.h
      +
      +
      +
      1#pragma once
      +
      2
      +
      3#include <array>
      +
      4#include <vector>
      +
      5#include <cmath>
      +
      6#include <iostream>
      +
      7#include "array2D.h"
      +
      8
      +
      +
      17class FieldVariable : public Array2D
      +
      18{
      +
      19public:
      +
      27 FieldVariable(std::array<int, 2> size, std::array<double, 2> origin, std::array<double, 2> meshWidth);
      +
      28
      +
      37 double interpolateAt(double x, double y) const;
      +
      38
      +
      44 double findAbsMax() const;
      +
      45
      +
      46private:
      +
      47 const std::array<double, 2> origin_;
      +
      48 const std::array<double, 2> meshWidth_;
      +
      49};
      +
      +
      This class represents a 2D array of double values.
      Definition array2D.h:16
      +
      std::array< int, 2 > size() const
      get size of array in x and y direction
      Definition array2D.cpp:39
      +
      Discretization of a scalar function.
      Definition field_variable.h:18
      +
      double interpolateAt(double x, double y) const
      Interpolates value of field variable in domain using x and y coordinates.
      Definition field_variable.cpp:12
      +
      double findAbsMax() const
      Find point in Array2D of Fieldvariable with maximum value.
      Definition field_variable.cpp:55
      +
      FieldVariable(std::array< int, 2 > size, std::array< double, 2 > origin, std::array< double, 2 > meshWidth)
      Constructor.
      Definition field_variable.cpp:4
      +
      + + + + diff --git a/documentation/html/files.html b/documentation/html/files.html new file mode 100644 index 00000000..af63bf73 --- /dev/null +++ b/documentation/html/files.html @@ -0,0 +1,112 @@ + + + + + + + +NumSim: File List + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + +
      + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      File List
      +
      +
      +
      Here is a list of all documented files with brief descriptions:
      +
      [detail level 123]
      + + + + + + + + + + + + + + + + + + + + + + + + + +
        src
        boundary
       boundary.h
       mask.h
        discretization
       central_differences.h
       discretization.h
       donor_cell.h
       staggered_grid.h
        output_writer
       output_writer.h
       output_writer_paraview.h
       output_writer_text.h
        settings_parser
       settings.h
        solver
       gauss_seidel.h
       pressure_solver.h
       sor.h
        storage
       array2D.h
       field_variable.h
        surface
       fluid_tracer.h
       computation.h
      +
      +
      + + + + diff --git a/documentation/html/fluid__tracer_8h_source.html b/documentation/html/fluid__tracer_8h_source.html new file mode 100644 index 00000000..a08ecfea --- /dev/null +++ b/documentation/html/fluid__tracer_8h_source.html @@ -0,0 +1,176 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/surface/fluid_tracer.h Source File + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      fluid_tracer.h
      +
      +
      +
      1#pragma once
      +
      2
      +
      3#include <iostream>
      +
      4#include <vector>
      +
      5#include <queue>
      +
      6#include <algorithm>
      +
      7#include <memory>
      +
      8#include <cmath>
      +
      9#include <cassert>
      +
      10
      +
      11#include "../discretization/discretization.h"
      +
      12#include "../boundary/boundary.h"
      +
      13
      +
      14
      +
      + +
      16 public:
      +
      17 FluidTracer(int numParticlesperCell,
      +
      18 std::shared_ptr<Discretization> discretization,
      +
      19 std::shared_ptr<Mask> mask);
      +
      20
      +
      21 // Mainly for testing purposes
      +
      22 FluidTracer(std::vector<double> x, std::vector<double> y,
      +
      23 std::shared_ptr<Discretization> discretization,
      +
      24 std::shared_ptr<Mask> mask);
      +
      25
      +
      35 void moveParticles(double dt);
      +
      36
      +
      43 void createParticles(double positionSourceX, double positionSourceY);
      +
      44
      +
      50 int getNumberOfParticles() const;
      +
      51
      +
      57 int getNumberOfParticles(int i, int j) const;
      +
      58
      +
      59
      +
      65 std::array<double, 2> getParticlePosition(int i) const;
      +
      66
      +
      67 std::array<int, 2> cellOfParticle(int i);
      +
      68 int val2CellX(double xVal);
      +
      69 int val2CellY(double yVal);
      +
      70
      +
      71
      +
      72
      +
      73 // Only test
      +
      74 std::array<double, 2> updateParticle(int i, std::array<int, 2> idx, double dt, std::array<double,2> vel, int depth);
      +
      75 std::array<double, 2> moveParticles(double dt, std::array<double, 2> vel);
      +
      76
      +
      77 void printParticles();
      +
      78
      +
      79
      +
      80 private:
      +
      81 void initializeHomogenousParticleDistribution();
      +
      85 void initializeFluidCell(int i, int j, int idx);
      +
      86
      +
      87
      +
      88 // Helper for move Particles
      +
      89 int getThresholdParticlesFluidCell();
      +
      90 std::array<int, 2> updateParticle(int i, std::array<int, 2> idx, double dt, std::array<double,2> vel);
      +
      91 void resetVelocityInAirCells();
      +
      92
      +
      93
      +
      94 int numParticles_;
      +
      95 int numParticlesPerCell_; // <! is usually because of ceil larger then numParticlesPerCell>
      +
      96
      +
      97 // aspect ratio e.g. 1.0 for square cells and 0.5 for (dx = 2*dy) cells
      +
      98 double seedRelationDyDx_;
      +
      99 // how many particles are placed in each direction per cell
      +
      100 int n_x, n_y;
      +
      101 // inital count of fluid cells
      +
      102 int numFluidCells_;
      +
      103
      +
      104 std::shared_ptr<Discretization> discretization_;
      +
      105 std::shared_ptr<Mask> mask_;
      +
      106 std::vector<double> x_;
      +
      107 std::vector<double> y_;
      +
      108 std::vector<int> currentParticlesPerCell_;
      +
      109
      +
      110};
      +
      +
      Definition fluid_tracer.h:15
      +
      std::array< double, 2 > getParticlePosition(int i) const
      Get the Particle Position, index starts at 0.
      Definition fluid_tracer.cpp:93
      +
      void moveParticles(double dt)
      Update the position of the particles according to the velocity field and sets mask accordingly.
      Definition fluid_tracer.cpp:116
      +
      void createParticles(double positionSourceX, double positionSourceY)
      can be used to create a source cell for particles
      Definition fluid_tracer.cpp:61
      +
      int getNumberOfParticles() const
      Total number of Particles.
      Definition fluid_tracer.cpp:73
      +
      + + + + diff --git a/documentation/html/folderclosed.svg b/documentation/html/folderclosed.svg new file mode 100644 index 00000000..b04bed2e --- /dev/null +++ b/documentation/html/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/documentation/html/folderclosedd.svg b/documentation/html/folderclosedd.svg new file mode 100644 index 00000000..52f0166a --- /dev/null +++ b/documentation/html/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/documentation/html/folderopen.svg b/documentation/html/folderopen.svg new file mode 100644 index 00000000..f6896dd2 --- /dev/null +++ b/documentation/html/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/documentation/html/folderopend.svg b/documentation/html/folderopend.svg new file mode 100644 index 00000000..2d1f06e7 --- /dev/null +++ b/documentation/html/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/documentation/html/functions.html b/documentation/html/functions.html new file mode 100644 index 00000000..dd39fa60 --- /dev/null +++ b/documentation/html/functions.html @@ -0,0 +1,312 @@ + + + + + + + +NumSim: Class Members + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + +
      + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      Here is a list of all documented class members with links to the class documentation for each member:
      + +

      - a -

      + + +

      - b -

      + + +

      - c -

      + + +

      - d -

      + + +

      - e -

      + + +

      - f -

      + + +

      - g -

      + + +

      - i -

      + + +

      - j -

      + + +

      - l -

      + + +

      - m -

      + + +

      - n -

      + + +

      - o -

      + + +

      - p -

      + + +

      - r -

      + + +

      - s -

      + + +

      - t -

      + + +

      - u -

      + + +

      - v -

      + + +

      - w -

      +
      + + + + diff --git a/documentation/html/functions_enum.html b/documentation/html/functions_enum.html new file mode 100644 index 00000000..6e003ad5 --- /dev/null +++ b/documentation/html/functions_enum.html @@ -0,0 +1,83 @@ + + + + + + + +NumSim: Class Members - Enumerations + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + +
      + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      Here is a list of all documented enums with links to the class documentation for each member:
        +
      • CellType : Mask
      • +
      +
      + + + + diff --git a/documentation/html/functions_func.html b/documentation/html/functions_func.html new file mode 100644 index 00000000..55ee92e0 --- /dev/null +++ b/documentation/html/functions_func.html @@ -0,0 +1,245 @@ + + + + + + + +NumSim: Class Members - Functions + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + +
      + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      Here is a list of all documented functions with links to the class documentation for each member:
      + +

      - a -

      + + +

      - b -

      + + +

      - c -

      + + +

      - d -

      + + +

      - f -

      + + +

      - g -

      + + +

      - i -

      + + +

      - l -

      + + +

      - m -

      + + +

      - n -

      + + +

      - o -

      + + +

      - p -

      + + +

      - r -

      + + +

      - s -

      + + +

      - u -

      + + +

      - v -

      + + +

      - w -

      +
      + + + + diff --git a/documentation/html/functions_vars.html b/documentation/html/functions_vars.html new file mode 100644 index 00000000..8ff28357 --- /dev/null +++ b/documentation/html/functions_vars.html @@ -0,0 +1,208 @@ + + + + + + + +NumSim: Class Members - Variables + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + +
      + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      Here is a list of all documented variables with links to the class documentation for each member:
      + +

      - a -

      + + +

      - b -

      + + +

      - c -

      + + +

      - d -

      + + +

      - e -

      + + +

      - f -

      + + +

      - g -

      + + +

      - i -

      + + +

      - j -

      + + +

      - m -

      + + +

      - n -

      + + +

      - o -

      + + +

      - p -

      + + +

      - r -

      + + +

      - s -

      + + +

      - t -

      + + +

      - u -

      + + +

      - v -

      +
      + + + + diff --git a/documentation/html/gauss__seidel_8h_source.html b/documentation/html/gauss__seidel_8h_source.html new file mode 100644 index 00000000..6d550217 --- /dev/null +++ b/documentation/html/gauss__seidel_8h_source.html @@ -0,0 +1,113 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/solver/gauss_seidel.h Source File + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      gauss_seidel.h
      +
      +
      +
      1#pragma once
      +
      2
      +
      3#include "pressure_solver.h"
      +
      4#include <iostream>
      +
      5
      +
      + +
      12{
      +
      13
      +
      14public:
      +
      22 GaussSeidel(const std::shared_ptr<Discretization> &data,
      +
      23 double epsilon,
      +
      24 int maximumNumberOfIterations,
      +
      25 std::shared_ptr<Boundary> boundary);
      +
      30 void solve() override;
      +
      31};
      +
      +
      Standard Gauss-Seidel solver.
      Definition gauss_seidel.h:12
      +
      void solve() override
      override function that starts solver.
      Definition gauss_seidel.cpp:10
      +
      GaussSeidel(const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
      Constructor.
      Definition gauss_seidel.cpp:3
      +
      Solves the Poisson problem for the pressure.
      Definition pressure_solver.h:21
      +
      + + + + diff --git a/documentation/html/hierarchy.html b/documentation/html/hierarchy.html new file mode 100644 index 00000000..fc05bc8d --- /dev/null +++ b/documentation/html/hierarchy.html @@ -0,0 +1,105 @@ + + + + + + + +NumSim: Class Hierarchy + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + +
      + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      Class Hierarchy
      +
      +
      +
      This inheritance list is sorted roughly, but not completely, alphabetically:
      +
      [detail level 123]
      + + + + + + + + + + + + + + + + + + +
       CArray2DThis class represents a 2D array of double values
       CFieldVariableDiscretization of a scalar function
       CBoundaryClass responsible to caluclate boundary conditions
       CComputationComputation of Simulation
       CFluidTracer
       CSettings::LineContentContains the content of a single line in a file
       CMask
       COutputWriterInteface class for writing simulation data output
       COutputWriterParaviewWrite *.vti files that can be viewed with ParaView
       COutputWriterTextWrite *.txt files that are useful for debugging
       CPressureSolverSolves the Poisson problem for the pressure
       CGaussSeidelStandard Gauss-Seidel solver
       CSORSuccessive over-relaxation solver
       CSettingsAll settings that parametrize a simulation run
       CStaggeredGridCreate field variables and define limits for the indices
       CDiscretizationComputes derivatives included in governing equations
       CCentralDifferencesDiscretizes the problem using the central differences scheme
       CDonorCellDiscretizes the problem using the donor cell scheme
      +
      +
      + + + + diff --git a/documentation/html/index.html b/documentation/html/index.html new file mode 100644 index 00000000..ea3c2329 --- /dev/null +++ b/documentation/html/index.html @@ -0,0 +1,83 @@ + + + + + + + +NumSim: Main Page + + + + + + + + + + +
      +
      + + + + + + +
      +
      NumSim 1.0 +
      +
      Numerical Simulation of fluid-flow
      +
      +
      + + + + + + + +
      + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + +
      +
      NumSim Documentation
      +
      +
      +
      + + + + diff --git a/documentation/html/jquery.js b/documentation/html/jquery.js new file mode 100644 index 00000000..0ac00e20 --- /dev/null +++ b/documentation/html/jquery.js @@ -0,0 +1,91 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
      ",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n

  • "),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
    ').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$});/*! + Cookie helper functions + Copyright (c) 2023 Dimitri van Heesch + Released under MIT license. +*/ +let Cookie = { + cookie_namespace: 'doxygen_', + + readSetting(cookie,defVal) { + if (window.chrome) { + const val = localStorage.getItem(this.cookie_namespace+cookie) || + sessionStorage.getItem(this.cookie_namespace+cookie); + if (val) return val; + } else { + let myCookie = this.cookie_namespace+cookie+"="; + if (document.cookie) { + const index = document.cookie.indexOf(myCookie); + if (index != -1) { + const valStart = index + myCookie.length; + let valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + return document.cookie.substring(valStart, valEnd); + } + } + } + return defVal; + }, + + writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete + if (window.chrome) { + if (days==0) { + sessionStorage.setItem(this.cookie_namespace+cookie,val); + } else { + localStorage.setItem(this.cookie_namespace+cookie,val); + } + } else { + let date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; + document.cookie = this.cookie_namespace + cookie + "=" + + val + "; SameSite=Lax;" + expiration + "path=/"; + } + }, + + eraseSetting(cookie) { + if (window.chrome) { + if (localStorage.getItem(this.cookie_namespace+cookie)) { + localStorage.removeItem(this.cookie_namespace+cookie); + } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { + sessionStorage.removeItem(this.cookie_namespace+cookie); + } + } else { + this.writeSetting(cookie,'',-1); + } + }, +} diff --git a/documentation/html/mask_8h_source.html b/documentation/html/mask_8h_source.html new file mode 100644 index 00000000..857148fa --- /dev/null +++ b/documentation/html/mask_8h_source.html @@ -0,0 +1,237 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/boundary/mask.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    mask.h
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include <vector>
    +
    4#include <array>
    +
    5#include <cassert>
    +
    6#include <cmath>
    +
    7
    +
    8#include <iostream>
    +
    9#include <iomanip>
    +
    10#include <png.h>
    +
    11#include <fstream>
    +
    12#include "../settings_parser/settings.h"
    +
    13
    +
    +
    14class Mask
    +
    15{
    +
    16public:
    +
    22 Mask(Settings settings);
    +
    23
    +
    + +
    25 {
    +
    26 FLUID_DROPLET = 0,
    +
    27
    +
    28 FLUID_SINGLE_LEFT = 1,
    +
    29 FLUID_SINGLE_TOP = 2,
    +
    30 FLUID_SINGLE_RIGHT = 4,
    +
    31 FLUID_SINGLE_BOTTOM = 8,
    +
    32
    +
    33 FLUID_CORNER_BOTTOM_LEFT = 6,
    +
    34 FLUID_CORNER_TOP_LEFT = 12,
    +
    35 FLUID_CORNER_TOP_RIGHT = 9,
    +
    36 FLUID_CORNER_BOTTOM_RIGHT = 3,
    +
    37
    +
    38 FLUID_COLUMN_HORIZONTAL = 5,
    +
    39 FLUID_COLUMN_VERTICAL = 10,
    +
    40
    +
    41 FLUID_BORDER_LEFT = 14,
    +
    42 FLUID_BORDER_TOP = 13,
    +
    43 FLUID_BORDER_RIGHT = 11,
    +
    44 FLUID_BORDER_BOTTOM = 7,
    +
    45
    +
    46 FLUID = 15,
    +
    47 FLUID_TYPE = 50,
    +
    48 AIR = 64,
    +
    49
    +
    50 OBSTACLE = 99,
    +
    51 OBSTACLE_INSIDE = 100,
    +
    52
    +
    53 OBSTACLE_BORDER_LEFT = 101,
    +
    54 OBSTACLE_BORDER_TOP = 102,
    +
    55 OBSTACLE_CORNER_TOP_LEFT = 103,
    +
    56 OBSTACLE_BORDER_RIGHT = 104,
    +
    57 OBSTACLE_CORNER_TOP_RIGHT = 106,
    +
    58 OBSTACLE_BORDER_BOTTOM = 108,
    +
    59 OBSTACLE_CORNER_BOTTOM_LEFT = 109,
    +
    60 OBSTACLE_CORNER_BOTTOM_RIGHT = 112,
    +
    61
    +
    62 DOMAIN_BOUNDARY = 200,
    +
    63
    +
    64 DOMAIN_LEFT_NOSLIP = 201,
    +
    65 DOMAIN_TOP_NOSLIP = 202,
    +
    66 DOMAIN_RIGHT_NOSLIP = 203,
    +
    67 DOMAIN_BOTTOM_NOSLIP = 204,
    +
    68
    +
    69 DOMAIN_LEFT_PRESSURE = 205,
    +
    70 DOMAIN_TOP_PRESSURE = 206,
    +
    71 DOMAIN_RIGHT_PRESSURE = 207,
    +
    72 DOMAIN_BOTTOM_PRESSURE = 208,
    +
    73 };
    +
    +
    74
    +
    82 int &operator()(int i, int j);
    +
    83
    +
    91 int operator()(int i, int j) const;
    +
    92
    +
    96 std::array<int, 2> size() const;
    +
    97
    +
    102 void resetMask();
    +
    103
    +
    104 // ********************************************************
    +
    105 // R E Q U E S T S
    +
    106
    +
    115 bool isFluid(int i, int j) const;
    +
    116
    +
    123 bool isObstacle(int i, int j) const;
    +
    124
    +
    133 bool isAir(int i, int j) const;
    +
    134
    +
    144 bool isInnerFluid(int i, int j) const;
    +
    145
    +
    153 bool isDomainBoundary(int i, int j) const;
    +
    154
    +
    162 bool isObstacleBoundary(int i, int j) const;
    +
    163
    +
    171 bool isFluidBoundary(int i, int j) const;
    +
    172
    +
    179 int getNumberOfFluidCells() const;
    +
    180
    + +
    187
    + +
    194
    +
    200 void setDomainBC();
    +
    201
    +
    205 void setObstacleBC();
    +
    206
    +
    210 void setFluidBC();
    +
    211
    +
    215 void printMask() const;
    +
    216
    +
    217protected:
    +
    218 std::array<int, 2> size_;
    +
    219 std::vector<int> data_;
    +
    220 std::vector<int> boundary_list;
    + +
    222 int forbiddenObstacleFluidCombinations[7] = {105, 107, 110, 111, 113, 114, 115};
    +
    223};
    +
    +
    Definition mask.h:15
    +
    bool isFluidBoundary(int i, int j) const
    Cecks if cell at index is fluid boundary.
    Definition mask.cpp:70
    +
    int getNumberOfFluidCells() const
    number of fluid cells
    Definition mask.cpp:78
    +
    void printMask() const
    print mask enums to terminal
    Definition mask.cpp:304
    +
    std::vector< int > boundary_list
    stores the indices of the boundary cells
    Definition mask.h:220
    +
    void setFluidBC()
    sets enums for all fluid cells that belong are located at a surface
    Definition mask.cpp:206
    +
    bool isObstacle(int i, int j) const
    True if Cell at (i,j) is either obstacle or boundary.
    Definition mask.cpp:52
    +
    Mask(Settings settings)
    constructor.
    Definition mask.cpp:3
    +
    bool isInnerFluid(int i, int j) const
    Cell at (i,j) is a inner fluid cell or not.
    Definition mask.cpp:74
    +
    void setObstacleBC()
    sets enums for all cells that belong to an obstacle
    Definition mask.cpp:272
    +
    int & operator()(int i, int j)
    set array value. Overloads the () operator
    Definition mask.cpp:23
    +
    void makeRectangularObstacle()
    creates rectangulat objecct inside domain
    Definition mask.cpp:92
    +
    bool isAir(int i, int j) const
    Cell at (i,j) is a air cell or not.
    Definition mask.cpp:56
    +
    std::array< int, 2 > size_
    size of array in x and y direction
    Definition mask.h:218
    +
    bool isDomainBoundary(int i, int j) const
    Cecks if cell at index is domain boundary.
    Definition mask.cpp:61
    +
    void setDomainBC()
    sets enums for all cells that belong to domain boundary
    Definition mask.cpp:223
    +
    bool isFluid(int i, int j) const
    Cell at (i,j) is fluid or not.
    Definition mask.cpp:48
    +
    std::array< int, 2 > size() const
    get size of array in x and y direction
    Definition mask.cpp:33
    +
    int forbiddenObstacleFluidCombinations[7]
    enums that singnal forbidden obstacle - fluid cell combinations
    Definition mask.h:222
    +
    void resetMask()
    sets all not obstacle cells to air
    Definition mask.cpp:37
    +
    Settings settings_
    settings entity
    Definition mask.h:221
    +
    std::vector< int > data_
    storage array values, in row-major order
    Definition mask.h:219
    +
    void createMaskFromPNGBitMap()
    creates mask by reading in bitmap
    Definition mask.cpp:117
    +
    CellType
    < enums used to encode cell type and boundary condition
    Definition mask.h:25
    +
    bool isObstacleBoundary(int i, int j) const
    Cecks if cell at index is obstacle boundary.
    Definition mask.cpp:65
    +
    All settings that parametrize a simulation run.
    Definition settings.h:14
    +
    + + + + diff --git a/documentation/html/menu.js b/documentation/html/menu.js new file mode 100644 index 00000000..717761d0 --- /dev/null +++ b/documentation/html/menu.js @@ -0,0 +1,134 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + let result=''; + if ('children' in data) { + result+='
      '; + for (let i in data.children) { + let url; + const link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
    • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
    • '; + } + result+='
    '; + } + return result; + } + let searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
    '+ + '
    '+ + '
     '+ + ''+ + '
    '+ + '
    '+ + '
    '+ + '
    '; + } else { + searchBoxHtml='
    '+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
    '; + } + } + + $('#main-nav').before('
    '+ + ''+ + ''+ + '
    '); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + const $mainMenuState = $('#main-menu-state'); + let prevWidth = 0; + if ($mainMenuState.length) { + const initResizableIfExists = function() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function() { + const $menu = $('#main-menu'); + let options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = () => $menu.css('display', 'block'); + $menu.hide().slideDown(options); + } else { + options['complete'] = () => $menu.css('display', 'none'); + $menu.show().slideUp(options); + } + }); + // set default menu visibility + const resetState = function() { + const $menu = $('#main-menu'); + const newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/documentation/html/menudata.js b/documentation/html/menudata.js new file mode 100644 index 00000000..614ce7b1 --- /dev/null +++ b/documentation/html/menudata.js @@ -0,0 +1,92 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Classes",url:"annotated.html",children:[ +{text:"Class List",url:"annotated.html"}, +{text:"Class Index",url:"classes.html"}, +{text:"Class Hierarchy",url:"hierarchy.html"}, +{text:"Class Members",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions.html#index_b"}, +{text:"c",url:"functions.html#index_c"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"f",url:"functions.html#index_f"}, +{text:"g",url:"functions.html#index_g"}, +{text:"i",url:"functions.html#index_i"}, +{text:"j",url:"functions.html#index_j"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"u",url:"functions.html#index_u"}, +{text:"v",url:"functions.html#index_v"}, +{text:"w",url:"functions.html#index_w"}]}, +{text:"Functions",url:"functions_func.html",children:[ +{text:"a",url:"functions_func.html#index_a"}, +{text:"b",url:"functions_func.html#index_b"}, +{text:"c",url:"functions_func.html#index_c"}, +{text:"d",url:"functions_func.html#index_d"}, +{text:"f",url:"functions_func.html#index_f"}, +{text:"g",url:"functions_func.html#index_g"}, +{text:"i",url:"functions_func.html#index_i"}, +{text:"l",url:"functions_func.html#index_l"}, +{text:"m",url:"functions_func.html#index_m"}, +{text:"n",url:"functions_func.html#index_n"}, +{text:"o",url:"functions_func.html#index_o"}, +{text:"p",url:"functions_func.html#index_p"}, +{text:"r",url:"functions_func.html#index_r"}, +{text:"s",url:"functions_func.html#index_s"}, +{text:"u",url:"functions_func.html#index_u"}, +{text:"v",url:"functions_func.html#index_v"}, +{text:"w",url:"functions_func.html#index_w"}]}, +{text:"Variables",url:"functions_vars.html",children:[ +{text:"a",url:"functions_vars.html#index_a"}, +{text:"b",url:"functions_vars.html#index_b"}, +{text:"c",url:"functions_vars.html#index_c"}, +{text:"d",url:"functions_vars.html#index_d"}, +{text:"e",url:"functions_vars.html#index_e"}, +{text:"f",url:"functions_vars.html#index_f"}, +{text:"g",url:"functions_vars.html#index_g"}, +{text:"i",url:"functions_vars.html#index_i"}, +{text:"j",url:"functions_vars.html#index_j"}, +{text:"m",url:"functions_vars.html#index_m"}, +{text:"n",url:"functions_vars.html#index_n"}, +{text:"o",url:"functions_vars.html#index_o"}, +{text:"p",url:"functions_vars.html#index_p"}, +{text:"r",url:"functions_vars.html#index_r"}, +{text:"s",url:"functions_vars.html#index_s"}, +{text:"t",url:"functions_vars.html#index_t"}, +{text:"u",url:"functions_vars.html#index_u"}, +{text:"v",url:"functions_vars.html#index_v"}]}, +{text:"Enumerations",url:"functions_enum.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}]}]} diff --git a/documentation/html/minus.svg b/documentation/html/minus.svg new file mode 100644 index 00000000..f70d0c1a --- /dev/null +++ b/documentation/html/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/documentation/html/minusd.svg b/documentation/html/minusd.svg new file mode 100644 index 00000000..5f8e8796 --- /dev/null +++ b/documentation/html/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/documentation/html/nav_f.png b/documentation/html/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/documentation/html/nav_fd.png b/documentation/html/nav_fd.png new file mode 100644 index 0000000000000000000000000000000000000000..032fbdd4c54f54fa9a2e6423b94ef4b2ebdfaceb GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQU#tajv*C{Z|C~*H7f|XvG1G8 zt7aS*L7xwMeS}!z6R#{C5tIw-s~AJ==F^i}x3XyJseHR@yF& zerFf(Zf;Dd{+(0lDIROL@Sj-Ju2JQ8&-n%4%q?>|^bShc&lR?}7HeMo@BDl5N(aHY Uj$gdr1MOz;boFyt=akR{0D!zeaR2}S literal 0 HcmV?d00001 diff --git a/documentation/html/nav_g.png b/documentation/html/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL6W-eg#Jd_@e6*DPn)w;=|1H}Zvm9l6xXXB%>yL=NQU;mg M>FVdQ&MBb@0Bdt1Qvd(} literal 0 HcmV?d00001 diff --git a/documentation/html/open.png b/documentation/html/open.png new file mode 100644 index 0000000000000000000000000000000000000000..30f75c7efe2dd0c9e956e35b69777a02751f048b GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/output_writer/output_writer.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    output_writer.h
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include "../discretization/discretization.h"
    +
    4
    +
    5#include <memory>
    +
    6#include <iostream>
    +
    7#include <cstring>
    +
    8
    +
    + +
    14{
    +
    15public:
    +
    21 OutputWriter(std::shared_ptr<Discretization> discretization);
    +
    22
    +
    30 virtual void writeFile(double currentTime) = 0;
    +
    31
    +
    32protected:
    +
    33 std::shared_ptr<Discretization> discretization_;
    +
    34 int fileNo_;
    +
    35};
    +
    +
    Inteface class for writing simulation data output.
    Definition output_writer.h:14
    +
    std::shared_ptr< Discretization > discretization_
    shared pointer, discretization object containing data to be written to file
    Definition output_writer.h:33
    +
    OutputWriter(std::shared_ptr< Discretization > discretization)
    Constructor.
    Definition output_writer.cpp:3
    +
    int fileNo_
    a counter that increments for every file written to disk
    Definition output_writer.h:34
    +
    virtual void writeFile(double currentTime)=0
    Write current velocities to file.
    +
    + + + + diff --git a/documentation/html/output__writer__paraview_8h_source.html b/documentation/html/output__writer__paraview_8h_source.html new file mode 100644 index 00000000..dc80fc48 --- /dev/null +++ b/documentation/html/output__writer__paraview_8h_source.html @@ -0,0 +1,128 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/output_writer/output_writer_paraview.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    output_writer_paraview.h
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include "output_writer.h"
    +
    4
    +
    5#include <vtkSmartPointer.h>
    +
    6#include <vtkXMLImageDataWriter.h>
    +
    7#include <vtkImageData.h>
    +
    8#include <vtkDoubleArray.h>
    +
    9#include <vtkPointData.h>
    +
    10#include <cmath>
    +
    11
    +
    12#include <memory>
    +
    13#include <iostream>
    +
    14#include "../boundary/mask.h"
    +
    15#include "../surface/fluid_tracer.h"
    +
    16
    +
    + +
    26{
    +
    27public:
    +
    33 OutputWriterParaview(std::shared_ptr<Discretization> discretization,
    +
    34 std::shared_ptr<Mask> mask,
    +
    35 std::shared_ptr<FluidTracer> fluidTracer);
    +
    36
    +
    42 void writeFile(double currentTime);
    +
    43
    +
    44private:
    +
    45 vtkSmartPointer<vtkXMLImageDataWriter> vtkWriter_;
    +
    46 std::shared_ptr<Mask> mask_;
    +
    47 std::shared_ptr<FluidTracer> fluidTracer_;
    +
    48};
    +
    +
    Write *.vti files that can be viewed with ParaView.
    Definition output_writer_paraview.h:26
    +
    void writeFile(double currentTime)
    Write current velocities to file, filename is output_<count>.vti.
    Definition output_writer_paraview.cpp:11
    +
    OutputWriterParaview(std::shared_ptr< Discretization > discretization, std::shared_ptr< Mask > mask, std::shared_ptr< FluidTracer > fluidTracer)
    Constructor.
    Definition output_writer_paraview.cpp:3
    +
    Inteface class for writing simulation data output.
    Definition output_writer.h:14
    +
    + + + + diff --git a/documentation/html/output__writer__text_8h_source.html b/documentation/html/output__writer__text_8h_source.html new file mode 100644 index 00000000..4709d143 --- /dev/null +++ b/documentation/html/output__writer__text_8h_source.html @@ -0,0 +1,116 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/output_writer/output_writer_text.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    output_writer_text.h
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include "output_writer.h"
    +
    4#include <iostream>
    +
    5#include <fstream>
    +
    6#include <sstream>
    +
    7#include <iomanip>
    +
    8
    +
    + +
    17{
    +
    18public:
    + +
    23
    +
    31 void writeFile(double currentTime);
    +
    32
    +
    38 void writePressureFile();
    +
    39};
    +
    +
    Write *.txt files that are useful for debugging.
    Definition output_writer_text.h:17
    +
    void writeFile(double currentTime)
    Write current velocities to file.
    Definition output_writer_text.cpp:3
    +
    void writePressureFile()
    Write only current values of pressure to file.
    Definition output_writer_text.cpp:177
    +
    Inteface class for writing simulation data output.
    Definition output_writer.h:14
    +
    OutputWriter(std::shared_ptr< Discretization > discretization)
    Constructor.
    Definition output_writer.cpp:3
    +
    + + + + diff --git a/documentation/html/plus.svg b/documentation/html/plus.svg new file mode 100644 index 00000000..07520165 --- /dev/null +++ b/documentation/html/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/documentation/html/plusd.svg b/documentation/html/plusd.svg new file mode 100644 index 00000000..0c65bfe9 --- /dev/null +++ b/documentation/html/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/documentation/html/pressure__solver_8h_source.html b/documentation/html/pressure__solver_8h_source.html new file mode 100644 index 00000000..37705c28 --- /dev/null +++ b/documentation/html/pressure__solver_8h_source.html @@ -0,0 +1,148 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/solver/pressure_solver.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    pressure_solver.h
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include <math.h>
    +
    4#include <iostream>
    +
    5#include <memory>
    +
    6
    +
    7#include "../storage/field_variable.h"
    +
    8#include "../discretization/discretization.h"
    +
    9#include "../boundary/boundary.h"
    +
    10
    +
    11
    +
    + +
    21{
    +
    22public:
    +
    31 PressureSolver(std::shared_ptr<Discretization> discretization,
    +
    32 double epsilon,
    +
    33 int maximumNumberOfIterations,
    +
    34 std::shared_ptr<Boundary> boundary);
    +
    35
    +
    40 virtual void solve() = 0;
    +
    41
    +
    42 double dx2, dy2;
    +
    43
    +
    44protected:
    +
    51 void setBoundaryValues();
    +
    52
    +
    56 double calculateResiduum();
    +
    57
    +
    58 int i_beg;
    +
    59 int i_end;
    +
    60 int j_beg;
    +
    61 int j_end;
    +
    62
    +
    63 std::shared_ptr<Discretization> discretization_;
    +
    64 std::shared_ptr<Boundary> boundary_;
    +
    65
    +
    66 double epsilon_;
    +
    67
    + +
    69};
    +
    +
    Solves the Poisson problem for the pressure.
    Definition pressure_solver.h:21
    +
    std::shared_ptr< Boundary > boundary_
    object managing boundary for obstacle and surface tension
    Definition pressure_solver.h:64
    +
    PressureSolver(std::shared_ptr< Discretization > discretization, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary)
    Constructor.
    Definition pressure_solver.cpp:5
    +
    double epsilon_
    tolerance for the solver
    Definition pressure_solver.h:66
    +
    double dy2
    squared mesh widths
    Definition pressure_solver.h:42
    +
    int i_end
    end of loop for rhs in x direction
    Definition pressure_solver.h:59
    +
    void setBoundaryValues()
    Set the Boundary Values.
    Definition pressure_solver.cpp:28
    +
    virtual void solve()=0
    virtual function that starts solver.
    +
    int j_beg
    begin of loop for rhs in y direction
    Definition pressure_solver.h:60
    +
    int j_end
    end of loop for rhs in y direction
    Definition pressure_solver.h:61
    +
    int i_beg
    begin of loop for rhs in x direction
    Definition pressure_solver.h:58
    +
    int maximumNumberOfIterations_
    maximum number of iterations
    Definition pressure_solver.h:68
    +
    std::shared_ptr< Discretization > discretization_
    object holding the needed field variables for rhs and p
    Definition pressure_solver.h:63
    +
    double calculateResiduum()
    calculate residuum of current time step
    Definition pressure_solver.cpp:33
    +
    + + + + diff --git a/documentation/html/search/all_0.js b/documentation/html/search/all_0.js new file mode 100644 index 00000000..d432d029 --- /dev/null +++ b/documentation/html/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['alpha_0',['alpha',['../structSettings.html#a8b3721d24a5417caa0f2ad6f5eb85782',1,'Settings']]], + ['array2d_1',['array2d',['../classArray2D.html',1,'Array2D'],['../classArray2D.html#a16521417dfdf67ec694bfb7747df9000',1,'Array2D::Array2D()']]] +]; diff --git a/documentation/html/search/all_1.js b/documentation/html/search/all_1.js new file mode 100644 index 00000000..257f986e --- /dev/null +++ b/documentation/html/search/all_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['boundary_0',['boundary',['../classBoundary.html',1,'Boundary'],['../classBoundary.html#a4c78a28ad0839810f15229382f642cf1',1,'Boundary::Boundary()']]], + ['boundary_5f_1',['boundary_',['../classPressureSolver.html#a0b17b46580d259e4bb3a05486bc06a60',1,'PressureSolver']]], + ['boundary_5flist_2',['boundary_list',['../classMask.html#a3c5a51f6d03bb4a5e1742537a22ec441',1,'Mask']]] +]; diff --git a/documentation/html/search/all_10.js b/documentation/html/search/all_10.js new file mode 100644 index 00000000..b7e0cc14 --- /dev/null +++ b/documentation/html/search/all_10.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['tau_0',['tau',['../structSettings.html#adaa611dc8c075474d40d7149afd310d1',1,'Settings']]] +]; diff --git a/documentation/html/search/all_11.js b/documentation/html/search/all_11.js new file mode 100644 index 00000000..670a9233 --- /dev/null +++ b/documentation/html/search/all_11.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['u_0',['u',['../classStaggeredGrid.html#a87cee12621c641ab143a8b1a61b2ef7e',1,'StaggeredGrid::u() const'],['../classStaggeredGrid.html#a0324ce4d1fe2343d8aa9514e460cc556',1,'StaggeredGrid::u(int i, int j) const'],['../classStaggeredGrid.html#a0ed62d6752b6b2b3ead5f654b515cd12',1,'StaggeredGrid::u(int i, int j)']]], + ['u_5f_1',['u_',['../classStaggeredGrid.html#adcef36b4ce8cc6843a2b6f603b62c763',1,'StaggeredGrid']]], + ['uibegin_2',['uIBegin',['../classStaggeredGrid.html#a31e2d3a0b6e03685380810a7c2f323e1',1,'StaggeredGrid']]], + ['uiend_3',['uIEnd',['../classStaggeredGrid.html#a641e473d72e1d02ba3de1c16e9d0d332',1,'StaggeredGrid']]], + ['ujbegin_4',['uJBegin',['../classStaggeredGrid.html#a9b0e97704e1871441a8e713ecaa2cff5',1,'StaggeredGrid']]], + ['ujend_5',['uJEnd',['../classStaggeredGrid.html#a3393aa91b17054d2d700de308ae25632',1,'StaggeredGrid']]], + ['updateboundary_6',['updateBoundary',['../classBoundary.html#a9910a68c5dec5845ef4cdde98e680155',1,'Boundary']]], + ['usedonorcell_7',['useDonorCell',['../structSettings.html#a05bd5ffa1e1b48f5dc99878538596db3',1,'Settings']]], + ['usefluidtracer_8',['useFluidTracer',['../structSettings.html#a7f3405eef6ef103b60e7c2b01088c5ec',1,'Settings']]] +]; diff --git a/documentation/html/search/all_12.js b/documentation/html/search/all_12.js new file mode 100644 index 00000000..72fb9675 --- /dev/null +++ b/documentation/html/search/all_12.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['v_0',['v',['../classStaggeredGrid.html#a26e478abba632554652c9e05a279d1ca',1,'StaggeredGrid::v() const'],['../classStaggeredGrid.html#ac052d8803ff950aee04b86ac026c516b',1,'StaggeredGrid::v(int i, int j) const'],['../classStaggeredGrid.html#a7746f703f32c2f20a4c77246eebac697',1,'StaggeredGrid::v(int i, int j)']]], + ['v_5f_1',['v_',['../classStaggeredGrid.html#a20ec43568fe937b194561e21a0b84ad9',1,'StaggeredGrid']]], + ['value_2',['value',['../structSettings_1_1LineContent.html#a0bb96393366f2e5035379ab5b99d3ab2',1,'Settings::LineContent']]], + ['vibegin_3',['vIBegin',['../classStaggeredGrid.html#ace7bf8cb1d279131739d5d12de302d09',1,'StaggeredGrid']]], + ['viend_4',['vIEnd',['../classStaggeredGrid.html#aa5a44aa088b5a7923fa952af1ecb5778',1,'StaggeredGrid']]], + ['vjbegin_5',['vJBegin',['../classStaggeredGrid.html#a7f8468d672411c0e3a5eeb67788fc826',1,'StaggeredGrid']]], + ['vjend_6',['vJEnd',['../classStaggeredGrid.html#ab67e8d9d8d76d34fb02d4d644f0b3795',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/all_13.js b/documentation/html/search/all_13.js new file mode 100644 index 00000000..9578483c --- /dev/null +++ b/documentation/html/search/all_13.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['writefile_0',['writefile',['../classOutputWriter.html#ac625c204affdc05919388a3549c2e945',1,'OutputWriter::writeFile()'],['../classOutputWriterParaview.html#a9e203b63d0e2f26ad53d18ee1821c6bb',1,'OutputWriterParaview::writeFile()'],['../classOutputWriterText.html#a25a12ea2524fc34e9acb19ef1f4c7431',1,'OutputWriterText::writeFile(double currentTime)']]], + ['writepressurefile_1',['writePressureFile',['../classOutputWriterText.html#a3480b58a23fd158f16d0ef9c1b67cbfd',1,'OutputWriterText']]] +]; diff --git a/documentation/html/search/all_2.js b/documentation/html/search/all_2.js new file mode 100644 index 00000000..0b1f14ff --- /dev/null +++ b/documentation/html/search/all_2.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['calculateresiduum_0',['calculateResiduum',['../classPressureSolver.html#afc51f4315c483988aeec327a16c5bb90',1,'PressureSolver']]], + ['celltype_1',['CellType',['../classMask.html#ad74a26afe88ebadafebd733837f3252a',1,'Mask']]], + ['centraldifferences_2',['centraldifferences',['../classCentralDifferences.html#ab055731e615298f745364c54f86fc191',1,'CentralDifferences::CentralDifferences()'],['../classCentralDifferences.html',1,'CentralDifferences']]], + ['computation_3',['Computation',['../classComputation.html',1,'']]], + ['computed2udx2_4',['computeD2uDx2',['../classDiscretization.html#a6986501b0b5c96699ff3ac843c1a6ca2',1,'Discretization']]], + ['computed2udy2_5',['computeD2uDy2',['../classDiscretization.html#a446aabc55a9fb4b5cb2f476babc532f9',1,'Discretization']]], + ['computed2vdx2_6',['computeD2vDx2',['../classDiscretization.html#a5119047788a34eadf37480e913bdc8ea',1,'Discretization']]], + ['computed2vdy2_7',['computeD2vDy2',['../classDiscretization.html#a56678582a049b1b141621e41afff1438',1,'Discretization']]], + ['computedpdx_8',['computeDpDx',['../classDiscretization.html#aed3ad75ad6e647d14f118a12652c01b2',1,'Discretization']]], + ['computedpdy_9',['computeDpDy',['../classDiscretization.html#a859f4dc33f0ea91f5e6537be09ce4999',1,'Discretization']]], + ['computedu2dx_10',['computedu2dx',['../classDonorCell.html#a265bdaf46ed8ba46a42ef0cb03807175',1,'DonorCell::computeDu2Dx()'],['../classDiscretization.html#acca6bf193e0e91f645d292527299254b',1,'Discretization::computeDu2Dx()'],['../classCentralDifferences.html#adb4502f473cc047a433db596146672e4',1,'CentralDifferences::computeDu2Dx(int i, int j) const override']]], + ['computeduvdx_11',['computeduvdx',['../classCentralDifferences.html#a9bd7ac3bfd709991525ec57de10ed2e1',1,'CentralDifferences::computeDuvDx()'],['../classDiscretization.html#ab1c2aa237e13e7c4c9edd429de656795',1,'Discretization::computeDuvDx()'],['../classDonorCell.html#ae41b5f85743ca7f148bd829561bd9cb5',1,'DonorCell::computeDuvDx()']]], + ['computeduvdy_12',['computeduvdy',['../classCentralDifferences.html#a4184367de8d48e678edfb078a19fc0a4',1,'CentralDifferences::computeDuvDy()'],['../classDiscretization.html#a0bab86aef10a72e01b4f8102a3c91f84',1,'Discretization::computeDuvDy()'],['../classDonorCell.html#a285562312f08efde26afd160174d2843',1,'DonorCell::computeDuvDy()']]], + ['computedv2dy_13',['computedv2dy',['../classCentralDifferences.html#a66eb9b800b9a9ac6f81fc719a42eb0ee',1,'CentralDifferences::computeDv2Dy()'],['../classDiscretization.html#a69ba136ab7f8c09d805afca159cab428',1,'Discretization::computeDv2Dy()'],['../classDonorCell.html#a01dcfb7fcf356d5ee412107a30c26fb3',1,'DonorCell::computeDv2Dy()']]], + ['createdomainfrombitmap_14',['createDomainfromBitmap',['../structSettings.html#a6300ad5a809cdaf480f4553c3e3dbf7c',1,'Settings']]], + ['createmaskfrompngbitmap_15',['createMaskFromPNGBitMap',['../classMask.html#ad69aefd91f740d6758cdedf0df8c8ca6',1,'Mask']]], + ['createparticles_16',['createParticles',['../classFluidTracer.html#ace163e1fe040acbd4c3122f082b08eea',1,'FluidTracer']]], + ['createrectangularobject_17',['createRectangularObject',['../structSettings.html#a9e871c2bbb7d1b0131eac1f30f4f7788',1,'Settings']]] +]; diff --git a/documentation/html/search/all_3.js b/documentation/html/search/all_3.js new file mode 100644 index 00000000..e54b04ca --- /dev/null +++ b/documentation/html/search/all_3.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['data_5f_0',['data_',['../classMask.html#acdb73aee935b502fecc8de6bf1e32a09',1,'Mask::data_'],['../classArray2D.html#af1572f75d219caab4b2372a98341b991',1,'Array2D::data_']]], + ['discretization_1',['discretization',['../classDiscretization.html',1,'Discretization'],['../classDiscretization.html#a4fb8cc9823938e7c2dec329b906a462c',1,'Discretization::Discretization()']]], + ['discretization_5f_2',['discretization_',['../classOutputWriter.html#a0587b2dc160a9b1393411433dfc23b68',1,'OutputWriter::discretization_'],['../classPressureSolver.html#af579ecebaaa8b11914293ef18af5fdc6',1,'PressureSolver::discretization_']]], + ['docalculatef_3',['doCalculateF',['../classBoundary.html#ac76b887d65491d38c093ca50333697a9',1,'Boundary']]], + ['docalculateg_4',['doCalculateG',['../classBoundary.html#aacf325c02e71925b7847d7189282b5c1',1,'Boundary']]], + ['donorcell_5',['donorcell',['../classDonorCell.html',1,'DonorCell'],['../classDonorCell.html#a4896ad035a5ac50c85e2b66d442a5312',1,'DonorCell::DonorCell()']]], + ['dx_6',['dx',['../classStaggeredGrid.html#aec8490affea703cdd73b1febaed68968',1,'StaggeredGrid']]], + ['dy_7',['dy',['../classStaggeredGrid.html#abde2da10e0c130fb0f206de64c9b4956',1,'StaggeredGrid']]], + ['dy2_8',['dy2',['../classPressureSolver.html#a25b7ff50bdaea53d1b5c7a5cf735c5b5',1,'PressureSolver']]] +]; diff --git a/documentation/html/search/all_4.js b/documentation/html/search/all_4.js new file mode 100644 index 00000000..9909aa46 --- /dev/null +++ b/documentation/html/search/all_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['endtime_0',['endTime',['../structSettings.html#a73cd9110793ede99e9ebe409e5e115fd',1,'Settings']]], + ['epsilon_1',['epsilon',['../structSettings.html#aa02bd91d026d9ded9e36004b41b068b1',1,'Settings']]], + ['epsilon_5f_2',['epsilon_',['../classPressureSolver.html#a22b723f3b3ba54e47f36cfc2b9576749',1,'PressureSolver']]] +]; diff --git a/documentation/html/search/all_5.js b/documentation/html/search/all_5.js new file mode 100644 index 00000000..e23218de --- /dev/null +++ b/documentation/html/search/all_5.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['f_0',['f',['../classStaggeredGrid.html#adb05c59512dc8993367e4beddba05785',1,'StaggeredGrid']]], + ['f_5f_1',['f_',['../classStaggeredGrid.html#a94933ac0c6e0d2a794f46c7a97d72f75',1,'StaggeredGrid']]], + ['fibegin_2',['fIBegin',['../classStaggeredGrid.html#a5cc368f9ede58a3cb689705df998f750',1,'StaggeredGrid']]], + ['fieldvariable_3',['fieldvariable',['../classFieldVariable.html',1,'FieldVariable'],['../classFieldVariable.html#aa0985778bc6331b74904a03c3ef67a98',1,'FieldVariable::FieldVariable()']]], + ['fiend_4',['fIEnd',['../classStaggeredGrid.html#a8162b849231354ba73aacb085b5cd665',1,'StaggeredGrid']]], + ['fileno_5f_5',['fileNo_',['../classOutputWriter.html#a69d167e2526407602dce26ca7a2b9248',1,'OutputWriter']]], + ['findabsmax_6',['findAbsMax',['../classFieldVariable.html#a55168fd422c70c8386ba311909427cf7',1,'FieldVariable']]], + ['fjbegin_7',['fJBegin',['../classStaggeredGrid.html#ab92aca90331200d0cc7bc0c0a857b4ef',1,'StaggeredGrid']]], + ['fjend_8',['fJEnd',['../classStaggeredGrid.html#a7ac43ac86231987bc0bf6565589d52e1',1,'StaggeredGrid']]], + ['fluidtracer_9',['FluidTracer',['../classFluidTracer.html',1,'']]], + ['fluidtracermethod_10',['fluidTracerMethod',['../structSettings.html#a70a321e56d7bc445f58a8662430fd68d',1,'Settings']]], + ['forbiddenobstaclefluidcombinations_11',['forbiddenObstacleFluidCombinations',['../classMask.html#abe4f6f251b0517f01d0f58f9042d3af4',1,'Mask']]] +]; diff --git a/documentation/html/search/all_6.js b/documentation/html/search/all_6.js new file mode 100644 index 00000000..387ec73a --- /dev/null +++ b/documentation/html/search/all_6.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['g_0',['g',['../structSettings.html#a1a21237c7f5b7585e5a3545c7d4a4e8c',1,'Settings::g'],['../classStaggeredGrid.html#aaf849bec40f7fa7c68823038f0877341',1,'StaggeredGrid::g(int i, int j)']]], + ['g_5f_1',['g_',['../classStaggeredGrid.html#a5f5c88f603d4e503cba4c44ed43de46a',1,'StaggeredGrid']]], + ['gaussseidel_2',['gaussseidel',['../classGaussSeidel.html',1,'GaussSeidel'],['../classGaussSeidel.html#af31cc1ace2d616ebb8e0592c06865b9c',1,'GaussSeidel::GaussSeidel()']]], + ['getnumberoffluidcells_3',['getNumberOfFluidCells',['../classMask.html#a3471a6026ce7eab118f660557a8abac6',1,'Mask']]], + ['getnumberofparticles_4',['getnumberofparticles',['../classFluidTracer.html#adc687a4988f532e21e13c9aa0591d658',1,'FluidTracer::getNumberOfParticles() const'],['../classFluidTracer.html#a95d6d49d957b2639169c136addf52719',1,'FluidTracer::getNumberOfParticles(int i, int j) const']]], + ['getparticleposition_5',['getParticlePosition',['../classFluidTracer.html#a37ee0325d6af08be6eba8b073162342e',1,'FluidTracer']]], + ['gibegin_6',['gIBegin',['../classStaggeredGrid.html#a061fb6d6948cdc3054171dd60842a8c3',1,'StaggeredGrid']]], + ['giend_7',['gIEnd',['../classStaggeredGrid.html#aebc76693e5dd61db521d6763236bf664',1,'StaggeredGrid']]], + ['gjbegin_8',['gJBegin',['../classStaggeredGrid.html#a18ca3a121787b19c18886b0945aca2e3',1,'StaggeredGrid']]], + ['gjend_9',['gJEnd',['../classStaggeredGrid.html#a7a29456e1bce9efffa27de0b41957b50',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/all_7.js b/documentation/html/search/all_7.js new file mode 100644 index 00000000..8d6c2954 --- /dev/null +++ b/documentation/html/search/all_7.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['i_5fbeg_0',['i_beg',['../classPressureSolver.html#af3ac2e53c6f49b9a362415a89595a7f0',1,'PressureSolver']]], + ['i_5fend_1',['i_end',['../classPressureSolver.html#a41b263980e55591d1ffdc4837c252a61',1,'PressureSolver']]], + ['initialize_2',['initialize',['../classComputation.html#a4a344479797b15bd5c9ed2f262657339',1,'Computation']]], + ['interpolateat_3',['interpolateAt',['../classFieldVariable.html#a2949624f1d2d7e29872f743db0b1d83b',1,'FieldVariable']]], + ['isair_4',['isAir',['../classMask.html#a7eb34f789ef96c622ab93718d5278d77',1,'Mask']]], + ['iscontent_5',['isContent',['../structSettings_1_1LineContent.html#aa2af8a274c468eb68c61cd93171748e5',1,'Settings::LineContent']]], + ['isdomainboundary_6',['isDomainBoundary',['../classMask.html#a9f76177c70d7cab7f268c8fd9a102e73',1,'Mask']]], + ['isfluid_7',['isFluid',['../classMask.html#aadacef52f95b796920864b8519d0594b',1,'Mask']]], + ['isfluidboundary_8',['isFluidBoundary',['../classMask.html#a2ffcf2b70edede392422ea692e49d313',1,'Mask']]], + ['isinnerfluid_9',['isInnerFluid',['../classMask.html#a5f3d53087eb5a1d9427716804e280751',1,'Mask']]], + ['isobstacle_10',['isObstacle',['../classMask.html#a53e4e7c0b29234856cbee33386cc5c18',1,'Mask']]], + ['isobstacleboundary_11',['isObstacleBoundary',['../classMask.html#ada8b2531a4a16703f145fd6f708f21ff',1,'Mask']]] +]; diff --git a/documentation/html/search/all_8.js b/documentation/html/search/all_8.js new file mode 100644 index 00000000..92030a3a --- /dev/null +++ b/documentation/html/search/all_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['j_5fbeg_0',['j_beg',['../classPressureSolver.html#aa309af30e5e63e09b77900091e562235',1,'PressureSolver']]], + ['j_5fend_1',['j_end',['../classPressureSolver.html#ac2402794034dd74073700998ee2860bf',1,'PressureSolver']]] +]; diff --git a/documentation/html/search/all_9.js b/documentation/html/search/all_9.js new file mode 100644 index 00000000..e7fbc954 --- /dev/null +++ b/documentation/html/search/all_9.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['linecontent_0',['LineContent',['../structSettings_1_1LineContent.html',1,'Settings']]], + ['loadfromfile_1',['loadFromFile',['../structSettings.html#a55f95e3b6e7379bef4f8399a2cd670cc',1,'Settings']]] +]; diff --git a/documentation/html/search/all_a.js b/documentation/html/search/all_a.js new file mode 100644 index 00000000..d8c1065e --- /dev/null +++ b/documentation/html/search/all_a.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['makerectangularobstacle_0',['makeRectangularObstacle',['../classMask.html#a75a1750221e41c1b34f80d4d352163ac',1,'Mask']]], + ['mask_1',['mask',['../classMask.html',1,'Mask'],['../classMask.html#a5d65d3a108a79864bc69994f5e56f6c3',1,'Mask::Mask()']]], + ['mask_5f_2',['mask_',['../classBoundary.html#a25d33b12fbdf312cf319713ff88b3d38',1,'Boundary']]], + ['maximumdt_3',['maximumDt',['../structSettings.html#a988b93fdeb6c91932043b3f746b45e86',1,'Settings']]], + ['maximumnumberofiterations_4',['maximumNumberOfIterations',['../structSettings.html#ac118e1c6052e35fb0ee38547a85d84ba',1,'Settings']]], + ['maximumnumberofiterations_5f_5',['maximumNumberOfIterations_',['../classPressureSolver.html#af3b02d29bf1b21ad8b7e6edf8c2f4e87',1,'PressureSolver']]], + ['meshwidth_6',['meshWidth',['../classStaggeredGrid.html#a330856d4efe952771daf0753ef84068e',1,'StaggeredGrid']]], + ['meshwidth_5f_7',['meshWidth_',['../classStaggeredGrid.html#a9603c3334440aab082dda48947e5ce6e',1,'StaggeredGrid']]], + ['moveparticles_8',['moveParticles',['../classFluidTracer.html#aba4d452f26e9276b91256dd251789b90',1,'FluidTracer']]] +]; diff --git a/documentation/html/search/all_b.js b/documentation/html/search/all_b.js new file mode 100644 index 00000000..ad7092d3 --- /dev/null +++ b/documentation/html/search/all_b.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['ncells_0',['ncells',['../structSettings.html#a43a0d2ee903496bfb86693a43a891a69',1,'Settings::nCells'],['../classStaggeredGrid.html#af37816ccb2c46e4a514dedac261897bf',1,'StaggeredGrid::nCells() const']]], + ['ncells_5f_1',['nCells_',['../classStaggeredGrid.html#acacffb5739539d9015c986080bb5ed44',1,'StaggeredGrid']]], + ['noslipvelbottom_2',['NoSlipVelBottom',['../structSettings.html#a13e254a0439df7f7bd24ffe4f919a1a4',1,'Settings']]], + ['noslipvelleft_3',['NoSlipVelLeft',['../structSettings.html#aafaec8c10a728a0f115f3bed43a1c478',1,'Settings']]], + ['noslipvelright_4',['NoSlipVelRight',['../structSettings.html#a2508aa084fe48e78d72b06e67c5a2006',1,'Settings']]], + ['noslipveltop_5',['NoSlipVelTop',['../structSettings.html#a8887591c6c157d7006051aa95896c284',1,'Settings']]] +]; diff --git a/documentation/html/search/all_c.js b/documentation/html/search/all_c.js new file mode 100644 index 00000000..00384044 --- /dev/null +++ b/documentation/html/search/all_c.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['obstacledimension_0',['obstacleDimension',['../structSettings.html#ae23782f18cddfea58cb843e98cb5854f',1,'Settings']]], + ['obstacleposition_1',['obstaclePosition',['../structSettings.html#aff5a1563289e354946a164fd80da5bf6',1,'Settings']]], + ['omega_2',['omega',['../structSettings.html#af5ac13128e8c442ba45eedfab06ba14c',1,'Settings']]], + ['operator_28_29_3',['operator()',['../classMask.html#a6d612f1ac2185304b3ad7432d90dcd2b',1,'Mask::operator()(int i, int j)'],['../classMask.html#a154acb41f2695c2a6ace82b5ebccbb1c',1,'Mask::operator()(int i, int j) const'],['../classArray2D.html#a9d49e5544f4acf51a57dcbb0ed1bb0f8',1,'Array2D::operator()(int i, int j)'],['../classArray2D.html#af745718ec25b815051de2d0c3c94e0d2',1,'Array2D::operator()(int i, int j) const']]], + ['outputwriter_4',['outputwriter',['../classOutputWriter.html',1,'OutputWriter'],['../classOutputWriter.html#a4f3180552b8102c27e087357b9cdd1f7',1,'OutputWriter::OutputWriter()'],['../classOutputWriterText.html#a4f3180552b8102c27e087357b9cdd1f7',1,'OutputWriterText::OutputWriter()']]], + ['outputwriterparaview_5',['outputwriterparaview',['../classOutputWriterParaview.html',1,'OutputWriterParaview'],['../classOutputWriterParaview.html#ab2d30ea87bf48abef82f95976c662cc1',1,'OutputWriterParaview::OutputWriterParaview()']]], + ['outputwritertext_6',['OutputWriterText',['../classOutputWriterText.html',1,'']]] +]; diff --git a/documentation/html/search/all_d.js b/documentation/html/search/all_d.js new file mode 100644 index 00000000..82882ac1 --- /dev/null +++ b/documentation/html/search/all_d.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['p_0',['p',['../classStaggeredGrid.html#aafe6e0bb3509f6aad272b94f74e7ffec',1,'StaggeredGrid::p() const'],['../classStaggeredGrid.html#aa6a5d99d9b4fbd9bd9cfa6ec071918f9',1,'StaggeredGrid::p(int i, int j) const'],['../classStaggeredGrid.html#aa09a4ca67141589bae153797fbc4f3c5',1,'StaggeredGrid::p(int i, int j)']]], + ['p_5f_1',['p_',['../classStaggeredGrid.html#a2ea3c93dd401ac06461ade9a74e76459',1,'StaggeredGrid']]], + ['parametername_2',['parameterName',['../structSettings_1_1LineContent.html#a2fa37c56a8ebe361c95b8332fa0262d3',1,'Settings::LineContent']]], + ['particlepercell_3',['particlePerCell',['../structSettings.html#ab24c3f0faab5278e400792f8b172322a',1,'Settings']]], + ['pathtobitmap_4',['pathToBitmap',['../structSettings.html#a398d6490c8731b9b74115abc34700086',1,'Settings']]], + ['physicalsize_5',['physicalSize',['../structSettings.html#a372a1549c306b12ca7bb0ed84f8a4cef',1,'Settings']]], + ['pibegin_6',['pIBegin',['../classStaggeredGrid.html#a9922c955707f2a31a4a27d1d696f002e',1,'StaggeredGrid']]], + ['piend_7',['pIEnd',['../classStaggeredGrid.html#a34f16fdf87971fe84ffc3c84722bb2c7',1,'StaggeredGrid']]], + ['pjbegin_8',['pJBegin',['../classStaggeredGrid.html#ae4c9ba16c5635dc1ffaa264fbcc3e034',1,'StaggeredGrid']]], + ['pjend_9',['pJEnd',['../classStaggeredGrid.html#ad9928ee522eedb7d7fd48ca0b92f2795',1,'StaggeredGrid']]], + ['pressurebottom_10',['PressureBottom',['../structSettings.html#acae74bcd333251c982ea347b8eb52017',1,'Settings']]], + ['pressureleft_11',['PressureLeft',['../structSettings.html#a55f2fbdeb4d9c25bc679bd1fd42f1da7',1,'Settings']]], + ['pressureright_12',['PressureRight',['../structSettings.html#a8e7d49e95d30c9390fc5039f9326df32',1,'Settings']]], + ['pressuresolver_13',['pressuresolver',['../classPressureSolver.html',1,'PressureSolver'],['../structSettings.html#a888e2fca33db512d4e200b49f1f618f7',1,'Settings::pressureSolver'],['../classPressureSolver.html#a10803d8c3d7f3810fc0ba059acf04058',1,'PressureSolver::PressureSolver()']]], + ['pressuretop_14',['PressureTop',['../structSettings.html#a5c8295a86e29ac27579058f07242e78c',1,'Settings']]], + ['printmask_15',['printMask',['../classMask.html#a372d2a81ff261f126b11fdfcfd2f845e',1,'Mask']]], + ['printsettings_16',['printSettings',['../structSettings.html#a68ce38117dcef2cbdd3bd17f127b3078',1,'Settings']]] +]; diff --git a/documentation/html/search/all_e.js b/documentation/html/search/all_e.js new file mode 100644 index 00000000..033d4072 --- /dev/null +++ b/documentation/html/search/all_e.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['re_0',['re',['../structSettings.html#a8b8330dfa04fe849291d68eacbc8dfec',1,'Settings']]], + ['readsingleline_1',['readSingleLine',['../structSettings.html#a6dbc25f91b99664976cd4a0a8af153c9',1,'Settings']]], + ['resetmask_2',['resetMask',['../classMask.html#ac30997cdd83faef98290733acb325cf8',1,'Mask']]], + ['rhs_3',['rhs',['../classStaggeredGrid.html#a3f36422a02b9b18d1577d61e406f08cf',1,'StaggeredGrid::rhs() const'],['../classStaggeredGrid.html#a761ea51f1e8fd1290b3adfe09942b0d3',1,'StaggeredGrid::rhs(int i, int j)']]], + ['rhs_5f_4',['rhs_',['../classStaggeredGrid.html#a496206955162452a0629a7742fe92a84',1,'StaggeredGrid']]], + ['rhsibegin_5',['rhsIBegin',['../classStaggeredGrid.html#ad5c16b00d9dbf0f115e1ded81203edce',1,'StaggeredGrid']]], + ['rhsiend_6',['rhsIEnd',['../classStaggeredGrid.html#ae11e8842fdd508b914dc8f24b09b36a9',1,'StaggeredGrid']]], + ['rhsjbegin_7',['rhsJBegin',['../classStaggeredGrid.html#a28c36939e3d3cc8df76e7aa91f0e0804',1,'StaggeredGrid']]], + ['rhsjend_8',['rhsJEnd',['../classStaggeredGrid.html#a953ec890a986473bffe87ea26dfcd782',1,'StaggeredGrid']]], + ['runsimulation_9',['runSimulation',['../classComputation.html#ad20ce6e82ec9a918e6ac03840bc688d5',1,'Computation']]] +]; diff --git a/documentation/html/search/all_f.js b/documentation/html/search/all_f.js new file mode 100644 index 00000000..f8e80e3a --- /dev/null +++ b/documentation/html/search/all_f.js @@ -0,0 +1,18 @@ +var searchData= +[ + ['setboundaryvalues_0',['setBoundaryValues',['../classPressureSolver.html#a458c383fcacaf54c1a333a271049ca93',1,'PressureSolver']]], + ['setdomainbc_1',['setDomainBC',['../classMask.html#aacf4d2cfe1362df85ed08fd3b0fc6d6b',1,'Mask']]], + ['setfluidbc_2',['setFluidBC',['../classMask.html#a41bf0aa100e2554eaea3ab29a999c0ee',1,'Mask']]], + ['setobstaclebc_3',['setObstacleBC',['../classMask.html#a644a84aca88442b72b5cd87ee80f1724',1,'Mask']]], + ['setparameter_4',['setParameter',['../structSettings.html#a588f30eb8d791c03ec811360386bff0d',1,'Settings']]], + ['setpressureboundaryvalues_5',['setPressureBoundaryValues',['../classBoundary.html#a77c90b2a43220ce9796d098158e4376d',1,'Boundary']]], + ['setpressuresurfacebc_6',['setPressureSurfaceBC',['../classBoundary.html#ac603742c37221bd82cbb545b6cdbe6cb',1,'Boundary']]], + ['settings_7',['Settings',['../structSettings.html',1,'']]], + ['settings_5f_8',['settings_',['../classMask.html#acb8b165d56689722fd836569e066fdd4',1,'Mask']]], + ['setvelocityboundaryvalues_9',['setvelocityboundaryvalues',['../classBoundary.html#ab7e15ee44237de051ff8347f2f9c770b',1,'Boundary::setVelocityBoundaryValues()'],['../classBoundary.html#a81d6f13c90f37e63fc0cad27a6999915',1,'Boundary::setVelocityBoundaryValues(double dt)']]], + ['size_10',['size',['../classMask.html#aafa0857af35b02ba6070e76f82d51c7b',1,'Mask::size()'],['../classArray2D.html#accf87be860645d6c50d6ba6fa39ec6f9',1,'Array2D::size()']]], + ['size_5f_11',['size_',['../classMask.html#a84bff46271e16eb8639c1831403c1bb9',1,'Mask::size_'],['../classArray2D.html#a75bc7a1ff6f218c38f6ab94ec34e9472',1,'Array2D::size_']]], + ['solve_12',['solve',['../classGaussSeidel.html#a6f0eb0c6938a64f8ded186f88170a04b',1,'GaussSeidel::solve()'],['../classPressureSolver.html#a504ac61a1317650e0eb70d6a93212ca0',1,'PressureSolver::solve()'],['../classSOR.html#a860992d85d8aacf114a3a02b5831f728',1,'SOR::solve() override']]], + ['sor_13',['sor',['../classSOR.html#a357cfea8935f4b2dfee06f2d8e1461a8',1,'SOR::SOR()'],['../classSOR.html',1,'SOR']]], + ['staggeredgrid_14',['staggeredgrid',['../classStaggeredGrid.html',1,'StaggeredGrid'],['../classStaggeredGrid.html#aec0990b64c559b1690f21b48fb2d13b1',1,'StaggeredGrid::StaggeredGrid()']]] +]; diff --git a/documentation/html/search/classes_0.js b/documentation/html/search/classes_0.js new file mode 100644 index 00000000..a18a1a26 --- /dev/null +++ b/documentation/html/search/classes_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['array2d_0',['Array2D',['../classArray2D.html',1,'']]] +]; diff --git a/documentation/html/search/classes_1.js b/documentation/html/search/classes_1.js new file mode 100644 index 00000000..e067cded --- /dev/null +++ b/documentation/html/search/classes_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['boundary_0',['Boundary',['../classBoundary.html',1,'']]] +]; diff --git a/documentation/html/search/classes_2.js b/documentation/html/search/classes_2.js new file mode 100644 index 00000000..665d9deb --- /dev/null +++ b/documentation/html/search/classes_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['centraldifferences_0',['CentralDifferences',['../classCentralDifferences.html',1,'']]], + ['computation_1',['Computation',['../classComputation.html',1,'']]] +]; diff --git a/documentation/html/search/classes_3.js b/documentation/html/search/classes_3.js new file mode 100644 index 00000000..6c1d2569 --- /dev/null +++ b/documentation/html/search/classes_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['discretization_0',['Discretization',['../classDiscretization.html',1,'']]], + ['donorcell_1',['DonorCell',['../classDonorCell.html',1,'']]] +]; diff --git a/documentation/html/search/classes_4.js b/documentation/html/search/classes_4.js new file mode 100644 index 00000000..f09b5865 --- /dev/null +++ b/documentation/html/search/classes_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['fieldvariable_0',['FieldVariable',['../classFieldVariable.html',1,'']]], + ['fluidtracer_1',['FluidTracer',['../classFluidTracer.html',1,'']]] +]; diff --git a/documentation/html/search/classes_5.js b/documentation/html/search/classes_5.js new file mode 100644 index 00000000..461456be --- /dev/null +++ b/documentation/html/search/classes_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['gaussseidel_0',['GaussSeidel',['../classGaussSeidel.html',1,'']]] +]; diff --git a/documentation/html/search/classes_6.js b/documentation/html/search/classes_6.js new file mode 100644 index 00000000..a14c2b1e --- /dev/null +++ b/documentation/html/search/classes_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['linecontent_0',['LineContent',['../structSettings_1_1LineContent.html',1,'Settings']]] +]; diff --git a/documentation/html/search/classes_7.js b/documentation/html/search/classes_7.js new file mode 100644 index 00000000..e15d664e --- /dev/null +++ b/documentation/html/search/classes_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['mask_0',['Mask',['../classMask.html',1,'']]] +]; diff --git a/documentation/html/search/classes_8.js b/documentation/html/search/classes_8.js new file mode 100644 index 00000000..780dc018 --- /dev/null +++ b/documentation/html/search/classes_8.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['outputwriter_0',['OutputWriter',['../classOutputWriter.html',1,'']]], + ['outputwriterparaview_1',['OutputWriterParaview',['../classOutputWriterParaview.html',1,'']]], + ['outputwritertext_2',['OutputWriterText',['../classOutputWriterText.html',1,'']]] +]; diff --git a/documentation/html/search/classes_9.js b/documentation/html/search/classes_9.js new file mode 100644 index 00000000..b1ff3b09 --- /dev/null +++ b/documentation/html/search/classes_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['pressuresolver_0',['PressureSolver',['../classPressureSolver.html',1,'']]] +]; diff --git a/documentation/html/search/classes_a.js b/documentation/html/search/classes_a.js new file mode 100644 index 00000000..5f84540d --- /dev/null +++ b/documentation/html/search/classes_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['settings_0',['Settings',['../structSettings.html',1,'']]], + ['sor_1',['SOR',['../classSOR.html',1,'']]], + ['staggeredgrid_2',['StaggeredGrid',['../classStaggeredGrid.html',1,'']]] +]; diff --git a/documentation/html/search/close.svg b/documentation/html/search/close.svg new file mode 100644 index 00000000..337d6cc1 --- /dev/null +++ b/documentation/html/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/documentation/html/search/enums_0.js b/documentation/html/search/enums_0.js new file mode 100644 index 00000000..99fea8e0 --- /dev/null +++ b/documentation/html/search/enums_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['celltype_0',['CellType',['../classMask.html#ad74a26afe88ebadafebd733837f3252a',1,'Mask']]] +]; diff --git a/documentation/html/search/functions_0.js b/documentation/html/search/functions_0.js new file mode 100644 index 00000000..b31bc990 --- /dev/null +++ b/documentation/html/search/functions_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['array2d_0',['Array2D',['../classArray2D.html#a16521417dfdf67ec694bfb7747df9000',1,'Array2D']]] +]; diff --git a/documentation/html/search/functions_1.js b/documentation/html/search/functions_1.js new file mode 100644 index 00000000..d52fdafb --- /dev/null +++ b/documentation/html/search/functions_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['boundary_0',['Boundary',['../classBoundary.html#a4c78a28ad0839810f15229382f642cf1',1,'Boundary']]] +]; diff --git a/documentation/html/search/functions_10.js b/documentation/html/search/functions_10.js new file mode 100644 index 00000000..9578483c --- /dev/null +++ b/documentation/html/search/functions_10.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['writefile_0',['writefile',['../classOutputWriter.html#ac625c204affdc05919388a3549c2e945',1,'OutputWriter::writeFile()'],['../classOutputWriterParaview.html#a9e203b63d0e2f26ad53d18ee1821c6bb',1,'OutputWriterParaview::writeFile()'],['../classOutputWriterText.html#a25a12ea2524fc34e9acb19ef1f4c7431',1,'OutputWriterText::writeFile(double currentTime)']]], + ['writepressurefile_1',['writePressureFile',['../classOutputWriterText.html#a3480b58a23fd158f16d0ef9c1b67cbfd',1,'OutputWriterText']]] +]; diff --git a/documentation/html/search/functions_2.js b/documentation/html/search/functions_2.js new file mode 100644 index 00000000..e0705e13 --- /dev/null +++ b/documentation/html/search/functions_2.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['calculateresiduum_0',['calculateResiduum',['../classPressureSolver.html#afc51f4315c483988aeec327a16c5bb90',1,'PressureSolver']]], + ['centraldifferences_1',['CentralDifferences',['../classCentralDifferences.html#ab055731e615298f745364c54f86fc191',1,'CentralDifferences']]], + ['computed2udx2_2',['computeD2uDx2',['../classDiscretization.html#a6986501b0b5c96699ff3ac843c1a6ca2',1,'Discretization']]], + ['computed2udy2_3',['computeD2uDy2',['../classDiscretization.html#a446aabc55a9fb4b5cb2f476babc532f9',1,'Discretization']]], + ['computed2vdx2_4',['computeD2vDx2',['../classDiscretization.html#a5119047788a34eadf37480e913bdc8ea',1,'Discretization']]], + ['computed2vdy2_5',['computeD2vDy2',['../classDiscretization.html#a56678582a049b1b141621e41afff1438',1,'Discretization']]], + ['computedpdx_6',['computeDpDx',['../classDiscretization.html#aed3ad75ad6e647d14f118a12652c01b2',1,'Discretization']]], + ['computedpdy_7',['computeDpDy',['../classDiscretization.html#a859f4dc33f0ea91f5e6537be09ce4999',1,'Discretization']]], + ['computedu2dx_8',['computedu2dx',['../classCentralDifferences.html#adb4502f473cc047a433db596146672e4',1,'CentralDifferences::computeDu2Dx()'],['../classDiscretization.html#acca6bf193e0e91f645d292527299254b',1,'Discretization::computeDu2Dx()'],['../classDonorCell.html#a265bdaf46ed8ba46a42ef0cb03807175',1,'DonorCell::computeDu2Dx()']]], + ['computeduvdx_9',['computeduvdx',['../classCentralDifferences.html#a9bd7ac3bfd709991525ec57de10ed2e1',1,'CentralDifferences::computeDuvDx()'],['../classDonorCell.html#ae41b5f85743ca7f148bd829561bd9cb5',1,'DonorCell::computeDuvDx()'],['../classDiscretization.html#ab1c2aa237e13e7c4c9edd429de656795',1,'Discretization::computeDuvDx()']]], + ['computeduvdy_10',['computeduvdy',['../classCentralDifferences.html#a4184367de8d48e678edfb078a19fc0a4',1,'CentralDifferences::computeDuvDy()'],['../classDiscretization.html#a0bab86aef10a72e01b4f8102a3c91f84',1,'Discretization::computeDuvDy()'],['../classDonorCell.html#a285562312f08efde26afd160174d2843',1,'DonorCell::computeDuvDy()']]], + ['computedv2dy_11',['computedv2dy',['../classCentralDifferences.html#a66eb9b800b9a9ac6f81fc719a42eb0ee',1,'CentralDifferences::computeDv2Dy()'],['../classDiscretization.html#a69ba136ab7f8c09d805afca159cab428',1,'Discretization::computeDv2Dy()'],['../classDonorCell.html#a01dcfb7fcf356d5ee412107a30c26fb3',1,'DonorCell::computeDv2Dy()']]], + ['createmaskfrompngbitmap_12',['createMaskFromPNGBitMap',['../classMask.html#ad69aefd91f740d6758cdedf0df8c8ca6',1,'Mask']]], + ['createparticles_13',['createParticles',['../classFluidTracer.html#ace163e1fe040acbd4c3122f082b08eea',1,'FluidTracer']]] +]; diff --git a/documentation/html/search/functions_3.js b/documentation/html/search/functions_3.js new file mode 100644 index 00000000..814af1c3 --- /dev/null +++ b/documentation/html/search/functions_3.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['discretization_0',['Discretization',['../classDiscretization.html#a4fb8cc9823938e7c2dec329b906a462c',1,'Discretization']]], + ['docalculatef_1',['doCalculateF',['../classBoundary.html#ac76b887d65491d38c093ca50333697a9',1,'Boundary']]], + ['docalculateg_2',['doCalculateG',['../classBoundary.html#aacf325c02e71925b7847d7189282b5c1',1,'Boundary']]], + ['donorcell_3',['DonorCell',['../classDonorCell.html#a4896ad035a5ac50c85e2b66d442a5312',1,'DonorCell']]], + ['dx_4',['dx',['../classStaggeredGrid.html#aec8490affea703cdd73b1febaed68968',1,'StaggeredGrid']]], + ['dy_5',['dy',['../classStaggeredGrid.html#abde2da10e0c130fb0f206de64c9b4956',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/functions_4.js b/documentation/html/search/functions_4.js new file mode 100644 index 00000000..b8771a06 --- /dev/null +++ b/documentation/html/search/functions_4.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['f_0',['f',['../classStaggeredGrid.html#adb05c59512dc8993367e4beddba05785',1,'StaggeredGrid']]], + ['fibegin_1',['fIBegin',['../classStaggeredGrid.html#a5cc368f9ede58a3cb689705df998f750',1,'StaggeredGrid']]], + ['fieldvariable_2',['FieldVariable',['../classFieldVariable.html#aa0985778bc6331b74904a03c3ef67a98',1,'FieldVariable']]], + ['fiend_3',['fIEnd',['../classStaggeredGrid.html#a8162b849231354ba73aacb085b5cd665',1,'StaggeredGrid']]], + ['findabsmax_4',['findAbsMax',['../classFieldVariable.html#a55168fd422c70c8386ba311909427cf7',1,'FieldVariable']]], + ['fjbegin_5',['fJBegin',['../classStaggeredGrid.html#ab92aca90331200d0cc7bc0c0a857b4ef',1,'StaggeredGrid']]], + ['fjend_6',['fJEnd',['../classStaggeredGrid.html#a7ac43ac86231987bc0bf6565589d52e1',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/functions_5.js b/documentation/html/search/functions_5.js new file mode 100644 index 00000000..bb58e9aa --- /dev/null +++ b/documentation/html/search/functions_5.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['g_0',['g',['../classStaggeredGrid.html#aaf849bec40f7fa7c68823038f0877341',1,'StaggeredGrid']]], + ['gaussseidel_1',['GaussSeidel',['../classGaussSeidel.html#af31cc1ace2d616ebb8e0592c06865b9c',1,'GaussSeidel']]], + ['getnumberoffluidcells_2',['getNumberOfFluidCells',['../classMask.html#a3471a6026ce7eab118f660557a8abac6',1,'Mask']]], + ['getnumberofparticles_3',['getnumberofparticles',['../classFluidTracer.html#adc687a4988f532e21e13c9aa0591d658',1,'FluidTracer::getNumberOfParticles() const'],['../classFluidTracer.html#a95d6d49d957b2639169c136addf52719',1,'FluidTracer::getNumberOfParticles(int i, int j) const']]], + ['getparticleposition_4',['getParticlePosition',['../classFluidTracer.html#a37ee0325d6af08be6eba8b073162342e',1,'FluidTracer']]], + ['gibegin_5',['gIBegin',['../classStaggeredGrid.html#a061fb6d6948cdc3054171dd60842a8c3',1,'StaggeredGrid']]], + ['giend_6',['gIEnd',['../classStaggeredGrid.html#aebc76693e5dd61db521d6763236bf664',1,'StaggeredGrid']]], + ['gjbegin_7',['gJBegin',['../classStaggeredGrid.html#a18ca3a121787b19c18886b0945aca2e3',1,'StaggeredGrid']]], + ['gjend_8',['gJEnd',['../classStaggeredGrid.html#a7a29456e1bce9efffa27de0b41957b50',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/functions_6.js b/documentation/html/search/functions_6.js new file mode 100644 index 00000000..d59f28e0 --- /dev/null +++ b/documentation/html/search/functions_6.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['initialize_0',['initialize',['../classComputation.html#a4a344479797b15bd5c9ed2f262657339',1,'Computation']]], + ['interpolateat_1',['interpolateAt',['../classFieldVariable.html#a2949624f1d2d7e29872f743db0b1d83b',1,'FieldVariable']]], + ['isair_2',['isAir',['../classMask.html#a7eb34f789ef96c622ab93718d5278d77',1,'Mask']]], + ['isdomainboundary_3',['isDomainBoundary',['../classMask.html#a9f76177c70d7cab7f268c8fd9a102e73',1,'Mask']]], + ['isfluid_4',['isFluid',['../classMask.html#aadacef52f95b796920864b8519d0594b',1,'Mask']]], + ['isfluidboundary_5',['isFluidBoundary',['../classMask.html#a2ffcf2b70edede392422ea692e49d313',1,'Mask']]], + ['isinnerfluid_6',['isInnerFluid',['../classMask.html#a5f3d53087eb5a1d9427716804e280751',1,'Mask']]], + ['isobstacle_7',['isObstacle',['../classMask.html#a53e4e7c0b29234856cbee33386cc5c18',1,'Mask']]], + ['isobstacleboundary_8',['isObstacleBoundary',['../classMask.html#ada8b2531a4a16703f145fd6f708f21ff',1,'Mask']]] +]; diff --git a/documentation/html/search/functions_7.js b/documentation/html/search/functions_7.js new file mode 100644 index 00000000..73effe35 --- /dev/null +++ b/documentation/html/search/functions_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['loadfromfile_0',['loadFromFile',['../structSettings.html#a55f95e3b6e7379bef4f8399a2cd670cc',1,'Settings']]] +]; diff --git a/documentation/html/search/functions_8.js b/documentation/html/search/functions_8.js new file mode 100644 index 00000000..149fcee2 --- /dev/null +++ b/documentation/html/search/functions_8.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['makerectangularobstacle_0',['makeRectangularObstacle',['../classMask.html#a75a1750221e41c1b34f80d4d352163ac',1,'Mask']]], + ['mask_1',['Mask',['../classMask.html#a5d65d3a108a79864bc69994f5e56f6c3',1,'Mask']]], + ['meshwidth_2',['meshWidth',['../classStaggeredGrid.html#a330856d4efe952771daf0753ef84068e',1,'StaggeredGrid']]], + ['moveparticles_3',['moveParticles',['../classFluidTracer.html#aba4d452f26e9276b91256dd251789b90',1,'FluidTracer']]] +]; diff --git a/documentation/html/search/functions_9.js b/documentation/html/search/functions_9.js new file mode 100644 index 00000000..92b377ad --- /dev/null +++ b/documentation/html/search/functions_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['ncells_0',['nCells',['../classStaggeredGrid.html#af37816ccb2c46e4a514dedac261897bf',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/functions_a.js b/documentation/html/search/functions_a.js new file mode 100644 index 00000000..4877aff7 --- /dev/null +++ b/documentation/html/search/functions_a.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['operator_28_29_0',['operator()',['../classMask.html#a6d612f1ac2185304b3ad7432d90dcd2b',1,'Mask::operator()(int i, int j)'],['../classMask.html#a154acb41f2695c2a6ace82b5ebccbb1c',1,'Mask::operator()(int i, int j) const'],['../classArray2D.html#a9d49e5544f4acf51a57dcbb0ed1bb0f8',1,'Array2D::operator()(int i, int j)'],['../classArray2D.html#af745718ec25b815051de2d0c3c94e0d2',1,'Array2D::operator()(int i, int j) const']]], + ['outputwriter_1',['outputwriter',['../classOutputWriter.html#a4f3180552b8102c27e087357b9cdd1f7',1,'OutputWriter::OutputWriter()'],['../classOutputWriterText.html#a4f3180552b8102c27e087357b9cdd1f7',1,'OutputWriterText::OutputWriter()']]], + ['outputwriterparaview_2',['OutputWriterParaview',['../classOutputWriterParaview.html#ab2d30ea87bf48abef82f95976c662cc1',1,'OutputWriterParaview']]] +]; diff --git a/documentation/html/search/functions_b.js b/documentation/html/search/functions_b.js new file mode 100644 index 00000000..679c46de --- /dev/null +++ b/documentation/html/search/functions_b.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['p_0',['p',['../classStaggeredGrid.html#aafe6e0bb3509f6aad272b94f74e7ffec',1,'StaggeredGrid::p() const'],['../classStaggeredGrid.html#aa6a5d99d9b4fbd9bd9cfa6ec071918f9',1,'StaggeredGrid::p(int i, int j) const'],['../classStaggeredGrid.html#aa09a4ca67141589bae153797fbc4f3c5',1,'StaggeredGrid::p(int i, int j)']]], + ['pibegin_1',['pIBegin',['../classStaggeredGrid.html#a9922c955707f2a31a4a27d1d696f002e',1,'StaggeredGrid']]], + ['piend_2',['pIEnd',['../classStaggeredGrid.html#a34f16fdf87971fe84ffc3c84722bb2c7',1,'StaggeredGrid']]], + ['pjbegin_3',['pJBegin',['../classStaggeredGrid.html#ae4c9ba16c5635dc1ffaa264fbcc3e034',1,'StaggeredGrid']]], + ['pjend_4',['pJEnd',['../classStaggeredGrid.html#ad9928ee522eedb7d7fd48ca0b92f2795',1,'StaggeredGrid']]], + ['pressuresolver_5',['PressureSolver',['../classPressureSolver.html#a10803d8c3d7f3810fc0ba059acf04058',1,'PressureSolver']]], + ['printmask_6',['printMask',['../classMask.html#a372d2a81ff261f126b11fdfcfd2f845e',1,'Mask']]], + ['printsettings_7',['printSettings',['../structSettings.html#a68ce38117dcef2cbdd3bd17f127b3078',1,'Settings']]] +]; diff --git a/documentation/html/search/functions_c.js b/documentation/html/search/functions_c.js new file mode 100644 index 00000000..4e64c4dc --- /dev/null +++ b/documentation/html/search/functions_c.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['readsingleline_0',['readSingleLine',['../structSettings.html#a6dbc25f91b99664976cd4a0a8af153c9',1,'Settings']]], + ['resetmask_1',['resetMask',['../classMask.html#ac30997cdd83faef98290733acb325cf8',1,'Mask']]], + ['rhs_2',['rhs',['../classStaggeredGrid.html#a3f36422a02b9b18d1577d61e406f08cf',1,'StaggeredGrid::rhs() const'],['../classStaggeredGrid.html#a761ea51f1e8fd1290b3adfe09942b0d3',1,'StaggeredGrid::rhs(int i, int j)']]], + ['rhsibegin_3',['rhsIBegin',['../classStaggeredGrid.html#ad5c16b00d9dbf0f115e1ded81203edce',1,'StaggeredGrid']]], + ['rhsiend_4',['rhsIEnd',['../classStaggeredGrid.html#ae11e8842fdd508b914dc8f24b09b36a9',1,'StaggeredGrid']]], + ['rhsjbegin_5',['rhsJBegin',['../classStaggeredGrid.html#a28c36939e3d3cc8df76e7aa91f0e0804',1,'StaggeredGrid']]], + ['rhsjend_6',['rhsJEnd',['../classStaggeredGrid.html#a953ec890a986473bffe87ea26dfcd782',1,'StaggeredGrid']]], + ['runsimulation_7',['runSimulation',['../classComputation.html#ad20ce6e82ec9a918e6ac03840bc688d5',1,'Computation']]] +]; diff --git a/documentation/html/search/functions_d.js b/documentation/html/search/functions_d.js new file mode 100644 index 00000000..5c8c5ae1 --- /dev/null +++ b/documentation/html/search/functions_d.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['setboundaryvalues_0',['setBoundaryValues',['../classPressureSolver.html#a458c383fcacaf54c1a333a271049ca93',1,'PressureSolver']]], + ['setdomainbc_1',['setDomainBC',['../classMask.html#aacf4d2cfe1362df85ed08fd3b0fc6d6b',1,'Mask']]], + ['setfluidbc_2',['setFluidBC',['../classMask.html#a41bf0aa100e2554eaea3ab29a999c0ee',1,'Mask']]], + ['setobstaclebc_3',['setObstacleBC',['../classMask.html#a644a84aca88442b72b5cd87ee80f1724',1,'Mask']]], + ['setparameter_4',['setParameter',['../structSettings.html#a588f30eb8d791c03ec811360386bff0d',1,'Settings']]], + ['setpressureboundaryvalues_5',['setPressureBoundaryValues',['../classBoundary.html#a77c90b2a43220ce9796d098158e4376d',1,'Boundary']]], + ['setpressuresurfacebc_6',['setPressureSurfaceBC',['../classBoundary.html#ac603742c37221bd82cbb545b6cdbe6cb',1,'Boundary']]], + ['setvelocityboundaryvalues_7',['setvelocityboundaryvalues',['../classBoundary.html#ab7e15ee44237de051ff8347f2f9c770b',1,'Boundary::setVelocityBoundaryValues()'],['../classBoundary.html#a81d6f13c90f37e63fc0cad27a6999915',1,'Boundary::setVelocityBoundaryValues(double dt)']]], + ['size_8',['size',['../classMask.html#aafa0857af35b02ba6070e76f82d51c7b',1,'Mask::size()'],['../classArray2D.html#accf87be860645d6c50d6ba6fa39ec6f9',1,'Array2D::size()']]], + ['solve_9',['solve',['../classGaussSeidel.html#a6f0eb0c6938a64f8ded186f88170a04b',1,'GaussSeidel::solve()'],['../classPressureSolver.html#a504ac61a1317650e0eb70d6a93212ca0',1,'PressureSolver::solve()'],['../classSOR.html#a860992d85d8aacf114a3a02b5831f728',1,'SOR::solve() override']]], + ['sor_10',['SOR',['../classSOR.html#a357cfea8935f4b2dfee06f2d8e1461a8',1,'SOR']]], + ['staggeredgrid_11',['StaggeredGrid',['../classStaggeredGrid.html#aec0990b64c559b1690f21b48fb2d13b1',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/functions_e.js b/documentation/html/search/functions_e.js new file mode 100644 index 00000000..2bcca744 --- /dev/null +++ b/documentation/html/search/functions_e.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['u_0',['u',['../classStaggeredGrid.html#a87cee12621c641ab143a8b1a61b2ef7e',1,'StaggeredGrid::u() const'],['../classStaggeredGrid.html#a0324ce4d1fe2343d8aa9514e460cc556',1,'StaggeredGrid::u(int i, int j) const'],['../classStaggeredGrid.html#a0ed62d6752b6b2b3ead5f654b515cd12',1,'StaggeredGrid::u(int i, int j)']]], + ['uibegin_1',['uIBegin',['../classStaggeredGrid.html#a31e2d3a0b6e03685380810a7c2f323e1',1,'StaggeredGrid']]], + ['uiend_2',['uIEnd',['../classStaggeredGrid.html#a641e473d72e1d02ba3de1c16e9d0d332',1,'StaggeredGrid']]], + ['ujbegin_3',['uJBegin',['../classStaggeredGrid.html#a9b0e97704e1871441a8e713ecaa2cff5',1,'StaggeredGrid']]], + ['ujend_4',['uJEnd',['../classStaggeredGrid.html#a3393aa91b17054d2d700de308ae25632',1,'StaggeredGrid']]], + ['updateboundary_5',['updateBoundary',['../classBoundary.html#a9910a68c5dec5845ef4cdde98e680155',1,'Boundary']]] +]; diff --git a/documentation/html/search/functions_f.js b/documentation/html/search/functions_f.js new file mode 100644 index 00000000..8b908be9 --- /dev/null +++ b/documentation/html/search/functions_f.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['v_0',['v',['../classStaggeredGrid.html#a26e478abba632554652c9e05a279d1ca',1,'StaggeredGrid::v() const'],['../classStaggeredGrid.html#ac052d8803ff950aee04b86ac026c516b',1,'StaggeredGrid::v(int i, int j) const'],['../classStaggeredGrid.html#a7746f703f32c2f20a4c77246eebac697',1,'StaggeredGrid::v(int i, int j)']]], + ['vibegin_1',['vIBegin',['../classStaggeredGrid.html#ace7bf8cb1d279131739d5d12de302d09',1,'StaggeredGrid']]], + ['viend_2',['vIEnd',['../classStaggeredGrid.html#aa5a44aa088b5a7923fa952af1ecb5778',1,'StaggeredGrid']]], + ['vjbegin_3',['vJBegin',['../classStaggeredGrid.html#a7f8468d672411c0e3a5eeb67788fc826',1,'StaggeredGrid']]], + ['vjend_4',['vJEnd',['../classStaggeredGrid.html#ab67e8d9d8d76d34fb02d4d644f0b3795',1,'StaggeredGrid']]] +]; diff --git a/documentation/html/search/mag.svg b/documentation/html/search/mag.svg new file mode 100644 index 00000000..ffb6cf0d --- /dev/null +++ b/documentation/html/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/documentation/html/search/mag_d.svg b/documentation/html/search/mag_d.svg new file mode 100644 index 00000000..4122773f --- /dev/null +++ b/documentation/html/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/documentation/html/search/mag_sel.svg b/documentation/html/search/mag_sel.svg new file mode 100644 index 00000000..553dba87 --- /dev/null +++ b/documentation/html/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/documentation/html/search/mag_seld.svg b/documentation/html/search/mag_seld.svg new file mode 100644 index 00000000..c906f84c --- /dev/null +++ b/documentation/html/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/documentation/html/search/search.css b/documentation/html/search/search.css new file mode 100644 index 00000000..19f76f9d --- /dev/null +++ b/documentation/html/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/documentation/html/search/search.js b/documentation/html/search/search.js new file mode 100644 index 00000000..666af01e --- /dev/null +++ b/documentation/html/search/search.js @@ -0,0 +1,694 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +const SEARCH_COOKIE_NAME = ''+'search_grp'; + +const searchResults = new SearchResults(); + +/* A class handling everything associated with the search panel. + + Parameters: + name - The name of the global variable that will be + storing this instance. Is needed to be able to set timeouts. + resultPath - path to use for external files +*/ +function SearchBox(name, resultsPath, extension) { + if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } + if (!extension || extension == "") { extension = ".html"; } + + function getXPos(item) { + let x = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + x += item.offsetLeft; + item = item.offsetParent; + } + } + return x; + } + + function getYPos(item) { + let y = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + y += item.offsetTop; + item = item.offsetParent; + } + } + return y; + } + + // ---------- Instance variables + this.name = name; + this.resultsPath = resultsPath; + this.keyTimeout = 0; + this.keyTimeoutLength = 500; + this.closeSelectionTimeout = 300; + this.lastSearchValue = ""; + this.lastResultsPage = ""; + this.hideTimeout = 0; + this.searchIndex = 0; + this.searchActive = false; + this.extension = extension; + + // ----------- DOM Elements + + this.DOMSearchField = () => document.getElementById("MSearchField"); + this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); + this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); + this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); + this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); + this.DOMSearchClose = () => document.getElementById("MSearchClose"); + this.DOMSearchBox = () => document.getElementById("MSearchBox"); + + // ------------ Event Handlers + + // Called when focus is added or removed from the search field. + this.OnSearchFieldFocus = function(isActive) { + this.Activate(isActive); + } + + this.OnSearchSelectShow = function() { + const searchSelectWindow = this.DOMSearchSelectWindow(); + const searchField = this.DOMSearchSelect(); + + const left = getXPos(searchField); + const top = getYPos(searchField) + searchField.offsetHeight; + + // show search selection popup + searchSelectWindow.style.display='block'; + searchSelectWindow.style.left = left + 'px'; + searchSelectWindow.style.top = top + 'px'; + + // stop selection hide timer + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + this.hideTimeout=0; + } + return false; // to avoid "image drag" default event + } + + this.OnSearchSelectHide = function() { + this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), + this.closeSelectionTimeout); + } + + // Called when the content of the search field is changed. + this.OnSearchFieldChange = function(evt) { + if (this.keyTimeout) { // kill running timer + clearTimeout(this.keyTimeout); + this.keyTimeout = 0; + } + + const e = evt ? evt : window.event; // for IE + if (e.keyCode==40 || e.keyCode==13) { + if (e.shiftKey==1) { + this.OnSearchSelectShow(); + const win=this.DOMSearchSelectWindow(); + for (let i=0;i do a search + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) { // Up + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } else if (e.keyCode==13 || e.keyCode==27) { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() { + this.keyTimeout = 0; + + // strip leading whitespace + const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + const code = searchValue.toLowerCase().charCodeAt(0); + let idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair + idxChar = searchValue.substr(0, 2); + } + + let jsFile; + let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) { + const hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + const loadJS = function(url, impl, loc) { + const scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + const domSearchBox = this.DOMSearchBox(); + const domPopupSearchResults = this.DOMPopupSearchResults(); + const domSearchClose = this.DOMSearchClose(); + const resultsPath = this.resultsPath; + + const handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') { + domSearchClose.style.display = 'inline-block'; + let left = getXPos(domSearchBox) + 150; + let top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + const maxWidth = document.body.clientWidth; + const maxHeight = document.body.clientHeight; + let width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + let height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } else if (!isActive) { // directly remove the panel + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults() { + + function convertToId(search) { + let result = ''; + for (let i=0;i. + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) { + const parentElement = document.getElementById(id); + let element = parentElement.firstChild; + + while (element && element!=parentElement) { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { + element = element.firstChild; + } else if (element.nextSibling) { + element = element.nextSibling; + } else { + do { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) { + const element = this.FindChildElement(id); + if (element) { + if (element.style.display == 'block') { + element.style.display = 'none'; + } else { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) { + if (!search) { // get search word from URL + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + const resultRows = document.getElementsByTagName("div"); + let matches = 0; + + let i = 0; + while (i < resultRows.length) { + const row = resultRows.item(i); + if (row.className == "SRResult") { + let rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) { + row.style.display = 'block'; + matches++; + } else { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) { // no results + document.getElementById("NoMatches").style.display='block'; + } else { // at least one result + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) { + if (e.type == "keydown") { + this.repeatOn = false; + this.lastKey = e.keyCode; + } else if (e.type == "keypress") { + if (!this.repeatOn) { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } else if (e.type == "keyup") { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + const newIndex = itemIndex-1; + let focusItem = this.NavPrev(newIndex); + if (focusItem) { + let child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') { // children visible + let n=0; + let tmpElem; + for (;;) { // search for last child + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) { + focusItem = tmpElem; + } else { // found it! + break; + } + n++; + } + } + } + if (focusItem) { + focusItem.focus(); + } else { // return focus to search field + document.getElementById("MSearchField").focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = itemIndex+1; + let focusItem; + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') { // children visible + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } else if (this.lastKey==39) { // Right + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } else if (this.lastKey==37) { // Left + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + if (childIndex>0) { + const newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } else { // already at first child, jump to parent + document.getElementById('Item'+itemIndex).focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = childIndex+1; + let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) { // last child, jump to parent next parent + elem = this.NavNext(itemIndex+1); + } + if (elem) { + elem.focus(); + } + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } +} + +function createResults(resultsPath) { + + function setKeyActions(elem,action) { + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); + } + + function setClassAttr(elem,attr) { + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); + } + + const results = document.getElementById("SRResults"); + results.innerHTML = ''; + searchData.forEach((elem,index) => { + const id = elem[0]; + const srResult = document.createElement('div'); + srResult.setAttribute('id','SR_'+id); + setClassAttr(srResult,'SRResult'); + const srEntry = document.createElement('div'); + setClassAttr(srEntry,'SREntry'); + const srLink = document.createElement('a'); + srLink.setAttribute('id','Item'+index); + setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); + setClassAttr(srLink,'SRSymbol'); + srLink.innerHTML = elem[1][0]; + srEntry.appendChild(srLink); + if (elem[1].length==2) { // single result + srLink.setAttribute('href',resultsPath+elem[1][1][0]); + srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); + if (elem[1][1][1]) { + srLink.setAttribute('target','_parent'); + } else { + srLink.setAttribute('target','_blank'); + } + const srScope = document.createElement('span'); + setClassAttr(srScope,'SRScope'); + srScope.innerHTML = elem[1][1][2]; + srEntry.appendChild(srScope); + } else { // multiple results + srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); + const srChildren = document.createElement('div'); + setClassAttr(srChildren,'SRChildren'); + for (let c=0; c + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/settings_parser/settings.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    settings.h
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include <iostream>
    +
    4#include <array>
    +
    5#include <fstream>
    +
    6#include <iostream>
    +
    7#include <functional>
    +
    8
    +
    + +
    14{
    +
    15 std::array<int, 2> nCells;
    +
    16 std::array<double, 2> physicalSize;
    +
    17 double re = 1000;
    +
    18 double endTime = 10.0;
    +
    19 double tau = 0.5;
    +
    20 double maximumDt = 0.1;
    +
    21
    +
    22 std::array<double, 2> g{0., 0.};
    +
    23
    +
    24 bool useDonorCell = false;
    +
    25 double alpha = 0.5;
    +
    26
    +
    27 // Boundary Conditions Type
    +
    28 std::string BCTop = "NoSlip";
    +
    29 std::string BCRight = "NoSlip";
    +
    30 std::string BCBottom = "NoSlip";
    +
    31 std::string BCLeft = "NoSlip";
    +
    32
    +
    33 // NoSlip boundary conditions
    +
    34 std::array<double, 2> NoSlipVelTop;
    +
    35 std::array<double, 2> NoSlipVelRight;
    +
    36 std::array<double, 2> NoSlipVelBottom;
    +
    37 std::array<double, 2> NoSlipVelLeft;
    +
    38
    +
    39 // Pressure boundary conditions
    +
    40 double PressureTop;
    + + +
    43 double PressureLeft;
    +
    44
    +
    45 // Create rectangular obstacle in domain
    + +
    47
    +
    48 // Create domain from PNGBitmap
    + +
    50 std::string pathToBitmap;
    +
    51
    +
    52 std::array<double, 2> obstaclePosition;
    +
    53 std::array<double, 2> obstacleDimension;
    +
    54
    +
    55 std::string pressureSolver = "SOR";
    +
    56 double omega = 1.0;
    +
    57 double epsilon = 1e-5;
    + +
    59
    +
    60
    +
    61 // Fluid Tracer
    +
    62 bool useFluidTracer = true;
    +
    63 int particlePerCell = 100;
    +
    68 std::string fluidTracerMethod = "single";
    +
    69 // bool useParticleSource = false; //!< Enables virtual particles source
    +
    70 // std::array<double, 2> particleSource = {0.5, 0.5}; //!< Source of virtual particles
    +
    71
    +
    72
    +
    73
    +
    74 // Writer Options
    +
    75
    +
    81 void loadFromFile(std::string filename);
    +
    82
    +
    86 void printSettings();
    +
    87
    +
    + +
    93 {
    +
    94 std::string parameterName;
    +
    95 std::string value;
    +
    96 bool isContent;
    +
    97 };
    +
    +
    98
    +
    104 LineContent readSingleLine(std::string line);
    +
    105
    +
    106 // sets the parameter to the corresponding value
    +
    113 void setParameter(std::string parameterName, std::string value);
    +
    114};
    +
    +
    Contains the content of a single line in a file.
    Definition settings.h:93
    +
    std::string value
    value of the parameter
    Definition settings.h:95
    +
    std::string parameterName
    Name of parameter.
    Definition settings.h:94
    +
    bool isContent
    whether line is readable parameter or comment
    Definition settings.h:96
    +
    All settings that parametrize a simulation run.
    Definition settings.h:14
    +
    bool useDonorCell
    if the donor cell scheme schould be used
    Definition settings.h:24
    +
    std::array< double, 2 > NoSlipVelBottom
    prescribed values of u,v at bottom of domain
    Definition settings.h:36
    +
    std::array< double, 2 > g
    external forces
    Definition settings.h:22
    +
    std::array< double, 2 > NoSlipVelRight
    prescribed values of u,v at right of domain
    Definition settings.h:35
    +
    std::array< double, 2 > physicalSize
    physical size of the domain
    Definition settings.h:16
    +
    std::string pathToBitmap
    path to bitmap
    Definition settings.h:50
    +
    std::array< int, 2 > nCells
    number of cells in x and y direction
    Definition settings.h:15
    +
    double PressureLeft
    prescribed pressure BC left of domain
    Definition settings.h:43
    +
    void loadFromFile(std::string filename)
    Parse a text file with settings.
    Definition settings.cpp:3
    +
    void setParameter(std::string parameterName, std::string value)
    Sets the parameter to the corresponding value.
    Definition settings.cpp:99
    +
    double PressureTop
    prescribed pressure BC top of domain
    Definition settings.h:40
    +
    bool createDomainfromBitmap
    wheter domain should be created from bitmap
    Definition settings.h:49
    +
    void printSettings()
    Print all setting to terminal.
    Definition settings.cpp:40
    +
    LineContent readSingleLine(std::string line)
    Reads one line of the settings file.
    Definition settings.cpp:53
    +
    std::string fluidTracerMethod
    Definition settings.h:68
    +
    double endTime
    end time of the simulation
    Definition settings.h:18
    +
    bool useFluidTracer
    Enables Open Surface Evolution.
    Definition settings.h:62
    +
    std::array< double, 2 > NoSlipVelTop
    prescribed values of u,v at top of domain
    Definition settings.h:34
    +
    std::string pressureSolver
    which pressure solver to use, "GaussSeidel" or "SOR"
    Definition settings.h:55
    +
    double alpha
    factor for donor-cell scheme
    Definition settings.h:25
    +
    double re
    reynolds number
    Definition settings.h:17
    +
    double PressureRight
    prescribed pressure BC right of domain
    Definition settings.h:41
    +
    double maximumDt
    maximum time step width
    Definition settings.h:20
    +
    bool createRectangularObject
    wheter a rectangular object in domain should be created
    Definition settings.h:46
    +
    double epsilon
    tolerance for the residual in the pressure solver
    Definition settings.h:57
    +
    std::array< double, 2 > NoSlipVelLeft
    prescribed values of u,v at left of domain
    Definition settings.h:37
    +
    int particlePerCell
    Initializes with given virtual particles per cell.
    Definition settings.h:63
    +
    int maximumNumberOfIterations
    maximum number of iterations in the solver
    Definition settings.h:58
    +
    double PressureBottom
    prescribed pressure BC bottom of domain
    Definition settings.h:42
    +
    double tau
    safety factor for time step width
    Definition settings.h:19
    +
    std::array< double, 2 > obstacleDimension
    x and y dimension of rectangular object
    Definition settings.h:53
    +
    double omega
    overrelaxation factor
    Definition settings.h:56
    +
    std::array< double, 2 > obstaclePosition
    x and y position of rectangular object
    Definition settings.h:52
    +
    + + + + diff --git a/documentation/html/sor_8h_source.html b/documentation/html/sor_8h_source.html new file mode 100644 index 00000000..bbaa387d --- /dev/null +++ b/documentation/html/sor_8h_source.html @@ -0,0 +1,117 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/solver/sor.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    sor.h
    +
    +
    +
    1#pragma once
    +
    2
    +
    3#include "pressure_solver.h"
    +
    4
    +
    +
    10class SOR : public PressureSolver
    +
    11{
    +
    12
    +
    13public:
    +
    22 SOR(const std::shared_ptr<Discretization> &data,
    +
    23 double epsilon,
    +
    24 int maximumNumberOfIterations,
    +
    25 std::shared_ptr<Boundary> boundary,
    +
    26 double omega);
    +
    27
    +
    32 void solve() override;
    +
    33
    +
    34private:
    +
    35 double omega_;
    +
    36};
    +
    +
    Solves the Poisson problem for the pressure.
    Definition pressure_solver.h:21
    +
    Successive over-relaxation solver.
    Definition sor.h:11
    +
    SOR(const std::shared_ptr< Discretization > &data, double epsilon, int maximumNumberOfIterations, std::shared_ptr< Boundary > boundary, double omega)
    Constructor.
    Definition sor.cpp:4
    +
    void solve() override
    override function that starts solver.
    Definition sor.cpp:12
    +
    + + + + diff --git a/documentation/html/splitbar.png b/documentation/html/splitbar.png new file mode 100644 index 0000000000000000000000000000000000000000..fe895f2c58179b471a22d8320b39a4bd7312ec8e GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/documentation/html/splitbard.png b/documentation/html/splitbard.png new file mode 100644 index 0000000000000000000000000000000000000000..8367416d757fd7b6dc4272b6432dc75a75abd068 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf@VhhFKy35^fiT zT~&lUj3=cDh^%3HDY9k5CEku}PHXNoNC(_$U3XPb&Q*ME25pT;2(*BOgAf<+R$lzakPG`kF31()Fx{L5Wrac|GQzjeE= zueY1`Ze{#x<8=S|`~MgGetGce)#vN&|J{Cd^tS%;tBYTo?+^d68<#n_Y_xx`J||4O V@QB{^CqU0Kc)I$ztaD0e0svEzbJzd? literal 0 HcmV?d00001 diff --git a/documentation/html/staggered__grid_8h_source.html b/documentation/html/staggered__grid_8h_source.html new file mode 100644 index 00000000..193163f5 --- /dev/null +++ b/documentation/html/staggered__grid_8h_source.html @@ -0,0 +1,219 @@ + + + + + + + +NumSim: /home/jonat/Documents/01_Studium/NumSim/src/discretization/staggered_grid.h Source File + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    staggered_grid.h
    +
    +
    +
    1#include <array>
    +
    2#include <vector>
    +
    3#include <iostream>
    +
    4#include "../storage/field_variable.h"
    +
    5
    +
    + +
    15{
    +
    16public:
    +
    23 StaggeredGrid(std::array<int, 2> nCells, std::array<double, 2> meshWidth);
    +
    24
    +
    28 const std::array<double, 2> meshWidth() const;
    +
    32 const std::array<int, 2> nCells() const;
    +
    33
    +
    37 const FieldVariable &u() const;
    +
    41 const FieldVariable &v() const;
    +
    45 const FieldVariable &p() const;
    +
    49 const FieldVariable &rhs() const;
    +
    50
    +
    54 double u(int i, int j) const;
    +
    58 double &u(int i, int j);
    +
    59
    +
    63 double v(int i, int j) const;
    +
    67 double &v(int i, int j);
    +
    68
    +
    72 double p(int i, int j) const;
    +
    76 double &p(int i, int j);
    +
    77
    +
    81 double &f(int i, int j);
    +
    85 double &g(int i, int j);
    +
    89 double &rhs(int i, int j);
    +
    90
    +
    94 double dx() const;
    +
    98 double dy() const;
    +
    99
    +
    103 int uIBegin() const;
    +
    107 int uIEnd() const;
    +
    108
    +
    112 int uJBegin() const;
    +
    116 int uJEnd() const;
    +
    117
    +
    121 int vIBegin() const;
    +
    125 int vIEnd() const;
    +
    126
    +
    130 int vJBegin() const;
    +
    134 int vJEnd() const;
    +
    135
    +
    139 int pIBegin() const;
    +
    143 int pIEnd() const;
    +
    144
    +
    148 int pJBegin() const;
    +
    152 int pJEnd() const;
    +
    153
    +
    157 int fIBegin() const;
    +
    161 int fIEnd() const;
    +
    162
    +
    166 int fJBegin() const;
    +
    170 int fJEnd() const;
    +
    171
    +
    175 int gIBegin() const;
    +
    179 int gIEnd() const;
    +
    180
    +
    184 int gJBegin() const;
    +
    188 int gJEnd() const;
    +
    189
    +
    193 int rhsIBegin() const;
    +
    197 int rhsIEnd() const;
    +
    198
    +
    202 int rhsJBegin() const;
    +
    206 int rhsJEnd() const;
    +
    207
    +
    208protected:
    +
    209 const std::array<int, 2> nCells_;
    +
    210 const std::array<double, 2> meshWidth_;
    + + + + + + +
    217};
    +
    +
    Discretization of a scalar function.
    Definition field_variable.h:18
    +
    Create field variables and define limits for the indices.
    Definition staggered_grid.h:15
    +
    int gIBegin() const
    first valid index for g in x direction
    Definition staggered_grid.cpp:159
    +
    int gJBegin() const
    first valid index for g in y direction
    Definition staggered_grid.cpp:169
    +
    FieldVariable v_
    instance of the field variable v
    Definition staggered_grid.h:212
    +
    const FieldVariable & v() const
    Get a reference to the field variable v.
    Definition staggered_grid.cpp:29
    +
    int rhsJBegin() const
    first valid index for rhs in y direction
    Definition staggered_grid.cpp:209
    +
    FieldVariable p_
    instance of the field variable p
    Definition staggered_grid.h:213
    +
    int uIBegin() const
    first valid index for u in x direction
    Definition staggered_grid.cpp:99
    +
    const std::array< double, 2 > meshWidth() const
    Get the length of a single cell in x and y directions.
    Definition staggered_grid.cpp:14
    +
    int uJEnd() const
    one after last valid index for u in y direction
    Definition staggered_grid.cpp:114
    +
    int pIEnd() const
    one after last valid index for p in x direction
    Definition staggered_grid.cpp:184
    +
    const FieldVariable & rhs() const
    Get a reference to the field variable rhs.
    Definition staggered_grid.cpp:39
    +
    FieldVariable rhs_
    instance of the field variable rhs
    Definition staggered_grid.h:216
    +
    int fIBegin() const
    first valid index for f in x direction
    Definition staggered_grid.cpp:119
    +
    FieldVariable g_
    instance of the field variable g
    Definition staggered_grid.h:215
    +
    int uIEnd() const
    one after last valid index for u in x direction
    Definition staggered_grid.cpp:104
    +
    int gJEnd() const
    one after last valid index for g in y direction
    Definition staggered_grid.cpp:174
    +
    int fJEnd() const
    one after last valid index for f in y direction
    Definition staggered_grid.cpp:134
    +
    int vJBegin() const
    first valid index for v in y direction
    Definition staggered_grid.cpp:149
    +
    int fIEnd() const
    one after last valid index for f in x direction
    Definition staggered_grid.cpp:124
    +
    const FieldVariable & u() const
    Get a reference to the field variable u.
    Definition staggered_grid.cpp:24
    +
    FieldVariable f_
    instance of the field variable f
    Definition staggered_grid.h:214
    +
    int rhsJEnd() const
    one after last valid index for rhs in y direction
    Definition staggered_grid.cpp:214
    +
    const std::array< double, 2 > meshWidth_
    array containing the sizes of cell edges in x and y directions
    Definition staggered_grid.h:210
    +
    int pIBegin() const
    first valid index for p in x direction
    Definition staggered_grid.cpp:179
    +
    int uJBegin() const
    first valid index for u in y direction
    Definition staggered_grid.cpp:109
    +
    int vIEnd() const
    one after last valid index for v in x direction
    Definition staggered_grid.cpp:144
    +
    double & g(int i, int j)
    Access value of g in element (i,j)
    Definition staggered_grid.cpp:79
    +
    const FieldVariable & p() const
    Get a reference to the field variable p.
    Definition staggered_grid.cpp:34
    +
    int vJEnd() const
    one after last valid index for v in y direction
    Definition staggered_grid.cpp:154
    +
    int fJBegin() const
    first valid index for f in y direction
    Definition staggered_grid.cpp:129
    +
    double dy() const
    Get the mesh width in y-direction.
    Definition staggered_grid.cpp:94
    +
    const std::array< int, 2 > nCells_
    array containing number of cells in x and y directions
    Definition staggered_grid.h:209
    +
    int vIBegin() const
    first valid index for v in x direction
    Definition staggered_grid.cpp:139
    +
    int rhsIBegin() const
    first valid index for rhs in x direction
    Definition staggered_grid.cpp:199
    +
    int pJEnd() const
    one after last valid index for p in y direction
    Definition staggered_grid.cpp:194
    +
    double & f(int i, int j)
    Access value of f in element (i,j)
    Definition staggered_grid.cpp:74
    +
    FieldVariable u_
    instance of the field variable u
    Definition staggered_grid.h:211
    +
    int rhsIEnd() const
    one after last valid index for rhs in x direction
    Definition staggered_grid.cpp:204
    +
    int pJBegin() const
    first valid index for p in y direction
    Definition staggered_grid.cpp:189
    +
    int gIEnd() const
    one after last valid index for g in x direction
    Definition staggered_grid.cpp:164
    +
    StaggeredGrid(std::array< int, 2 > nCells, std::array< double, 2 > meshWidth)
    Constructor.
    Definition staggered_grid.cpp:3
    +
    double dx() const
    Get the mesh width in x-direction.
    Definition staggered_grid.cpp:89
    +
    const std::array< int, 2 > nCells() const
    Get number of cells in x and y directions.
    Definition staggered_grid.cpp:19
    +
    + + + + diff --git a/documentation/html/structSettings-members.html b/documentation/html/structSettings-members.html new file mode 100644 index 00000000..be71e4d6 --- /dev/null +++ b/documentation/html/structSettings-members.html @@ -0,0 +1,123 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    Settings Member List
    +
    + + + + + diff --git a/documentation/html/structSettings.html b/documentation/html/structSettings.html new file mode 100644 index 00000000..c1366041 --- /dev/null +++ b/documentation/html/structSettings.html @@ -0,0 +1,352 @@ + + + + + + + +NumSim: Settings Struct Reference + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    Settings Struct Reference
    +
    +
    + +

    All settings that parametrize a simulation run. + More...

    + +

    #include <settings.h>

    + + + + + +

    +Classes

    struct  LineContent
     Contains the content of a single line in a file. More...
     
    + + + + + + + + + + + + + +

    +Public Member Functions

    void loadFromFile (std::string filename)
     Parse a text file with settings.
     
    +void printSettings ()
     Print all setting to terminal.
     
    LineContent readSingleLine (std::string line)
     Reads one line of the settings file.
     
    void setParameter (std::string parameterName, std::string value)
     Sets the parameter to the corresponding value.
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Attributes

    +std::array< int, 2 > nCells
     number of cells in x and y direction
     
    +std::array< double, 2 > physicalSize
     physical size of the domain
     
    +double re = 1000
     reynolds number
     
    +double endTime = 10.0
     end time of the simulation
     
    +double tau = 0.5
     safety factor for time step width
     
    +double maximumDt = 0.1
     maximum time step width
     
    +std::array< double, 2 > g {0., 0.}
     external forces
     
    +bool useDonorCell = false
     if the donor cell scheme schould be used
     
    +double alpha = 0.5
     factor for donor-cell scheme
     
    +std::string BCTop = "NoSlip"
     
    +std::string BCRight = "NoSlip"
     
    +std::string BCBottom = "NoSlip"
     
    +std::string BCLeft = "NoSlip"
     
    +std::array< double, 2 > NoSlipVelTop
     prescribed values of u,v at top of domain
     
    +std::array< double, 2 > NoSlipVelRight
     prescribed values of u,v at right of domain
     
    +std::array< double, 2 > NoSlipVelBottom
     prescribed values of u,v at bottom of domain
     
    +std::array< double, 2 > NoSlipVelLeft
     prescribed values of u,v at left of domain
     
    +double PressureTop
     prescribed pressure BC top of domain
     
    +double PressureRight
     prescribed pressure BC right of domain
     
    +double PressureBottom
     prescribed pressure BC bottom of domain
     
    +double PressureLeft
     prescribed pressure BC left of domain
     
    +bool createRectangularObject = false
     wheter a rectangular object in domain should be created
     
    +bool createDomainfromBitmap = false
     wheter domain should be created from bitmap
     
    +std::string pathToBitmap
     path to bitmap
     
    +std::array< double, 2 > obstaclePosition
     x and y position of rectangular object
     
    +std::array< double, 2 > obstacleDimension
     x and y dimension of rectangular object
     
    +std::string pressureSolver = "SOR"
     which pressure solver to use, "GaussSeidel" or "SOR"
     
    +double omega = 1.0
     overrelaxation factor
     
    +double epsilon = 1e-5
     tolerance for the residual in the pressure solver
     
    +int maximumNumberOfIterations = 1e5
     maximum number of iterations in the solver
     
    +bool useFluidTracer = true
     Enables Open Surface Evolution.
     
    +int particlePerCell = 100
     Initializes with given virtual particles per cell.
     
    std::string fluidTracerMethod = "single"
     
    +

    Detailed Description

    +

    All settings that parametrize a simulation run.

    +

    Member Function Documentation

    + +

    ◆ loadFromFile()

    + +
    +
    + + + + + + + + +
    void Settings::loadFromFile (std::string filename)
    +
    + +

    Parse a text file with settings.

    +

    Each line contains "<parameterName> = <value>"

    + +
    +
    + +

    ◆ readSingleLine()

    + +
    +
    + + + + + + + + +
    Settings::LineContent Settings::readSingleLine (std::string line)
    +
    + +

    Reads one line of the settings file.

    +
    Parameters
    + + +
    lineline of file to read
    +
    +
    + +
    +
    + +

    ◆ setParameter()

    + +
    +
    + + + + + + + + + + + + + + + + + + +
    void Settings::setParameter (std::string parameterName,
    std::string value 
    )
    +
    + +

    Sets the parameter to the corresponding value.

    +
    Parameters
    + + + +
    parameterNameparamter name
    valueof parameter
    +
    +
    + +
    +
    +

    Member Data Documentation

    + +

    ◆ fluidTracerMethod

    + +
    +
    + + + + +
    std::string Settings::fluidTracerMethod = "single"
    +
    +

    single -> one virtual particles is enough for fluid cell threshold -> aims at a constant amount of fluid cells

    + +
    +
    +
    The documentation for this struct was generated from the following files:
      +
    • /home/jonat/Documents/01_Studium/NumSim/src/settings_parser/settings.h
    • +
    • /home/jonat/Documents/01_Studium/NumSim/src/settings_parser/settings.cpp
    • +
    +
    + + + + diff --git a/documentation/html/structSettings_1_1LineContent-members.html b/documentation/html/structSettings_1_1LineContent-members.html new file mode 100644 index 00000000..bed13298 --- /dev/null +++ b/documentation/html/structSettings_1_1LineContent-members.html @@ -0,0 +1,93 @@ + + + + + + + +NumSim: Member List + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    Settings::LineContent Member List
    +
    +
    + +

    This is the complete list of members for Settings::LineContent, including all inherited members.

    + + + + +
    isContentSettings::LineContent
    parameterNameSettings::LineContent
    valueSettings::LineContent
    + + + + diff --git a/documentation/html/structSettings_1_1LineContent.html b/documentation/html/structSettings_1_1LineContent.html new file mode 100644 index 00000000..056e45ad --- /dev/null +++ b/documentation/html/structSettings_1_1LineContent.html @@ -0,0 +1,116 @@ + + + + + + + +NumSim: Settings::LineContent Struct Reference + + + + + + + + + + +
    +
    + + + + + + +
    +
    NumSim 1.0 +
    +
    Numerical Simulation of fluid-flow
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    + +
    Settings::LineContent Struct Reference
    +
    +
    + +

    Contains the content of a single line in a file. + More...

    + +

    #include <settings.h>

    + + + + + + + + + + + +

    +Public Attributes

    +std::string parameterName
     Name of parameter.
     
    +std::string value
     value of the parameter
     
    +bool isContent
     whether line is readable parameter or comment
     
    +

    Detailed Description

    +

    Contains the content of a single line in a file.

    +

    The documentation for this struct was generated from the following file:
      +
    • /home/jonat/Documents/01_Studium/NumSim/src/settings_parser/settings.h
    • +
    +
    + + + + diff --git a/documentation/html/sync_off.png b/documentation/html/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/documentation/html/sync_on.png b/documentation/html/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/documentation/html/tab_a.png b/documentation/html/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/documentation/html/tab_ad.png b/documentation/html/tab_ad.png new file mode 100644 index 0000000000000000000000000000000000000000..e34850acfc24be58da6d2fd1ccc6b29cc84fe34d GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QhuH;jv*C{Z|5d*H3V=pKi{In zd2jxLclDRPylmD}^l7{QOtL{vUjO{-WqItb5sQp2h-99b8^^Scr-=2mblCdZuUm?4 jzOJvgvt3{(cjKLW5(A@0qPS@<&}0TrS3j3^P6y&q2{!U5bk+Tso_B!YCpDh>v z{CM*1U8YvQRyBUHt^Ju0W_sq-?;9@_4equ-bavTs=gk796zopr0EBT&m;e9( literal 0 HcmV?d00001 diff --git a/documentation/html/tab_s.png b/documentation/html/tab_s.png new file mode 100644 index 0000000000000000000000000000000000000000..ab478c95b67371d700a20869f7de1ddd73522d50 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QuUrLjv*C{Z|^p8HaRdjTwH7) zC?wLlL}}I{)n%R&r+1}IGmDnq;&J#%V6)9VsYhS`O^BVBQlxOUep0c$RENLq#g8A$ z)z7%K_bI&n@J+X_=x}fJoEKed-$<>=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/documentation/html/tab_sd.png b/documentation/html/tab_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..757a565ced4730f85c833fb2547d8e199ae68f19 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qq7(&jv*C{Z|_!fH5o7*c=%9% zcILh!EA=pAQKdx-Cdiev=v{eg{8Ht<{e8_NAN~b=)%W>-WDCE0PyDHGemi$BoXwcK z{>e9^za6*c1ilttWw&V+U;WCPlV9{LdC~Ey%_H(qj`xgfES(4Yz5jSTZfCt`4E$0YRsR*S^mTCR^;V&sxC8{l_Cp7w8-YPgg&ebxsLQ00$vXK>z>% literal 0 HcmV?d00001 diff --git a/documentation/html/tabs.css b/documentation/html/tabs.css new file mode 100644 index 00000000..71c8a470 --- /dev/null +++ b/documentation/html/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important;color:var(--nav-menu-foreground-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} \ No newline at end of file diff --git a/documentation/latex/Makefile b/documentation/latex/Makefile new file mode 100644 index 00000000..7f829721 --- /dev/null +++ b/documentation/latex/Makefile @@ -0,0 +1,27 @@ +LATEX_CMD?=pdflatex +MKIDX_CMD?=makeindex +BIBTEX_CMD?=bibtex +LATEX_COUNT?=8 +MANUAL_FILE?=refman + +all: $(MANUAL_FILE).pdf + +pdf: $(MANUAL_FILE).pdf + +$(MANUAL_FILE).pdf: clean $(MANUAL_FILE).tex + $(LATEX_CMD) $(MANUAL_FILE) + $(MKIDX_CMD) $(MANUAL_FILE).idx + $(LATEX_CMD) $(MANUAL_FILE) + latex_count=$(LATEX_COUNT) ; \ + while grep -E -s 'Rerun (LaTeX|to get cross-references right|to get bibliographical references right)' $(MANUAL_FILE).log && [ $$latex_count -gt 0 ] ;\ + do \ + echo "Rerunning latex...." ;\ + $(LATEX_CMD) $(MANUAL_FILE) ;\ + latex_count=`expr $$latex_count - 1` ;\ + done + $(MKIDX_CMD) $(MANUAL_FILE).idx + $(LATEX_CMD) $(MANUAL_FILE) + + +clean: + rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl $(MANUAL_FILE).pdf diff --git a/documentation/latex/annotated.tex b/documentation/latex/annotated.tex new file mode 100644 index 00000000..0481edaf --- /dev/null +++ b/documentation/latex/annotated.tex @@ -0,0 +1,21 @@ +\doxysection{Class List} +Here are the classes, structs, unions and interfaces with brief descriptions\+:\begin{DoxyCompactList} +\item\contentsline{section}{\mbox{\hyperlink{classArray2D}{Array2D}} \\*This class represents a 2D array of double values }{\pageref{classArray2D}}{} +\item\contentsline{section}{\mbox{\hyperlink{classBoundary}{Boundary}} \\*Class responsible to caluclate boundary conditions }{\pageref{classBoundary}}{} +\item\contentsline{section}{\mbox{\hyperlink{classCentralDifferences}{Central\+Differences}} \\*Discretizes the problem using the central differences scheme }{\pageref{classCentralDifferences}}{} +\item\contentsline{section}{\mbox{\hyperlink{classComputation}{Computation}} \\*\doxylink{classComputation}{Computation} of Simulation }{\pageref{classComputation}}{} +\item\contentsline{section}{\mbox{\hyperlink{classDiscretization}{Discretization}} \\*Computes derivatives included in governing equations }{\pageref{classDiscretization}}{} +\item\contentsline{section}{\mbox{\hyperlink{classDonorCell}{Donor\+Cell}} \\*Discretizes the problem using the donor cell scheme }{\pageref{classDonorCell}}{} +\item\contentsline{section}{\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \\*\doxylink{classDiscretization}{Discretization} of a scalar function }{\pageref{classFieldVariable}}{} +\item\contentsline{section}{\mbox{\hyperlink{classFluidTracer}{Fluid\+Tracer}} }{\pageref{classFluidTracer}}{} +\item\contentsline{section}{\mbox{\hyperlink{classGaussSeidel}{Gauss\+Seidel}} \\*Standard Gauss-\/\+Seidel solver }{\pageref{classGaussSeidel}}{} +\item\contentsline{section}{\mbox{\hyperlink{structSettings_1_1LineContent}{Settings\+::\+Line\+Content}} \\*Contains the content of a single line in a file }{\pageref{structSettings_1_1LineContent}}{} +\item\contentsline{section}{\mbox{\hyperlink{classMask}{Mask}} }{\pageref{classMask}}{} +\item\contentsline{section}{\mbox{\hyperlink{classOutputWriter}{Output\+Writer}} \\*Inteface class for writing simulation data output }{\pageref{classOutputWriter}}{} +\item\contentsline{section}{\mbox{\hyperlink{classOutputWriterParaview}{Output\+Writer\+Paraview}} \\*Write \texorpdfstring{$\ast$}{*}.vti files that can be viewed with Para\+View }{\pageref{classOutputWriterParaview}}{} +\item\contentsline{section}{\mbox{\hyperlink{classOutputWriterText}{Output\+Writer\+Text}} \\*Write \texorpdfstring{$\ast$}{*}.txt files that are useful for debugging }{\pageref{classOutputWriterText}}{} +\item\contentsline{section}{\mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}} \\*Solves the Poisson problem for the pressure }{\pageref{classPressureSolver}}{} +\item\contentsline{section}{\mbox{\hyperlink{structSettings}{Settings}} \\*All settings that parametrize a simulation run }{\pageref{structSettings}}{} +\item\contentsline{section}{\mbox{\hyperlink{classSOR}{SOR}} \\*Successive over-\/relaxation solver }{\pageref{classSOR}}{} +\item\contentsline{section}{\mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}} \\*Create field variables and define limits for the indices }{\pageref{classStaggeredGrid}}{} +\end{DoxyCompactList} diff --git a/documentation/latex/array2D_8h_source.tex b/documentation/latex/array2D_8h_source.tex new file mode 100644 index 00000000..346059ad --- /dev/null +++ b/documentation/latex/array2D_8h_source.tex @@ -0,0 +1,52 @@ +\doxysection{array2\+D.\+h} +\hypertarget{array2D_8h_source}{}\label{array2D_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/storage/array2D.h@{/home/jonat/Documents/01\_Studium/NumSim/src/storage/array2D.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ } +\DoxyCodeLine{00007\ } + + + + + + +\DoxyCodeLine{00015\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classArray2D}{Array2D}}} +\DoxyCodeLine{00016\ \{} +\DoxyCodeLine{00017\ \textcolor{keyword}{public}:} + + + + +\DoxyCodeLine{00023\ \ \ \ \ \mbox{\hyperlink{classArray2D_a16521417dfdf67ec694bfb7747df9000}{Array2D}}(std::array\ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}});} +\DoxyCodeLine{00024\ } + + + + + + +\DoxyCodeLine{00032\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8}{operator()}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} +\DoxyCodeLine{00033\ } + + + + + + +\DoxyCodeLine{00041\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8}{operator()}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00042\ } + + +\DoxyCodeLine{00046\ \ \ \ \ std::array\ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00047\ } +\DoxyCodeLine{00048\ \textcolor{keyword}{protected}:} +\DoxyCodeLine{00049\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ \mbox{\hyperlink{classArray2D_a75bc7a1ff6f218c38f6ab94ec34e9472}{size\_}};\ } +\DoxyCodeLine{00050\ \ \ \ \ std::vector\ \mbox{\hyperlink{classArray2D_af1572f75d219caab4b2372a98341b991}{data\_}};\ \ \ \ \ \ } +\DoxyCodeLine{00051\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/boundary_8h_source.tex b/documentation/latex/boundary_8h_source.tex new file mode 100644 index 00000000..c1ef33d1 --- /dev/null +++ b/documentation/latex/boundary_8h_source.tex @@ -0,0 +1,105 @@ +\doxysection{boundary.\+h} +\hypertarget{boundary_8h_source}{}\label{boundary_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/boundary/boundary.h@{/home/jonat/Documents/01\_Studium/NumSim/src/boundary/boundary.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}mask.h"{}}} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ "{}../discretization/discretization.h"{}}} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ "{}../settings\_parser/settings.h"{}}} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00008\ } + + + + +\DoxyCodeLine{00014\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classBoundary}{Boundary}}} +\DoxyCodeLine{00015\ \{} +\DoxyCodeLine{00016\ \textcolor{keyword}{public}:} + + + + + + +\DoxyCodeLine{00024\ \ \ \ \ \mbox{\hyperlink{classBoundary_a4c78a28ad0839810f15229382f642cf1}{Boundary}}(std::shared\_ptr\ mask,\ std::shared\_ptr\ discretization,\ \mbox{\hyperlink{structSettings}{Settings}}\ settings);} +\DoxyCodeLine{00025\ } + + +\DoxyCodeLine{00029\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classBoundary_a77c90b2a43220ce9796d098158e4376d}{setPressureBoundaryValues}}();} +\DoxyCodeLine{00030\ } + + + + +\DoxyCodeLine{00036\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classBoundary_ac603742c37221bd82cbb545b6cdbe6cb}{setPressureSurfaceBC}}();} +\DoxyCodeLine{00037\ } + + +\DoxyCodeLine{00041\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classBoundary_ab7e15ee44237de051ff8347f2f9c770b}{setVelocityBoundaryValues}}();} +\DoxyCodeLine{00042\ } + + + + + + +\DoxyCodeLine{00050\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classBoundary_ab7e15ee44237de051ff8347f2f9c770b}{setVelocityBoundaryValues}}(\textcolor{keywordtype}{double}\ dt);} +\DoxyCodeLine{00051\ } + + +\DoxyCodeLine{00055\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{classBoundary_ac76b887d65491d38c093ca50333697a9}{doCalculateF}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00056\ } + + +\DoxyCodeLine{00060\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{classBoundary_aacf325c02e71925b7847d7189282b5c1}{doCalculateG}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00061\ } + + +\DoxyCodeLine{00065\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classBoundary_a9910a68c5dec5845ef4cdde98e680155}{updateBoundary}}();} +\DoxyCodeLine{00066\ } +\DoxyCodeLine{00067\ \ \ \ \ std::shared\_ptr\ \mbox{\hyperlink{classBoundary_a25d33b12fbdf312cf319713ff88b3d38}{mask\_}};\ } +\DoxyCodeLine{00068\ } +\DoxyCodeLine{00069\ \textcolor{keyword}{private}:} + + +\DoxyCodeLine{00073\ \ \ \ \ \textcolor{keywordtype}{void}\ createBoundaryCellsLists();} +\DoxyCodeLine{00074\ } + + +\DoxyCodeLine{00078\ \ \ \ \ \textcolor{keywordtype}{void}\ setPressureDomainBC();} +\DoxyCodeLine{00079\ } + + +\DoxyCodeLine{00083\ \ \ \ \ \textcolor{keywordtype}{void}\ setPressureObstacleBC();} +\DoxyCodeLine{00084\ } + + +\DoxyCodeLine{00088\ \ \ \ \ \textcolor{keywordtype}{void}\ setVelocityDomainBC();} +\DoxyCodeLine{00089\ } + + +\DoxyCodeLine{00093\ \ \ \ \ \textcolor{keywordtype}{void}\ setVelocityObstacleBC();} +\DoxyCodeLine{00094\ } + + +\DoxyCodeLine{00098\ \ \ \ \ \textcolor{keywordtype}{void}\ setVelocitySurfaceBC();} +\DoxyCodeLine{00099\ } + + +\DoxyCodeLine{00103\ \ \ \ \ \textcolor{keywordtype}{void}\ updateVelocitySurfaceBC(\textcolor{keywordtype}{double}\ dt);} +\DoxyCodeLine{00104\ } + + +\DoxyCodeLine{00108\ \ \ \ \ \textcolor{keywordtype}{void}\ setAirCellsZero();} +\DoxyCodeLine{00109\ } +\DoxyCodeLine{00110\ \ \ \ \ std::shared\_ptr\ discretization\_;\ } +\DoxyCodeLine{00111\ \ \ \ \ \mbox{\hyperlink{structSettings}{Settings}}\ settings\_;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00112\ } +\DoxyCodeLine{00113\ \ \ \ \ std::vector\ domainBoundaryCells\_;\ \ \ } +\DoxyCodeLine{00114\ \ \ \ \ std::vector\ obstacleBoundaryCells\_;\ } +\DoxyCodeLine{00115\ \ \ \ \ std::vector\ fluidBoundaryCells\_;\ \ \ \ } +\DoxyCodeLine{00116\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/central__differences_8h_source.tex b/documentation/latex/central__differences_8h_source.tex new file mode 100644 index 00000000..07dcef1d --- /dev/null +++ b/documentation/latex/central__differences_8h_source.tex @@ -0,0 +1,45 @@ +\doxysection{central\+\_\+differences.\+h} +\hypertarget{central__differences_8h_source}{}\label{central__differences_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/discretization/central\_differences.h@{/home/jonat/Documents/01\_Studium/NumSim/src/discretization/central\_differences.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ "{}discretization.h"{}}} +\DoxyCodeLine{00006\ } + + + + + + +\DoxyCodeLine{00014\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classCentralDifferences}{CentralDifferences}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classDiscretization}{Discretization}}} +\DoxyCodeLine{00015\ \{} +\DoxyCodeLine{00016\ \textcolor{keyword}{public}:} + + + + + +\DoxyCodeLine{00023\ \ \ \ \ \mbox{\hyperlink{classCentralDifferences_ab055731e615298f745364c54f86fc191}{CentralDifferences}}(std::array\ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{nCells}},\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{meshWidth}});} +\DoxyCodeLine{00024\ } + + + +\DoxyCodeLine{00029\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classCentralDifferences_adb4502f473cc047a433db596146672e4}{computeDu2Dx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} + + + +\DoxyCodeLine{00034\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classCentralDifferences_a66eb9b800b9a9ac6f81fc719a42eb0ee}{computeDv2Dy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} + + + +\DoxyCodeLine{00039\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classCentralDifferences_a9bd7ac3bfd709991525ec57de10ed2e1}{computeDuvDx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} + + + +\DoxyCodeLine{00044\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classCentralDifferences_a4184367de8d48e678edfb078a19fc0a4}{computeDuvDy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} +\DoxyCodeLine{00045\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/classArray2D.eps b/documentation/latex/classArray2D.eps new file mode 100644 index 00000000..fc8663d7 --- /dev/null +++ b/documentation/latex/classArray2D.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 416.666656 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.200000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(Array2D) cw +(FieldVariable) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (Array2D) 0.000000 1.000000 box + (FieldVariable) 0.000000 0.000000 box + +% ----- relations ----- + +solid +1 0.000000 0.250000 out +solid +0 0.000000 0.750000 in diff --git a/documentation/latex/classArray2D.pdf b/documentation/latex/classArray2D.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9cf977ee3d8bc6ccafb9b42fae158fb71afc9c82 GIT binary patch literal 4942 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 S5JtnZfs?_HGk0GP%6|bfy&jAJ literal 0 HcmV?d00001 diff --git a/documentation/latex/classArray2D.tex b/documentation/latex/classArray2D.tex new file mode 100644 index 00000000..c4552f97 --- /dev/null +++ b/documentation/latex/classArray2D.tex @@ -0,0 +1,104 @@ +\doxysection{Array2D Class Reference} +\hypertarget{classArray2D}{}\label{classArray2D}\index{Array2D@{Array2D}} + + +This class represents a 2D array of double values. + + + + +{\ttfamily \#include $<$array2\+D.\+h$>$} + +Inheritance diagram for Array2D\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classArray2D} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classArray2D_a16521417dfdf67ec694bfb7747df9000}{Array2D}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}}) +\begin{DoxyCompactList}\small\item\em constructor. \end{DoxyCompactList}\item +double \& \mbox{\hyperlink{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8}{operator()}} (int i, int j) +\begin{DoxyCompactList}\small\item\em set array value. Overloads the () operator \end{DoxyCompactList}\item +double \mbox{\hyperlink{classArray2D_af745718ec25b815051de2d0c3c94e0d2}{operator()}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em get array value. Overloads the () operator \end{DoxyCompactList}\item +\Hypertarget{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}\label{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9} +std\+::array$<$ int, 2 $>$ {\bfseries size} () const +\begin{DoxyCompactList}\small\item\em get size of array in x and y direction \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classArray2D_a75bc7a1ff6f218c38f6ab94ec34e9472}\label{classArray2D_a75bc7a1ff6f218c38f6ab94ec34e9472} +const std\+::array$<$ int, 2 $>$ {\bfseries size\+\_\+} +\begin{DoxyCompactList}\small\item\em size of array in x and y direction \end{DoxyCompactList}\item +\Hypertarget{classArray2D_af1572f75d219caab4b2372a98341b991}\label{classArray2D_af1572f75d219caab4b2372a98341b991} +std\+::vector$<$ double $>$ {\bfseries data\+\_\+} +\begin{DoxyCompactList}\small\item\em storage array values, in row-\/major order \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +This class represents a 2D array of double values. + +Internally they are stored consecutively in memory. The entries can be accessed by two indices i,j. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classArray2D_a16521417dfdf67ec694bfb7747df9000}\label{classArray2D_a16521417dfdf67ec694bfb7747df9000} +\index{Array2D@{Array2D}!Array2D@{Array2D}} +\index{Array2D@{Array2D}!Array2D@{Array2D}} +\doxysubsubsection{\texorpdfstring{Array2D()}{Array2D()}} +{\footnotesize\ttfamily Array2\+D\+::\+Array2D (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{size }\end{DoxyParamCaption})} + + + +constructor. + + +\begin{DoxyParams}{Parameters} +{\em size} & size of array in x and y direction \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8}\label{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8} +\index{Array2D@{Array2D}!operator()@{operator()}} +\index{operator()@{operator()}!Array2D@{Array2D}} +\doxysubsubsection{\texorpdfstring{operator()()}{operator()()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily double \& Array2\+D\+::operator() (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption})} + + + +set array value. Overloads the () operator + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction \\ +\hline +\end{DoxyParams} +\Hypertarget{classArray2D_af745718ec25b815051de2d0c3c94e0d2}\label{classArray2D_af745718ec25b815051de2d0c3c94e0d2} +\index{Array2D@{Array2D}!operator()@{operator()}} +\index{operator()@{operator()}!Array2D@{Array2D}} +\doxysubsubsection{\texorpdfstring{operator()()}{operator()()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily double Array2\+D\+::operator() (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} + + + +get array value. Overloads the () operator + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/storage/array2\+D.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/storage/array2\+D.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classBoundary.tex b/documentation/latex/classBoundary.tex new file mode 100644 index 00000000..cb619376 --- /dev/null +++ b/documentation/latex/classBoundary.tex @@ -0,0 +1,102 @@ +\doxysection{Boundary Class Reference} +\hypertarget{classBoundary}{}\label{classBoundary}\index{Boundary@{Boundary}} + + +Class responsible to caluclate boundary conditions. + + + + +{\ttfamily \#include $<$boundary.\+h$>$} + +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classBoundary_a4c78a28ad0839810f15229382f642cf1}{Boundary}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$ mask, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, \mbox{\hyperlink{structSettings}{Settings}} settings) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +\Hypertarget{classBoundary_a77c90b2a43220ce9796d098158e4376d}\label{classBoundary_a77c90b2a43220ce9796d098158e4376d} +void {\bfseries set\+Pressure\+Boundary\+Values} () +\begin{DoxyCompactList}\small\item\em calculates and sets the pressure boundary values for obstacles and domain boundary \end{DoxyCompactList}\item +void \mbox{\hyperlink{classBoundary_ac603742c37221bd82cbb545b6cdbe6cb}{set\+Pressure\+Surface\+BC}} () +\begin{DoxyCompactList}\small\item\em calculates and sets the pressure boundary values for surface boundary \end{DoxyCompactList}\item +\Hypertarget{classBoundary_ab7e15ee44237de051ff8347f2f9c770b}\label{classBoundary_ab7e15ee44237de051ff8347f2f9c770b} +void {\bfseries set\+Velocity\+Boundary\+Values} () +\begin{DoxyCompactList}\small\item\em calculates and sets the velocity boundary values for surface, obstacle and domain boundary \end{DoxyCompactList}\item +void \mbox{\hyperlink{classBoundary_a81d6f13c90f37e63fc0cad27a6999915}{set\+Velocity\+Boundary\+Values}} (double dt) +\begin{DoxyCompactList}\small\item\em overloaded function that sets velocity boundary \end{DoxyCompactList}\item +\Hypertarget{classBoundary_ac76b887d65491d38c093ca50333697a9}\label{classBoundary_ac76b887d65491d38c093ca50333697a9} +bool {\bfseries do\+CalculateF} (int i, int j) const +\begin{DoxyCompactList}\small\item\em returns true if cell left and rigt of F value are fluid (not a boundary value) \end{DoxyCompactList}\item +\Hypertarget{classBoundary_aacf325c02e71925b7847d7189282b5c1}\label{classBoundary_aacf325c02e71925b7847d7189282b5c1} +bool {\bfseries do\+CalculateG} (int i, int j) const +\begin{DoxyCompactList}\small\item\em returns true if cell top and bottom of G value are fluid (not a boundary value) \end{DoxyCompactList}\item +\Hypertarget{classBoundary_a9910a68c5dec5845ef4cdde98e680155}\label{classBoundary_a9910a68c5dec5845ef4cdde98e680155} +void {\bfseries update\+Boundary} () +\begin{DoxyCompactList}\small\item\em updates fluid boundary cell list \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classBoundary_a25d33b12fbdf312cf319713ff88b3d38}\label{classBoundary_a25d33b12fbdf312cf319713ff88b3d38} +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$ {\bfseries mask\+\_\+} +\begin{DoxyCompactList}\small\item\em shared pointer to mask entity \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Class responsible to caluclate boundary conditions. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classBoundary_a4c78a28ad0839810f15229382f642cf1}\label{classBoundary_a4c78a28ad0839810f15229382f642cf1} +\index{Boundary@{Boundary}!Boundary@{Boundary}} +\index{Boundary@{Boundary}!Boundary@{Boundary}} +\doxysubsubsection{\texorpdfstring{Boundary()}{Boundary()}} +{\footnotesize\ttfamily Boundary\+::\+Boundary (\begin{DoxyParamCaption}\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$}]{mask, }\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$}]{discretization, }\item[{\mbox{\hyperlink{structSettings}{Settings}}}]{settings }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em discretization} & instance of \doxylink{classDiscretization}{Discretization} holding the needed field variables for rhs and p \\ +\hline +{\em mask} & instance of mask holding the boundary condition enums for each cell tolerance for the solver \\ +\hline +{\em settings} & holding the necessary domainn boundary condition \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classBoundary_ac603742c37221bd82cbb545b6cdbe6cb}\label{classBoundary_ac603742c37221bd82cbb545b6cdbe6cb} +\index{Boundary@{Boundary}!setPressureSurfaceBC@{setPressureSurfaceBC}} +\index{setPressureSurfaceBC@{setPressureSurfaceBC}!Boundary@{Boundary}} +\doxysubsubsection{\texorpdfstring{setPressureSurfaceBC()}{setPressureSurfaceBC()}} +{\footnotesize\ttfamily void Boundary\+::set\+Pressure\+Surface\+BC (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} + + + +calculates and sets the pressure boundary values for surface boundary + +Only needs to be set once -\/\texorpdfstring{$>$}{>} no need to update each solver iteration \Hypertarget{classBoundary_a81d6f13c90f37e63fc0cad27a6999915}\label{classBoundary_a81d6f13c90f37e63fc0cad27a6999915} +\index{Boundary@{Boundary}!setVelocityBoundaryValues@{setVelocityBoundaryValues}} +\index{setVelocityBoundaryValues@{setVelocityBoundaryValues}!Boundary@{Boundary}} +\doxysubsubsection{\texorpdfstring{setVelocityBoundaryValues()}{setVelocityBoundaryValues()}} +{\footnotesize\ttfamily void Boundary\+::set\+Velocity\+Boundary\+Values (\begin{DoxyParamCaption}\item[{double}]{dt }\end{DoxyParamCaption})} + + + +overloaded function that sets velocity boundary + +necessary when fluid tracker is used + + +\begin{DoxyParams}{Parameters} +{\em dt} & current time step \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/boundary/boundary.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/boundary/boundary.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classCentralDifferences.eps b/documentation/latex/classCentralDifferences.eps new file mode 100644 index 00000000..04ccd50f --- /dev/null +++ b/documentation/latex/classCentralDifferences.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 472.440948 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.058333 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(CentralDifferences) cw +(Discretization) cw +(StaggeredGrid) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (CentralDifferences) 0.000000 0.000000 box + (Discretization) 0.000000 1.000000 box + (StaggeredGrid) 0.000000 2.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in +solid +0 0.000000 1.000000 out +solid +1 0.000000 2.000000 in diff --git a/documentation/latex/classCentralDifferences.pdf b/documentation/latex/classCentralDifferences.pdf new file mode 100644 index 0000000000000000000000000000000000000000..03fe6efd7987b49a1e0a472be8ddc7a199180a21 GIT binary patch literal 5704 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 literal 0 HcmV?d00001 diff --git a/documentation/latex/classCentralDifferences.tex b/documentation/latex/classCentralDifferences.tex new file mode 100644 index 00000000..c4ba71b1 --- /dev/null +++ b/documentation/latex/classCentralDifferences.tex @@ -0,0 +1,244 @@ +\doxysection{Central\+Differences Class Reference} +\hypertarget{classCentralDifferences}{}\label{classCentralDifferences}\index{CentralDifferences@{CentralDifferences}} + + +Discretizes the problem using the central differences scheme. + + + + +{\ttfamily \#include $<$central\+\_\+differences.\+h$>$} + +Inheritance diagram for Central\+Differences\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classCentralDifferences} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classCentralDifferences_ab055731e615298f745364c54f86fc191}{Central\+Differences}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classCentralDifferences_adb4502f473cc047a433db596146672e4}{compute\+Du2\+Dx}} (int i, int j) const override +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x with the central differences Scheme. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classCentralDifferences_a66eb9b800b9a9ac6f81fc719a42eb0ee}{compute\+Dv2\+Dy}} (int i, int j) const override +\begin{DoxyCompactList}\small\item\em Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y with the central differences Scheme. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classCentralDifferences_a9bd7ac3bfd709991525ec57de10ed2e1}{compute\+Duv\+Dx}} (int i, int j) const override +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x with the central differences Scheme. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classCentralDifferences_a4184367de8d48e678edfb078a19fc0a4}{compute\+Duv\+Dy}} (int i, int j) const override +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y with the central differences Scheme. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classDiscretization}{Discretization}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c}{Discretization}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+D2u\+Dx2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to x. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+D2u\+Dy2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to y. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+D2v\+Dx2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to x. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+D2v\+Dy2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to y. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+Dp\+Dx} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to x. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+Dp\+Dy} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to y. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}{Staggered\+Grid}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width} () const +\begin{DoxyCompactList}\small\item\em Get the length of a single cell in x and y directions. \end{DoxyCompactList}\item +const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells} () const +\begin{DoxyCompactList}\small\item\em Get number of cells in x and y directions. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries u} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable u. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries v} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable v. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries p} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable p. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries rhs} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable rhs. \end{DoxyCompactList}\item +double {\bfseries u} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries u} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j) \end{DoxyCompactList}\item +double {\bfseries v} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries v} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j) \end{DoxyCompactList}\item +double {\bfseries p} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries p} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries f} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of f in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries g} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of g in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries rhs} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of rhs in element (i,j) \end{DoxyCompactList}\item +double {\bfseries dx} () const +\begin{DoxyCompactList}\small\item\em Get the mesh width in x-\/direction. \end{DoxyCompactList}\item +double {\bfseries dy} () const +\begin{DoxyCompactList}\small\item\em Get the mesh width in y-\/direction. \end{DoxyCompactList}\item +int {\bfseries u\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for u in x direction \end{DoxyCompactList}\item +int {\bfseries u\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for u in x direction \end{DoxyCompactList}\item +int {\bfseries u\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for u in y direction \end{DoxyCompactList}\item +int {\bfseries u\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for u in y direction \end{DoxyCompactList}\item +int {\bfseries v\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for v in x direction \end{DoxyCompactList}\item +int {\bfseries v\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for v in x direction \end{DoxyCompactList}\item +int {\bfseries v\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for v in y direction \end{DoxyCompactList}\item +int {\bfseries v\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for v in y direction \end{DoxyCompactList}\item +int {\bfseries p\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for p in x direction \end{DoxyCompactList}\item +int {\bfseries p\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for p in x direction \end{DoxyCompactList}\item +int {\bfseries p\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for p in y direction \end{DoxyCompactList}\item +int {\bfseries p\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for p in y direction \end{DoxyCompactList}\item +int {\bfseries f\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for f in x direction \end{DoxyCompactList}\item +int {\bfseries f\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for f in x direction \end{DoxyCompactList}\item +int {\bfseries f\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for f in y direction \end{DoxyCompactList}\item +int {\bfseries f\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for f in y direction \end{DoxyCompactList}\item +int {\bfseries g\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for g in x direction \end{DoxyCompactList}\item +int {\bfseries g\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for g in x direction \end{DoxyCompactList}\item +int {\bfseries g\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for g in y direction \end{DoxyCompactList}\item +int {\bfseries g\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for g in y direction \end{DoxyCompactList}\item +int {\bfseries rhs\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries rhs\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries rhs\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for rhs in y direction \end{DoxyCompactList}\item +int {\bfseries rhs\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in y direction \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Additional Inherited Members} +\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} +\begin{DoxyCompactItemize} +\item +const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells\+\_\+} +\begin{DoxyCompactList}\small\item\em array containing number of cells in x and y directions \end{DoxyCompactList}\item +const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width\+\_\+} +\begin{DoxyCompactList}\small\item\em array containing the sizes of cell edges in x and y directions \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries u\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable u \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries v\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable v \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries p\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable p \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries f\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable f \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries g\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable g \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries rhs\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable rhs \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Discretizes the problem using the central differences scheme. + +Implements the first derivatives of u\texorpdfstring{$^\wedge$}{\string^}2, v\texorpdfstring{$^\wedge$}{\string^}2 and u\texorpdfstring{$\ast$}{*}v according to the central differences scheme + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classCentralDifferences_ab055731e615298f745364c54f86fc191}\label{classCentralDifferences_ab055731e615298f745364c54f86fc191} +\index{CentralDifferences@{CentralDifferences}!CentralDifferences@{CentralDifferences}} +\index{CentralDifferences@{CentralDifferences}!CentralDifferences@{CentralDifferences}} +\doxysubsubsection{\texorpdfstring{CentralDifferences()}{CentralDifferences()}} +{\footnotesize\ttfamily Central\+Differences\+::\+Central\+Differences (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{n\+Cells, }\item[{std\+::array$<$ double, 2 $>$}]{mesh\+Width }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em n\+Cells} & array containing number of cells in x and y directions \\ +\hline +{\em mesh\+Width} & array containing the length of a single cell in x and y directions \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classCentralDifferences_adb4502f473cc047a433db596146672e4}\label{classCentralDifferences_adb4502f473cc047a433db596146672e4} +\index{CentralDifferences@{CentralDifferences}!computeDu2Dx@{computeDu2Dx}} +\index{computeDu2Dx@{computeDu2Dx}!CentralDifferences@{CentralDifferences}} +\doxysubsubsection{\texorpdfstring{computeDu2Dx()}{computeDu2Dx()}} +{\footnotesize\ttfamily double Central\+Differences\+::compute\+Du2\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x with the central differences Scheme. + + + +Implements \mbox{\hyperlink{classDiscretization_acca6bf193e0e91f645d292527299254b}{Discretization}}. + +\Hypertarget{classCentralDifferences_a9bd7ac3bfd709991525ec57de10ed2e1}\label{classCentralDifferences_a9bd7ac3bfd709991525ec57de10ed2e1} +\index{CentralDifferences@{CentralDifferences}!computeDuvDx@{computeDuvDx}} +\index{computeDuvDx@{computeDuvDx}!CentralDifferences@{CentralDifferences}} +\doxysubsubsection{\texorpdfstring{computeDuvDx()}{computeDuvDx()}} +{\footnotesize\ttfamily double Central\+Differences\+::compute\+Duv\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x with the central differences Scheme. + + + +Implements \mbox{\hyperlink{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795}{Discretization}}. + +\Hypertarget{classCentralDifferences_a4184367de8d48e678edfb078a19fc0a4}\label{classCentralDifferences_a4184367de8d48e678edfb078a19fc0a4} +\index{CentralDifferences@{CentralDifferences}!computeDuvDy@{computeDuvDy}} +\index{computeDuvDy@{computeDuvDy}!CentralDifferences@{CentralDifferences}} +\doxysubsubsection{\texorpdfstring{computeDuvDy()}{computeDuvDy()}} +{\footnotesize\ttfamily double Central\+Differences\+::compute\+Duv\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y with the central differences Scheme. + + + +Implements \mbox{\hyperlink{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84}{Discretization}}. + +\Hypertarget{classCentralDifferences_a66eb9b800b9a9ac6f81fc719a42eb0ee}\label{classCentralDifferences_a66eb9b800b9a9ac6f81fc719a42eb0ee} +\index{CentralDifferences@{CentralDifferences}!computeDv2Dy@{computeDv2Dy}} +\index{computeDv2Dy@{computeDv2Dy}!CentralDifferences@{CentralDifferences}} +\doxysubsubsection{\texorpdfstring{computeDv2Dy()}{computeDv2Dy()}} +{\footnotesize\ttfamily double Central\+Differences\+::compute\+Dv2\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y with the central differences Scheme. + + + +Implements \mbox{\hyperlink{classDiscretization_a69ba136ab7f8c09d805afca159cab428}{Discretization}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/discretization/central\+\_\+differences.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/discretization/central\+\_\+differences.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classComputation.tex b/documentation/latex/classComputation.tex new file mode 100644 index 00000000..ad2cec7e --- /dev/null +++ b/documentation/latex/classComputation.tex @@ -0,0 +1,50 @@ +\doxysection{Computation Class Reference} +\hypertarget{classComputation}{}\label{classComputation}\index{Computation@{Computation}} + + +\doxylink{classComputation}{Computation} of Simulation. + + + + +{\ttfamily \#include $<$computation.\+h$>$} + +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +void \mbox{\hyperlink{classComputation_a4a344479797b15bd5c9ed2f262657339}{initialize}} (int argc, char \texorpdfstring{$\ast$}{*}argv\mbox{[}$\,$\mbox{]}) +\begin{DoxyCompactList}\small\item\em Initialize the simulation with settings from .txt file. \end{DoxyCompactList}\item +\Hypertarget{classComputation_ad20ce6e82ec9a918e6ac03840bc688d5}\label{classComputation_ad20ce6e82ec9a918e6ac03840bc688d5} +void {\bfseries run\+Simulation} () +\begin{DoxyCompactList}\small\item\em run the whole simulation until t\+\_\+end \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\doxylink{classComputation}{Computation} of Simulation. + +Combines discretization, pressure solver and outputwriter + +\doxysubsection{Member Function Documentation} +\Hypertarget{classComputation_a4a344479797b15bd5c9ed2f262657339}\label{classComputation_a4a344479797b15bd5c9ed2f262657339} +\index{Computation@{Computation}!initialize@{initialize}} +\index{initialize@{initialize}!Computation@{Computation}} +\doxysubsubsection{\texorpdfstring{initialize()}{initialize()}} +{\footnotesize\ttfamily void Computation\+::initialize (\begin{DoxyParamCaption}\item[{int}]{argc, }\item[{char \texorpdfstring{$\ast$}{*}}]{argv\mbox{[}$\,$\mbox{]} }\end{DoxyParamCaption})} + + + +Initialize the simulation with settings from .txt file. + + +\begin{DoxyParams}{Parameters} +{\em argc} & counts of CLI commands \\ +\hline +{\em argv} & values of CLI commands, expect settings.\+txt filename \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/computation.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/computation.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classDiscretization.eps b/documentation/latex/classDiscretization.eps new file mode 100644 index 00000000..486eee2b --- /dev/null +++ b/documentation/latex/classDiscretization.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 236.220474 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.116667 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(Discretization) cw +(StaggeredGrid) cw +(CentralDifferences) cw +(DonorCell) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (Discretization) 0.500000 1.000000 box + (StaggeredGrid) 0.500000 2.000000 box + (CentralDifferences) 0.000000 0.000000 box + (DonorCell) 1.000000 0.000000 box + +% ----- relations ----- + +solid +0 0.500000 1.000000 out +solid +1 0.500000 2.000000 in +solid +1 0.500000 0.250000 out +solid +0.000000 1.000000 1.000000 conn +solid +0 0.000000 0.750000 in +solid +0 1.000000 0.750000 in diff --git a/documentation/latex/classDiscretization.pdf b/documentation/latex/classDiscretization.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9d9e1734ae00209ca4dbe05a191a7012f5fa5845 GIT binary patch literal 5766 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 + +Inheritance diagram for Discretization\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classDiscretization} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c}{Discretization}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +virtual double \mbox{\hyperlink{classDiscretization_acca6bf193e0e91f645d292527299254b}{compute\+Du2\+Dx}} (int i, int j) const =0 +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x. \end{DoxyCompactList}\item +virtual double \mbox{\hyperlink{classDiscretization_a69ba136ab7f8c09d805afca159cab428}{compute\+Dv2\+Dy}} (int i, int j) const =0 +\begin{DoxyCompactList}\small\item\em Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y. \end{DoxyCompactList}\item +virtual double \mbox{\hyperlink{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795}{compute\+Duv\+Dx}} (int i, int j) const =0 +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x. \end{DoxyCompactList}\item +virtual double \mbox{\hyperlink{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84}{compute\+Duv\+Dy}} (int i, int j) const =0 +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y. \end{DoxyCompactList}\item +\Hypertarget{classDiscretization_a6986501b0b5c96699ff3ac843c1a6ca2}\label{classDiscretization_a6986501b0b5c96699ff3ac843c1a6ca2} +virtual double {\bfseries compute\+D2u\+Dx2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to x. \end{DoxyCompactList}\item +\Hypertarget{classDiscretization_a446aabc55a9fb4b5cb2f476babc532f9}\label{classDiscretization_a446aabc55a9fb4b5cb2f476babc532f9} +virtual double {\bfseries compute\+D2u\+Dy2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to y. \end{DoxyCompactList}\item +\Hypertarget{classDiscretization_a5119047788a34eadf37480e913bdc8ea}\label{classDiscretization_a5119047788a34eadf37480e913bdc8ea} +virtual double {\bfseries compute\+D2v\+Dx2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to x. \end{DoxyCompactList}\item +\Hypertarget{classDiscretization_a56678582a049b1b141621e41afff1438}\label{classDiscretization_a56678582a049b1b141621e41afff1438} +virtual double {\bfseries compute\+D2v\+Dy2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to y. \end{DoxyCompactList}\item +\Hypertarget{classDiscretization_aed3ad75ad6e647d14f118a12652c01b2}\label{classDiscretization_aed3ad75ad6e647d14f118a12652c01b2} +virtual double {\bfseries compute\+Dp\+Dx} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to x. \end{DoxyCompactList}\item +\Hypertarget{classDiscretization_a859f4dc33f0ea91f5e6537be09ce4999}\label{classDiscretization_a859f4dc33f0ea91f5e6537be09ce4999} +virtual double {\bfseries compute\+Dp\+Dy} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to y. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}{Staggered\+Grid}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width} () const +\begin{DoxyCompactList}\small\item\em Get the length of a single cell in x and y directions. \end{DoxyCompactList}\item +const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells} () const +\begin{DoxyCompactList}\small\item\em Get number of cells in x and y directions. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries u} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable u. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries v} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable v. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries p} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable p. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries rhs} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable rhs. \end{DoxyCompactList}\item +double {\bfseries u} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries u} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j) \end{DoxyCompactList}\item +double {\bfseries v} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries v} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j) \end{DoxyCompactList}\item +double {\bfseries p} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries p} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries f} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of f in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries g} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of g in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries rhs} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of rhs in element (i,j) \end{DoxyCompactList}\item +double {\bfseries dx} () const +\begin{DoxyCompactList}\small\item\em Get the mesh width in x-\/direction. \end{DoxyCompactList}\item +double {\bfseries dy} () const +\begin{DoxyCompactList}\small\item\em Get the mesh width in y-\/direction. \end{DoxyCompactList}\item +int {\bfseries u\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for u in x direction \end{DoxyCompactList}\item +int {\bfseries u\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for u in x direction \end{DoxyCompactList}\item +int {\bfseries u\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for u in y direction \end{DoxyCompactList}\item +int {\bfseries u\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for u in y direction \end{DoxyCompactList}\item +int {\bfseries v\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for v in x direction \end{DoxyCompactList}\item +int {\bfseries v\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for v in x direction \end{DoxyCompactList}\item +int {\bfseries v\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for v in y direction \end{DoxyCompactList}\item +int {\bfseries v\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for v in y direction \end{DoxyCompactList}\item +int {\bfseries p\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for p in x direction \end{DoxyCompactList}\item +int {\bfseries p\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for p in x direction \end{DoxyCompactList}\item +int {\bfseries p\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for p in y direction \end{DoxyCompactList}\item +int {\bfseries p\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for p in y direction \end{DoxyCompactList}\item +int {\bfseries f\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for f in x direction \end{DoxyCompactList}\item +int {\bfseries f\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for f in x direction \end{DoxyCompactList}\item +int {\bfseries f\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for f in y direction \end{DoxyCompactList}\item +int {\bfseries f\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for f in y direction \end{DoxyCompactList}\item +int {\bfseries g\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for g in x direction \end{DoxyCompactList}\item +int {\bfseries g\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for g in x direction \end{DoxyCompactList}\item +int {\bfseries g\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for g in y direction \end{DoxyCompactList}\item +int {\bfseries g\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for g in y direction \end{DoxyCompactList}\item +int {\bfseries rhs\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries rhs\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries rhs\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for rhs in y direction \end{DoxyCompactList}\item +int {\bfseries rhs\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in y direction \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Additional Inherited Members} +\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} +\begin{DoxyCompactItemize} +\item +const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells\+\_\+} +\begin{DoxyCompactList}\small\item\em array containing number of cells in x and y directions \end{DoxyCompactList}\item +const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width\+\_\+} +\begin{DoxyCompactList}\small\item\em array containing the sizes of cell edges in x and y directions \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries u\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable u \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries v\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable v \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries p\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable p \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries f\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable f \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries g\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable g \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries rhs\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable rhs \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Computes derivatives included in governing equations. + +Interface for the discretization. Computes the needed derivatives to solve the Poisson and continuity equations. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c}\label{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c} +\index{Discretization@{Discretization}!Discretization@{Discretization}} +\index{Discretization@{Discretization}!Discretization@{Discretization}} +\doxysubsubsection{\texorpdfstring{Discretization()}{Discretization()}} +{\footnotesize\ttfamily Discretization\+::\+Discretization (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{n\+Cells, }\item[{std\+::array$<$ double, 2 $>$}]{mesh\+Width }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em n\+Cells} & array containing number of cells in x and y directions \\ +\hline +{\em mesh\+Width} & array containing the length of a single cell in x and y directions \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classDiscretization_acca6bf193e0e91f645d292527299254b}\label{classDiscretization_acca6bf193e0e91f645d292527299254b} +\index{Discretization@{Discretization}!computeDu2Dx@{computeDu2Dx}} +\index{computeDu2Dx@{computeDu2Dx}!Discretization@{Discretization}} +\doxysubsubsection{\texorpdfstring{computeDu2Dx()}{computeDu2Dx()}} +{\footnotesize\ttfamily virtual double Discretization\+::compute\+Du2\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [pure virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x. + + + +Implemented in \mbox{\hyperlink{classCentralDifferences_adb4502f473cc047a433db596146672e4}{Central\+Differences}}, and \mbox{\hyperlink{classDonorCell_a265bdaf46ed8ba46a42ef0cb03807175}{Donor\+Cell}}. + +\Hypertarget{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795}\label{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795} +\index{Discretization@{Discretization}!computeDuvDx@{computeDuvDx}} +\index{computeDuvDx@{computeDuvDx}!Discretization@{Discretization}} +\doxysubsubsection{\texorpdfstring{computeDuvDx()}{computeDuvDx()}} +{\footnotesize\ttfamily virtual double Discretization\+::compute\+Duv\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [pure virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x. + + + +Implemented in \mbox{\hyperlink{classCentralDifferences_a9bd7ac3bfd709991525ec57de10ed2e1}{Central\+Differences}}, and \mbox{\hyperlink{classDonorCell_ae41b5f85743ca7f148bd829561bd9cb5}{Donor\+Cell}}. + +\Hypertarget{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84}\label{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84} +\index{Discretization@{Discretization}!computeDuvDy@{computeDuvDy}} +\index{computeDuvDy@{computeDuvDy}!Discretization@{Discretization}} +\doxysubsubsection{\texorpdfstring{computeDuvDy()}{computeDuvDy()}} +{\footnotesize\ttfamily virtual double Discretization\+::compute\+Duv\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [pure virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y. + + + +Implemented in \mbox{\hyperlink{classCentralDifferences_a4184367de8d48e678edfb078a19fc0a4}{Central\+Differences}}, and \mbox{\hyperlink{classDonorCell_a285562312f08efde26afd160174d2843}{Donor\+Cell}}. + +\Hypertarget{classDiscretization_a69ba136ab7f8c09d805afca159cab428}\label{classDiscretization_a69ba136ab7f8c09d805afca159cab428} +\index{Discretization@{Discretization}!computeDv2Dy@{computeDv2Dy}} +\index{computeDv2Dy@{computeDv2Dy}!Discretization@{Discretization}} +\doxysubsubsection{\texorpdfstring{computeDv2Dy()}{computeDv2Dy()}} +{\footnotesize\ttfamily virtual double Discretization\+::compute\+Dv2\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [pure virtual]}} + + + +Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y. + + + +Implemented in \mbox{\hyperlink{classCentralDifferences_a66eb9b800b9a9ac6f81fc719a42eb0ee}{Central\+Differences}}, and \mbox{\hyperlink{classDonorCell_a01dcfb7fcf356d5ee412107a30c26fb3}{Donor\+Cell}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/discretization/discretization.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/discretization/discretization.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classDonorCell.eps b/documentation/latex/classDonorCell.eps new file mode 100644 index 00000000..b2ede092 --- /dev/null +++ b/documentation/latex/classDonorCell.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 588.235291 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 0.850000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(DonorCell) cw +(Discretization) cw +(StaggeredGrid) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (DonorCell) 0.000000 0.000000 box + (Discretization) 0.000000 1.000000 box + (StaggeredGrid) 0.000000 2.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in +solid +0 0.000000 1.000000 out +solid +1 0.000000 2.000000 in diff --git a/documentation/latex/classDonorCell.pdf b/documentation/latex/classDonorCell.pdf new file mode 100644 index 0000000000000000000000000000000000000000..730538ffa0a52878d83203bd3af82f69e2e5d6e0 GIT binary patch literal 5600 zcmb_Adpwls_a#}4UHPI&Y2R2oHjQ`gGh{}CAvAI;B-NOCjmg~1yu%>rCQ2kBC6ZKD zH&)wCQK==8B-&b1(*3e7t@?KTJ@2^G?)LfZ{_%ZXp65BwIp;agIp;Z_bB>L#n>&GI zPs7>NJ=WfM1)AZ`6q?>+t`tr!@ z$nP2(%2kKgz5lBIv}nhs=eA$RSOllFb){-bvb_u}@ueB1Z+<;?aqpX3i_2O`{7zl| z!t}!LnQO@|6?e8=*X1AH6!sOQG~SD=*1vhf`D&_fwC(rn1y(oT{PaU(F(Ib$*sb@5 z?h7qYnGW67Iyi6RiksHIES^$jez|v`UQ&*1k*b%GaQ9zdx_mj(8i^n4dUL;j?2qp{ zva-_do6B}Ga?Tq*^cA_h+PC~_AMfUm%EX4TgA*CwPh|YIEj#0cG}qrEY`czkL>*vg zob3I|q|)U6o9xJ#@m()XuD(QM!eO<88D=WXK-fs3({RHe>L)7(#widOvoXv=gkrvn zTmyv?!8Q%J3ysONCsV_4U|)&IP>6z=8VCC$D!E!IKvcj9e3f!R0D^|Xzy~2X5YeCj z9rGl}L5mEW0CojSK(2x?=kdn@(6AU7zaeJ=q(BZxD~Jk$y~RQm6pF*d^v8ukfP)%v zBz;Co8YLa3bmgObiCi?oVpvojg7Sr62O?nvpP!A1H|)s%3>*X7{UjK+9Nu){s}Sry z;DSC}PY=65u@q4e{N+-CSZ(XNNp zFcb_wkA*;<&z0vo5fYKABv3 zg6ouev9+Z&|Mj$co^$3;fB7wh=>iYgt zwkXZtU-kaR!9{1X+_f>Ooam8lHTbdqOy-1Eo9$CvqF=E6+>5DoAH$Y@RPZ-a zSu@@yHGeoT`0=rcZeMlqPXy*{kw|tvnwv%Bnr`tidb@$x9eW|gO*c9-*vrj0bi=Z4 z{fdHLInS&HjiNUAp8rj1aF;W8gI&+J_3a@SW?47qn?2;jyCnqnCBD9SonBV>VO_3u zrCE?pKJ(my{=25Q!tR2?G=FK}(U1^>gfWgDOHW<(ZykTmH}s8cvVr*C^mOt*-BRDI z^o)wgD6f<;S*>ul`>|=fpl6+zoQnR~SGv_on%xk@3Cgo;ESsSSEDH}_?7nTicwmqB zs;b>r&K-)*eBSKaNtsSo_31dt)ng)h&p-6eWc086FD1O?-C48Ot9}7`YNKWy=Jfw|CqL5f{;26|QM<26@zzU3comDnrA) z&TH$(6?HcMXU?}7hK*To%pXq3FNvPmyTfPwnU1YX`kSIMT)sQ9(*DU_qgBqayiFYz zPv1{nF@Dzuy!GK1r_(P@KdrCR5uX)bbbNBIR8L;}=-MHRrigKK?so7vq8#;|xA|Tz zHWB2Xk}NOiUZ^x#`@uXRc*UH`$!qTI@WMY$EP-4A#J_z?-I%Ov zS5`M>1mx(2(F6f)=F4Y9R??WKguG(i4QMF!?ZjKlHfHWCweG3*I&~$zSZ@s_r-3;+ zUn~gp^Gj_{KOc0XSlr$Ib9@qeHU0MXhpMrO>D9)jd$=nIh%GhS^qf^GMNBx^zS!GP zHwm}-*5tcRAA0l?2#01Lneo-Wx4#r*PP@J3Nqj-0ZC}}Z%Rz-dDnD(|cb1zF;tIkEQrPXy>%8ZHXOlVu^|0&X0Dt zQR*A+szb`<*On2eQXLH|F+AzP!f8i!{UW;z>bky4$(x@d`?Y4hb#K3CkXOnH_S4Jk zt6r0eO{=qKHf(*^SY$Y}sehy3SnyL4W4-n3OC!3RjDJ~q@?MTn)0!?<>i()D zQ;V3ls7t~qiwsZu?w92apjol|H1!RZ#w*s1S%6Td=8fY_v8r%60Pmoc-WOF0tu3TEDF0^|GXaUgo`kgnFgpk*?pTNe(}bIqA*ptr!zw zew55R=2+>g$0_US*e`Jii%Gniys~X#giN#f-tn!X7Xv3QM&{h9AI#pV(ARODZuO?A zZT9B)|eIU4iX33 z-974l-DLml&SW&RBfbZpxvep%ls49;I&ZhH!SPMBelsI(~jh%=3A# z`F*yhqV@I`9B0n0vn)9+kL^7{l~vz)hd=stSyS93|EKQ`&fH*QuqG#T%{bR9xEe1( zrBWDYA@!^{GH+2yGS2o;yJ3$st-)*Ur8`&OpV-#rQ)p=(vAEzHpGRv-;;~-REl$ z5BR-)TvWW6Kb{??zI3UbTBB>ef3C^?eT^o|Oy6mUI&tedy)D=)-GjHwx15ud&wlf$ zy=`~UmLTd@Z}pwPl?L}st_3d)5Dgqy|INkp_~Tg(ZA&$`C$6qxYX-KhW%RvEc-Gyr zj-#2h*z!@q38I3$H~+Dd-?jzc>Rs{uz0l`_YU2$jGqE%OPvA)etsP-`WsQ1Ux z$(2}2{pYk_oAG|0myP7YpK_64-n@}SghZxLMiUVyXN`g{h(b^(91)3SEd1|PHF!uY zWZ{EoJR(owibRU%#w(G4c%MK)e3ZaJh<9e=oSgZf-arT%zJd^;EeBN)$k13;uKx4f ztuO?QqeiNbf|MN6NF_3rqlSgok~o4n28QvF76pxB;e&a;5Gt2TqQodfws){65lEC- zP=pd>lCg4S6hyM8;{i*hFv8IvlpaG2!HR{CL{Wt!49CXC+Q(AtxRyCR5pKWwIB@rLZ^{CfO6=k%LCET2RnK*ung8xf*3z zSq*am1^SoSfDOQh0 zdWJP zp;k(??j{t#hy=loQ~^7XfFMGFV}x8O<)gsi6$((MXq!SX@CH2F32dTbRD!Uz&diaZ zLlcP@b1O#)UnXMVH3T6N!BmSE;aqYDjq!F?(pDC4@gQ12X|;KDly;UjPz4 z!g!cslvKNgk&Y64!7f@5cxu2z@aRKk$8S#~y;MnK5*dei>Cgw!X*3EAihxF7Oa^EXU>_tKfzgPRzrl!1 z66kIG8IMS30&V;SMka%@{x2{(9duRx0&`%1I{42p5}5&-Eq{g)9jJeUk!YX^@fSP_ zgZ!DysFDwAZ6#$} + +Inheritance diagram for Donor\+Cell\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classDonorCell} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classDonorCell_a4896ad035a5ac50c85e2b66d442a5312}{Donor\+Cell}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}, double alpha) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classDonorCell_a265bdaf46ed8ba46a42ef0cb03807175}{compute\+Du2\+Dx}} (int i, int j) const override +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x with the donor cell Scheme. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classDonorCell_a01dcfb7fcf356d5ee412107a30c26fb3}{compute\+Dv2\+Dy}} (int i, int j) const override +\begin{DoxyCompactList}\small\item\em Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y with the donor cell Scheme. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classDonorCell_ae41b5f85743ca7f148bd829561bd9cb5}{compute\+Duv\+Dx}} (int i, int j) const override +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x with the donor cell Scheme. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classDonorCell_a285562312f08efde26afd160174d2843}{compute\+Duv\+Dy}} (int i, int j) const override +\begin{DoxyCompactList}\small\item\em Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y with the donor cell Scheme. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classDiscretization}{Discretization}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c}{Discretization}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+D2u\+Dx2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to x. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+D2u\+Dy2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of u with respect to y. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+D2v\+Dx2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to x. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+D2v\+Dy2} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate second derivative of v with respect to y. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+Dp\+Dx} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to x. \end{DoxyCompactList}\item +virtual double {\bfseries compute\+Dp\+Dy} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Calculate first derivative of p with respect to y. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}{Staggered\+Grid}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width} () const +\begin{DoxyCompactList}\small\item\em Get the length of a single cell in x and y directions. \end{DoxyCompactList}\item +const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells} () const +\begin{DoxyCompactList}\small\item\em Get number of cells in x and y directions. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries u} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable u. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries v} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable v. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries p} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable p. \end{DoxyCompactList}\item +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries rhs} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable rhs. \end{DoxyCompactList}\item +double {\bfseries u} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries u} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j) \end{DoxyCompactList}\item +double {\bfseries v} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries v} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j) \end{DoxyCompactList}\item +double {\bfseries p} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j), declared constant. \end{DoxyCompactList}\item +double \& {\bfseries p} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries f} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of f in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries g} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of g in element (i,j) \end{DoxyCompactList}\item +double \& {\bfseries rhs} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of rhs in element (i,j) \end{DoxyCompactList}\item +double {\bfseries dx} () const +\begin{DoxyCompactList}\small\item\em Get the mesh width in x-\/direction. \end{DoxyCompactList}\item +double {\bfseries dy} () const +\begin{DoxyCompactList}\small\item\em Get the mesh width in y-\/direction. \end{DoxyCompactList}\item +int {\bfseries u\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for u in x direction \end{DoxyCompactList}\item +int {\bfseries u\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for u in x direction \end{DoxyCompactList}\item +int {\bfseries u\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for u in y direction \end{DoxyCompactList}\item +int {\bfseries u\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for u in y direction \end{DoxyCompactList}\item +int {\bfseries v\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for v in x direction \end{DoxyCompactList}\item +int {\bfseries v\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for v in x direction \end{DoxyCompactList}\item +int {\bfseries v\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for v in y direction \end{DoxyCompactList}\item +int {\bfseries v\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for v in y direction \end{DoxyCompactList}\item +int {\bfseries p\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for p in x direction \end{DoxyCompactList}\item +int {\bfseries p\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for p in x direction \end{DoxyCompactList}\item +int {\bfseries p\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for p in y direction \end{DoxyCompactList}\item +int {\bfseries p\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for p in y direction \end{DoxyCompactList}\item +int {\bfseries f\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for f in x direction \end{DoxyCompactList}\item +int {\bfseries f\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for f in x direction \end{DoxyCompactList}\item +int {\bfseries f\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for f in y direction \end{DoxyCompactList}\item +int {\bfseries f\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for f in y direction \end{DoxyCompactList}\item +int {\bfseries g\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for g in x direction \end{DoxyCompactList}\item +int {\bfseries g\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for g in x direction \end{DoxyCompactList}\item +int {\bfseries g\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for g in y direction \end{DoxyCompactList}\item +int {\bfseries g\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for g in y direction \end{DoxyCompactList}\item +int {\bfseries rhs\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries rhs\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries rhs\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for rhs in y direction \end{DoxyCompactList}\item +int {\bfseries rhs\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in y direction \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Additional Inherited Members} +\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classStaggeredGrid}{Staggered\+Grid}}} +\begin{DoxyCompactItemize} +\item +const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells\+\_\+} +\begin{DoxyCompactList}\small\item\em array containing number of cells in x and y directions \end{DoxyCompactList}\item +const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width\+\_\+} +\begin{DoxyCompactList}\small\item\em array containing the sizes of cell edges in x and y directions \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries u\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable u \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries v\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable v \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries p\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable p \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries f\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable f \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries g\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable g \end{DoxyCompactList}\item +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries rhs\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable rhs \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Discretizes the problem using the donor cell scheme. + +Implements the first derivatives of u\texorpdfstring{$^\wedge$}{\string^}2, v\texorpdfstring{$^\wedge$}{\string^}2 and u\texorpdfstring{$\ast$}{*}v according to the donor cell scheme + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classDonorCell_a4896ad035a5ac50c85e2b66d442a5312}\label{classDonorCell_a4896ad035a5ac50c85e2b66d442a5312} +\index{DonorCell@{DonorCell}!DonorCell@{DonorCell}} +\index{DonorCell@{DonorCell}!DonorCell@{DonorCell}} +\doxysubsubsection{\texorpdfstring{DonorCell()}{DonorCell()}} +{\footnotesize\ttfamily Donor\+Cell\+::\+Donor\+Cell (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{n\+Cells, }\item[{std\+::array$<$ double, 2 $>$}]{mesh\+Width, }\item[{double}]{alpha }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em n\+Cells} & array containing number of cells in x and y directions \\ +\hline +{\em mesh\+Width} & array containing the length of a single cell in x and y directions \\ +\hline +{\em alpha} & weight factor between central differences and donor cell schemes \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classDonorCell_a265bdaf46ed8ba46a42ef0cb03807175}\label{classDonorCell_a265bdaf46ed8ba46a42ef0cb03807175} +\index{DonorCell@{DonorCell}!computeDu2Dx@{computeDu2Dx}} +\index{computeDu2Dx@{computeDu2Dx}!DonorCell@{DonorCell}} +\doxysubsubsection{\texorpdfstring{computeDu2Dx()}{computeDu2Dx()}} +{\footnotesize\ttfamily double Donor\+Cell\+::compute\+Du2\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$^\wedge$}{\string^}2 with respect to x with the donor cell Scheme. + + + +Implements \mbox{\hyperlink{classDiscretization_acca6bf193e0e91f645d292527299254b}{Discretization}}. + +\Hypertarget{classDonorCell_ae41b5f85743ca7f148bd829561bd9cb5}\label{classDonorCell_ae41b5f85743ca7f148bd829561bd9cb5} +\index{DonorCell@{DonorCell}!computeDuvDx@{computeDuvDx}} +\index{computeDuvDx@{computeDuvDx}!DonorCell@{DonorCell}} +\doxysubsubsection{\texorpdfstring{computeDuvDx()}{computeDuvDx()}} +{\footnotesize\ttfamily double Donor\+Cell\+::compute\+Duv\+Dx (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to x with the donor cell Scheme. + + + +Implements \mbox{\hyperlink{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795}{Discretization}}. + +\Hypertarget{classDonorCell_a285562312f08efde26afd160174d2843}\label{classDonorCell_a285562312f08efde26afd160174d2843} +\index{DonorCell@{DonorCell}!computeDuvDy@{computeDuvDy}} +\index{computeDuvDy@{computeDuvDy}!DonorCell@{DonorCell}} +\doxysubsubsection{\texorpdfstring{computeDuvDy()}{computeDuvDy()}} +{\footnotesize\ttfamily double Donor\+Cell\+::compute\+Duv\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +Calculate first derivative of u\texorpdfstring{$\ast$}{*}v with respect to y with the donor cell Scheme. + + + +Implements \mbox{\hyperlink{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84}{Discretization}}. + +\Hypertarget{classDonorCell_a01dcfb7fcf356d5ee412107a30c26fb3}\label{classDonorCell_a01dcfb7fcf356d5ee412107a30c26fb3} +\index{DonorCell@{DonorCell}!computeDv2Dy@{computeDv2Dy}} +\index{computeDv2Dy@{computeDv2Dy}!DonorCell@{DonorCell}} +\doxysubsubsection{\texorpdfstring{computeDv2Dy()}{computeDv2Dy()}} +{\footnotesize\ttfamily double Donor\+Cell\+::compute\+Dv2\+Dy (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +Calculate first derivative of v\texorpdfstring{$^\wedge$}{\string^}2 with respect to y with the donor cell Scheme. + + + +Implements \mbox{\hyperlink{classDiscretization_a69ba136ab7f8c09d805afca159cab428}{Discretization}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/discretization/donor\+\_\+cell.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/discretization/donor\+\_\+cell.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classFieldVariable.eps b/documentation/latex/classFieldVariable.eps new file mode 100644 index 00000000..0a27d91c --- /dev/null +++ b/documentation/latex/classFieldVariable.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 416.666656 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.200000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(FieldVariable) cw +(Array2D) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (FieldVariable) 0.000000 0.000000 box + (Array2D) 0.000000 1.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in diff --git a/documentation/latex/classFieldVariable.pdf b/documentation/latex/classFieldVariable.pdf new file mode 100644 index 0000000000000000000000000000000000000000..673f31352670efa111adacf178ea9abbf74dd4a5 GIT binary patch literal 4939 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 + +Inheritance diagram for Field\+Variable\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classFieldVariable} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classFieldVariable_aa0985778bc6331b74904a03c3ef67a98}{Field\+Variable}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}}, std\+::array$<$ double, 2 $>$ origin, std\+::array$<$ double, 2 $>$ mesh\+Width) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classFieldVariable_a2949624f1d2d7e29872f743db0b1d83b}{interpolate\+At}} (double x, double y) const +\begin{DoxyCompactList}\small\item\em Interpolates value of field variable in domain using x and y coordinates. \end{DoxyCompactList}\item +double \mbox{\hyperlink{classFieldVariable_a55168fd422c70c8386ba311909427cf7}{find\+Abs\+Max}} () const +\begin{DoxyCompactList}\small\item\em Find point in \doxylink{classArray2D}{Array2D} of Fieldvariable with maximum value. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classArray2D}{Array2D}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classArray2D_a16521417dfdf67ec694bfb7747df9000}{Array2D}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}}) +\begin{DoxyCompactList}\small\item\em constructor. \end{DoxyCompactList}\item +double \& \mbox{\hyperlink{classArray2D_a9d49e5544f4acf51a57dcbb0ed1bb0f8}{operator()}} (int i, int j) +\begin{DoxyCompactList}\small\item\em set array value. Overloads the () operator \end{DoxyCompactList}\item +double \mbox{\hyperlink{classArray2D_af745718ec25b815051de2d0c3c94e0d2}{operator()}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em get array value. Overloads the () operator \end{DoxyCompactList}\item +std\+::array$<$ int, 2 $>$ {\bfseries size} () const +\begin{DoxyCompactList}\small\item\em get size of array in x and y direction \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Additional Inherited Members} +\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classArray2D}{Array2D}}} +\begin{DoxyCompactItemize} +\item +const std\+::array$<$ int, 2 $>$ {\bfseries size\+\_\+} +\begin{DoxyCompactList}\small\item\em size of array in x and y direction \end{DoxyCompactList}\item +std\+::vector$<$ double $>$ {\bfseries data\+\_\+} +\begin{DoxyCompactList}\small\item\em storage array values, in row-\/major order \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +\doxylink{classDiscretization}{Discretization} of a scalar function. + +A field variable is the discretization of a scalar function f(x) with x in the computational domain. More specifically, a scalar value is stored at discrete nodes/points. The nodes are arranged in an equidistant mesh with specified mesh width. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classFieldVariable_aa0985778bc6331b74904a03c3ef67a98}\label{classFieldVariable_aa0985778bc6331b74904a03c3ef67a98} +\index{FieldVariable@{FieldVariable}!FieldVariable@{FieldVariable}} +\index{FieldVariable@{FieldVariable}!FieldVariable@{FieldVariable}} +\doxysubsubsection{\texorpdfstring{FieldVariable()}{FieldVariable()}} +{\footnotesize\ttfamily Field\+Variable\+::\+Field\+Variable (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{size, }\item[{std\+::array$<$ double, 2 $>$}]{origin, }\item[{std\+::array$<$ double, 2 $>$}]{mesh\+Width }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em size} & number of cells in x and y direction \\ +\hline +{\em origin} & orgin of Fieldvariable relative to domain origin \\ +\hline +{\em meshwidth} & mesh width in x and y direction \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classFieldVariable_a55168fd422c70c8386ba311909427cf7}\label{classFieldVariable_a55168fd422c70c8386ba311909427cf7} +\index{FieldVariable@{FieldVariable}!findAbsMax@{findAbsMax}} +\index{findAbsMax@{findAbsMax}!FieldVariable@{FieldVariable}} +\doxysubsubsection{\texorpdfstring{findAbsMax()}{findAbsMax()}} +{\footnotesize\ttfamily double Field\+Variable\+::find\+Abs\+Max (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const} + + + +Find point in \doxylink{classArray2D}{Array2D} of Fieldvariable with maximum value. + +Finds maximum by iterating through all values in Fiel\+Variable \Hypertarget{classFieldVariable_a2949624f1d2d7e29872f743db0b1d83b}\label{classFieldVariable_a2949624f1d2d7e29872f743db0b1d83b} +\index{FieldVariable@{FieldVariable}!interpolateAt@{interpolateAt}} +\index{interpolateAt@{interpolateAt}!FieldVariable@{FieldVariable}} +\doxysubsubsection{\texorpdfstring{interpolateAt()}{interpolateAt()}} +{\footnotesize\ttfamily double Field\+Variable\+::interpolate\+At (\begin{DoxyParamCaption}\item[{double}]{x, }\item[{double}]{y }\end{DoxyParamCaption}) const} + + + +Interpolates value of field variable in domain using x and y coordinates. + +Interpolates by using bilinear interpolation. + + +\begin{DoxyParams}{Parameters} +{\em x} & x postion of point to interpolate \\ +\hline +{\em y} & y postion of point to interpolate \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/storage/field\+\_\+variable.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/storage/field\+\_\+variable.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classFluidTracer.tex b/documentation/latex/classFluidTracer.tex new file mode 100644 index 00000000..14a43eb4 --- /dev/null +++ b/documentation/latex/classFluidTracer.tex @@ -0,0 +1,111 @@ +\doxysection{Fluid\+Tracer Class Reference} +\hypertarget{classFluidTracer}{}\label{classFluidTracer}\index{FluidTracer@{FluidTracer}} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classFluidTracer_a0a1c9fde640a129696e5c47869948939}\label{classFluidTracer_a0a1c9fde640a129696e5c47869948939} +{\bfseries Fluid\+Tracer} (int num\+Particlesper\+Cell, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$ mask) +\item +\Hypertarget{classFluidTracer_ad7f2ef5ef8d806b87c6478e85159a873}\label{classFluidTracer_ad7f2ef5ef8d806b87c6478e85159a873} +{\bfseries Fluid\+Tracer} (std\+::vector$<$ double $>$ x, std\+::vector$<$ double $>$ y, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$ mask) +\item +void \mbox{\hyperlink{classFluidTracer_aba4d452f26e9276b91256dd251789b90}{move\+Particles}} (double dt) +\begin{DoxyCompactList}\small\item\em Update the position of the particles according to the velocity field and sets mask accordingly. \end{DoxyCompactList}\item +void \mbox{\hyperlink{classFluidTracer_ace163e1fe040acbd4c3122f082b08eea}{create\+Particles}} (double position\+SourceX, double position\+SourceY) +\begin{DoxyCompactList}\small\item\em can be used to create a source cell for particles \end{DoxyCompactList}\item +int \mbox{\hyperlink{classFluidTracer_adc687a4988f532e21e13c9aa0591d658}{get\+Number\+Of\+Particles}} () const +\begin{DoxyCompactList}\small\item\em Total number of Particles. \end{DoxyCompactList}\item +int \mbox{\hyperlink{classFluidTracer_a95d6d49d957b2639169c136addf52719}{get\+Number\+Of\+Particles}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Particles of specified cell. \end{DoxyCompactList}\item +std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classFluidTracer_a37ee0325d6af08be6eba8b073162342e}{get\+Particle\+Position}} (int i) const +\begin{DoxyCompactList}\small\item\em Get the Particle Position, index starts at 0. \end{DoxyCompactList}\item +\Hypertarget{classFluidTracer_a0a9c3c092d01327d636ef39b8dd36ed8}\label{classFluidTracer_a0a9c3c092d01327d636ef39b8dd36ed8} +std\+::array$<$ int, 2 $>$ {\bfseries cell\+Of\+Particle} (int i) +\item +\Hypertarget{classFluidTracer_a052e1ab909459100cd6a6cd8e9064ba6}\label{classFluidTracer_a052e1ab909459100cd6a6cd8e9064ba6} +int {\bfseries val2\+CellX} (double x\+Val) +\item +\Hypertarget{classFluidTracer_a7bc97a7586fa8d900a6269e77c9ccba1}\label{classFluidTracer_a7bc97a7586fa8d900a6269e77c9ccba1} +int {\bfseries val2\+CellY} (double y\+Val) +\item +\Hypertarget{classFluidTracer_a8306a4cff0036da1fcf695713f9f4226}\label{classFluidTracer_a8306a4cff0036da1fcf695713f9f4226} +std\+::array$<$ double, 2 $>$ {\bfseries update\+Particle} (int i, std\+::array$<$ int, 2 $>$ idx, double dt, std\+::array$<$ double, 2 $>$ vel, int depth) +\item +\Hypertarget{classFluidTracer_acdaf955221e204e107513b0e29738d53}\label{classFluidTracer_acdaf955221e204e107513b0e29738d53} +std\+::array$<$ double, 2 $>$ {\bfseries move\+Particles} (double dt, std\+::array$<$ double, 2 $>$ vel) +\item +\Hypertarget{classFluidTracer_aadad02de7f9431b76f0a86053dcc784f}\label{classFluidTracer_aadad02de7f9431b76f0a86053dcc784f} +void {\bfseries print\+Particles} () +\end{DoxyCompactItemize} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classFluidTracer_ace163e1fe040acbd4c3122f082b08eea}\label{classFluidTracer_ace163e1fe040acbd4c3122f082b08eea} +\index{FluidTracer@{FluidTracer}!createParticles@{createParticles}} +\index{createParticles@{createParticles}!FluidTracer@{FluidTracer}} +\doxysubsubsection{\texorpdfstring{createParticles()}{createParticles()}} +{\footnotesize\ttfamily void Fluid\+Tracer\+::create\+Particles (\begin{DoxyParamCaption}\item[{double}]{position\+SourceX, }\item[{double}]{position\+SourceY }\end{DoxyParamCaption})} + + + +can be used to create a source cell for particles + +fills the cell homogenously with particles by cell \Hypertarget{classFluidTracer_adc687a4988f532e21e13c9aa0591d658}\label{classFluidTracer_adc687a4988f532e21e13c9aa0591d658} +\index{FluidTracer@{FluidTracer}!getNumberOfParticles@{getNumberOfParticles}} +\index{getNumberOfParticles@{getNumberOfParticles}!FluidTracer@{FluidTracer}} +\doxysubsubsection{\texorpdfstring{getNumberOfParticles()}{getNumberOfParticles()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily int Fluid\+Tracer\+::get\+Number\+Of\+Particles (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const} + + + +Total number of Particles. + +\begin{DoxyReturn}{Returns} +int +\end{DoxyReturn} +\Hypertarget{classFluidTracer_a95d6d49d957b2639169c136addf52719}\label{classFluidTracer_a95d6d49d957b2639169c136addf52719} +\index{FluidTracer@{FluidTracer}!getNumberOfParticles@{getNumberOfParticles}} +\index{getNumberOfParticles@{getNumberOfParticles}!FluidTracer@{FluidTracer}} +\doxysubsubsection{\texorpdfstring{getNumberOfParticles()}{getNumberOfParticles()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily int Fluid\+Tracer\+::get\+Number\+Of\+Particles (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} + + + +Particles of specified cell. + +uses mask Grid \Hypertarget{classFluidTracer_a37ee0325d6af08be6eba8b073162342e}\label{classFluidTracer_a37ee0325d6af08be6eba8b073162342e} +\index{FluidTracer@{FluidTracer}!getParticlePosition@{getParticlePosition}} +\index{getParticlePosition@{getParticlePosition}!FluidTracer@{FluidTracer}} +\doxysubsubsection{\texorpdfstring{getParticlePosition()}{getParticlePosition()}} +{\footnotesize\ttfamily std\+::array$<$ double, 2 $>$ Fluid\+Tracer\+::get\+Particle\+Position (\begin{DoxyParamCaption}\item[{int}]{i }\end{DoxyParamCaption}) const} + + + +Get the Particle Position, index starts at 0. + +\begin{DoxyReturn}{Returns} +std\+::array$<$double, 2$>$ +\end{DoxyReturn} +\Hypertarget{classFluidTracer_aba4d452f26e9276b91256dd251789b90}\label{classFluidTracer_aba4d452f26e9276b91256dd251789b90} +\index{FluidTracer@{FluidTracer}!moveParticles@{moveParticles}} +\index{moveParticles@{moveParticles}!FluidTracer@{FluidTracer}} +\doxysubsubsection{\texorpdfstring{moveParticles()}{moveParticles()}} +{\footnotesize\ttfamily void Fluid\+Tracer\+::move\+Particles (\begin{DoxyParamCaption}\item[{double}]{dt }\end{DoxyParamCaption})} + + + +Update the position of the particles according to the velocity field and sets mask accordingly. + +get the velocity field \$u\$ and \$v\$ Checks for collision with border or obstacle and reflects the particle at this position Update the mask where there are new Air or Fluid cells + + +\begin{DoxyParams}{Parameters} +{\em dt} & \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/surface/fluid\+\_\+tracer.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/surface/fluid\+\_\+tracer.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classGaussSeidel.eps b/documentation/latex/classGaussSeidel.eps new file mode 100644 index 00000000..3e8f9980 --- /dev/null +++ b/documentation/latex/classGaussSeidel.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 370.370361 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.350000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(GaussSeidel) cw +(PressureSolver) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (GaussSeidel) 0.000000 0.000000 box + (PressureSolver) 0.000000 1.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in diff --git a/documentation/latex/classGaussSeidel.pdf b/documentation/latex/classGaussSeidel.pdf new file mode 100644 index 0000000000000000000000000000000000000000..125baeb7ff122474b53c6cecc627505107043344 GIT binary patch literal 5020 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 q1wy7Pg3>)0EQWwCVDSH5B9i$} + +Inheritance diagram for Gauss\+Seidel\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classGaussSeidel} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classGaussSeidel_af31cc1ace2d616ebb8e0592c06865b9c}{Gauss\+Seidel}} (const std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ \&data, double epsilon, int maximum\+Number\+Of\+Iterations, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ boundary) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +void \mbox{\hyperlink{classGaussSeidel_a6f0eb0c6938a64f8ded186f88170a04b}{solve}} () override +\begin{DoxyCompactList}\small\item\em override function that starts solver. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058}{Pressure\+Solver}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, double epsilon, int maximum\+Number\+Of\+Iterations, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ boundary) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Additional Inherited Members} +\doxysubsection*{Public Attributes inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} +\begin{DoxyCompactItemize} +\item +double {\bfseries dx2} +\item +double {\bfseries dy2} +\begin{DoxyCompactList}\small\item\em squared mesh widths \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Protected Member Functions inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} +\begin{DoxyCompactItemize} +\item +void \mbox{\hyperlink{classPressureSolver_a458c383fcacaf54c1a333a271049ca93}{set\+Boundary\+Values}} () +\begin{DoxyCompactList}\small\item\em Set the \doxylink{classBoundary}{Boundary} Values. \end{DoxyCompactList}\item +double {\bfseries calculate\+Residuum} () +\begin{DoxyCompactList}\small\item\em calculate residuum of current time step \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} +\begin{DoxyCompactItemize} +\item +int {\bfseries i\+\_\+beg} +\begin{DoxyCompactList}\small\item\em begin of loop for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries i\+\_\+end} +\begin{DoxyCompactList}\small\item\em end of loop for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries j\+\_\+beg} +\begin{DoxyCompactList}\small\item\em begin of loop for rhs in y direction \end{DoxyCompactList}\item +int {\bfseries j\+\_\+end} +\begin{DoxyCompactList}\small\item\em end of loop for rhs in y direction \end{DoxyCompactList}\item +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} +\begin{DoxyCompactList}\small\item\em object holding the needed field variables for rhs and p \end{DoxyCompactList}\item +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ {\bfseries boundary\+\_\+} +\begin{DoxyCompactList}\small\item\em object managing boundary for obstacle and surface tension \end{DoxyCompactList}\item +double {\bfseries epsilon\+\_\+} +\begin{DoxyCompactList}\small\item\em tolerance for the solver \end{DoxyCompactList}\item +int {\bfseries maximum\+Number\+Of\+Iterations\+\_\+} +\begin{DoxyCompactList}\small\item\em maximum number of iterations \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Standard Gauss-\/\+Seidel solver. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classGaussSeidel_af31cc1ace2d616ebb8e0592c06865b9c}\label{classGaussSeidel_af31cc1ace2d616ebb8e0592c06865b9c} +\index{GaussSeidel@{GaussSeidel}!GaussSeidel@{GaussSeidel}} +\index{GaussSeidel@{GaussSeidel}!GaussSeidel@{GaussSeidel}} +\doxysubsubsection{\texorpdfstring{GaussSeidel()}{GaussSeidel()}} +{\footnotesize\ttfamily Gauss\+Seidel\+::\+Gauss\+Seidel (\begin{DoxyParamCaption}\item[{const std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ \&}]{data, }\item[{double}]{epsilon, }\item[{int}]{maximum\+Number\+Of\+Iterations, }\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$}]{boundary }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em data} & instance of \doxylink{classDiscretization}{Discretization} holding the needed field variables for rhs and p \\ +\hline +{\em epsilon} & tolerance for the solver \\ +\hline +{\em maximum\+Number\+Of\+Iterations} & maximum of iteration \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classGaussSeidel_a6f0eb0c6938a64f8ded186f88170a04b}\label{classGaussSeidel_a6f0eb0c6938a64f8ded186f88170a04b} +\index{GaussSeidel@{GaussSeidel}!solve@{solve}} +\index{solve@{solve}!GaussSeidel@{GaussSeidel}} +\doxysubsubsection{\texorpdfstring{solve()}{solve()}} +{\footnotesize\ttfamily void Gauss\+Seidel\+::solve (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +override function that starts solver. + + + +Implements \mbox{\hyperlink{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0}{Pressure\+Solver}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/solver/gauss\+\_\+seidel.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/solver/gauss\+\_\+seidel.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classMask.tex b/documentation/latex/classMask.tex new file mode 100644 index 00000000..11c07bdf --- /dev/null +++ b/documentation/latex/classMask.tex @@ -0,0 +1,339 @@ +\doxysection{Mask Class Reference} +\hypertarget{classMask}{}\label{classMask}\index{Mask@{Mask}} +\doxysubsubsection*{Public Types} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classMask_ad74a26afe88ebadafebd733837f3252a}\label{classMask_ad74a26afe88ebadafebd733837f3252a} +enum \mbox{\hyperlink{classMask_ad74a26afe88ebadafebd733837f3252a}{Cell\+Type}} \{ \newline +{\bfseries FLUID\+\_\+\+DROPLET} = 0 +, {\bfseries FLUID\+\_\+\+SINGLE\+\_\+\+LEFT} = 1 +, {\bfseries FLUID\+\_\+\+SINGLE\+\_\+\+TOP} = 2 +, {\bfseries FLUID\+\_\+\+SINGLE\+\_\+\+RIGHT} = 4 +, \newline +{\bfseries FLUID\+\_\+\+SINGLE\+\_\+\+BOTTOM} = 8 +, {\bfseries FLUID\+\_\+\+CORNER\+\_\+\+BOTTOM\+\_\+\+LEFT} = 6 +, {\bfseries FLUID\+\_\+\+CORNER\+\_\+\+TOP\+\_\+\+LEFT} = 12 +, {\bfseries FLUID\+\_\+\+CORNER\+\_\+\+TOP\+\_\+\+RIGHT} = 9 +, \newline +{\bfseries FLUID\+\_\+\+CORNER\+\_\+\+BOTTOM\+\_\+\+RIGHT} = 3 +, {\bfseries FLUID\+\_\+\+COLUMN\+\_\+\+HORIZONTAL} = 5 +, {\bfseries FLUID\+\_\+\+COLUMN\+\_\+\+VERTICAL} = 10 +, {\bfseries FLUID\+\_\+\+BORDER\+\_\+\+LEFT} = 14 +, \newline +{\bfseries FLUID\+\_\+\+BORDER\+\_\+\+TOP} = 13 +, {\bfseries FLUID\+\_\+\+BORDER\+\_\+\+RIGHT} = 11 +, {\bfseries FLUID\+\_\+\+BORDER\+\_\+\+BOTTOM} = 7 +, {\bfseries FLUID} = 15 +, \newline +{\bfseries FLUID\+\_\+\+TYPE} = 50 +, {\bfseries AIR} = 64 +, {\bfseries OBSTACLE} = 99 +, {\bfseries OBSTACLE\+\_\+\+INSIDE} = 100 +, \newline +{\bfseries OBSTACLE\+\_\+\+BORDER\+\_\+\+LEFT} = 101 +, {\bfseries OBSTACLE\+\_\+\+BORDER\+\_\+\+TOP} = 102 +, {\bfseries OBSTACLE\+\_\+\+CORNER\+\_\+\+TOP\+\_\+\+LEFT} = 103 +, {\bfseries OBSTACLE\+\_\+\+BORDER\+\_\+\+RIGHT} = 104 +, \newline +{\bfseries OBSTACLE\+\_\+\+CORNER\+\_\+\+TOP\+\_\+\+RIGHT} = 106 +, {\bfseries OBSTACLE\+\_\+\+BORDER\+\_\+\+BOTTOM} = 108 +, {\bfseries OBSTACLE\+\_\+\+CORNER\+\_\+\+BOTTOM\+\_\+\+LEFT} = 109 +, {\bfseries OBSTACLE\+\_\+\+CORNER\+\_\+\+BOTTOM\+\_\+\+RIGHT} = 112 +, \newline +{\bfseries DOMAIN\+\_\+\+BOUNDARY} = 200 +, {\bfseries DOMAIN\+\_\+\+LEFT\+\_\+\+NOSLIP} = 201 +, {\bfseries DOMAIN\+\_\+\+TOP\+\_\+\+NOSLIP} = 202 +, {\bfseries DOMAIN\+\_\+\+RIGHT\+\_\+\+NOSLIP} = 203 +, \newline +{\bfseries DOMAIN\+\_\+\+BOTTOM\+\_\+\+NOSLIP} = 204 +, {\bfseries DOMAIN\+\_\+\+LEFT\+\_\+\+PRESSURE} = 205 +, {\bfseries DOMAIN\+\_\+\+TOP\+\_\+\+PRESSURE} = 206 +, {\bfseries DOMAIN\+\_\+\+RIGHT\+\_\+\+PRESSURE} = 207 +, \newline +{\bfseries DOMAIN\+\_\+\+BOTTOM\+\_\+\+PRESSURE} = 208 + \} +\begin{DoxyCompactList}\small\item\em \texorpdfstring{$<$}{<} enums used to encode cell type and boundary condition \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classMask_a5d65d3a108a79864bc69994f5e56f6c3}{Mask}} (\mbox{\hyperlink{structSettings}{Settings}} settings) +\begin{DoxyCompactList}\small\item\em constructor. \end{DoxyCompactList}\item +int \& \mbox{\hyperlink{classMask_a6d612f1ac2185304b3ad7432d90dcd2b}{operator()}} (int i, int j) +\begin{DoxyCompactList}\small\item\em set array value. Overloads the () operator \end{DoxyCompactList}\item +int \mbox{\hyperlink{classMask_a154acb41f2695c2a6ace82b5ebccbb1c}{operator()}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em get array value. Overloads the () operator \end{DoxyCompactList}\item +\Hypertarget{classMask_aafa0857af35b02ba6070e76f82d51c7b}\label{classMask_aafa0857af35b02ba6070e76f82d51c7b} +std\+::array$<$ int, 2 $>$ {\bfseries size} () const +\begin{DoxyCompactList}\small\item\em get size of array in x and y direction \end{DoxyCompactList}\item +\Hypertarget{classMask_ac30997cdd83faef98290733acb325cf8}\label{classMask_ac30997cdd83faef98290733acb325cf8} +void {\bfseries reset\+Mask} () +\begin{DoxyCompactList}\small\item\em sets all not obstacle cells to air \end{DoxyCompactList}\item +bool \mbox{\hyperlink{classMask_aadacef52f95b796920864b8519d0594b}{is\+Fluid}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Cell at (i,j) is fluid or not. \end{DoxyCompactList}\item +bool \mbox{\hyperlink{classMask_a53e4e7c0b29234856cbee33386cc5c18}{is\+Obstacle}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em True if Cell at (i,j) is either obstacle or boundary. \end{DoxyCompactList}\item +bool \mbox{\hyperlink{classMask_a7eb34f789ef96c622ab93718d5278d77}{is\+Air}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Cell at (i,j) is a air cell or not. \end{DoxyCompactList}\item +bool \mbox{\hyperlink{classMask_a5f3d53087eb5a1d9427716804e280751}{is\+Inner\+Fluid}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Cell at (i,j) is a inner fluid cell or not. \end{DoxyCompactList}\item +bool \mbox{\hyperlink{classMask_a9f76177c70d7cab7f268c8fd9a102e73}{is\+Domain\+Boundary}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Cecks if cell at index is domain boundary. \end{DoxyCompactList}\item +bool \mbox{\hyperlink{classMask_ada8b2531a4a16703f145fd6f708f21ff}{is\+Obstacle\+Boundary}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Cecks if cell at index is obstacle boundary. \end{DoxyCompactList}\item +bool \mbox{\hyperlink{classMask_a2ffcf2b70edede392422ea692e49d313}{is\+Fluid\+Boundary}} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Cecks if cell at index is fluid boundary. \end{DoxyCompactList}\item +int \mbox{\hyperlink{classMask_a3471a6026ce7eab118f660557a8abac6}{get\+Number\+Of\+Fluid\+Cells}} () const +\begin{DoxyCompactList}\small\item\em number of fluid cells \end{DoxyCompactList}\item +void \mbox{\hyperlink{classMask_a75a1750221e41c1b34f80d4d352163ac}{make\+Rectangular\+Obstacle}} () +\begin{DoxyCompactList}\small\item\em creates rectangulat objecct inside domain \end{DoxyCompactList}\item +void \mbox{\hyperlink{classMask_ad69aefd91f740d6758cdedf0df8c8ca6}{create\+Mask\+From\+PNGBit\+Map}} () +\begin{DoxyCompactList}\small\item\em creates mask by reading in bitmap \end{DoxyCompactList}\item +void \mbox{\hyperlink{classMask_aacf4d2cfe1362df85ed08fd3b0fc6d6b}{set\+Domain\+BC}} () +\begin{DoxyCompactList}\small\item\em sets enums for all cells that belong to domain boundary \end{DoxyCompactList}\item +\Hypertarget{classMask_a644a84aca88442b72b5cd87ee80f1724}\label{classMask_a644a84aca88442b72b5cd87ee80f1724} +void {\bfseries set\+Obstacle\+BC} () +\begin{DoxyCompactList}\small\item\em sets enums for all cells that belong to an obstacle \end{DoxyCompactList}\item +\Hypertarget{classMask_a41bf0aa100e2554eaea3ab29a999c0ee}\label{classMask_a41bf0aa100e2554eaea3ab29a999c0ee} +void {\bfseries set\+Fluid\+BC} () +\begin{DoxyCompactList}\small\item\em sets enums for all fluid cells that belong are located at a surface \end{DoxyCompactList}\item +\Hypertarget{classMask_a372d2a81ff261f126b11fdfcfd2f845e}\label{classMask_a372d2a81ff261f126b11fdfcfd2f845e} +void {\bfseries print\+Mask} () const +\begin{DoxyCompactList}\small\item\em print mask enums to terminal \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classMask_a84bff46271e16eb8639c1831403c1bb9}\label{classMask_a84bff46271e16eb8639c1831403c1bb9} +std\+::array$<$ int, 2 $>$ {\bfseries size\+\_\+} +\begin{DoxyCompactList}\small\item\em size of array in x and y direction \end{DoxyCompactList}\item +\Hypertarget{classMask_acdb73aee935b502fecc8de6bf1e32a09}\label{classMask_acdb73aee935b502fecc8de6bf1e32a09} +std\+::vector$<$ int $>$ {\bfseries data\+\_\+} +\begin{DoxyCompactList}\small\item\em storage array values, in row-\/major order \end{DoxyCompactList}\item +\Hypertarget{classMask_a3c5a51f6d03bb4a5e1742537a22ec441}\label{classMask_a3c5a51f6d03bb4a5e1742537a22ec441} +std\+::vector$<$ int $>$ {\bfseries boundary\+\_\+list} +\begin{DoxyCompactList}\small\item\em stores the indices of the boundary cells \end{DoxyCompactList}\item +\Hypertarget{classMask_acb8b165d56689722fd836569e066fdd4}\label{classMask_acb8b165d56689722fd836569e066fdd4} +\mbox{\hyperlink{structSettings}{Settings}} {\bfseries settings\+\_\+} +\begin{DoxyCompactList}\small\item\em settings entity \end{DoxyCompactList}\item +\Hypertarget{classMask_abe4f6f251b0517f01d0f58f9042d3af4}\label{classMask_abe4f6f251b0517f01d0f58f9042d3af4} +int {\bfseries forbidden\+Obstacle\+Fluid\+Combinations} \mbox{[}7\mbox{]} = \{105, 107, 110, 111, 113, 114, 115\} +\begin{DoxyCompactList}\small\item\em enums that singnal forbidden obstacle -\/ fluid cell combinations \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classMask_a5d65d3a108a79864bc69994f5e56f6c3}\label{classMask_a5d65d3a108a79864bc69994f5e56f6c3} +\index{Mask@{Mask}!Mask@{Mask}} +\index{Mask@{Mask}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{Mask()}{Mask()}} +{\footnotesize\ttfamily Mask\+::\+Mask (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{structSettings}{Settings}}}]{settings }\end{DoxyParamCaption})} + + + +constructor. + + +\begin{DoxyParams}{Parameters} +{\em setting} & settings containing necessary user input \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classMask_ad69aefd91f740d6758cdedf0df8c8ca6}\label{classMask_ad69aefd91f740d6758cdedf0df8c8ca6} +\index{Mask@{Mask}!createMaskFromPNGBitMap@{createMaskFromPNGBitMap}} +\index{createMaskFromPNGBitMap@{createMaskFromPNGBitMap}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{createMaskFromPNGBitMap()}{createMaskFromPNGBitMap()}} +{\footnotesize\ttfamily void Mask\+::create\+Mask\+From\+PNGBit\+Map (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} + + + +creates mask by reading in bitmap + +path to bitmap saved as png is specified in settings file by user \Hypertarget{classMask_a3471a6026ce7eab118f660557a8abac6}\label{classMask_a3471a6026ce7eab118f660557a8abac6} +\index{Mask@{Mask}!getNumberOfFluidCells@{getNumberOfFluidCells}} +\index{getNumberOfFluidCells@{getNumberOfFluidCells}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{getNumberOfFluidCells()}{getNumberOfFluidCells()}} +{\footnotesize\ttfamily int Mask\+::get\+Number\+Of\+Fluid\+Cells (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const} + + + +number of fluid cells + +not efficient but is only used once in the creation of the fluid tracer \Hypertarget{classMask_a7eb34f789ef96c622ab93718d5278d77}\label{classMask_a7eb34f789ef96c622ab93718d5278d77} +\index{Mask@{Mask}!isAir@{isAir}} +\index{isAir@{isAir}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{isAir()}{isAir()}} +{\footnotesize\ttfamily bool Mask\+::is\+Air (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} + + + +Cell at (i,j) is a air cell or not. + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction\\ +\hline +\end{DoxyParams} +If i and j are out of bond returns false \Hypertarget{classMask_a9f76177c70d7cab7f268c8fd9a102e73}\label{classMask_a9f76177c70d7cab7f268c8fd9a102e73} +\index{Mask@{Mask}!isDomainBoundary@{isDomainBoundary}} +\index{isDomainBoundary@{isDomainBoundary}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{isDomainBoundary()}{isDomainBoundary()}} +{\footnotesize\ttfamily bool Mask\+::is\+Domain\+Boundary (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} + + + +Cecks if cell at index is domain boundary. + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction \\ +\hline +\end{DoxyParams} +\Hypertarget{classMask_aadacef52f95b796920864b8519d0594b}\label{classMask_aadacef52f95b796920864b8519d0594b} +\index{Mask@{Mask}!isFluid@{isFluid}} +\index{isFluid@{isFluid}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{isFluid()}{isFluid()}} +{\footnotesize\ttfamily bool Mask\+::is\+Fluid (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} + + + +Cell at (i,j) is fluid or not. + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction\\ +\hline +\end{DoxyParams} +If i and j are out of bond returns false \Hypertarget{classMask_a2ffcf2b70edede392422ea692e49d313}\label{classMask_a2ffcf2b70edede392422ea692e49d313} +\index{Mask@{Mask}!isFluidBoundary@{isFluidBoundary}} +\index{isFluidBoundary@{isFluidBoundary}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{isFluidBoundary()}{isFluidBoundary()}} +{\footnotesize\ttfamily bool Mask\+::is\+Fluid\+Boundary (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} + + + +Cecks if cell at index is fluid boundary. + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction \\ +\hline +\end{DoxyParams} +\Hypertarget{classMask_a5f3d53087eb5a1d9427716804e280751}\label{classMask_a5f3d53087eb5a1d9427716804e280751} +\index{Mask@{Mask}!isInnerFluid@{isInnerFluid}} +\index{isInnerFluid@{isInnerFluid}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{isInnerFluid()}{isInnerFluid()}} +{\footnotesize\ttfamily bool Mask\+::is\+Inner\+Fluid (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} + + + +Cell at (i,j) is a inner fluid cell or not. + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction\\ +\hline +\end{DoxyParams} +Checks if fluid is sourrounded by only fluid cells If i and j are out of bond returns false \Hypertarget{classMask_a53e4e7c0b29234856cbee33386cc5c18}\label{classMask_a53e4e7c0b29234856cbee33386cc5c18} +\index{Mask@{Mask}!isObstacle@{isObstacle}} +\index{isObstacle@{isObstacle}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{isObstacle()}{isObstacle()}} +{\footnotesize\ttfamily bool Mask\+::is\+Obstacle (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} + + + +True if Cell at (i,j) is either obstacle or boundary. + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction \\ +\hline +\end{DoxyParams} +\Hypertarget{classMask_ada8b2531a4a16703f145fd6f708f21ff}\label{classMask_ada8b2531a4a16703f145fd6f708f21ff} +\index{Mask@{Mask}!isObstacleBoundary@{isObstacleBoundary}} +\index{isObstacleBoundary@{isObstacleBoundary}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{isObstacleBoundary()}{isObstacleBoundary()}} +{\footnotesize\ttfamily bool Mask\+::is\+Obstacle\+Boundary (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} + + + +Cecks if cell at index is obstacle boundary. + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction \\ +\hline +\end{DoxyParams} +\Hypertarget{classMask_a75a1750221e41c1b34f80d4d352163ac}\label{classMask_a75a1750221e41c1b34f80d4d352163ac} +\index{Mask@{Mask}!makeRectangularObstacle@{makeRectangularObstacle}} +\index{makeRectangularObstacle@{makeRectangularObstacle}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{makeRectangularObstacle()}{makeRectangularObstacle()}} +{\footnotesize\ttfamily void Mask\+::make\+Rectangular\+Obstacle (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} + + + +creates rectangulat objecct inside domain + +location and size are specified in settings file by user \Hypertarget{classMask_a6d612f1ac2185304b3ad7432d90dcd2b}\label{classMask_a6d612f1ac2185304b3ad7432d90dcd2b} +\index{Mask@{Mask}!operator()@{operator()}} +\index{operator()@{operator()}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{operator()()}{operator()()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} +{\footnotesize\ttfamily int \& Mask\+::operator() (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption})} + + + +set array value. Overloads the () operator + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction \\ +\hline +\end{DoxyParams} +\Hypertarget{classMask_a154acb41f2695c2a6ace82b5ebccbb1c}\label{classMask_a154acb41f2695c2a6ace82b5ebccbb1c} +\index{Mask@{Mask}!operator()@{operator()}} +\index{operator()@{operator()}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{operator()()}{operator()()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} +{\footnotesize\ttfamily int Mask\+::operator() (\begin{DoxyParamCaption}\item[{int}]{i, }\item[{int}]{j }\end{DoxyParamCaption}) const} + + + +get array value. Overloads the () operator + + +\begin{DoxyParams}{Parameters} +{\em i} & index in x direction \\ +\hline +{\em j} & index in y direction \\ +\hline +\end{DoxyParams} +\Hypertarget{classMask_aacf4d2cfe1362df85ed08fd3b0fc6d6b}\label{classMask_aacf4d2cfe1362df85ed08fd3b0fc6d6b} +\index{Mask@{Mask}!setDomainBC@{setDomainBC}} +\index{setDomainBC@{setDomainBC}!Mask@{Mask}} +\doxysubsubsection{\texorpdfstring{setDomainBC()}{setDomainBC()}} +{\footnotesize\ttfamily void Mask\+::set\+Domain\+BC (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} + + + +sets enums for all cells that belong to domain boundary + +type of domain boundary condition is specified in settings file by user + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/boundary/mask.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/boundary/mask.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classOutputWriter.eps b/documentation/latex/classOutputWriter.eps new file mode 100644 index 00000000..b542206f --- /dev/null +++ b/documentation/latex/classOutputWriter.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 138.888885 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 3.600000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(OutputWriter) cw +(OutputWriterParaview) cw +(OutputWriterText) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (OutputWriter) 0.500000 1.000000 box + (OutputWriterParaview) 0.000000 0.000000 box + (OutputWriterText) 1.000000 0.000000 box + +% ----- relations ----- + +solid +1 0.500000 0.250000 out +solid +0.000000 1.000000 1.000000 conn +solid +0 0.000000 0.750000 in +solid +0 1.000000 0.750000 in diff --git a/documentation/latex/classOutputWriter.pdf b/documentation/latex/classOutputWriter.pdf new file mode 100644 index 0000000000000000000000000000000000000000..073519b9afaac3212da99db19ea8d5a7e2ef0c54 GIT binary patch literal 5206 zcmb^#cU%)$+EZ5{>w;KUS9EBGVwg-CB$6NyP?QoAKon6!G6|71G7|{cS6FmeY-d9d zL2)fCR!~&Lt_X;V6+y&u3Rn;;An3gbRd4Th|F{YK=Dn}Iue~?l_v{3G9}42kB-veh zv3fhn&dygIqmhVlg+|SRF4SF!J;W@|ptPUK*7a5JxDK z3OvpajX{-MAPk~leD4rnFK@0^DvQ-Aa1=lS^|)4#`zVws*Bx+zbw%DmLB0W#MK-Wj zhk`#0EGP9B8$|jD48;W!oQqJY0Ms$}(Wr5Zi|h12nABSpfl57;%CCSPdR!ya;9?vV zh~+3|0|#i-fSAODsE{UNKFQ4u_CwWjJQ897h!6(4;HVCQeUyNOk4iLBl*c1sxDFMo zNQU&S!qR|#$e_YcP7C{+U5rjw>byP2WE~jtY_DV9Zl~*ecP`}B$it3smwuSnX#Y6X zx6o&N((EPSTZ2zGn?-4V_%%E=*f8VlOKjQpCxur-i#$rTb?bxy|2QlhJbZ#vL438! zJ+|u372U)Kvp0>?&OO`zd{BCFflJE3P>Fly(3p%=TXBS4ikZ`EMD8e^6w>ceg3Sfx zl&hm{2Hx&l`2F~dGD+q=$#<}8i^Old+4UWwN7l!tm+h*TwdSWcCKc>hs^2rI&|8qd znE9^6^U)8rk2n7G+?qZ8NO4Kf^UvpwOS9I$-~L|r`Q%Au*!KJK6)7#Jt6S%9ITN)+ z+CR^NF=ACj^YE-=*VZU4FRo*awOR0H%Yjc^H@QD=S;Nqpnxm)BRvgaV%)YkSp+)ip zFX>yOE}xJUHSz`YN^~NCThTDrHf9Dj17CJ$^*F<`_v2spd;9rJE2@@uIv0$HfDmCI z-gG*f)Cpqr#40FGi^4=CVSiMr5PND2P#6`UnII_;x~sD*JDddYI#i8AbRwW6Scqa8 zy-tE+Ak+e#Mj}G-Fc@SS1P7r89FPi$dwRc zRL6(`eo*Kz+$&P7gIw6KpSW|3(5UbXg%pp(!XOtKjl^UU5h8vpqn1>N%^)oQ>PMnN zjBaSph~`2p+WjLDQKLe1I$=J6Bj&_ESciCn*m$eK4pgY+Kn1mj8dG%7!T!gITp$90 z^tghM-{}ftst~^DvDs*7fLMk8H}`mggaY|Qp&>31n@)pRuJmx?C;*2ZokoH^FbR=Z z01DDXtet`?JbNb}bs9%Fe`wwst%Wg#nH%Rhp z>vrefjtNWJxwMea4UnFK9jTD>rCE!lLnZMOH=h)Lg_4_=#VUVT5{{{4I5 zTPfUOkxj!2Q9;t@LNH<&A|?tWi^sb=d`iJ$v_FE!i)! zobjc(=CpiGTZ3KORd17=qN_9Srj?Xl=szTRjjP>}Exi1`LrTva88mthB%DI~l>6vf z>$#Q-r>YC0Z+zyYc;x)C?>efkI;3Cl)YR)~;JUJY!S74v>z{HSRtSQ_c1;i7qdzwF zmg%BJPwCZVZF}c0dKvxl%jfnx_rA!tK`R(3A-gn@ZZ$#g)7(%o;!)^7Y;e*_>+PHE zt>)NGUAg@HhzO^q@duX|TWvH|4t7Y`(41cFIpFfRjm`Xt{G-C#+2@6ub~%d3yBF0? zeLV31Dd>gCwix*Z`Pw6=ABCWbLa;&H=Mdia9mxfXU`+{_0)^Iq7_T$$pC&06@uX;9lx zP1Ns=F$tkTCG+Sh4a)JN9G|&SAy!ZCf1FGn_ImJs`t=zF2QEh^oEaPcQ8SHadEy$E z3T;dGyOMRkIzN(T;7%AS@SDCkcKwq;)6Wr!Ye(0wII!FF;FzlNeV452XT1(PXDNQN zDXS*)V`1{j+95XF^0>-+CUkM+&VZcKM;x0m$)!(~v6%DCm4)GJ5rf66X#?Hs-d3gZ`y)Nf9!y<8o}IC~kCh<(Qcc;Z3)6-=@#6bG|5D`GPTThBV0NYS z$S8{)hZA-U6Zq{IRh5Zk1%`b1m(}>^8xDCLFS^LL9+7h5<=7K5&a}MbJwXTfJQ}&* zY`1wSrbyoq6`Au#h0B)pb+-SUql;{~TYYoq-7=6pImI`s3=WcE7d)R``p%-JZOYF< zM{W-|d^?+cW9jBC$FKV)ro~jJj!t^!jCjT;#J2}0Bs|=pWq97&e(}{khc@f=Q^qYT z(9EOi${mtxRX*`6z7Jh%ntCN(m3w7AE02+3>YLK83Qs?wxLZMCOwG>0ime16R$UJ? z&w91-;hX)hM?3ufI^dS+ZQUU+Swg{7RW7!8H7V{o%UB39>^;2ulnOw{rvfkgS_kP_txc(bx!5ASoXDukN=Ri(y1)*a!%6&E33Sp z>`4ccwW{CR?ucA}$lkp`yy3~`QA^Su2g{n6_dXxmsoI~Y_!(RDPQA-PdFtxvw0B9f zSGRk;8+_lyZ~Uv@Y@c1b6nU1hZ`4Bh{7;n=&ex75>CC4LD6IKMaY0y-%xjLr??3sQ z?F!iJea=&@;f6QW)|bA`sc6*i@6YmVzb9#`a!32r#f+?(y?K82qE&0?PfVbhk1F$! zifSj-i|3Ypt?m#iPUi2pacj@x*27*+&9#}%`$Dptpu6p|pZhn8Eap~_E9=#!rsZ#n zW{&>R`SzGgw*Soh;{aJ7z3R{-?jF;<+pVw%f=QA>6 z^}4gxRnQsK|E4}n<5ZF9lk-dNxzeUh!U>7{C!Dn8l~baUXMPe4wrlNo*z9-n$!T?I zA0}1R?ZYPSOl@|Xb1s>3@+H^ao)K5@_IQ}!;g-7RM^=a@d~XJ?nrgG2dOY^bhYR6* zEE*7gAu{+(N>OU&7oVlR^u(6!eS#A9G;QO~;=CG?Jnr~~t3%H(>0@K^+bE*M`??G@ z);7H>iLTnL=NlU8@7MhSrP1l#A5b@UgH|kwLUAYpl`GU-a^s0pWJn?9l4mgess36o zG*U4oUWba}1A-*+Q4+S4?9L;(xr;&li&6|?Ek$N*LNEx_6kKaBp`VX6L15q*R9Y1% z5g~(0sm3@4F4@S!0b>FTlOZDs9>pbx`U@ajqftgFaERv2c19=&eF7xYf!Zflqln;LUA>f|iZs9;4Xj5t%_u7$elFwjOq#KPhTjUMM(TX#wUZQ-Ab0SF+6 z4$K214k+QJdI_rIk|zuNpvjRM4DTpuA+|G<=}aZVop$}ja=@2=z8nZZr`m3ShT{+F zPgxuvbb~w^mBye@X%wnU5W?gz*c=AkiHdNjR5$n=N)Rl->IIrc&_wW)Q>l${7Sm~dk+JO8HTVy(ab|F&JFB9e)qnuDtIU?DZ`bH(wR(21nutzK`QCiL#x**jp-(pz^D=>mc&3D z5TJ-u!jWloDlrZcUaJL#weczf2H8O7xd9}uz?CS^n9LqZyknqL5NX9xiq*+7w^ zGO=EXlX+fBF@_N>K!@{`3SP&+$O!ic10x9$K8>zJo(PTZ65Pqr&1ysutlbQM5*H%~ zY&8%fxO*e>NYMZ3`Tq&(IlaJ{$R)=TXVZV2jkd76VxMHH_-Q295bQFc#4ee*>e@KqLAM zj70~1`Zq9R>-;qgp%I^+uVGX+0xl!Ih9L~rf5-!!bT6H8of!0pI&j4W!6HRG3VZ;; zLX8GoO%P2Z1pBIG8i)ubxFzxBLt$Bk+k;L+_-s!W)7yi|pt&$;2!r9l c`)i7D;?@Jh#X8*Rc!n!N2N#Imfj*>v1AJMr2mk;8 literal 0 HcmV?d00001 diff --git a/documentation/latex/classOutputWriter.tex b/documentation/latex/classOutputWriter.tex new file mode 100644 index 00000000..8ec274d1 --- /dev/null +++ b/documentation/latex/classOutputWriter.tex @@ -0,0 +1,84 @@ +\doxysection{Output\+Writer Class Reference} +\hypertarget{classOutputWriter}{}\label{classOutputWriter}\index{OutputWriter@{OutputWriter}} + + +Inteface class for writing simulation data output. + + + + +{\ttfamily \#include $<$output\+\_\+writer.\+h$>$} + +Inheritance diagram for Output\+Writer\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classOutputWriter} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}{Output\+Writer}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +virtual void \mbox{\hyperlink{classOutputWriter_ac625c204affdc05919388a3549c2e945}{write\+File}} (double current\+Time)=0 +\begin{DoxyCompactList}\small\item\em Write current velocities to file. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classOutputWriter_a0587b2dc160a9b1393411433dfc23b68}\label{classOutputWriter_a0587b2dc160a9b1393411433dfc23b68} +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} +\begin{DoxyCompactList}\small\item\em shared pointer, discretization object containing data to be written to file \end{DoxyCompactList}\item +\Hypertarget{classOutputWriter_a69d167e2526407602dce26ca7a2b9248}\label{classOutputWriter_a69d167e2526407602dce26ca7a2b9248} +int {\bfseries file\+No\+\_\+} +\begin{DoxyCompactList}\small\item\em a counter that increments for every file written to disk \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Inteface class for writing simulation data output. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}\label{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7} +\index{OutputWriter@{OutputWriter}!OutputWriter@{OutputWriter}} +\index{OutputWriter@{OutputWriter}!OutputWriter@{OutputWriter}} +\doxysubsubsection{\texorpdfstring{OutputWriter()}{OutputWriter()}} +{\footnotesize\ttfamily Output\+Writer\+::\+Output\+Writer (\begin{DoxyParamCaption}\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$}]{discretization }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em discretization} & discretization object containing data to be written to file \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classOutputWriter_ac625c204affdc05919388a3549c2e945}\label{classOutputWriter_ac625c204affdc05919388a3549c2e945} +\index{OutputWriter@{OutputWriter}!writeFile@{writeFile}} +\index{writeFile@{writeFile}!OutputWriter@{OutputWriter}} +\doxysubsubsection{\texorpdfstring{writeFile()}{writeFile()}} +{\footnotesize\ttfamily virtual void Output\+Writer\+::write\+File (\begin{DoxyParamCaption}\item[{double}]{current\+Time }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}} + + + +Write current velocities to file. + +Filename is output\+\_\+$<$file\+No\+\_\+$>$.\+vti + + +\begin{DoxyParams}{Parameters} +{\em current\+Time} & current time of simulation \\ +\hline +\end{DoxyParams} + + +Implemented in \mbox{\hyperlink{classOutputWriterParaview_a9e203b63d0e2f26ad53d18ee1821c6bb}{Output\+Writer\+Paraview}}, and \mbox{\hyperlink{classOutputWriterText_a25a12ea2524fc34e9acb19ef1f4c7431}{Output\+Writer\+Text}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classOutputWriterParaview.eps b/documentation/latex/classOutputWriterParaview.eps new file mode 100644 index 00000000..f7ed431b --- /dev/null +++ b/documentation/latex/classOutputWriterParaview.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 277.777771 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.800000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(OutputWriterParaview) cw +(OutputWriter) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (OutputWriterParaview) 0.000000 0.000000 box + (OutputWriter) 0.000000 1.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in diff --git a/documentation/latex/classOutputWriterParaview.pdf b/documentation/latex/classOutputWriterParaview.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ed4127f112fd8947d63b045d7b8746a5d19918ee GIT binary patch literal 4909 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 + +Inheritance diagram for Output\+Writer\+Paraview\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classOutputWriterParaview} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classOutputWriterParaview_ab2d30ea87bf48abef82f95976c662cc1}{Output\+Writer\+Paraview}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$ mask, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classFluidTracer}{Fluid\+Tracer}} $>$ fluid\+Tracer) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +void \mbox{\hyperlink{classOutputWriterParaview_a9e203b63d0e2f26ad53d18ee1821c6bb}{write\+File}} (double current\+Time) +\begin{DoxyCompactList}\small\item\em Write current velocities to file, filename is output\+\_\+$<$count$>$.\+vti. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classOutputWriter}{Output\+Writer}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}{Output\+Writer}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Additional Inherited Members} +\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classOutputWriter}{Output\+Writer}}} +\begin{DoxyCompactItemize} +\item +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} +\begin{DoxyCompactList}\small\item\em shared pointer, discretization object containing data to be written to file \end{DoxyCompactList}\item +int {\bfseries file\+No\+\_\+} +\begin{DoxyCompactList}\small\item\em a counter that increments for every file written to disk \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Write \texorpdfstring{$\ast$}{*}.vti files that can be viewed with Para\+View. + +The mesh that can be visualized in Para\+View corresponds to the mesh of the computational domain. All values are given for the nodes of the mesh, i.\+e., the corners of each cell. This means, values will be interpolated because the values are stored at positions given by the staggered grid. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classOutputWriterParaview_ab2d30ea87bf48abef82f95976c662cc1}\label{classOutputWriterParaview_ab2d30ea87bf48abef82f95976c662cc1} +\index{OutputWriterParaview@{OutputWriterParaview}!OutputWriterParaview@{OutputWriterParaview}} +\index{OutputWriterParaview@{OutputWriterParaview}!OutputWriterParaview@{OutputWriterParaview}} +\doxysubsubsection{\texorpdfstring{OutputWriterParaview()}{OutputWriterParaview()}} +{\footnotesize\ttfamily Output\+Writer\+Paraview\+::\+Output\+Writer\+Paraview (\begin{DoxyParamCaption}\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$}]{discretization, }\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classMask}{Mask}} $>$}]{mask, }\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classFluidTracer}{Fluid\+Tracer}} $>$}]{fluid\+Tracer }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em discretization} & shared pointer to the discretization object that will contain all the data to be written to the file \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classOutputWriterParaview_a9e203b63d0e2f26ad53d18ee1821c6bb}\label{classOutputWriterParaview_a9e203b63d0e2f26ad53d18ee1821c6bb} +\index{OutputWriterParaview@{OutputWriterParaview}!writeFile@{writeFile}} +\index{writeFile@{writeFile}!OutputWriterParaview@{OutputWriterParaview}} +\doxysubsubsection{\texorpdfstring{writeFile()}{writeFile()}} +{\footnotesize\ttfamily void Output\+Writer\+Paraview\+::write\+File (\begin{DoxyParamCaption}\item[{double}]{current\+Time }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}} + + + +Write current velocities to file, filename is output\+\_\+$<$count$>$.\+vti. + + +\begin{DoxyParams}{Parameters} +{\em current\+Time} & current time in simulation \\ +\hline +\end{DoxyParams} + + +Implements \mbox{\hyperlink{classOutputWriter_ac625c204affdc05919388a3549c2e945}{Output\+Writer}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer\+\_\+paraview.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer\+\_\+paraview.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classOutputWriterText.eps b/documentation/latex/classOutputWriterText.eps new file mode 100644 index 00000000..3d9f5696 --- /dev/null +++ b/documentation/latex/classOutputWriterText.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 350.877197 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.425000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(OutputWriterText) cw +(OutputWriter) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (OutputWriterText) 0.000000 0.000000 box + (OutputWriter) 0.000000 1.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in diff --git a/documentation/latex/classOutputWriterText.pdf b/documentation/latex/classOutputWriterText.pdf new file mode 100644 index 0000000000000000000000000000000000000000..100302edffefd5d95e1999d88e3df374671e845e GIT binary patch literal 4610 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 WJ@JwhLQrnU^XZYu-(MLM&iF6uxPAQq literal 0 HcmV?d00001 diff --git a/documentation/latex/classOutputWriterText.tex b/documentation/latex/classOutputWriterText.tex new file mode 100644 index 00000000..3dcd30b7 --- /dev/null +++ b/documentation/latex/classOutputWriterText.tex @@ -0,0 +1,85 @@ +\doxysection{Output\+Writer\+Text Class Reference} +\hypertarget{classOutputWriterText}{}\label{classOutputWriterText}\index{OutputWriterText@{OutputWriterText}} + + +Write \texorpdfstring{$\ast$}{*}.txt files that are useful for debugging. + + + + +{\ttfamily \#include $<$output\+\_\+writer\+\_\+text.\+h$>$} + +Inheritance diagram for Output\+Writer\+Text\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classOutputWriterText} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +void \mbox{\hyperlink{classOutputWriterText_a25a12ea2524fc34e9acb19ef1f4c7431}{write\+File}} (double current\+Time) +\begin{DoxyCompactList}\small\item\em Write current velocities to file. \end{DoxyCompactList}\item +void \mbox{\hyperlink{classOutputWriterText_a3480b58a23fd158f16d0ef9c1b67cbfd}{write\+Pressure\+File}} () +\begin{DoxyCompactList}\small\item\em Write only current values of pressure to file. \end{DoxyCompactList}\item +\Hypertarget{classOutputWriterText_a4f3180552b8102c27e087357b9cdd1f7}\label{classOutputWriterText_a4f3180552b8102c27e087357b9cdd1f7} +{\bfseries Output\+Writer} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization) +\begin{DoxyCompactList}\small\item\em Default constructor. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classOutputWriter}{Output\+Writer}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}{Output\+Writer}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Additional Inherited Members} +\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classOutputWriter}{Output\+Writer}}} +\begin{DoxyCompactItemize} +\item +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} +\begin{DoxyCompactList}\small\item\em shared pointer, discretization object containing data to be written to file \end{DoxyCompactList}\item +int {\bfseries file\+No\+\_\+} +\begin{DoxyCompactList}\small\item\em a counter that increments for every file written to disk \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Write \texorpdfstring{$\ast$}{*}.txt files that are useful for debugging. + +All values are written to the file as they are stored in the field variables, no interpolation takes place. + +\doxysubsection{Member Function Documentation} +\Hypertarget{classOutputWriterText_a25a12ea2524fc34e9acb19ef1f4c7431}\label{classOutputWriterText_a25a12ea2524fc34e9acb19ef1f4c7431} +\index{OutputWriterText@{OutputWriterText}!writeFile@{writeFile}} +\index{writeFile@{writeFile}!OutputWriterText@{OutputWriterText}} +\doxysubsubsection{\texorpdfstring{writeFile()}{writeFile()}} +{\footnotesize\ttfamily void Output\+Writer\+Text\+::write\+File (\begin{DoxyParamCaption}\item[{double}]{current\+Time }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}} + + + +Write current velocities to file. + +Filename is output\+\_\+$<$count$>$.\+vti + + +\begin{DoxyParams}{Parameters} +{\em current\+Time} & current time of simulation \\ +\hline +\end{DoxyParams} + + +Implements \mbox{\hyperlink{classOutputWriter_ac625c204affdc05919388a3549c2e945}{Output\+Writer}}. + +\Hypertarget{classOutputWriterText_a3480b58a23fd158f16d0ef9c1b67cbfd}\label{classOutputWriterText_a3480b58a23fd158f16d0ef9c1b67cbfd} +\index{OutputWriterText@{OutputWriterText}!writePressureFile@{writePressureFile}} +\index{writePressureFile@{writePressureFile}!OutputWriterText@{OutputWriterText}} +\doxysubsubsection{\texorpdfstring{writePressureFile()}{writePressureFile()}} +{\footnotesize\ttfamily void Output\+Writer\+Text\+::write\+Pressure\+File (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})} + + + +Write only current values of pressure to file. + +Filename is pressure\+\_\+$<$count$>$.\+txt + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer\+\_\+text.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/output\+\_\+writer/output\+\_\+writer\+\_\+text.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classPressureSolver.eps b/documentation/latex/classPressureSolver.eps new file mode 100644 index 00000000..d140d710 --- /dev/null +++ b/documentation/latex/classPressureSolver.eps @@ -0,0 +1,203 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 185.185181 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.700000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(PressureSolver) cw +(GaussSeidel) cw +(SOR) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (PressureSolver) 0.500000 1.000000 box + (GaussSeidel) 0.000000 0.000000 box + (SOR) 1.000000 0.000000 box + +% ----- relations ----- + +solid +1 0.500000 0.250000 out +solid +0.000000 1.000000 1.000000 conn +solid +0 0.000000 0.750000 in +solid +0 1.000000 0.750000 in diff --git a/documentation/latex/classPressureSolver.pdf b/documentation/latex/classPressureSolver.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0ccb4086d71baf503f4459fb44719c25b05b0afb GIT binary patch literal 5338 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 B(eVHP literal 0 HcmV?d00001 diff --git a/documentation/latex/classPressureSolver.tex b/documentation/latex/classPressureSolver.tex new file mode 100644 index 00000000..e14bfc05 --- /dev/null +++ b/documentation/latex/classPressureSolver.tex @@ -0,0 +1,130 @@ +\doxysection{Pressure\+Solver Class Reference} +\hypertarget{classPressureSolver}{}\label{classPressureSolver}\index{PressureSolver@{PressureSolver}} + + +Solves the Poisson problem for the pressure. + + + + +{\ttfamily \#include $<$pressure\+\_\+solver.\+h$>$} + +Inheritance diagram for Pressure\+Solver\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classPressureSolver} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058}{Pressure\+Solver}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, double epsilon, int maximum\+Number\+Of\+Iterations, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ boundary) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +virtual void \mbox{\hyperlink{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0}{solve}} ()=0 +\begin{DoxyCompactList}\small\item\em virtual function that starts solver. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classPressureSolver_a3c97c6f37cf2bdb3985f90afa6923f93}\label{classPressureSolver_a3c97c6f37cf2bdb3985f90afa6923f93} +double {\bfseries dx2} +\item +\Hypertarget{classPressureSolver_a25b7ff50bdaea53d1b5c7a5cf735c5b5}\label{classPressureSolver_a25b7ff50bdaea53d1b5c7a5cf735c5b5} +double {\bfseries dy2} +\begin{DoxyCompactList}\small\item\em squared mesh widths \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Protected Member Functions} +\begin{DoxyCompactItemize} +\item +void \mbox{\hyperlink{classPressureSolver_a458c383fcacaf54c1a333a271049ca93}{set\+Boundary\+Values}} () +\begin{DoxyCompactList}\small\item\em Set the \doxylink{classBoundary}{Boundary} Values. \end{DoxyCompactList}\item +\Hypertarget{classPressureSolver_afc51f4315c483988aeec327a16c5bb90}\label{classPressureSolver_afc51f4315c483988aeec327a16c5bb90} +double {\bfseries calculate\+Residuum} () +\begin{DoxyCompactList}\small\item\em calculate residuum of current time step \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classPressureSolver_af3ac2e53c6f49b9a362415a89595a7f0}\label{classPressureSolver_af3ac2e53c6f49b9a362415a89595a7f0} +int {\bfseries i\+\_\+beg} +\begin{DoxyCompactList}\small\item\em begin of loop for rhs in x direction \end{DoxyCompactList}\item +\Hypertarget{classPressureSolver_a41b263980e55591d1ffdc4837c252a61}\label{classPressureSolver_a41b263980e55591d1ffdc4837c252a61} +int {\bfseries i\+\_\+end} +\begin{DoxyCompactList}\small\item\em end of loop for rhs in x direction \end{DoxyCompactList}\item +\Hypertarget{classPressureSolver_aa309af30e5e63e09b77900091e562235}\label{classPressureSolver_aa309af30e5e63e09b77900091e562235} +int {\bfseries j\+\_\+beg} +\begin{DoxyCompactList}\small\item\em begin of loop for rhs in y direction \end{DoxyCompactList}\item +\Hypertarget{classPressureSolver_ac2402794034dd74073700998ee2860bf}\label{classPressureSolver_ac2402794034dd74073700998ee2860bf} +int {\bfseries j\+\_\+end} +\begin{DoxyCompactList}\small\item\em end of loop for rhs in y direction \end{DoxyCompactList}\item +\Hypertarget{classPressureSolver_af579ecebaaa8b11914293ef18af5fdc6}\label{classPressureSolver_af579ecebaaa8b11914293ef18af5fdc6} +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} +\begin{DoxyCompactList}\small\item\em object holding the needed field variables for rhs and p \end{DoxyCompactList}\item +\Hypertarget{classPressureSolver_a0b17b46580d259e4bb3a05486bc06a60}\label{classPressureSolver_a0b17b46580d259e4bb3a05486bc06a60} +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ {\bfseries boundary\+\_\+} +\begin{DoxyCompactList}\small\item\em object managing boundary for obstacle and surface tension \end{DoxyCompactList}\item +\Hypertarget{classPressureSolver_a22b723f3b3ba54e47f36cfc2b9576749}\label{classPressureSolver_a22b723f3b3ba54e47f36cfc2b9576749} +double {\bfseries epsilon\+\_\+} +\begin{DoxyCompactList}\small\item\em tolerance for the solver \end{DoxyCompactList}\item +\Hypertarget{classPressureSolver_af3b02d29bf1b21ad8b7e6edf8c2f4e87}\label{classPressureSolver_af3b02d29bf1b21ad8b7e6edf8c2f4e87} +int {\bfseries maximum\+Number\+Of\+Iterations\+\_\+} +\begin{DoxyCompactList}\small\item\em maximum number of iterations \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Solves the Poisson problem for the pressure. + +Interface for the pressure solver. It computes the pressure field variable such that the continuity equation is fulfilled. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058}\label{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058} +\index{PressureSolver@{PressureSolver}!PressureSolver@{PressureSolver}} +\index{PressureSolver@{PressureSolver}!PressureSolver@{PressureSolver}} +\doxysubsubsection{\texorpdfstring{PressureSolver()}{PressureSolver()}} +{\footnotesize\ttfamily Pressure\+Solver\+::\+Pressure\+Solver (\begin{DoxyParamCaption}\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$}]{discretization, }\item[{double}]{epsilon, }\item[{int}]{maximum\+Number\+Of\+Iterations, }\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$}]{boundary }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em discretization} & instance of \doxylink{classDiscretization}{Discretization} holding the needed field variables for rhs and p \\ +\hline +{\em epsilon} & tolerance for the solver \\ +\hline +{\em maximum\+Number\+Of\+Iterations} & maximum of iteration \\ +\hline +{\em boundary} & object managing boundary for obstacle and surface tension \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classPressureSolver_a458c383fcacaf54c1a333a271049ca93}\label{classPressureSolver_a458c383fcacaf54c1a333a271049ca93} +\index{PressureSolver@{PressureSolver}!setBoundaryValues@{setBoundaryValues}} +\index{setBoundaryValues@{setBoundaryValues}!PressureSolver@{PressureSolver}} +\doxysubsubsection{\texorpdfstring{setBoundaryValues()}{setBoundaryValues()}} +{\footnotesize\ttfamily void Pressure\+Solver\+::set\+Boundary\+Values (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [protected]}} + + + +Set the \doxylink{classBoundary}{Boundary} Values. + +Account for homogenous Neuman BC Has to be called every iteration \Hypertarget{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0}\label{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0} +\index{PressureSolver@{PressureSolver}!solve@{solve}} +\index{solve@{solve}!PressureSolver@{PressureSolver}} +\doxysubsubsection{\texorpdfstring{solve()}{solve()}} +{\footnotesize\ttfamily virtual void Pressure\+Solver\+::solve (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}} + + + +virtual function that starts solver. + + + +Implemented in \mbox{\hyperlink{classGaussSeidel_a6f0eb0c6938a64f8ded186f88170a04b}{Gauss\+Seidel}}, and \mbox{\hyperlink{classSOR_a860992d85d8aacf114a3a02b5831f728}{SOR}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/solver/pressure\+\_\+solver.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/solver/pressure\+\_\+solver.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classSOR.eps b/documentation/latex/classSOR.eps new file mode 100644 index 00000000..3f4e542f --- /dev/null +++ b/documentation/latex/classSOR.eps @@ -0,0 +1,197 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 370.370361 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 1.350000 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 2 def +/cols 1 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(SOR) cw +(PressureSolver) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (SOR) 0.000000 0.000000 box + (PressureSolver) 0.000000 1.000000 box + +% ----- relations ----- + +solid +0 0.000000 0.000000 out +solid +1 0.000000 1.000000 in diff --git a/documentation/latex/classSOR.pdf b/documentation/latex/classSOR.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cab2ef5315e6baea89cc5545a64ebcb072005df1 GIT binary patch literal 4725 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 EFPsImf&c&j literal 0 HcmV?d00001 diff --git a/documentation/latex/classSOR.tex b/documentation/latex/classSOR.tex new file mode 100644 index 00000000..c881c325 --- /dev/null +++ b/documentation/latex/classSOR.tex @@ -0,0 +1,113 @@ +\doxysection{SOR Class Reference} +\hypertarget{classSOR}{}\label{classSOR}\index{SOR@{SOR}} + + +Successive over-\/relaxation solver. + + + + +{\ttfamily \#include $<$sor.\+h$>$} + +Inheritance diagram for SOR\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=2.000000cm]{classSOR} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classSOR_a357cfea8935f4b2dfee06f2d8e1461a8}{SOR}} (const std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ \&data, double epsilon, int maximum\+Number\+Of\+Iterations, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ boundary, double omega) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +void \mbox{\hyperlink{classSOR_a860992d85d8aacf114a3a02b5831f728}{solve}} () override +\begin{DoxyCompactList}\small\item\em override function that starts solver. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Public Member Functions inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058}{Pressure\+Solver}} (std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ discretization, double epsilon, int maximum\+Number\+Of\+Iterations, std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ boundary) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Additional Inherited Members} +\doxysubsection*{Public Attributes inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} +\begin{DoxyCompactItemize} +\item +double {\bfseries dx2} +\item +double {\bfseries dy2} +\begin{DoxyCompactList}\small\item\em squared mesh widths \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Protected Member Functions inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} +\begin{DoxyCompactItemize} +\item +void \mbox{\hyperlink{classPressureSolver_a458c383fcacaf54c1a333a271049ca93}{set\+Boundary\+Values}} () +\begin{DoxyCompactList}\small\item\em Set the \doxylink{classBoundary}{Boundary} Values. \end{DoxyCompactList}\item +double {\bfseries calculate\+Residuum} () +\begin{DoxyCompactList}\small\item\em calculate residuum of current time step \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsection*{Protected Attributes inherited from \mbox{\hyperlink{classPressureSolver}{Pressure\+Solver}}} +\begin{DoxyCompactItemize} +\item +int {\bfseries i\+\_\+beg} +\begin{DoxyCompactList}\small\item\em begin of loop for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries i\+\_\+end} +\begin{DoxyCompactList}\small\item\em end of loop for rhs in x direction \end{DoxyCompactList}\item +int {\bfseries j\+\_\+beg} +\begin{DoxyCompactList}\small\item\em begin of loop for rhs in y direction \end{DoxyCompactList}\item +int {\bfseries j\+\_\+end} +\begin{DoxyCompactList}\small\item\em end of loop for rhs in y direction \end{DoxyCompactList}\item +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ {\bfseries discretization\+\_\+} +\begin{DoxyCompactList}\small\item\em object holding the needed field variables for rhs and p \end{DoxyCompactList}\item +std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$ {\bfseries boundary\+\_\+} +\begin{DoxyCompactList}\small\item\em object managing boundary for obstacle and surface tension \end{DoxyCompactList}\item +double {\bfseries epsilon\+\_\+} +\begin{DoxyCompactList}\small\item\em tolerance for the solver \end{DoxyCompactList}\item +int {\bfseries maximum\+Number\+Of\+Iterations\+\_\+} +\begin{DoxyCompactList}\small\item\em maximum number of iterations \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Successive over-\/relaxation solver. + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classSOR_a357cfea8935f4b2dfee06f2d8e1461a8}\label{classSOR_a357cfea8935f4b2dfee06f2d8e1461a8} +\index{SOR@{SOR}!SOR@{SOR}} +\index{SOR@{SOR}!SOR@{SOR}} +\doxysubsubsection{\texorpdfstring{SOR()}{SOR()}} +{\footnotesize\ttfamily SOR\+::\+SOR (\begin{DoxyParamCaption}\item[{const std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classDiscretization}{Discretization}} $>$ \&}]{data, }\item[{double}]{epsilon, }\item[{int}]{maximum\+Number\+Of\+Iterations, }\item[{std\+::shared\+\_\+ptr$<$ \mbox{\hyperlink{classBoundary}{Boundary}} $>$}]{boundary, }\item[{double}]{omega }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em data} & instance of \doxylink{classDiscretization}{Discretization} holding the needed field variables for rhs and p \\ +\hline +{\em epsilon} & tolerance for the solver \\ +\hline +{\em maximum\+Number\+Of\+Iterations} & maximum of iteration \\ +\hline +{\em omega} & relaxation factor \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Function Documentation} +\Hypertarget{classSOR_a860992d85d8aacf114a3a02b5831f728}\label{classSOR_a860992d85d8aacf114a3a02b5831f728} +\index{SOR@{SOR}!solve@{solve}} +\index{solve@{solve}!SOR@{SOR}} +\doxysubsubsection{\texorpdfstring{solve()}{solve()}} +{\footnotesize\ttfamily void SOR\+::solve (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [override]}, {\ttfamily [virtual]}} + + + +override function that starts solver. + + + +Implements \mbox{\hyperlink{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0}{Pressure\+Solver}}. + + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/solver/sor.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/solver/sor.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/classStaggeredGrid.eps b/documentation/latex/classStaggeredGrid.eps new file mode 100644 index 00000000..67d46456 --- /dev/null +++ b/documentation/latex/classStaggeredGrid.eps @@ -0,0 +1,209 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: ClassName +%%Creator: Doxygen +%%CreationDate: Time +%%For: +%Magnification: 1.00 +%%Orientation: Portrait +%%BoundingBox: 0 0 500 236.220474 +%%Pages: 0 +%%BeginSetup +%%EndSetup +%%EndComments + +% ----- variables ----- + +/boxwidth 0 def +/boxheight 40 def +/fontheight 24 def +/marginwidth 10 def +/distx 20 def +/disty 40 def +/boundaspect 2.116667 def % aspect ratio of the BoundingBox (width/height) +/boundx 500 def +/boundy boundx boundaspect div def +/xspacing 0 def +/yspacing 0 def +/rows 3 def +/cols 2 def +/scalefactor 0 def +/boxfont /Times-Roman findfont fontheight scalefont def + +% ----- procedures ----- + +/dotted { [1 4] 0 setdash } def +/dashed { [5] 0 setdash } def +/solid { [] 0 setdash } def + +/max % result = MAX(arg1,arg2) +{ + /a exch def + /b exch def + a b gt {a} {b} ifelse +} def + +/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2) +{ + 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max +} def + +/cw % boxwidth = MAX(boxwidth, stringwidth(arg1)) +{ + /str exch def + /boxwidth boxwidth str stringwidth pop max def +} def + +/box % draws a box with text 'arg1' at grid pos (arg2,arg3) +{ gsave + 2 setlinewidth + newpath + exch xspacing mul xoffset add + exch yspacing mul + moveto + boxwidth 0 rlineto + 0 boxheight rlineto + boxwidth neg 0 rlineto + 0 boxheight neg rlineto + closepath + dup stringwidth pop neg boxwidth add 2 div + boxheight fontheight 2 div sub 2 div + rmoveto show stroke + grestore +} def + +/mark +{ newpath + exch xspacing mul xoffset add boxwidth add + exch yspacing mul + moveto + 0 boxheight 4 div rlineto + boxheight neg 4 div boxheight neg 4 div rlineto + closepath + eofill + stroke +} def + +/arrow +{ newpath + moveto + 3 -8 rlineto + -6 0 rlineto + 3 8 rlineto + closepath + eofill + stroke +} def + +/out % draws an output connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight add + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/in % draws an input connector for the block at (arg1,arg2) +{ + newpath + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul disty 2 div sub + /y exch def + /x exch def + x y moveto + 0 disty 2 div rlineto + stroke + 1 eq { x y disty 2 div add arrow } if +} def + +/hedge +{ + exch xspacing mul xoffset add boxwidth 2 div add + exch yspacing mul boxheight 2 div sub + /y exch def + /x exch def + newpath + x y moveto + boxwidth 2 div distx add 0 rlineto + stroke + 1 eq + { newpath x boxwidth 2 div distx add add y moveto + -8 3 rlineto + 0 -6 rlineto + 8 3 rlineto + closepath + eofill + stroke + } if +} def + +/vedge +{ + /ye exch def + /ys exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add dup + ys yspacing mul boxheight 2 div sub + moveto + ye yspacing mul boxheight 2 div sub + lineto + stroke +} def + +/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3' +{ + /ys exch def + /xe exch def + /xs exch def + newpath + xs xspacing mul xoffset add boxwidth 2 div add + ys yspacing mul disty 2 div sub + moveto + xspacing xe xs sub mul 0 + rlineto + stroke +} def + +% ----- main ------ + +boxfont setfont +1 boundaspect scale +(StaggeredGrid) cw +(Discretization) cw +(CentralDifferences) cw +(DonorCell) cw +/boxwidth boxwidth marginwidth 2 mul add def +/xspacing boxwidth distx add def +/yspacing boxheight disty add def +/scalefactor + boxwidth cols mul distx cols 1 sub mul add + boxheight rows mul disty rows 1 sub mul add boundaspect mul + max def +boundx scalefactor div boundy scalefactor div scale + +% ----- classes ----- + + (StaggeredGrid) 0.500000 2.000000 box + (Discretization) 0.500000 1.000000 box + (CentralDifferences) 0.000000 0.000000 box + (DonorCell) 1.000000 0.000000 box + +% ----- relations ----- + +solid +1 0.500000 1.250000 out +solid +0 0.500000 1.750000 in +solid +1 0.500000 0.250000 out +solid +0.000000 1.000000 1.000000 conn +solid +0 0.000000 0.750000 in +solid +0 1.000000 0.750000 in diff --git a/documentation/latex/classStaggeredGrid.pdf b/documentation/latex/classStaggeredGrid.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8b7124591c1c1d8af58be90d318f99c009b9d5b9 GIT binary patch literal 5761 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 BjI00v literal 0 HcmV?d00001 diff --git a/documentation/latex/classStaggeredGrid.tex b/documentation/latex/classStaggeredGrid.tex new file mode 100644 index 00000000..00141d27 --- /dev/null +++ b/documentation/latex/classStaggeredGrid.tex @@ -0,0 +1,203 @@ +\doxysection{Staggered\+Grid Class Reference} +\hypertarget{classStaggeredGrid}{}\label{classStaggeredGrid}\index{StaggeredGrid@{StaggeredGrid}} + + +Create field variables and define limits for the indices. + + + + +{\ttfamily \#include $<$staggered\+\_\+grid.\+h$>$} + +Inheritance diagram for Staggered\+Grid\+:\begin{figure}[H] +\begin{center} +\leavevmode +\includegraphics[height=3.000000cm]{classStaggeredGrid} +\end{center} +\end{figure} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +\mbox{\hyperlink{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}{Staggered\+Grid}} (std\+::array$<$ int, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{n\+Cells}}, std\+::array$<$ double, 2 $>$ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{mesh\+Width}}) +\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}\label{classStaggeredGrid_a330856d4efe952771daf0753ef84068e} +const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width} () const +\begin{DoxyCompactList}\small\item\em Get the length of a single cell in x and y directions. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}\label{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf} +const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells} () const +\begin{DoxyCompactList}\small\item\em Get number of cells in x and y directions. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a87cee12621c641ab143a8b1a61b2ef7e}\label{classStaggeredGrid_a87cee12621c641ab143a8b1a61b2ef7e} +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries u} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable u. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a26e478abba632554652c9e05a279d1ca}\label{classStaggeredGrid_a26e478abba632554652c9e05a279d1ca} +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries v} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable v. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_aafe6e0bb3509f6aad272b94f74e7ffec}\label{classStaggeredGrid_aafe6e0bb3509f6aad272b94f74e7ffec} +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries p} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable p. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a3f36422a02b9b18d1577d61e406f08cf}\label{classStaggeredGrid_a3f36422a02b9b18d1577d61e406f08cf} +const \mbox{\hyperlink{classFieldVariable}{Field\+Variable}} \& {\bfseries rhs} () const +\begin{DoxyCompactList}\small\item\em Get a reference to the field variable rhs. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a0324ce4d1fe2343d8aa9514e460cc556}\label{classStaggeredGrid_a0324ce4d1fe2343d8aa9514e460cc556} +double {\bfseries u} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j), declared constant. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a0ed62d6752b6b2b3ead5f654b515cd12}\label{classStaggeredGrid_a0ed62d6752b6b2b3ead5f654b515cd12} +double \& {\bfseries u} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of u in element (i,j) \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_ac052d8803ff950aee04b86ac026c516b}\label{classStaggeredGrid_ac052d8803ff950aee04b86ac026c516b} +double {\bfseries v} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j), declared constant. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a7746f703f32c2f20a4c77246eebac697}\label{classStaggeredGrid_a7746f703f32c2f20a4c77246eebac697} +double \& {\bfseries v} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of v in element (i,j) \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_aa6a5d99d9b4fbd9bd9cfa6ec071918f9}\label{classStaggeredGrid_aa6a5d99d9b4fbd9bd9cfa6ec071918f9} +double {\bfseries p} (int i, int j) const +\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j), declared constant. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_aa09a4ca67141589bae153797fbc4f3c5}\label{classStaggeredGrid_aa09a4ca67141589bae153797fbc4f3c5} +double \& {\bfseries p} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of p in element (i,j) \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_adb05c59512dc8993367e4beddba05785}\label{classStaggeredGrid_adb05c59512dc8993367e4beddba05785} +double \& {\bfseries f} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of f in element (i,j) \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_aaf849bec40f7fa7c68823038f0877341}\label{classStaggeredGrid_aaf849bec40f7fa7c68823038f0877341} +double \& {\bfseries g} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of g in element (i,j) \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a761ea51f1e8fd1290b3adfe09942b0d3}\label{classStaggeredGrid_a761ea51f1e8fd1290b3adfe09942b0d3} +double \& {\bfseries rhs} (int i, int j) +\begin{DoxyCompactList}\small\item\em Access value of rhs in element (i,j) \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_aec8490affea703cdd73b1febaed68968}\label{classStaggeredGrid_aec8490affea703cdd73b1febaed68968} +double {\bfseries dx} () const +\begin{DoxyCompactList}\small\item\em Get the mesh width in x-\/direction. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_abde2da10e0c130fb0f206de64c9b4956}\label{classStaggeredGrid_abde2da10e0c130fb0f206de64c9b4956} +double {\bfseries dy} () const +\begin{DoxyCompactList}\small\item\em Get the mesh width in y-\/direction. \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a31e2d3a0b6e03685380810a7c2f323e1}\label{classStaggeredGrid_a31e2d3a0b6e03685380810a7c2f323e1} +int {\bfseries u\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for u in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a641e473d72e1d02ba3de1c16e9d0d332}\label{classStaggeredGrid_a641e473d72e1d02ba3de1c16e9d0d332} +int {\bfseries u\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for u in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a9b0e97704e1871441a8e713ecaa2cff5}\label{classStaggeredGrid_a9b0e97704e1871441a8e713ecaa2cff5} +int {\bfseries u\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for u in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a3393aa91b17054d2d700de308ae25632}\label{classStaggeredGrid_a3393aa91b17054d2d700de308ae25632} +int {\bfseries u\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for u in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_ace7bf8cb1d279131739d5d12de302d09}\label{classStaggeredGrid_ace7bf8cb1d279131739d5d12de302d09} +int {\bfseries v\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for v in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_aa5a44aa088b5a7923fa952af1ecb5778}\label{classStaggeredGrid_aa5a44aa088b5a7923fa952af1ecb5778} +int {\bfseries v\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for v in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a7f8468d672411c0e3a5eeb67788fc826}\label{classStaggeredGrid_a7f8468d672411c0e3a5eeb67788fc826} +int {\bfseries v\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for v in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_ab67e8d9d8d76d34fb02d4d644f0b3795}\label{classStaggeredGrid_ab67e8d9d8d76d34fb02d4d644f0b3795} +int {\bfseries v\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for v in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a9922c955707f2a31a4a27d1d696f002e}\label{classStaggeredGrid_a9922c955707f2a31a4a27d1d696f002e} +int {\bfseries p\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for p in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a34f16fdf87971fe84ffc3c84722bb2c7}\label{classStaggeredGrid_a34f16fdf87971fe84ffc3c84722bb2c7} +int {\bfseries p\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for p in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_ae4c9ba16c5635dc1ffaa264fbcc3e034}\label{classStaggeredGrid_ae4c9ba16c5635dc1ffaa264fbcc3e034} +int {\bfseries p\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for p in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_ad9928ee522eedb7d7fd48ca0b92f2795}\label{classStaggeredGrid_ad9928ee522eedb7d7fd48ca0b92f2795} +int {\bfseries p\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for p in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a5cc368f9ede58a3cb689705df998f750}\label{classStaggeredGrid_a5cc368f9ede58a3cb689705df998f750} +int {\bfseries f\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for f in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a8162b849231354ba73aacb085b5cd665}\label{classStaggeredGrid_a8162b849231354ba73aacb085b5cd665} +int {\bfseries f\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for f in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_ab92aca90331200d0cc7bc0c0a857b4ef}\label{classStaggeredGrid_ab92aca90331200d0cc7bc0c0a857b4ef} +int {\bfseries f\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for f in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a7ac43ac86231987bc0bf6565589d52e1}\label{classStaggeredGrid_a7ac43ac86231987bc0bf6565589d52e1} +int {\bfseries f\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for f in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a061fb6d6948cdc3054171dd60842a8c3}\label{classStaggeredGrid_a061fb6d6948cdc3054171dd60842a8c3} +int {\bfseries g\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for g in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_aebc76693e5dd61db521d6763236bf664}\label{classStaggeredGrid_aebc76693e5dd61db521d6763236bf664} +int {\bfseries g\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for g in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a18ca3a121787b19c18886b0945aca2e3}\label{classStaggeredGrid_a18ca3a121787b19c18886b0945aca2e3} +int {\bfseries g\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for g in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a7a29456e1bce9efffa27de0b41957b50}\label{classStaggeredGrid_a7a29456e1bce9efffa27de0b41957b50} +int {\bfseries g\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for g in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_ad5c16b00d9dbf0f115e1ded81203edce}\label{classStaggeredGrid_ad5c16b00d9dbf0f115e1ded81203edce} +int {\bfseries rhs\+IBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for rhs in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_ae11e8842fdd508b914dc8f24b09b36a9}\label{classStaggeredGrid_ae11e8842fdd508b914dc8f24b09b36a9} +int {\bfseries rhs\+IEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in x direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a28c36939e3d3cc8df76e7aa91f0e0804}\label{classStaggeredGrid_a28c36939e3d3cc8df76e7aa91f0e0804} +int {\bfseries rhs\+JBegin} () const +\begin{DoxyCompactList}\small\item\em first valid index for rhs in y direction \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a953ec890a986473bffe87ea26dfcd782}\label{classStaggeredGrid_a953ec890a986473bffe87ea26dfcd782} +int {\bfseries rhs\+JEnd} () const +\begin{DoxyCompactList}\small\item\em one after last valid index for rhs in y direction \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Protected Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{classStaggeredGrid_acacffb5739539d9015c986080bb5ed44}\label{classStaggeredGrid_acacffb5739539d9015c986080bb5ed44} +const std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells\+\_\+} +\begin{DoxyCompactList}\small\item\em array containing number of cells in x and y directions \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a9603c3334440aab082dda48947e5ce6e}\label{classStaggeredGrid_a9603c3334440aab082dda48947e5ce6e} +const std\+::array$<$ double, 2 $>$ {\bfseries mesh\+Width\+\_\+} +\begin{DoxyCompactList}\small\item\em array containing the sizes of cell edges in x and y directions \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_adcef36b4ce8cc6843a2b6f603b62c763}\label{classStaggeredGrid_adcef36b4ce8cc6843a2b6f603b62c763} +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries u\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable u \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a20ec43568fe937b194561e21a0b84ad9}\label{classStaggeredGrid_a20ec43568fe937b194561e21a0b84ad9} +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries v\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable v \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a2ea3c93dd401ac06461ade9a74e76459}\label{classStaggeredGrid_a2ea3c93dd401ac06461ade9a74e76459} +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries p\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable p \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a94933ac0c6e0d2a794f46c7a97d72f75}\label{classStaggeredGrid_a94933ac0c6e0d2a794f46c7a97d72f75} +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries f\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable f \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a5f5c88f603d4e503cba4c44ed43de46a}\label{classStaggeredGrid_a5f5c88f603d4e503cba4c44ed43de46a} +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries g\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable g \end{DoxyCompactList}\item +\Hypertarget{classStaggeredGrid_a496206955162452a0629a7742fe92a84}\label{classStaggeredGrid_a496206955162452a0629a7742fe92a84} +\mbox{\hyperlink{classFieldVariable}{Field\+Variable}} {\bfseries rhs\+\_\+} +\begin{DoxyCompactList}\small\item\em instance of the field variable rhs \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Create field variables and define limits for the indices. + +Create the necessary u, v, p, f, g, rhs field variables and define the first valid index for each of the field variables, as well as the (one after) last valid index + +\doxysubsection{Constructor \& Destructor Documentation} +\Hypertarget{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}\label{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1} +\index{StaggeredGrid@{StaggeredGrid}!StaggeredGrid@{StaggeredGrid}} +\index{StaggeredGrid@{StaggeredGrid}!StaggeredGrid@{StaggeredGrid}} +\doxysubsubsection{\texorpdfstring{StaggeredGrid()}{StaggeredGrid()}} +{\footnotesize\ttfamily Staggered\+Grid\+::\+Staggered\+Grid (\begin{DoxyParamCaption}\item[{std\+::array$<$ int, 2 $>$}]{n\+Cells, }\item[{std\+::array$<$ double, 2 $>$}]{mesh\+Width }\end{DoxyParamCaption})} + + + +Constructor. + + +\begin{DoxyParams}{Parameters} +{\em n\+Cells} & array containing number of cells in x and y directions \\ +\hline +{\em mesh\+Width} & array containing the length of a single cell in x and y directions \\ +\hline +\end{DoxyParams} + + +The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/discretization/staggered\+\_\+grid.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/discretization/staggered\+\_\+grid.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/computation_8h_source.tex b/documentation/latex/computation_8h_source.tex new file mode 100644 index 00000000..67652684 --- /dev/null +++ b/documentation/latex/computation_8h_source.tex @@ -0,0 +1,90 @@ +\doxysection{computation.\+h} +\hypertarget{computation_8h_source}{}\label{computation_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/computation.h@{/home/jonat/Documents/01\_Studium/NumSim/src/computation.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}discretization/discretization.h"{}}} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ "{}discretization/donor\_cell.h"{}}} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ "{}discretization/central\_differences.h"{}}} +\DoxyCodeLine{00006\ } +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ "{}solver/pressure\_solver.h"{}}} +\DoxyCodeLine{00008\ \textcolor{preprocessor}{\#include\ "{}solver/sor.h"{}}} +\DoxyCodeLine{00009\ \textcolor{preprocessor}{\#include\ "{}solver/gauss\_seidel.h"{}}} +\DoxyCodeLine{00010\ } +\DoxyCodeLine{00011\ \textcolor{preprocessor}{\#include\ "{}output\_writer/output\_writer\_paraview.h"{}}} +\DoxyCodeLine{00012\ \textcolor{preprocessor}{\#include\ "{}output\_writer/output\_writer\_text.h"{}}} +\DoxyCodeLine{00013\ \textcolor{preprocessor}{\#include\ "{}settings\_parser/settings.h"{}}} +\DoxyCodeLine{00014\ } +\DoxyCodeLine{00015\ \textcolor{preprocessor}{\#include\ "{}boundary/boundary.h"{}}} +\DoxyCodeLine{00016\ \textcolor{preprocessor}{\#include\ "{}boundary/mask.h"{}}} +\DoxyCodeLine{00017\ \textcolor{preprocessor}{\#include\ "{}surface/fluid\_tracer.h"{}}} +\DoxyCodeLine{00018\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00019\ } +\DoxyCodeLine{00020\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00021\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00022\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00023\ } + + + + + +\DoxyCodeLine{00030\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classComputation}{Computation}}} +\DoxyCodeLine{00031\ \{} +\DoxyCodeLine{00032\ \textcolor{keyword}{public}:} + + + + + +\DoxyCodeLine{00039\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classComputation_a4a344479797b15bd5c9ed2f262657339}{initialize}}(\textcolor{keywordtype}{int}\ argc,\ \textcolor{keywordtype}{char}\ *argv[]);} +\DoxyCodeLine{00040\ } + + + +\DoxyCodeLine{00045\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classComputation_ad20ce6e82ec9a918e6ac03840bc688d5}{runSimulation}}();} +\DoxyCodeLine{00046\ } +\DoxyCodeLine{00047\ \textcolor{keyword}{private}:} + + + + +\DoxyCodeLine{00053\ \ \ \ \ \textcolor{keywordtype}{void}\ computeTimeStepWidth(\textcolor{keywordtype}{double}\ currentTime);} +\DoxyCodeLine{00054\ } + + +\DoxyCodeLine{00058\ \ \ \ \ \textcolor{keywordtype}{void}\ applyBoundaryValues();} +\DoxyCodeLine{00059\ } + + +\DoxyCodeLine{00063\ \ \ \ \ \textcolor{keywordtype}{void}\ computePreliminaryVelocities();} +\DoxyCodeLine{00064\ } + + +\DoxyCodeLine{00068\ \ \ \ \ \textcolor{keywordtype}{void}\ computeRightHandSide();} +\DoxyCodeLine{00069\ } + + +\DoxyCodeLine{00073\ \ \ \ \ \textcolor{keywordtype}{void}\ computePressure();} +\DoxyCodeLine{00074\ } + + + +\DoxyCodeLine{00079\ \ \ \ \ \textcolor{keywordtype}{void}\ computeVelocities();} +\DoxyCodeLine{00080\ } +\DoxyCodeLine{00081\ \ \ \ \ \mbox{\hyperlink{structSettings}{Settings}}\ settings\_;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00082\ \ \ \ \ std::shared\_ptr\ discretization\_;\ } +\DoxyCodeLine{00083\ } +\DoxyCodeLine{00084\ \ \ \ \ std::shared\_ptr\ mask\_;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00085\ \ \ \ \ std::shared\_ptr\ boundary\_;\ \ \ \ \ \ \ } +\DoxyCodeLine{00086\ \ \ \ \ std::shared\_ptr\ fluidTracer\_;\ } +\DoxyCodeLine{00087\ } +\DoxyCodeLine{00088\ \ \ \ \ std::unique\_ptr\ pressureSolver\_;\ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00089\ \ \ \ \ std::unique\_ptr\ outputWriterParaview\_;\ } +\DoxyCodeLine{00090\ \ \ \ \ std::unique\_ptr\ outputWriterText\_;\ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00091\ \ \ \ \ std::array\ meshWidth\_;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00092\ \ \ \ \ \textcolor{keywordtype}{double}\ dt\_;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00093\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/discretization_8h_source.tex b/documentation/latex/discretization_8h_source.tex new file mode 100644 index 00000000..f34c7087 --- /dev/null +++ b/documentation/latex/discretization_8h_source.tex @@ -0,0 +1,66 @@ +\doxysection{discretization.\+h} +\hypertarget{discretization_8h_source}{}\label{discretization_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/discretization/discretization.h@{/home/jonat/Documents/01\_Studium/NumSim/src/discretization/discretization.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ "{}staggered\_grid.h"{}}} +\DoxyCodeLine{00006\ } + + + + + + + +\DoxyCodeLine{00015\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classDiscretization}{Discretization}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classStaggeredGrid}{StaggeredGrid}}} +\DoxyCodeLine{00016\ \{} +\DoxyCodeLine{00017\ \textcolor{keyword}{public}:} + + + + + +\DoxyCodeLine{00024\ \ \ \ \ \mbox{\hyperlink{classDiscretization_a4fb8cc9823938e7c2dec329b906a462c}{Discretization}}(std::array\ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{nCells}},\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{meshWidth}});} +\DoxyCodeLine{00025\ } + + +\DoxyCodeLine{00029\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_acca6bf193e0e91f645d292527299254b}{computeDu2Dx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const}\ =\ 0;} + + +\DoxyCodeLine{00033\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a69ba136ab7f8c09d805afca159cab428}{computeDv2Dy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const}\ =\ 0;} +\DoxyCodeLine{00034\ } + + +\DoxyCodeLine{00038\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_ab1c2aa237e13e7c4c9edd429de656795}{computeDuvDx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const}\ =\ 0;} + + +\DoxyCodeLine{00042\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a0bab86aef10a72e01b4f8102a3c91f84}{computeDuvDy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const}\ =\ 0;} +\DoxyCodeLine{00043\ } + + +\DoxyCodeLine{00047\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a6986501b0b5c96699ff3ac843c1a6ca2}{computeD2uDx2}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00051\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a446aabc55a9fb4b5cb2f476babc532f9}{computeD2uDy2}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00055\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a5119047788a34eadf37480e913bdc8ea}{computeD2vDx2}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00059\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a56678582a049b1b141621e41afff1438}{computeD2vDy2}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00060\ } + + +\DoxyCodeLine{00064\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_aed3ad75ad6e647d14f118a12652c01b2}{computeDpDx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00068\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDiscretization_a859f4dc33f0ea91f5e6537be09ce4999}{computeDpDy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00069\ } +\DoxyCodeLine{00070\ } +\DoxyCodeLine{00071\ \};} +\DoxyCodeLine{00072\ } + +\end{DoxyCode} diff --git a/documentation/latex/donor__cell_8h_source.tex b/documentation/latex/donor__cell_8h_source.tex new file mode 100644 index 00000000..2f3f8718 --- /dev/null +++ b/documentation/latex/donor__cell_8h_source.tex @@ -0,0 +1,50 @@ +\doxysection{donor\+\_\+cell.\+h} +\hypertarget{donor__cell_8h_source}{}\label{donor__cell_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/discretization/donor\_cell.h@{/home/jonat/Documents/01\_Studium/NumSim/src/discretization/donor\_cell.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ "{}discretization.h"{}}} +\DoxyCodeLine{00007\ } + + + + + + +\DoxyCodeLine{00015\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classDonorCell}{DonorCell}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classDiscretization}{Discretization}}} +\DoxyCodeLine{00016\ \{} +\DoxyCodeLine{00017\ \textcolor{keyword}{public}:} + + + + + + +\DoxyCodeLine{00025\ \ \ \ \ \mbox{\hyperlink{classDonorCell_a4896ad035a5ac50c85e2b66d442a5312}{DonorCell}}(std::array\ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{nCells}},\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{meshWidth}},\ \textcolor{keywordtype}{double}\ alpha);} +\DoxyCodeLine{00026\ } + + + +\DoxyCodeLine{00031\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDonorCell_a265bdaf46ed8ba46a42ef0cb03807175}{computeDu2Dx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} + + + +\DoxyCodeLine{00036\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDonorCell_a01dcfb7fcf356d5ee412107a30c26fb3}{computeDv2Dy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} + + + +\DoxyCodeLine{00041\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDonorCell_ae41b5f85743ca7f148bd829561bd9cb5}{computeDuvDx}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} + + + +\DoxyCodeLine{00046\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classDonorCell_a285562312f08efde26afd160174d2843}{computeDuvDy}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const\ override};} +\DoxyCodeLine{00047\ } +\DoxyCodeLine{00048\ \textcolor{keyword}{private}:} +\DoxyCodeLine{00049\ \ \ \ \ \textcolor{keyword}{const}\ \textcolor{keywordtype}{double}\ alpha\_;\ } +\DoxyCodeLine{00050\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/doxygen.sty b/documentation/latex/doxygen.sty new file mode 100644 index 00000000..4bfc17fa --- /dev/null +++ b/documentation/latex/doxygen.sty @@ -0,0 +1,694 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{doxygen} + +% Packages used by this style file +\RequirePackage{alltt} +%%\RequirePackage{array} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package +\RequirePackage{calc} +\RequirePackage{float} +%%\RequirePackage{ifthen} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package +\RequirePackage{verbatim} +\RequirePackage[table]{xcolor} +\RequirePackage{longtable_doxygen} +\RequirePackage{tabu_doxygen} +\RequirePackage{fancyvrb} +\RequirePackage{tabularx} +\RequirePackage{multicol} +\RequirePackage{multirow} +\RequirePackage{hanging} +\RequirePackage{ifpdf} +\RequirePackage{adjustbox} +\RequirePackage{amssymb} +\RequirePackage{stackengine} +\RequirePackage{enumitem} +\RequirePackage{alphalph} +\RequirePackage[normalem]{ulem} % for strikeout, but don't modify emphasis + +%---------- Internal commands used in this style file ---------------- + +\newcommand{\ensurespace}[1]{% + \begingroup% + \setlength{\dimen@}{#1}% + \vskip\z@\@plus\dimen@% + \penalty -100\vskip\z@\@plus -\dimen@% + \vskip\dimen@% + \penalty 9999% + \vskip -\dimen@% + \vskip\z@skip% hide the previous |\vskip| from |\addvspace| + \endgroup% +} + +\newcommand{\DoxyHorRuler}[1]{% + \setlength{\parskip}{0ex plus 0ex minus 0ex}% + \ifthenelse{#1=0}% + {% + \hrule% + }% + {% + \hrulefilll% + }% +} +\newcommand{\DoxyLabelFont}{} +\newcommand{\entrylabel}[1]{% + {% + \parbox[b]{\labelwidth-4pt}{% + \makebox[0pt][l]{\DoxyLabelFont#1}% + \vspace{1.5\baselineskip}% + }% + }% +} + +\newenvironment{DoxyDesc}[1]{% + \ensurespace{4\baselineskip}% + \begin{list}{}{% + \settowidth{\labelwidth}{20pt}% + %\setlength{\parsep}{0pt}% + \setlength{\itemsep}{0pt}% + \setlength{\leftmargin}{\labelwidth+\labelsep}% + \renewcommand{\makelabel}{\entrylabel}% + }% + \item[#1]% +}{% + \end{list}% +} + +\newsavebox{\xrefbox} +\newlength{\xreflength} +\newcommand{\xreflabel}[1]{% + \sbox{\xrefbox}{#1}% + \setlength{\xreflength}{\wd\xrefbox}% + \ifthenelse{\xreflength>\labelwidth}{% + \begin{minipage}{\textwidth}% + \setlength{\parindent}{0pt}% + \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}% + \end{minipage}% + }{% + \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}% + }% +} + +%---------- Commands used by doxygen LaTeX output generator ---------- + +% Used by
     ... 
    +\newenvironment{DoxyPre}{% + \small% + \begin{alltt}% +}{% + \end{alltt}% + \normalsize% +} +% Necessary for redefining not defined characters, i.e. "Replacement Character" in tex output. +\newlength{\CodeWidthChar} +\newlength{\CodeHeightChar} +\settowidth{\CodeWidthChar}{?} +\settoheight{\CodeHeightChar}{?} +% Necessary for hanging indent +\newlength{\DoxyCodeWidth} + +\newcommand\DoxyCodeLine[1]{ + \ifthenelse{\equal{\detokenize{#1}}{}} + { + \vspace*{\baselineskip} + } + { + \hangpara{\DoxyCodeWidth}{1}{#1}\par + } +} + +\newcommand\NiceSpace{% + \discretionary{}{\kern\fontdimen2\font}{\kern\fontdimen2\font}% +} + +% Used by @code ... @endcode +\newenvironment{DoxyCode}[1]{% + \par% + \scriptsize% + \normalfont\ttfamily% + \rightskip0pt plus 1fil% + \settowidth{\DoxyCodeWidth}{000000}% + \settowidth{\CodeWidthChar}{?}% + \settoheight{\CodeHeightChar}{?}% + \setlength{\parskip}{0ex plus 0ex minus 0ex}% + \ifthenelse{\equal{#1}{0}} + { + {\lccode`~32 \lowercase{\global\let~}\NiceSpace}\obeyspaces% + } + { + {\lccode`~32 \lowercase{\global\let~}}\obeyspaces% + } + +}{% + \normalfont% + \normalsize% + \settowidth{\CodeWidthChar}{?}% + \settoheight{\CodeHeightChar}{?}% +} + +% Redefining not defined characters, i.e. "Replacement Character" in tex output. +\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{% + \textcolor{white}{\sffamily\bfseries\small ?}}{% + \rotatebox{45}{$\blacksquare$}}}} + +% Used by @example, @include, @includelineno and @dontinclude +\newenvironment{DoxyCodeInclude}[1]{% + \DoxyCode{#1}% +}{% + \endDoxyCode% +} + +% Used by @verbatim ... @endverbatim +\newenvironment{DoxyVerb}{% + \par% + \footnotesize% + \verbatim% +}{% + \endverbatim% + \normalsize% +} + +% Used by @verbinclude +\newenvironment{DoxyVerbInclude}{% + \DoxyVerb% +}{% + \endDoxyVerb% +} + +% Used by numbered lists (using '-#' or
      ...
    ) +\setlistdepth{12} +\newlist{DoxyEnumerate}{enumerate}{12} +\setlist[DoxyEnumerate,1]{label=\arabic*.} +\setlist[DoxyEnumerate,2]{label=(\enumalphalphcnt*)} +\setlist[DoxyEnumerate,3]{label=\roman*.} +\setlist[DoxyEnumerate,4]{label=\enumAlphAlphcnt*.} +\setlist[DoxyEnumerate,5]{label=\arabic*.} +\setlist[DoxyEnumerate,6]{label=(\enumalphalphcnt*)} +\setlist[DoxyEnumerate,7]{label=\roman*.} +\setlist[DoxyEnumerate,8]{label=\enumAlphAlphcnt*.} +\setlist[DoxyEnumerate,9]{label=\arabic*.} +\setlist[DoxyEnumerate,10]{label=(\enumalphalphcnt*)} +\setlist[DoxyEnumerate,11]{label=\roman*.} +\setlist[DoxyEnumerate,12]{label=\enumAlphAlphcnt*.} + +% Used by bullet lists (using '-', @li, @arg, or
      ...
    ) +\setlistdepth{12} +\newlist{DoxyItemize}{itemize}{12} +\setlist[DoxyItemize]{label=\textperiodcentered} + +\setlist[DoxyItemize,1]{label=\textbullet} +\setlist[DoxyItemize,2]{label=\normalfont\bfseries \textendash} +\setlist[DoxyItemize,3]{label=\textasteriskcentered} +\setlist[DoxyItemize,4]{label=\textperiodcentered} + +% Used by description lists (using
    ...
    ) +\newenvironment{DoxyDescription}{% + \description% +}{% + \enddescription% +} + +% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc +% (only if caption is specified) +\newenvironment{DoxyImage}{% + \begin{figure}[H]% + \centering% +}{% + \end{figure}% +} + +% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc +% (only if no caption is specified) +\newenvironment{DoxyImageNoCaption}{% + \begin{center}% +}{% + \end{center}% +} + +% Used by @image +% (only if inline is specified) +\newenvironment{DoxyInlineImage}{% +}{% +} + +% Used by @attention +\newenvironment{DoxyAttention}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @author and @authors +\newenvironment{DoxyAuthor}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @date +\newenvironment{DoxyDate}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @invariant +\newenvironment{DoxyInvariant}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @note +\newenvironment{DoxyNote}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @post +\newenvironment{DoxyPostcond}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @pre +\newenvironment{DoxyPrecond}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @copyright +\newenvironment{DoxyCopyright}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @remark +\newenvironment{DoxyRemark}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @return and @returns +\newenvironment{DoxyReturn}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @since +\newenvironment{DoxySince}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @see +\newenvironment{DoxySeeAlso}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @version +\newenvironment{DoxyVersion}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @warning +\newenvironment{DoxyWarning}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by @par and @paragraph +\newenvironment{DoxyParagraph}[1]{% + \begin{DoxyDesc}{#1}% +}{% + \end{DoxyDesc}% +} + +% Used by parameter lists +\newenvironment{DoxyParams}[2][]{% + \tabulinesep=1mm% + \par% + \ifthenelse{\equal{#1}{}}% + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description + {\ifthenelse{\equal{#1}{1}}% + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc + {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc + } + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for fields of simple structs +\newenvironment{DoxyFields}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}% + \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for fields simple class style enums +\newenvironment{DoxyEnumFields}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for parameters within a detailed function description +\newenvironment{DoxyParamCaption}{% + \renewcommand{\item}[2][]{\\ \hspace*{2.0cm} ##1 {\em ##2}}% +}{% +} + +% Used by return value lists +\newenvironment{DoxyRetVals}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used by exception lists +\newenvironment{DoxyExceptions}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used by template parameter lists +\newenvironment{DoxyTemplParams}[1]{% + \tabulinesep=1mm% + \par% + \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endfirsthead% + \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]% + \hline% + \endhead% +}{% + \end{longtabu*}% + \vspace{6pt}% +} + +% Used for member lists +\newenvironment{DoxyCompactItemize}{% + \begin{itemize}% + \setlength{\itemsep}{-3pt}% + \setlength{\parsep}{0pt}% + \setlength{\topsep}{0pt}% + \setlength{\partopsep}{0pt}% +}{% + \end{itemize}% +} + +% Used for member descriptions +\newenvironment{DoxyCompactList}{% + \begin{list}{}{% + \setlength{\leftmargin}{0.5cm}% + \setlength{\itemsep}{0pt}% + \setlength{\parsep}{0pt}% + \setlength{\topsep}{0pt}% + \renewcommand{\makelabel}{\hfill}% + }% +}{% + \end{list}% +} + +% Used for reference lists (@bug, @deprecated, @todo, etc.) +\newenvironment{DoxyRefList}{% + \begin{list}{}{% + \setlength{\labelwidth}{10pt}% + \setlength{\leftmargin}{\labelwidth}% + \addtolength{\leftmargin}{\labelsep}% + \renewcommand{\makelabel}{\xreflabel}% + }% +}{% + \end{list}% +} + +% Used by @bug, @deprecated, @todo, etc. +\newenvironment{DoxyRefDesc}[1]{% + \begin{list}{}{% + \renewcommand\makelabel[1]{\textbf{##1}}% + \settowidth\labelwidth{\makelabel{#1}}% + \setlength\leftmargin{\labelwidth+\labelsep}% + }% +}{% + \end{list}% +} + +% Used by parameter lists and simple sections +\newenvironment{Desc} +{\begin{list}{}{% + \settowidth{\labelwidth}{20pt}% + \setlength{\parsep}{0pt}% + \setlength{\itemsep}{0pt}% + \setlength{\leftmargin}{\labelwidth+\labelsep}% + \renewcommand{\makelabel}{\entrylabel}% + } +}{% + \end{list}% +} + +% Used by tables +\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}% +\newenvironment{TabularC}[1]% +{\tabulinesep=1mm +\begin{longtabu*}spread 0pt [c]{*#1{|X[-1]}|}}% +{\end{longtabu*}\par}% + +\newenvironment{TabularNC}[1]% +{\begin{tabu}spread 0pt [l]{*#1{|X[-1]}|}}% +{\end{tabu}\par}% + +% Used for member group headers +\newenvironment{Indent}{% + \begin{list}{}{% + \setlength{\leftmargin}{0.5cm}% + }% + \item[]\ignorespaces% +}{% + \unskip% + \end{list}% +} + +% Used when hyperlinks are turned on +\newcommand{\doxylink}[2]{% + \mbox{\hyperlink{#1}{#2}}% +} + +% Used when hyperlinks are turned on +% Third argument is the SectionType, see the doxygen internal +% documentation for the values (relevant: Page ... Subsubsection). +\newcommand{\doxysectlink}[3]{% + \mbox{\hyperlink{#1}{#2}}% +} +% Used when hyperlinks are turned off +\newcommand{\doxyref}[3]{% + \textbf{#1} (\textnormal{#2}\,\pageref{#3})% +} + +% Used when hyperlinks are turned off +% Fourth argument is the SectionType, see the doxygen internal +% documentation for the values (relevant: Page ... Subsubsection). +\newcommand{\doxysectref}[4]{% + \textbf{#1} (\textnormal{#2}\,\pageref{#3})% +} + +% Used to link to a table when hyperlinks are turned on +\newcommand{\doxytablelink}[2]{% + \ref{#1}% +} + +% Used to link to a table when hyperlinks are turned off +\newcommand{\doxytableref}[3]{% + \ref{#3}% +} + +% Used by @addindex +\newcommand{\lcurly}{\{} +\newcommand{\rcurly}{\}} + +% Colors used for syntax highlighting +\definecolor{comment}{rgb}{0.5,0.0,0.0} +\definecolor{keyword}{rgb}{0.0,0.5,0.0} +\definecolor{keywordtype}{rgb}{0.38,0.25,0.125} +\definecolor{keywordflow}{rgb}{0.88,0.5,0.0} +\definecolor{preprocessor}{rgb}{0.5,0.38,0.125} +\definecolor{stringliteral}{rgb}{0.0,0.125,0.25} +\definecolor{charliteral}{rgb}{0.0,0.5,0.5} +\definecolor{xmlcdata}{rgb}{0.0,0.0,0.0} +\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0} +\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43} +\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0} +\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0} + +% Color used for table heading +\newcommand{\tableheadbgcolor}{lightgray}% + +% Version of hypertarget with correct landing location +\newcommand{\Hypertarget}[1]{\Hy@raisedlink{\hypertarget{#1}{}}} + +% possibility to have sections etc. be within the margins +% unfortunately had to copy part of book.cls and add \raggedright +\makeatletter +\newcounter{subsubsubsection}[subsubsection] +\newcounter{subsubsubsubsection}[subsubsubsection] +\newcounter{subsubsubsubsubsection}[subsubsubsubsection] +\newcounter{subsubsubsubsubsubsection}[subsubsubsubsubsection] +\renewcommand{\thesubsubsubsection}{\thesubsubsection.\arabic{subsubsubsection}} +\renewcommand{\thesubsubsubsubsection}{\thesubsubsubsection.\arabic{subsubsubsubsection}} +\renewcommand{\thesubsubsubsubsubsection}{\thesubsubsubsubsection.\arabic{subsubsubsubsubsection}} +\renewcommand{\thesubsubsubsubsubsubsection}{\thesubsubsubsubsubsection.\arabic{subsubsubsubsubsubsection}} +\newcommand{\subsubsubsectionmark}[1]{} +\newcommand{\subsubsubsubsectionmark}[1]{} +\newcommand{\subsubsubsubsubsectionmark}[1]{} +\newcommand{\subsubsubsubsubsubsectionmark}[1]{} +\def\toclevel@subsubsubsection{4} +\def\toclevel@subsubsubsubsection{5} +\def\toclevel@subsubsubsubsubsection{6} +\def\toclevel@subsubsubsubsubsubsection{7} +\def\toclevel@paragraph{8} +\def\toclevel@subparagraph{9} + +\newcommand\doxysection{\@startsection {section}{1}{\z@}% + {-3.5ex \@plus -1ex \@minus -.2ex}% + {2.3ex \@plus.2ex}% + {\raggedright\normalfont\Large\bfseries}} +\newcommand\doxysubsection{\@startsection{subsection}{2}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\large\bfseries}} +\newcommand\doxysubsubsection{\@startsection{subsubsection}{3}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxysubsubsubsection{\@startsection{subsubsubsection}{4}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxysubsubsubsubsection{\@startsection{subsubsubsubsection}{5}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxysubsubsubsubsubsection{\@startsection{subsubsubsubsubsection}{6}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxysubsubsubsubsubsubsection{\@startsection{subsubsubsubsubsubsection}{7}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxyparagraph{\@startsection{paragraph}{8}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} +\newcommand\doxysubparagraph{\@startsection{subparagraph}{9}{\parindent}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\raggedright\normalfont\normalsize\bfseries}} + +\newcommand\l@subsubsubsection{\@dottedtocline{4}{6.1em}{7.8em}} +\newcommand\l@subsubsubsubsection{\@dottedtocline{5}{6.1em}{9.4em}} +\newcommand\l@subsubsubsubsubsection{\@dottedtocline{6}{6.1em}{11em}} +\newcommand\l@subsubsubsubsubsubsection{\@dottedtocline{7}{6.1em}{12.6em}} +\renewcommand\l@paragraph{\@dottedtocline{8}{6.1em}{14.2em}} +\renewcommand\l@subparagraph{\@dottedtocline{9}{6.1em}{15.8em}} +\makeatother +% the sectsty doesn't look to be maintained but gives, in our case, some warning like: +% LaTeX Warning: Command \underline has changed. +% Check if current package is valid. +% unfortunately had to copy the relevant part +\newcommand*{\doxypartfont} [1] + {\gdef\SS@partnumberfont{\SS@sectid{0}\SS@nopart\SS@makeulinepartchap#1} + \gdef\SS@parttitlefont{\SS@sectid{0}\SS@titlepart\SS@makeulinepartchap#1}} +\newcommand*{\doxychapterfont} [1] + {\gdef\SS@chapnumfont{\SS@sectid{1}\SS@nopart\SS@makeulinepartchap#1} + \gdef\SS@chaptitlefont{\SS@sectid{1}\SS@titlepart\SS@makeulinepartchap#1}} +\newcommand*{\doxysectionfont} [1] + {\gdef\SS@sectfont{\SS@sectid{2}\SS@rr\SS@makeulinesect#1}} +\newcommand*{\doxysubsectionfont} [1] + {\gdef\SS@subsectfont{\SS@sectid{3}\SS@rr\SS@makeulinesect#1}} +\newcommand*{\doxysubsubsectionfont} [1] + {\gdef\SS@subsubsectfont{\SS@sectid{4}\SS@rr\SS@makeulinesect#1}} +\newcommand*{\doxyparagraphfont} [1] + {\gdef\SS@parafont{\SS@sectid{5}\SS@rr\SS@makeulinesect#1}} +\newcommand*{\doxysubparagraphfont} [1] + {\gdef\SS@subparafont{\SS@sectid{6}\SS@rr\SS@makeulinesect#1}} +\newcommand*{\doxyminisecfont} [1] + {\gdef\SS@minisecfont{\SS@sectid{7}\SS@rr\SS@makeulinepartchap#1}} +\newcommand*{\doxyallsectionsfont} [1] {\doxypartfont{#1}% + \doxychapterfont{#1}% + \doxysectionfont{#1}% + \doxysubsectionfont{#1}% + \doxysubsubsectionfont{#1}% + \doxyparagraphfont{#1}% + \doxysubparagraphfont{#1}% + \doxyminisecfont{#1}}% +% Define caption that is also suitable in a table +\makeatletter +\def\doxyfigcaption{% +\H@refstepcounter{figure}% +\@dblarg{\@caption{figure}}} +\makeatother + +% Define alpha enumarative names for counters > 26 +\makeatletter +\def\enumalphalphcnt#1{\expandafter\@enumalphalphcnt\csname c@#1\endcsname} +\def\@enumalphalphcnt#1{\alphalph{#1}} +\def\enumAlphAlphcnt#1{\expandafter\@enumAlphAlphcnt\csname c@#1\endcsname} +\def\@enumAlphAlphcnt#1{\AlphAlph{#1}} +\makeatother +\AddEnumerateCounter{\enumalphalphcnt}{\@enumalphalphcnt}{aa} +\AddEnumerateCounter{\enumAlphAlphcnt}{\@enumAlphAlphcnt}{AA} diff --git a/documentation/latex/etoc_doxygen.sty b/documentation/latex/etoc_doxygen.sty new file mode 100644 index 00000000..5f7e1274 --- /dev/null +++ b/documentation/latex/etoc_doxygen.sty @@ -0,0 +1,2178 @@ +%% +%% This is file etoc_doxygen.sty +%% +%% Apart from this header notice and the renaming from etoc to +%% etoc_doxygen (also in \ProvidesPackage) it is an identical +%% copy of +%% +%% etoc.sty +%% +%% at version 1.2b of 2023/07/01. +%% +%% This file has been provided to Doxygen team courtesy of the +%% author for benefit of users having a LaTeX installation not +%% yet providing version 1.2a or later of etoc, whose +%% deeplevels feature is required. +%% +%% The original source etoc.dtx (only of the latest version at +%% any given time) is available at +%% +%% https://ctan.org/pkg/etoc +%% +%% and contains the terms for copying and modification as well +%% as author contact information. +%% +%% In brief any modified versions of this file must be renamed +%% with new filenames distinct from etoc.sty. +%% +%% Package: etoc +%% Version: 1.2b +%% License: LPPL 1.3c +%% Copyright (C) 2012-2023 Jean-Francois B. +\NeedsTeXFormat{LaTeX2e}[2003/12/01] +\ProvidesPackage{etoc_doxygen}[2023/07/01 v1.2b Completely customisable TOCs (JFB)] +\newif\ifEtoc@oldLaTeX +\@ifl@t@r\fmtversion{2020/10/01} + {} + {\Etoc@oldLaTeXtrue + \PackageInfo{etoc}{Old LaTeX (\fmtversion) detected!\MessageBreak + Since 1.1a (2023/01/14), etoc prefers LaTeX at least\MessageBreak + as recent as 2020-10-01, for reasons of the .toc file,\MessageBreak + and used to require it (from 1.1a to 1.2).\MessageBreak + This etoc (1.2b) does not *require* it, but has not been\MessageBreak + tested thoroughly on old LaTeX (especially if document\MessageBreak + does not use hyperref) and retrofitting was done only\MessageBreak + on basis of author partial remembrances of old context.\MessageBreak + Reported}} +\RequirePackage{kvoptions} +\SetupKeyvalOptions{prefix=Etoc@} +\newif\ifEtoc@lof +\DeclareVoidOption{lof}{\Etoc@loftrue + \PackageInfo{etoc}{Experimental support for \string\locallistoffigures.\MessageBreak + Barely tested, use at own risk}% +} +\newif\ifEtoc@lot +\DeclareVoidOption{lot}{\Etoc@lottrue + \PackageInfo{etoc}{Experimental support for \string\locallistoftables.\MessageBreak + Barely tested, use at own risk}% +} +\@ifclassloaded{memoir}{ +\PackageInfo{etoc} + {As this is with memoir class, all `...totoc' options\MessageBreak + are set true by default. Reported} +\DeclareBoolOption[true]{maintoctotoc} +\DeclareBoolOption[true]{localtoctotoc} +\DeclareBoolOption[true]{localloftotoc} +\DeclareBoolOption[true]{locallottotoc} +}{ +\DeclareBoolOption[false]{maintoctotoc} +\DeclareBoolOption[false]{localtoctotoc} +\DeclareBoolOption[false]{localloftotoc} +\DeclareBoolOption[false]{locallottotoc} +} +\DeclareBoolOption[true]{ouroboros} +\DeclareBoolOption[false]{deeplevels} +\DeclareDefaultOption{\PackageWarning{etoc}{Option `\CurrentOption' is unknown.}} +\ProcessKeyvalOptions* +\DisableKeyvalOption[action=error,package=etoc]{etoc}{lof} +\DisableKeyvalOption[action=error,package=etoc]{etoc}{lot} +\DisableKeyvalOption[action=error,package=etoc]{etoc}{deeplevels} +\def\etocsetup#1{\setkeys{etoc}{#1}} +\def\etocifmaintoctotoc{\ifEtoc@maintoctotoc + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +\def\etociflocaltoctotoc{\ifEtoc@localtoctotoc + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +\def\etociflocalloftotoc{\ifEtoc@localloftotoc + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +\def\etociflocallottotoc{\ifEtoc@locallottotoc + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +\RequirePackage{multicol} +\def\etoc@{\etoc@} +\long\def\Etoc@gobtoetoc@ #1\etoc@{} +\newtoks\Etoc@toctoks +\def\Etoc@par{\par} +\def\etocinline{\def\Etoc@par{}} +\let\etocnopar\etocinline +\def\etocdisplay{\def\Etoc@par{\par}} +\let\Etoc@global\@empty +\def\etocglobaldefs{\let\Etoc@global\global\let\tof@global\global} +\def\etoclocaldefs {\let\Etoc@global\@empty\let\tof@global\@empty} +\newif\ifEtoc@numbered +\newif\ifEtoc@hyperref +\newif\ifEtoc@parskip +\newif\ifEtoc@tocwithid +\newif\ifEtoc@standardlines +\newif\ifEtoc@etocstyle +\newif\ifEtoc@classstyle +\newif\ifEtoc@keeporiginaltoc +\newif\ifEtoc@skipprefix +\newif\ifEtoc@isfirst +\newif\ifEtoc@localtoc +\newif\ifEtoc@skipthisone +\newif\ifEtoc@stoptoc +\newif\ifEtoc@notactive +\newif\ifEtoc@mustclosegroup +\newif\ifEtoc@isemptytoc +\newif\ifEtoc@checksemptiness +\def\etocchecksemptiness {\Etoc@checksemptinesstrue } +\def\etocdoesnotcheckemptiness {\Etoc@checksemptinessfalse } +\newif\ifEtoc@notocifnotoc +\def\etocnotocifnotoc {\Etoc@checksemptinesstrue\Etoc@notocifnotoctrue } +\newcounter{etoc@tocid} +\def\Etoc@tocext{toc} +\def\Etoc@lofext{lof} +\def\Etoc@lotext{lot} +\let\Etoc@currext\Etoc@tocext +\def\etocifislocal{\ifEtoc@localtoc\expandafter\@firstoftwo\else + \expandafter\@secondoftwo\fi + } +\def\etocifislocaltoc{\etocifislocal{\ifx\Etoc@currext\Etoc@tocext + \expandafter\@firstoftwo\else + \expandafter\@secondoftwo\fi}% + {\@secondoftwo}% + } +\def\etocifislocallof{\etocifislocal{\ifx\Etoc@currext\Etoc@lofext + \expandafter\@firstoftwo\else + \expandafter\@secondoftwo\fi}% + {\@secondoftwo}% + } +\def\etocifislocallot{\etocifislocal{\ifx\Etoc@currext\Etoc@lotext + \expandafter\@firstoftwo\else + \expandafter\@secondoftwo\fi}% + {\@secondoftwo}% + } +\expandafter\def\csname Etoc@-3@@\endcsname {-\thr@@} +\expandafter\def\csname Etoc@-2@@\endcsname {-\tw@} +\expandafter\let\csname Etoc@-1@@\endcsname \m@ne +\expandafter\let\csname Etoc@0@@\endcsname \z@ +\expandafter\let\csname Etoc@1@@\endcsname \@ne +\expandafter\let\csname Etoc@2@@\endcsname \tw@ +\expandafter\let\csname Etoc@3@@\endcsname \thr@@ +\expandafter\chardef\csname Etoc@4@@\endcsname 4 +\expandafter\chardef\csname Etoc@5@@\endcsname 5 +\expandafter\chardef\csname Etoc@6@@\endcsname 6 +\ifEtoc@deeplevels + \expandafter\chardef\csname Etoc@7@@\endcsname 7 + \expandafter\chardef\csname Etoc@8@@\endcsname 8 + \expandafter\chardef\csname Etoc@9@@\endcsname 9 + \expandafter\chardef\csname Etoc@10@@\endcsname 10 + \expandafter\chardef\csname Etoc@11@@\endcsname 11 + \expandafter\chardef\csname Etoc@12@@\endcsname 12 +\fi +\expandafter\let\expandafter\Etoc@maxlevel + \csname Etoc@\ifEtoc@deeplevels12\else6\fi @@\endcsname +\edef\etocthemaxlevel{\number\Etoc@maxlevel} +\@ifclassloaded{memoir}{\def\Etoc@minf{-\thr@@}}{\def\Etoc@minf{-\tw@}} +\let\Etoc@none@@ \Etoc@minf +\expandafter\let\expandafter\Etoc@all@@ + \csname Etoc@\ifEtoc@deeplevels11\else5\fi @@\endcsname +\let\Etoc@dolevels\@empty +\def\Etoc@newlevel #1{\expandafter\def\expandafter\Etoc@dolevels\expandafter + {\Etoc@dolevels\Etoc@do{#1}}} +\ifdefined\expanded + \def\etocsetlevel#1#2{\expanded{\noexpand\etoc@setlevel{#1}{#2}}}% +\else + \def\etocsetlevel#1#2{{\edef\Etoc@tmp{\noexpand\etoc@setlevel{#1}{#2}}\expandafter}\Etoc@tmp}% +\fi +\def\etoc@setlevel#1#2{% + \edef\Etoc@tmp{\the\numexpr#2}% + \if1\ifnum\Etoc@tmp>\Etoc@maxlevel0\fi\unless\ifnum\Etoc@minf<\Etoc@tmp;\fi1% + \ifEtoc@deeplevels + \in@{.#1,}{.none,.all,.figure,.table,.-3,.-2,.-1,.0,.1,.2,.3,.4,.5,.6,% + .7,.8,.9,.10,.11,.12,}% + \else + \in@{.#1,}{.none,.all,.figure,.table,.-3,.-2,.-1,.0,.1,.2,.3,.4,.5,.6,}% + \fi + \ifin@\else\if\@car#1\@nil @\in@true\fi\fi + \ifin@ + \PackageWarning{etoc} + {Sorry, but `#1' is forbidden as level name.\MessageBreak + \if\@car#1\@nil @% + (because of the @ as first character)\MessageBreak\fi + Reported}% + \else + \etocifunknownlevelTF{#1}{\Etoc@newlevel{#1}}{}% + \expandafter\let\csname Etoc@#1@@\expandafter\endcsname + \csname Etoc@\Etoc@tmp @@\endcsname + \expandafter\edef\csname Etoc@@#1@@\endcsname + {\expandafter\noexpand\csname Etoc@#1@@\endcsname}% + \expandafter\edef\csname toclevel@@#1\endcsname + {\expandafter\noexpand\csname toclevel@#1\endcsname}% + \fi + \else + \PackageWarning{etoc} + {Argument `\detokenize{#2}' of \string\etocsetlevel\space should + represent one of\MessageBreak + \ifnum\Etoc@minf=-\thr@@-2, \fi-1, 0, 1, 2, \ifEtoc@deeplevels ...\else3, 4\fi, + \the\numexpr\Etoc@maxlevel-1, or \number\Etoc@maxlevel\space + but evaluates to \Etoc@tmp.\MessageBreak + The level of `#1' will be set to \number\Etoc@maxlevel.\MessageBreak + Tables of contents will ignore `#1' as long\MessageBreak + as its level is \number\Etoc@maxlevel\space (=\string\etocthemaxlevel).% + \MessageBreak + Reported}% + \etocifunknownlevelTF{#1}{\Etoc@newlevel{#1}}{}% + \expandafter\let\csname Etoc@#1@@\endcsname\Etoc@maxlevel + \fi +} +\def\etoclevel#1{\csname Etoc@#1@@\endcsname} +\def\etocthelevel#1{\number\csname Etoc@#1@@\endcsname} +\def\etocifunknownlevelTF#1{\@ifundefined{Etoc@#1@@}} +\@ifclassloaded{memoir}{\etocsetlevel{book}{-2}}{} +\etocsetlevel{part}{-1} +\etocsetlevel{chapter}{0} +\etocsetlevel{section}{1} +\etocsetlevel{subsection}{2} +\etocsetlevel{subsubsection}{3} +\etocsetlevel{paragraph}{4} +\etocsetlevel{subparagraph}{5} +\ifdefined\c@chapter + \etocsetlevel{appendix}{0} +\else + \etocsetlevel{appendix}{1} +\fi +\def\Etoc@do#1{\@namedef{l@@#1}{\csname l@#1\endcsname}} +\Etoc@dolevels +\let\Etoc@figure@@\Etoc@maxlevel +\let\Etoc@table@@ \Etoc@maxlevel +\let\Etoc@gobblethreeorfour\@gobblefour +\ifdefined\@gobblethree + \let\Etoc@gobblethree\@gobblethree +\else + \long\def\Etoc@gobblethree#1#2#3{}% +\fi +\AtBeginDocument{% +\@ifpackageloaded{parskip}{\Etoc@parskiptrue}{}% +\@ifpackageloaded{hyperref} + {\Etoc@hyperreftrue} + {\ifEtoc@oldLaTeX + \let\Etoc@gobblethreeorfour\Etoc@gobblethree + \let\Etoc@etoccontentsline@fourargs\Etoc@etoccontentsline@ + \long\def\Etoc@etoccontentsline@#1#2#3{% + \Etoc@etoccontentsline@fourargs{#1}{#2}{#3}{}% + }% + \fi + }% +} +\def\etocskipfirstprefix {\global\Etoc@skipprefixtrue } +\def\Etoc@updatestackofends#1\etoc@{\gdef\Etoc@stackofends{#1}} +\def\Etoc@stackofends{{-3}{}} +\def\Etoc@doendsandbegin{% + \expandafter\Etoc@traversestackofends\Etoc@stackofends\etoc@ +} +\def\Etoc@traversestackofends#1{% + \ifnum#1>\Etoc@level + \csname Etoc@end@#1\endcsname + \expandafter\Etoc@traversestackofends + \else + \Etoc@traversestackofends@done{#1}% + \fi +} +\def\Etoc@traversestackofends@done#1#2{#2% + \ifnum#1<\Etoc@level + \csname Etoc@begin@\the\numexpr\Etoc@level\endcsname + \Etoc@global\Etoc@isfirsttrue + \edef\Etoc@tmp{{\the\numexpr\Etoc@level}}% + \else + \Etoc@global\Etoc@isfirstfalse + \let\Etoc@tmp\@empty + \fi + \expandafter\Etoc@updatestackofends\Etoc@tmp{#1}% +} +\def\Etoc@etoccontentsline #1{% + \let\Etoc@next\Etoc@gobblethreeorfour + \ifnum\csname Etoc@#1@@\endcsname=\Etoc@maxlevel + \else + \Etoc@skipthisonefalse + \global\expandafter\let\expandafter\Etoc@level\csname Etoc@#1@@\endcsname + \if @\@car#1\@nil\else\global\let\Etoc@virtualtop\Etoc@level\fi + \ifEtoc@localtoc + \ifEtoc@stoptoc + \Etoc@skipthisonetrue + \else + \ifEtoc@notactive + \Etoc@skipthisonetrue + \else + \unless\ifnum\Etoc@level>\etoclocaltop + \Etoc@skipthisonetrue + \global\Etoc@stoptoctrue + \fi + \fi + \fi + \fi + \ifEtoc@skipthisone + \else + \unless\ifnum\Etoc@level>\c@tocdepth + \ifEtoc@standardlines + \let\Etoc@next\Etoc@savedcontentsline + \else + \let\Etoc@next\Etoc@etoccontentsline@ + \fi + \fi + \fi + \fi + \Etoc@next{#1}% +} +\def\Etoc@etoccontentsline@ #1#2#3#4{% + \Etoc@doendsandbegin + \Etoc@global\edef\Etoc@prefix {\expandafter\noexpand + \csname Etoc@prefix@\the\numexpr\Etoc@level\endcsname }% + \Etoc@global\edef\Etoc@contents{\expandafter\noexpand + \csname Etoc@contents@\the\numexpr\Etoc@level\endcsname }% + \ifEtoc@skipprefix \Etoc@global\def\Etoc@prefix{\@empty}\fi + \global\Etoc@skipprefixfalse + \Etoc@lxyz{#2}{#3}{#4}% + \Etoc@prefix + \Etoc@contents +} +\def\Etoc@lxyz #1#2#3{% + \ifEtoc@hyperref + \Etoc@global\def\etocthelink##1{\hyperlink{#3}{##1}}% + \else + \Etoc@global\let\etocthelink\@firstofone + \fi + \Etoc@global\def\etocthepage {#2}% + \ifEtoc@hyperref + \ifx\etocthepage\@empty + \Etoc@global\let\etocthelinkedpage\@empty + \else + \Etoc@global\def\etocthelinkedpage{\hyperlink {#3}{#2}}% + \fi + \else + \Etoc@global\let\etocthelinkedpage\etocthepage + \fi + \Etoc@global\def\etocthename{#1}% + \futurelet\Etoc@getnb@token\Etoc@@getnb #1\hspace\etoc@ + \ifEtoc@hyperref + \def\Etoc@tmp##1##2{\Etoc@global\def##2{\hyperlink{#3}{##1}}}% + \expandafter\Etoc@tmp\expandafter{\etocthename}\etocthelinkedname + \ifEtoc@numbered + \expandafter\Etoc@tmp\expandafter{\etocthenumber}\etocthelinkednumber + \else + \Etoc@global\let\etocthelinkednumber\@empty + \fi + \else + \Etoc@global\let\etocthelinkedname \etocthename + \Etoc@global\let\etocthelinkednumber\etocthenumber + \fi + \Etoc@global\expandafter\let\csname etoclink \endcsname \etocthelink + \Etoc@global\expandafter\let\csname etocname \endcsname \etocthename + \Etoc@global\expandafter\let\csname etocnumber \endcsname\etocthenumber + \Etoc@global\expandafter\let\csname etocpage \endcsname \etocthepage + \ifEtoc@hyperref + \Etoc@lxyz@linktoc + \fi +} +\def\Etoc@lxyz@linktoc{% + \ifcase\Hy@linktoc + \or + \Etoc@global\expandafter\let\csname etocname \endcsname\etocthelinkedname + \Etoc@global\expandafter\let\csname etocnumber \endcsname\etocthelinkednumber + \or % page + \Etoc@global\expandafter\let\csname etocpage \endcsname\etocthelinkedpage + \else % all + \Etoc@global\expandafter\let\csname etocname \endcsname\etocthelinkedname + \Etoc@global\expandafter\let\csname etocnumber \endcsname\etocthelinkednumber + \Etoc@global\expandafter\let\csname etocpage \endcsname\etocthelinkedpage + \fi +} +\def\Etoc@@getnb {% + \let\Etoc@next\Etoc@getnb + \ifx\Etoc@getnb@token\@sptoken\let\Etoc@next\Etoc@getnb@nonbr\fi + \ifx\Etoc@getnb@token\bgroup \let\Etoc@next\Etoc@getnb@nonbr\fi + \Etoc@next +} +\def\Etoc@getnb #1{% + \in@{#1}{\numberline\chapternumberline\partnumberline\booknumberline}% + \ifin@ + \let\Etoc@next\Etoc@getnb@nmbrd + \else + \ifnum\Etoc@level=\m@ne + \let\Etoc@next\Etoc@@getit + \else + \let\Etoc@next\Etoc@getnb@nonbr + \fi + \in@{#1}{\nonumberline}% + \ifin@ + \let\Etoc@next\Etoc@getnb@nonumberline + \fi + \fi + \Etoc@next #1% +} +\def\Etoc@getnb@nmbrd #1#2{% + \Etoc@global\Etoc@numberedtrue + \Etoc@global\def\etocthenumber {#2}% + \Etoc@getnb@nmbrd@getname\@empty +}% +\def\Etoc@getnb@nmbrd@getname #1\hspace\etoc@ {% + \Etoc@global\expandafter\def\expandafter\etocthename\expandafter{#1}% +} +\def\Etoc@getnb@nonbr #1\etoc@ {% + \Etoc@global\Etoc@numberedfalse + \Etoc@global\let\etocthenumber \@empty +} +\def\Etoc@getnb@nonumberline #1\hspace\etoc@ {% + \Etoc@global\Etoc@numberedfalse + \Etoc@global\let\etocthenumber \@empty + \Etoc@global\expandafter\def\expandafter\etocthename\expandafter{\@gobble#1}% +} +\def\Etoc@@getit #1\hspace#2{% + \ifx\etoc@#2% + \Etoc@global\Etoc@numberedfalse + \Etoc@global\let\etocthenumber \@empty + \else + \Etoc@global\Etoc@numberedtrue + \Etoc@global\def\etocthenumber {#1}% + \expandafter\Etoc@getit@getname \expandafter\@empty + \fi +} +\def\Etoc@getit@getname #1\hspace\etoc@ {% + \Etoc@global\expandafter\def\expandafter\etocthename\expandafter{#1}% +} +\let\etocthename \@empty +\let\etocthenumber \@empty +\let\etocthepage \@empty +\let\etocthelinkedname \@empty +\let\etocthelinkednumber \@empty +\let\etocthelinkedpage \@empty +\let\etocthelink \@firstofone +\DeclareRobustCommand*{\etocname} {} +\DeclareRobustCommand*{\etocnumber}{} +\DeclareRobustCommand*{\etocpage} {} +\DeclareRobustCommand*{\etoclink} {\@firstofone} +\DeclareRobustCommand*{\etocifnumbered} + {\ifEtoc@numbered\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi} +\expandafter\let\expandafter\etocxifnumbered\csname etocifnumbered \endcsname +\DeclareRobustCommand*{\etociffirst} + {\ifEtoc@isfirst\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi} +\expandafter\let\expandafter\etocxiffirst\csname etociffirst \endcsname +\def\Etoc@readtoc {% + \ifeof \Etoc@tf + \else + \read \Etoc@tf to \Etoc@buffer + \Etoc@toctoks=\expandafter\expandafter\expandafter + {\expandafter\the\expandafter\Etoc@toctoks\Etoc@buffer}% + \expandafter\Etoc@readtoc + \fi +} +\Etoc@toctoks {}% (superfluous, but for clarity) +\AtBeginDocument{\IfFileExists{\jobname.toc} + {{\endlinechar=\m@ne + \makeatletter + \newread\Etoc@tf + \openin\Etoc@tf\@filef@und + \Etoc@readtoc + \global\Etoc@toctoks=\expandafter{\the\Etoc@toctoks}% + \closein\Etoc@tf}} + {\typeout{No file \jobname.toc.}}} +\def\Etoc@openouttoc{% + \ifEtoc@hyperref + \ifx\hyper@last\@undefined + \IfFileExists{\jobname .toc} + {\Hy@WarningNoLine + {old toc file detected; run LaTeX again (cheers from `etoc')}% + \global\Etoc@toctoks={}% + } + {}% + \fi + \fi + \if@filesw + \newwrite \tf@toc + \immediate \openout \tf@toc \jobname .toc\relax + \fi + \global\let\Etoc@openouttoc\empty +} +\def\Etoc@toctoc{% + \gdef\Etoc@stackofends{{-3}{}}% + \global\let\Etoc@level\Etoc@minf + \global\let\Etoc@virtualtop\Etoc@minf + \the\Etoc@toctoks + \ifEtoc@notactive + \else + \gdef\Etoc@level{-\thr@@}% + \Etoc@doendsandbegin + \fi +} +\def\Etoc@@startlocaltoc#1#2{% + \ifEtoc@localtoc + \ifnum #1=#2\relax + \global\let\etoclocaltop\Etoc@virtualtop + \Etoc@@startlocaltochook + \etoclocaltableofcontentshook + \ifEtoc@etocstyle + \etocetoclocaltocmaketitle + \fi + \ifx\Etoc@aftertitlehook\@empty + \else + \ifEtoc@localtoctotoc + \ifEtoc@ouroboros + \else + \let\Etoc@tmp\contentsline + \def\contentsline{\let\contentsline\Etoc@tmp\Etoc@gobblethreeorfour}% + \fi + \fi + \fi + \global\Etoc@notactivefalse + \fi + \fi +} +\let\etoc@startlocaltoc\@gobble +\let\Etoc@@startlocaltoc@toc\Etoc@@startlocaltoc +\let\Etoc@@startlocaltochook\@empty +\unless\ifEtoc@deeplevels + \def\etocdivisionnameatlevel#1{% + \ifcase\numexpr#1\relax + \ifdefined\c@chapter chapter\else section\fi% + \or section% + \or subsection% + \or subsubsection% + \or paragraph% + \or subparagraph% + \or empty% + \else\ifnum\numexpr#1<\m@ne + book% + \else + part% + \fi + \fi + } +\else + \def\etocdivisionnameatlevel#1{% + \ifcase\numexpr#1\relax + \ifdefined\c@chapter chapter\else section\fi% + \or section% + \or subsection% + \or subsubsection% + \or subsubsubsection% + \or subsubsubsubsection% + \or subsubsubsubsubsection% + \or subsubsubsubsubsubsection% + \or paragraph% + \or subparagraph% + \else\ifnum\numexpr#1>\z@ + empty% + \else\ifnum\numexpr#1=\m@ne + part% + \else + book% + \fi\fi + \fi + } +\fi +\def\etoclocalheadtotoc#1#2{\addcontentsline{toc}{@#1}{#2}} +\def\etocglobalheadtotoc{\addcontentsline{toc}} +\providecommand*\UseName{\@nameuse} +\def\etocetoclocaltocmaketitle{% + \UseName{\etocdivisionnameatlevel{\etoclocaltop+1}}*{\localcontentsname}% + \if@noskipsec\leavevmode\par\fi + \etociflocaltoctotoc + {\etocifisstarred + {}% star variant, do not add to toc + {\etoclocalheadtotoc + {\etocdivisionnameatlevel{\etoclocaltop+1}}% + {\localcontentsname}% + }% + }% + {}% +}% +\def\localcontentsname {\contentsname}% +\let\etoclocaltableofcontentshook\@empty +\if1\ifEtoc@lof0\fi\ifEtoc@lot0\fi1% +\else +\AtBeginDocument{% + \let\Etoc@originaladdcontentsline\addcontentsline + \def\addcontentsline{\Etoc@hackedaddcontentsline}% +}% +\fi +\ifEtoc@lof + \ifEtoc@lot + \def\Etoc@hackedaddcontentsline#1{% + \expanded{\noexpand\in@{.#1,}}{.lof,.lot,}% + \ifin@\expandafter\Etoc@hackedaddcontentsline@i + \else\expandafter\Etoc@originaladdcontentsline + \fi {#1}} + \else + \def\Etoc@hackedaddcontentsline#1{% + \expanded{\noexpand\in@{.#1,}}{.lof,}% + \ifin@\expandafter\Etoc@hackedaddcontentsline@i + \else\expandafter\Etoc@originaladdcontentsline + \fi {#1}} + \fi +\else + \def\Etoc@hackedaddcontentsline#1{% + \expanded{\noexpand\in@{.#1,}}{.lot,}% + \ifin@\expandafter\Etoc@hackedaddcontentsline@i + \else\expandafter\Etoc@originaladdcontentsline + \fi {#1}} +\fi +\def\Etoc@hackedaddcontentsline@i#1#2#3{% + \expanded{\noexpand\in@{.#1;#2,}}{.lof;figure,.lot;table,}% + \ifin@ + \addtocontents {toc}{% + \protect\contentsline{#2}{#3}{\thepage}{\ifEtoc@hyperref\@currentHref\fi}% + \ifdefined\protected@file@percent\protected@file@percent\fi + }% + \fi + \Etoc@originaladdcontentsline{#1}{#2}{#3}% +} +\unless\ifdefined\expanded + \def\Etoc@hackedaddcontentsline#1{% + {\edef\Etoc@tmp{\noexpand\in@{.#1,}{\ifEtoc@lof.lof,\fi\ifEtoc@lot.lot,\fi}}\expandafter}% + \Etoc@tmp + \ifin@\expandafter\Etoc@hackedaddcontentsline@i + \else\expandafter\Etoc@originaladdcontentsline + \fi {#1}% + } + \def\Etoc@hackedaddcontentsline@i#1#2#3{% + {\edef\Etoc@tmp{\noexpand\in@{.#1;#2,}}\expandafter}% + \Etoc@tmp{.lof;figure,.lot;table,}% + \ifin@ + \addtocontents {toc}{% + \protect\contentsline{#2}{#3}{\thepage}{\ifEtoc@hyperref\@currentHref\fi}% + \ifdefined\protected@file@percent\protected@file@percent\fi + }% + \fi + \Etoc@originaladdcontentsline{#1}{#2}{#3}% + } +\fi +\def\Etoc@@startlocallistof#1#2#3{% + \ifEtoc@localtoc + \ifnum #2=#3\relax + \global\let\etoclocaltop\Etoc@virtualtop + \global\Etoc@notactivefalse + \Etoc@@startlocaltochook + \csname etoclocallistof#1shook\endcsname + \ifEtoc@etocstyle + \csname etocetoclistof#1smaketitle\endcsname + \fi + \fi + \fi +} +\def\Etoc@@startlocallistof@setlevels#1{% + \ifnum\etoclocaltop<\z@ + \expandafter\let\csname Etoc@#1@@\endcsname\@ne + \else + \expandafter\let\csname Etoc@#1@@\expandafter\endcsname + \csname Etoc@\the\numexpr\etoclocaltop+\@ne @@\endcsname + \fi + \def\Etoc@do##1{% + \ifnum\etoclevel{##1}>\etoclocaltop + \expandafter\let\csname Etoc@##1@@\endcsname\Etoc@maxlevel + \fi}% + \Etoc@dolevels +} +\def\etoclocallistoffigureshook{\etocstandardlines} +\def\etoclocallistoftableshook {\etocstandardlines} +\def\locallistfigurename{\listfigurename} +\def\locallisttablename {\listtablename} +\def\etocetoclistoffiguresmaketitle{% + \UseName{\etocdivisionnameatlevel{\etoclocaltop+1}}*{\locallistfigurename}% + \ifnum\etoclocaltop>\tw@\mbox{}\par\fi + \etociflocalloftotoc + {\etocifisstarred + {}% star variant, do not add to toc + {\etoclocalheadtotoc + {\etocdivisionnameatlevel{\etoclocaltop+1}}% + {\locallistfigurename}% + }% + }% + {}% +}% +\def\etocetoclistoftablesmaketitle{% + \UseName{\etocdivisionnameatlevel{\etoclocaltop+1}}*{\locallisttablename}% + \ifnum\etoclocaltop>\tw@\mbox{}\par\fi + \etociflocallottotoc + {\etocifisstarred + {}% star variant, do not add to toc + {\etoclocalheadtotoc + {\etocdivisionnameatlevel{\etoclocaltop+1}}% + {\locallisttablename}% + }% + }% + {}% +}% +\let\Etoc@listofreset\@empty +\ifEtoc@lof + \def\locallistoffigures{% + \def\Etoc@listofreset{% + \let\Etoc@currext\Etoc@tocext + \let\Etoc@@startlocaltoc\Etoc@@startlocaltoc@toc + \let\Etoc@@startlocaltochook\@empty + \let\Etoc@listofreset\@empty + \let\Etoc@listofhook\@empty + }% + \let\Etoc@currext\Etoc@lofext + \def\Etoc@@startlocaltoc{\Etoc@@startlocallistof{figure}}% + \def\Etoc@@startlocaltochook{\Etoc@@startlocallistof@setlevels{figure}}% + \def\Etoc@listofhook{% + \def\Etoc@do####1{% + \expandafter\let\csname Etoc@@####1@@\endcsname\Etoc@maxlevel + }% + \Etoc@dolevels + }% + \localtableofcontents + } +\else + \def\locallistoffigures{% + \PackageError{etoc}{% + \string\locallistoffigures \on@line\space but\MessageBreak + package was loaded without `lof' option}% + {Try again with \string\usepackage[lof]{etoc}}% + } +\fi +\ifEtoc@lot + \def\locallistoftables{% + \def\Etoc@listofreset{% + \let\Etoc@currext\Etoc@tocext + \let\Etoc@@startlocaltoc\Etoc@@startlocaltoc@toc + \let\Etoc@@startlocaltochook\@empty + \let\Etoc@listofreset\@empty + \let\Etoc@listofhook\@empty + }% + \let\Etoc@currext\Etoc@lotext + \def\Etoc@@startlocaltoc{\Etoc@@startlocallistof{table}}% + \def\Etoc@@startlocaltochook{\Etoc@@startlocallistof@setlevels{table}}% + \def\Etoc@listofhook{% + \def\Etoc@do####1{% + \expandafter\let\csname Etoc@@####1@@\endcsname\Etoc@maxlevel + }% + \Etoc@dolevels + }% + \localtableofcontents + } +\else + \def\locallistoftables{% + \PackageError{etoc}{% + \string\locallistoftable \on@line\space but\MessageBreak + package was loaded without `lot' option}% + {Try again with \string\usepackage[lot]{etoc}}% + } +\fi +\def\Etoc@checkifempty {% + \global\Etoc@isemptytoctrue + \global\Etoc@stoptocfalse + \global\let\Etoc@level\Etoc@minf + \global\let\Etoc@virtualtop\Etoc@minf + \gdef\Etoc@stackofends{{-3}{}}% + \begingroup + \ifEtoc@localtoc + \def\etoc@startlocaltoc##1{% + \ifnum##1=\Etoc@tocid\relax + \global\let\etoclocaltop\Etoc@virtualtop + \Etoc@@startlocaltochook + \global\Etoc@notactivefalse + \fi + }% + \let\contentsline\Etoc@testingcontentslinelocal + \else + \let\contentsline\Etoc@testingcontentsline + \fi + \Etoc@storetocdepth + \let\Etoc@setlocaltop@doendsandbegin\@empty + \the\Etoc@toctoks + \Etoc@restoretocdepth + \endgroup +} +\DeclareRobustCommand*\etocifwasempty + {\ifEtoc@isemptytoc\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi } +\expandafter\let\expandafter\etocxifwasempty\csname etocifwasempty \endcsname +\def\Etoc@testingcontentslinelocal #1{% + \ifEtoc@stoptoc + \else + \ifnum\csname Etoc@#1@@\endcsname=\Etoc@maxlevel + \else + \global\expandafter\let\expandafter\Etoc@level\csname Etoc@#1@@\endcsname + \if @\@car#1\@nil\else\global\let\Etoc@virtualtop\Etoc@level\fi + \ifEtoc@notactive + \else + \ifnum\Etoc@level>\etoclocaltop + \unless\ifnum\Etoc@level>\c@tocdepth + \global\Etoc@isemptytocfalse + \global\Etoc@stoptoctrue + \fi + \else + \global\Etoc@stoptoctrue + \fi + \fi + \fi + \fi + \Etoc@gobblethreeorfour{}% +} +\def\Etoc@testingcontentsline #1{% + \ifEtoc@stoptoc + \else + \ifnum\csname Etoc@#1@@\endcsname=\Etoc@maxlevel + \else + \unless\ifnum\csname Etoc@#1@@\endcsname>\c@tocdepth + \global\Etoc@isemptytocfalse + \global\Etoc@stoptoctrue + \fi + \fi + \fi + \Etoc@gobblethreeorfour{}% +} +\def\Etoc@localtableofcontents#1{% + \gdef\etoclocaltop{-\@m}% + \Etoc@localtoctrue + \global\Etoc@isemptytocfalse + \edef\Etoc@tocid{#1}% + \ifnum\Etoc@tocid<\@ne + \setbox0\hbox{\ref{Unknown toc ref \@secondoftwo#1. \space Rerun LaTeX}}% + \global\Etoc@stoptoctrue + \gdef\etoclocaltop{-\thr@@}% + \Etoc@tableofcontents + \expandafter\Etoc@gobtoetoc@ + \fi + \global\Etoc@notactivetrue + \ifEtoc@checksemptiness + \Etoc@checkifempty + \fi + \ifEtoc@isemptytoc + \ifEtoc@notactive + \setbox0\hbox{\ref{Unknown toc ID \number\Etoc@tocid. \space Rerun LaTeX}}% + \global\Etoc@isemptytocfalse + \global\Etoc@stoptoctrue + \gdef\etoclocaltop{-\thr@@}% + \Etoc@tableofcontents + \expandafter\expandafter\expandafter\Etoc@gobtoetoc@ + \fi + \else + \global\Etoc@stoptocfalse + \global\Etoc@notactivetrue + \edef\etoc@startlocaltoc##1% + {\noexpand\Etoc@@startlocaltoc{##1}{\Etoc@tocid}}% + \Etoc@tableofcontents + \fi + \@gobble\etoc@ + \endgroup\ifEtoc@mustclosegroup\endgroup\fi + \Etoc@tocdepthreset + \Etoc@listofreset + \etocaftertochook +}% \Etoc@localtableofcontents +\def\Etoc@getref #1{% + \@ifundefined{r@#1} + {0} + {\expandafter\Etoc@getref@i\romannumeral-`0% + \expandafter\expandafter\expandafter + \@car\csname r@#1\endcsname0\@nil\@etoc + }% +} +\def\Etoc@getref@i#1#2\@etoc{\ifnum9<1\string#1 #1#2\else 0\fi} +\def\Etoc@ref#1{\Etoc@localtableofcontents{\Etoc@getref{#1}}} +\def\Etoc@label#1{\label{#1}\futurelet\Etoc@nexttoken\Etoc@t@bleofcontents} +\@firstofone{\def\Etoc@again} {\futurelet\Etoc@nexttoken\Etoc@t@bleofcontents} +\def\Etoc@dothis #1#2\etoc@ {\fi #1} +\def\Etoc@t@bleofcontents{% + \gdef\etoclocaltop{-\@M}% + \ifx\Etoc@nexttoken\label\Etoc@dothis{\expandafter\Etoc@label\@gobble}\fi + \ifx\Etoc@nexttoken\@sptoken\Etoc@dothis{\Etoc@again}\fi + \ifx\Etoc@nexttoken\ref\Etoc@dothis{\expandafter\Etoc@ref\@gobble}\fi + \ifEtoc@tocwithid\Etoc@dothis{\Etoc@localtableofcontents{\c@etoc@tocid}}\fi + \global\Etoc@isemptytocfalse + \ifEtoc@checksemptiness\Etoc@checkifempty\fi + \ifEtoc@isemptytoc + \ifEtoc@notocifnotoc + \expandafter\expandafter\expandafter\@gobble + \fi + \fi + \Etoc@tableofcontents + \endgroup + \ifEtoc@mustclosegroup\endgroup\fi + \Etoc@tocdepthreset + \Etoc@listofreset + \etocaftertochook + \@gobble\etoc@ + }% \Etoc@t@bleofcontents +\def\Etoc@table@fcontents{% + \refstepcounter{etoc@tocid}% + \Etoc@tocwithidfalse + \futurelet\Etoc@nexttoken\Etoc@t@bleofcontents +} +\def\Etoc@localtable@fcontents{% + \refstepcounter{etoc@tocid}% + \addtocontents{toc}{\string\etoc@startlocaltoc{\the\c@etoc@tocid}}% + \Etoc@tocwithidtrue + \futurelet\Etoc@nexttoken\Etoc@t@bleofcontents +} +\def\etoctableofcontents{% + \Etoc@openouttoc + \Etoc@tocdepthset + \begingroup + \@ifstar + {\let\Etoc@aftertitlehook\@empty\Etoc@table@fcontents} + {\def\Etoc@aftertitlehook{\etocaftertitlehook}\Etoc@table@fcontents}% +}% \etoctableofcontents +\def\etocifisstarred{\ifx\Etoc@aftertitlehook\@empty + \expandafter\@firstoftwo\else + \expandafter\@secondoftwo + \fi} +\let\etocoriginaltableofcontents\tableofcontents +\let\tableofcontents\etoctableofcontents +\let\Etoc@listofhook\@empty +\newcommand*\localtableofcontents{% + \Etoc@openouttoc + \Etoc@tocdepthset + \begingroup + \Etoc@listofhook + \@ifstar + {\let\Etoc@aftertitlehook\@empty\Etoc@localtable@fcontents} + {\def\Etoc@aftertitlehook{\etocaftertitlehook}\Etoc@localtable@fcontents}% +}% \localtableofcontents +\newcommand*\localtableofcontentswithrelativedepth[1]{% + \def\Etoc@@startlocaltochook{% + \global\c@tocdepth\numexpr\etoclocaltop+#1\relax + }% + \def\Etoc@listofreset{\let\Etoc@@startlocaltochook\@empty + \let\Etoc@listofreset\@empty}% + \localtableofcontents +}% \localtableofcontentswithrelativedepth +\newcommand\etocsettocstyle[2]{% + \Etoc@etocstylefalse + \Etoc@classstylefalse + \def\Etoc@tableofcontents@user@before{#1}% + \def\Etoc@tableofcontents@user@after {#2}% +}% +\def\etocstoretocstyleinto#1{% +%% \@ifdefinable#1{% + \edef#1{\noexpand\Etoc@etocstylefalse\noexpand\Etoc@classstylefalse + \def\noexpand\Etoc@tableofcontents@user@before{% + \unexpanded\expandafter{\Etoc@tableofcontents@user@before}% + }% + \def\noexpand\Etoc@tableofcontents@user@after{% + \unexpanded\expandafter{\Etoc@tableofcontents@user@after}% + }% + }% +%% }% +}% +\def\Etoc@tableofcontents {% + \Etoc@tableofcontents@etoc@before + \ifEtoc@localtoc\ifEtoc@etocstyle\expandafter\expandafter\expandafter\@gobble\fi\fi + \Etoc@tableofcontents@user@before + \Etoc@tableofcontents@contents + \ifEtoc@localtoc\ifEtoc@etocstyle\expandafter\expandafter\expandafter\@gobble\fi\fi + \Etoc@tableofcontents@user@after + \Etoc@tableofcontents@etoc@after + \@gobble\etoc@ +} +\def\Etoc@tableofcontents@etoc@before{% + \ifnum\c@tocdepth>\Etoc@minf + \else + \expandafter\Etoc@gobtoetoc@ + \fi + \Etoc@par + \Etoc@beforetitlehook + \etocbeforetitlehook + \Etoc@storetocdepth + \let\Etoc@savedcontentsline\contentsline + \let\contentsline\Etoc@etoccontentsline + \ifEtoc@standardlines + \else + \def\Etoc@do##1{% + \expandafter\def\csname etocsaved##1tocline\endcsname + {\PackageError{etoc}{% + \expandafter\string\csname etocsaved##1tocline\endcsname\space + has been deprecated\MessageBreak + at 1.1a and is removed at 1.2.\MessageBreak + Use \expandafter\string\csname l@##1\endcsname\space directly.\MessageBreak + Reported \on@line}% + {I will use \expandafter\string + \csname l@##1\endcsname\space myself for this time.% + }% + \csname l@##1\endcsname + }% + }% + \Etoc@dolevels + \fi +}% +\def\Etoc@tableofcontents@contents{% + \Etoc@tocdepthset + \ifEtoc@parskip\parskip\z@skip\fi + \Etoc@aftertitlehook + \gdef\etoclocaltop{-\thr@@}% + \Etoc@toctoc + \etocaftercontentshook +}% +\def\Etoc@tableofcontents@etoc@after{% + \@nobreakfalse + \Etoc@restoretocdepth + \ifx\Etoc@global\global + \@ifundefined{tof@finish} + {} + {\ifx\tof@finish\@empty + \else + \global\let\contentsline\Etoc@savedcontentsline + \fi + }% + \fi +} +\def\etocsetstyle#1{\ifcsname Etoc@#1@@\endcsname + \expandafter\Etoc@setstyle@a + \else + \expandafter\Etoc@setstyle@error + \fi {#1}% +} +\def\Etoc@setstyle@error #1{% + \PackageWarning{etoc}{`#1' is unknown to etoc. \space Did you\MessageBreak + forget some \string\etocsetlevel{#1}{}?\MessageBreak + Reported}% + \@gobblefour +} +\def\Etoc@setstyle@a #1{% + \edef\Etoc@tmp{\the\numexpr\csname Etoc@#1@@\endcsname}% + \if1\unless\ifnum\Etoc@tmp<\Etoc@maxlevel 0\fi + \unless\ifnum\Etoc@tmp>\Etoc@minf 0\fi1% + \Etoc@standardlinesfalse + \expandafter\Etoc@setstyle@b\expandafter\Etoc@tmp + \else + \ifnum\Etoc@tmp=\Etoc@maxlevel + \in@{.#1,}{.figure,.table,}% + \ifin@ + \PackageWarning{etoc} + {You can not use \string\etocsetstyle\space with `#1'.\MessageBreak + Check the package documentation (in particular about\MessageBreak + \string\etoclocallistoffigureshook/\string\etoclocallistoftableshook)% + \MessageBreak on how to customize + figure and table entries in local\MessageBreak lists. Reported}% + \else + \PackageInfo{etoc} + {Attempt to set the style of `#1',\MessageBreak + whose level is currently the maximal one \etocthemaxlevel,\MessageBreak + which is never displayed. \space This will be ignored\MessageBreak + but note that we do quit compatibility mode.\MessageBreak + Reported}% + \Etoc@standardlinesfalse + \fi + \else + \PackageWarning{etoc}{This should not happen. Reported}% + \fi + \expandafter\@gobblefour + \fi +} +\long\def\Etoc@setstyle@b#1#2#3#4#5{% + \expandafter\def\csname Etoc@begin@#1\endcsname {#2}% + \expandafter\def\csname Etoc@prefix@#1\endcsname {#3}% + \expandafter\def\csname Etoc@contents@#1\endcsname {#4}% + \expandafter\def\csname Etoc@end@#1\endcsname {#5}% +} +\def\Etoc@setstyle@e#1{% + \expandafter\let\csname Etoc@begin@#1\endcsname \@empty + \expandafter\let\csname Etoc@prefix@#1\endcsname \@empty + \expandafter\let\csname Etoc@contents@#1\endcsname \@empty + \expandafter\let\csname Etoc@end@#1\endcsname \@empty +} +\def\Etoc@storelines@a#1{% + \noexpand\Etoc@setstyle@b{#1}% + {\expandafter\Etoc@expandonce\csname Etoc@begin@#1\endcsname}% + {\expandafter\Etoc@expandonce\csname Etoc@prefix@#1\endcsname}% + {\expandafter\Etoc@expandonce\csname Etoc@contents@#1\endcsname}% + {\expandafter\Etoc@expandonce\csname Etoc@end@#1\endcsname}% +} +\def\Etoc@expandonce#1{\unexpanded\expandafter{#1}} +\def\etocstorelinestylesinto#1{% + \edef#1{\Etoc@storelines@a{-2}\Etoc@storelines@a{-1}\Etoc@storelines@a{0}% + \Etoc@storelines@a {1}\Etoc@storelines@a {2}\Etoc@storelines@a{3}% + \Etoc@storelines@a {4}\Etoc@storelines@a {5}% + \ifEtoc@deeplevels + \Etoc@storelines@a{6}\Etoc@storelines@a{7}\Etoc@storelines@a{8}% + \Etoc@storelines@a{9}\Etoc@storelines@a{10}\Etoc@storelines@a{11}% + \fi + }% +} +\def\etocstorethislinestyleinto#1#2{% + \edef#2{\expandafter\Etoc@storelines@a\expandafter{\number\etoclevel{#1}}}% +}% +\def\etocfontminustwo {\normalfont \LARGE \bfseries} +\def\etocfontminusone {\normalfont \large \bfseries} +\def\etocfontzero {\normalfont \large \bfseries} +\def\etocfontone {\normalfont \normalsize \bfseries} +\def\etocfonttwo {\normalfont \normalsize} +\def\etocfontthree {\normalfont \footnotesize} +\def\etocsepminustwo {4ex \@plus .5ex \@minus .5ex} +\def\etocsepminusone {4ex \@plus .5ex \@minus .5ex} +\def\etocsepzero {2.5ex \@plus .4ex \@minus .4ex} +\def\etocsepone {1.5ex \@plus .3ex \@minus .3ex} +\def\etocseptwo {.5ex \@plus .1ex \@minus .1ex} +\def\etocsepthree {.25ex \@plus .05ex \@minus .05ex} +\def\etocbaselinespreadminustwo {1} +\def\etocbaselinespreadminusone {1} +\def\etocbaselinespreadzero {1} +\def\etocbaselinespreadone {1} +\def\etocbaselinespreadtwo {1} +\def\etocbaselinespreadthree {.9} +\def\etocminustwoleftmargin {1.5em plus 0.5fil} +\def\etocminustworightmargin {1.5em plus -0.5fil} +\def\etocminusoneleftmargin {1em} +\def\etocminusonerightmargin {1em} +\def\etoctoclineleaders + {\hbox{\normalfont\normalsize\hb@xt@2ex {\hss.\hss}}} +\def\etocabbrevpagename {p.~} +\def\etocpartname {Part} +\def\etocbookname {Book} +\def\etocdefaultlines{% + \Etoc@standardlinesfalse + \etocdefaultlines@setbook + \etocdefaultlines@setpart + \etocdefaultlines@setchapter + \etocdefaultlines@setsection + \etocdefaultlines@setsubsection + \etocdefaultlines@setsubsubsection + \etocdefaultlines@setdeeperones +} +\def\etocnoprotrusion{\leavevmode\kern-\p@\kern\p@} +\@ifclassloaded{memoir}{% + \def\etocdefaultlines@setbook{% + \Etoc@setstyle@b + {-2}% + {\addpenalty\@M\etocskipfirstprefix} + {\addpenalty\@secpenalty} + {\begingroup + \etocfontminustwo + \addvspace{\etocsepminustwo}% + \parindent \z@ + \leftskip \etocminustwoleftmargin + \rightskip \etocminustworightmargin + \parfillskip \@flushglue + \vbox{\etocifnumbered{\etoclink{\etocbookname\enspace\etocthenumber:\quad}}{}% + \etocname + \baselineskip\etocbaselinespreadminustwo\baselineskip + \par}% + \addpenalty\@M\addvspace{\etocsepminusone}% + \endgroup} + {}% + } + }{\let\etocdefaultlines@setbook\@empty} +\def\etocdefaultlines@setpart{% +\Etoc@setstyle@b + {-1}% + {\addpenalty\@M\etocskipfirstprefix} + {\addpenalty\@secpenalty} + {\begingroup + \etocfontminusone + \addvspace{\etocsepminusone}% + \parindent \z@ + \leftskip \etocminusoneleftmargin + \rightskip \etocminusonerightmargin + \parfillskip \@flushglue + \vbox{\etocifnumbered{\etoclink{\etocpartname\enspace\etocthenumber.\quad}}{}% + \etocname + \baselineskip\etocbaselinespreadminusone\baselineskip + \par}% + \addpenalty\@M\addvspace{\etocsepzero}% + \endgroup} + {}% +} +\def\etocdefaultlines@setchapter{% +\Etoc@setstyle@b + {0}% + {\addpenalty\@M\etocskipfirstprefix} + {\addpenalty\@itempenalty} + {\begingroup + \etocfontzero + \addvspace{\etocsepzero}% + \parindent \z@ \parfillskip \@flushglue + \vbox{\etocifnumbered{\etocnumber.\enspace}{}\etocname + \baselineskip\etocbaselinespreadzero\baselineskip + \par}% + \endgroup} + {\addpenalty{-\@highpenalty}\addvspace{\etocsepminusone}}% +} +\def\etocdefaultlines@setsection{% +\Etoc@setstyle@b + {1}% + {\addpenalty\@M\etocskipfirstprefix} + {\addpenalty\@itempenalty} + {\begingroup + \etocfontone + \addvspace{\etocsepone}% + \parindent \z@ \parfillskip \z@ + \setbox\z@\vbox{\parfillskip\@flushglue + \etocname\par + \setbox\tw@\lastbox + \global\setbox\@ne\hbox{\unhbox\tw@\ }}% + \dimen\z@=\wd\@ne + \setbox\z@=\etoctoclineleaders + \advance\dimen\z@\wd\z@ + \etocifnumbered + {\setbox\tw@\hbox{\etocnumber, \etocabbrevpagename\etocpage\etocnoprotrusion}} + {\setbox\tw@\hbox{\etocabbrevpagename\etocpage\etocnoprotrusion}}% + \advance\dimen\z@\wd\tw@ + \ifdim\dimen\z@ < \linewidth + \vbox{\etocname~% + \leaders\box\z@\hfil\box\tw@ + \baselineskip\etocbaselinespreadone\baselineskip + \par}% + \else + \vbox{\etocname~% + \leaders\copy\z@\hfil\break + \hbox{}\leaders\box\z@\hfil\box\tw@ + \baselineskip\etocbaselinespreadone\baselineskip + \par}% + \fi + \endgroup} + {\addpenalty\@secpenalty\addvspace{\etocsepzero}}% +} +\def\etocdefaultlines@setsubsection{% +\Etoc@setstyle@b + {2}% + {\addpenalty\@medpenalty\etocskipfirstprefix} + {\addpenalty\@itempenalty} + {\begingroup + \etocfonttwo + \addvspace{\etocseptwo}% + \parindent \z@ \parfillskip \z@ + \setbox\z@\vbox{\parfillskip\@flushglue + \etocname\par\setbox\tw@\lastbox + \global\setbox\@ne\hbox{\unhbox\tw@}}% + \dimen\z@=\wd\@ne + \setbox\z@=\etoctoclineleaders + \advance\dimen\z@\wd\z@ + \etocifnumbered + {\setbox\tw@\hbox{\etocnumber, \etocabbrevpagename\etocpage\etocnoprotrusion}} + {\setbox\tw@\hbox{\etocabbrevpagename\etocpage\etocnoprotrusion}}% + \advance\dimen\z@\wd\tw@ + \ifdim\dimen\z@ < \linewidth + \vbox{\etocname~% + \leaders\box\z@\hfil\box\tw@ + \baselineskip\etocbaselinespreadtwo\baselineskip + \par}% + \else + \vbox{\etocname~% + \leaders\copy\z@\hfil\break + \hbox{}\leaders\box\z@\hfil\box\tw@ + \baselineskip\etocbaselinespreadtwo\baselineskip + \par}% + \fi + \endgroup} + {\addpenalty\@secpenalty\addvspace{\etocsepone}}% +} +\def\etocdefaultlines@setsubsubsection{% +\Etoc@setstyle@b + {3}% + {\addpenalty\@M + \etocfontthree + \vspace{\etocsepthree}% + \noindent + \etocskipfirstprefix} + {\allowbreak\,--\,} + {\etocname} + {.\hfil + \begingroup + \baselineskip\etocbaselinespreadthree\baselineskip + \par + \endgroup + \addpenalty{-\@highpenalty}} +} +\def\etocdefaultlines@setdeeperones{% +\Etoc@setstyle@e{4}% +\Etoc@setstyle@e{5}% +\ifEtoc@deeplevels + \Etoc@setstyle@e{6}% + \Etoc@setstyle@e{7}% + \Etoc@setstyle@e{8}% + \Etoc@setstyle@e{9}% + \Etoc@setstyle@e{10}% + \Etoc@setstyle@e{11}% +\fi +} +\def\etocabovetocskip{3.5ex \@plus 1ex \@minus .2ex} +\def\etocbelowtocskip{3.5ex \@plus 1ex \@minus .2ex} +\def\etoccolumnsep{2em} +\def\etocmulticolsep{0ex} +\def\etocmulticolpretolerance{-1} +\def\etocmulticoltolerance{200} +\def\etocdefaultnbcol{2} +\def\etocinnertopsep{2ex} +\newcommand\etocmulticolstyle[2][\etocdefaultnbcol]{% +\etocsettocstyle + {\let\etocoldpar\par + \addvspace{\etocabovetocskip}% + \ifnum #1>\@ne + \expandafter\@firstoftwo + \else \expandafter\@secondoftwo + \fi + {\multicolpretolerance\etocmulticolpretolerance + \multicoltolerance\etocmulticoltolerance + \setlength{\columnsep}{\etoccolumnsep}% + \setlength{\multicolsep}{\etocmulticolsep}% + \begin{multicols}{#1}[#2\etocoldpar\addvspace{\etocinnertopsep}]} + {#2\ifvmode\else\begingroup\interlinepenalty\@M\parskip\z@skip + \@@par\endgroup + \fi + \nobreak\addvspace{\etocinnertopsep}% + \pretolerance\etocmulticolpretolerance + \tolerance\etocmulticoltolerance}% + }% + {\ifnum #1>\@ne + \expandafter\@firstofone + \else \expandafter\@gobble + \fi + {\end{multicols}}% + \addvspace{\etocbelowtocskip}}% +} +\def\etocinnerbottomsep{3.5ex} +\def\etocinnerleftsep{2em} +\def\etocinnerrightsep{2em} +\def\etoctoprule{\hrule} +\def\etocleftrule{\vrule} +\def\etocrightrule{\vrule} +\def\etocbottomrule{\hrule} +\def\etoctoprulecolorcmd{\relax} +\def\etocbottomrulecolorcmd{\relax} +\def\etocleftrulecolorcmd{\relax} +\def\etocrightrulecolorcmd{\relax} +\def\etoc@ruledheading #1{% + \hb@xt@\linewidth{\color@begingroup + \hss #1\hss\hskip-\linewidth + \etoctoprulecolorcmd\leaders\etoctoprule\hss + \phantom{#1}% + \leaders\etoctoprule\hss\color@endgroup}% + \nointerlineskip\nobreak\vskip\etocinnertopsep} +\newcommand*\etocruledstyle[2][\etocdefaultnbcol]{% +\etocsettocstyle + {\addvspace{\etocabovetocskip}% + \ifnum #1>\@ne + \expandafter\@firstoftwo + \else \expandafter\@secondoftwo + \fi + {\multicolpretolerance\etocmulticolpretolerance + \multicoltolerance\etocmulticoltolerance + \setlength{\columnsep}{\etoccolumnsep}% + \setlength{\multicolsep}{\etocmulticolsep}% + \begin{multicols}{#1}[\etoc@ruledheading{#2}]} + {\etoc@ruledheading{#2}% + \pretolerance\etocmulticolpretolerance + \tolerance\etocmulticoltolerance}} + {\ifnum #1>\@ne\expandafter\@firstofone + \else \expandafter\@gobble + \fi + {\end{multicols}}% + \addvspace{\etocbelowtocskip}}} +\def\etocframedmphook{\relax} +\long\def\etocbkgcolorcmd{\relax} +\long\def\Etoc@relax{\relax} +\newbox\etoc@framed@titlebox +\newbox\etoc@framed@contentsbox +\newcommand*\etocframedstyle[2][\etocdefaultnbcol]{% +\etocsettocstyle{% + \addvspace{\etocabovetocskip}% + \sbox\z@{#2}% + \dimen\z@\dp\z@ + \ifdim\wd\z@<\linewidth \dp\z@\z@ \else \dimen\z@\z@ \fi + \setbox\etoc@framed@titlebox=\hb@xt@\linewidth{\color@begingroup + \hss + \ifx\etocbkgcolorcmd\Etoc@relax + \else + \sbox\tw@{\color{white}% + \vrule\@width\wd\z@\@height\ht\z@\@depth\dimen\z@}% + \ifdim\wd\z@<\linewidth \dp\tw@\z@\fi + \box\tw@ + \hskip-\wd\z@ + \fi + \copy\z@ + \hss + \hskip-\linewidth + \etoctoprulecolorcmd\leaders\etoctoprule\hss + \hskip\wd\z@ + \etoctoprulecolorcmd\leaders\etoctoprule\hss\color@endgroup}% + \setbox\z@\hbox{\etocleftrule\etocrightrule}% + \dimen\tw@\linewidth\advance\dimen\tw@-\wd\z@ + \advance\dimen\tw@-\etocinnerleftsep + \advance\dimen\tw@-\etocinnerrightsep + \setbox\etoc@framed@contentsbox=\vbox\bgroup + \hsize\dimen\tw@ + \kern\dimen\z@ + \vskip\etocinnertopsep + \hbox\bgroup + \begin{minipage}{\hsize}% + \etocframedmphook + \ifnum #1>\@ne + \expandafter\@firstoftwo + \else \expandafter\@secondoftwo + \fi + {\multicolpretolerance\etocmulticolpretolerance + \multicoltolerance\etocmulticoltolerance + \setlength{\columnsep}{\etoccolumnsep}% + \setlength{\multicolsep}{\etocmulticolsep}% + \begin{multicols}{#1}} + {\pretolerance\etocmulticolpretolerance + \tolerance\etocmulticoltolerance}} + {\ifnum #1>\@ne\expandafter\@firstofone + \else \expandafter\@gobble + \fi + {\end{multicols}\unskip }% + \end{minipage}% + \egroup + \vskip\etocinnerbottomsep + \egroup + \vbox{\hsize\linewidth + \ifx\etocbkgcolorcmd\Etoc@relax + \else + \kern\ht\etoc@framed@titlebox + \kern\dp\etoc@framed@titlebox + \hb@xt@\linewidth{\color@begingroup + \etocleftrulecolorcmd\etocleftrule + \etocbkgcolorcmd + \leaders\vrule + \@height\ht\etoc@framed@contentsbox + \@depth\dp\etoc@framed@contentsbox + \hss + \etocrightrulecolorcmd\etocrightrule + \color@endgroup}\nointerlineskip + \vskip-\dp\etoc@framed@contentsbox + \vskip-\ht\etoc@framed@contentsbox + \vskip-\dp\etoc@framed@titlebox + \vskip-\ht\etoc@framed@titlebox + \fi + \box\etoc@framed@titlebox\nointerlineskip + \hb@xt@\linewidth{\color@begingroup + {\etocleftrulecolorcmd\etocleftrule}% + \hss\box\etoc@framed@contentsbox\hss + \etocrightrulecolorcmd\etocrightrule\color@endgroup} + \nointerlineskip + \vskip\ht\etoc@framed@contentsbox + \vskip\dp\etoc@framed@contentsbox + \hb@xt@\linewidth{\color@begingroup\etocbottomrulecolorcmd + \leaders\etocbottomrule\hss\color@endgroup}} + \addvspace{\etocbelowtocskip}}} +\newcommand\etoc@multicoltoc[2][\etocdefaultnbcol]{% + \etocmulticolstyle[#1]{#2}% + \tableofcontents} +\newcommand\etoc@multicoltoci[2][\etocdefaultnbcol]{% + \etocmulticolstyle[#1]{#2}% + \tableofcontents*} +\newcommand\etoc@local@multicoltoc[2][\etocdefaultnbcol]{% + \etocmulticolstyle[#1]{#2}% + \localtableofcontents} +\newcommand\etoc@local@multicoltoci[2][\etocdefaultnbcol]{% + \etocmulticolstyle[#1]{#2}% + \localtableofcontents*} +\newcommand*\etoc@ruledtoc[2][\etocdefaultnbcol]{% + \etocruledstyle[#1]{#2}% + \tableofcontents} +\newcommand*\etoc@ruledtoci[2][\etocdefaultnbcol]{% + \etocruledstyle[#1]{#2}% + \tableofcontents*} +\newcommand*\etoc@local@ruledtoc[2][\etocdefaultnbcol]{% + \etocruledstyle[#1]{#2}% + \localtableofcontents} +\newcommand*\etoc@local@ruledtoci[2][\etocdefaultnbcol]{% + \etocruledstyle[#1]{#2}% + \localtableofcontents*} +\newcommand*\etoc@framedtoc[2][\etocdefaultnbcol]{% + \etocframedstyle[#1]{#2}% + \tableofcontents} +\newcommand*\etoc@framedtoci[2][\etocdefaultnbcol]{% + \etocframedstyle[#1]{#2}% + \tableofcontents*} +\newcommand*\etoc@local@framedtoc[2][\etocdefaultnbcol]{% + \etocframedstyle[#1]{#2}% + \localtableofcontents} +\newcommand*\etoc@local@framedtoci[2][\etocdefaultnbcol]{% + \etocframedstyle[#1]{#2}% + \localtableofcontents*} +\def\etocmulticol{\begingroup + \Etoc@mustclosegrouptrue + \@ifstar + {\etoc@multicoltoci} + {\etoc@multicoltoc}} +\def\etocruled{\begingroup + \Etoc@mustclosegrouptrue + \@ifstar + {\etoc@ruledtoci} + {\etoc@ruledtoc}} +\def\etocframed{\begingroup + \Etoc@mustclosegrouptrue + \@ifstar + {\etoc@framedtoci} + {\etoc@framedtoc}} +\def\etoclocalmulticol{\begingroup + \Etoc@mustclosegrouptrue + \@ifstar + {\etoc@local@multicoltoci} + {\etoc@local@multicoltoc}} +\def\etoclocalruled{\begingroup + \Etoc@mustclosegrouptrue + \@ifstar + {\etoc@local@ruledtoci} + {\etoc@local@ruledtoc}} +\def\etoclocalframed{\begingroup + \Etoc@mustclosegrouptrue + \@ifstar + {\etoc@local@framedtoci} + {\etoc@local@framedtoc}} +\def\etocmemoirtoctotocfmt #1#2{% + \PackageWarning{etoc} + {\string\etocmemoirtoctotocfmt\space is deprecated.\MessageBreak + Use in its place \string\etocsettoclineforclasstoc,\MessageBreak + and \string\etocsettoclineforclasslistof{toc} (or {lof}, {lot}). + I will do this now.\MessageBreak + Reported}% + \etocsettoclineforclasstoc{#1}{#2}% + \etocsettoclineforclasslistof{toc}{#1}{#2}% +} +\def\etocsettoclineforclasstoc #1#2{% + \def\etocclassmaintocaddtotoc{\etocglobalheadtotoc{#1}{#2}}% +} +\def\etocsettoclineforclasslistof #1#2#3{% + \@namedef{etocclasslocal#1addtotoc}{\etoclocalheadtotoc{#2}{#3}}% +} +\let\etocclasslocaltocaddtotoc\@empty +\let\etocclasslocallofaddtotoc\@empty +\let\etocclasslocallotaddtotoc\@empty +\ifdefined\c@chapter + \def\etocclasslocaltocmaketitle{\section*{\localcontentsname}} + \def\etocclasslocallofmaketitle{\section*{\locallistfigurename}} + \def\etocclasslocallotmaketitle{\section*{\locallisttablename}} + \etocsettoclineforclasstoc {chapter}{\contentsname} + \etocsettoclineforclasslistof{toc}{section}{\localcontentsname} + \etocsettoclineforclasslistof{lof}{section}{\locallistfigurename} + \etocsettoclineforclasslistof{lot}{section}{\locallisttablename} +\else + \def\etocclasslocaltocmaketitle{\subsection*{\localcontentsname}}% + \def\etocclasslocallofmaketitle{\subsection*{\locallistfigurename}}% + \def\etocclasslocallotmaketitle{\subsection*{\locallisttablename}}% + \etocsettoclineforclasstoc {section}{\contentsname} + \etocsettoclineforclasslistof{toc}{subsection}{\localcontentsname} + \etocsettoclineforclasslistof{lof}{subsection}{\locallistfigurename} + \etocsettoclineforclasslistof{lot}{subsection}{\locallisttablename} +\fi +\def\etocclasslocalperhapsaddtotoc #1{% + \etocifisstarred + {} + {\csname ifEtoc@local#1totoc\endcsname + \csname etocclasslocal#1addtotoc\endcsname + \fi + }% +} +\def\etocarticlestyle{% + \etocsettocstyle + {\ifEtoc@localtoc + \@nameuse{etocclasslocal\Etoc@currext maketitle}% + \etocclasslocalperhapsaddtotoc\Etoc@currext + \else + \section *{\contentsname + \@mkboth {\MakeUppercase \contentsname} + {\MakeUppercase \contentsname}}% + \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}% + \fi + } + {}% +} +\def\etocarticlestylenomarks{% + \etocsettocstyle + {\ifEtoc@localtoc + \@nameuse{etocclasslocal\Etoc@currext maketitle}% + \etocclasslocalperhapsaddtotoc\Etoc@currext + \else + \section *{\contentsname}% + \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}% + \fi + } + {}% +} +\def\etocbookstyle{% + \etocsettocstyle + {\if@twocolumn \@restonecoltrue \onecolumn \else \@restonecolfalse \fi + \ifEtoc@localtoc + \@nameuse{etocclasslocal\Etoc@currext maketitle}% + \etocclasslocalperhapsaddtotoc\Etoc@currext + \else + \chapter *{\contentsname + \@mkboth {\MakeUppercase \contentsname} + {\MakeUppercase \contentsname}}% + \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}% + \fi + }% + {\if@restonecol \twocolumn \fi}% +} +\def\etocbookstylenomarks{% + \etocsettocstyle + {\if@twocolumn \@restonecoltrue \onecolumn \else \@restonecolfalse \fi + \ifEtoc@localtoc + \@nameuse{etocclasslocal\Etoc@currext maketitle}% + \etocclasslocalperhapsaddtotoc\Etoc@currext + \else + \chapter *{\contentsname}% + \etocifisstarred{}{\etocifmaintoctotoc{\etocclassmaintocaddtotoc}{}}% + \fi + }% + {\if@restonecol \twocolumn \fi}% +} +\let\etocreportstyle\etocbookstyle +\let\etocreportstylenomarks\etocbookstylenomarks +\def\etocmemoirstyle{% + \etocsettocstyle + {\ensureonecol \par \begingroup \phantomsection + \ifx\Etoc@aftertitlehook\@empty + \else + \ifmem@em@starred@listof + \else + \ifEtoc@localtoc + \etocclasslocalperhapsaddtotoc\Etoc@currext + \else + \ifEtoc@maintoctotoc + \etocclassmaintocaddtotoc + \fi + \fi + \fi + \fi + \ifEtoc@localtoc + \@namedef{@\Etoc@currext maketitle}{% + \@nameuse{etocclasslocal\Etoc@currext maketitle}% + }% + \fi + \@nameuse {@\Etoc@currext maketitle} %<< space token here from memoir code + \ifx\Etoc@aftertitlehook\@empty + \else + \Etoc@aftertitlehook \let \Etoc@aftertitlehook \relax + \fi + \parskip \cftparskip \@nameuse {cft\Etoc@currext beforelisthook}% + }% + {\@nameuse {cft\Etoc@currext afterlisthook}% + \endgroup\restorefromonecol + }% +} +\let\Etoc@beforetitlehook\@empty +\if1\@ifclassloaded{scrartcl}0{\@ifclassloaded{scrbook}0{\@ifclassloaded{scrreprt}01}}% +\expandafter\@gobble +\else + \ifdefined\setuptoc + \def\Etoc@beforetitlehook{% + \ifEtoc@localtoc + \etocclasslocalperhapsaddtotoc\Etoc@currext + \setuptoc{\Etoc@currext}{leveldown}% + \else + \etocifisstarred{}{\etocifmaintoctotoc{\setuptoc{toc}{totoc}}}% + \fi + }% + \fi +\expandafter\@firstofone +\fi +{\def\etocclasslocalperhapsaddtotoc #1{% + \etocifisstarred + {}% + {\csname ifEtoc@local#1totoc\endcsname + \setuptoc{\Etoc@currext}{totoc}% + \fi + }% + }% +} +\ifdefined\Iftocfeature + \def\etoc@Iftocfeature{\Iftocfeature}% +\else + \def\etoc@Iftocfeature{\iftocfeature}% +\fi +\def\etocscrartclstyle{% + \etocsettocstyle + {\ifx\Etoc@currext\Etoc@tocext + \expandafter\@firstofone + \else + \expandafter\@gobble + \fi + {\let\if@dynlist\if@tocleft}% + \edef\@currext{\Etoc@currext}% + \@ifundefined{listof\@currext name}% + {\def\list@fname{\listofname~\@currext}}% + {\expandafter\let\expandafter\list@fname + \csname listof\@currext name\endcsname}% + \etoc@Iftocfeature {\@currext}{onecolumn} + {\etoc@Iftocfeature {\@currext}{leveldown} + {} + {\if@twocolumn \aftergroup \twocolumn \onecolumn \fi }} + {}% + \etoc@Iftocfeature {\@currext}{numberline}% + {\def \nonumberline {\numberline {}}}{}% + \expandafter\tocbasic@listhead\expandafter {\list@fname}% + \begingroup \expandafter \expandafter \expandafter + \endgroup \expandafter + \ifx + \csname microtypesetup\endcsname \relax + \else + \etoc@Iftocfeature {\@currext}{noprotrusion}{} + {\microtypesetup {protrusion=false}% + \PackageInfo {tocbasic}% + {character protrusion at \@currext\space deactivated}}% + \fi + \etoc@Iftocfeature{\@currext}{noparskipfake}{}{% + \ifvmode \@tempskipa\lastskip \vskip-\lastskip + \addtolength{\@tempskipa}{\parskip}\vskip\@tempskipa\fi + }% + \setlength {\parskip }{\z@ }% + \setlength {\parindent }{\z@ }% + \setlength {\parfillskip }{\z@ \@plus 1fil}% + \csname tocbasic@@before@hook\endcsname + \csname tb@\@currext @before@hook\endcsname + }% end of before_toc + {% start of after_toc + \providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file + \edef\@currext{\Etoc@currext}% + \csname tb@\@currext @after@hook\endcsname + \csname tocbasic@@after@hook\endcsname + }% end of after_toc +} +\let\etocscrbookstyle\etocscrartclstyle +\let\etocscrreprtstyle\etocscrartclstyle +\def\etocclasstocstyle{\etocarticlestyle} +\newcommand*\etocmarkboth[1]{% + \@mkboth{\MakeUppercase{#1}}{\MakeUppercase{#1}}} +\newcommand*\etocmarkbothnouc[1]{\@mkboth{#1}{#1}} +\newcommand\etoctocstyle[3][section]{\etocmulticolstyle[#2]% + {\csname #1\endcsname *{#3}}} +\newcommand\etoctocstylewithmarks[4][section]{\etocmulticolstyle[#2]% + {\csname #1\endcsname *{#3\etocmarkboth{#4}}}} +\newcommand\etoctocstylewithmarksnouc[4][section]{\etocmulticolstyle[#2]% + {\csname #1\endcsname *{#3\etocmarkbothnouc{#4}}}} +\def\Etoc@redefetocstylesforchapters{% + \renewcommand\etoctocstylewithmarks[4][chapter]{% + \etocmulticolstyle[##2]{\csname ##1\endcsname *{##3\etocmarkboth{##4}}}% + } + \renewcommand\etoctocstylewithmarksnouc[4][chapter]{% + \etocmulticolstyle[##2]{\csname ##1\endcsname *{##3\etocmarkbothnouc{##4}}}% + } + \renewcommand\etoctocstyle[3][chapter]{% + \etocmulticolstyle[##2]{\csname ##1\endcsname *{##3}} + } +} +\@ifclassloaded{scrartcl} + {\renewcommand*\etocclasstocstyle{\etocscrartclstyle}}{} +\@ifclassloaded{book} + {\renewcommand*\etocfontone{\normalfont\normalsize} + \renewcommand*\etocclasstocstyle{\etocbookstyle} + \Etoc@redefetocstylesforchapters}{} +\@ifclassloaded{report} + {\renewcommand*\etocfontone{\normalfont\normalsize} + \renewcommand*\etocclasstocstyle{\etocreportstyle} + \Etoc@redefetocstylesforchapters}{} +\@ifclassloaded{scrbook} + {\renewcommand*\etocfontone{\normalfont\normalsize} + \renewcommand*\etocclasstocstyle{\etocscrbookstyle} + \Etoc@redefetocstylesforchapters}{} +\@ifclassloaded{scrreprt} + {\renewcommand*\etocfontone{\normalfont\normalsize} + \renewcommand*\etocclasstocstyle{\etocscrreprtstyle} + \Etoc@redefetocstylesforchapters}{} +\@ifclassloaded{memoir} + {\renewcommand*\etocfontone{\normalfont\normalsize} + \renewcommand*\etocclasstocstyle{\etocmemoirstyle} + \Etoc@redefetocstylesforchapters}{} +\def\etoctocloftstyle {% + \etocsettocstyle{% + \@cfttocstart + \par + \begingroup + \parindent\z@ \parskip\cftparskip + \@nameuse{@cftmake\Etoc@currext title}% + \ifEtoc@localtoc + \etoctocloftlocalperhapsaddtotoc\Etoc@currext + \else + \etocifisstarred {}{\ifEtoc@maintoctotoc\@cftdobibtoc\fi}% + \fi + }% + {% + \endgroup + \@cfttocfinish + }% +} +\def\etoctocloftlocalperhapsaddtotoc#1{% + \etocifisstarred + {}% + {\csname ifEtoc@local#1totoc\endcsname + \ifdefined\c@chapter\def\@tocextra{@section}\else\def\@tocextra{@subsection}\fi + \csname @cftdobib#1\endcsname + \fi + }% +} +\def\etoctocbibindstyle {% + \etocsettocstyle {% + \toc@start + \ifEtoc@localtoc + \@nameuse{etocclasslocal\Etoc@currext maketitle}% + \etocclasslocalperhapsaddtotoc\Etoc@currext + \else + \etoc@tocbibind@dotoctitle + \fi + }% + {\toc@finish}% +} +\def\etoc@tocbibind@dotoctitle {% + \if@bibchapter + \etocifisstarred + {\chapter*{\contentsname}\prw@mkboth{\contentsname} % id. + }% + {\ifEtoc@maintoctotoc + \toc@chapter{\contentsname} %<-space from original + \else + \chapter*{\contentsname}\prw@mkboth{\contentsname} % id. + \fi + }% + \else + \etocifisstarred + {\@nameuse{\@tocextra}*{\contentsname\prw@mkboth{\contentsname}} %<-space + } + {\ifEtoc@maintoctotoc + \toc@section{\@tocextra}{\contentsname} %<-space from original + \else + \@nameuse{\@tocextra}*{\contentsname\prw@mkboth{\contentsname}} % id. + \fi + }% + \fi +}% +\@ifclassloaded{memoir} +{} +{% memoir not loaded + \@ifpackageloaded{tocloft} + {\if@cftnctoc\else + \ifEtoc@keeporiginaltoc + \else + \AtBeginDocument{\let\tableofcontents\etoctableofcontents}% + \fi + \fi } + {\AtBeginDocument + {\@ifpackageloaded{tocloft} + {\if@cftnctoc\else + \PackageWarningNoLine {etoc} + {Package `tocloft' was loaded after `etoc'.\MessageBreak + To prevent it from overwriting \protect\tableofcontents, it will\MessageBreak + be tricked into believing to have been loaded with its\MessageBreak + option `titles'. \space But this will cause the `tocloft'\MessageBreak + customization of the titles of the main list of figures\MessageBreak + and list of tables to not apply either.\MessageBreak + You should load `tocloft' before `etoc'.}% + \AtEndDocument{\PackageWarning{etoc} + {Please load `tocloft' before `etoc'!\@gobbletwo}}% + \fi + \@cftnctoctrue }% + {}% + }% + }% +} +\@ifclassloaded{memoir} +{} +{% memoir not loaded + \AtBeginDocument{% + \@ifpackageloaded{tocloft} + {% + \def\etocclasstocstyle{% + \etoctocloftstyle + \Etoc@classstyletrue + }% + \ifEtoc@etocstyle + \ifEtoc@classstyle + \etocclasstocstyle + \Etoc@etocstyletrue + \fi + \else + \ifEtoc@classstyle + \etocclasstocstyle + \fi + \fi + }% + {% no tocloft + \@ifpackageloaded {tocbibind} + {\if@dotoctoc + \def\etocclasstocstyle{% + \etoctocbibindstyle + \Etoc@classstyletrue + }% + \ifEtoc@etocstyle + \ifEtoc@classstyle + \etocclasstocstyle + \Etoc@etocstyletrue + \fi + \else + \ifEtoc@classstyle + \etocclasstocstyle + \fi + \fi + \ifEtoc@keeporiginaltoc + \else + \let\tableofcontents\etoctableofcontents + \fi + }% + {}% + }% + \@ifpackageloaded{tocbibind} + {% tocbibind, perhaps with tocloft + \if@dotoctoc + \ifEtoc@keeporiginaltoc + \else + \let\tableofcontents\etoctableofcontents + \fi + \etocsetup{maintoctotoc,localtoctotoc}% + \PackageInfo{etoc}{% + Setting (or re-setting) the options `maintoctotoc' and\MessageBreak + `localtoctotoc' to true as tocbibind was detected and\MessageBreak + found to be configured for `TOC to toc'.\MessageBreak + Reported at begin document}% + \fi + \if@dotoclof + \ifEtoc@lof + \etocsetup{localloftotoc}% + \PackageInfo{etoc}{% + Setting (or re-setting) `localloftotoc=true' as the\MessageBreak + package tocbibind was detected and is configured for\MessageBreak + `LOF to toc'. Reported at begin document}% + \fi + \fi + \if@dotoclot + \ifEtoc@lot + \etocsetup{locallottotoc}% + \PackageInfo{etoc}{% + Setting (or re-setting) `locallottotoc=true' as the\MessageBreak + package tocbibind was detected and is configured for\MessageBreak + `LOT to toc'. Reported at begin document}% + \fi + \fi + }% end of tocbibind branch + {}% + }% end of at begin document +}% end of not with memoir branch +\def\Etoc@addtocontents #1#2{% + \addtocontents {toc}{% + \protect\contentsline{#1}{#2}{\thepage}{\ifEtoc@hyperref\@currentHref\fi}% + \ifdefined\protected@file@percent\protected@file@percent\fi + }% +} +\def\Etoc@addcontentsline@ #1#2#3{% + \@namedef{toclevel@#1}{#3}\addcontentsline {toc}{#1}{#2}% +} +\DeclareRobustCommand*{\etoctoccontentsline} + {\@ifstar{\Etoc@addcontentsline@}{\Etoc@addtocontents}} +\def\Etoc@addtocontents@immediately#1#2{% + \begingroup + \let\Etoc@originalwrite\write + \def\write{\immediate\Etoc@originalwrite}% + \Etoc@addtocontents{#1}{#2}% + \endgroup +} +\def\Etoc@addcontentsline@@immediately#1#2#3{% + \begingroup + \let\Etoc@originalwrite\write + \def\write{\immediate\Etoc@originalwrite}% + \Etoc@addcontentsline@{#1}{#2}{#3}% + \endgoroup +} +\DeclareRobustCommand*{\etocimmediatetoccontentsline} + {\@ifstar{\Etoc@addcontentsline@@immediately}{\Etoc@addtocontents@immediately}} +\def\Etoc@storetocdepth {\xdef\Etoc@savedtocdepth{\number\c@tocdepth}} +\def\Etoc@restoretocdepth {\global\c@tocdepth\Etoc@savedtocdepth\relax} +\def\etocobeytoctocdepth {\def\etoc@settocdepth + {\afterassignment\Etoc@@nottoodeep \global\c@tocdepth}} +\def\Etoc@@nottoodeep {\ifnum\Etoc@savedtocdepth<\c@tocdepth + \global\c@tocdepth\Etoc@savedtocdepth\relax\fi } +\def\etocignoretoctocdepth {\let\etoc@settocdepth\@gobble } +\def\etocsettocdepth {\futurelet\Etoc@nexttoken\Etoc@set@tocdepth } +\def\Etoc@set@tocdepth {\ifx\Etoc@nexttoken\bgroup + \expandafter\Etoc@set@tocdepth@ + \else\expandafter\Etoc@set@toctocdepth + \fi } +\def\Etoc@set@tocdepth@ #1{\@ifundefined {Etoc@#1@@} + {\PackageWarning{etoc} + {Unknown sectioning unit #1, \protect\etocsettocdepth\space ignored}} + {\global\c@tocdepth\csname Etoc@#1@@\endcsname}% +} +\def\Etoc@set@toctocdepth #1#{\Etoc@set@toctocdepth@ } +\def\Etoc@set@toctocdepth@ #1{% + \@ifundefined{Etoc@#1@@}% + {\PackageWarning{etoc} + {Unknown sectioning depth #1, \protect\etocsettocdepth.toc ignored}}% + {\addtocontents {toc} + {\protect\etoc@settocdepth\expandafter\protect\csname Etoc@#1@@\endcsname}}% +} +\def\etocimmediatesettocdepth #1#{\Etoc@set@toctocdepth@immediately} +\def\Etoc@set@toctocdepth@immediately #1{% + \@ifundefined{Etoc@#1@@}% + {\PackageWarning{etoc} + {Unknown sectioning depth #1, \protect\etocimmediatesettocdepth.toc ignored}}% + {\begingroup + \let\Etoc@originalwrite\write + \def\write{\immediate\Etoc@originalwrite}% + \addtocontents {toc} + {\protect\etoc@settocdepth\expandafter\protect + \csname Etoc@#1@@\endcsname}% + \endgroup + }% +} +\def\etocdepthtag #1#{\Etoc@depthtag } +\def\Etoc@depthtag #1{\addtocontents {toc}{\protect\etoc@depthtag {#1}}} +\def\etocimmediatedepthtag #1#{\Etoc@depthtag@immediately } +\def\Etoc@depthtag@immediately #1{% + \begingroup + \let\Etoc@originalwrite\write + \def\write{\immediate\Etoc@originalwrite}% + \addtocontents {toc}{\protect\etoc@depthtag {#1}}% + \endgroup +} +\def\etocignoredepthtags {\let\etoc@depthtag \@gobble } +\def\etocobeydepthtags {\let\etoc@depthtag \Etoc@depthtag@ } +\def\Etoc@depthtag@ #1{\@ifundefined{Etoc@depthof@#1}% + {}% ignore in silence if tag has no associated depth + {\afterassignment\Etoc@@nottoodeep + \global\c@tocdepth\csname Etoc@depthof@#1\endcsname}% +} +\def\etocsettagdepth #1#2{\@ifundefined{Etoc@#2@@}% + {\PackageWarning{etoc} + {Unknown sectioning depth #2, \protect\etocsettagdepth\space ignored}}% + {\@namedef{Etoc@depthof@#1}{\@nameuse{Etoc@#2@@}}}% +} +\def\Etoc@tocvsec@err #1{\PackageError {etoc} + {The command \protect#1\space is incompatible with `etoc'} + {Use \protect\etocsettocdepth.toc as replacement}% +}% +\AtBeginDocument {% + \@ifclassloaded{memoir} + {\PackageInfo {etoc} + {Regarding `memoir' class command \protect\settocdepth, consider\MessageBreak + \protect\etocsettocdepth.toc as a drop-in replacement with more\MessageBreak + capabilities (see `etoc' manual). \space + Also, \protect\etocsettocdepth\MessageBreak + and \protect\etocsetnexttocdepth\space should be used in place of\MessageBreak + `memoir' command \protect\maxtocdepth\@gobble}% + }% + {\@ifpackageloaded {tocvsec2}{% + \def\maxtocdepth #1{\Etoc@tocvsec@err \maxtocdepth }% + \def\settocdepth #1{\Etoc@tocvsec@err \settocdepth }% + \def\resettocdepth {\@ifstar {\Etoc@tocvsec@err \resettocdepth }% + {\Etoc@tocvsec@err \resettocdepth }% + }% + \def\save@tocdepth #1#2#3{}% + \let\reset@tocdepth\relax + \let\remax@tocdepth\relax + \let\tableofcontents\etoctableofcontents + \PackageWarningNoLine {etoc} + {Package `tocvsec2' detected and its modification of\MessageBreak + \protect\tableofcontents\space reverted. \space Use + \protect\etocsettocdepth.toc\MessageBreak as a replacement + for `tocvsec2' toc-related commands}% + }% tocvsec2 loaded + {}% tocvsec2 not loaded + }% +}% +\def\invisibletableofcontents {\etocsetnexttocdepth {-3}\tableofcontents }% +\def\invisiblelocaltableofcontents + {\etocsetnexttocdepth {-3}\localtableofcontents }% +\def\etocsetnexttocdepth #1{% + \@ifundefined{Etoc@#1@@} + {\PackageWarning{etoc} + {Unknown sectioning unit #1, \protect\etocsetnextocdepth\space ignored}} + {\Etoc@setnexttocdepth{\csname Etoc@#1@@\endcsname}}% +}% +\def\Etoc@setnexttocdepth#1{% + \def\Etoc@tocdepthset{% + \Etoc@tocdepthreset + \edef\Etoc@tocdepthreset {% + \global\c@tocdepth\the\c@tocdepth\space + \global\let\noexpand\Etoc@tocdepthreset\noexpand\@empty + }% + \global\c@tocdepth#1% + \global\let\Etoc@tocdepthset\@empty + }% +}% +\let\Etoc@tocdepthreset\@empty +\let\Etoc@tocdepthset \@empty +\def\etocsetlocaltop #1#{\Etoc@set@localtop}% +\def\Etoc@set@localtop #1{% + \@ifundefined{Etoc@#1@@}% + {\PackageWarning{etoc} + {Unknown sectioning depth #1, \protect\etocsetlocaltop.toc ignored}}% + {\addtocontents {toc} + {\protect\etoc@setlocaltop\expandafter\protect\csname Etoc@#1@@\endcsname}}% +}% +\def\etocimmediatesetlocaltop #1#{\Etoc@set@localtop@immediately}% +\def\Etoc@set@localtop@immediately #1{% + \@ifundefined{Etoc@#1@@}% + {\PackageWarning{etoc} + {Unknown sectioning depth #1, \protect\etocimmediatesetlocaltop.toc ignored}}% + {\begingroup + \let\Etoc@originalwrite\write + \def\write{\immediate\Etoc@originalwrite}% + \addtocontents {toc} + {\protect\etoc@setlocaltop\expandafter\protect + \csname Etoc@#1@@\endcsname}% + \endgroup + }% +}% +\def\etoc@setlocaltop #1{% + \ifnum#1=\Etoc@maxlevel + \Etoc@skipthisonetrue + \else + \Etoc@skipthisonefalse + \global\let\Etoc@level #1% + \global\let\Etoc@virtualtop #1% + \ifEtoc@localtoc + \ifEtoc@stoptoc + \Etoc@skipthisonetrue + \else + \ifEtoc@notactive + \Etoc@skipthisonetrue + \else + \unless\ifnum\Etoc@level>\etoclocaltop + \Etoc@skipthisonetrue + \global\Etoc@stoptoctrue + \fi + \fi + \fi + \fi + \fi + \let\Etoc@next\@empty + \ifEtoc@skipthisone + \else + \ifnum\Etoc@level>\c@tocdepth + \else + \ifEtoc@standardlines + \else + \let\Etoc@next\Etoc@setlocaltop@doendsandbegin + \fi + \fi + \fi + \Etoc@next +}% +\def\Etoc@setlocaltop@doendsandbegin{% + \Etoc@doendsandbegin + \global\Etoc@skipprefixfalse +} +\addtocontents {toc}{\protect\@ifundefined{etoctocstyle}% + {\let\protect\etoc@startlocaltoc\protect\@gobble + \let\protect\etoc@settocdepth\protect\@gobble + \let\protect\etoc@depthtag\protect\@gobble + \let\protect\etoc@setlocaltop\protect\@gobble}{}}% +\def\etocstandardlines {\Etoc@standardlinestrue} +\def\etoctoclines {\Etoc@standardlinesfalse} +\etocdefaultlines +\etocstandardlines +\def\etocstandarddisplaystyle{% + \PackageWarningNoLine{etoc}{% + \string\etocstandarddisplaystyle \on@line\MessageBreak + is deprecated. \space Please use \string\etocclasstocstyle}% +} +\expandafter\def\expandafter\etocclasstocstyle\expandafter{% + \etocclasstocstyle + \Etoc@classstyletrue +} +\def\etocetoclocaltocstyle{\Etoc@etocstyletrue} +\def\etocusertocstyle{\Etoc@etocstylefalse} +\etocclasstocstyle +\etocetoclocaltocstyle +\etocobeytoctocdepth +\etocobeydepthtags +\let\etocbeforetitlehook \@empty +\let\etocaftertitlehook \@empty +\let\etocaftercontentshook \@empty +\let\etocaftertochook \@empty +\def\etockeeporiginaltableofcontents + {\Etoc@keeporiginaltoctrue\let\tableofcontents\etocoriginaltableofcontents}% +\endinput +%% +%% End of file `etoc.sty'. diff --git a/documentation/latex/field__variable_8h_source.tex b/documentation/latex/field__variable_8h_source.tex new file mode 100644 index 00000000..13accbe0 --- /dev/null +++ b/documentation/latex/field__variable_8h_source.tex @@ -0,0 +1,51 @@ +\doxysection{field\+\_\+variable.\+h} +\hypertarget{field__variable_8h_source}{}\label{field__variable_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/storage/field\_variable.h@{/home/jonat/Documents/01\_Studium/NumSim/src/storage/field\_variable.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ "{}array2D.h"{}}} +\DoxyCodeLine{00008\ } + + + + + + + +\DoxyCodeLine{00017\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classArray2D}{Array2D}}} +\DoxyCodeLine{00018\ \{} +\DoxyCodeLine{00019\ \textcolor{keyword}{public}:} + + + + + + +\DoxyCodeLine{00027\ \ \ \ \ \mbox{\hyperlink{classFieldVariable_aa0985778bc6331b74904a03c3ef67a98}{FieldVariable}}(std::array\ \mbox{\hyperlink{classArray2D_accf87be860645d6c50d6ba6fa39ec6f9}{size}},\ std::array\ origin,\ std::array\ meshWidth);} +\DoxyCodeLine{00028\ } + + + + + + + +\DoxyCodeLine{00037\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classFieldVariable_a2949624f1d2d7e29872f743db0b1d83b}{interpolateAt}}(\textcolor{keywordtype}{double}\ x,\ \textcolor{keywordtype}{double}\ y)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00038\ } + + + + +\DoxyCodeLine{00044\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classFieldVariable_a55168fd422c70c8386ba311909427cf7}{findAbsMax}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00045\ } +\DoxyCodeLine{00046\ \textcolor{keyword}{private}:} +\DoxyCodeLine{00047\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ origin\_;\ \ \ \ } +\DoxyCodeLine{00048\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ meshWidth\_;\ } +\DoxyCodeLine{00049\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/files.tex b/documentation/latex/files.tex new file mode 100644 index 00000000..17244b8a --- /dev/null +++ b/documentation/latex/files.tex @@ -0,0 +1,20 @@ +\doxysection{File List} +Here is a list of all documented files with brief descriptions\+:\begin{DoxyCompactList} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/\mbox{\hyperlink{computation_8h_source}{computation.\+h}} }{\pageref{computation_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/boundary/\mbox{\hyperlink{boundary_8h_source}{boundary.\+h}} }{\pageref{boundary_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/boundary/\mbox{\hyperlink{mask_8h_source}{mask.\+h}} }{\pageref{mask_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/discretization/\mbox{\hyperlink{central__differences_8h_source}{central\+\_\+differences.\+h}} }{\pageref{central__differences_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/discretization/\mbox{\hyperlink{discretization_8h_source}{discretization.\+h}} }{\pageref{discretization_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/discretization/\mbox{\hyperlink{donor__cell_8h_source}{donor\+\_\+cell.\+h}} }{\pageref{donor__cell_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/discretization/\mbox{\hyperlink{staggered__grid_8h_source}{staggered\+\_\+grid.\+h}} }{\pageref{staggered__grid_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/output\+\_\+writer/\mbox{\hyperlink{output__writer_8h_source}{output\+\_\+writer.\+h}} }{\pageref{output__writer_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/output\+\_\+writer/\mbox{\hyperlink{output__writer__paraview_8h_source}{output\+\_\+writer\+\_\+paraview.\+h}} }{\pageref{output__writer__paraview_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/output\+\_\+writer/\mbox{\hyperlink{output__writer__text_8h_source}{output\+\_\+writer\+\_\+text.\+h}} }{\pageref{output__writer__text_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/settings\+\_\+parser/\mbox{\hyperlink{settings_8h_source}{settings.\+h}} }{\pageref{settings_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/solver/\mbox{\hyperlink{gauss__seidel_8h_source}{gauss\+\_\+seidel.\+h}} }{\pageref{gauss__seidel_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/solver/\mbox{\hyperlink{pressure__solver_8h_source}{pressure\+\_\+solver.\+h}} }{\pageref{pressure__solver_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/solver/\mbox{\hyperlink{sor_8h_source}{sor.\+h}} }{\pageref{sor_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/storage/\mbox{\hyperlink{array2D_8h_source}{array2\+D.\+h}} }{\pageref{array2D_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/storage/\mbox{\hyperlink{field__variable_8h_source}{field\+\_\+variable.\+h}} }{\pageref{field__variable_8h_source}}{} +\item\contentsline{section}{/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/surface/\mbox{\hyperlink{fluid__tracer_8h_source}{fluid\+\_\+tracer.\+h}} }{\pageref{fluid__tracer_8h_source}}{} +\end{DoxyCompactList} diff --git a/documentation/latex/fluid__tracer_8h_source.tex b/documentation/latex/fluid__tracer_8h_source.tex new file mode 100644 index 00000000..fee85092 --- /dev/null +++ b/documentation/latex/fluid__tracer_8h_source.tex @@ -0,0 +1,110 @@ +\doxysection{fluid\+\_\+tracer.\+h} +\hypertarget{fluid__tracer_8h_source}{}\label{fluid__tracer_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/surface/fluid\_tracer.h@{/home/jonat/Documents/01\_Studium/NumSim/src/surface/fluid\_tracer.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00008\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00009\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00010\ } +\DoxyCodeLine{00011\ \textcolor{preprocessor}{\#include\ "{}../discretization/discretization.h"{}}} +\DoxyCodeLine{00012\ \textcolor{preprocessor}{\#include\ "{}../boundary/boundary.h"{}}} +\DoxyCodeLine{00013\ } +\DoxyCodeLine{00014\ } +\DoxyCodeLine{00015\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classFluidTracer}{FluidTracer}}\ \{} +\DoxyCodeLine{00016\ \ \ \ \ \textcolor{keyword}{public}:} +\DoxyCodeLine{00017\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classFluidTracer}{FluidTracer}}(\textcolor{keywordtype}{int}\ numParticlesperCell,} +\DoxyCodeLine{00018\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ discretization,} +\DoxyCodeLine{00019\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ mask);} +\DoxyCodeLine{00020\ } +\DoxyCodeLine{00021\ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ Mainly\ for\ testing\ purposes}} +\DoxyCodeLine{00022\ \ \ \ \ \ \ \ \ \mbox{\hyperlink{classFluidTracer}{FluidTracer}}(std::vector\ x,\ std::vector\ y,} +\DoxyCodeLine{00023\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ discretization,} +\DoxyCodeLine{00024\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ mask);} +\DoxyCodeLine{00025\ } + + + + + + + + +\DoxyCodeLine{00035\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classFluidTracer_aba4d452f26e9276b91256dd251789b90}{moveParticles}}(\textcolor{keywordtype}{double}\ dt);} +\DoxyCodeLine{00036\ } + + + + + +\DoxyCodeLine{00043\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classFluidTracer_ace163e1fe040acbd4c3122f082b08eea}{createParticles}}(\textcolor{keywordtype}{double}\ positionSourceX,\ \textcolor{keywordtype}{double}\ positionSourceY);} +\DoxyCodeLine{00044\ } + + + + +\DoxyCodeLine{00050\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classFluidTracer_adc687a4988f532e21e13c9aa0591d658}{getNumberOfParticles}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00051\ } + + + + +\DoxyCodeLine{00057\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classFluidTracer_adc687a4988f532e21e13c9aa0591d658}{getNumberOfParticles}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00058\ } +\DoxyCodeLine{00059\ } + + + + +\DoxyCodeLine{00065\ \ \ \ \ \ \ \ \ std::array\ \mbox{\hyperlink{classFluidTracer_a37ee0325d6af08be6eba8b073162342e}{getParticlePosition}}(\textcolor{keywordtype}{int}\ i)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00066\ } +\DoxyCodeLine{00067\ \ \ \ \ \ \ \ \ std::array\ cellOfParticle(\textcolor{keywordtype}{int}\ i);} +\DoxyCodeLine{00068\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ val2CellX(\textcolor{keywordtype}{double}\ xVal);} +\DoxyCodeLine{00069\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ val2CellY(\textcolor{keywordtype}{double}\ yVal);} +\DoxyCodeLine{00070\ } +\DoxyCodeLine{00071\ } +\DoxyCodeLine{00072\ } +\DoxyCodeLine{00073\ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ Only\ test}} +\DoxyCodeLine{00074\ \ \ \ \ \ \ \ \ std::array\ updateParticle(\textcolor{keywordtype}{int}\ i,\ std::array\ idx,\ \textcolor{keywordtype}{double}\ dt,\ std::array\ vel,\ \textcolor{keywordtype}{int}\ depth);} +\DoxyCodeLine{00075\ \ \ \ \ \ \ \ \ std::array\ \mbox{\hyperlink{classFluidTracer_aba4d452f26e9276b91256dd251789b90}{moveParticles}}(\textcolor{keywordtype}{double}\ dt,\ std::array\ vel);} +\DoxyCodeLine{00076\ } +\DoxyCodeLine{00077\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ printParticles();} +\DoxyCodeLine{00078\ } +\DoxyCodeLine{00079\ } +\DoxyCodeLine{00080\ \ \ \ \ \textcolor{keyword}{private}:} +\DoxyCodeLine{00081\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ initializeHomogenousParticleDistribution();} + + +\DoxyCodeLine{00085\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ initializeFluidCell(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j,\ \textcolor{keywordtype}{int}\ idx);} +\DoxyCodeLine{00086\ } +\DoxyCodeLine{00087\ } +\DoxyCodeLine{00088\ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ Helper\ for\ move\ Particles}} +\DoxyCodeLine{00089\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ getThresholdParticlesFluidCell();} +\DoxyCodeLine{00090\ \ \ \ \ \ \ \ \ std::array\ updateParticle(\textcolor{keywordtype}{int}\ i,\ std::array\ idx,\ \textcolor{keywordtype}{double}\ dt,\ std::array\ vel);} +\DoxyCodeLine{00091\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{void}\ resetVelocityInAirCells();} +\DoxyCodeLine{00092\ } +\DoxyCodeLine{00093\ } +\DoxyCodeLine{00094\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ numParticles\_;} +\DoxyCodeLine{00095\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ numParticlesPerCell\_;\ \textcolor{comment}{//\ \ }} +\DoxyCodeLine{00096\ } +\DoxyCodeLine{00097\ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ aspect\ ratio\ e.g.\ 1.0\ for\ square\ cells\ and\ 0.5\ for\ (dx\ =\ 2*dy)\ cells}} +\DoxyCodeLine{00098\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ seedRelationDyDx\_;} +\DoxyCodeLine{00099\ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ how\ many\ particles\ are\ placed\ in\ each\ direction\ per\ cell}} +\DoxyCodeLine{00100\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ n\_x,\ n\_y;} +\DoxyCodeLine{00101\ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ inital\ count\ of\ fluid\ cells}} +\DoxyCodeLine{00102\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ numFluidCells\_;} +\DoxyCodeLine{00103\ } +\DoxyCodeLine{00104\ \ \ \ \ \ \ \ \ std::shared\_ptr\ discretization\_;} +\DoxyCodeLine{00105\ \ \ \ \ \ \ \ \ std::shared\_ptr\ mask\_;} +\DoxyCodeLine{00106\ \ \ \ \ \ \ \ \ std::vector\ x\_;} +\DoxyCodeLine{00107\ \ \ \ \ \ \ \ \ std::vector\ y\_;} +\DoxyCodeLine{00108\ \ \ \ \ \ \ \ \ std::vector\ currentParticlesPerCell\_;} +\DoxyCodeLine{00109\ } +\DoxyCodeLine{00110\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/gauss__seidel_8h_source.tex b/documentation/latex/gauss__seidel_8h_source.tex new file mode 100644 index 00000000..f32a815c --- /dev/null +++ b/documentation/latex/gauss__seidel_8h_source.tex @@ -0,0 +1,34 @@ +\doxysection{gauss\+\_\+seidel.\+h} +\hypertarget{gauss__seidel_8h_source}{}\label{gauss__seidel_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/solver/gauss\_seidel.h@{/home/jonat/Documents/01\_Studium/NumSim/src/solver/gauss\_seidel.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}pressure\_solver.h"{}}} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ } + + + + +\DoxyCodeLine{00011\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classGaussSeidel}{GaussSeidel}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classPressureSolver}{PressureSolver}}} +\DoxyCodeLine{00012\ \{} +\DoxyCodeLine{00013\ } +\DoxyCodeLine{00014\ \textcolor{keyword}{public}:} + + + + + + +\DoxyCodeLine{00022\ \ \ \ \ \mbox{\hyperlink{classGaussSeidel_af31cc1ace2d616ebb8e0592c06865b9c}{GaussSeidel}}(\textcolor{keyword}{const}\ std::shared\_ptr\ \&data,} +\DoxyCodeLine{00023\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ epsilon,} +\DoxyCodeLine{00024\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ maximumNumberOfIterations,} +\DoxyCodeLine{00025\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ boundary);} + + + +\DoxyCodeLine{00030\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classGaussSeidel_a6f0eb0c6938a64f8ded186f88170a04b}{solve}}()\ \textcolor{keyword}{override};} +\DoxyCodeLine{00031\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/hierarchy.tex b/documentation/latex/hierarchy.tex new file mode 100644 index 00000000..72064932 --- /dev/null +++ b/documentation/latex/hierarchy.tex @@ -0,0 +1,31 @@ +\doxysection{Class Hierarchy} +This inheritance list is sorted roughly, but not completely, alphabetically\+:\begin{DoxyCompactList} +\item \contentsline{section}{Array2D}{\pageref{classArray2D}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Field\+Variable}{\pageref{classFieldVariable}}{} +\end{DoxyCompactList} +\item \contentsline{section}{Boundary}{\pageref{classBoundary}}{} +\item \contentsline{section}{Computation}{\pageref{classComputation}}{} +\item \contentsline{section}{Fluid\+Tracer}{\pageref{classFluidTracer}}{} +\item \contentsline{section}{Settings\+::Line\+Content}{\pageref{structSettings_1_1LineContent}}{} +\item \contentsline{section}{Mask}{\pageref{classMask}}{} +\item \contentsline{section}{Output\+Writer}{\pageref{classOutputWriter}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Output\+Writer\+Paraview}{\pageref{classOutputWriterParaview}}{} +\item \contentsline{section}{Output\+Writer\+Text}{\pageref{classOutputWriterText}}{} +\end{DoxyCompactList} +\item \contentsline{section}{Pressure\+Solver}{\pageref{classPressureSolver}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Gauss\+Seidel}{\pageref{classGaussSeidel}}{} +\item \contentsline{section}{SOR}{\pageref{classSOR}}{} +\end{DoxyCompactList} +\item \contentsline{section}{Settings}{\pageref{structSettings}}{} +\item \contentsline{section}{Staggered\+Grid}{\pageref{classStaggeredGrid}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Discretization}{\pageref{classDiscretization}}{} +\begin{DoxyCompactList} +\item \contentsline{section}{Central\+Differences}{\pageref{classCentralDifferences}}{} +\item \contentsline{section}{Donor\+Cell}{\pageref{classDonorCell}}{} +\end{DoxyCompactList} +\end{DoxyCompactList} +\end{DoxyCompactList} diff --git a/documentation/latex/longtable_doxygen.sty b/documentation/latex/longtable_doxygen.sty new file mode 100644 index 00000000..e94b78b6 --- /dev/null +++ b/documentation/latex/longtable_doxygen.sty @@ -0,0 +1,456 @@ +%% +%% This is file `longtable.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% longtable.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% The source is maintained by the LaTeX Project team and bug +%% reports for it can be opened at http://latex-project.org/bugs.html +%% (but please observe conditions on bug reports sent to that address!) +%% +%% Copyright 1993-2016 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file was generated from file(s) of the Standard LaTeX `Tools Bundle'. +%% -------------------------------------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3c +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file may only be distributed together with a copy of the LaTeX +%% `Tools Bundle'. You may however distribute the LaTeX `Tools Bundle' +%% without such generated files. +%% +%% The list of all files belonging to the LaTeX `Tools Bundle' is +%% given in the file `manifest.txt'. +%% +%% File: longtable.dtx Copyright (C) 1990-2001 David Carlisle +\NeedsTeXFormat{LaTeX2e}[1995/06/01] +\ProvidesPackage{longtable_doxygen} + [2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen] +\def\LT@err{\PackageError{longtable}} +\def\LT@warn{\PackageWarning{longtable}} +\def\LT@final@warn{% + \AtEndDocument{% + \LT@warn{Table \@width s have changed. Rerun LaTeX.\@gobbletwo}}% + \global\let\LT@final@warn\relax} +\DeclareOption{errorshow}{% + \def\LT@warn{\PackageInfo{longtable}}} +\DeclareOption{pausing}{% + \def\LT@warn#1{% + \LT@err{#1}{This is not really an error}}} +\DeclareOption{set}{} +\DeclareOption{final}{} +\ProcessOptions +\newskip\LTleft \LTleft=\fill +\newskip\LTright \LTright=\fill +\newskip\LTpre \LTpre=\bigskipamount +\newskip\LTpost \LTpost=\bigskipamount +\newcount\LTchunksize \LTchunksize=20 +\let\c@LTchunksize\LTchunksize +\newdimen\LTcapwidth \LTcapwidth=4in +\newbox\LT@head +\newbox\LT@firsthead +\newbox\LT@foot +\newbox\LT@lastfoot +\newcount\LT@cols +\newcount\LT@rows +\newcounter{LT@tables} +\newcounter{LT@chunks}[LT@tables] +\ifx\c@table\undefined + \newcounter{table} + \def\fnum@table{\tablename~\thetable} +\fi +\ifx\tablename\undefined + \def\tablename{Table} +\fi +\newtoks\LT@p@ftn +\mathchardef\LT@end@pen=30000 +\def\longtable{% + \par + \ifx\multicols\@undefined + \else + \ifnum\col@number>\@ne + \@twocolumntrue + \fi + \fi + \if@twocolumn + \LT@err{longtable not in 1-column mode}\@ehc + \fi + \begingroup + \@ifnextchar[\LT@array{\LT@array[x]}} +\def\LT@array[#1]#2{% + \refstepcounter{table}\stepcounter{LT@tables}% + \if l#1% + \LTleft\z@ \LTright\fill + \else\if r#1% + \LTleft\fill \LTright\z@ + \else\if c#1% + \LTleft\fill \LTright\fill + \fi\fi\fi + \let\LT@mcol\multicolumn + \let\LT@@tabarray\@tabarray + \let\LT@@hl\hline + \def\@tabarray{% + \let\hline\LT@@hl + \LT@@tabarray}% + \let\\\LT@tabularcr\let\tabularnewline\\% + \def\newpage{\noalign{\break}}% + \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}% + \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}% + \let\hline\LT@hline \let\kill\LT@kill\let\caption\LT@caption + \@tempdima\ht\strutbox + \let\@endpbox\LT@endpbox + \ifx\extrarowheight\@undefined + \let\@acol\@tabacol + \let\@classz\@tabclassz \let\@classiv\@tabclassiv + \def\@startpbox{\vtop\LT@startpbox}% + \let\@@startpbox\@startpbox + \let\@@endpbox\@endpbox + \let\LT@LL@FM@cr\@tabularcr + \else + \advance\@tempdima\extrarowheight + \col@sep\tabcolsep + \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr + \fi + \setbox\@arstrutbox\hbox{\vrule + \@height \arraystretch \@tempdima + \@depth \arraystretch \dp \strutbox + \@width \z@}% + \let\@sharp##\let\protect\relax + \begingroup + \@mkpream{#2}% + \xdef\LT@bchunk{% + \global\advance\c@LT@chunks\@ne + \global\LT@rows\z@\setbox\z@\vbox\bgroup + \LT@setprevdepth + \tabskip\LTleft \noexpand\halign to\hsize\bgroup + \tabskip\z@ \@arstrut \@preamble \tabskip\LTright \cr}% + \endgroup + \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols + \LT@make@row + \m@th\let\par\@empty + \everycr{}\lineskip\z@\baselineskip\z@ + \LT@bchunk} +\def\LT@no@pgbk#1[#2]{\penalty #1\@getpen{#2}\ifnum`{=0\fi}} +\def\LT@start{% + \let\LT@start\endgraf + \endgraf\penalty\z@\vskip\LTpre + \dimen@\pagetotal + \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi + \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi + \advance\dimen@ \ht\LT@foot + \dimen@ii\vfuzz + \vfuzz\maxdimen + \setbox\tw@\copy\z@ + \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox + \setbox\tw@\vbox{\unvbox\tw@}% + \vfuzz\dimen@ii + \advance\dimen@ \ht + \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi + \advance\dimen@\dp + \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi + \advance\dimen@ -\pagegoal + \ifdim \dimen@>\z@\vfil\break\fi + \global\@colroom\@colht + \ifvoid\LT@foot\else + \advance\vsize-\ht\LT@foot + \global\advance\@colroom-\ht\LT@foot + \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@ + \maxdepth\z@ + \fi + \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak + \output{\LT@output}} +\def\endlongtable{% + \crcr + \noalign{% + \let\LT@entry\LT@entry@chop + \xdef\LT@save@row{\LT@save@row}}% + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \if@filesw + {\let\LT@entry\LT@entry@write\immediate\write\@auxout{% + \gdef\expandafter\noexpand + \csname LT@\romannumeral\c@LT@tables\endcsname + {\LT@save@row}}}% + \fi + \ifx\LT@save@row\LT@@save@row + \else + \LT@warn{Column \@width s have changed\MessageBreak + in table \thetable}% + \LT@final@warn + \fi + \endgraf\penalty -\LT@end@pen + \endgroup + \global\@mparbottom\z@ + \pagegoal\vsize + \endgraf\penalty\z@\addvspace\LTpost + \ifvoid\footins\else\insert\footins{}\fi} +\def\LT@nofcols#1&{% + \futurelet\@let@token\LT@n@fcols} +\def\LT@n@fcols{% + \advance\LT@cols\@ne + \ifx\@let@token\LT@nofcols + \expandafter\@gobble + \else + \expandafter\LT@nofcols + \fi} +\def\LT@tabularcr{% + \relax\iffalse{\fi\ifnum0=`}\fi + \@ifstar + {\def\crcr{\LT@crcr\noalign{\nobreak}}\let\cr\crcr + \LT@t@bularcr}% + {\LT@t@bularcr}} +\let\LT@crcr\crcr +\let\LT@setprevdepth\relax +\def\LT@t@bularcr{% + \global\advance\LT@rows\@ne + \ifnum\LT@rows=\LTchunksize + \gdef\LT@setprevdepth{% + \prevdepth\z@\global + \global\let\LT@setprevdepth\relax}% + \expandafter\LT@xtabularcr + \else + \ifnum0=`{}\fi + \expandafter\LT@LL@FM@cr + \fi} +\def\LT@xtabularcr{% + \@ifnextchar[\LT@argtabularcr\LT@ntabularcr} +\def\LT@ntabularcr{% + \ifnum0=`{}\fi + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \LT@bchunk} +\def\LT@argtabularcr[#1]{% + \ifnum0=`{}\fi + \ifdim #1>\z@ + \unskip\@xargarraycr{#1}% + \else + \@yargarraycr{#1}% + \fi + \LT@echunk + \LT@start + \unvbox\z@ + \LT@get@widths + \LT@bchunk} +\def\LT@echunk{% + \crcr\LT@save@row\cr\egroup + \global\setbox\@ne\lastbox + \unskip + \egroup} +\def\LT@entry#1#2{% + \ifhmode\@firstofone{&}\fi\omit + \ifnum#1=\c@LT@chunks + \else + \kern#2\relax + \fi} +\def\LT@entry@chop#1#2{% + \noexpand\LT@entry + {\ifnum#1>\c@LT@chunks + 1}{0pt% + \else + #1}{#2% + \fi}} +\def\LT@entry@write{% + \noexpand\LT@entry^^J% + \@spaces} +\def\LT@kill{% + \LT@echunk + \LT@get@widths + \expandafter\LT@rebox\LT@bchunk} +\def\LT@rebox#1\bgroup{% + #1\bgroup + \unvbox\z@ + \unskip + \setbox\z@\lastbox} +\def\LT@blank@row{% + \xdef\LT@save@row{\expandafter\LT@build@blank + \romannumeral\number\LT@cols 001 }} +\def\LT@build@blank#1{% + \if#1m% + \noexpand\LT@entry{1}{0pt}% + \expandafter\LT@build@blank + \fi} +\def\LT@make@row{% + \global\expandafter\let\expandafter\LT@save@row + \csname LT@\romannumeral\c@LT@tables\endcsname + \ifx\LT@save@row\relax + \LT@blank@row + \else + {\let\LT@entry\or + \if!% + \ifcase\expandafter\expandafter\expandafter\LT@cols + \expandafter\@gobble\LT@save@row + \or + \else + \relax + \fi + !% + \else + \aftergroup\LT@blank@row + \fi}% + \fi} +\let\setlongtables\relax +\def\LT@get@widths{% + \setbox\tw@\hbox{% + \unhbox\@ne + \let\LT@old@row\LT@save@row + \global\let\LT@save@row\@empty + \count@\LT@cols + \loop + \unskip + \setbox\tw@\lastbox + \ifhbox\tw@ + \LT@def@row + \advance\count@\m@ne + \repeat}% + \ifx\LT@@save@row\@undefined + \let\LT@@save@row\LT@save@row + \fi} +\def\LT@def@row{% + \let\LT@entry\or + \edef\@tempa{% + \ifcase\expandafter\count@\LT@old@row + \else + {1}{0pt}% + \fi}% + \let\LT@entry\relax + \xdef\LT@save@row{% + \LT@entry + \expandafter\LT@max@sel\@tempa + \LT@save@row}} +\def\LT@max@sel#1#2{% + {\ifdim#2=\wd\tw@ + #1% + \else + \number\c@LT@chunks + \fi}% + {\the\wd\tw@}} +\def\LT@hline{% + \noalign{\ifnum0=`}\fi + \penalty\@M + \futurelet\@let@token\LT@@hline} +\def\LT@@hline{% + \ifx\@let@token\hline + \global\let\@gtempa\@gobble + \gdef\LT@sep{\penalty-\@medpenalty\vskip\doublerulesep}% + \else + \global\let\@gtempa\@empty + \gdef\LT@sep{\penalty-\@lowpenalty\vskip-\arrayrulewidth}% + \fi + \ifnum0=`{\fi}% + \multispan\LT@cols + \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr + \noalign{\LT@sep}% + \multispan\LT@cols + \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr + \noalign{\penalty\@M}% + \@gtempa} +\def\LT@caption{% + \noalign\bgroup + \@ifnextchar[{\egroup\LT@c@ption\@firstofone}\LT@capti@n} +\def\LT@c@ption#1[#2]#3{% + \LT@makecaption#1\fnum@table{#3}% + \def\@tempa{#2}% + \ifx\@tempa\@empty\else + {\let\\\space + \addcontentsline{lot}{table}{\protect\numberline{\thetable}{#2}}}% + \fi} +\def\LT@capti@n{% + \@ifstar + {\egroup\LT@c@ption\@gobble[]}% + {\egroup\@xdblarg{\LT@c@ption\@firstofone}}} +\def\LT@makecaption#1#2#3{% + \LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\LTcapwidth{% + \sbox\@tempboxa{#1{#2: }#3}% + \ifdim\wd\@tempboxa>\hsize + #1{#2: }#3% + \else + \hbox to\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \endgraf\vskip\baselineskip}% + \hss}}} +\def\LT@output{% + \ifnum\outputpenalty <-\@Mi + \ifnum\outputpenalty > -\LT@end@pen + \LT@err{floats and marginpars not allowed in a longtable}\@ehc + \else + \setbox\z@\vbox{\unvbox\@cclv}% + \ifdim \ht\LT@lastfoot>\ht\LT@foot + \dimen@\pagegoal + \advance\dimen@-\ht\LT@lastfoot + \ifdim\dimen@<\ht\z@ + \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}% + \@makecol + \@outputpage + \setbox\z@\vbox{\box\LT@head}% + \fi + \fi + \global\@colroom\@colht + \global\vsize\@colht + \vbox + {\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}% + \fi + \else + \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}% + \@makecol + \@outputpage + \global\vsize\@colroom + \copy\LT@head\nobreak + \fi} +\def\LT@end@hd@ft#1{% + \LT@echunk + \ifx\LT@start\endgraf + \LT@err + {Longtable head or foot not at start of table}% + {Increase LTchunksize}% + \fi + \setbox#1\box\z@ + \LT@get@widths + \LT@bchunk} +\def\endfirsthead{\LT@end@hd@ft\LT@firsthead} +\def\endhead{\LT@end@hd@ft\LT@head} +\def\endfoot{\LT@end@hd@ft\LT@foot} +\def\endlastfoot{\LT@end@hd@ft\LT@lastfoot} +\def\LT@startpbox#1{% + \bgroup + \let\@footnotetext\LT@p@ftntext + \setlength\hsize{#1}% + \@arrayparboxrestore + \vrule \@height \ht\@arstrutbox \@width \z@} +\def\LT@endpbox{% + \@finalstrut\@arstrutbox + \egroup + \the\LT@p@ftn + \global\LT@p@ftn{}% + \hfil} +%% added \long to prevent: +% LaTeX Warning: Command \LT@p@ftntext has changed. +% +% from the original repository (https://github.com/latex3/latex2e/blob/develop/required/tools/longtable.dtx): +% \changes{v4.15}{2021/03/28} +% {make long for gh/364} +% Inside the `p' column, just save up the footnote text in a token +% register. +\long\def\LT@p@ftntext#1{% + \edef\@tempa{\the\LT@p@ftn\noexpand\footnotetext[\the\c@footnote]}% + \global\LT@p@ftn\expandafter{\@tempa{#1}}}% + +\@namedef{ver@longtable.sty}{2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen} +\endinput +%% +%% End of file `longtable.sty'. diff --git a/documentation/latex/mask_8h_source.tex b/documentation/latex/mask_8h_source.tex new file mode 100644 index 00000000..36d99663 --- /dev/null +++ b/documentation/latex/mask_8h_source.tex @@ -0,0 +1,210 @@ +\doxysection{mask.\+h} +\hypertarget{mask_8h_source}{}\label{mask_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/boundary/mask.h@{/home/jonat/Documents/01\_Studium/NumSim/src/boundary/mask.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00007\ } +\DoxyCodeLine{00008\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00009\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00010\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00011\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00012\ \textcolor{preprocessor}{\#include\ "{}../settings\_parser/settings.h"{}}} +\DoxyCodeLine{00013\ } +\DoxyCodeLine{00014\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classMask}{Mask}}} +\DoxyCodeLine{00015\ \{} +\DoxyCodeLine{00016\ \textcolor{keyword}{public}:} + + + + +\DoxyCodeLine{00022\ \ \ \ \ \mbox{\hyperlink{classMask_a5d65d3a108a79864bc69994f5e56f6c3}{Mask}}(\mbox{\hyperlink{structSettings}{Settings}}\ settings);} +\DoxyCodeLine{00023\ } +\DoxyCodeLine{00024\ \ \ \ \ \textcolor{keyword}{enum}\ \mbox{\hyperlink{classMask_ad74a26afe88ebadafebd733837f3252a}{CellType}}\ } +\DoxyCodeLine{00025\ \ \ \ \ \{} +\DoxyCodeLine{00026\ \ \ \ \ \ \ \ \ FLUID\_DROPLET\ =\ 0,} +\DoxyCodeLine{00027\ } +\DoxyCodeLine{00028\ \ \ \ \ \ \ \ \ FLUID\_SINGLE\_LEFT\ =\ 1,} +\DoxyCodeLine{00029\ \ \ \ \ \ \ \ \ FLUID\_SINGLE\_TOP\ =\ 2,} +\DoxyCodeLine{00030\ \ \ \ \ \ \ \ \ FLUID\_SINGLE\_RIGHT\ =\ 4,} +\DoxyCodeLine{00031\ \ \ \ \ \ \ \ \ FLUID\_SINGLE\_BOTTOM\ =\ 8,} +\DoxyCodeLine{00032\ } +\DoxyCodeLine{00033\ \ \ \ \ \ \ \ \ FLUID\_CORNER\_BOTTOM\_LEFT\ =\ 6,} +\DoxyCodeLine{00034\ \ \ \ \ \ \ \ \ FLUID\_CORNER\_TOP\_LEFT\ =\ 12,} +\DoxyCodeLine{00035\ \ \ \ \ \ \ \ \ FLUID\_CORNER\_TOP\_RIGHT\ =\ 9,} +\DoxyCodeLine{00036\ \ \ \ \ \ \ \ \ FLUID\_CORNER\_BOTTOM\_RIGHT\ =\ 3,} +\DoxyCodeLine{00037\ } +\DoxyCodeLine{00038\ \ \ \ \ \ \ \ \ FLUID\_COLUMN\_HORIZONTAL\ =\ 5,} +\DoxyCodeLine{00039\ \ \ \ \ \ \ \ \ FLUID\_COLUMN\_VERTICAL\ =\ 10,} +\DoxyCodeLine{00040\ } +\DoxyCodeLine{00041\ \ \ \ \ \ \ \ \ FLUID\_BORDER\_LEFT\ =\ 14,} +\DoxyCodeLine{00042\ \ \ \ \ \ \ \ \ FLUID\_BORDER\_TOP\ =\ 13,} +\DoxyCodeLine{00043\ \ \ \ \ \ \ \ \ FLUID\_BORDER\_RIGHT\ =\ 11,} +\DoxyCodeLine{00044\ \ \ \ \ \ \ \ \ FLUID\_BORDER\_BOTTOM\ =\ 7,} +\DoxyCodeLine{00045\ } +\DoxyCodeLine{00046\ \ \ \ \ \ \ \ \ FLUID\ =\ 15,} +\DoxyCodeLine{00047\ \ \ \ \ \ \ \ \ FLUID\_TYPE\ =\ 50,} +\DoxyCodeLine{00048\ \ \ \ \ \ \ \ \ AIR\ =\ 64,} +\DoxyCodeLine{00049\ } +\DoxyCodeLine{00050\ \ \ \ \ \ \ \ \ OBSTACLE\ =\ 99,} +\DoxyCodeLine{00051\ \ \ \ \ \ \ \ \ OBSTACLE\_INSIDE\ =\ 100,} +\DoxyCodeLine{00052\ } +\DoxyCodeLine{00053\ \ \ \ \ \ \ \ \ OBSTACLE\_BORDER\_LEFT\ =\ 101,} +\DoxyCodeLine{00054\ \ \ \ \ \ \ \ \ OBSTACLE\_BORDER\_TOP\ =\ 102,} +\DoxyCodeLine{00055\ \ \ \ \ \ \ \ \ OBSTACLE\_CORNER\_TOP\_LEFT\ =\ 103,} +\DoxyCodeLine{00056\ \ \ \ \ \ \ \ \ OBSTACLE\_BORDER\_RIGHT\ =\ 104,} +\DoxyCodeLine{00057\ \ \ \ \ \ \ \ \ OBSTACLE\_CORNER\_TOP\_RIGHT\ =\ 106,} +\DoxyCodeLine{00058\ \ \ \ \ \ \ \ \ OBSTACLE\_BORDER\_BOTTOM\ =\ 108,} +\DoxyCodeLine{00059\ \ \ \ \ \ \ \ \ OBSTACLE\_CORNER\_BOTTOM\_LEFT\ =\ 109,} +\DoxyCodeLine{00060\ \ \ \ \ \ \ \ \ OBSTACLE\_CORNER\_BOTTOM\_RIGHT\ =\ 112,} +\DoxyCodeLine{00061\ } +\DoxyCodeLine{00062\ \ \ \ \ \ \ \ \ DOMAIN\_BOUNDARY\ =\ 200,} +\DoxyCodeLine{00063\ } +\DoxyCodeLine{00064\ \ \ \ \ \ \ \ \ DOMAIN\_LEFT\_NOSLIP\ =\ 201,} +\DoxyCodeLine{00065\ \ \ \ \ \ \ \ \ DOMAIN\_TOP\_NOSLIP\ =\ 202,} +\DoxyCodeLine{00066\ \ \ \ \ \ \ \ \ DOMAIN\_RIGHT\_NOSLIP\ =\ 203,} +\DoxyCodeLine{00067\ \ \ \ \ \ \ \ \ DOMAIN\_BOTTOM\_NOSLIP\ =\ 204,} +\DoxyCodeLine{00068\ } +\DoxyCodeLine{00069\ \ \ \ \ \ \ \ \ DOMAIN\_LEFT\_PRESSURE\ =\ 205,} +\DoxyCodeLine{00070\ \ \ \ \ \ \ \ \ DOMAIN\_TOP\_PRESSURE\ =\ 206,} +\DoxyCodeLine{00071\ \ \ \ \ \ \ \ \ DOMAIN\_RIGHT\_PRESSURE\ =\ 207,} +\DoxyCodeLine{00072\ \ \ \ \ \ \ \ \ DOMAIN\_BOTTOM\_PRESSURE\ =\ 208,} +\DoxyCodeLine{00073\ \ \ \ \ \};} +\DoxyCodeLine{00074\ } + + + + + + +\DoxyCodeLine{00082\ \ \ \ \ \textcolor{keywordtype}{int}\ \&\mbox{\hyperlink{classMask_a6d612f1ac2185304b3ad7432d90dcd2b}{operator()}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} +\DoxyCodeLine{00083\ } + + + + + + +\DoxyCodeLine{00091\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classMask_a6d612f1ac2185304b3ad7432d90dcd2b}{operator()}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00092\ } + + +\DoxyCodeLine{00096\ \ \ \ \ std::array\ \mbox{\hyperlink{classMask_aafa0857af35b02ba6070e76f82d51c7b}{size}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00097\ } + + + +\DoxyCodeLine{00102\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classMask_ac30997cdd83faef98290733acb325cf8}{resetMask}}();} +\DoxyCodeLine{00103\ } +\DoxyCodeLine{00104\ \ \ \ \ \textcolor{comment}{//\ ********************************************************}} +\DoxyCodeLine{00105\ \ \ \ \ \textcolor{comment}{//\ R\ E\ Q\ U\ E\ S\ T\ S}} +\DoxyCodeLine{00106\ } + + + + + + + +\DoxyCodeLine{00115\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{classMask_aadacef52f95b796920864b8519d0594b}{isFluid}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00116\ } + + + + + +\DoxyCodeLine{00123\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{classMask_a53e4e7c0b29234856cbee33386cc5c18}{isObstacle}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00124\ } + + + + + + + +\DoxyCodeLine{00133\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{classMask_a7eb34f789ef96c622ab93718d5278d77}{isAir}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00134\ } + + + + + + + + +\DoxyCodeLine{00144\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{classMask_a5f3d53087eb5a1d9427716804e280751}{isInnerFluid}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00145\ } + + + + + + +\DoxyCodeLine{00153\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{classMask_a9f76177c70d7cab7f268c8fd9a102e73}{isDomainBoundary}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00154\ } + + + + + + +\DoxyCodeLine{00162\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{classMask_ada8b2531a4a16703f145fd6f708f21ff}{isObstacleBoundary}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00163\ } + + + + + + +\DoxyCodeLine{00171\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{classMask_a2ffcf2b70edede392422ea692e49d313}{isFluidBoundary}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} +\DoxyCodeLine{00172\ } + + + + + +\DoxyCodeLine{00179\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classMask_a3471a6026ce7eab118f660557a8abac6}{getNumberOfFluidCells}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00180\ } + + + + +\DoxyCodeLine{00186\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classMask_a75a1750221e41c1b34f80d4d352163ac}{makeRectangularObstacle}}();} +\DoxyCodeLine{00187\ } + + + + +\DoxyCodeLine{00193\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classMask_ad69aefd91f740d6758cdedf0df8c8ca6}{createMaskFromPNGBitMap}}();} +\DoxyCodeLine{00194\ } + + + + +\DoxyCodeLine{00200\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classMask_aacf4d2cfe1362df85ed08fd3b0fc6d6b}{setDomainBC}}();} +\DoxyCodeLine{00201\ } + + +\DoxyCodeLine{00205\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classMask_a644a84aca88442b72b5cd87ee80f1724}{setObstacleBC}}();} +\DoxyCodeLine{00206\ } + + +\DoxyCodeLine{00210\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classMask_a41bf0aa100e2554eaea3ab29a999c0ee}{setFluidBC}}();} +\DoxyCodeLine{00211\ } + + +\DoxyCodeLine{00215\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classMask_a372d2a81ff261f126b11fdfcfd2f845e}{printMask}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00216\ } +\DoxyCodeLine{00217\ \textcolor{keyword}{protected}:} +\DoxyCodeLine{00218\ \ \ \ \ std::array\ \mbox{\hyperlink{classMask_a84bff46271e16eb8639c1831403c1bb9}{size\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00219\ \ \ \ \ std::vector\ \mbox{\hyperlink{classMask_acdb73aee935b502fecc8de6bf1e32a09}{data\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00220\ \ \ \ \ std::vector\ \mbox{\hyperlink{classMask_a3c5a51f6d03bb4a5e1742537a22ec441}{boundary\_list}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00221\ \ \ \ \ \mbox{\hyperlink{structSettings}{Settings}}\ \mbox{\hyperlink{classMask_acb8b165d56689722fd836569e066fdd4}{settings\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00222\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classMask_abe4f6f251b0517f01d0f58f9042d3af4}{forbiddenObstacleFluidCombinations}}[7]\ =\ \{105,\ 107,\ 110,\ 111,\ 113,\ 114,\ 115\};\ } +\DoxyCodeLine{00223\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/output__writer_8h_source.tex b/documentation/latex/output__writer_8h_source.tex new file mode 100644 index 00000000..5fc08fc9 --- /dev/null +++ b/documentation/latex/output__writer_8h_source.tex @@ -0,0 +1,38 @@ +\doxysection{output\+\_\+writer.\+h} +\hypertarget{output__writer_8h_source}{}\label{output__writer_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/output\_writer/output\_writer.h@{/home/jonat/Documents/01\_Studium/NumSim/src/output\_writer/output\_writer.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}../discretization/discretization.h"{}}} +\DoxyCodeLine{00004\ } +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00008\ } + + + +\DoxyCodeLine{00013\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classOutputWriter}{OutputWriter}}} +\DoxyCodeLine{00014\ \{} +\DoxyCodeLine{00015\ \textcolor{keyword}{public}:} + + + + +\DoxyCodeLine{00021\ \ \ \mbox{\hyperlink{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}{OutputWriter}}(std::shared\_ptr\ discretization);} +\DoxyCodeLine{00022\ } + + + + + + +\DoxyCodeLine{00030\ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classOutputWriter_ac625c204affdc05919388a3549c2e945}{writeFile}}(\textcolor{keywordtype}{double}\ currentTime)\ =\ 0;} +\DoxyCodeLine{00031\ } +\DoxyCodeLine{00032\ \textcolor{keyword}{protected}:} +\DoxyCodeLine{00033\ \ \ std::shared\_ptr\ \mbox{\hyperlink{classOutputWriter_a0587b2dc160a9b1393411433dfc23b68}{discretization\_}};\ } +\DoxyCodeLine{00034\ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classOutputWriter_a69d167e2526407602dce26ca7a2b9248}{fileNo\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00035\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/output__writer__paraview_8h_source.tex b/documentation/latex/output__writer__paraview_8h_source.tex new file mode 100644 index 00000000..5a40e003 --- /dev/null +++ b/documentation/latex/output__writer__paraview_8h_source.tex @@ -0,0 +1,51 @@ +\doxysection{output\+\_\+writer\+\_\+paraview.\+h} +\hypertarget{output__writer__paraview_8h_source}{}\label{output__writer__paraview_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/output\_writer/output\_writer\_paraview.h@{/home/jonat/Documents/01\_Studium/NumSim/src/output\_writer/output\_writer\_paraview.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}output\_writer.h"{}}} +\DoxyCodeLine{00004\ } +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00008\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00009\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00010\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00011\ } +\DoxyCodeLine{00012\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00013\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00014\ \textcolor{preprocessor}{\#include\ "{}../boundary/mask.h"{}}} +\DoxyCodeLine{00015\ \textcolor{preprocessor}{\#include\ "{}../surface/fluid\_tracer.h"{}}} +\DoxyCodeLine{00016\ } + + + + + + + +\DoxyCodeLine{00025\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classOutputWriterParaview}{OutputWriterParaview}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classOutputWriter}{OutputWriter}}} +\DoxyCodeLine{00026\ \{} +\DoxyCodeLine{00027\ \textcolor{keyword}{public}:} + + + + +\DoxyCodeLine{00033\ \ \ \mbox{\hyperlink{classOutputWriterParaview_ab2d30ea87bf48abef82f95976c662cc1}{OutputWriterParaview}}(std::shared\_ptr\ discretization,} +\DoxyCodeLine{00034\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ mask,} +\DoxyCodeLine{00035\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ fluidTracer);} +\DoxyCodeLine{00036\ } + + + + +\DoxyCodeLine{00042\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classOutputWriterParaview_a9e203b63d0e2f26ad53d18ee1821c6bb}{writeFile}}(\textcolor{keywordtype}{double}\ currentTime);} +\DoxyCodeLine{00043\ } +\DoxyCodeLine{00044\ \textcolor{keyword}{private}:} +\DoxyCodeLine{00045\ \ \ vtkSmartPointer\ vtkWriter\_;\ } +\DoxyCodeLine{00046\ \ \ std::shared\_ptr\ mask\_;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00047\ \ \ std::shared\_ptr\ fluidTracer\_;\ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00048\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/output__writer__text_8h_source.tex b/documentation/latex/output__writer__text_8h_source.tex new file mode 100644 index 00000000..8721f048 --- /dev/null +++ b/documentation/latex/output__writer__text_8h_source.tex @@ -0,0 +1,41 @@ +\doxysection{output\+\_\+writer\+\_\+text.\+h} +\hypertarget{output__writer__text_8h_source}{}\label{output__writer__text_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/output\_writer/output\_writer\_text.h@{/home/jonat/Documents/01\_Studium/NumSim/src/output\_writer/output\_writer\_text.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}output\_writer.h"{}}} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00008\ } + + + + + + +\DoxyCodeLine{00016\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classOutputWriterText}{OutputWriterText}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classOutputWriter}{OutputWriter}}} +\DoxyCodeLine{00017\ \{} +\DoxyCodeLine{00018\ \textcolor{keyword}{public}:} + + +\DoxyCodeLine{00022\ \ \ \textcolor{keyword}{using\ }\mbox{\hyperlink{classOutputWriter_a4f3180552b8102c27e087357b9cdd1f7}{OutputWriter::OutputWriter}};} +\DoxyCodeLine{00023\ } + + + + + + +\DoxyCodeLine{00031\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classOutputWriterText_a25a12ea2524fc34e9acb19ef1f4c7431}{writeFile}}(\textcolor{keywordtype}{double}\ currentTime);} +\DoxyCodeLine{00032\ } + + + + +\DoxyCodeLine{00038\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classOutputWriterText_a3480b58a23fd158f16d0ef9c1b67cbfd}{writePressureFile}}();} +\DoxyCodeLine{00039\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/pressure__solver_8h_source.tex b/documentation/latex/pressure__solver_8h_source.tex new file mode 100644 index 00000000..23e63aa9 --- /dev/null +++ b/documentation/latex/pressure__solver_8h_source.tex @@ -0,0 +1,70 @@ +\doxysection{pressure\+\_\+solver.\+h} +\hypertarget{pressure__solver_8h_source}{}\label{pressure__solver_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/solver/pressure\_solver.h@{/home/jonat/Documents/01\_Studium/NumSim/src/solver/pressure\_solver.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ } +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ "{}../storage/field\_variable.h"{}}} +\DoxyCodeLine{00008\ \textcolor{preprocessor}{\#include\ "{}../discretization/discretization.h"{}}} +\DoxyCodeLine{00009\ \textcolor{preprocessor}{\#include\ "{}../boundary/boundary.h"{}}} +\DoxyCodeLine{00010\ } +\DoxyCodeLine{00011\ } + + + + + + + +\DoxyCodeLine{00020\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classPressureSolver}{PressureSolver}}} +\DoxyCodeLine{00021\ \{} +\DoxyCodeLine{00022\ \textcolor{keyword}{public}:} + + + + + + + +\DoxyCodeLine{00031\ \ \ \ \ \mbox{\hyperlink{classPressureSolver_a10803d8c3d7f3810fc0ba059acf04058}{PressureSolver}}(std::shared\_ptr\ discretization,} +\DoxyCodeLine{00032\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ epsilon,} +\DoxyCodeLine{00033\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ maximumNumberOfIterations,} +\DoxyCodeLine{00034\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ std::shared\_ptr\ boundary);} +\DoxyCodeLine{00035\ \ } + + + +\DoxyCodeLine{00040\ \ \ \ \ \textcolor{keyword}{virtual}\ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classPressureSolver_a504ac61a1317650e0eb70d6a93212ca0}{solve}}()\ =\ 0;} +\DoxyCodeLine{00041\ } +\DoxyCodeLine{00042\ \ \ \ \ \textcolor{keywordtype}{double}\ dx2,\ \mbox{\hyperlink{classPressureSolver_a25b7ff50bdaea53d1b5c7a5cf735c5b5}{dy2}};\ } +\DoxyCodeLine{00043\ } +\DoxyCodeLine{00044\ \textcolor{keyword}{protected}:} + + + + + +\DoxyCodeLine{00051\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classPressureSolver_a458c383fcacaf54c1a333a271049ca93}{setBoundaryValues}}();} +\DoxyCodeLine{00052\ } + + +\DoxyCodeLine{00056\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classPressureSolver_afc51f4315c483988aeec327a16c5bb90}{calculateResiduum}}();} +\DoxyCodeLine{00057\ } +\DoxyCodeLine{00058\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classPressureSolver_af3ac2e53c6f49b9a362415a89595a7f0}{i\_beg}};\ } +\DoxyCodeLine{00059\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classPressureSolver_a41b263980e55591d1ffdc4837c252a61}{i\_end}};\ } +\DoxyCodeLine{00060\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classPressureSolver_aa309af30e5e63e09b77900091e562235}{j\_beg}};\ } +\DoxyCodeLine{00061\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classPressureSolver_ac2402794034dd74073700998ee2860bf}{j\_end}};\ } +\DoxyCodeLine{00062\ } +\DoxyCodeLine{00063\ \ \ \ \ std::shared\_ptr\ \mbox{\hyperlink{classPressureSolver_af579ecebaaa8b11914293ef18af5fdc6}{discretization\_}};\ } +\DoxyCodeLine{00064\ \ \ \ \ std::shared\_ptr\ \mbox{\hyperlink{classPressureSolver_a0b17b46580d259e4bb3a05486bc06a60}{boundary\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00065\ } +\DoxyCodeLine{00066\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classPressureSolver_a22b723f3b3ba54e47f36cfc2b9576749}{epsilon\_}};\ } +\DoxyCodeLine{00067\ } +\DoxyCodeLine{00068\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classPressureSolver_af3b02d29bf1b21ad8b7e6edf8c2f4e87}{maximumNumberOfIterations\_}};\ } +\DoxyCodeLine{00069\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/refman.tex b/documentation/latex/refman.tex new file mode 100644 index 00000000..f37c07a9 --- /dev/null +++ b/documentation/latex/refman.tex @@ -0,0 +1,262 @@ + % Handle batch mode + % to overcome problems with too many open files + \let\mypdfximage\pdfximage\def\pdfximage{\immediate\mypdfximage} + \pdfminorversion=7 + % Set document class depending on configuration + \documentclass[twoside]{book} + %% moved from doxygen.sty due to workaround for LaTex 2019 version and unmaintained tabu package + \usepackage{ifthen} + \ifx\requestedLaTeXdate\undefined + \usepackage{array} + \else + \usepackage{array}[=2016-10-06] + \fi + %% + % Packages required by doxygen + \makeatletter + \providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion} + % suppress package identification of infwarerr as it contains the word "warning" + \let\@@protected@wlog\protected@wlog + \def\protected@wlog#1{\wlog{package info suppressed}} + \RequirePackage{infwarerr} + \let\protected@wlog\@@protected@wlog + \makeatother + \IfFormatAtLeastTF{2016/01/01}{}{\usepackage{fixltx2e}} % for \textsubscript + \IfFormatAtLeastTF{2015/01/01}{\pdfsuppresswarningpagegroup=1}{} + \usepackage{doxygen} + \usepackage{graphicx} + \usepackage[utf8]{inputenc} + \usepackage{makeidx} + \PassOptionsToPackage{warn}{textcomp} + \usepackage{textcomp} + \usepackage[nointegrals]{wasysym} + \usepackage{ifxetex} + % NLS support packages + % Define default fonts + % Font selection + \usepackage[T1]{fontenc} + % set main and monospaced font + \usepackage[scaled=.90]{helvet} +\usepackage{courier} +\renewcommand{\familydefault}{\sfdefault} + \doxyallsectionsfont{% + \fontseries{bc}\selectfont% + \color{darkgray}% + } + \renewcommand{\DoxyLabelFont}{% + \fontseries{bc}\selectfont% + \color{darkgray}% + } + \newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}} + % Arguments of doxygenemoji: + % 1) '::' form of the emoji, already LaTeX-escaped + % 2) file with the name of the emoji without the .png extension + % in case image exist use this otherwise use the '::' form + \newcommand{\doxygenemoji}[2]{% + \IfFileExists{./#2.png}{\raisebox{-0.1em}{\includegraphics[height=0.9em]{./#2.png}}}{#1}% + } + % Page & text layout + \usepackage{geometry} + \geometry{% + a4paper,% + top=2.5cm,% + bottom=2.5cm,% + left=2.5cm,% + right=2.5cm% + } + \usepackage{changepage} + % Allow a bit of overflow to go unnoticed by other means + \tolerance=750 + \hfuzz=15pt + \hbadness=750 + \setlength{\emergencystretch}{15pt} + \setlength{\parindent}{0cm} + \newcommand{\doxynormalparskip}{\setlength{\parskip}{3ex plus 2ex minus 2ex}} + \newcommand{\doxytocparskip}{\setlength{\parskip}{1ex plus 0ex minus 0ex}} + \doxynormalparskip + % Redefine paragraph/subparagraph environments, using sectsty fonts + \makeatletter + \renewcommand{\paragraph}{% + \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{% + \normalfont\normalsize\bfseries\SS@parafont% + }% + } + \renewcommand{\subparagraph}{% + \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{% + \normalfont\normalsize\bfseries\SS@subparafont% + }% + } + \makeatother + \makeatletter + \newcommand\hrulefilll{\leavevmode\leaders\hrule\hskip 0pt plus 1filll\kern\z@} + \makeatother + % Headers & footers + \usepackage{fancyhdr} + \pagestyle{fancyplain} + \renewcommand{\footrulewidth}{0.4pt} + \fancypagestyle{fancyplain}{ + \fancyhf{} + \fancyhead[LE, RO]{\bfseries\thepage} + \fancyhead[LO]{\bfseries\rightmark} + \fancyhead[RE]{\bfseries\leftmark} + \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen } + } + \fancypagestyle{plain}{ + \fancyhf{} + \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen } + \renewcommand{\headrulewidth}{0pt} + } + \pagestyle{fancyplain} + \renewcommand{\chaptermark}[1]{% + \markboth{#1}{}% + } + \renewcommand{\sectionmark}[1]{% + \markright{\thesection\ #1}% + } + % ToC, LoF, LoT, bibliography, and index + % Indices & bibliography + \usepackage{natbib} + \usepackage[titles]{tocloft} + \setcounter{tocdepth}{3} + \setcounter{secnumdepth}{5} + % creating indexes + \makeindex + \usepackage{newunicodechar} + \makeatletter + \def\doxynewunicodechar#1#2{% + \@tempswafalse + \edef\nuc@tempa{\detokenize{#1}}% + \if\relax\nuc@tempa\relax + \nuc@emptyargerr + \else + \edef\@tempb{\expandafter\@car\nuc@tempa\@nil}% + \nuc@check + \if@tempswa + \@namedef{u8:\nuc@tempa}{#2}% + \fi + \fi + } + \makeatother + \doxynewunicodechar{⁻}{${}^{-}$}% Superscript minus + \doxynewunicodechar{²}{${}^{2}$}% Superscript two + \doxynewunicodechar{³}{${}^{3}$}% Superscript three + % Hyperlinks + % Hyperlinks (required, but should be loaded last) + \ifpdf + \usepackage[pdftex,pagebackref=true]{hyperref} + \else + \ifxetex + \usepackage[pagebackref=true]{hyperref} + \else + \usepackage[ps2pdf,pagebackref=true]{hyperref} + \fi + \fi + \hypersetup{% + colorlinks=true,% + linkcolor=blue,% + citecolor=blue,% + unicode,% + pdftitle={Num\+Sim},% + pdfsubject={Numerical Simulation of fluid-\/flow}% + } + % Custom commands used by the header + % Custom commands + \newcommand{\clearemptydoublepage}{% + \newpage{\pagestyle{empty}\cleardoublepage}% + } + % caption style definition + \usepackage{caption} + \captionsetup{labelsep=space,justification=centering,font={bf},singlelinecheck=off,skip=4pt,position=top} + % in page table of contents + \IfFormatAtLeastTF{2023/05/01}{\usepackage[deeplevels]{etoc}}{\usepackage[deeplevels]{etoc_doxygen}} + \etocsettocstyle{\doxytocparskip}{\doxynormalparskip} + \etocsetlevel{subsubsubsection}{4} + \etocsetlevel{subsubsubsubsection}{5} + \etocsetlevel{subsubsubsubsubsection}{6} + \etocsetlevel{subsubsubsubsubsubsection}{7} + \etocsetlevel{paragraph}{8} + \etocsetlevel{subparagraph}{9} + % prevent numbers overlap the titles in toc + \renewcommand{\numberline}[1]{#1~} +% End of preamble, now comes the document contents +%===== C O N T E N T S ===== +\begin{document} + \raggedbottom + % Titlepage & ToC + % To avoid duplicate page anchors due to reuse of same numbers for + % the index (be it as roman numbers) + \hypersetup{pageanchor=false, + bookmarksnumbered=true, + pdfencoding=unicode + } + \pagenumbering{alph} + \begin{titlepage} + \vspace*{7cm} + \begin{center}% + {\Large Num\+Sim}\\ + [1ex]\large 1.\+0 \\ + \vspace*{1cm} + {\large Generated by Doxygen 1.10.0}\\ + \end{center} + \end{titlepage} + \clearemptydoublepage + \pagenumbering{roman} + \tableofcontents + \clearemptydoublepage + \pagenumbering{arabic} + % re-enable anchors again + \hypersetup{pageanchor=true} +%--- Begin generated contents --- +\chapter{Hierarchical Index} +\input{hierarchy} +\chapter{Class Index} +\input{annotated} +\chapter{File Index} +\input{files} +\chapter{Class Documentation} +\input{classArray2D} +\input{classBoundary} +\input{classCentralDifferences} +\input{classComputation} +\input{classDiscretization} +\input{classDonorCell} +\input{classFieldVariable} +\input{classFluidTracer} +\input{classGaussSeidel} +\input{structSettings_1_1LineContent} +\input{classMask} +\input{classOutputWriter} +\input{classOutputWriterParaview} +\input{classOutputWriterText} +\input{classPressureSolver} +\input{structSettings} +\input{classSOR} +\input{classStaggeredGrid} +\chapter{File Documentation} +\input{boundary_8h_source} +\input{mask_8h_source} +\input{computation_8h_source} +\input{central__differences_8h_source} +\input{discretization_8h_source} +\input{donor__cell_8h_source} +\input{staggered__grid_8h_source} +\input{output__writer_8h_source} +\input{output__writer__paraview_8h_source} +\input{output__writer__text_8h_source} +\input{settings_8h_source} +\input{gauss__seidel_8h_source} +\input{pressure__solver_8h_source} +\input{sor_8h_source} +\input{array2D_8h_source} +\input{field__variable_8h_source} +\input{fluid__tracer_8h_source} +%--- End generated contents --- +% Index + \backmatter + \newpage + \phantomsection + \clearemptydoublepage + \addcontentsline{toc}{chapter}{\indexname} + \printindex +% Required for some languages (in combination with latexdocumentpre from the header) +\end{document} diff --git a/documentation/latex/settings_8h_source.tex b/documentation/latex/settings_8h_source.tex new file mode 100644 index 00000000..165b262e --- /dev/null +++ b/documentation/latex/settings_8h_source.tex @@ -0,0 +1,113 @@ +\doxysection{settings.\+h} +\hypertarget{settings_8h_source}{}\label{settings_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/settings\_parser/settings.h@{/home/jonat/Documents/01\_Studium/NumSim/src/settings\_parser/settings.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00005\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00006\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00007\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00008\ } + + + +\DoxyCodeLine{00013\ \textcolor{keyword}{struct\ }\mbox{\hyperlink{structSettings}{Settings}}} +\DoxyCodeLine{00014\ \{} +\DoxyCodeLine{00015\ \ \ std::array\ \mbox{\hyperlink{structSettings_a43a0d2ee903496bfb86693a43a891a69}{nCells}};\ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00016\ \ \ std::array\ \mbox{\hyperlink{structSettings_a372a1549c306b12ca7bb0ed84f8a4cef}{physicalSize}};\ } +\DoxyCodeLine{00017\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a8b8330dfa04fe849291d68eacbc8dfec}{re}}\ =\ 1000;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00018\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a73cd9110793ede99e9ebe409e5e115fd}{endTime}}\ =\ 10.0;\ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00019\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_adaa611dc8c075474d40d7149afd310d1}{tau}}\ =\ 0.5;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00020\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a988b93fdeb6c91932043b3f746b45e86}{maximumDt}}\ =\ 0.1;\ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00021\ } +\DoxyCodeLine{00022\ \ \ std::array\ \mbox{\hyperlink{structSettings_a1a21237c7f5b7585e5a3545c7d4a4e8c}{g}}\{0.,\ 0.\};\ } +\DoxyCodeLine{00023\ } +\DoxyCodeLine{00024\ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{structSettings_a05bd5ffa1e1b48f5dc99878538596db3}{useDonorCell}}\ =\ \textcolor{keyword}{false};\ } +\DoxyCodeLine{00025\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a8b3721d24a5417caa0f2ad6f5eb85782}{alpha}}\ =\ 0.5;\ \ \ \ \ \ \ \ } +\DoxyCodeLine{00026\ } +\DoxyCodeLine{00027\ \ \ \textcolor{comment}{//\ Boundary\ Conditions\ Type}} +\DoxyCodeLine{00028\ \ \ std::string\ BCTop\ =\ \textcolor{stringliteral}{"{}NoSlip"{}};} +\DoxyCodeLine{00029\ \ \ std::string\ BCRight\ =\ \textcolor{stringliteral}{"{}NoSlip"{}};} +\DoxyCodeLine{00030\ \ \ std::string\ BCBottom\ =\ \textcolor{stringliteral}{"{}NoSlip"{}};} +\DoxyCodeLine{00031\ \ \ std::string\ BCLeft\ =\ \textcolor{stringliteral}{"{}NoSlip"{}};} +\DoxyCodeLine{00032\ } +\DoxyCodeLine{00033\ \ \ \textcolor{comment}{//\ NoSlip\ boundary\ conditions}} +\DoxyCodeLine{00034\ \ \ std::array\ \mbox{\hyperlink{structSettings_a8887591c6c157d7006051aa95896c284}{NoSlipVelTop}};\ \ \ \ } +\DoxyCodeLine{00035\ \ \ std::array\ \mbox{\hyperlink{structSettings_a2508aa084fe48e78d72b06e67c5a2006}{NoSlipVelRight}};\ \ } +\DoxyCodeLine{00036\ \ \ std::array\ \mbox{\hyperlink{structSettings_a13e254a0439df7f7bd24ffe4f919a1a4}{NoSlipVelBottom}};\ } +\DoxyCodeLine{00037\ \ \ std::array\ \mbox{\hyperlink{structSettings_aafaec8c10a728a0f115f3bed43a1c478}{NoSlipVelLeft}};\ \ \ } +\DoxyCodeLine{00038\ } +\DoxyCodeLine{00039\ \ \ \textcolor{comment}{//\ Pressure\ boundary\ conditions}} +\DoxyCodeLine{00040\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a5c8295a86e29ac27579058f07242e78c}{PressureTop}};\ \ \ \ } +\DoxyCodeLine{00041\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a8e7d49e95d30c9390fc5039f9326df32}{PressureRight}};\ \ } +\DoxyCodeLine{00042\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_acae74bcd333251c982ea347b8eb52017}{PressureBottom}};\ } +\DoxyCodeLine{00043\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_a55f2fbdeb4d9c25bc679bd1fd42f1da7}{PressureLeft}};\ \ \ } +\DoxyCodeLine{00044\ } +\DoxyCodeLine{00045\ \ \ \textcolor{comment}{//\ Create\ rectangular\ obstacle\ in\ domain}} +\DoxyCodeLine{00046\ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{structSettings_a9e871c2bbb7d1b0131eac1f30f4f7788}{createRectangularObject}}\ =\ \textcolor{keyword}{false};\ } +\DoxyCodeLine{00047\ } +\DoxyCodeLine{00048\ \ \ \textcolor{comment}{//\ Create\ domain\ from\ PNGBitmap}} +\DoxyCodeLine{00049\ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{structSettings_a6300ad5a809cdaf480f4553c3e3dbf7c}{createDomainfromBitmap}}\ =\ \textcolor{keyword}{false};\ } +\DoxyCodeLine{00050\ \ \ std::string\ \mbox{\hyperlink{structSettings_a398d6490c8731b9b74115abc34700086}{pathToBitmap}};\ } +\DoxyCodeLine{00051\ } +\DoxyCodeLine{00052\ \ \ std::array\ \mbox{\hyperlink{structSettings_aff5a1563289e354946a164fd80da5bf6}{obstaclePosition}};\ } +\DoxyCodeLine{00053\ \ \ std::array\ \mbox{\hyperlink{structSettings_ae23782f18cddfea58cb843e98cb5854f}{obstacleDimension}};\ } +\DoxyCodeLine{00054\ } +\DoxyCodeLine{00055\ \ \ std::string\ \mbox{\hyperlink{structSettings_a888e2fca33db512d4e200b49f1f618f7}{pressureSolver}}\ =\ \textcolor{stringliteral}{"{}SOR"{}};\ \ } +\DoxyCodeLine{00056\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_af5ac13128e8c442ba45eedfab06ba14c}{omega}}\ =\ 1.0;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00057\ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{structSettings_aa02bd91d026d9ded9e36004b41b068b1}{epsilon}}\ =\ 1e-\/5;\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00058\ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{structSettings_ac118e1c6052e35fb0ee38547a85d84ba}{maximumNumberOfIterations}}\ =\ 1e5;\ } +\DoxyCodeLine{00059\ } +\DoxyCodeLine{00060\ } +\DoxyCodeLine{00061\ \ \ \textcolor{comment}{//\ Fluid\ Tracer}} +\DoxyCodeLine{00062\ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{structSettings_a7f3405eef6ef103b60e7c2b01088c5ec}{useFluidTracer}}\ =\ \textcolor{keyword}{true};\ } +\DoxyCodeLine{00063\ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{structSettings_ab24c3f0faab5278e400792f8b172322a}{particlePerCell}}\ =\ 100;\ } + + + +\DoxyCodeLine{00068\ \ \ std::string\ \mbox{\hyperlink{structSettings_a70a321e56d7bc445f58a8662430fd68d}{fluidTracerMethod}}\ =\ \textcolor{stringliteral}{"{}single"{}};} +\DoxyCodeLine{00069\ \ \ \textcolor{comment}{//\ bool\ useParticleSource\ =\ false;\ //!<\ Enables\ virtual\ particles\ source}} +\DoxyCodeLine{00070\ \ \ \textcolor{comment}{//\ std::array\ particleSource\ =\ \{0.5,\ 0.5\};\ //!<\ Source\ of\ virtual\ particles}} +\DoxyCodeLine{00071\ } +\DoxyCodeLine{00072\ \ \ } +\DoxyCodeLine{00073\ } +\DoxyCodeLine{00074\ \ \ \textcolor{comment}{//\ Writer\ Options}} +\DoxyCodeLine{00075\ } + + + + +\DoxyCodeLine{00081\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{structSettings_a55f95e3b6e7379bef4f8399a2cd670cc}{loadFromFile}}(std::string\ filename);} +\DoxyCodeLine{00082\ } + + +\DoxyCodeLine{00086\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{structSettings_a68ce38117dcef2cbdd3bd17f127b3078}{printSettings}}();} +\DoxyCodeLine{00087\ } + + + +\DoxyCodeLine{00092\ \ \ \textcolor{keyword}{struct\ }\mbox{\hyperlink{structSettings_1_1LineContent}{LineContent}}} +\DoxyCodeLine{00093\ \ \ \{} +\DoxyCodeLine{00094\ \ \ \ \ std::string\ \mbox{\hyperlink{structSettings_1_1LineContent_a2fa37c56a8ebe361c95b8332fa0262d3}{parameterName}};\ } +\DoxyCodeLine{00095\ \ \ \ \ std::string\ \mbox{\hyperlink{structSettings_1_1LineContent_a0bb96393366f2e5035379ab5b99d3ab2}{value}};\ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00096\ \ \ \ \ \textcolor{keywordtype}{bool}\ \mbox{\hyperlink{structSettings_1_1LineContent_aa2af8a274c468eb68c61cd93171748e5}{isContent}};\ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00097\ \ \ \};} +\DoxyCodeLine{00098\ } + + + + +\DoxyCodeLine{00104\ \ \ \mbox{\hyperlink{structSettings_1_1LineContent}{LineContent}}\ \mbox{\hyperlink{structSettings_a6dbc25f91b99664976cd4a0a8af153c9}{readSingleLine}}(std::string\ line);} +\DoxyCodeLine{00105\ } +\DoxyCodeLine{00106\ \ \ \textcolor{comment}{//\ sets\ the\ parameter\ to\ the\ corresponding\ value}} + + + + + +\DoxyCodeLine{00113\ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{structSettings_a588f30eb8d791c03ec811360386bff0d}{setParameter}}(std::string\ parameterName,\ std::string\ value);} +\DoxyCodeLine{00114\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/sor_8h_source.tex b/documentation/latex/sor_8h_source.tex new file mode 100644 index 00000000..17ff2737 --- /dev/null +++ b/documentation/latex/sor_8h_source.tex @@ -0,0 +1,39 @@ +\doxysection{sor.\+h} +\hypertarget{sor_8h_source}{}\label{sor_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/solver/sor.h@{/home/jonat/Documents/01\_Studium/NumSim/src/solver/sor.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#pragma\ once}} +\DoxyCodeLine{00002\ } +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ "{}pressure\_solver.h"{}}} +\DoxyCodeLine{00004\ } + + + + +\DoxyCodeLine{00010\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classSOR}{SOR}}\ :\ \textcolor{keyword}{public}\ \mbox{\hyperlink{classPressureSolver}{PressureSolver}}} +\DoxyCodeLine{00011\ \{} +\DoxyCodeLine{00012\ } +\DoxyCodeLine{00013\ \textcolor{keyword}{public}:} + + + + + + + +\DoxyCodeLine{00022\ \ \ \ \ \mbox{\hyperlink{classSOR_a357cfea8935f4b2dfee06f2d8e1461a8}{SOR}}(\textcolor{keyword}{const}\ std::shared\_ptr\ \&data,} +\DoxyCodeLine{00023\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ epsilon,} +\DoxyCodeLine{00024\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{int}\ maximumNumberOfIterations,} +\DoxyCodeLine{00025\ \ \ \ \ \ \ \ \ std::shared\_ptr\ boundary,} +\DoxyCodeLine{00026\ \ \ \ \ \ \ \ \ \textcolor{keywordtype}{double}\ omega);} +\DoxyCodeLine{00027\ } + + + +\DoxyCodeLine{00032\ \ \ \ \ \textcolor{keywordtype}{void}\ \mbox{\hyperlink{classSOR_a860992d85d8aacf114a3a02b5831f728}{solve}}()\ \textcolor{keyword}{override};} +\DoxyCodeLine{00033\ } +\DoxyCodeLine{00034\ \textcolor{keyword}{private}:} +\DoxyCodeLine{00035\ \ \ \ \ \textcolor{keywordtype}{double}\ omega\_;\ } +\DoxyCodeLine{00036\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/staggered__grid_8h_source.tex b/documentation/latex/staggered__grid_8h_source.tex new file mode 100644 index 00000000..2c02da44 --- /dev/null +++ b/documentation/latex/staggered__grid_8h_source.tex @@ -0,0 +1,180 @@ +\doxysection{staggered\+\_\+grid.\+h} +\hypertarget{staggered__grid_8h_source}{}\label{staggered__grid_8h_source}\index{/home/jonat/Documents/01\_Studium/NumSim/src/discretization/staggered\_grid.h@{/home/jonat/Documents/01\_Studium/NumSim/src/discretization/staggered\_grid.h}} + +\begin{DoxyCode}{0} +\DoxyCodeLine{00001\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00002\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00003\ \textcolor{preprocessor}{\#include\ }} +\DoxyCodeLine{00004\ \textcolor{preprocessor}{\#include\ "{}../storage/field\_variable.h"{}}} +\DoxyCodeLine{00005\ } + + + + + + + +\DoxyCodeLine{00014\ \textcolor{keyword}{class\ }\mbox{\hyperlink{classStaggeredGrid}{StaggeredGrid}}} +\DoxyCodeLine{00015\ \{} +\DoxyCodeLine{00016\ \textcolor{keyword}{public}:} + + + + + +\DoxyCodeLine{00023\ \ \ \ \ \mbox{\hyperlink{classStaggeredGrid_aec0990b64c559b1690f21b48fb2d13b1}{StaggeredGrid}}(std::array\ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{nCells}},\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{meshWidth}});} +\DoxyCodeLine{00024\ } + + +\DoxyCodeLine{00028\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a330856d4efe952771daf0753ef84068e}{meshWidth}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00032\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ \mbox{\hyperlink{classStaggeredGrid_af37816ccb2c46e4a514dedac261897bf}{nCells}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00033\ } + + +\DoxyCodeLine{00037\ \ \ \ \ \textcolor{keyword}{const}\ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \&\mbox{\hyperlink{classStaggeredGrid_a87cee12621c641ab143a8b1a61b2ef7e}{u}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00041\ \ \ \ \ \textcolor{keyword}{const}\ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \&\mbox{\hyperlink{classStaggeredGrid_a26e478abba632554652c9e05a279d1ca}{v}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00045\ \ \ \ \ \textcolor{keyword}{const}\ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \&\mbox{\hyperlink{classStaggeredGrid_aafe6e0bb3509f6aad272b94f74e7ffec}{p}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00049\ \ \ \ \ \textcolor{keyword}{const}\ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \&\mbox{\hyperlink{classStaggeredGrid_a3f36422a02b9b18d1577d61e406f08cf}{rhs}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00050\ } + + +\DoxyCodeLine{00054\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classStaggeredGrid_a87cee12621c641ab143a8b1a61b2ef7e}{u}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00058\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_a87cee12621c641ab143a8b1a61b2ef7e}{u}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} +\DoxyCodeLine{00059\ } + + +\DoxyCodeLine{00063\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classStaggeredGrid_a26e478abba632554652c9e05a279d1ca}{v}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00067\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_a26e478abba632554652c9e05a279d1ca}{v}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} +\DoxyCodeLine{00068\ } + + +\DoxyCodeLine{00072\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classStaggeredGrid_aafe6e0bb3509f6aad272b94f74e7ffec}{p}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j)\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00076\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_aafe6e0bb3509f6aad272b94f74e7ffec}{p}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} +\DoxyCodeLine{00077\ } + + +\DoxyCodeLine{00081\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_adb05c59512dc8993367e4beddba05785}{f}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} + + +\DoxyCodeLine{00085\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_aaf849bec40f7fa7c68823038f0877341}{g}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} + + +\DoxyCodeLine{00089\ \ \ \ \ \textcolor{keywordtype}{double}\ \&\mbox{\hyperlink{classStaggeredGrid_a3f36422a02b9b18d1577d61e406f08cf}{rhs}}(\textcolor{keywordtype}{int}\ i,\ \textcolor{keywordtype}{int}\ j);} +\DoxyCodeLine{00090\ } + + +\DoxyCodeLine{00094\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classStaggeredGrid_aec8490affea703cdd73b1febaed68968}{dx}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00098\ \ \ \ \ \textcolor{keywordtype}{double}\ \mbox{\hyperlink{classStaggeredGrid_abde2da10e0c130fb0f206de64c9b4956}{dy}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00099\ } + + +\DoxyCodeLine{00103\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a31e2d3a0b6e03685380810a7c2f323e1}{uIBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00107\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a641e473d72e1d02ba3de1c16e9d0d332}{uIEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00108\ } + + +\DoxyCodeLine{00112\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a9b0e97704e1871441a8e713ecaa2cff5}{uJBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00116\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a3393aa91b17054d2d700de308ae25632}{uJEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00117\ } + + +\DoxyCodeLine{00121\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ace7bf8cb1d279131739d5d12de302d09}{vIBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00125\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_aa5a44aa088b5a7923fa952af1ecb5778}{vIEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00126\ } + + +\DoxyCodeLine{00130\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a7f8468d672411c0e3a5eeb67788fc826}{vJBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00134\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ab67e8d9d8d76d34fb02d4d644f0b3795}{vJEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00135\ } + + +\DoxyCodeLine{00139\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a9922c955707f2a31a4a27d1d696f002e}{pIBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00143\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a34f16fdf87971fe84ffc3c84722bb2c7}{pIEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00144\ } + + +\DoxyCodeLine{00148\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ae4c9ba16c5635dc1ffaa264fbcc3e034}{pJBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00152\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ad9928ee522eedb7d7fd48ca0b92f2795}{pJEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00153\ } + + +\DoxyCodeLine{00157\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a5cc368f9ede58a3cb689705df998f750}{fIBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00161\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a8162b849231354ba73aacb085b5cd665}{fIEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00162\ } + + +\DoxyCodeLine{00166\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ab92aca90331200d0cc7bc0c0a857b4ef}{fJBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00170\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a7ac43ac86231987bc0bf6565589d52e1}{fJEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00171\ } + + +\DoxyCodeLine{00175\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a061fb6d6948cdc3054171dd60842a8c3}{gIBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00179\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_aebc76693e5dd61db521d6763236bf664}{gIEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00180\ } + + +\DoxyCodeLine{00184\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a18ca3a121787b19c18886b0945aca2e3}{gJBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00188\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a7a29456e1bce9efffa27de0b41957b50}{gJEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00189\ } + + +\DoxyCodeLine{00193\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ad5c16b00d9dbf0f115e1ded81203edce}{rhsIBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00197\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_ae11e8842fdd508b914dc8f24b09b36a9}{rhsIEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00198\ } + + +\DoxyCodeLine{00202\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a28c36939e3d3cc8df76e7aa91f0e0804}{rhsJBegin}}()\ \textcolor{keyword}{const};} + + +\DoxyCodeLine{00206\ \ \ \ \ \textcolor{keywordtype}{int}\ \mbox{\hyperlink{classStaggeredGrid_a953ec890a986473bffe87ea26dfcd782}{rhsJEnd}}()\ \textcolor{keyword}{const};} +\DoxyCodeLine{00207\ } +\DoxyCodeLine{00208\ \textcolor{keyword}{protected}:} +\DoxyCodeLine{00209\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ \mbox{\hyperlink{classStaggeredGrid_acacffb5739539d9015c986080bb5ed44}{nCells\_}};\ \ \ \ \ \ \ } +\DoxyCodeLine{00210\ \ \ \ \ \textcolor{keyword}{const}\ std::array\ \mbox{\hyperlink{classStaggeredGrid_a9603c3334440aab082dda48947e5ce6e}{meshWidth\_}};\ } +\DoxyCodeLine{00211\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_adcef36b4ce8cc6843a2b6f603b62c763}{u\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00212\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_a20ec43568fe937b194561e21a0b84ad9}{v\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00213\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_a2ea3c93dd401ac06461ade9a74e76459}{p\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00214\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_a94933ac0c6e0d2a794f46c7a97d72f75}{f\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00215\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_a5f5c88f603d4e503cba4c44ed43de46a}{g\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00216\ \ \ \ \ \mbox{\hyperlink{classFieldVariable}{FieldVariable}}\ \mbox{\hyperlink{classStaggeredGrid_a496206955162452a0629a7742fe92a84}{rhs\_}};\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ } +\DoxyCodeLine{00217\ \};} + +\end{DoxyCode} diff --git a/documentation/latex/structSettings.tex b/documentation/latex/structSettings.tex new file mode 100644 index 00000000..6c77c425 --- /dev/null +++ b/documentation/latex/structSettings.tex @@ -0,0 +1,192 @@ +\doxysection{Settings Struct Reference} +\hypertarget{structSettings}{}\label{structSettings}\index{Settings@{Settings}} + + +All settings that parametrize a simulation run. + + + + +{\ttfamily \#include $<$settings.\+h$>$} + +\doxysubsubsection*{Classes} +\begin{DoxyCompactItemize} +\item +struct \mbox{\hyperlink{structSettings_1_1LineContent}{Line\+Content}} +\begin{DoxyCompactList}\small\item\em Contains the content of a single line in a file. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Public Member Functions} +\begin{DoxyCompactItemize} +\item +void \mbox{\hyperlink{structSettings_a55f95e3b6e7379bef4f8399a2cd670cc}{load\+From\+File}} (std\+::string filename) +\begin{DoxyCompactList}\small\item\em Parse a text file with settings. \end{DoxyCompactList}\item +\Hypertarget{structSettings_a68ce38117dcef2cbdd3bd17f127b3078}\label{structSettings_a68ce38117dcef2cbdd3bd17f127b3078} +void {\bfseries print\+Settings} () +\begin{DoxyCompactList}\small\item\em Print all setting to terminal. \end{DoxyCompactList}\item +\mbox{\hyperlink{structSettings_1_1LineContent}{Line\+Content}} \mbox{\hyperlink{structSettings_a6dbc25f91b99664976cd4a0a8af153c9}{read\+Single\+Line}} (std\+::string line) +\begin{DoxyCompactList}\small\item\em Reads one line of the settings file. \end{DoxyCompactList}\item +void \mbox{\hyperlink{structSettings_a588f30eb8d791c03ec811360386bff0d}{set\+Parameter}} (std\+::string parameter\+Name, std\+::string value) +\begin{DoxyCompactList}\small\item\em Sets the parameter to the corresponding value. \end{DoxyCompactList}\end{DoxyCompactItemize} +\doxysubsubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{structSettings_a43a0d2ee903496bfb86693a43a891a69}\label{structSettings_a43a0d2ee903496bfb86693a43a891a69} +std\+::array$<$ int, 2 $>$ {\bfseries n\+Cells} +\begin{DoxyCompactList}\small\item\em number of cells in x and y direction \end{DoxyCompactList}\item +\Hypertarget{structSettings_a372a1549c306b12ca7bb0ed84f8a4cef}\label{structSettings_a372a1549c306b12ca7bb0ed84f8a4cef} +std\+::array$<$ double, 2 $>$ {\bfseries physical\+Size} +\begin{DoxyCompactList}\small\item\em physical size of the domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_a8b8330dfa04fe849291d68eacbc8dfec}\label{structSettings_a8b8330dfa04fe849291d68eacbc8dfec} +double {\bfseries re} = 1000 +\begin{DoxyCompactList}\small\item\em reynolds number \end{DoxyCompactList}\item +\Hypertarget{structSettings_a73cd9110793ede99e9ebe409e5e115fd}\label{structSettings_a73cd9110793ede99e9ebe409e5e115fd} +double {\bfseries end\+Time} = 10.\+0 +\begin{DoxyCompactList}\small\item\em end time of the simulation \end{DoxyCompactList}\item +\Hypertarget{structSettings_adaa611dc8c075474d40d7149afd310d1}\label{structSettings_adaa611dc8c075474d40d7149afd310d1} +double {\bfseries tau} = 0.\+5 +\begin{DoxyCompactList}\small\item\em safety factor for time step width \end{DoxyCompactList}\item +\Hypertarget{structSettings_a988b93fdeb6c91932043b3f746b45e86}\label{structSettings_a988b93fdeb6c91932043b3f746b45e86} +double {\bfseries maximum\+Dt} = 0.\+1 +\begin{DoxyCompactList}\small\item\em maximum time step width \end{DoxyCompactList}\item +\Hypertarget{structSettings_a1a21237c7f5b7585e5a3545c7d4a4e8c}\label{structSettings_a1a21237c7f5b7585e5a3545c7d4a4e8c} +std\+::array$<$ double, 2 $>$ {\bfseries g} \{0., 0.\} +\begin{DoxyCompactList}\small\item\em external forces \end{DoxyCompactList}\item +\Hypertarget{structSettings_a05bd5ffa1e1b48f5dc99878538596db3}\label{structSettings_a05bd5ffa1e1b48f5dc99878538596db3} +bool {\bfseries use\+Donor\+Cell} = false +\begin{DoxyCompactList}\small\item\em if the donor cell scheme schould be used \end{DoxyCompactList}\item +\Hypertarget{structSettings_a8b3721d24a5417caa0f2ad6f5eb85782}\label{structSettings_a8b3721d24a5417caa0f2ad6f5eb85782} +double {\bfseries alpha} = 0.\+5 +\begin{DoxyCompactList}\small\item\em factor for donor-\/cell scheme \end{DoxyCompactList}\item +\Hypertarget{structSettings_a90549573af4f6c2c60ac640321fe1956}\label{structSettings_a90549573af4f6c2c60ac640321fe1956} +std\+::string {\bfseries BCTop} = "{}No\+Slip"{} +\item +\Hypertarget{structSettings_a4f6f4dbc9e08834584809de5e553e5cd}\label{structSettings_a4f6f4dbc9e08834584809de5e553e5cd} +std\+::string {\bfseries BCRight} = "{}No\+Slip"{} +\item +\Hypertarget{structSettings_a8003d11fa49639f3f827123d42f5f0ce}\label{structSettings_a8003d11fa49639f3f827123d42f5f0ce} +std\+::string {\bfseries BCBottom} = "{}No\+Slip"{} +\item +\Hypertarget{structSettings_ac411ff66a486b89fba9dc520b6e305e3}\label{structSettings_ac411ff66a486b89fba9dc520b6e305e3} +std\+::string {\bfseries BCLeft} = "{}No\+Slip"{} +\item +\Hypertarget{structSettings_a8887591c6c157d7006051aa95896c284}\label{structSettings_a8887591c6c157d7006051aa95896c284} +std\+::array$<$ double, 2 $>$ {\bfseries No\+Slip\+Vel\+Top} +\begin{DoxyCompactList}\small\item\em prescribed values of u,v at top of domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_a2508aa084fe48e78d72b06e67c5a2006}\label{structSettings_a2508aa084fe48e78d72b06e67c5a2006} +std\+::array$<$ double, 2 $>$ {\bfseries No\+Slip\+Vel\+Right} +\begin{DoxyCompactList}\small\item\em prescribed values of u,v at right of domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_a13e254a0439df7f7bd24ffe4f919a1a4}\label{structSettings_a13e254a0439df7f7bd24ffe4f919a1a4} +std\+::array$<$ double, 2 $>$ {\bfseries No\+Slip\+Vel\+Bottom} +\begin{DoxyCompactList}\small\item\em prescribed values of u,v at bottom of domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_aafaec8c10a728a0f115f3bed43a1c478}\label{structSettings_aafaec8c10a728a0f115f3bed43a1c478} +std\+::array$<$ double, 2 $>$ {\bfseries No\+Slip\+Vel\+Left} +\begin{DoxyCompactList}\small\item\em prescribed values of u,v at left of domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_a5c8295a86e29ac27579058f07242e78c}\label{structSettings_a5c8295a86e29ac27579058f07242e78c} +double {\bfseries Pressure\+Top} +\begin{DoxyCompactList}\small\item\em prescribed pressure BC top of domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_a8e7d49e95d30c9390fc5039f9326df32}\label{structSettings_a8e7d49e95d30c9390fc5039f9326df32} +double {\bfseries Pressure\+Right} +\begin{DoxyCompactList}\small\item\em prescribed pressure BC right of domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_acae74bcd333251c982ea347b8eb52017}\label{structSettings_acae74bcd333251c982ea347b8eb52017} +double {\bfseries Pressure\+Bottom} +\begin{DoxyCompactList}\small\item\em prescribed pressure BC bottom of domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_a55f2fbdeb4d9c25bc679bd1fd42f1da7}\label{structSettings_a55f2fbdeb4d9c25bc679bd1fd42f1da7} +double {\bfseries Pressure\+Left} +\begin{DoxyCompactList}\small\item\em prescribed pressure BC left of domain \end{DoxyCompactList}\item +\Hypertarget{structSettings_a9e871c2bbb7d1b0131eac1f30f4f7788}\label{structSettings_a9e871c2bbb7d1b0131eac1f30f4f7788} +bool {\bfseries create\+Rectangular\+Object} = false +\begin{DoxyCompactList}\small\item\em wheter a rectangular object in domain should be created \end{DoxyCompactList}\item +\Hypertarget{structSettings_a6300ad5a809cdaf480f4553c3e3dbf7c}\label{structSettings_a6300ad5a809cdaf480f4553c3e3dbf7c} +bool {\bfseries create\+Domainfrom\+Bitmap} = false +\begin{DoxyCompactList}\small\item\em wheter domain should be created from bitmap \end{DoxyCompactList}\item +\Hypertarget{structSettings_a398d6490c8731b9b74115abc34700086}\label{structSettings_a398d6490c8731b9b74115abc34700086} +std\+::string {\bfseries path\+To\+Bitmap} +\begin{DoxyCompactList}\small\item\em path to bitmap \end{DoxyCompactList}\item +\Hypertarget{structSettings_aff5a1563289e354946a164fd80da5bf6}\label{structSettings_aff5a1563289e354946a164fd80da5bf6} +std\+::array$<$ double, 2 $>$ {\bfseries obstacle\+Position} +\begin{DoxyCompactList}\small\item\em x and y position of rectangular object \end{DoxyCompactList}\item +\Hypertarget{structSettings_ae23782f18cddfea58cb843e98cb5854f}\label{structSettings_ae23782f18cddfea58cb843e98cb5854f} +std\+::array$<$ double, 2 $>$ {\bfseries obstacle\+Dimension} +\begin{DoxyCompactList}\small\item\em x and y dimension of rectangular object \end{DoxyCompactList}\item +\Hypertarget{structSettings_a888e2fca33db512d4e200b49f1f618f7}\label{structSettings_a888e2fca33db512d4e200b49f1f618f7} +std\+::string {\bfseries pressure\+Solver} = "{}SOR"{} +\begin{DoxyCompactList}\small\item\em which pressure solver to use, "{}\+Gauss\+Seidel"{} or "{}\+SOR"{} \end{DoxyCompactList}\item +\Hypertarget{structSettings_af5ac13128e8c442ba45eedfab06ba14c}\label{structSettings_af5ac13128e8c442ba45eedfab06ba14c} +double {\bfseries omega} = 1.\+0 +\begin{DoxyCompactList}\small\item\em overrelaxation factor \end{DoxyCompactList}\item +\Hypertarget{structSettings_aa02bd91d026d9ded9e36004b41b068b1}\label{structSettings_aa02bd91d026d9ded9e36004b41b068b1} +double {\bfseries epsilon} = 1e-\/5 +\begin{DoxyCompactList}\small\item\em tolerance for the residual in the pressure solver \end{DoxyCompactList}\item +\Hypertarget{structSettings_ac118e1c6052e35fb0ee38547a85d84ba}\label{structSettings_ac118e1c6052e35fb0ee38547a85d84ba} +int {\bfseries maximum\+Number\+Of\+Iterations} = 1e5 +\begin{DoxyCompactList}\small\item\em maximum number of iterations in the solver \end{DoxyCompactList}\item +\Hypertarget{structSettings_a7f3405eef6ef103b60e7c2b01088c5ec}\label{structSettings_a7f3405eef6ef103b60e7c2b01088c5ec} +bool {\bfseries use\+Fluid\+Tracer} = true +\begin{DoxyCompactList}\small\item\em Enables Open Surface Evolution. \end{DoxyCompactList}\item +\Hypertarget{structSettings_ab24c3f0faab5278e400792f8b172322a}\label{structSettings_ab24c3f0faab5278e400792f8b172322a} +int {\bfseries particle\+Per\+Cell} = 100 +\begin{DoxyCompactList}\small\item\em Initializes with given virtual particles per cell. \end{DoxyCompactList}\item +std\+::string \mbox{\hyperlink{structSettings_a70a321e56d7bc445f58a8662430fd68d}{fluid\+Tracer\+Method}} = "{}single"{} +\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +All settings that parametrize a simulation run. + +\doxysubsection{Member Function Documentation} +\Hypertarget{structSettings_a55f95e3b6e7379bef4f8399a2cd670cc}\label{structSettings_a55f95e3b6e7379bef4f8399a2cd670cc} +\index{Settings@{Settings}!loadFromFile@{loadFromFile}} +\index{loadFromFile@{loadFromFile}!Settings@{Settings}} +\doxysubsubsection{\texorpdfstring{loadFromFile()}{loadFromFile()}} +{\footnotesize\ttfamily void Settings\+::load\+From\+File (\begin{DoxyParamCaption}\item[{std\+::string}]{filename }\end{DoxyParamCaption})} + + + +Parse a text file with settings. + +Each line contains "{}$<$parameter\+Name$>$ = $<$value$>$"{} \Hypertarget{structSettings_a6dbc25f91b99664976cd4a0a8af153c9}\label{structSettings_a6dbc25f91b99664976cd4a0a8af153c9} +\index{Settings@{Settings}!readSingleLine@{readSingleLine}} +\index{readSingleLine@{readSingleLine}!Settings@{Settings}} +\doxysubsubsection{\texorpdfstring{readSingleLine()}{readSingleLine()}} +{\footnotesize\ttfamily \mbox{\hyperlink{structSettings_1_1LineContent}{Settings\+::\+Line\+Content}} Settings\+::read\+Single\+Line (\begin{DoxyParamCaption}\item[{std\+::string}]{line }\end{DoxyParamCaption})} + + + +Reads one line of the settings file. + + +\begin{DoxyParams}{Parameters} +{\em line} & line of file to read \\ +\hline +\end{DoxyParams} +\Hypertarget{structSettings_a588f30eb8d791c03ec811360386bff0d}\label{structSettings_a588f30eb8d791c03ec811360386bff0d} +\index{Settings@{Settings}!setParameter@{setParameter}} +\index{setParameter@{setParameter}!Settings@{Settings}} +\doxysubsubsection{\texorpdfstring{setParameter()}{setParameter()}} +{\footnotesize\ttfamily void Settings\+::set\+Parameter (\begin{DoxyParamCaption}\item[{std\+::string}]{parameter\+Name, }\item[{std\+::string}]{value }\end{DoxyParamCaption})} + + + +Sets the parameter to the corresponding value. + + +\begin{DoxyParams}{Parameters} +{\em parameter\+Name} & paramter name \\ +\hline +{\em value} & of parameter \\ +\hline +\end{DoxyParams} + + +\doxysubsection{Member Data Documentation} +\Hypertarget{structSettings_a70a321e56d7bc445f58a8662430fd68d}\label{structSettings_a70a321e56d7bc445f58a8662430fd68d} +\index{Settings@{Settings}!fluidTracerMethod@{fluidTracerMethod}} +\index{fluidTracerMethod@{fluidTracerMethod}!Settings@{Settings}} +\doxysubsubsection{\texorpdfstring{fluidTracerMethod}{fluidTracerMethod}} +{\footnotesize\ttfamily std\+::string Settings\+::fluid\+Tracer\+Method = "{}single"{}} + +{\ttfamily single} -\/\texorpdfstring{$>$}{>} one virtual particles is enough for fluid cell {\ttfamily threshold} -\/\texorpdfstring{$>$}{>} aims at a constant amount of fluid cells + +The documentation for this struct was generated from the following files\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/settings\+\_\+parser/settings.\+h\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/settings\+\_\+parser/settings.\+cpp\end{DoxyCompactItemize} diff --git a/documentation/latex/structSettings_1_1LineContent.tex b/documentation/latex/structSettings_1_1LineContent.tex new file mode 100644 index 00000000..30f38489 --- /dev/null +++ b/documentation/latex/structSettings_1_1LineContent.tex @@ -0,0 +1,31 @@ +\doxysection{Settings\+::Line\+Content Struct Reference} +\hypertarget{structSettings_1_1LineContent}{}\label{structSettings_1_1LineContent}\index{Settings::LineContent@{Settings::LineContent}} + + +Contains the content of a single line in a file. + + + + +{\ttfamily \#include $<$settings.\+h$>$} + +\doxysubsubsection*{Public Attributes} +\begin{DoxyCompactItemize} +\item +\Hypertarget{structSettings_1_1LineContent_a2fa37c56a8ebe361c95b8332fa0262d3}\label{structSettings_1_1LineContent_a2fa37c56a8ebe361c95b8332fa0262d3} +std\+::string {\bfseries parameter\+Name} +\begin{DoxyCompactList}\small\item\em Name of parameter. \end{DoxyCompactList}\item +\Hypertarget{structSettings_1_1LineContent_a0bb96393366f2e5035379ab5b99d3ab2}\label{structSettings_1_1LineContent_a0bb96393366f2e5035379ab5b99d3ab2} +std\+::string {\bfseries value} +\begin{DoxyCompactList}\small\item\em value of the parameter \end{DoxyCompactList}\item +\Hypertarget{structSettings_1_1LineContent_aa2af8a274c468eb68c61cd93171748e5}\label{structSettings_1_1LineContent_aa2af8a274c468eb68c61cd93171748e5} +bool {\bfseries is\+Content} +\begin{DoxyCompactList}\small\item\em whether line is readable parameter or comment \end{DoxyCompactList}\end{DoxyCompactItemize} + + +\doxysubsection{Detailed Description} +Contains the content of a single line in a file. + +The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize} +\item +/home/jonat/\+Documents/01\+\_\+\+Studium/\+Num\+Sim/src/settings\+\_\+parser/settings.\+h\end{DoxyCompactItemize} diff --git a/documentation/latex/tabu_doxygen.sty b/documentation/latex/tabu_doxygen.sty new file mode 100644 index 00000000..3f17d1d0 --- /dev/null +++ b/documentation/latex/tabu_doxygen.sty @@ -0,0 +1,2557 @@ +%% +%% This is file `tabu.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% tabu.dtx (with options: `package') +%% +%% This is a generated file. +%% Copyright (FC) 2010-2011 - lppl +%% +%% tabu : 2011/02/26 v2.8 - tabu : Flexible LaTeX tabulars +%% +%% ********************************************************************************************** +%% \begin{tabu} { preamble } => default target: \linewidth or \linegoal +%% \begin{tabu} to { preamble } => target specified +%% \begin{tabu} spread { preamble } => target relative to the ``natural width'' +%% +%% tabu works in text and in math modes. +%% +%% X columns: automatic width adjustment + horizontal and vertical alignment +%% \begin{tabu} { X[4c] X[1c] X[-2ml] } +%% +%% Horizontal lines and / or leaders: +%% \hline\hline => double horizontal line +%% \firsthline\hline => for nested tabulars +%% \lasthline\hline => for nested tabulars +%% \tabucline[line spec]{column-column} => ``funny'' lines (dash/leader) +%% Automatic lines / leaders : +%% \everyrow{\hline\hline} +%% +%% Vertical lines and / or leaders: +%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt blue] } +%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt on 2pt off 4pt blue] } +%% +%% Fixed vertical spacing adjustment: +%% \extrarowheight= \extrarowdepth= +%% or: \extrarowsep= => may be prefixed by \global +%% +%% Dynamic vertical spacing adjustment: +%% \abovetabulinesep= \belowtabulinesep= +%% or: \tabulinesep= => may be prefixed by \global +%% +%% delarray.sty shortcuts: in math and text modes +%% \begin{tabu} .... \({ preamble }\) +%% +%% Algorithms reports: +%% \tracingtabu=1 \tracingtabu=2 +%% +%% ********************************************************************************************** +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3 of this license or (at your option) any later +%% version. The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% +%% This work consists of the main source file tabu.dtx +%% and the derived files +%% tabu.sty, tabu.pdf, tabu.ins +%% +%% tabu : Flexible LaTeX tabulars +%% lppl copyright 2010-2011 by FC +%% + +\NeedsTeXFormat{LaTeX2e}[2005/12/01] +\ProvidesPackage{tabu_doxygen}[2011/02/26 v2.8 - flexible LaTeX tabulars (FC), frozen version for doxygen] +\RequirePackage{array}[2008/09/09] +\RequirePackage{varwidth}[2009/03/30] +\AtEndOfPackage{\tabu@AtEnd \let\tabu@AtEnd \@undefined} +\let\tabu@AtEnd\@empty +\def\TMP@EnsureCode#1={% + \edef\tabu@AtEnd{\tabu@AtEnd + \catcode#1 \the\catcode#1}% + \catcode#1=% +}% \TMP@EnsureCode +\TMP@EnsureCode 33 = 12 % ! +\TMP@EnsureCode 58 = 12 % : (for siunitx) +\TMP@EnsureCode124 = 12 % | +\TMP@EnsureCode 36 = 3 % $ = math shift +\TMP@EnsureCode 38 = 4 % & = tab alignment character +\TMP@EnsureCode 32 = 10 % space +\TMP@EnsureCode 94 = 7 % ^ +\TMP@EnsureCode 95 = 8 % _ +%% Constants -------------------------------------------------------- +\newcount \c@taburow \def\thetaburow {\number\c@taburow} +\newcount \tabu@nbcols +\newcount \tabu@cnt +\newcount \tabu@Xcol +\let\tabu@start \@tempcnta +\let\tabu@stop \@tempcntb +\newcount \tabu@alloc \tabu@alloc=\m@ne +\newcount \tabu@nested +\def\tabu@alloc@{\global\advance\tabu@alloc \@ne \tabu@nested\tabu@alloc} +\newdimen \tabu@target +\newdimen \tabu@spreadtarget +\newdimen \tabu@naturalX +\newdimen \tabucolX +\let\tabu@DELTA \@tempdimc +\let\tabu@thick \@tempdima +\let\tabu@on \@tempdimb +\let\tabu@off \@tempdimc +\newdimen \tabu@Xsum +\newdimen \extrarowdepth +\newdimen \abovetabulinesep +\newdimen \belowtabulinesep +\newdimen \tabustrutrule \tabustrutrule \z@ +\newtoks \tabu@thebody +\newtoks \tabu@footnotes +\newsavebox \tabu@box +\newsavebox \tabu@arstrutbox +\newsavebox \tabu@hleads +\newsavebox \tabu@vleads +\newif \iftabu@colortbl +\newif \iftabu@siunitx +\newif \iftabu@measuring +\newif \iftabu@spread +\newif \iftabu@negcoef +\newif \iftabu@everyrow +\def\tabu@everyrowtrue {\global\let\iftabu@everyrow \iftrue} +\def\tabu@everyrowfalse{\global\let\iftabu@everyrow \iffalse} +\newif \iftabu@long +\newif \iftabuscantokens +\def\tabu@rescan {\tabu@verbatim \scantokens } +%% Utilities (for internal usage) ----------------------------------- +\def\tabu@gobblespace #1 {#1} +\def\tabu@gobbletoken #1#2{#1} +\def\tabu@gobbleX{\futurelet\@let@token \tabu@gobblex} +\def\tabu@gobblex{\if ^^J\noexpand\@let@token \expandafter\@gobble + \else\ifx \@sptoken\@let@token + \expandafter\tabu@gobblespace\expandafter\tabu@gobbleX + \fi\fi +}% \tabu@gobblex +\def\tabu@X{^^J} +{\obeyspaces +\global\let\tabu@spxiii= % saves an active space (for \ifx) +\gdef\tabu@@spxiii{ }} +\def\tabu@ifenvir {% only for \multicolumn + \expandafter\tabu@if@nvir\csname\@currenvir\endcsname +}% \tabu@ifenvir +\def\tabu@if@nvir #1{\csname @\ifx\tabu#1first\else + \ifx\longtabu#1first\else + second\fi\fi oftwo\endcsname +}% \tabu@ifenvir +\def\tabu@modulo #1#2{\numexpr\ifnum\numexpr#1=\z@ 0\else #1-(#1-(#2-1)/2)/(#2)*(#2)\fi} +{\catcode`\&=3 +\gdef\tabu@strtrim #1{% #1 = control sequence to trim + \ifodd 1\ifx #1\@empty \else \ifx #1\space \else 0\fi \fi + \let\tabu@c@l@r \@empty \let#1\@empty + \else \expandafter \tabu@trimspaces #1\@nnil + \fi +}% \tabu@strtrim +\gdef\tabu@trimspaces #1\@nnil{\let\tabu@c@l@r=#2\tabu@firstspace .#1& }% +\gdef\tabu@firstspace #1#2#3 &{\tabu@lastspace #2#3&} +\gdef\tabu@lastspace #1{\def #3{#1}% + \ifx #3\tabu@c@l@r \def\tabu@c@l@r{\protect\color{#1}}\expandafter\remove@to@nnil \fi + \tabu@trimspaces #1\@nnil} +}% \catcode +\def\tabu@sanitizearg #1#2{{% + \csname \ifcsname if@safe@actives\endcsname % + @safe@activestrue\else + relax\fi \endcsname + \edef#2{#1}\tabu@strtrim#2\@onelevel@sanitize#2% + \expandafter}\expandafter\def\expandafter#2\expandafter{#2}% +}% \tabu@sanitizearg +\def\tabu@textbar #1{\begingroup \endlinechar\m@ne \scantokens{\def\:{|}}% + \expandafter\endgroup \expandafter#1\:% !!! semi simple group !!! +}% \tabu@textbar +\def\tabu@everyrow@bgroup{\iftabu@everyrow \begingroup \else \noalign{\ifnum0=`}\fi \fi} +\def\tabu@everyrow@egroup{% + \iftabu@everyrow \expandafter \endgroup \the\toks@ + \else \ifnum0=`{\fi}% + \fi +}% \tabu@everyrow@egroup +\def\tabu@arstrut {\global\setbox\@arstrutbox \hbox{\vrule + height \arraystretch \dimexpr\ht\strutbox+\extrarowheight + depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth + width \z@}% +}% \tabu@arstrut +\def\tabu@rearstrut {% + \@tempdima \arraystretch\dimexpr\ht\strutbox+\extrarowheight \relax + \@tempdimb \arraystretch\dimexpr\dp\strutbox+\extrarowdepth \relax + \ifodd 1\ifdim \ht\@arstrutbox=\@tempdima + \ifdim \dp\@arstrutbox=\@tempdimb 0 \fi\fi + \tabu@mkarstrut + \fi +}% \tabu@rearstrut +\def\tabu@@DBG #1{\ifdim\tabustrutrule>\z@ \color{#1}\fi} +\def\tabu@DBG@arstrut {\global\setbox\@arstrutbox + \hbox to\z@{\hbox to\z@{\hss + {\tabu@DBG{cyan}\vrule + height \arraystretch \dimexpr\ht\strutbox+\extrarowheight + depth \z@ + width \tabustrutrule}\kern-\tabustrutrule + {\tabu@DBG{pink}\vrule + height \z@ + depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth + width \tabustrutrule}}}% +}% \tabu@DBG@arstrut +\def\tabu@save@decl{\toks\count@ \expandafter{\the\toks\expandafter\count@ + \@nextchar}}% +\def\tabu@savedecl{\ifcat$\d@llarend\else + \let\save@decl \tabu@save@decl \fi % no inversion of tokens in text mode +}% \tabu@savedecl +\def\tabu@finalstrut #1{\unskip\ifhmode\nobreak\fi\vrule height\z@ depth\z@ width\z@} +\newcommand*\tabuDisableCommands {\g@addto@macro\tabu@trialh@@k } +\let\tabu@trialh@@k \@empty +\def\tabu@nowrite #1#{{\afterassignment}\toks@} +\let\tabu@write\write +\let\tabu@immediate\immediate +\def\tabu@WRITE{\begingroup + \def\immediate\write{\aftergroup\endgroup + \tabu@immediate\tabu@write}% +}% \tabu@WRITE +\expandafter\def\expandafter\tabu@GenericError\expandafter{% + \expandafter\tabu@WRITE\GenericError} +\def\tabu@warn{\tabu@WRITE\PackageWarning{tabu}} +\def\tabu@noxfootnote [#1]{\@gobble} +\def\tabu@nocolor #1#{\@gobble} +\newcommand*\tabu@norowcolor[2][]{} +\def\tabu@maybesiunitx #1{\def\tabu@temp{#1}% + \futurelet\@let@token \tabu@m@ybesiunitx} +\def\tabu@m@ybesiunitx #1{\def\tabu@m@ybesiunitx {% + \ifx #1\@let@token \let\tabu@cellleft \@empty \let\tabu@cellright \@empty \fi + \tabu@temp}% \tabu@m@ybesiunitx +}\expandafter\tabu@m@ybesiunitx \csname siunitx_table_collect_begin:Nn\endcsname +\def\tabu@celllalign@def #1{\def\tabu@celllalign{\tabu@maybesiunitx{#1}}}% +%% Fixed vertical spacing adjustment: \extrarowsep ------------------ +\newcommand*\extrarowsep{\edef\tabu@C@extra{\the\numexpr\tabu@C@extra+1}% + \iftabu@everyrow \aftergroup\tabu@Gextra + \else \aftergroup\tabu@n@Gextra + \fi + \@ifnextchar={\tabu@gobbletoken\tabu@extra} \tabu@extra +}% \extrarowsep +\def\tabu@extra {\@ifnextchar_% + {\tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}} + {\ifx ^\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}}% + \else \let\tabu@temp \@empty + \afterassignment \tabu@setextrasep \extrarowdepth + \fi \tabu@temp}% +}% \tabu@extra +\def\tabu@setextra #1#2{\def\tabu@temp{\tabu@extr@#1#2}\afterassignment\tabu@temp#2} +\def\tabu@extr@ #1#2{\@ifnextchar^% + {\tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}} + {\ifx _\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}}% + \else \let\tabu@temp \@empty + \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth + \fi \tabu@temp}% +}% \tabu@extr@ +\def\tabu@setextrasep {\extrarowheight=\extrarowdepth + \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth +}% \tabu@setextrasep +\def\tabu@Gextra{\ifx \tabu@G@extra\@empty \else {\tabu@Rextra}\fi} +\def\tabu@n@Gextra{\ifx \tabu@G@extra\@empty \else \noalign{\tabu@Rextra}\fi} +\def\tabu@Rextra{\tabu@Grestore \tabu@G@extra \tabu@C@extra} +\let\tabu@C@extra \z@ +\let\tabu@G@extra \@empty +%% Dynamic vertical spacing adjustment: \tabulinesep ---------------- +\newcommand*\tabulinesep{\edef\tabu@C@linesep{\the\numexpr\tabu@C@linesep+1}% + \iftabu@everyrow \aftergroup\tabu@Glinesep + \else \aftergroup\tabu@n@Glinesep + \fi + \@ifnextchar={\tabu@gobbletoken\tabu@linesep} \tabu@linesep +}% \tabulinesep +\def\tabu@linesep {\@ifnextchar_% + {\tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}} + {\ifx ^\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}}% + \else \let\tabu@temp \@empty + \afterassignment \tabu@setlinesep \abovetabulinesep + \fi \tabu@temp}% +}% \tabu@linesep +\def\tabu@setsep #1#2{\def\tabu@temp{\tabu@sets@p#1#2}\afterassignment\tabu@temp#2} +\def\tabu@sets@p #1#2{\@ifnextchar^% + {\tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}} + {\ifx _\@let@token \def\tabu@temp{% + \tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}}% + \else \let\tabu@temp \@empty + \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep + \fi \tabu@temp}% +}% \tabu@sets@p +\def\tabu@setlinesep {\belowtabulinesep=\abovetabulinesep + \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep +}% \tabu@setlinesep +\def\tabu@Glinesep{\ifx \tabu@G@linesep\@empty \else {\tabu@Rlinesep}\fi} +\def\tabu@n@Glinesep{\ifx \tabu@G@linesep\@empty \else \noalign{\tabu@Rlinesep}\fi} +\def\tabu@Rlinesep{\tabu@Grestore \tabu@G@linesep \tabu@C@linesep} +\let\tabu@C@linesep \z@ +\let\tabu@G@linesep \@empty +%% \global\extrarowsep and \global\tabulinesep ------------------- +\def\tabu@Gsave #1#2#3#4{\xdef#1{#1% + \toks#2{\toks\the\currentgrouplevel{\global#3\the#3\global#4\the#4}}}% +}% \tabu@Gsave +\def\tabu@Grestore#1#2{% + \toks#2{}#1\toks\currentgrouplevel\expandafter{\expandafter}\the\toks#2\relax + \ifcat$\the\toks\currentgrouplevel$\else + \global\let#1\@empty \global\let#2\z@ + \the\toks\currentgrouplevel + \fi +}% \tabu@Grestore +%% Setting code for every row --------------------------------------- +\newcommand*\everyrow{\tabu@everyrow@bgroup + \tabu@start \z@ \tabu@stop \z@ \tabu@evrstartstop +}% \everyrow +\def\tabu@evrstartstop {\@ifnextchar^% + {\afterassignment \tabu@evrstartstop \tabu@stop=}% + {\ifx ^\@let@token + \afterassignment\tabu@evrstartstop \tabu@start=% + \else \afterassignment\tabu@everyr@w \toks@ + \fi}% +}% \tabu@evrstartstop +\def\tabu@everyr@w {% + \xdef\tabu@everyrow{% + \noexpand\tabu@everyrowfalse + \let\noalign \relax + \noexpand\tabu@rowfontreset + \iftabu@colortbl \noexpand\tabu@rc@ \fi % \taburowcolors + \let\noexpand\tabu@docline \noexpand\tabu@docline@evr + \the\toks@ + \noexpand\tabu@evrh@@k + \noexpand\tabu@rearstrut + \global\advance\c@taburow \@ne}% + \iftabu@everyrow \toks@\expandafter + {\expandafter\def\expandafter\tabu@evr@L\expandafter{\the\toks@}\ignorespaces}% + \else \xdef\tabu@evr@G{\the\toks@}% + \fi + \tabu@everyrow@egroup +}% \tabu@everyr@w +\def\tabu@evr {\def\tabu@evrh@@k} % for internal use only +\tabu@evr{} +%% line style and leaders ------------------------------------------- +\newcommand*\newtabulinestyle [1]{% + {\@for \@tempa :=#1\do{\expandafter\tabu@newlinestyle \@tempa==\@nil}}% +}% \newtabulinestyle +\def\tabu@newlinestyle #1=#2=#3\@nil{\tabu@getline {#2}% + \tabu@sanitizearg {#1}\@tempa + \ifodd 1\ifx \@tempa\@empty \ifdefined\tabu@linestyle@ 0 \fi\fi + \global\expandafter\let + \csname tabu@linestyle@\@tempa \endcsname =\tabu@thestyle \fi +}% \tabu@newlinestyle +\newcommand*\tabulinestyle [1]{\tabu@everyrow@bgroup \tabu@getline{#1}% + \iftabu@everyrow + \toks@\expandafter{\expandafter \def \expandafter + \tabu@ls@L\expandafter{\tabu@thestyle}\ignorespaces}% + \gdef\tabu@ls@{\tabu@ls@L}% + \else + \global\let\tabu@ls@G \tabu@thestyle + \gdef\tabu@ls@{\tabu@ls@G}% + \fi + \tabu@everyrow@egroup +}% \tabulinestyle +\newcommand*\taburulecolor{\tabu@everyrow@bgroup \tabu@textbar \tabu@rulecolor} +\def\tabu@rulecolor #1{\toks@{}% + \def\tabu@temp #1##1#1{\tabu@ruledrsc{##1}}\@ifnextchar #1% + \tabu@temp + \tabu@rulearc +}% \tabu@rulecolor +\def\tabu@ruledrsc #1{\edef\tabu@temp{#1}\tabu@strtrim\tabu@temp + \ifx \tabu@temp\@empty \def\tabu@temp{\tabu@rule@drsc@ {}{}}% + \else \edef\tabu@temp{\noexpand\tabu@rule@drsc@ {}{\tabu@temp}}% + \fi + \tabu@temp +}% \tabu@ruledrsc@ +\def\tabu@ruledrsc@ #1#{\tabu@rule@drsc@ {#1}} +\def\tabu@rule@drsc@ #1#2{% + \iftabu@everyrow + \ifx \\#1#2\\\toks@{\let\CT@drsc@ \relax}% + \else \toks@{\def\CT@drsc@{\color #1{#2}}}% + \fi + \else + \ifx \\#1#2\\\global\let\CT@drsc@ \relax + \else \gdef\CT@drsc@{\color #1{#2}}% + \fi + \fi + \tabu@rulearc +}% \tabu@rule@drsc@ +\def\tabu@rulearc #1#{\tabu@rule@arc@ {#1}} +\def\tabu@rule@arc@ #1#2{% + \iftabu@everyrow + \ifx \\#1#2\\\toks@\expandafter{\the\toks@ \def\CT@arc@{}}% + \else \toks@\expandafter{\the\toks@ \def\CT@arc@{\color #1{#2}}}% + \fi + \toks@\expandafter{\the\toks@ + \let\tabu@arc@L \CT@arc@ + \let\tabu@drsc@L \CT@drsc@ + \ignorespaces}% + \else + \ifx \\#1#2\\\gdef\CT@arc@{}% + \else \gdef\CT@arc@{\color #1{#2}}% + \fi + \global\let\tabu@arc@G \CT@arc@ + \global\let\tabu@drsc@G \CT@drsc@ + \fi + \tabu@everyrow@egroup +}% \tabu@rule@arc@ +\def\taburowcolors {\tabu@everyrow@bgroup \@testopt \tabu@rowcolors 1} +\def\tabu@rowcolors [#1]#2#{\tabu@rowc@lors{#1}{#2}} +\def\tabu@rowc@lors #1#2#3{% + \toks@{}\@defaultunits \count@ =\number0#2\relax \@nnil + \@defaultunits \tabu@start =\number0#1\relax \@nnil + \ifnum \count@<\tw@ \count@=\tw@ \fi + \advance\tabu@start \m@ne + \ifnum \tabu@start<\z@ \tabu@start \z@ \fi + \tabu@rowcolorseries #3\in@..\in@ \@nnil +}% \tabu@rowcolors +\def\tabu@rowcolorseries #1..#2\in@ #3\@nnil {% + \ifx \in@#1\relax + \iftabu@everyrow \toks@{\def\tabu@rc@{}\let\tabu@rc@L \tabu@rc@}% + \else \gdef\tabu@rc@{}\global\let\tabu@rc@G \tabu@rc@ + \fi + \else + \ifx \\#2\\\tabu@rowcolorserieserror \fi + \tabu@sanitizearg{#1}\tabu@temp + \tabu@sanitizearg{#2}\@tempa + \advance\count@ \m@ne + \iftabu@everyrow + \def\tabu@rc@ ##1##2##3##4{\def\tabu@rc@{% + \ifnum ##2=\c@taburow + \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{##3}{##4}\fi + \ifnum \c@taburow<##2 \else + \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\z@ + \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi + \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% + \rowcolor{tabu@rc@\the\tabu@nested}\fi}% + }\edef\x{\noexpand\tabu@rc@ {\the\count@} + {\the\tabu@start} + {\tabu@temp} + {\@tempa}% + }\x + \toks@\expandafter{\expandafter\def\expandafter\tabu@rc@\expandafter{\tabu@rc@}}% + \toks@\expandafter{\the\toks@ \let\tabu@rc@L \tabu@rc@ \ignorespaces}% + \else % inside \noalign + \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{\tabu@temp}{\@tempa}% + \expandafter\resetcolorseries\expandafter[\the\count@]{tabu@rcseries@\the\tabu@nested}% + \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% + \let\noalign \relax \rowcolor{tabu@rc@\the\tabu@nested}% + \def\tabu@rc@ ##1##2{\gdef\tabu@rc@{% + \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\@ne + \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi + \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}% + \rowcolor{tabu@rc@\the\tabu@nested}}% + }\edef\x{\noexpand\tabu@rc@{\the\count@}{\the\c@taburow}}\x + \global\let\tabu@rc@G \tabu@rc@ + \fi + \fi + \tabu@everyrow@egroup +}% \tabu@rowcolorseries +\tabuDisableCommands {\let\tabu@rc@ \@empty } +\def\tabu@rowcolorserieserror {\PackageError{tabu} + {Invalid syntax for \string\taburowcolors + \MessageBreak Please look at the documentation!}\@ehd +}% \tabu@rowcolorserieserror +\newcommand*\tabureset {% + \tabulinesep=\z@ \extrarowsep=\z@ \extratabsurround=\z@ + \tabulinestyle{}\everyrow{}\taburulecolor||{}\taburowcolors{}% +}% \tabureset +%% Parsing the line styles ------------------------------------------ +\def\tabu@getline #1{\begingroup + \csname \ifcsname if@safe@actives\endcsname % + @safe@activestrue\else + relax\fi \endcsname + \edef\tabu@temp{#1}\tabu@sanitizearg{#1}\@tempa + \let\tabu@thestyle \relax + \ifcsname tabu@linestyle@\@tempa \endcsname + \edef\tabu@thestyle{\endgroup + \def\tabu@thestyle{\expandafter\noexpand + \csname tabu@linestyle@\@tempa\endcsname}% + }\tabu@thestyle + \else \expandafter\tabu@definestyle \tabu@temp \@nil + \fi +}% \tabu@getline +\def\tabu@definestyle #1#2\@nil {\endlinechar \m@ne \makeatletter + \tabu@thick \maxdimen \tabu@on \maxdimen \tabu@off \maxdimen + \let\tabu@c@lon \@undefined \let\tabu@c@loff \@undefined + \ifodd 1\ifcat .#1\else\ifcat\relax #1\else 0\fi\fi % catcode 12 or non expandable cs + \def\tabu@temp{\tabu@getparam{thick}}% + \else \def\tabu@temp{\tabu@getparam{thick}\maxdimen}% + \fi + {% + \let\tabu@ \relax + \def\:{\obeyspaces \tabu@oXIII \tabu@commaXIII \edef\:}% (space active \: happy ;-)) + \scantokens{\:{\tabu@temp #1#2 \tabu@\tabu@}}% + \expandafter}\expandafter + \def\expandafter\:\expandafter{\:}% line spec rewritten now ;-) + \def\;{\def\:}% + \scantokens\expandafter{\expandafter\;\expandafter{\:}}% space is now inactive (catcode 10) + \let\tabu@ \tabu@getcolor \:% all arguments are ready now ;-) + \ifdefined\tabu@c@lon \else \let\tabu@c@lon\@empty \fi + \ifx \tabu@c@lon\@empty \def\tabu@c@lon{\CT@arc@}\fi + \ifdefined\tabu@c@loff \else \let\tabu@c@loff \@empty \fi + \ifdim \tabu@on=\maxdimen \ifdim \tabu@off<\maxdimen + \tabu@on \tabulineon \fi\fi + \ifdim \tabu@off=\maxdimen \ifdim \tabu@on<\maxdimen + \tabu@off \tabulineoff \fi\fi + \ifodd 1\ifdim \tabu@off=\maxdimen \ifdim \tabu@on=\maxdimen 0 \fi\fi + \in@true % + \else \in@false % + \fi + \ifdim\tabu@thick=\maxdimen \def\tabu@thick{\arrayrulewidth}% + \else \edef\tabu@thick{\the\tabu@thick}% + \fi + \edef \tabu@thestyle ##1##2{\endgroup + \def\tabu@thestyle{% + \ifin@ \noexpand\tabu@leadersstyle {\tabu@thick} + {\the\tabu@on}{##1} + {\the\tabu@off}{##2}% + \else \noexpand\tabu@rulesstyle + {##1\vrule width \tabu@thick}% + {##1\leaders \hrule height \tabu@thick \hfil}% + \fi}% + }\expandafter \expandafter + \expandafter \tabu@thestyle \expandafter + \expandafter \expandafter + {\expandafter\tabu@c@lon\expandafter}\expandafter{\tabu@c@loff}% +}% \tabu@definestyle +{\catcode`\O=\active \lccode`\O=`\o \catcode`\,=\active + \lowercase{\gdef\tabu@oXIII {\catcode`\o=\active \let O=\tabu@oxiii}} + \gdef\tabu@commaXIII {\catcode`\,=\active \let ,=\space} +}% \catcode +\def\tabu@oxiii #1{% + \ifcase \ifx n#1\z@ \else + \ifx f#1\@ne\else + \tw@ \fi\fi + \expandafter\tabu@onxiii + \or \expandafter\tabu@ofxiii + \else o% + \fi#1}% +\def\tabu@onxiii #1#2{% + \ifcase \ifx !#2\tw@ \else + \ifcat.\noexpand#2\z@ \else + \ifx \tabu@spxiii#2\@ne\else + \tw@ \fi\fi\fi + \tabu@getparam{on}#2\expandafter\@gobble + \or \expandafter\tabu@onxiii % (space is active) + \else o\expandafter\@firstofone + \fi{#1#2}}% +\def\tabu@ofxiii #1#2{% + \ifx #2f\expandafter\tabu@offxiii + \else o\expandafter\@firstofone + \fi{#1#2}} +\def\tabu@offxiii #1#2{% + \ifcase \ifx !#2\tw@ \else + \ifcat.\noexpand#2\z@ \else + \ifx\tabu@spxiii#2\@ne \else + \tw@ \fi\fi\fi + \tabu@getparam{off}#2\expandafter\@gobble + \or \expandafter\tabu@offxiii % (space is active) + \else o\expandafter\@firstofone + \fi{#1#2}} +\def\tabu@getparam #1{\tabu@ \csname tabu@#1\endcsname=} +\def\tabu@getcolor #1{% \tabu@ <- \tabu@getcolor after \edef + \ifx \tabu@#1\else % no more spec + \let\tabu@theparam=#1\afterassignment \tabu@getc@l@r #1\fi +}% \tabu@getcolor +\def\tabu@getc@l@r #1\tabu@ {% + \def\tabu@temp{#1}\tabu@strtrim \tabu@temp + \ifx \tabu@temp\@empty + \else%\ifcsname \string\color@\tabu@temp \endcsname % if the color exists + \ifx \tabu@theparam \tabu@off \let\tabu@c@loff \tabu@c@l@r + \else \let\tabu@c@lon \tabu@c@l@r + \fi + %\else \tabu@warncolour{\tabu@temp}% + \fi%\fi + \tabu@ % next spec +}% \tabu@getc@l@r +\def\tabu@warncolour #1{\PackageWarning{tabu} + {Color #1 is not defined. Default color used}% +}% \tabu@warncolour +\def\tabu@leadersstyle #1#2#3#4#5{\def\tabu@leaders{{#1}{#2}{#3}{#4}{#5}}% + \ifx \tabu@leaders\tabu@leaders@G \else + \tabu@LEADERS{#1}{#2}{#3}{#4}{#5}\fi +}% \tabu@leadersstyle +\def\tabu@rulesstyle #1#2{\let\tabu@leaders \@undefined + \gdef\tabu@thevrule{#1}\gdef\tabu@thehrule{#2}% +}% \tabu@rulesstyle +%% The leaders boxes ------------------------------------------------ +\def\tabu@LEADERS #1#2#3#4#5{%% width, dash, dash color, gap, gap color + {\let\color \tabu@color % => during trials -> \color = \tabu@nocolor + {% % but the leaders boxes should have colors ! + \def\@therule{\vrule}\def\@thick{height}\def\@length{width}% + \def\@box{\hbox}\def\@unbox{\unhbox}\def\@elt{\wd}% + \def\@skip{\hskip}\def\@ss{\hss}\def\tabu@leads{\tabu@hleads}% + \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}% + \global\let\tabu@thehleaders \tabu@theleaders + }% + {% + \def\@therule{\hrule}\def\@thick{width}\def\@length{height}% + \def\@box{\vbox}\def\@unbox{\unvbox}\def\@elt{\ht}% + \def\@skip{\vskip}\def\@ss{\vss}\def\tabu@leads{\tabu@vleads}% + \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}% + \global\let\tabu@thevleaders \tabu@theleaders + }% + \gdef\tabu@leaders@G{{#1}{#2}{#3}{#4}{#5}}% + }% +}% \tabu@LEADERS +\def\tabu@therule #1#2{\@therule \@thick#1\@length\dimexpr#2/2 \@depth\z@} +\def\tabu@l@@d@rs #1#2#3#4#5{%% width, dash, dash color, gap, gap color + \global\setbox \tabu@leads=\@box{% + {#3\tabu@therule{#1}{#2}}% + \ifx\\#5\\\@skip#4\else{#5\tabu@therule{#1}{#4*2}}\fi + {#3\tabu@therule{#1}{#2}}}% + \global\setbox\tabu@leads=\@box to\@elt\tabu@leads{\@ss + {#3\tabu@therule{#1}{#2}}\@unbox\tabu@leads}% + \edef\tabu@theleaders ##1{\def\noexpand\tabu@theleaders {% + {##1\tabu@therule{#1}{#2}}% + \xleaders \copy\tabu@leads \@ss + \tabu@therule{0pt}{-#2}{##1\tabu@therule{#1}{#2}}}% + }\tabu@theleaders{#3}% +}% \tabu@l@@d@rs +%% \tabu \endtabu \tabu* \longtabu \endlongtabu \longtabu* ---------- +\newcommand*\tabu {\tabu@longfalse + \ifmmode \def\tabu@ {\array}\def\endtabu {\endarray}% + \else \def\tabu@ {\tabu@tabular}\def\endtabu {\endtabular}\fi + \expandafter\let\csname tabu*\endcsname \tabu + \expandafter\def\csname endtabu*\endcsname{\endtabu}% + \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget +}% {tabu} +\let\tabu@tabular \tabular % +\expandafter\def\csname tabu*\endcsname{\tabuscantokenstrue \tabu} +\newcommand*\longtabu {\tabu@longtrue + \ifmmode\PackageError{tabu}{longtabu not allowed in math mode}\fi + \def\tabu@{\longtable}\def\endlongtabu{\endlongtable}% + \LTchunksize=\@M + \expandafter\let\csname tabu*\endcsname \tabu + \expandafter\def\csname endlongtabu*\endcsname{\endlongtabu}% + \let\LT@startpbox \tabu@LT@startpbox % \everypar{ array struts } + \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget +}% {longtabu} +\expandafter\def\csname longtabu*\endcsname{\tabuscantokenstrue \longtabu} +\def\tabu@nolongtabu{\PackageError{tabu} + {longtabu requires the longtable package}\@ehd} +%% Read the target and then : \tabular or \@array ------------------ +\def\tabu@settarget {\futurelet\@let@token \tabu@sett@rget } +\def\tabu@sett@rget {\tabu@target \z@ + \ifcase \ifx \bgroup\@let@token \z@ \else + \ifx \@sptoken\@let@token \@ne \else + \if t\@let@token \tw@ \else + \if s\@let@token \thr@@\else + \z@\fi\fi\fi\fi + \expandafter\tabu@begin + \or \expandafter\tabu@gobblespace\expandafter\tabu@settarget + \or \expandafter\tabu@to + \or \expandafter\tabu@spread + \fi +}% \tabu@sett@rget +\def\tabu@to to{\def\tabu@halignto{to}\tabu@gettarget} +\def\tabu@spread spread{\tabu@spreadtrue\def\tabu@halignto{spread}\tabu@gettarget} +\def\tabu@gettarget {\afterassignment\tabu@linegoaltarget \tabu@target } +\def\tabu@linegoaltarget {\futurelet\tabu@temp \tabu@linegoalt@rget } +\def\tabu@linegoalt@rget {% + \ifx \tabu@temp\LNGL@setlinegoal + \LNGL@setlinegoal \expandafter \@firstoftwo \fi % @gobbles \LNGL@setlinegoal + \tabu@begin +}% \tabu@linegoalt@rget +\def\tabu@begin #1#{% + \iftabu@measuring \expandafter\tabu@nestedmeasure \fi + \ifdim \tabu@target=\z@ \let\tabu@halignto \@empty + \else \edef\tabu@halignto{\tabu@halignto\the\tabu@target}% + \fi + \@testopt \tabu@tabu@ \tabu@aligndefault #1\@nil +}% \tabu@begin +\long\def\tabu@tabu@ [#1]#2\@nil #3{\tabu@setup + \def\tabu@align {#1}\def\tabu@savedpream{\NC@find #3}% + \tabu@ [\tabu@align ]#2{#3\tabu@rewritefirst }% +}% \tabu@tabu@ +\def\tabu@nestedmeasure {% + \ifodd 1\iftabu@spread \else \ifdim\tabu@target=\z@ \else 0 \fi\fi\relax + \tabu@spreadtrue + \else \begingroup \iffalse{\fi \ifnum0=`}\fi + \toks@{}\def\tabu@stack{b}% + \expandafter\tabu@collectbody\expandafter\tabu@quickrule + \expandafter\endgroup + \fi +}% \tabu@nestedmeasure +\def\tabu@quickrule {\indent\vrule height\z@ depth\z@ width\tabu@target} +%% \tabu@setup \tabu@init \tabu@indent +\def\tabu@setup{\tabu@alloc@ + \ifcase \tabu@nested + \ifmmode \else \iftabu@spread\else \ifdim\tabu@target=\z@ + \let\tabu@afterendpar \par + \fi\fi\fi + \def\tabu@aligndefault{c}\tabu@init \tabu@indent + \else % + \def\tabu@aligndefault{t}\let\tabudefaulttarget \linewidth + \fi + \let\tabu@thetarget \tabudefaulttarget \let\tabu@restored \@undefined + \edef\tabu@NC@list{\the\NC@list}\NC@list{\NC@do \tabu@rewritefirst}% + \everycr{}\let\@startpbox \tabu@startpbox % for nested tabu inside longtabu... + \let\@endpbox \tabu@endpbox % idem " " " " " " + \let\@tabarray \tabu@tabarray % idem " " " " " " + \tabu@setcleanup \tabu@setreset +}% \tabu@setup +\def\tabu@init{\tabu@starttimer \tabu@measuringfalse + \edef\tabu@hfuzz {\the\dimexpr\hfuzz+1sp}\global\tabu@footnotes{}% + \let\firsthline \tabu@firsthline \let\lasthline \tabu@lasthline + \let\firstline \tabu@firstline \let\lastline \tabu@lastline + \let\hline \tabu@hline \let\@xhline \tabu@xhline + \let\color \tabu@color \let\@arstrutbox \tabu@arstrutbox + \iftabu@colortbl\else\let\LT@@hline \tabu@LT@@hline \fi + \tabu@trivlist % + \let\@footnotetext \tabu@footnotetext \let\@xfootnotetext \tabu@xfootnotetext + \let\@xfootnote \tabu@xfootnote \let\centering \tabu@centering + \let\raggedright \tabu@raggedright \let\raggedleft \tabu@raggedleft + \let\tabudecimal \tabu@tabudecimal \let\Centering \tabu@Centering + \let\RaggedRight \tabu@RaggedRight \let\RaggedLeft \tabu@RaggedLeft + \let\justifying \tabu@justifying \let\rowfont \tabu@rowfont + \let\fbox \tabu@fbox \let\color@b@x \tabu@color@b@x + \let\tabu@@everycr \everycr \let\tabu@@everypar \everypar + \let\tabu@prepnext@tokORI \prepnext@tok\let\prepnext@tok \tabu@prepnext@tok + \let\tabu@multicolumnORI\multicolumn \let\multicolumn \tabu@multicolumn + \let\tabu@startpbox \@startpbox % for nested tabu inside longtabu pfff !!! + \let\tabu@endpbox \@endpbox % idem " " " " " " " + \let\tabu@tabarray \@tabarray % idem " " " " " " " + \tabu@adl@fix \let\endarray \tabu@endarray % colortbl & arydshln (delarray) + \iftabu@colortbl\CT@everycr\expandafter{\expandafter\iftabu@everyrow \the\CT@everycr \fi}\fi +}% \tabu@init +\def\tabu@indent{% correction for indentation + \ifdim \parindent>\z@\ifx \linewidth\tabudefaulttarget + \everypar\expandafter{% + \the\everypar\everypar\expandafter{\the\everypar}% + \setbox\z@=\lastbox + \ifdim\wd\z@>\z@ \edef\tabu@thetarget + {\the\dimexpr -\wd\z@+\tabudefaulttarget}\fi + \box\z@}% + \fi\fi +}% \tabu@indent +\def\tabu@setcleanup {% saves last global assignments + \ifodd 1\ifmmode \else \iftabu@long \else 0\fi\fi\relax + \def\tabu@aftergroupcleanup{% + \def\tabu@aftergroupcleanup{\aftergroup\tabu@cleanup}}% + \else + \def\tabu@aftergroupcleanup{% + \aftergroup\aftergroup\aftergroup\tabu@cleanup + \let\tabu@aftergroupcleanup \relax}% + \fi + \let\tabu@arc@Gsave \tabu@arc@G + \let\tabu@arc@G \tabu@arc@L % + \let\tabu@drsc@Gsave \tabu@drsc@G + \let\tabu@drsc@G \tabu@drsc@L % + \let\tabu@ls@Gsave \tabu@ls@G + \let\tabu@ls@G \tabu@ls@L % + \let\tabu@rc@Gsave \tabu@rc@G + \let\tabu@rc@G \tabu@rc@L % + \let\tabu@evr@Gsave \tabu@evr@G + \let\tabu@evr@G \tabu@evr@L % + \let\tabu@celllalign@save \tabu@celllalign + \let\tabu@cellralign@save \tabu@cellralign + \let\tabu@cellleft@save \tabu@cellleft + \let\tabu@cellright@save \tabu@cellright + \let\tabu@@celllalign@save \tabu@@celllalign + \let\tabu@@cellralign@save \tabu@@cellralign + \let\tabu@@cellleft@save \tabu@@cellleft + \let\tabu@@cellright@save \tabu@@cellright + \let\tabu@rowfontreset@save \tabu@rowfontreset + \let\tabu@@rowfontreset@save\tabu@@rowfontreset + \let\tabu@rowfontreset \@empty + \edef\tabu@alloc@save {\the\tabu@alloc}% restore at \tabu@reset + \edef\c@taburow@save {\the\c@taburow}% + \edef\tabu@naturalX@save {\the\tabu@naturalX}% + \let\tabu@naturalXmin@save \tabu@naturalXmin + \let\tabu@naturalXmax@save \tabu@naturalXmax + \let\tabu@mkarstrut@save \tabu@mkarstrut + \edef\tabu@clarstrut{% + \extrarowheight \the\dimexpr \ht\@arstrutbox-\ht\strutbox \relax + \extrarowdepth \the\dimexpr \dp\@arstrutbox-\dp\strutbox \relax + \let\noexpand\@arraystretch \@ne \noexpand\tabu@rearstrut}% +}% \tabu@setcleanup +\def\tabu@cleanup {\begingroup + \globaldefs\@ne \tabu@everyrowtrue + \let\tabu@arc@G \tabu@arc@Gsave + \let\CT@arc@ \tabu@arc@G + \let\tabu@drsc@G \tabu@drsc@Gsave + \let\CT@drsc@ \tabu@drsc@G + \let\tabu@ls@G \tabu@ls@Gsave + \let\tabu@ls@ \tabu@ls@G + \let\tabu@rc@G \tabu@rc@Gsave + \let\tabu@rc@ \tabu@rc@G + \let\CT@do@color \relax + \let\tabu@evr@G \tabu@evr@Gsave + \let\tabu@celllalign \tabu@celllalign@save + \let\tabu@cellralign \tabu@cellralign@save + \let\tabu@cellleft \tabu@cellleft@save + \let\tabu@cellright \tabu@cellright@save + \let\tabu@@celllalign \tabu@@celllalign@save + \let\tabu@@cellralign \tabu@@cellralign@save + \let\tabu@@cellleft \tabu@@cellleft@save + \let\tabu@@cellright \tabu@@cellright@save + \let\tabu@rowfontreset \tabu@rowfontreset@save + \let\tabu@@rowfontreset \tabu@@rowfontreset@save + \tabu@naturalX =\tabu@naturalX@save + \let\tabu@naturalXmax \tabu@naturalXmax@save + \let\tabu@naturalXmin \tabu@naturalXmin@save + \let\tabu@mkarstrut \tabu@mkarstrut@save + \c@taburow =\c@taburow@save + \ifcase \tabu@nested \tabu@alloc \m@ne\fi + \endgroup % + \ifcase \tabu@nested + \the\tabu@footnotes \global\tabu@footnotes{}% + \tabu@afterendpar \tabu@elapsedtime + \fi + \tabu@clarstrut + \everyrow\expandafter {\tabu@evr@G}% +}% \tabu@cleanup +\let\tabu@afterendpar \relax +\def\tabu@setreset {% + \edef\tabu@savedparams {% \relax for \tabu@message@save + \ifmmode \col@sep \the\arraycolsep + \else \col@sep \the\tabcolsep \fi \relax + \arrayrulewidth \the\arrayrulewidth \relax + \doublerulesep \the\doublerulesep \relax + \extratabsurround \the\extratabsurround \relax + \extrarowheight \the\extrarowheight \relax + \extrarowdepth \the\extrarowdepth \relax + \abovetabulinesep \the\abovetabulinesep \relax + \belowtabulinesep \the\belowtabulinesep \relax + \def\noexpand\arraystretch{\arraystretch}% + \ifdefined\minrowclearance \minrowclearance\the\minrowclearance\relax\fi}% + \begingroup + \@temptokena\expandafter{\tabu@savedparams}% => only for \savetabu / \usetabu + \ifx \tabu@arc@L\relax \else \tabu@setsave \tabu@arc@L \fi + \ifx \tabu@drsc@L\relax \else \tabu@setsave \tabu@drsc@L \fi + \tabu@setsave \tabu@ls@L \tabu@setsave \tabu@evr@L + \expandafter \endgroup \expandafter + \def\expandafter\tabu@saved@ \expandafter{\the\@temptokena + \let\tabu@arc@G \tabu@arc@L + \let\tabu@drsc@G \tabu@drsc@L + \let\tabu@ls@G \tabu@ls@L + \let\tabu@rc@G \tabu@rc@L + \let\tabu@evr@G \tabu@evr@L}% + \def\tabu@reset{\tabu@savedparams + \tabu@everyrowtrue \c@taburow \z@ + \let\CT@arc@ \tabu@arc@L + \let\CT@drsc@ \tabu@drsc@L + \let\tabu@ls@ \tabu@ls@L + \let\tabu@rc@ \tabu@rc@L + \global\tabu@alloc \tabu@alloc@save + \everyrow\expandafter{\tabu@evr@L}}% +}% \tabu@reset +\def\tabu@setsave #1{\expandafter\tabu@sets@ve #1\@nil{#1}} +\long\def\tabu@sets@ve #1\@nil #2{\@temptokena\expandafter{\the\@temptokena \def#2{#1}}} +%% The Rewriting Process ------------------------------------------- +\def\tabu@newcolumntype #1{% + \expandafter\tabu@new@columntype + \csname NC@find@\string#1\expandafter\endcsname + \csname NC@rewrite@\string#1\endcsname + {#1}% +}% \tabu@newcolumntype +\def\tabu@new@columntype #1#2#3{% + \def#1##1#3{\NC@{##1}}% + \let#2\relax \newcommand*#2% +}% \tabu@new@columntype +\def\tabu@privatecolumntype #1{% + \expandafter\tabu@private@columntype + \csname NC@find@\string#1\expandafter\endcsname + \csname NC@rewrite@\string#1\expandafter\endcsname + \csname tabu@NC@find@\string#1\expandafter\endcsname + \csname tabu@NC@rewrite@\string#1\endcsname + {#1}% +}% \tabu@privatecolumntype +\def\tabu@private@columntype#1#2#3#4{% + \g@addto@macro\tabu@privatecolumns{\let#1#3\let#2#4}% + \tabu@new@columntype#3#4% +}% \tabu@private@columntype +\let\tabu@privatecolumns \@empty +\newcommand*\tabucolumn [1]{\expandafter \def \expandafter + \tabu@highprioritycolumns\expandafter{\tabu@highprioritycolumns + \NC@do #1}}% +\let\tabu@highprioritycolumns \@empty +%% The | ``column'' : rewriting process -------------------------- +\tabu@privatecolumntype |{\tabu@rewritevline} +\newcommand*\tabu@rewritevline[1][]{\tabu@vlinearg{#1}% + \expandafter \NC@find \tabu@rewritten} +\def\tabu@lines #1{% + \ifx|#1\else \tabu@privatecolumntype #1{\tabu@rewritevline}\fi + \NC@list\expandafter{\the\NC@list \NC@do #1}% +}% \tabu@lines@ +\def\tabu@vlinearg #1{% + \ifx\\#1\\\def\tabu@thestyle {\tabu@ls@}% + \else\tabu@getline {#1}% + \fi + \def\tabu@rewritten ##1{\def\tabu@rewritten{!{##1\tabu@thevline}}% + }\expandafter\tabu@rewritten\expandafter{\tabu@thestyle}% + \expandafter \tabu@keepls \tabu@thestyle \@nil +}% \tabu@vlinearg +\def\tabu@keepls #1\@nil{% + \ifcat $\@cdr #1\@nil $% + \ifx \relax#1\else + \ifx \tabu@ls@#1\else + \let#1\relax + \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer + \tabu@savels\noexpand#1}\fi\fi\fi +}% \tabu@keepls +\def\tabu@thevline {\begingroup + \ifdefined\tabu@leaders + \setbox\@tempboxa=\vtop to\dimexpr + \ht\@arstrutbox+\dp\@arstrutbox{{\tabu@thevleaders}}% + \ht\@tempboxa=\ht\@arstrutbox \dp\@tempboxa=\dp\@arstrutbox + \box\@tempboxa + \else + \tabu@thevrule + \fi \endgroup +}% \tabu@thevline +\def\tabu@savels #1{% + \expandafter\let\csname\string#1\endcsname #1% + \expandafter\def\expandafter\tabu@reset\expandafter{\tabu@reset + \tabu@resetls#1}}% +\def\tabu@resetls #1{\expandafter\let\expandafter#1\csname\string#1\endcsname}% +%% \multicolumn inside tabu environment ----------------------------- +\tabu@newcolumntype \tabu@rewritemulticolumn{% + \aftergroup \tabu@endrewritemulticolumn % after \@mkpream group + \NC@list{\NC@do *}\tabu@textbar \tabu@lines + \tabu@savedecl + \tabu@privatecolumns + \NC@list\expandafter{\the\expandafter\NC@list \tabu@NC@list}% + \let\tabu@savels \relax + \NC@find +}% \tabu@rewritemulticolumn +\def\tabu@endrewritemulticolumn{\gdef\tabu@mkpreambuffer{}\endgroup} +\def\tabu@multicolumn{\tabu@ifenvir \tabu@multic@lumn \tabu@multicolumnORI} +\long\def\tabu@multic@lumn #1#2#3{\multispan{#1}\begingroup + \tabu@everyrowtrue + \NC@list{\NC@do \tabu@rewritemulticolumn}% + \expandafter\@gobbletwo % gobbles \multispan{#1} + \tabu@multicolumnORI{#1}{\tabu@rewritemulticolumn #2}% + {\iftabuscantokens \tabu@rescan \else \expandafter\@firstofone \fi + {#3}}% +}% \tabu@multic@lumn +%% The X column(s): rewriting process ----------------------------- +\tabu@privatecolumntype X[1][]{\begingroup \tabu@siunitx{\endgroup \tabu@rewriteX {#1}}} +\def\tabu@nosiunitx #1{#1{}{}\expandafter \NC@find \tabu@rewritten } +\def\tabu@siunitx #1{\@ifnextchar \bgroup + {\tabu@rewriteX@Ss{#1}} + {\tabu@nosiunitx{#1}}} +\def\tabu@rewriteX@Ss #1#2{\@temptokena{}% + \@defaultunits \let\tabu@temp =#2\relax\@nnil + \ifodd 1\ifx S\tabu@temp \else \ifx s\tabu@temp \else 0 \fi\fi + \def\NC@find{\def\NC@find >####1####2<####3\relax{#1 {####1}{####3}% + }\expandafter\NC@find \the\@temptokena \relax + }\expandafter\NC@rewrite@S \@gobble #2\relax + \else \tabu@siunitxerror + \fi + \expandafter \NC@find \tabu@rewritten +}% \tabu@rewriteX@Ss +\def\tabu@siunitxerror {\PackageError{tabu}{Not a S nor s column ! + \MessageBreak X column can only embed siunitx S or s columns}\@ehd +}% \tabu@siunitxerror +\def\tabu@rewriteX #1#2#3{\tabu@Xarg {#1}{#2}{#3}% + \iftabu@measuring + \else \tabu@measuringtrue % first X column found in the preamble + \let\@halignto \relax \let\tabu@halignto \relax + \iftabu@spread \tabu@spreadtarget \tabu@target \tabu@target \z@ + \else \tabu@spreadtarget \z@ \fi + \ifdim \tabu@target=\z@ + \setlength\tabu@target \tabu@thetarget + \tabu@message{\tabu@message@defaulttarget}% + \else \tabu@message{\tabu@message@target}\fi + \fi +}% \tabu@rewriteX +\def\tabu@rewriteXrestore #1#2#3{\let\@halignto \relax + \def\tabu@rewritten{l}} +\def\tabu@Xarg #1#2#3{% + \advance\tabu@Xcol \@ne \let\tabu@Xlcr \@empty + \let\tabu@Xdisp \@empty \let\tabu@Xmath \@empty + \ifx\\#1\\% + \def\tabu@rewritten{p}\tabucolX \p@ % + \else + \let\tabu@rewritten \@empty \let\tabu@temp \@empty \tabucolX \z@ + \tabu@Xparse {}#1\relax + \fi + \tabu@Xrewritten{#2}{#3}% +}% \tabu@Xarg +\def\tabu@Xparse #1{\futurelet\@let@token \tabu@Xtest} +\expandafter\def\expandafter\tabu@Xparsespace\space{\tabu@Xparse{}} +\def\tabu@Xtest{% + \ifcase \ifx \relax\@let@token \z@ \else + \if ,\@let@token \m@ne\else + \if p\@let@token 1\else + \if m\@let@token 2\else + \if b\@let@token 3\else + \if l\@let@token 4\else + \if c\@let@token 5\else + \if r\@let@token 6\else + \if j\@let@token 7\else + \if L\@let@token 8\else + \if C\@let@token 9\else + \if R\@let@token 10\else + \if J\@let@token 11\else + \ifx \@sptoken\@let@token 12\else + \if .\@let@token 13\else + \if -\@let@token 13\else + \ifcat $\@let@token 14\else + 15\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax + \or \tabu@Xtype {p}% + \or \tabu@Xtype {m}% + \or \tabu@Xtype {b}% + \or \tabu@Xalign \raggedright\relax + \or \tabu@Xalign \centering\relax + \or \tabu@Xalign \raggedleft\relax + \or \tabu@Xalign \tabu@justify\relax + \or \tabu@Xalign \RaggedRight\raggedright + \or \tabu@Xalign \Centering\centering + \or \tabu@Xalign \RaggedLeft\raggedleft + \or \tabu@Xalign \justifying\tabu@justify + \or \expandafter \tabu@Xparsespace + \or \expandafter \tabu@Xcoef + \or \expandafter \tabu@Xm@th + \or \tabu@Xcoef{}% + \else\expandafter \tabu@Xparse + \fi +}% \tabu@Xtest +\def\tabu@Xalign #1#2{% + \ifx \tabu@Xlcr\@empty \else \PackageWarning{tabu} + {Duplicate horizontal alignment specification}\fi + \ifdefined#1\def\tabu@Xlcr{#1}\let#1\relax + \else \def\tabu@Xlcr{#2}\let#2\relax\fi + \expandafter\tabu@Xparse +}% \tabu@Xalign +\def\tabu@Xtype #1{% + \ifx \tabu@rewritten\@empty \else \PackageWarning{tabu} + {Duplicate vertical alignment specification}\fi + \def\tabu@rewritten{#1}\expandafter\tabu@Xparse +}% \tabu@Xtype +\def\tabu@Xcoef#1{\edef\tabu@temp{\tabu@temp#1}% + \afterassignment\tabu@Xc@ef \tabu@cnt\number\if-#10\fi +}% \tabu@Xcoef +\def\tabu@Xc@ef{\advance\tabucolX \tabu@temp\the\tabu@cnt\p@ + \tabu@Xparse{}% +}% \tabu@Xc@ef +\def\tabu@Xm@th #1{\futurelet \@let@token \tabu@Xd@sp} +\def\tabu@Xd@sp{\let\tabu@Xmath=$% + \ifx $\@let@token \def\tabu@Xdisp{\displaystyle}% + \expandafter\tabu@Xparse + \else \expandafter\tabu@Xparse\expandafter{\expandafter}% + \fi +}% \tabu@Xd@sp +\def\tabu@Xrewritten {% + \ifx \tabu@rewritten\@empty \def\tabu@rewritten{p}\fi + \ifdim \tabucolX<\z@ \tabu@negcoeftrue + \else\ifdim \tabucolX=\z@ \tabucolX \p@ + \fi\fi + \edef\tabu@temp{{\the\tabu@Xcol}{\tabu@strippt\tabucolX}}% + \edef\tabu@Xcoefs{\tabu@Xcoefs \tabu@ \tabu@temp}% + \edef\tabu@rewritten ##1##2{\def\noexpand\tabu@rewritten{% + >{\tabu@Xlcr \ifx$\tabu@Xmath$\tabu@Xdisp\fi ##1}% + \tabu@rewritten {\tabu@hsize \tabu@temp}% + <{##2\ifx$\tabu@Xmath$\fi}}% + }\tabu@rewritten +}% \tabu@Xrewritten +\def\tabu@hsize #1#2{% + \ifdim #2\p@<\z@ + \ifdim \tabucolX=\maxdimen \tabu@wd{#1}\else + \ifdim \tabu@wd{#1}<-#2\tabucolX \tabu@wd{#1}\else -#2\tabucolX\fi + \fi + \else #2\tabucolX + \fi +}% \tabu@hsize +%% \usetabu and \preamble: rewriting process --------------------- +\tabu@privatecolumntype \usetabu [1]{% + \ifx\\#1\\\tabu@saveerr{}\else + \@ifundefined{tabu@saved@\string#1} + {\tabu@saveerr{#1}} + {\let\tabu@rewriteX \tabu@rewriteXrestore + \csname tabu@saved@\string#1\expandafter\endcsname\expandafter\@ne}% + \fi +}% \NC@rewrite@\usetabu +\tabu@privatecolumntype \preamble [1]{% + \ifx\\#1\\\tabu@saveerr{}\else + \@ifundefined{tabu@saved@\string#1} + {\tabu@saveerr{#1}} + {\csname tabu@saved@\string#1\expandafter\endcsname\expandafter\z@}% + \fi +}% \NC@rewrite@\preamble +%% Controlling the rewriting process ------------------------------- +\tabu@newcolumntype \tabu@rewritefirst{% + \iftabu@long \aftergroup \tabu@longpream % + \else \aftergroup \tabu@pream + \fi + \let\tabu@ \relax \let\tabu@hsize \relax + \let\tabu@Xcoefs \@empty \let\tabu@savels \relax + \tabu@Xcol \z@ \tabu@cnt \tw@ + \gdef\tabu@mkpreambuffer{\tabu@{}}\tabu@measuringfalse + \global\setbox\@arstrutbox \box\@arstrutbox + \NC@list{\NC@do *}\tabu@textbar \tabu@lines + \NC@list\expandafter{\the\NC@list \NC@do X}% + \iftabu@siunitx % + \NC@list\expandafter{\the\NC@list \NC@do S\NC@do s}\fi + \NC@list\expandafter{\the\expandafter\NC@list \tabu@highprioritycolumns}% + \expandafter\def\expandafter\tabu@NC@list\expandafter{% + \the\expandafter\NC@list \tabu@NC@list}% % * | X S + \NC@list\expandafter{\expandafter \NC@do \expandafter\usetabu + \expandafter \NC@do \expandafter\preamble + \the\NC@list \NC@do \tabu@rewritemiddle + \NC@do \tabu@rewritelast}% + \tabu@savedecl + \tabu@privatecolumns + \edef\tabu@prev{\the\@temptokena}\NC@find \tabu@rewritemiddle +}% NC@rewrite@\tabu@rewritefirst +\tabu@newcolumntype \tabu@rewritemiddle{% + \edef\tabu@temp{\the\@temptokena}\NC@find \tabu@rewritelast +}% \NC@rewrite@\tabu@rewritemiddle +\tabu@newcolumntype \tabu@rewritelast{% + \ifx \tabu@temp\tabu@prev \advance\tabu@cnt \m@ne + \NC@list\expandafter{\tabu@NC@list \NC@do \tabu@rewritemiddle + \NC@do \tabu@rewritelast}% + \else \let\tabu@prev\tabu@temp + \fi + \ifcase \tabu@cnt \expandafter\tabu@endrewrite + \else \expandafter\NC@find \expandafter\tabu@rewritemiddle + \fi +}% \NC@rewrite@\tabu@rewritelast +%% Choosing the strategy -------------------------------------------- +\def\tabu@endrewrite {% + \let\tabu@temp \NC@find + \ifx \@arrayright\relax \let\@arrayright \@empty \fi + \count@=% + \ifx \@finalstrut\tabu@finalstrut \z@ % outer in mode 0 print + \iftabu@measuring + \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer + \tabu@target \csname tabu@\the\tabu@nested.T\endcsname + \tabucolX \csname tabu@\the\tabu@nested.X\endcsname + \edef\@halignto {\ifx\@arrayright\@empty to\tabu@target\fi}}% + \fi + \else\iftabu@measuring 4 % X columns + \xdef\tabu@mkpreambuffer{\tabu@{\tabu@mkpreambuffer + \tabu@target \the\tabu@target + \tabu@spreadtarget \the\tabu@spreadtarget}% + \def\noexpand\tabu@Xcoefs{\tabu@Xcoefs}% + \edef\tabu@halignto{\ifx \@arrayright\@empty to\tabu@target\fi}}% + \let\tabu@Xcoefs \relax + \else\ifcase\tabu@nested \thr@@ % outer, no X + \global\let\tabu@afterendpar \relax + \else \@ne % inner, no X, outer in mode 1 or 2 + \fi + \ifdefined\tabu@usetabu + \else \ifdim\tabu@target=\z@ + \else \let\tabu@temp \tabu@extracolsep + \fi\fi + \fi + \fi + \xdef\tabu@mkpreambuffer{\count@ \the\count@ \tabu@mkpreambuffer}% + \tabu@temp +}% \tabu@endrewrite +\def\tabu@extracolsep{\@defaultunits \expandafter\let + \expandafter\tabu@temp \expandafter=\the\@temptokena \relax\@nnil + \ifx \tabu@temp\@sptoken + \expandafter\tabu@gobblespace \expandafter\tabu@extracolsep + \else + \edef\tabu@temp{\noexpand\NC@find + \if |\noexpand\tabu@temp @% + \else\if !\noexpand\tabu@temp @% + \else !% + \fi\fi + {\noexpand\extracolsep\noexpand\@flushglue}}% + \fi + \tabu@temp +}% \tabu@extrac@lsep +%% Implementing the strategy ---------------------------------------- +\long\def\tabu@pream #1\@preamble {% + \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup + \NC@list\expandafter {\tabu@NC@list}% in case of nesting... + \ifdefined\tabu@usetabu \tabu@usetabu \tabu@target \z@ \fi + \let\tabu@savedpreamble \@preamble + \global\let\tabu@elapsedtime \relax + \tabu@thebody ={#1\tabu@aftergroupcleanup}% + \tabu@thebody =\expandafter{\the\expandafter\tabu@thebody + \@preamble}% + \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens ) + \tabu@select +}% \tabu@pream +\long\def\tabu@longpream #1\LT@bchunk #2\LT@bchunk{% + \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup + \NC@list\expandafter {\tabu@NC@list}% in case of nesting... + \let\tabu@savedpreamble \@preamble + \global\let\tabu@elapsedtime \relax + \tabu@thebody ={#1\LT@bchunk #2\tabu@aftergroupcleanup \LT@bchunk}% + \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens ) + \tabu@select +}% \tabu@longpream +\def\tabu@select {% + \ifnum\tabu@nested>\z@ \tabuscantokensfalse \fi + \ifnum \count@=\@ne \iftabu@measuring \count@=\tw@ \fi\fi + \ifcase \count@ + \global\let\tabu@elapsedtime \relax + \tabu@seteverycr + \expandafter \tabuthepreamble % vertical adjustment (inherited from outer) + \or % exit in vertical measure + struts per cell because no X and outer in mode 3 + \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}% + \def\tabu@cellralign{\tabu@verticalspacing}% + \tabu@seteverycr + \expandafter \tabuthepreamble + \or % exit without measure because no X and outer in mode 4 + \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty + \tabu@seteverycr + \expandafter \tabuthepreamble + \else % needs trials + \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty + \tabu@savecounters + \expandafter \tabu@setstrategy + \fi +}% \tabu@select +\def\tabu@@ {\gdef\tabu@mkpreambuffer} +%% Protections to set up before trials ------------------------------ +\def\tabu@setstrategy {\begingroup % + \tabu@trialh@@k \tabu@cnt \z@ % number of trials + \hbadness \@M \let\hbadness \@tempcnta + \hfuzz \maxdimen \let\hfuzz \@tempdima + \let\write \tabu@nowrite\let\GenericError \tabu@GenericError + \let\savetabu \@gobble \let\tabudefaulttarget \linewidth + \let\@footnotetext \@gobble \let\@xfootnote \tabu@xfootnote + \let\color \tabu@nocolor\let\rowcolor \tabu@norowcolor + \let\tabu@aftergroupcleanup \relax % only after the last trial + \tabu@mkpreambuffer + \ifnum \count@>\thr@@ \let\@halignto \@empty \tabucolX@init + \def\tabu@lasttry{\m@ne\p@}\fi + \begingroup \iffalse{\fi \ifnum0=`}\fi + \toks@{}\def\tabu@stack{b}\iftabuscantokens \endlinechar=10 \obeyspaces \fi % + \tabu@collectbody \tabu@strategy % +}% \tabu@setstrategy +\def\tabu@savecounters{% + \def\@elt ##1{\csname c@##1\endcsname\the\csname c@##1\endcsname}% + \edef\tabu@clckpt {\begingroup \globaldefs=\@ne \cl@@ckpt \endgroup}\let\@elt \relax +}% \tabu@savecounters +\def\tabucolX@init {% \tabucolX <= \tabu@target / (sum coefs > 0) + \dimen@ \z@ \tabu@Xsum \z@ \tabucolX \z@ \let\tabu@ \tabu@Xinit \tabu@Xcoefs + \ifdim \dimen@>\z@ + \@tempdima \dimexpr \tabu@target *\p@/\dimen@ + \tabu@hfuzz\relax + \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi + \fi +}% \tabucolX@init +\def\tabu@Xinit #1#2{\tabu@Xcol #1 \advance \tabu@Xsum + \ifdim #2\p@>\z@ #2\p@ \advance\dimen@ #2\p@ + \else -#2\p@ \tabu@negcoeftrue + \@tempdima \dimexpr \tabu@target*\p@/\dimexpr-#2\p@\relax \relax + \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi + \tabu@wddef{#1}{0pt}% + \fi +}% \tabu@Xinit +%% Collecting the environment body ---------------------------------- +\long\def\tabu@collectbody #1#2\end #3{% + \edef\tabu@stack{\tabu@pushbegins #2\begin\end\expandafter\@gobble\tabu@stack}% + \ifx \tabu@stack\@empty + \toks@\expandafter{\expandafter\tabu@thebody\expandafter{\the\toks@ #2}% + \def\tabu@end@envir{\end{#3}}% + \iftabuscantokens + \iftabu@long \def\tabu@endenvir {\end{#3}\tabu@gobbleX}% + \else \def\tabu@endenvir {\let\endarray \@empty + \end{#3}\tabu@gobbleX}% + \fi + \else \def\tabu@endenvir {\end{#3}}\fi}% + \let\tabu@collectbody \tabu@endofcollect + \else\def\tabu@temp{#3}% + \ifx \tabu@temp\@empty \toks@\expandafter{\the\toks@ #2\end }% + \else \ifx\tabu@temp\tabu@@spxiii \toks@\expandafter{\the\toks@ #2\end #3}% + \else \ifx\tabu@temp\tabu@X \toks@\expandafter{\the\toks@ #2\end #3}% + \else \toks@\expandafter{\the\toks@ #2\end{#3}}% + \fi\fi\fi + \fi + \tabu@collectbody{#1}% +}% \tabu@collectbody +\long\def\tabu@pushbegins#1\begin#2{\ifx\end#2\else b\expandafter\tabu@pushbegins\fi}% +\def\tabu@endofcollect #1{\ifnum0=`{}\fi + \expandafter\endgroup \the\toks@ #1% +}% \tabu@endofcollect +%% The trials: switching between strategies ------------------------- +\def\tabu@strategy {\relax % stops \count@ assignment ! + \ifcase\count@ % case 0 = print with vertical adjustment (outer is finished) + \expandafter \tabu@endoftrials + \or % case 1 = exit in vertical measure (outer in mode 3) + \expandafter\xdef\csname tabu@\the\tabu@nested.T\endcsname{\the\tabu@target}% + \expandafter\xdef\csname tabu@\the\tabu@nested.X\endcsname{\the\tabucolX}% + \expandafter \tabu@endoftrials + \or % case 2 = exit with a rule replacing the table (outer in mode 4) + \expandafter \tabu@quickend + \or % case 3 = outer is in mode 3 because of no X + \begingroup + \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}% + \def\tabu@cellralign{\tabu@verticalspacing}% + \expandafter \tabu@measuring + \else % case 4 = horizontal measure + \begingroup + \global\let\tabu@elapsedtime \tabu@message@etime + \long\def\multicolumn##1##2##3{\multispan{##1}}% + \let\tabu@startpboxORI \@startpbox + \iftabu@spread + \def\tabu@naturalXmax {\z@}% + \let\tabu@naturalXmin \tabu@naturalXmax + \tabu@evr{\global\tabu@naturalX \z@}% + \let\@startpbox \tabu@startpboxmeasure + \else\iftabu@negcoef + \let\@startpbox \tabu@startpboxmeasure + \else \let\@startpbox \tabu@startpboxquick + \fi\fi + \expandafter \tabu@measuring + \fi +}% \tabu@strategy +\def\tabu@measuring{\expandafter \tabu@trial \expandafter + \count@ \the\count@ \tabu@endtrial +}% \tabu@measuring +\def\tabu@trial{\iftabu@long \tabu@longtrial \else \tabu@shorttrial \fi} +\def\tabu@shorttrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr + \ifx \tabu@savecounters\relax \else + \let\tabu@savecounters \relax \tabu@clckpt \fi + $\iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi + \expandafter{\expandafter \tabuthepreamble + \the\tabu@thebody + \csname tabu@adl@endtrial\endcsname + \endarray}$\egroup % got \tabu@box +}% \tabu@shorttrial +\def\tabu@longtrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr + \ifx \tabu@savecounters\relax \else + \let\tabu@savecounters \relax \tabu@clckpt \fi + \iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi + \expandafter{\expandafter \tabuthepreamble + \the\tabu@thebody + \tabuendlongtrial}\egroup % got \tabu@box +}% \tabu@longtrial +\def\tabuendlongtrial{% no @ allowed for \scantokens + \LT@echunk \global\setbox\@ne \hbox{\unhbox\@ne}\kern\wd\@ne + \LT@get@widths +}% \tabuendlongtrial +\def\tabu@adl@endtrial{% + \crcr \noalign{\global\adl@ncol \tabu@nbcols}}% anything global is crap, junky and fails ! +\def\tabu@seteverycr {\tabu@reset + \everycr \expandafter{\the\everycr \tabu@everycr}% + \let\everycr \tabu@noeverycr % +}% \tabu@seteverycr +\def\tabu@noeverycr{{\aftergroup\tabu@restoreeverycr \afterassignment}\toks@} +\def\tabu@restoreeverycr {\let\everycr \tabu@@everycr} +\def\tabu@everycr {\iftabu@everyrow \noalign{\tabu@everyrow}\fi} +\def\tabu@endoftrials {% + \iftabuscantokens \expandafter\@firstoftwo + \else \expandafter\@secondoftwo + \fi + {\expandafter \tabu@closetrialsgroup \expandafter + \tabu@rescan \expandafter{% + \expandafter\tabuthepreamble + \the\expandafter\tabu@thebody + \iftabu@long \else \endarray \fi}} + {\expandafter\tabu@closetrialsgroup \expandafter + \tabuthepreamble + \the\tabu@thebody}% + \tabu@endenvir % Finish ! +}% \tabu@endoftrials +\def\tabu@closetrialsgroup {% + \toks@\expandafter{\tabu@endenvir}% + \edef\tabu@bufferX{\endgroup + \tabucolX \the\tabucolX + \tabu@target \the\tabu@target + \tabu@cnt \the\tabu@cnt + \def\noexpand\tabu@endenvir{\the\toks@}% + %Quid de \@halignto = \tabu@halignto ?? + }% \tabu@bufferX + \tabu@bufferX + \ifcase\tabu@nested % print out (outer in mode 0) + \global\tabu@cnt \tabu@cnt + \tabu@evr{\tabu@verticaldynamicadjustment}% + \tabu@celllalign@def{\everypar{}}\let\tabu@cellralign \@empty + \let\@finalstrut \tabu@finalstrut + \else % vertical measure of nested tabu + \tabu@evr{\tabu@verticalinit}% + \tabu@celllalign@def{\tabu@verticalmeasure}% + \def\tabu@cellralign{\tabu@verticalspacing}% + \fi + \tabu@clckpt \let\@halignto \tabu@halignto + \let\@halignto \@empty + \tabu@seteverycr + \ifdim \tabustrutrule>\z@ \ifnum\tabu@nested=\z@ + \setbox\@arstrutbox \box\voidb@x % force \@arstrutbox to be rebuilt (visible struts) + \fi\fi +}% \tabu@closetrialsgroup +\def\tabu@quickend {\expandafter \endgroup \expandafter + \tabu@target \the\tabu@target \tabu@quickrule + \let\endarray \relax \tabu@endenvir +}% \tabu@quickend +\def\tabu@endtrial {\relax % stops \count@ assignment ! + \ifcase \count@ \tabu@err % case 0 = impossible here + \or \tabu@err % case 1 = impossible here + \or \tabu@err % case 2 = impossible here + \or % case 3 = outer goes into mode 0 + \def\tabu@bufferX{\endgroup}\count@ \z@ + \else % case 4 = outer goes into mode 3 + \iftabu@spread \tabu@spreadarith % inner into mode 1 (outer in mode 3) + \else \tabu@arith % or 2 (outer in mode 4) + \fi + \count@=% + \ifcase\tabu@nested \thr@@ % outer goes into mode 3 + \else\iftabu@measuring \tw@ % outer is in mode 4 + \else \@ne % outer is in mode 3 + \fi\fi + \edef\tabu@bufferX{\endgroup + \tabucolX \the\tabucolX + \tabu@target \the\tabu@target}% + \fi + \expandafter \tabu@bufferX \expandafter + \count@ \the\count@ \tabu@strategy +}% \tabu@endtrial +\def\tabu@err{\errmessage{(tabu) Internal impossible error! (\count@=\the\count@)}} +%% The algorithms: compute the widths / stop or go on --------------- +\def\tabu@arithnegcoef {% + \@tempdima \z@ \dimen@ \z@ \let\tabu@ \tabu@arith@negcoef \tabu@Xcoefs +}% \tabu@arithnegcoef +\def\tabu@arith@negcoef #1#2{% + \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ % saturated by definition + \advance\@tempdima #2\tabucolX + \else + \ifdim -#2\tabucolX <\tabu@wd{#1}% c_i X < natural width <= \tabu@target-> saturated + \advance\dimen@ -#2\p@ + \advance\@tempdima -#2\tabucolX + \else + \advance\@tempdima \tabu@wd{#1}% natural width <= c_i X => neutralised + \ifdim \tabu@wd{#1}<\tabu@target \else % neutralised + \advance\dimen@ -#2\p@ % saturated (natural width = tabu@target) + \fi + \fi + \fi +}% \tabu@arith@negcoef +\def\tabu@givespace #1#2{% here \tabu@DELTA < \z@ + \ifdim \@tempdima=\z@ + \tabu@wddef{#1}{\the\dimexpr -\tabu@DELTA*\p@/\tabu@Xsum}% + \else + \tabu@wddef{#1}{\the\dimexpr \tabu@hsize{#1}{#2} + *(\p@ -\tabu@DELTA*\p@/\@tempdima)/\p@\relax}% + \fi +}% \tabu@givespace +\def\tabu@arith {\advance\tabu@cnt \@ne + \ifnum \tabu@cnt=\@ne \tabu@message{\tabu@titles}\fi + \tabu@arithnegcoef + \@tempdimb \dimexpr \wd\tabu@box -\@tempdima \relax % + \tabu@DELTA = \dimexpr \wd\tabu@box - \tabu@target \relax + \tabu@message{\tabu@message@arith}% + \ifdim \tabu@DELTA <\tabu@hfuzz + \ifdim \tabu@DELTA<\z@ % wd (tabu)<\tabu@target ? + \let\tabu@ \tabu@givespace \tabu@Xcoefs + \advance\@tempdima \@tempdimb \advance\@tempdima -\tabu@DELTA % for message + \else % already converged: nothing to do but nearly impossible... + \fi + \tabucolX \maxdimen + \tabu@measuringfalse + \else % need for narrower X columns + \tabucolX =\dimexpr (\@tempdima -\tabu@DELTA) *\p@/\tabu@Xsum \relax + \tabu@measuringtrue + \@whilesw \iftabu@measuring\fi {% + \advance\tabu@cnt \@ne + \tabu@arithnegcoef + \tabu@DELTA =\dimexpr \@tempdima+\@tempdimb -\tabu@target \relax % always < 0 here + \tabu@message{\tabu@header + \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@ + \tabu@msgalign \@tempdima+\@tempdimb { }{ }{ }{ }{ }\@@ + \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@ + \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@ + \ifdim -\tabu@DELTA<\tabu@hfuzz \tabu@spaces target ok\else + \tabu@msgalign \dimexpr -\tabu@DELTA *\p@/\dimen@ {}{}{}{}{}\@@ + \fi}% + \ifdim -\tabu@DELTA<\tabu@hfuzz + \advance\@tempdima \@tempdimb % for message + \tabu@measuringfalse + \else + \advance\tabucolX \dimexpr -\tabu@DELTA *\p@/\dimen@ \relax + \fi + }% + \fi + \tabu@message{\tabu@message@reached}% + \edef\tabu@bufferX{\endgroup \tabu@cnt \the\tabu@cnt + \tabucolX \the\tabucolX + \tabu@target \the\tabu@target}% +}% \tabu@arith +\def\tabu@spreadarith {% + \dimen@ \z@ \@tempdima \tabu@naturalXmax \let\tabu@ \tabu@spread@arith \tabu@Xcoefs + \edef\tabu@naturalXmin {\the\dimexpr\tabu@naturalXmin*\dimen@/\p@}% + \@tempdimc =\dimexpr \wd\tabu@box -\tabu@naturalXmax+\tabu@naturalXmin \relax + \iftabu@measuring + \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax + \edef\tabu@bufferX{\endgroup \tabucolX \the\tabucolX \tabu@target\the\tabu@target}% + \else + \tabu@message{\tabu@message@spreadarith}% + \ifdim \dimexpr \@tempdimc+\tabu@spreadtarget >\tabu@target + \tabu@message{(tabu) spread + \ifdim \@tempdimc>\tabu@target useless here: default target used% + \else too large: reduced to fit default target\fi.}% + \else + \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax + \tabu@message{(tabu) spread: New target set to \the\tabu@target^^J}% + \fi + \begingroup \let\tabu@wddef \@gobbletwo + \@tempdimb \@tempdima + \tabucolX@init + \tabu@arithnegcoef + \wd\tabu@box =\dimexpr \wd\tabu@box +\@tempdima-\@tempdimb \relax + \expandafter\endgroup \expandafter\tabucolX \the\tabucolX + \tabu@arith + \fi +}% \tabu@spreadarith +\def\tabu@spread@arith #1#2{% + \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ + \else \advance\@tempdima \tabu@wd{#1}\relax + \fi +}% \tabu@spread@arith +%% Reporting in the .log file --------------------------------------- +\def\tabu@message@defaulttarget{% + \ifnum\tabu@nested=\z@^^J(tabu) Default target: + \ifx\tabudefaulttarget\linewidth \string\linewidth + \ifdim \tabu@thetarget=\linewidth \else + -\the\dimexpr\linewidth-\tabu@thetarget\fi = + \else\ifx\tabudefaulttarget\linegoal\string\linegoal= + \fi\fi + \else (tabu) Default target (nested): \fi + \the\tabu@target \on@line + \ifnum\tabu@nested=\z@ , page \the\c@page\fi} +\def\tabu@message@target {^^J(tabu) Target specified: + \the\tabu@target \on@line, page \the\c@page} +\def\tabu@message@arith {\tabu@header + \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@ + \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{ }\@@ + \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@ + \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@ + \ifdim \tabu@DELTA<\tabu@hfuzz giving space\else + \tabu@msgalign \dimexpr (\@tempdima-\tabu@DELTA) *\p@/\tabu@Xsum -\tabucolX {}{}{}{}{}\@@ + \fi +}% \tabu@message@arith +\def\tabu@message@spreadarith {\tabu@spreadheader + \tabu@msgalign \tabu@spreadtarget { }{ }{ }{ }{}\@@ + \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{}\@@ + \tabu@msgalign -\tabu@naturalXmax { }{}{}{}{}\@@ + \tabu@msgalign \tabu@naturalXmin { }{ }{ }{ }{}\@@ + \tabu@msgalign \ifdim \dimexpr\@tempdimc>\tabu@target \tabu@target + \else \@tempdimc+\tabu@spreadtarget \fi + {}{}{}{}{}\@@} +\def\tabu@message@negcoef #1#2{ + \tabu@spaces\tabu@spaces\space * #1. X[\rem@pt#2]: + \space width = \tabu@wd {#1} + \expandafter\string\csname tabu@\the\tabu@nested.W\number#1\endcsname + \ifdim -\tabu@pt#2\tabucolX<\tabu@target + < \number-\rem@pt#2 X + = \the\dimexpr -\tabu@pt#2\tabucolX \relax + \else + <= \the\tabu@target\space < \number-\rem@pt#2 X\fi} +\def\tabu@message@reached{\tabu@header + ******* Reached Target: + hfuzz = \tabu@hfuzz\on@line\space *******} +\def\tabu@message@etime{\edef\tabu@stoptime{\the\pdfelapsedtime}% + \tabu@message{(tabu)\tabu@spaces Time elapsed during measure: + \the\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax sec + \the\numexpr\numexpr(\tabu@stoptime-\tabu@starttime) + -\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax*65536\relax + *1000/65536\relax ms \tabu@spaces(\the\tabu@cnt\space + cycle\ifnum\tabu@cnt>\@ne s\fi)^^J^^J}} +\def\tabu@message@verticalsp {% + \ifdim \@tempdima>\tabu@ht + \ifdim \@tempdimb>\tabu@dp + \expandafter\expandafter\expandafter\string\tabu@ht = + \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@ + \expandafter\expandafter\expandafter\string\tabu@dp = + \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J% + \else + \expandafter\expandafter\expandafter\string\tabu@ht = + \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@^^J% + \fi + \else\ifdim \@tempdimb>\tabu@dp + \tabu@spaces\tabu@spaces\tabu@spaces + \expandafter\expandafter\expandafter\string\tabu@dp = + \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J\fi + \fi +}% \tabu@message@verticalsp +\edef\tabu@spaces{\@spaces} +\def\tabu@strippt{\expandafter\tabu@pt\the} +{\@makeother\P \@makeother\T\lowercase{\gdef\tabu@pt #1PT{#1}}} +\def\tabu@msgalign{\expandafter\tabu@msg@align\the\dimexpr} +\def\tabu@msgalign@PT{\expandafter\tabu@msg@align\romannumeral-`\0\tabu@strippt} +\def\do #1{% + \def\tabu@msg@align##1.##2##3##4##5##6##7##8##9\@@{% + \ifnum##1<10 #1 #1\else + \ifnum##1<100 #1 \else + \ifnum##1<\@m #1\fi\fi\fi + ##1.##2##3##4##5##6##7##8#1}% + \def\tabu@header{(tabu) \ifnum\tabu@cnt<10 #1\fi\the\tabu@cnt) }% + \def\tabu@titles{\ifnum \tabu@nested=\z@ + (tabu) Try#1 #1 tabu X #1 #1 #1tabu Width #1 #1 Target + #1 #1 #1 Coefs #1 #1 #1 Update^^J\fi}% + \def\tabu@spreadheader{% + (tabu) Try#1 #1 Spread #1 #1 tabu Width #1 #1 #1 Nat. X #1 #1 #1 #1Nat. Min. + #1 New Target^^J% + (tabu) sprd} + \def\tabu@message@save {\begingroup + \def\x ####1{\tabu@msg@align ####1{ }{ }{ }{ }{}\@@} + \def\z ####1{\expandafter\x\expandafter{\romannumeral-`\0\tabu@strippt + \dimexpr####1\p@{ }{ }}}% + \let\color \relax \def\tabu@rulesstyle ####1####2{\detokenize{####1}}% + \let\CT@arc@ \relax \let\@preamble \@gobble + \let\tabu@savedpream \@firstofone + \let\tabu@savedparams \@firstofone + \def\tabu@target ####1\relax {(tabu) target #1 #1 #1 #1 #1 = \x{####1}^^J}% + \def\tabucolX ####1\relax {(tabu) X columns width#1 = \x{####1}^^J}% + \def\tabu@nbcols ####1\relax {(tabu) Number of columns: \z{####1}^^J}% + \def\tabu@aligndefault ####1{(tabu) Default alignment: #1 #1 ####1^^J}% + \def\col@sep ####1\relax {(tabu) column sep #1 #1 #1 = \x{####1}^^J}% + \def\arrayrulewidth ####1\relax{(tabu) arrayrulewidth #1 = \x{####1}}% + \def\doublerulesep ####1\relax { doublerulesep = \x{####1}^^J}% + \def\extratabsurround####1\relax{(tabu) extratabsurround = \x{####1}^^J}% + \def\extrarowheight ####1\relax{(tabu) extrarowheight #1 = \x{####1}}% + \def\extrarowdepth ####1\relax {extrarowdepth = \x{####1}^^J}% + \def\abovetabulinesep####1\relax{(tabu) abovetabulinesep=\x{####1} }% + \def\belowtabulinesep####1\relax{ belowtabulinesep=\x{####1}^^J}% + \def\arraystretch ####1{(tabu) arraystretch #1 #1 = \z{####1}^^J}% + \def\minrowclearance####1\relax{(tabu) minrowclearance #1 = \x{####1}^^J}% + \def\tabu@arc@L ####1{(tabu) taburulecolor #1 #1 = ####1^^J}% + \def\tabu@drsc@L ####1{(tabu) tabudoublerulecolor= ####1^^J}% + \def\tabu@evr@L ####1{(tabu) everyrow #1 #1 #1 #1 = \detokenize{####1}^^J}% + \def\tabu@ls@L ####1{(tabu) line style = \detokenize{####1}^^J}% + \def\NC@find ####1\@nil{(tabu) tabu preamble#1 #1 = \detokenize{####1}^^J}% + \def\tabu@wddef####1####2{(tabu) Natural width ####1 = \x{####2}^^J}% + \let\edef \@gobbletwo \let\def \@empty \let\let \@gobbletwo + \tabu@message{% + (tabu) \string\savetabu{\tabu@temp}: \on@line^^J% + \tabu@usetabu \@nil^^J}% + \endgroup} +}\do{ } +%% Measuring the natural width (varwidth) - store the results ------- +\def\tabu@startpboxmeasure #1{\bgroup % entering \vtop + \edef\tabu@temp{\expandafter\@secondoftwo \ifx\tabu@hsize #1\else\relax\fi}% + \ifodd 1\ifx \tabu@temp\@empty 0 \else % starts with \tabu@hsize ? + \iftabu@spread \else % if spread -> measure + \ifdim \tabu@temp\p@>\z@ 0 \fi\fi\fi% if coef>0 -> do not measure + \let\@startpbox \tabu@startpboxORI % restore immediately (nesting) + \tabu@measuringtrue % for the quick option... + \tabu@Xcol =\expandafter\@firstoftwo\ifx\tabu@hsize #1\fi + \ifdim \tabu@temp\p@>\z@ \ifdim \tabu@temp\tabucolX<\tabu@target + \tabu@target=\tabu@temp\tabucolX \fi\fi + \setbox\tabu@box \hbox \bgroup + \begin{varwidth}\tabu@target + \let\FV@ListProcessLine \tabu@FV@ListProcessLine % \hbox to natural width... + \narrowragged \arraybackslash \parfillskip \@flushglue + \ifdefined\pdfadjustspacing \pdfadjustspacing\z@ \fi + \bgroup \aftergroup\tabu@endpboxmeasure + \ifdefined \cellspacetoplimit \tabu@cellspacepatch \fi + \else \expandafter\@gobble + \tabu@startpboxquick{#1}% \@gobble \bgroup + \fi +}% \tabu@startpboxmeasure +\def\tabu@cellspacepatch{\def\bcolumn##1\@nil{}\let\ecolumn\@empty + \bgroup\color@begingroup} +\def\tabu@endpboxmeasure {% + \@finalstrut \@arstrutbox + \end{varwidth}\egroup % + \ifdim \tabu@temp\p@ <\z@ % neg coef + \ifdim \tabu@wd\tabu@Xcol <\wd\tabu@box + \tabu@wddef\tabu@Xcol {\the\wd\tabu@box}% + \tabu@debug{\tabu@message@endpboxmeasure}% + \fi + \else % spread coef>0 + \global\advance \tabu@naturalX \wd\tabu@box + \@tempdima =\dimexpr \wd\tabu@box *\p@/\dimexpr \tabu@temp\p@\relax \relax + \ifdim \tabu@naturalXmax <\tabu@naturalX + \xdef\tabu@naturalXmax {\the\tabu@naturalX}\fi + \ifdim \tabu@naturalXmin <\@tempdima + \xdef\tabu@naturalXmin {\the\@tempdima}\fi + \fi + \box\tabu@box \egroup % end of \vtop (measure) restore \tabu@target +}% \tabu@endpboxmeasure +\def\tabu@wddef #1{\expandafter\xdef + \csname tabu@\the\tabu@nested.W\number#1\endcsname} +\def\tabu@wd #1{\csname tabu@\the\tabu@nested.W\number#1\endcsname} +\def\tabu@message@endpboxmeasure{\tabu@spaces\tabu@spaces<-> % <-> save natural wd + \the\tabu@Xcol. X[\tabu@temp]: + target = \the\tabucolX \space + \expandafter\expandafter\expandafter\string\tabu@wd\tabu@Xcol + =\tabu@wd\tabu@Xcol +}% \tabu@message@endpboxmeasure +\def\tabu@startpboxquick {\bgroup + \let\@startpbox \tabu@startpboxORI % restore immediately + \let\tabu \tabu@quick % \begin is expanded before... + \expandafter\@gobble \@startpbox % gobbles \bgroup +}% \tabu@startpboxquick +\def\tabu@quick {\begingroup \iffalse{\fi \ifnum0=`}\fi + \toks@{}\def\tabu@stack{b}\tabu@collectbody \tabu@endquick +}% \tabu@quick +\def\tabu@endquick {% + \ifodd 1\ifx\tabu@end@envir\tabu@endtabu \else + \ifx\tabu@end@envir\tabu@endtabus \else 0\fi\fi\relax + \endgroup + \else \let\endtabu \relax + \tabu@end@envir + \fi +}% \tabu@quick +\def\tabu@endtabu {\end{tabu}} +\def\tabu@endtabus {\end{tabu*}} +%% Measuring the heights and depths - store the results ------------- +\def\tabu@verticalmeasure{\everypar{}% + \ifnum \currentgrouptype>12 % 14=semi-simple, 15=math shift group + \setbox\tabu@box =\hbox\bgroup + \let\tabu@verticalspacing \tabu@verticalsp@lcr + \d@llarbegin % after \hbox ... + \else + \edef\tabu@temp{\ifnum\currentgrouptype=5\vtop + \else\ifnum\currentgrouptype=12\vcenter + \else\vbox\fi\fi}% + \setbox\tabu@box \hbox\bgroup$\tabu@temp \bgroup + \let\tabu@verticalspacing \tabu@verticalsp@pmb + \fi +}% \tabu@verticalmeasure +\def\tabu@verticalsp@lcr{% + \d@llarend \egroup % + \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep + \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax + \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi + \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi + \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi + \noindent\vrule height\@tempdima depth\@tempdimb +}% \tabu@verticalsp@lcr +\def\tabu@verticalsp@pmb{% inserts struts as needed + \par \expandafter\egroup + \expandafter$\expandafter + \egroup \expandafter + \@tempdimc \the\prevdepth + \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep + \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax + \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi + \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi + \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi + \let\@finalstrut \@gobble + \hrule height\@tempdima depth\@tempdimb width\hsize +%% \box\tabu@box +}% \tabu@verticalsp@pmb + +\def\tabu@verticalinit{% + \ifnum \c@taburow=\z@ \tabu@rearstrut \fi % after \tabu@reset ! + \advance\c@taburow \@ne + \tabu@htdef{\the\ht\@arstrutbox}\tabu@dpdef{\the\dp\@arstrutbox}% + \advance\c@taburow \m@ne +}% \tabu@verticalinit +\def\tabu@htdef {\expandafter\xdef \csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname} +\def\tabu@ht {\csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname} +\def\tabu@dpdef {\expandafter\xdef \csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname} +\def\tabu@dp {\csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname} +\def\tabu@verticaldynamicadjustment {% + \advance\c@taburow \@ne + \extrarowheight \dimexpr\tabu@ht - \ht\strutbox + \extrarowdepth \dimexpr\tabu@dp - \dp\strutbox + \let\arraystretch \@empty + \advance\c@taburow \m@ne +}% \tabu@verticaldynamicadjustment +\def\tabuphantomline{\crcr \noalign{% + {\globaldefs \@ne + \setbox\@arstrutbox \box\voidb@x + \let\tabu@@celllalign \tabu@celllalign + \let\tabu@@cellralign \tabu@cellralign + \let\tabu@@cellleft \tabu@cellleft + \let\tabu@@cellright \tabu@cellright + \let\tabu@@thevline \tabu@thevline + \let\tabu@celllalign \@empty + \let\tabu@cellralign \@empty + \let\tabu@cellright \@empty + \let\tabu@cellleft \@empty + \let\tabu@thevline \relax}% + \edef\tabu@temp{\tabu@multispan \tabu@nbcols{\noindent &}}% + \toks@\expandafter{\tabu@temp \noindent\tabu@everyrowfalse \cr + \noalign{\tabu@rearstrut + {\globaldefs\@ne + \let\tabu@celllalign \tabu@@celllalign + \let\tabu@cellralign \tabu@@cellralign + \let\tabu@cellleft \tabu@@cellleft + \let\tabu@cellright \tabu@@cellright + \let\tabu@thevline \tabu@@thevline}}}% + \expandafter}\the\toks@ +}% \tabuphantomline +%% \firsthline and \lasthline corrections --------------------------- +\def\tabu@firstline {\tabu@hlineAZ \tabu@firsthlinecorrection {}} +\def\tabu@firsthline{\tabu@hlineAZ \tabu@firsthlinecorrection \hline} +\def\tabu@lastline {\tabu@hlineAZ \tabu@lasthlinecorrection {}} +\def\tabu@lasthline {\tabu@hlineAZ \tabu@lasthlinecorrection \hline} +\def\tabu@hline {% replaces \hline if no colortbl (see \AtBeginDocument) + \noalign{\ifnum0=`}\fi + {\CT@arc@\hrule height\arrayrulewidth}% + \futurelet \tabu@temp \tabu@xhline +}% \tabu@hline +\def\tabu@xhline{% + \ifx \tabu@temp \hline + {\ifx \CT@drsc@\relax \vskip + \else\ifx \CT@drsc@\@empty \vskip + \else \CT@drsc@\hrule height + \fi\fi + \doublerulesep}% + \fi + \ifnum0=`{\fi}% +}% \tabu@xhline +\def\tabu@hlineAZ #1#2{\noalign{\ifnum0=`}\fi \dimen@ \z@ \count@ \z@ + \toks@{}\def\tabu@hlinecorrection{#1}\def\tabu@temp{#2}% + \tabu@hlineAZsurround +}% \tabu@hlineAZ +\newcommand*\tabu@hlineAZsurround[1][\extratabsurround]{% + \extratabsurround #1\let\tabucline \tabucline@scan + \let\hline \tabu@hlinescan \let\firsthline \hline + \let\cline \tabu@clinescan \let\lasthline \hline + \expandafter \futurelet \expandafter \tabu@temp + \expandafter \tabu@nexthlineAZ \tabu@temp +}% \tabu@hlineAZsurround +\def\tabu@hlinescan {\tabu@thick \arrayrulewidth \tabu@xhlineAZ \hline} +\def\tabu@clinescan #1{\tabu@thick \arrayrulewidth \tabu@xhlineAZ {\cline{#1}}} +\def\tabucline@scan{\@testopt \tabucline@sc@n {}} +\def\tabucline@sc@n #1[#2]{\tabu@xhlineAZ {\tabucline[{#1}]{#2}}} +\def\tabu@nexthlineAZ{% + \ifx \tabu@temp\hline \else + \ifx \tabu@temp\cline \else + \ifx \tabu@temp\tabucline \else + \tabu@hlinecorrection + \fi\fi\fi +}% \tabu@nexthlineAZ +\def\tabu@xhlineAZ #1{% + \toks@\expandafter{\the\toks@ #1}% + \@tempdimc \tabu@thick % The last line width + \ifcase\count@ \@tempdimb \tabu@thick % The first line width + \else \advance\dimen@ \dimexpr \tabu@thick+\doublerulesep \relax + \fi + \advance\count@ \@ne \futurelet \tabu@temp \tabu@nexthlineAZ +}% \tabu@xhlineAZ +\def\tabu@firsthlinecorrection{% \count@ = number of \hline -1 + \@tempdima \dimexpr \ht\@arstrutbox+\dimen@ + \edef\firsthline{% + \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule + height \the\dimexpr\@tempdima+\extratabsurround + depth \dp\@arstrutbox + width \tabustrutrule}\hss}\cr + \noalign{\vskip -\the\dimexpr \@tempdima+\@tempdimb + +\dp\@arstrutbox \relax}% + \the\toks@ + }\ifnum0=`{\fi + \expandafter}\firsthline % we are then ! +}% \tabu@firsthlinecorrection +\def\tabu@lasthlinecorrection{% + \@tempdima \dimexpr \dp\@arstrutbox+\dimen@+\@tempdimb+\@tempdimc + \edef\lasthline{% + \the\toks@ + \noalign{\vskip -\the\dimexpr\dimen@+\@tempdimb+\dp\@arstrutbox}% + \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule + depth \the\dimexpr \dp\@arstrutbox+\@tempdimb+\dimen@ + +\extratabsurround-\@tempdimc + height \z@ + width \tabustrutrule}\hss}\cr + }\ifnum0=`{\fi + \expandafter}\lasthline % we are then ! +}% \tabu@lasthlinecorrection +\def\tabu@LT@@hline{% + \ifx\LT@next\hline + \global\let\LT@next \@gobble + \ifx \CT@drsc@\relax + \gdef\CT@LT@sep{% + \noalign{\penalty-\@medpenalty\vskip\doublerulesep}}% + \else + \gdef\CT@LT@sep{% + \multispan\LT@cols{% + \CT@drsc@\leaders\hrule\@height\doublerulesep\hfill}\cr}% + \fi + \else + \global\let\LT@next\empty + \gdef\CT@LT@sep{% + \noalign{\penalty-\@lowpenalty\vskip-\arrayrulewidth}}% + \fi + \ifnum0=`{\fi}% + \multispan\LT@cols + {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr + \CT@LT@sep + \multispan\LT@cols + {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr + \noalign{\penalty\@M}% + \LT@next +}% \tabu@LT@@hline +%% Horizontal lines : \tabucline ------------------------------------ +\let\tabu@start \@tempcnta +\let\tabu@stop \@tempcntb +\newcommand*\tabucline{\noalign{\ifnum0=`}\fi \tabu@cline} +\newcommand*\tabu@cline[2][]{\tabu@startstop{#2}% + \ifnum \tabu@stop<\z@ \toks@{}% + \else \tabu@clinearg{#1}\tabu@thestyle + \edef\tabucline{\toks@{% + \ifnum \tabu@start>\z@ \omit + \tabu@multispan\tabu@start {\span\omit}&\fi + \omit \tabu@multispan\tabu@stop {\span\omit}% + \tabu@thehline\cr + }}\tabucline + \tabu@tracinglines{(tabu:tabucline) Style: #1^^J\the\toks@^^J^^J}% + \fi + \futurelet \tabu@temp \tabu@xcline +}% \tabu@cline +\def\tabu@clinearg #1{% + \ifx\\#1\\\let\tabu@thestyle \tabu@ls@ + \else \@defaultunits \expandafter\let\expandafter\@tempa + \romannumeral-`\0#1\relax \@nnil + \ifx \hbox\@tempa \tabu@clinebox{#1}% + \else\ifx \box\@tempa \tabu@clinebox{#1}% + \else\ifx \vbox\@tempa \tabu@clinebox{#1}% + \else\ifx \vtop\@tempa \tabu@clinebox{#1}% + \else\ifx \copy\@tempa \tabu@clinebox{#1}% + \else\ifx \leaders\@tempa \tabu@clineleads{#1}% + \else\ifx \cleaders\@tempa \tabu@clineleads{#1}% + \else\ifx \xleaders\@tempa \tabu@clineleads{#1}% + \else\tabu@getline {#1}% + \fi\fi\fi\fi\fi\fi\fi\fi + \fi +}% \tabu@clinearg +\def\tabu@clinebox #1{\tabu@clineleads{\xleaders#1\hss}} +\def\tabu@clineleads #1{% + \let\tabu@thestyle \relax \let\tabu@leaders \@undefined + \gdef\tabu@thehrule{#1}} +\def\tabu@thehline{\begingroup + \ifdefined\tabu@leaders + \noexpand\tabu@thehleaders + \else \noexpand\tabu@thehrule + \fi \endgroup +}% \tabu@thehline +\def\tabu@xcline{% + \ifx \tabu@temp\tabucline + \toks@\expandafter{\the\toks@ \noalign + {\ifx\CT@drsc@\relax \vskip + \else \CT@drsc@\hrule height + \fi + \doublerulesep}}% + \fi + \tabu@docline +}% \tabu@xcline +\def\tabu@docline {\ifnum0=`{\fi \expandafter}\the\toks@} +\def\tabu@docline@evr {\xdef\tabu@doclineafter{\the\toks@}% + \ifnum0=`{\fi}\aftergroup\tabu@doclineafter} +\def\tabu@multispan #1#2{% + \ifnum\numexpr#1>\@ne #2\expandafter\tabu@multispan + \else \expandafter\@gobbletwo + \fi {#1-1}{#2}% +}% \tabu@multispan +\def\tabu@startstop #1{\tabu@start@stop #1\relax 1-\tabu@nbcols \@nnil} +\def\tabu@start@stop #1-#2\@nnil{% + \@defaultunits \tabu@start\number 0#1\relax \@nnil + \@defaultunits \tabu@stop \number 0#2\relax \@nnil + \tabu@stop \ifnum \tabu@start>\tabu@nbcols \m@ne + \else\ifnum \tabu@stop=\z@ \tabu@nbcols + \else\ifnum \tabu@stop>\tabu@nbcols \tabu@nbcols + \else \tabu@stop + \fi\fi\fi + \advance\tabu@start \m@ne + \ifnum \tabu@start>\z@ \advance\tabu@stop -\tabu@start \fi +}% \tabu@start@stop +%% Numbers: siunitx S columns (and \tabudecimal) ------------------- +\def\tabu@tabudecimal #1{% + \def\tabu@decimal{#1}\@temptokena{}% + \let\tabu@getdecimal@ \tabu@getdecimal@ignorespaces + \tabu@scandecimal +}% \tabu@tabudecimal +\def\tabu@scandecimal{\futurelet \tabu@temp \tabu@getdecimal@} +\def\tabu@skipdecimal#1{#1\tabu@scandecimal} +\def\tabu@getdecimal@ignorespaces{% + \ifcase 0\ifx\tabu@temp\ignorespaces\else + \ifx\tabu@temp\@sptoken1\else + 2\fi\fi\relax + \let\tabu@getdecimal@ \tabu@getdecimal + \expandafter\tabu@skipdecimal + \or \expandafter\tabu@gobblespace\expandafter\tabu@scandecimal + \else \expandafter\tabu@skipdecimal + \fi +}% \tabu@getdecimal@ignorespaces +\def\tabu@get@decimal#1{\@temptokena\expandafter{\the\@temptokena #1}% + \tabu@scandecimal} +\def\do#1{% + \def\tabu@get@decimalspace#1{% + \@temptokena\expandafter{\the\@temptokena #1}\tabu@scandecimal}% +}\do{ } +\let\tabu@@tabudecimal \tabu@tabudecimal +\def\tabu@getdecimal{% + \ifcase 0\ifx 0\tabu@temp\else + \ifx 1\tabu@temp\else + \ifx 2\tabu@temp\else + \ifx 3\tabu@temp\else + \ifx 4\tabu@temp\else + \ifx 5\tabu@temp\else + \ifx 6\tabu@temp\else + \ifx 7\tabu@temp\else + \ifx 8\tabu@temp\else + \ifx 9\tabu@temp\else + \ifx .\tabu@temp\else + \ifx ,\tabu@temp\else + \ifx -\tabu@temp\else + \ifx +\tabu@temp\else + \ifx e\tabu@temp\else + \ifx E\tabu@temp\else + \ifx\tabu@cellleft\tabu@temp1\else + \ifx\ignorespaces\tabu@temp1\else + \ifx\@sptoken\tabu@temp2\else + 3\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax + \expandafter\tabu@get@decimal + \or \expandafter\tabu@skipdecimal + \or \expandafter\tabu@get@decimalspace + \else\expandafter\tabu@printdecimal + \fi +}% \tabu@getdecimal +\def\tabu@printdecimal{% + \edef\tabu@temp{\the\@temptokena}% + \ifx\tabu@temp\@empty\else + \ifx\tabu@temp\space\else + \expandafter\tabu@decimal\expandafter{\the\@temptokena}% + \fi\fi +}% \tabu@printdecimal +%% Verbatim inside X columns ---------------------------------------- +\def\tabu@verbatim{% + \let\verb \tabu@verb + \let\FV@DefineCheckEnd \tabu@FV@DefineCheckEnd +}% \tabu@verbatim +\let\tabu@ltx@verb \verb +\def\tabu@verb{\@ifstar {\tabu@ltx@verb*} \tabu@ltx@verb} +\def\tabu@fancyvrb {% + \def\tabu@FV@DefineCheckEnd ##1{% + \def\tabu@FV@DefineCheckEnd{% + ##1% + \let\FV@CheckEnd \tabu@FV@CheckEnd + \let\FV@@CheckEnd \tabu@FV@@CheckEnd + \let\FV@@@CheckEnd \tabu@FV@@@CheckEnd + \edef\FV@EndScanning{% + \def\noexpand\next{\noexpand\end{\FV@EnvironName}}% + \global\let\noexpand\FV@EnvironName\relax + \noexpand\next}% + \xdef\FV@EnvironName{\detokenize\expandafter{\FV@EnvironName}}}% + }\expandafter\tabu@FV@DefineCheckEnd\expandafter{\FV@DefineCheckEnd} +}% \tabu@fancyvrb +\def\tabu@FV@CheckEnd #1{\expandafter\FV@@CheckEnd \detokenize{#1\end{}}\@nil} +\edef\tabu@FV@@@CheckEnd {\detokenize{\end{}}} +\begingroup +\catcode`\[1 \catcode`\]2 +\@makeother\{ \@makeother\} + \edef\x[\endgroup + \def\noexpand\tabu@FV@@CheckEnd ##1\detokenize[\end{]##2\detokenize[}]##3% + ]\x \@nil{\def\@tempa{#2}\def\@tempb{#3}} +\def\tabu@FV@ListProcessLine #1{% + \hbox {%to \hsize{% + \kern\leftmargin + \hbox {%to \linewidth{% + \FV@LeftListNumber + \FV@LeftListFrame + \FancyVerbFormatLine{#1}\hss +%% DG/SR modification begin - Jan. 28, 1998 (for numbers=right add-on) +%% \FV@RightListFrame}% + \FV@RightListFrame + \FV@RightListNumber}% +%% DG/SR modification end + \hss}} +%% \savetabu -------------------------------------------------------- +\newcommand*\savetabu[1]{\noalign{% + \tabu@sanitizearg{#1}\tabu@temp + \ifx \tabu@temp\@empty \tabu@savewarn{}{The tabu will not be saved}\else + \@ifundefined{tabu@saved@\tabu@temp}{}{\tabu@savewarn{#1}{Overwriting}}% + \ifdefined\tabu@restored \expandafter\let + \csname tabu@saved@\tabu@temp \endcsname \tabu@restored + \else {\tabu@save}% + \fi + \fi}% +}% \savetabu +\def\tabu@save {% + \toks0\expandafter{\tabu@saved@}% + \iftabu@negcoef + \let\tabu@wddef \relax \let\tabu@ \tabu@savewd \edef\tabu@savewd{\tabu@Xcoefs}% + \toks0\expandafter{\the\toks\expandafter0\tabu@savewd}\fi + \toks1\expandafter{\tabu@savedpream}% + \toks2\expandafter{\tabu@savedpreamble}% + \let\@preamble \relax + \let\tabu@savedpream \relax \let\tabu@savedparams \relax + \edef\tabu@preamble{% + \def\noexpand\tabu@aligndefault{\tabu@align}% + \def\tabu@savedparams {\noexpand\the\toks0}% + \def\tabu@savedpream {\noexpand\the\toks1}}% + \edef\tabu@usetabu{% + \def\@preamble {\noexpand\the\toks2}% + \tabu@target \the\tabu@target \relax + \tabucolX \the\tabucolX \relax + \tabu@nbcols \the\tabu@nbcols \relax + \def\noexpand\tabu@aligndefault{\tabu@align}% + \def\tabu@savedparams {\noexpand\the\toks0}% + \def\tabu@savedpream {\noexpand\the\toks1}}% + \let\tabu@aligndefault \relax \let\@sharp \relax + \edef\@tempa{\noexpand\tabu@s@ved + {\tabu@usetabu} + {\tabu@preamble} + {\the\toks1}}\@tempa + \tabu@message@save +}% \tabu@save +\long\def\tabu@s@ved #1#2#3{% + \def\tabu@usetabu{#1}% + \expandafter\gdef\csname tabu@saved@\tabu@temp\endcsname ##1{% + \ifodd ##1% \usetabu + \tabu@measuringfalse \tabu@spreadfalse % Just in case... + \gdef\tabu@usetabu {% + \ifdim \tabu@target>\z@ \tabu@warn@usetabu \fi + \global\let\tabu@usetabu \@undefined + \def\@halignto {to\tabu@target}% + #1% + \ifx \tabu@align\tabu@aligndefault@text + \ifnum \tabu@nested=\z@ + \let\tabu@align \tabu@aligndefault \fi\fi}% + \else % \preamble + \gdef\tabu@preamble {% + \global\let\tabu@preamble \@undefined + #2% + \ifx \tabu@align\tabu@aligndefault@text + \ifnum \tabu@nested=\z@ + \let\tabu@align \tabu@aligndefault \fi\fi}% + \fi + #3}% +}% \tabu@s@ved +\def\tabu@aligndefault@text {\tabu@aligndefault}% +\def\tabu@warn@usetabu {\PackageWarning{tabu} + {Specifying a target with \string\usetabu\space is useless + \MessageBreak The target cannot be changed!}} +\def\tabu@savewd #1#2{\ifdim #2\p@<\z@ \tabu@wddef{#1}{\tabu@wd{#1}}\fi} +\def\tabu@savewarn#1#2{\PackageInfo{tabu} + {User-name `#1' already used for \string\savetabu + \MessageBreak #2}}% +\def\tabu@saveerr#1{\PackageError{tabu} + {User-name `#1' is unknown for \string\usetabu + \MessageBreak I cannot restore an unknown preamble!}\@ehd} +%% \rowfont --------------------------------------------------------- +\newskip \tabu@cellskip +\def\tabu@rowfont{\ifdim \baselineskip=\z@\noalign\fi + {\ifnum0=`}\fi \tabu@row@font} +\newcommand*\tabu@row@font[2][]{% + \ifnum7=\currentgrouptype + \global\let\tabu@@cellleft \tabu@cellleft + \global\let\tabu@@cellright \tabu@cellright + \global\let\tabu@@celllalign \tabu@celllalign + \global\let\tabu@@cellralign \tabu@cellralign + \global\let\tabu@@rowfontreset\tabu@rowfontreset + \fi + \global\let\tabu@rowfontreset \tabu@rowfont@reset + \expandafter\gdef\expandafter\tabu@cellleft\expandafter{\tabu@cellleft #2}% + \ifcsname tabu@cell@#1\endcsname % row alignment + \csname tabu@cell@#1\endcsname \fi + \ifnum0=`{\fi}% end of group / noalign group +}% \rowfont +\def\tabu@ifcolorleavevmode #1{\let\color \tabu@leavevmodecolor #1\let\color\tabu@color}% +\def\tabu@rowfont@reset{% + \global\let\tabu@rowfontreset \tabu@@rowfontreset + \global\let\tabu@cellleft \tabu@@cellleft + \global\let\tabu@cellright \tabu@@cellright + \global\let\tabu@cellfont \@empty + \global\let\tabu@celllalign \tabu@@celllalign + \global\let\tabu@cellralign \tabu@@cellralign +}% \tabu@@rowfontreset +\let\tabu@rowfontreset \@empty % overwritten \AtBeginDocument if colortbl +%% \tabu@prepnext@tok ----------------------------------------------- +\newif \iftabu@cellright +\def\tabu@prepnext@tok{% + \ifnum \count@<\z@ % + \@tempcnta \@M % + \tabu@nbcols\z@ + \let\tabu@fornoopORI \@fornoop + \tabu@cellrightfalse + \else + \ifcase \numexpr \count@-\@tempcnta \relax % (case 0): prev. token is left + \advance \tabu@nbcols \@ne + \iftabu@cellright % before-previous token is right and is finished + \tabu@cellrightfalse % + \tabu@righttok + \fi + \tabu@lefttok + \or % (case 1) previous token is right + \tabu@cellrighttrue \let\@fornoop \tabu@lastnoop + \else % special column: do not change the token + \iftabu@cellright % before-previous token is right + \tabu@cellrightfalse + \tabu@righttok + \fi + \fi % \ifcase + \fi + \tabu@prepnext@tokORI +}% \tabu@prepnext@tok +\long\def\tabu@lastnoop#1\@@#2#3{\tabu@lastn@@p #2\@nextchar \in@\in@@} +\def\tabu@lastn@@p #1\@nextchar #2#3\in@@{% + \ifx \in@#2\else + \let\@fornoop \tabu@fornoopORI + \xdef\tabu@mkpreambuffer{\tabu@nbcols\the\tabu@nbcols \tabu@mkpreambuffer}% + \toks0\expandafter{\expandafter\tabu@everyrowtrue \the\toks0}% + \expandafter\prepnext@tok + \fi +}% \tabu@lastnoop +\def\tabu@righttok{% + \advance \count@ \m@ne + \toks\count@\expandafter {\the\toks\count@ \tabu@cellright \tabu@cellralign}% + \advance \count@ \@ne +}% \tabu@righttok +\def\tabu@lefttok{\toks\count@\expandafter{\expandafter\tabu@celllalign + \the\toks\count@ \tabu@cellleft}% after because of $ +}% \tabu@lefttok +%% Neutralisation of glues ------------------------------------------ +\let\tabu@cellleft \@empty +\let\tabu@cellright \@empty +\tabu@celllalign@def{\tabu@cellleft}% +\let\tabu@cellralign \@empty +\def\tabu@cell@align #1#2#3{% + \let\tabu@maybesiunitx \toks@ \tabu@celllalign + \global \expandafter \tabu@celllalign@def \expandafter {\the\toks@ #1}% + \toks@\expandafter{\tabu@cellralign #2}% + \xdef\tabu@cellralign{\the\toks@}% + \toks@\expandafter{\tabu@cellleft #3}% + \xdef\tabu@cellleft{\the\toks@}% +}% \tabu@cell@align +\def\tabu@cell@l{% force alignment to left + \tabu@cell@align + {\tabu@removehfil \raggedright \tabu@cellleft}% left + {\tabu@flush1\tabu@ignorehfil}% right + \raggedright +}% \tabu@cell@l +\def\tabu@cell@c{% force alignment to center + \tabu@cell@align + {\tabu@removehfil \centering \tabu@flush{.5}\tabu@cellleft} + {\tabu@flush{.5}\tabu@ignorehfil} + \centering +}% \tabu@cell@c +\def\tabu@cell@r{% force alignment to right + \tabu@cell@align + {\tabu@removehfil \raggedleft \tabu@flush1\tabu@cellleft} + \tabu@ignorehfil + \raggedleft +}% \tabu@cell@r +\def\tabu@cell@j{% force justification (for p, m, b columns) + \tabu@cell@align + {\tabu@justify\tabu@cellleft} + {} + \tabu@justify +}% \tabu@cell@j +\def\tabu@justify{% + \leftskip\z@skip \@rightskip\leftskip \rightskip\@rightskip + \parfillskip\@flushglue +}% \tabu@justify +%% ragged2e settings +\def\tabu@cell@L{% force alignment to left (ragged2e) + \tabu@cell@align + {\tabu@removehfil \RaggedRight \tabu@cellleft} + {\tabu@flush 1\tabu@ignorehfil} + \RaggedRight +}% \tabu@cell@L +\def\tabu@cell@C{% force alignment to center (ragged2e) + \tabu@cell@align + {\tabu@removehfil \Centering \tabu@flush{.5}\tabu@cellleft} + {\tabu@flush{.5}\tabu@ignorehfil} + \Centering +}% \tabu@cell@C +\def\tabu@cell@R{% force alignment to right (ragged2e) + \tabu@cell@align + {\tabu@removehfil \RaggedLeft \tabu@flush 1\tabu@cellleft} + \tabu@ignorehfil + \RaggedLeft +}% \tabu@cell@R +\def\tabu@cell@J{% force justification (ragged2e) + \tabu@cell@align + {\justifying \tabu@cellleft} + {} + \justifying +}% \tabu@cell@J +\def\tabu@flush#1{% + \iftabu@colortbl % colortbl uses \hfill rather than \hfil + \hskip \ifnum13<\currentgrouptype \stretch{#1}% + \else \ifdim#1pt<\p@ \tabu@cellskip + \else \stretch{#1} + \fi\fi \relax + \else % array.sty + \ifnum 13<\currentgrouptype + \hfil \hskip1sp \relax \fi + \fi +}% \tabu@flush +\let\tabu@hfil \hfil +\let\tabu@hfill \hfill +\let\tabu@hskip \hskip +\def\tabu@removehfil{% + \iftabu@colortbl + \unkern \tabu@cellskip =\lastskip + \ifnum\gluestretchorder\tabu@cellskip =\tw@ \hskip-\tabu@cellskip + \else \tabu@cellskip \z@skip + \fi + \else + \ifdim\lastskip=1sp\unskip\fi + \ifnum\gluestretchorder\lastskip =\@ne + \hfilneg % \hfilneg for array.sty but not for colortbl... + \fi + \fi +}% \tabu@removehfil +\def\tabu@ignorehfil{\aftergroup \tabu@nohfil} +\def\tabu@nohfil{% \hfil -> do nothing + restore original \hfil + \def\hfil{\let\hfil \tabu@hfil}% local to (alignment template) group +}% \tabu@nohfil +\def\tabu@colortblalignments {% if colortbl + \def\tabu@nohfil{% + \def\hfil {\let\hfil \tabu@hfil}% local to (alignment template) group + \def\hfill {\let\hfill \tabu@hfill}% (colortbl uses \hfill) pfff... + \def\hskip ####1\relax{\let\hskip \tabu@hskip}}% local +}% \tabu@colortblalignments +%% Taking care of footnotes and hyperfootnotes ---------------------- +\long\def\tabu@footnotetext #1{% + \edef\@tempa{\the\tabu@footnotes + \noexpand\footnotetext [\the\csname c@\@mpfn\endcsname]}% + \global\tabu@footnotes\expandafter{\@tempa {#1}}}% +\long\def\tabu@xfootnotetext [#1]#2{% + \global\tabu@footnotes\expandafter{\the\tabu@footnotes + \footnotetext [{#1}]{#2}}} +\let\tabu@xfootnote \@xfootnote +\long\def\tabu@Hy@ftntext{\tabu@Hy@ftntxt {\the \c@footnote }} +\long\def\tabu@Hy@xfootnote [#1]{% + \begingroup + \value\@mpfn #1\relax + \protected@xdef \@thefnmark {\thempfn}% + \endgroup + \@footnotemark \tabu@Hy@ftntxt {#1}% +}% \tabu@Hy@xfootnote +\long\def\tabu@Hy@ftntxt #1#2{% + \edef\@tempa{% + \the\tabu@footnotes + \begingroup + \value\@mpfn #1\relax + \noexpand\protected@xdef\noexpand\@thefnmark {\noexpand\thempfn}% + \expandafter \noexpand \expandafter + \tabu@Hy@footnotetext \expandafter{\Hy@footnote@currentHref}% + }% + \global\tabu@footnotes\expandafter{\@tempa {#2}% + \endgroup}% +}% \tabu@Hy@ftntxt +\long\def\tabu@Hy@footnotetext #1#2{% + \H@@footnotetext{% + \ifHy@nesting + \hyper@@anchor {#1}{#2}% + \else + \Hy@raisedlink{% + \hyper@@anchor {#1}{\relax}% + }% + \def\@currentHref {#1}% + \let\@currentlabelname \@empty + #2% + \fi + }% +}% \tabu@Hy@footnotetext +%% No need for \arraybackslash ! ------------------------------------ +\def\tabu@latextwoe {% +\def\tabu@temp##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}} +\tabu@temp \tabu@centering \centering \arraybackslash +\tabu@temp \tabu@raggedleft \raggedleft \arraybackslash +\tabu@temp \tabu@raggedright \raggedright \arraybackslash +}% \tabu@latextwoe +\def\tabu@raggedtwoe {% +\def\tabu@temp ##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}} +\tabu@temp \tabu@Centering \Centering \arraybackslash +\tabu@temp \tabu@RaggedLeft \RaggedLeft \arraybackslash +\tabu@temp \tabu@RaggedRight \RaggedRight \arraybackslash +\tabu@temp \tabu@justifying \justifying \arraybackslash +}% \tabu@raggedtwoe +\def\tabu@normalcrbackslash{\let\\\@normalcr} +\def\tabu@trivlist{\expandafter\def\expandafter\@trivlist\expandafter{% + \expandafter\tabu@normalcrbackslash \@trivlist}} +%% Utilities: \fbox \fcolorbox and \tabudecimal ------------------- +\def\tabu@fbox {\leavevmode\afterassignment\tabu@beginfbox \setbox\@tempboxa\hbox} +\def\tabu@beginfbox {\bgroup \kern\fboxsep + \bgroup\aftergroup\tabu@endfbox} +\def\tabu@endfbox {\kern\fboxsep\egroup\egroup + \@frameb@x\relax} +\def\tabu@color@b@x #1#2{\leavevmode \bgroup + \def\tabu@docolor@b@x{#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@}}% + \afterassignment\tabu@begincolor@b@x \setbox\z@ \hbox +}% \tabu@color@b@x +\def\tabu@begincolor@b@x {\kern\fboxsep \bgroup + \aftergroup\tabu@endcolor@b@x \set@color} +\def\tabu@endcolor@b@x {\kern\fboxsep \egroup + \dimen@\ht\z@ \advance\dimen@ \fboxsep \ht\z@ \dimen@ + \dimen@\dp\z@ \advance\dimen@ \fboxsep \dp\z@ \dimen@ + \tabu@docolor@b@x \egroup +}% \tabu@endcolor@b@x +%% Corrections (arydshln, delarray, colortbl) ----------------------- +\def\tabu@fix@arrayright {%% \@arrayright is missing from \endarray + \iftabu@colortbl + \ifdefined\adl@array % + \def\tabu@endarray{% + \adl@endarray \egroup \adl@arrayrestore \CT@end \egroup % + \@arrayright % + \gdef\@preamble{}}% + \else % + \def\tabu@endarray{% + \crcr \egroup \egroup % + \@arrayright % + \gdef\@preamble{}\CT@end}% + \fi + \else + \ifdefined\adl@array % + \def\tabu@endarray{% + \adl@endarray \egroup \adl@arrayrestore \egroup % + \@arrayright % + \gdef\@preamble{}}% + \else % + \PackageWarning{tabu} + {\string\@arrayright\space is missing from the + \MessageBreak definition of \string\endarray. + \MessageBreak Compatibility with delarray.sty is broken.}% + \fi\fi +}% \tabu@fix@arrayright +\def\tabu@adl@xarraydashrule #1#2#3{% + \ifnum\@lastchclass=\adl@class@start\else + \ifnum\@lastchclass=\@ne\else + \ifnum\@lastchclass=5 \else % @-arg (class 5) and !-arg (class 1) + \adl@leftrulefalse \fi\fi % must be treated the same + \fi + \ifadl@zwvrule\else \ifadl@inactive\else + \@addtopreamble{\vrule\@width\arrayrulewidth + \@height\z@ \@depth\z@}\fi \fi + \ifadl@leftrule + \@addtopreamble{\adl@vlineL{\CT@arc@}{\adl@dashgapcolor}% + {\number#1}#3}% + \else \@addtopreamble{\adl@vlineR{\CT@arc@}{\adl@dashgapcolor}% + {\number#2}#3} + \fi +}% \tabu@adl@xarraydashrule +\def\tabu@adl@act@endpbox {% + \unskip \ifhmode \nobreak \fi \@finalstrut \@arstrutbox + \egroup \egroup + \adl@colhtdp \box\adl@box \hfil +}% \tabu@adl@act@endpbox +\def\tabu@adl@fix {% + \let\adl@xarraydashrule \tabu@adl@xarraydashrule % arydshln + \let\adl@act@endpbox \tabu@adl@act@endpbox % arydshln + \let\adl@act@@endpbox \tabu@adl@act@endpbox % arydshln + \let\@preamerror \@preamerr % arydshln +}% \tabu@adl@fix +%% Correction for longtable' \@startbox definition ------------------ +%% => \everypar is ``missing'' : TeX should be in vertical mode +\def\tabu@LT@startpbox #1{% + \bgroup + \let\@footnotetext\LT@p@ftntext + \setlength\hsize{#1}% + \@arrayparboxrestore + \everypar{% + \vrule \@height \ht\@arstrutbox \@width \z@ + \everypar{}}% +}% \tabu@LT@startpbox +%% \tracingtabu and the package options ------------------ +\DeclareOption{delarray}{\AtEndOfPackage{\RequirePackage{delarray}}} +\DeclareOption{linegoal}{% + \AtEndOfPackage{% + \RequirePackage{linegoal}[2010/12/07]% + \let\tabudefaulttarget \linegoal% \linegoal is \linewidth if not pdfTeX +}} +\DeclareOption{scantokens}{\tabuscantokenstrue} +\DeclareOption{debugshow}{\AtEndOfPackage{\tracingtabu=\tw@}} +\def\tracingtabu {\begingroup\@ifnextchar=% + {\afterassignment\tabu@tracing\count@} + {\afterassignment\tabu@tracing\count@1\relax}} +\def\tabu@tracing{\expandafter\endgroup + \expandafter\tabu@tr@cing \the\count@ \relax +}% \tabu@tracing +\def\tabu@tr@cing #1\relax {% + \ifnum#1>\thr@@ \let\tabu@tracinglines\message + \else \let\tabu@tracinglines\@gobble + \fi + \ifnum#1>\tw@ \let\tabu@DBG \tabu@@DBG + \def\tabu@mkarstrut {\tabu@DBG@arstrut}% + \tabustrutrule 1.5\p@ + \else \let\tabu@DBG \@gobble + \def\tabu@mkarstrut {\tabu@arstrut}% + \tabustrutrule \z@ + \fi + \ifnum#1>\@ne \let\tabu@debug \message + \else \let\tabu@debug \@gobble + \fi + \ifnum#1>\z@ + \let\tabu@message \message + \let\tabu@tracing@save \tabu@message@save + \let\tabu@starttimer \tabu@pdftimer + \else + \let\tabu@message \@gobble + \let\tabu@tracing@save \@gobble + \let\tabu@starttimer \relax + \fi +}% \tabu@tr@cing +%% Setup \AtBeginDocument +\AtBeginDocument{\tabu@AtBeginDocument} +\def\tabu@AtBeginDocument{\let\tabu@AtBeginDocument \@undefined + \ifdefined\arrayrulecolor \tabu@colortbltrue % + \tabu@colortblalignments % different glues are used + \else \tabu@colortblfalse \fi + \ifdefined\CT@arc@ \else \let\CT@arc@ \relax \fi + \ifdefined\CT@drsc@\else \let\CT@drsc@ \relax \fi + \let\tabu@arc@L \CT@arc@ \let\tabu@drsc@L \CT@drsc@ + \ifodd 1\ifcsname siunitx_table_collect_begin:Nn\endcsname % + \expandafter\ifx + \csname siunitx_table_collect_begin:Nn\endcsname\relax 0\fi\fi\relax + \tabu@siunitxtrue + \else \let\tabu@maybesiunitx \@firstofone % + \let\tabu@siunitx \tabu@nosiunitx + \tabu@siunitxfalse + \fi + \ifdefined\adl@array % + \else \let\tabu@adl@fix \relax + \let\tabu@adl@endtrial \@empty \fi + \ifdefined\longtable % + \else \let\longtabu \tabu@nolongtabu \fi + \ifdefined\cellspacetoplimit \tabu@warn@cellspace\fi + \csname\ifcsname ifHy@hyperfootnotes\endcsname % + ifHy@hyperfootnotes\else iffalse\fi\endcsname + \let\tabu@footnotetext \tabu@Hy@ftntext + \let\tabu@xfootnote \tabu@Hy@xfootnote \fi + \ifdefined\FV@DefineCheckEnd% + \tabu@fancyvrb \fi + \ifdefined\color % + \let\tabu@color \color + \def\tabu@leavevmodecolor ##1{% + \def\tabu@leavevmodecolor {\leavevmode ##1}% + }\expandafter\tabu@leavevmodecolor\expandafter{\color}% + \else + \let\tabu@color \tabu@nocolor + \let\tabu@leavevmodecolor \@firstofone \fi + \tabu@latextwoe + \ifdefined\@raggedtwoe@everyselectfont % + \tabu@raggedtwoe + \else + \let\tabu@cell@L \tabu@cell@l + \let\tabu@cell@R \tabu@cell@r + \let\tabu@cell@C \tabu@cell@c + \let\tabu@cell@J \tabu@cell@j \fi + \expandafter\in@ \expandafter\@arrayright \expandafter{\endarray}% + \ifin@ \let\tabu@endarray \endarray + \else \tabu@fix@arrayright \fi% + \everyrow{}% +}% \tabu@AtBeginDocument +\def\tabu@warn@cellspace{% + \PackageWarning{tabu}{% + Package cellspace has some limitations + \MessageBreak And redefines some macros of array.sty. + \MessageBreak Please use \string\tabulinesep\space to control + \MessageBreak vertical spacing of lines inside tabu environment}% +}% \tabu@warn@cellspace +%% tabu Package initialisation +\tabuscantokensfalse +\let\tabu@arc@G \relax +\let\tabu@drsc@G \relax +\let\tabu@evr@G \@empty +\let\tabu@rc@G \@empty +\def\tabu@ls@G {\tabu@linestyle@}% +\let\tabu@@rowfontreset \@empty % +\let\tabu@@celllalign \@empty +\let\tabu@@cellralign \@empty +\let\tabu@@cellleft \@empty +\let\tabu@@cellright \@empty +\def\tabu@naturalXmin {\z@} +\def\tabu@naturalXmax {\z@} +\let\tabu@rowfontreset \@empty +\def\tabulineon {4pt}\let\tabulineoff \tabulineon +\tabu@everyrowtrue +\ifdefined\pdfelapsedtime % + \def\tabu@pdftimer {\xdef\tabu@starttime{\the\pdfelapsedtime}}% +\else \let\tabu@pdftimer \relax \let\tabu@message@etime \relax +\fi +\tracingtabu=\z@ +\newtabulinestyle {=\maxdimen}% creates the 'factory' settings \tabu@linestyle@ +\tabulinestyle{} +\taburowcolors{} +\let\tabudefaulttarget \linewidth +\ProcessOptions* % \ProcessOptions* is quicker ! +\endinput +%% +%% End of file `tabu.sty'. diff --git a/input/bitmap/doubleDam/doubleDam.png b/input/bitmap/doubleDam/doubleDam.png new file mode 100644 index 0000000000000000000000000000000000000000..ad8076f5d820fc6b7ff6a51b72096826bbdf4d14 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<;m literal 0 HcmV?d00001 diff --git a/input/bitmap/doubleDam/doubleDamLeft.txt b/input/bitmap/doubleDam/doubleDamLeft.txt new file mode 100644 index 00000000..2ad5c157 --- /dev/null +++ b/input/bitmap/doubleDam/doubleDamLeft.txt @@ -0,0 +1,73 @@ +# Settings file for numsim program +# Run ./numsim lid_driven_cavity.txt + +# Problem description +physicalSizeX = 2.0 # physical size of the domain +physicalSizeY = 2.0 +endTime = 10.0 # duration of the simulation +re = 1000 # Reynolds number +gX = -1.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity +gY = 0.0 + + +# Boundary Conditions Type + +BCTop = NoSlip +BCRight = NoSlip +BCBottom = NoSlip +BCLeft = NoSlip + + +# NoSlip boundary conditions + +NoSlipVelTopX = 0 +NoSlipVelTopY = 0 +NoSlipVelRightX = 0 +NoSlipVelRightY = 0 +NoSlipVelBottomX = 0 +NoSlipVelBottomY = 0 +NoSlipVelLeftX = 0 +NoSlipVelLeftY = 0 + + +# Pressure BoundaryConditions + +PressureTop = 0.0 +PressureRight = 0.0 +PressureBottom = 0.0 +PressureLeft = 0.0 + +# Create Rectangular object in domain + +createRectangularObject = false + +obstaclePositionX = 0.75 +obstaclePositionY = 0.75 +obstacleDimensionX = 0.5 +obstacleDimensionY = 0.5 + +# Create domain from PNGBitmap + +createDomainfromBitmap = true +pathToBitmap = ../input/bitmap/doubleDam/smallLeft.png + +# Discretization parameters +nCellsX = 20 # number of cells in x and y direction +nCellsY = 20 + +useDonorCell = true # if donor cell discretization should be used, possible values: true false +alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences +tau = 0.5 # safety factor for time step width +maximumDt = 0.0005 # maximum values for time step width + +# Solver parameters +pressureSolver = SOR # which pressure solver to use, possible values: GaussSeidel SOR CG +omega = 1.6 # overrelaxation factor, only for SOR solver +epsilon = 1e-5 # tolerance for 2-norm of residual +maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver + +# Particle Tracker +useFluidTracer = true +particlePerCell = 100 +fluidTracerMethod = single + diff --git a/input/bitmap/doubleDam/doubleDamRight.png b/input/bitmap/doubleDam/doubleDamRight.png new file mode 100644 index 0000000000000000000000000000000000000000..3e6df44ccbf096561d45f02bc42a6fee128509d3 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Lc!3HG%8Q!`Lq*#ibJVQ8upoSx*1ITywba4#v z=uH0e|NsAbHXzu)N1x{kgHMQI>J^7oOl}c6!Q4D``u$QCSr1k;E@tb4Fb>~v5R*vW f!fM^a%fhhoHTTL_soB$j#xZ!h`njxgN@xNA`PC{@ literal 0 HcmV?d00001 diff --git a/input/bitmap/doubleDam/doubleDamRight.txt b/input/bitmap/doubleDam/doubleDamRight.txt new file mode 100644 index 00000000..920b7f62 --- /dev/null +++ b/input/bitmap/doubleDam/doubleDamRight.txt @@ -0,0 +1,73 @@ +# Settings file for numsim program +# Run ./numsim lid_driven_cavity.txt + +# Problem description +physicalSizeX = 2.0 # physical size of the domain +physicalSizeY = 2.0 +endTime = 10.0 # duration of the simulation +re = 1000 # Reynolds number +gX = 0.5 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity +gY = 0.0 + + +# Boundary Conditions Type + +BCTop = NoSlip +BCRight = NoSlip +BCBottom = NoSlip +BCLeft = NoSlip + + +# NoSlip boundary conditions + +NoSlipVelTopX = 0 +NoSlipVelTopY = 0 +NoSlipVelRightX = 0 +NoSlipVelRightY = 0 +NoSlipVelBottomX = 0 +NoSlipVelBottomY = 0 +NoSlipVelLeftX = 0 +NoSlipVelLeftY = 0 + + +# Pressure BoundaryConditions + +PressureTop = 0.0 +PressureRight = 0.0 +PressureBottom = 0.0 +PressureLeft = 0.0 + +# Create Rectangular object in domain + +createRectangularObject = false + +obstaclePositionX = 0.75 +obstaclePositionY = 0.75 +obstacleDimensionX = 0.5 +obstacleDimensionY = 0.5 + +# Create domain from PNGBitmap + +createDomainfromBitmap = true +pathToBitmap = ../input/bitmap/doubleDam/smallRight.png + +# Discretization parameters +nCellsX = 20 # number of cells in x and y direction +nCellsY = 20 + +useDonorCell = true # if donor cell discretization should be used, possible values: true false +alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences +tau = 0.5 # safety factor for time step width +maximumDt = 0.0005 # maximum values for time step width + +# Solver parameters +pressureSolver = SOR # which pressure solver to use, possible values: GaussSeidel SOR CG +omega = 1.6 # overrelaxation factor, only for SOR solver +epsilon = 1e-5 # tolerance for 2-norm of residual +maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver + +# Particle Tracker +useFluidTracer = true +particlePerCell = 100 +fluidTracerMethod = single + diff --git a/input/bitmap/doubleDam/doubleDamTop.png b/input/bitmap/doubleDam/doubleDamTop.png new file mode 100644 index 0000000000000000000000000000000000000000..9351bd23d3673df428615492761b2d46223160b5 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<M)Hdk}E|M#+bSLaQ`py`|$djL#|^O!|Mwn<=2>Xia!f$V zIfEc$)|AtxU(@T~eSRI=)^}^!vuQg!6iwPLNH`^P__C+$;f(RyANUIB1O`u6KbLh* G2~7a^$3vn3 literal 0 HcmV?d00001 diff --git a/input/bitmap/doubleDam/smallLeft.png b/input/bitmap/doubleDam/smallLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..5724f4f41806994ea31dc215052a42dde3c54bad GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-mSQK*5Dp-y;YjHK@=H8j978f1 z-`?EF+hQQVaPYgii<{?tVbzHjCuSZz=-qR{uck3vJm$g1x5xkJ>^OJ-)Q#kQ{`L>z zxh{$<(sT*#NIPRWU2pe0Q)v)qnSih2EGLuJ445oj!0rE=88C^Rj8{MNgq`|%31~e7 NgQu&X%Q~loCII_oL-hav literal 0 HcmV?d00001 diff --git a/input/bitmap/doubleDam/smallRight.png b/input/bitmap/doubleDam/smallRight.png new file mode 100644 index 0000000000000000000000000000000000000000..093267c8dc2ba3cfbf2630d13e557a45ab969261 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-#^NA%Cx&(BWL^R}t2|vCLo%G- z&fLg*KtbThA-9*CvZtwPM=(Wt7=C@(znz=w*qq`x_W8dnFTQo_R`7ehuxE|&9cxA9 z>dJNgr%zZN-YaahY5H>Ww?C%OU6di{b?Q{=5hdShBPY+uojnmtGX32&G_|J-cALCC z$)TG1)F^40H{Pt~_PR)YBcVv%aOYOxjc=xzXeDyvMy??43fR&@}&? bJCUD5?{@vV2$>T=S2K9J`njxgN@xNAvPoY_ literal 0 HcmV?d00001 diff --git a/input/bitmap/doubleDam/smallTop.png b/input/bitmap/doubleDam/smallTop.png new file mode 100644 index 0000000000000000000000000000000000000000..9eb189bb88eeb841026590fd75e303d111e4f67f GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-mSQK*5Dp-y;YjHK^2so&YUTF(lbS4T3)pN%M!2KS+MfCaP*-U`l)!PC{xWt~$( F695`xL8<@% literal 0 HcmV?d00001 diff --git a/input/bitmap/dropWaterHighResolution.png b/input/bitmap/dropWaterHighResolution.png new file mode 100644 index 0000000000000000000000000000000000000000..5f95fcfce058ec2db3faac0e3b9dac52ac18799e GIT binary patch literal 749 zcmeAS@N?(olHy`uVBq!ia0vp^DL~xA!3HF|zVhq_QjEnx?oJHr&dI!FU|?GA>Eakt z5%>01pr2HtMC-$c_ttK;zIb%Ul)SZj=esF$Dh73m?R(z8{`w4=bCZq#^Az0pUVHyn zvXlkOp@=>v3wlBkb&&=%8lcBEpm+}!$D&0(aqHalBOCYZpS02ViG;h= zo#odJ_X*?ztvTxw(b?dr`k7z zuXK)s!9NG4gHi_`ZJFS(fo+3@u8P1KMjbzHPL^zj?#oVKDVc4#uQ%&(Jk?jgTe~DWM4fW!fWo literal 0 HcmV?d00001 diff --git a/input/settings_debug_joni.txt b/input/settings_debug_joni.txt index 3a240a81..4cc565fb 100644 --- a/input/settings_debug_joni.txt +++ b/input/settings_debug_joni.txt @@ -49,7 +49,7 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap createDomainfromBitmap = true -pathToBitmap = /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Bitmap/drop3.png +pathToBitmap = ../input/Bitmap/doubleDam/doubleDam.png # Discretization parameters nCellsX = 20 # number of cells in x and y direction diff --git a/input/settings_drop.txt b/input/settings_drop.txt index 6a0bdf7f..b34d032c 100644 --- a/input/settings_drop.txt +++ b/input/settings_drop.txt @@ -5,7 +5,7 @@ physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 endTime = 10.0 # duration of the simulation -re = 100 # Reynolds number +re = 1000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity gY = -0.5 @@ -32,10 +32,10 @@ NoSlipVelLeftY = 0 # Pressure BoundaryConditions -PressureTop = 0 +PressureTop = 0.0 PressureRight = 0.0 -PressureBottom = 0 -PressureLeft = 100.0 +PressureBottom = 0.0 +PressureLeft = 0.0 # Create Rectangular object in domain diff --git a/src/boundary/boundary.cpp b/src/boundary/boundary.cpp index acf6d10f..60aee0ed 100644 --- a/src/boundary/boundary.cpp +++ b/src/boundary/boundary.cpp @@ -378,21 +378,21 @@ void Boundary::updateVelocitySurfaceBC(double dt){ discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; break; - case Mask::FLUID_SINGLE_BOTTOM: - // u - discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; - discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; - break; - case Mask::FLUID_SINGLE_TOP: // u discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; - break; + break; case Mask::FLUID_SINGLE_RIGHT: // v discretization_->v(i, j) = discretization_->v(i, j) + dt * settings_.g[1]; discretization_->v(i, j - 1) = discretization_->v(i, j - 1) + dt * settings_.g[1]; + break; + case Mask::FLUID_SINGLE_BOTTOM: + // u + discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; + discretization_->u(i - 1, j) = discretization_->u(i - 1, j) + dt * settings_.g[0]; + break; case Mask::FLUID_DROPLET: // u discretization_->u(i, j) = discretization_->u(i, j) + dt * settings_.g[0]; diff --git a/src/computation.cpp b/src/computation.cpp index bf371552..38c05603 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -23,6 +23,9 @@ void Computation::initialize(int argc, char *argv[]) } meshWidth_ = {settings_.physicalSize[0] / settings_.nCells[0], settings_.physicalSize[1] / settings_.nCells[1]}; + + // TODO: remove prints + std::cout << "Pyhsical size: " << settings_.physicalSize[0] << " " << settings_.physicalSize[1] << std::endl; std::cout << "Meshwidth: " << meshWidth_[0] << " " << meshWidth_[1] << std::endl; usleep(1000000); diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index aee1b89e..9118645e 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -117,6 +117,8 @@ void FluidTracer::moveParticles(double dt) { // initializeHomogenousParticleDistribution(); // Reset mask_->resetMask(); + std::vector oldParticlesPerCell; + oldParticlesPerCell = currentParticlesPerCell_; std::fill(currentParticlesPerCell_.begin(), currentParticlesPerCell_.end(), 0); for (int i = 0; i < numParticles_; i++) { @@ -130,7 +132,6 @@ void FluidTracer::moveParticles(double dt) { std::array newIdx = cellOfParticle(i); - // TODO: uncomment this if threshold instead of singleParticle if (mask_->isObstacle(newIdx[0], newIdx[1])){ std::cout<< "CFL Violated" << std::endl; // remove from domain @@ -141,25 +142,51 @@ void FluidTracer::moveParticles(double dt) { currentParticlesPerCell_[newIdx[0] + newIdx[1] * mask_->size()[0]] += 1; (*mask_)(newIdx[0], newIdx[1]) = Mask::FLUID; } - } - // int threshold = getThresholdParticlesFluidCell(); + int threshold = 0; //getThresholdParticlesFluidCell(); - // for (int i = 0; i < mask_->size()[0]; i++){ - // for (int j = 0; j < mask_->size()[1]; j++){ - // if (currentParticlesPerCell_[i + j * mask_->size()[0]] >= threshold){ - // (*mask_)(i, j) = Mask::FLUID; - // } - // } - // } + for (int i = 0; i < mask_->size()[0]; i++){ + for (int j = 0; j < mask_->size()[1]; j++){ + if (currentParticlesPerCell_[i + j * mask_->size()[0]] > threshold){ + (*mask_)(i, j) = Mask::FLUID; + } + } + } // std::cout<< "Threshold: " << threshold << std::endl; resetVelocityInAirCells(); // Update BC in mask mask_->setFluidBC(); + + + for (int i = 0; i < mask_->size()[0]; i++){ + for (int j = 0; j < mask_->size()[1]; j++){ + + if (currentParticlesPerCell_[i + j * mask_->size()[0]] > 0 && oldParticlesPerCell[i + j * mask_->size()[0]] == 0){ + // std::cout << std::setw(2) << std::setfill('0') << i << " " << std::setw(2) << std::setfill('0') << j << " " << " New Fluid" << std::endl; + switch ((*mask_)(i, j)){ + case Mask::FLUID_SINGLE_RIGHT: + discretization_->u(i, j) = discretization_->u(i + 1, j); + break; + case Mask::FLUID_SINGLE_BOTTOM: + discretization_->v(i, j - 1) = discretization_->v(i, j - 2); + break; + case Mask::FLUID_SINGLE_LEFT: + discretization_->u(i - 1, j) = discretization_->u(i - 2, j); + break; + case Mask::FLUID_SINGLE_TOP: + discretization_->v(i, j) = discretization_->v(i, j + 1); + break; + } + } + } + } + + } +// TODO: remove void FluidTracer::resetVelocityInAirCells(){ for (int i = 1; i < mask_->size()[0]-1; i++){ for (int j = 1; j < mask_->size()[1]-1; j++){ From 7246e8b5bf67705eddd9617763ce86e21d802a50 Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Thu, 8 Feb 2024 16:49:00 +0100 Subject: [PATCH 64/67] [README][input] --- README.md | 63 +++++++++--------- build.sh | 11 ++- documentation/html/boundary_8h_source.html | 10 +-- documentation/html/computation_8h_source.html | 2 +- documentation/latex/classArray2D.pdf | Bin 4942 -> 4942 bytes .../latex/classCentralDifferences.pdf | Bin 5704 -> 5704 bytes documentation/latex/classDiscretization.pdf | Bin 5766 -> 5766 bytes documentation/latex/classDonorCell.pdf | Bin 5600 -> 5600 bytes documentation/latex/classFieldVariable.pdf | Bin 4939 -> 4939 bytes documentation/latex/classGaussSeidel.pdf | Bin 5020 -> 5020 bytes documentation/latex/classOutputWriter.pdf | Bin 5206 -> 5206 bytes .../latex/classOutputWriterParaview.pdf | Bin 4909 -> 4909 bytes documentation/latex/classOutputWriterText.pdf | Bin 4610 -> 4610 bytes documentation/latex/classPressureSolver.pdf | Bin 5338 -> 5338 bytes documentation/latex/classSOR.pdf | Bin 4725 -> 4725 bytes documentation/latex/classStaggeredGrid.pdf | Bin 5761 -> 5761 bytes input/bitmap/{ => drop}/drop3.png | Bin input/bitmap/drop/dropTheComet.png | Bin 0 -> 739 bytes input/bitmap/{ => drop}/dropWater.png | Bin .../{ => drop}/dropWaterHighResolution.png | Bin input/bitmap/drop/dropWaterWide.png | Bin 0 -> 567 bytes input/bitmap/drop/dropWide.png | Bin 0 -> 559 bytes input/bitmap/drop/dropWide_HighResolution.png | Bin 0 -> 6156 bytes input/bitmap/waterTab.png | Bin 0 -> 304 bytes input/settings_drop.txt | 2 +- input/settings_tap.txt | 10 +-- mask.png => media/mask.png | Bin 27 files changed, 54 insertions(+), 44 deletions(-) rename input/bitmap/{ => drop}/drop3.png (100%) create mode 100644 input/bitmap/drop/dropTheComet.png rename input/bitmap/{ => drop}/dropWater.png (100%) rename input/bitmap/{ => drop}/dropWaterHighResolution.png (100%) create mode 100644 input/bitmap/drop/dropWaterWide.png create mode 100644 input/bitmap/drop/dropWide.png create mode 100644 input/bitmap/drop/dropWide_HighResolution.png create mode 100644 input/bitmap/waterTab.png rename mask.png => media/mask.png (100%) diff --git a/README.md b/README.md index 607a0c70..9cdd820c 100644 --- a/README.md +++ b/README.md @@ -15,57 +15,60 @@ We recommend to run the simulation using the provided bash script `build.sh`. In For the user there is the settings.txt file that can be adjusted to fit the specific simulation needs. -The first part of the settings file specifies the general geometry -of the simulation domain: +### General geometry of the simulation domain: -* **physicalSizeX** and **physicalSizeY**: The domain size in meters. -* **endTime**: The endtime of the simulation in seconds. -* **re**: The reynolds number (specfies indirectly the viscosity of the fluid). -* **gX** and **gY**: Acceleration resulting from external forces. +* `physicalSizeX` and `physicalSizeY`: The domain size in meters. *If* bitmap has other ratio, will rescale `physicalSizeY` automatically. +* `endTime`: The endtime of the simulation in seconds. +* `re`: The reynolds number (specfies indirectly the viscosity of the fluid). +* `gX` and `gY`: Acceleration resulting from external forces. + +### Domain Boundary Conditions Subsequently the domain boundary conditions are specified. You can choose between Pressure and NoSlip. -* **BcTop**, **BcRight**, **BcBottom** and **BCLeft**: Type of boundary condition on either side of the domain. Can be either "NoSlip" or Pressure. +* `BcTop`, `BcRight`, `BcBottom` and `BCLeft`: Type of boundary condition on either side of the domain. Can be either "NoSlip" or Pressure. Then the specific values for the NoSlip domain boundary conditions follow. -* **NoSlipVelTopX/Y**: Noslip boundary velocities directly at the domain top in m/s. -* **NoSlipVelRightX/Y**: Noslip boundary velocities directly at the domain right in m/s. -* **NoSlipVelBottomX/Y**: Noslip boundary velocities directly at the domain bottom in m/s. -* **NoSlipVelLeftX/Y**: Noslip boundary velocities directly at the domain left in m/s. +* `NoSlipVelTopX/Y`: Noslip boundary velocities directly at the domain top in m/s. +* `NoSlipVelRightX/Y`: Noslip boundary velocities directly at the domain right in m/s. +* `NoSlipVelBottomX/Y`: Noslip boundary velocities directly at the domain bottom in m/s. +* `NoSlipVelLeftX/Y`: Noslip boundary velocities directly at the domain left in m/s. Then the specific values for the Pressure domain boundary conditions follow. -* **PressureTop**: Pressure directly at the top of the domain in Pa -* **PressureRight**: Pressure directly at the right of the domain in Pa -* **PressureBottom**: Pressure directly at the bottom of the domain in Pa -* **PressureLeft**: Pressure directly at the left of the domain in Pa +* `PressureTop`: Pressure directly at the top of the domain in Pa +* `PressureRight`: Pressure directly at the right of the domain in Pa +* `PressureBottom`: Pressure directly at the bottom of the domain in Pa +* `PressureLeft`: Pressure directly at the left of the domain in Pa + +### Geometry If you want to put a rectangular object in the domain you can specfiy its location and dimension with the following setting. -* **createRectangularObject**: Set to true if you want to add a rectangular object -* **obstaclePositionX/Y**: Position of the left lower corner of the rectangle in the domain in m -* **obstacleDimensionX/Y**: Dimension of the object in x and y direction in m +* `createRectangularObject`: Set to true if you want to add a rectangular object +* `obstaclePositionX/Y`: Position of the left lower corner of the rectangle in the domain in m +* `obstacleDimensionX/Y`: Dimension of the object in x and y direction in m In the following you can specify wheter you want to load your domain from a bitmap. -* **createDomainfromBitmap**: Set to true if you want to load your domain from a bitmap +* `createDomainfromBitmap`: Set to true if you want to load your domain from a bitmap -* **pathToBitmap**: path to the location of the bitmap saved as a png. +* `pathToBitmap`: path to the location of the bitmap saved as a png. -Then follows more paramters considering the discretization +### Discretization -* **nCellsX/Y**: Number of cells in x and y direction as int -* **useDonorCell**: Set to true if you want to use the Donor Cell scheme -* **alpha**: Factor for donor-cell scheme between 0 and 1. 0 is equivalent to central differences -* **epsilon**: Tolerance of the 2-norm residual -* **maximumNumberOfIterations**: Maximum number of iterations of the pressure solver +* `nCellsX/Y`: Number of cells in x and y direction as int, *if* bitmap is provided will be ignored +* `useDonorCell`: Set to true if you want to use the Donor Cell scheme +* `alpha`: Factor for donor-cell scheme between 0 and 1. 0 is equivalent to central differences +* `epsilon`: Tolerance of the 2-norm residual +* `maximumNumberOfIterations`: Maximum number of iterations of the pressure solver -Finally a few parameters for open surfaces follow: +### Open surfaces -* **useFluidTracer**: Set to true if you want to simulate free surfaces -* **particlesPerCell**: Number of fluid particles per cell as integer +* `useFluidTracer`: Set to true if you want to simulate free surfaces +* `particlesPerCell`: Number of fluid particles per cell as integer @@ -94,7 +97,7 @@ will be written to the build/out folder during simulation. When the files are loaded into paraview you should apply a threshold to the mask field to make obstacle visible in paraview (see image). Then use the threshold field to perform further visualizations. -![mask](mask.png) +![mask](media/mask.png) diff --git a/build.sh b/build.sh index d3320078..59c76571 100755 --- a/build.sh +++ b/build.sh @@ -20,12 +20,19 @@ make install -j4 # ./numsim ../input/settings.txt # ./numsim ../input/settings_aerodynamic_obstacle.txt -./numsim ../input/settings_damBreak.txt +# ./numsim ../input/settings_damBreak.txt +./numsim ../input/settings_drop.txt ###################### ## DEBUG -> DELETE ## ###################### -# dir="/home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Simulations/data" +dir="/home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Simulations/data" +newdir="dropTheComet" +rm -rf $dir/$newdir +mkdir $dir/$newdir +cp -r out $dir/$newdir/ + + # ./numsim ../input/bitmap/doubleDam/doubleDam.txt # rm -rf "$dir"/doubleDam/* diff --git a/documentation/html/boundary_8h_source.html b/documentation/html/boundary_8h_source.html index da5f9357..7737e85f 100644 --- a/documentation/html/boundary_8h_source.html +++ b/documentation/html/boundary_8h_source.html @@ -141,12 +141,12 @@
    Class responsible to caluclate boundary conditions.
    Definition boundary.h:15
    std::shared_ptr< Mask > mask_
    shared pointer to mask entity
    Definition boundary.h:67
    Boundary(std::shared_ptr< Mask > mask, std::shared_ptr< Discretization > discretization, Settings settings)
    Constructor.
    Definition boundary.cpp:3
    -
    void setPressureBoundaryValues()
    calculates and sets the pressure boundary values for obstacles and domain boundary
    Definition boundary.cpp:38
    -
    void updateBoundary()
    updates fluid boundary cell list
    Definition boundary.cpp:27
    -
    bool doCalculateG(int i, int j) const
    returns true if cell top and bottom of G value are fluid (not a boundary value)
    Definition boundary.cpp:673
    +
    void setPressureBoundaryValues()
    calculates and sets the pressure boundary values for obstacles and domain boundary
    Definition boundary.cpp:39
    +
    void updateBoundary()
    updates fluid boundary cell list
    Definition boundary.cpp:28
    +
    bool doCalculateG(int i, int j) const
    returns true if cell top and bottom of G value are fluid (not a boundary value)
    Definition boundary.cpp:676
    void setVelocityBoundaryValues()
    calculates and sets the velocity boundary values for surface, obstacle and domain boundary
    Definition boundary.cpp:207
    -
    void setPressureSurfaceBC()
    calculates and sets the pressure boundary values for surface boundary
    Definition boundary.cpp:118
    -
    bool doCalculateF(int i, int j) const
    returns true if cell left and rigt of F value are fluid (not a boundary value)
    Definition boundary.cpp:669
    +
    void setPressureSurfaceBC()
    calculates and sets the pressure boundary values for surface boundary
    Definition boundary.cpp:119
    +
    bool doCalculateF(int i, int j) const
    returns true if cell left and rigt of F value are fluid (not a boundary value)
    Definition boundary.cpp:672
    All settings that parametrize a simulation run.
    Definition settings.h:14
  • diff --git a/documentation/html/computation_8h_source.html b/documentation/html/computation_8h_source.html index 33f49605..bc3567fd 100644 --- a/documentation/html/computation_8h_source.html +++ b/documentation/html/computation_8h_source.html @@ -143,7 +143,7 @@
    Computation of Simulation.
    Definition computation.h:31
    void initialize(int argc, char *argv[])
    Initialize the simulation with settings from .txt file.
    Definition computation.cpp:6
    -
    void runSimulation()
    run the whole simulation until t_end
    Definition computation.cpp:67
    +
    void runSimulation()
    run the whole simulation until t_end
    Definition computation.cpp:72
    All settings that parametrize a simulation run.
    Definition settings.h:14
    diff --git a/documentation/latex/classArray2D.pdf b/documentation/latex/classArray2D.pdf index 9cf977ee3d8bc6ccafb9b42fae158fb71afc9c82..52b4c5fdf91e3936afc96ee72cf65d8d14f6c4cd 100644 GIT binary patch delta 194 zcmX@7c1~@BBp;_mh@qL4p^268WF8HGDK3d6sTwX;Mg~SE21W)D6`NZHa~NZd%`GiW++1BP-5eb) zoekZL42%uUjSS43osCS~42=xzYzV4|<+8KmDlSPZDyb++P2(~#HL>JURdw}u;{pIB C*e?hG delta 194 zcmX@7c1~@BBp;`Fh@q*KiKUgvWF(k zCYC0~+6IQ|1_tVyT>8HGDK3d6sTwX;Mg~SE21W)D6`NZHa~NYC9ZgIO3{4Fz%q^S@ zoE@E<%v>GKT+LlAEZm%oEX`f)YzV4|<+8KmDlSPZDyb++P2(~FTF<4b>gw;t1puej BFfRZA diff --git a/documentation/latex/classCentralDifferences.pdf b/documentation/latex/classCentralDifferences.pdf index 03fe6efd7987b49a1e0a472be8ddc7a199180a21..1bb78bc36e98ed70a6664266fb7b9d5541c37d02 100644 GIT binary patch delta 148 zcmX@1b3$i>upp;Jh@qL4p^268WEnvtBwo1SPF_<3V`IZa0~6h})Fi{rvO-o&Y!-%Q zh9<_7V?|`3%+2*8IgCywmWGxFZssnI&c;RtE+*#2=0=V{!pYLm87S^#X=g)7#bjME FX#ku=BQgL0 delta 148 zcmX@1b3$i>upp;-h@q*KiKUgvWEnvtBwo1SPTs_n#1u0_OHmHVZ>D zLlfi4vqfZ}%*}g6au}Tqj2xZJj7?2k9NnB94V|3bjExM<+#C&@oLns&9Zk*cYzV2C IoGm5|00ogG`~Uy| delta 148 zcmZqEZPVQlD9C9ZVrXh*VrgYEIZDt7i8obnCvRd(Vv3oerKxUON~+1`Xdx>mHgiK$ z6HAlHvqfZ}%*}g6au}UlT?`DIT}_QF+>8yK4Gm0;EM3ej4BaeET#bwz-Q0}qYzV2C IoGm5|07%azNdN!< diff --git a/documentation/latex/classDonorCell.pdf b/documentation/latex/classDonorCell.pdf index 730538ffa0a52878d83203bd3af82f69e2e5d6e0..1396d56de66453837e05e577b503c2b0394cdd40 100644 GIT binary patch delta 194 zcmaE${Xl!eY5`7*5JNL7LlZ0G$y)@Bka+I}cJi7U7#kZV8kp#&r6w6}-YRItq+wxb zW@ut;tZiVZZeXCU$))d`pW>2OlB(fiWn^GvVqjzdQL$NEB!@B9*xbd)+{Mw=z}VE> z(9+e}(82OlB(fiWn^GvVqjzdQL$NEB!@B9#nsfr%-q?`)Wi)a zVeI1KXlY?&VrJ@QYT{yG=wfDPLr_I5mz^C~aY3Q42A1Z|&X%UeP6p;qu1=1whAyUdHiT46 IHV~Eu01w0@%>V!Z diff --git a/documentation/latex/classGaussSeidel.pdf b/documentation/latex/classGaussSeidel.pdf index 125baeb7ff122474b53c6cecc627505107043344..c28a0d3d3b0c898900c4c86209cc015056623fcd 100644 GIT binary patch delta 147 zcmbQEK1Y2+Iv=M+h@qL4p^268R$;1}3^`sY!;L3;C^>*endq z3{8wDZxob)GB;lq%w=>may2kFurzmebuqFuH8L=Dbab(FHnTJ{H8L_VF>$oBaU-B& Ia-*;`01Z+kvj6}9 delta 147 zcmbQEK1Y2+Iv=Nbh@q*KiKUgv*vt)0 zO)O0&Zxob)GB;lq%w=>mu{3uxG%z)@a5XSLt{4sQ!_Vn12abx7b8Y00{~aKB*Opz delta 151 zcmcbnaZO``B0raTh@q*KiKUf^@nmg&Lu76m{|?^7l*AM>LrYWLw3Jkn&DsK1Ozh@{ zrY4p^)j2}aF!ts?p&Uj>Gc!X2a~D%1Lsv&*BSRNUCo@x5M^h6ca}y&&6B9=}8xsO5 JCR>Y00|0C+B#Qt5 diff --git a/documentation/latex/classOutputWriterParaview.pdf b/documentation/latex/classOutputWriterParaview.pdf index ed4127f112fd8947d63b045d7b8746a5d19918ee..09a47e0a5d418a6dbfef665d6f81784d08d90e04 100644 GIT binary patch delta 197 zcmZ3hwpMM!4_+>d5JNL7LlY}wlgUhchR9r7z8$=#2FXcD1{Nl|X{kwuo0<5nm^3X6 z%?wS9O|%UR)eQ{PHM#VC^HW?BOHwsltc(ndObm<+pei<}3T89Lniv?kxth5-IlCAb zSU8(l8XK7ynYo%f8JZioI2&6!+u0CQ5zA#~$5mXCSX5F`l$yq6Vrpo{rK;-c@5TiH D4bm_- delta 197 zcmZ3hwpMM!4_+?w5JOWd6H6--TSTmXNx BFyjCK delta 197 zcmZotX;Rs6mWRtc#L(2r#L~*dc=B}~Lu9TH?+)I?l*AM>LrYWLw3Jkn&DVLYm^94| zO-(FKjI|96)eQ{PHM#VC^HW?BOHwsltc(ndObm<+pei<731l{PAm>D>k zyI2?jX>)T&6AKepLt`M{$<@w=po&;7J3Fr8lEk8tilWpsE)yd|b1qd?SARDy0Jb?X ANdN!< diff --git a/documentation/latex/classPressureSolver.pdf b/documentation/latex/classPressureSolver.pdf index 0ccb4086d71baf503f4459fb44719c25b05b0afb..898f1bd91ff05ce9232a49bbaf01d43f21f5bb83 100644 GIT binary patch delta 151 zcmcbmc}sJ{QhqLr5JNL7LlY}wlgaD(4UxI8_;>J{8YCwr8CaO;rllqsZeA~7#l&u5 zXl7^vRQ*9n8phr%B%H(O=M%j=we`OXJbr2 J#pL}W(g1D^Cv5-# delta 151 zcmcbmc}sJ{QhqM;5JOWd6H6--IorX;4A8Csg^rlq8sY+f&5#l&uI zXlh~!RQ*9n8phr%B%H(O=;UNzV&-OUYHVTR=H%pN;%IE)WMblEY3^uX=;Uf)XJbr2 J#pL}W(g2nyC+z?L diff --git a/documentation/latex/classSOR.pdf b/documentation/latex/classSOR.pdf index cab2ef5315e6baea89cc5545a64ebcb072005df1..d3259877959b82f22dfbaeb74ec8e76065e84f25 100644 GIT binary patch delta 148 zcmeyW@>OMn123mVh@qL4p^268WKUirBwh>ePF_=kOMn123m}h@q*KiKUgvWKUirBwh>ePTs^+6Vo&cLsQ+flvI<=UVK(eZ03fh zCYC0Xy98vQ%*|^Aau}UljSXDPoK4LvoDAKZT@8)gEX^&=%q@(ZU0hww98FE_YzV2C I93>Px%ok>JNRCr$PoIzHEFbqK9M9xZYdM4+J2vNnk_}Dgy#>0tiBNKwyUef>0h1KoDvG0(k`JAbH%lsuKbT(n+FOW*z|q z$>YXVoe)3}=S1H=zM~QR+&`V8N|2Zw&lA63+l3%DiRNQp8;+@25F|y& z;P-S81Bgyjs05i~WQ(QG6oTlP)pCW2AnV2SxQ*IND1y{d?)o^yf=CbHa|j6Xng|5Z z7iKM2%nvh?|F=OS2i;^lwU&}_Krg2cf)rwnAca61-zF)Dw0p3vN@vDG61qp4v*n0C zLBfQ~BA1G>b**K9t<7~r667df4KIRN-ky#UrCR4hteFcm$!| zu1etFt0vk`f*@B-J#kA2WD6n@BLuMSAROc+sbNeF1d0o?T(m~A8ekDae*_SuznrsT z1%ad>>%a0j+anI?ii|L{DgvhovJ?qHs>(URC4BB7h)PB$=m40u`WT>%$b+UrVfu{C6qezZ2-PFyM%Z$=;d96V|`qnf`13Z)4pppEv28e$vXo z^j~NO=c6=*4So#@dF)K)90EtaIy5M}V_^EtaYNzvj>=amEF49X7VSM-%fhj#fA(@e zrv`0P~jADoly0n`iX*P zt^afv=_M2XDi=*yvSGz)jV6&oc|~^5u2V`Lwi!)VjO8b0H1{mnQFzS5GG}7bp_~a( zCs0#7@^gdaGBM>_57S*>{4~HRZ`U6DFFNpOaGTd>a@sgExr#_r?CG zCoA5cW?PxQ@AYpEOD5Nw3X(6r=Lr=(soLaN^rn9DUv=A<18z2sRo|0$889}ra0}d@ z%|I_+W77^tj$E`u(_KwO|o*V*8 zV!oVy{rf1Vo&CL2mpj!xUh>5VKYs7wqB*t1LWUzKp}t?{`A3f+jV^`C7tv1?Johax zUc@Vu^1nkyg;VUSc9(+UJ8huw3Z14Wj>0PEYg`xcZfbheYaDhev73c!v*V@-oRgmJ zH9E@{>G}CkBnzj*J&CyeI*v>e%DWU!_$6=(F-UhPcra|@6>8WM%;H$al-Yv0*Dr_8&dfsOHi4^^}Tqit1VE^tBU?eB%&HYfeeD{}tFR^K)O$ z1e?#k_uWqfYMf$w>9D_i@`T0LC-YuP{y+JR{mZ9Jc}Ij(%IueE3oCf+Wcaw5Q(!Rg belRJ1V5{QX@XH050vJ49{an^LB{Ts5W3|}y literal 0 HcmV?d00001 diff --git a/input/bitmap/drop/dropWide_HighResolution.png b/input/bitmap/drop/dropWide_HighResolution.png new file mode 100644 index 0000000000000000000000000000000000000000..766b1e39b0e615743a263c95556947739155ba18 GIT binary patch literal 6156 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 literal 0 HcmV?d00001 diff --git a/input/bitmap/waterTab.png b/input/bitmap/waterTab.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0cf5d36f79b171f0bd792d2f27608d2301f836 GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-#^NA%Cx&(BWL^R}uRL8GLo%G- zPQS?4tRTR$^Z)-0DLJ28Y^Mdz7G3(fb@sf?%qs%3*QPdW|6@~8s{3_HsU#ysdP2D@ zdx#jf{CBg>?m^8{f_5zrTmMzpVc&PJZBMWEsiZvFsPIH`=E+kl1(}Lcj2P}RU1|tB ze1~n5)G>wh>Wr&GhmYsKKUV!dv7aTgATmKu((uF?XRfsN`^t;|dv4y67WddV|Ho-J zw__purCqL?%uQC_q8WP5EyVY-rJ2+0pr<)x2)<)2=6jc|x^Axq(ANx}u6{1-oD!M< Dt=xNq literal 0 HcmV?d00001 diff --git a/input/settings_drop.txt b/input/settings_drop.txt index b34d032c..9feb0870 100644 --- a/input/settings_drop.txt +++ b/input/settings_drop.txt @@ -50,7 +50,7 @@ obstacleDimensionY = 0.5 createDomainfromBitmap = true # pathToBitmap = ../input/bitmap/drop3.png -pathToBitmap = ../input/bitmap/dropWater.png +pathToBitmap = ../input/bitmap/drop/dropTheComet.png # Discretization parameters nCellsX = 20 # number of cells in x and y direction diff --git a/input/settings_tap.txt b/input/settings_tap.txt index 37e1d95e..a60cda40 100644 --- a/input/settings_tap.txt +++ b/input/settings_tap.txt @@ -5,7 +5,7 @@ physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 endTime = 10.0 # duration of the simulation -re = 100 # Reynolds number +re = 1000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity gY = -0.5 @@ -32,10 +32,10 @@ NoSlipVelLeftY = 0 # Pressure BoundaryConditions -PressureTop = 0 +PressureTop = 0.0 PressureRight = 0.0 -PressureBottom = 0 -PressureLeft = 100.0 +PressureBottom = 0.0 +PressureLeft = 0.0 # Create Rectangular object in domain @@ -49,7 +49,7 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap createDomainfromBitmap = true -pathToBitmap = /home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Bitmap/drop3.png +pathToBitmap = ../input/bitmap/waterTab.png # Discretization parameters nCellsX = 20 # number of cells in x and y direction diff --git a/mask.png b/media/mask.png similarity index 100% rename from mask.png rename to media/mask.png From d44244df236a1d2b18a607aa0efbbbe8a51a68ca Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Thu, 8 Feb 2024 23:22:12 +0100 Subject: [PATCH 65/67] Update README and Doku --- README.md | 32 +++++++++- build.sh | 24 ++++++-- input/bitmap/doubleDam/doubleDam.txt | 2 +- input/bitmap/doubleDam/doubleDamLeft.txt | 2 +- input/bitmap/doubleDam/doubleDamRight.txt | 2 +- input/bitmap/doubleDam/doubleDamTop.txt | 2 +- input/bitmap/faucetModified.png | Bin 0 -> 428 bytes input/bitmap/maze.png | Bin 0 -> 2182 bytes input/bitmap/maze2.png | Bin 0 -> 1464 bytes input/bitmap/maze3.png | Bin 0 -> 486 bytes input/bitmap/wineTab.png | Bin 0 -> 391 bytes input/settings_aerodynamic_obstacle.txt | 4 +- input/settings_cavity_with_a_step.txt | 4 +- input/settings_damBreak.txt | 2 +- input/settings_debug.txt | 2 +- input/settings_debug_joni.txt | 12 ++-- input/settings_drop.txt | 6 +- ...ettings_tap.txt => settings_water_tap.txt} | 16 +++-- media/CavityStep.png | Bin 0 -> 415541 bytes media/CavityStep_Streamtraces.png | Bin 0 -> 247353 bytes media/Example_QuadLidDrivenCavity.png | Bin 0 -> 342052 bytes src/boundary/boundary.cpp | 7 +-- src/boundary/mask.cpp | 2 - src/boundary/mask.h | 2 - src/computation.cpp | 27 ++++---- src/settings_parser/settings.cpp | 19 +++++- src/settings_parser/settings.h | 15 +++-- src/surface/fluid_tracer.cpp | 58 +++++------------- src/surface/fluid_tracer.h | 44 ++++++++++--- 29 files changed, 170 insertions(+), 114 deletions(-) create mode 100644 input/bitmap/faucetModified.png create mode 100644 input/bitmap/maze.png create mode 100644 input/bitmap/maze2.png create mode 100644 input/bitmap/maze3.png create mode 100644 input/bitmap/wineTab.png rename input/{settings_tap.txt => settings_water_tap.txt} (83%) create mode 100644 media/CavityStep.png create mode 100644 media/CavityStep_Streamtraces.png create mode 100644 media/Example_QuadLidDrivenCavity.png diff --git a/README.md b/README.md index 9cdd820c..91bc50d1 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ We recommend to run the simulation using the provided bash script `build.sh`. In For the user there is the settings.txt file that can be adjusted to fit the specific simulation needs. -### General geometry of the simulation domain: +### General * `physicalSizeX` and `physicalSizeY`: The domain size in meters. *If* bitmap has other ratio, will rescale `physicalSizeY` automatically. * `endTime`: The endtime of the simulation in seconds. @@ -64,6 +64,7 @@ In the following you can specify wheter you want to load your domain from a bitm * `alpha`: Factor for donor-cell scheme between 0 and 1. 0 is equivalent to central differences * `epsilon`: Tolerance of the 2-norm residual * `maximumNumberOfIterations`: Maximum number of iterations of the pressure solver +* `printInterval` the time which shall pass between output vtk files ### Open surfaces @@ -92,7 +93,7 @@ example files that you can simulate. ## Display simulation results in ParaView You can display your simulation results using ParaView. The necessary vtk files -will be written to the build/out folder during simulation. +will be written to the `build/out` folder during simulation. When the files are loaded into paraview you should apply a threshold to the mask field to make obstacle visible in paraview (see image). Then use the threshold field to perform further visualizations. @@ -101,6 +102,33 @@ field to make obstacle visible in paraview (see image). Then use the threshold f +## Results + +### Quadrupel Lid-Driven Cavity + +As an example, that there is no interaction through obstacles we implemented a somewhat circular Lid-Driven-Cavity. The settings and bitmap are provided in the `input` folder, [here](input/settings_quadruple_cavity.txt). + + +![Example_QuadLidDrivenCavity](media/Example_QuadLidDrivenCavity.png) + +### Cavity with a step + +Again the settings are provided [here](input/settings_cavity_with_a_step.txt) + +![Cavity Step](media/CavityStep.png) + +### Aerodynamic +With pressure Boundary Condition and a bitmap an aerodynamic shape can be simulated. The settings can be found [here](input/settings_aerodynamic_obstacle.txt). + + + +### Water drop + + +### Dam break + + + ## Contributors * Lukas Harsch - [LHRaceIng](https://github.com/LHRaceIng) diff --git a/build.sh b/build.sh index 59c76571..fd645e09 100755 --- a/build.sh +++ b/build.sh @@ -19,18 +19,30 @@ make install -j4 # ./numsim ../input/settings.txt -# ./numsim ../input/settings_aerodynamic_obstacle.txt +./numsim ../input/settings_aerodynamic_obstacle.txt # ./numsim ../input/settings_damBreak.txt -./numsim ../input/settings_drop.txt +# ./numsim ../input/settings_drop.txt +# ./numsim ../input/settings_quadruple_cavity.txt +# ./numsim ../input/settings_lid_driven_cavity_with_a_step.txt + +# ./numsim ../input/settings_debug_joni.txt # maze +# ./numsim ../input/settings_water_tap.txt ###################### ## DEBUG -> DELETE ## ###################### dir="/home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Simulations/data" -newdir="dropTheComet" -rm -rf $dir/$newdir -mkdir $dir/$newdir -cp -r out $dir/$newdir/ + +# rm -rf $dir/damBreak/slow +# mkdir $dir/damBreak/slow +# cp -r out $dir/damBreak/slow + + +# ./numsim ../input/settings_drop.txt +# newdir="dropTheCometHard" +# rm -rf $dir/$newdir +# mkdir $dir/$newdir +# cp -r out $dir/$newdir/ diff --git a/input/bitmap/doubleDam/doubleDam.txt b/input/bitmap/doubleDam/doubleDam.txt index 7b96eaf5..0a297f6e 100644 --- a/input/bitmap/doubleDam/doubleDam.txt +++ b/input/bitmap/doubleDam/doubleDam.txt @@ -69,5 +69,5 @@ maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver # Particle Tracker useFluidTracer = true particlePerCell = 100 -fluidTracerMethod = single +fluidTracerMethod = fixed diff --git a/input/bitmap/doubleDam/doubleDamLeft.txt b/input/bitmap/doubleDam/doubleDamLeft.txt index 2ad5c157..4be3431b 100644 --- a/input/bitmap/doubleDam/doubleDamLeft.txt +++ b/input/bitmap/doubleDam/doubleDamLeft.txt @@ -69,5 +69,5 @@ maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver # Particle Tracker useFluidTracer = true particlePerCell = 100 -fluidTracerMethod = single +fluidTracerMethod = fixed diff --git a/input/bitmap/doubleDam/doubleDamRight.txt b/input/bitmap/doubleDam/doubleDamRight.txt index 920b7f62..859f68e8 100644 --- a/input/bitmap/doubleDam/doubleDamRight.txt +++ b/input/bitmap/doubleDam/doubleDamRight.txt @@ -69,5 +69,5 @@ maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver # Particle Tracker useFluidTracer = true particlePerCell = 100 -fluidTracerMethod = single +fluidTracerMethod = fixed diff --git a/input/bitmap/doubleDam/doubleDamTop.txt b/input/bitmap/doubleDam/doubleDamTop.txt index a4303104..5d1c950b 100644 --- a/input/bitmap/doubleDam/doubleDamTop.txt +++ b/input/bitmap/doubleDam/doubleDamTop.txt @@ -69,5 +69,5 @@ maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver # Particle Tracker useFluidTracer = true particlePerCell = 100 -fluidTracerMethod = single +fluidTracerMethod = fixed diff --git a/input/bitmap/faucetModified.png b/input/bitmap/faucetModified.png new file mode 100644 index 0000000000000000000000000000000000000000..7301569966b0f33c29671d9a0e2d1d8207371c7b GIT binary patch literal 428 zcmV;d0aN~oP)^sqO)C%c5GA4gvh8Pi{O?%1r}YTEINmds%Eng{J^6D9XD{EGxaM za0~F#*D7>3V5`ssZnbjU-Rdt)L3ae%^sPW%{du&T{V-k3f zvp%<>!hnd=(wiVMhXIaK4Z$2%g)7~dIm{de*r;|0?Pn93`y@YdM;-BKCbDfi8u$fC W8J%27#3;Q00000<@VdE^-vJ>#uXxsPGwrMy!ahj}z(hM1aAl$7^K(kYr0F-DnjhR5}C zj7Z@|jF*E%ONT;6DYwYW?UdIfB`>!Kot)?Xb?;s4u65VCf9(C+d#}BJ-?e|A?_O(* z_H)@PO4>>Q0I0ZdmoYHawGZo)zxZ8A-9cp zPrXr(vqZVEwhx4b%L%QDMCc)(0id}A=p$uBwYF1IZUDk1E`O_UVgu-6Bk!dU5LlD* zY?mNJuCuc|4`yHnXz!#>;_6IH=1O_jfUVB@q2ih6w~V(E!q6Abo2Od8A@ihkBtGKE ztS{>@81}=X_@_TpCU}2UZ;`FNT8_W`-F|dfIng*UnvF>teR{J2!8!Nqzn0rM7lNY%Lb+tEvTBEkLaKHgZ5_ICt`Br3#s7VaAYaY8{9S1yg)@E%Zifs> zk>G)d&ET>cw8zx8fY@n7gGi?4ypA-?6`LmVTcWhCy~bkTcG!v(33&vWfEUOD-3?N= zjKC~)Az_15M(yO#IF!lyj1)kiuasK+NS%T4Cw(m_1kgo8i!IrffXsI{1yG65UktaW zY3~EjG3nV3CJ5{Eytmj~2L$a_@5CYq;S|;E3b!YKqR?lW>J$dX^gq+bCqimH`6dR` z1Vr?3tZW`Xbba?BHzt6pC3o<~@xs`jt;+ph!b`7a7U%5EE(f<~nqIu9952beR-?k(;>vOgjch%wo8<0_y&Ks095ou%ed(mA+_!D z>9=rrcJ53p_{-Z1%aKsgn|gI$VQ~wh#lJ z_<|1PWTdHfqFx1>Q+TC3%bP6sRIbPi$gl0v$@@Z?DUpn+*R99|iwXDRfNrljl-dAQdXoBfg z6pR8zH!ks2n7cs!{xn2!Zu{P1{l=AnTRGj-MJEh;e5@)FdeFMw>?(2<7|zxcs1J^u zqD;X2EU4gE)_OfVV>ae;DaD*zK4^)XTZ1BY|LRXarGN_Cy21|l`C$-+?^t$n?{3sS znIXJKZT|h#M6vg@mOx|Ai__&Q^vF0x6l`-bzUTEP6uvq2d0o917Xw0ki|_{!reRxI zg>#4w@wCQ0EO~hAWi-y=*-v6;oC9yL{vH=V`=z|+xP`5it{oh}IoMelYvcBJ_V1mx zBY-}k&MZBggJHzsqd5Ez-DM}3Bj3Lbn>8;!xqEE0J5U*~KUa+Cg+SKS_IF-T1bN~1 zg^Ami+Mnn3kDJON6QTr~Z&FJ7|!lrUJa4^5j`Wh;gu7KSZEgKb&rRVrI?iH zEc|*Yhv9-cKV>VmzYfj1viNR?f>fmMN(J*=#_!ocwOw!aBEli%_S?#6bL*SJ;W3}J ztN11CP2l#-Pgm~`zfOcFiWqNvwb1&75$gaDW^RYmidn$_ImIG7rOVt`*~6v`cwDqa zAwGEUQDt7l&ap4e^6YN7U4L?I=ca$HCL;#9(YBiu(vaD@*x=GuF+C;oh}fTgC%mDO zY6V)PE)7UD+G4_AMjT;u-lc|=iLB#Au^lxp=Z!4KRmZGt{$2BDw#*|7 z`q9;#cRyfo`m2WYjN+L*?T(s)!#1xDW^5AVc0AGRH*y7c({juFEFz*WiMtzC2rEqredtd*ijq|FOnr~N% zcwdbjbqDBmx8)BN(TIib4Ntm(bD2RoT`lIzra8S)#u0S7veF*-!O5J?fjYyQQM@o) z>qs}vK`shx_7@3^y$3iMxSAK?!|ZsZ}ih+y_`(n{f3HTxONials!7 CJ*&w8 literal 0 HcmV?d00001 diff --git a/input/bitmap/maze2.png b/input/bitmap/maze2.png new file mode 100644 index 0000000000000000000000000000000000000000..2424337cd967256d5ed800cf70c5e29fa57ba17b GIT binary patch literal 1464 zcmcK4ZB$YR90qXiJ-5858JE)3F#{A&ruep5)+q;wl4&oRp>ZaXFG*?|Em>;W#mrI= ztuqv7DRV{JO4O72Rw`-DnhIDh&F0IgEELU`$;z5Cw=es)vk%*c=l^{9|GqwXdv~)| zncJIVFql!Z*;Q8)<8^D8I->RpDbKBg7b|T|Jp3#Uc0j9~f%y(4hk*a3q=I7^M1^-kv?H0X|WGmjLMQuon1{18OE_7V09;O~NAfA@- zg9W)O=GhJ|ZeYf^p(@&4VJ4!uf*JfomCQyb?#{?E4i_4K#Ws$th<4wcpnXRl_?<8W zW&{UDdem|Z*DUn+)AMUW`s-hgLCLNkv>S7b_{W^K7LImMD?82 zP97Bsp18^r)ETA0X%aL{(C4}mFvPq6>;>+;A6jh--6&}a?}Rs4vsz+sHQZNWA3G|- z3C4W-e+rnL)fGyATAr_l+W!8M7g%1l_(z2ald^jAAIE%^y${7`LzYtgKwugJUdmVba+$WCReE_Q!ND$ocY)sqw=hu&As zd8o%pPc3t;`Zmq8Q z?o>wZl@M)l+7De_a<+YKe*>=O>e&8^ zWPY&yRFV|YC8ifE;KLVApKOt!HcBoX(UHYyYz|jAvSuyNIpYmvZ6R=m0%X++QF%X9sdqD!Q6YFGP8$7TVU0!vVKVLw7229cHsu>~rSr%TtUA3fRq5F?iX304CUi_W%F@ literal 0 HcmV?d00001 diff --git a/input/bitmap/maze3.png b/input/bitmap/maze3.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd682edfcb328a285f99c219fcf9a7698543767 GIT binary patch literal 486 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8O8AyIx*uM`*v7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaf@tPl)UP|Nr&PW&(L> zO@FrmDaIskcNc~ZR#^`qhrPtp*OmPR6Nj*_u(7k>4WQ61PZ!6Kh{JEMIr1G+5NJ(I zIk|88jNl4Ry@#4rBGc0RGP~DaTvAx)({=SsbbW0m2T#j`j}4%2bnGU53U?pBgmt#RW;vqW0D@{yxu>d2WF%{cd440bMS1wA&*fVUvS}z z5Bd*yn^SZ|r@wjP3iPFFiEBhjN@7W>RdP`(kYX@0Ff!3KFw!-!2r)FbGB&a@w$L^( pure^1KC$E$iiX_$l+3hBEEPx$K}keGRA@u(no$nKAP7YD{)cwsCT*;X?tn_r(r+q02DDgXN-2c{o>+s#7`s?j zxz7bD<+#+bs={Ngy&BmHB!qAmdmZ^BK+7s`F3;1<7{SV8kHS zV1_^}!3={~foZNI+gtIyjONwT;x*J3&_W=Vg1q zZPr+dXn}AczFjNYA+BtuMwGZ}37_}_`HXa=#-0k&OS_rTcMv2;k-AxxR;+ylh3Q>5a1bDhUhJ(Pd1?Xa(=+kZ l`ga|Q6W|%EnOG5PARis&LVESmuxbDR002ovPDHLkV1mQ)qjLZN literal 0 HcmV?d00001 diff --git a/input/settings_aerodynamic_obstacle.txt b/input/settings_aerodynamic_obstacle.txt index 2e16e908..0a17d347 100644 --- a/input/settings_aerodynamic_obstacle.txt +++ b/input/settings_aerodynamic_obstacle.txt @@ -5,7 +5,7 @@ physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 endTime = 10.0 # duration of the simulation -re = 10000 # Reynolds number +re = 1000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity gY = 0.0 @@ -35,7 +35,7 @@ NoSlipVelLeftY = 0 PressureTop = 0 PressureRight = 0.0 PressureBottom = 0 -PressureLeft = 100.0 +PressureLeft = 10.0 # Create Rectangular object in domain diff --git a/input/settings_cavity_with_a_step.txt b/input/settings_cavity_with_a_step.txt index 8f96fc60..c130ba48 100644 --- a/input/settings_cavity_with_a_step.txt +++ b/input/settings_cavity_with_a_step.txt @@ -48,8 +48,8 @@ obstacleDimensionY = 1.0 # Create domain from PNGBitmap -createDomainfromBitmap = true -pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/double_cavity.png +# createDomainfromBitmap = true +# pathToBitmap = /home/lukas/Documents/SimTech/Semester2/NumSim/Submission4/Bitmaps/double_cavity.png # Discretization parameters nCellsX = 40 # number of cells in x and y direction diff --git a/input/settings_damBreak.txt b/input/settings_damBreak.txt index c915f83d..64a44c99 100644 --- a/input/settings_damBreak.txt +++ b/input/settings_damBreak.txt @@ -5,7 +5,7 @@ physicalSizeX = 4.0 # physical size of the domain physicalSizeY = 4.0 endTime = 10.0 # duration of the simulation -re = 1000 # Reynolds number +re = 100 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity gY = -9.81 diff --git a/input/settings_debug.txt b/input/settings_debug.txt index 5444be80..a7fa5ab3 100644 --- a/input/settings_debug.txt +++ b/input/settings_debug.txt @@ -68,5 +68,5 @@ maximumNumberOfIterations = 1e4 # maximum number of iterations in the solver # Particle Tracker useFluidTracer = false particlePerCell = 100 -fluidTracerMethod = single +fluidTracerMethod = fixed diff --git a/input/settings_debug_joni.txt b/input/settings_debug_joni.txt index 4cc565fb..51396421 100644 --- a/input/settings_debug_joni.txt +++ b/input/settings_debug_joni.txt @@ -2,12 +2,12 @@ # Run ./numsim lid_driven_cavity.txt # Problem description -physicalSizeX = 2.0 # physical size of the domain -physicalSizeY = 2.0 +physicalSizeX = 10.0 # physical size of the domain +physicalSizeY = 10.0 endTime = 10.0 # duration of the simulation re = 100 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity -gY = -0.5 +gY = -10.0 # Boundary Conditions Type @@ -35,7 +35,7 @@ NoSlipVelLeftY = 0 PressureTop = 0 PressureRight = 0.0 PressureBottom = 0 -PressureLeft = 100.0 +PressureLeft = 0.0 # Create Rectangular object in domain @@ -49,7 +49,7 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap createDomainfromBitmap = true -pathToBitmap = ../input/Bitmap/doubleDam/doubleDam.png +pathToBitmap = ../input/bitmap/maze3.png # Discretization parameters nCellsX = 20 # number of cells in x and y direction @@ -69,5 +69,5 @@ maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver # Particle Tracker useFluidTracer = true particlePerCell = 100 -fluidTracerMethod = single +fluidTracerMethod = fixed diff --git a/input/settings_drop.txt b/input/settings_drop.txt index 9feb0870..3e116480 100644 --- a/input/settings_drop.txt +++ b/input/settings_drop.txt @@ -2,12 +2,12 @@ # Run ./numsim lid_driven_cavity.txt # Problem description -physicalSizeX = 2.0 # physical size of the domain +physicalSizeX = 10.0 # physical size of the domain physicalSizeY = 2.0 endTime = 10.0 # duration of the simulation re = 1000 # Reynolds number gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity -gY = -0.5 +gY = -10.0 # Boundary Conditions Type @@ -70,5 +70,5 @@ maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver # Particle Tracker useFluidTracer = true particlePerCell = 200 -fluidTracerMethod = single +fluidTracerMethod = fixed diff --git a/input/settings_tap.txt b/input/settings_water_tap.txt similarity index 83% rename from input/settings_tap.txt rename to input/settings_water_tap.txt index a60cda40..ace7662e 100644 --- a/input/settings_tap.txt +++ b/input/settings_water_tap.txt @@ -6,7 +6,7 @@ physicalSizeX = 2.0 # physical size of the domain physicalSizeY = 2.0 endTime = 10.0 # duration of the simulation re = 1000 # Reynolds number -gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity +gX = 0.01 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity gY = -0.5 @@ -49,7 +49,7 @@ obstacleDimensionY = 0.5 # Create domain from PNGBitmap createDomainfromBitmap = true -pathToBitmap = ../input/bitmap/waterTab.png +pathToBitmap = ../input/bitmap/wineTab.png # Discretization parameters nCellsX = 20 # number of cells in x and y direction @@ -58,7 +58,7 @@ nCellsY = 20 useDonorCell = true # if donor cell discretization should be used, possible values: true false alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences tau = 0.5 # safety factor for time step width -maximumDt = 0.0005 # maximum values for time step width +maximumDt = 0.05 # maximum values for time step width # Solver parameters pressureSolver = SOR # which pressure solver to use, possible values: GaussSeidel SOR CG @@ -68,6 +68,12 @@ maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver # Fluid Tracker useFluidTracer = true -particlePerCell = 100 -fluidTracerMethod = single +particlePerCell = 16 +fluidTracerMethod = fixed +useParticleSource = true +particleSourceX = 0.6 +particleSourceY = 1.2 + + + diff --git a/media/CavityStep.png b/media/CavityStep.png new file mode 100644 index 0000000000000000000000000000000000000000..98d6b9a13be19eaa7e50a97abba236eb17c92358 GIT binary patch literal 415541 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�z?cn;52qlJfUInsh67 z{7Ys+4gXC1&LXvzbcmFe=NCJehQ#Z-o6C3oHz?dC_?glw`80m4nL-yXnEyI~^=P*Z zBBDy8V=Ex~kJBMVX8*5hbf0|UN8pwMN#anS>>ozVQf} z^Tkn!CiiRimRi*M_=?D{+M=8Qn1#` zucf2$ri|d?A2&BDj&$Cg=lkZ2GA}4(1u*jlNZRXj+!(+lq_Z-R2wlo>RSV+2T;=)C z4z6e3nkupa(|pPK`$sPbG~E>_qC~-JS52}nUrU{(Q7$%NwR5}oh*3F%O6$EbWh=f+ z+?0zymq;eP&6*_6J3aF}ha%3K8YbeQ(8GeypKUk*@37JK?3_~i*&?_@Z0XnKdcBK) zf*-Kqb>Ngt$?K~v;-iSX`iT*u;rB(mRQXH2)XlgshS2Y*rNM2EEYAZ?lHLy#W+=}* z|1(UP?rzhB>%^)vVzy{YWI*+fXz+u=R4Fq|Tgd9Y#&1(ytoEXp;i%x02|M@GWfWP+ zZ}P?+XoA_1AsM+8}y=@F5^Wr7{UyKJR#*S%~CBV4Mh3zkL!rZUE+tL#BHA&935H$D zMVh8ZG7+P*V((%j>-TlM@A}4_FCVaK(C1KADu9bQjw^|1(Cvh2Llb5^`b2hU$^{qh zCH$WRc&daUvf19_L<nX!NnBi*)7P$KdKMwzEzuw?fADMYrmkqUjFYivliBMNbZ70=EU0S*4t=$q^*3$Ivk z^_|Dhh=G56npR<+T`-Ulv&L^?Y;L%=ukfmH=GLbk_Llt;LL}YcfY$niG`GE*bl;yn z9L?v6O*Hw5Q9z$$D)554rf+9pWtB?jn!1D98)!EJ*ai_R}6%(wmwzs7)m@I;`RILol=P)N_Z1Nuw_X(s-* zDs*e~dF1yD4Stn-XZw@h-_x?OjZdwtD`YG8=g=>~wl`3iFy7K~r&LFMh?Qt?-nhAq zeOM)z8}*MpTAvzsp;0mb@`AQ$dPwg^`jxN+m%m@kn(6Pkv!zxf+VFhW*yOZ$R30BC zFPk!bUMXT%!$3IFH205;kp2O_5eAyp^eGG_aA(@?vc8eO5?Wk|2elxQAG#W6lL{7$ ziz;5T{A| zPTm}-#5`}Dia%hOT;x32Hp0I*%gLmp?Bh#FgTRgwiKMM1iIIR_PPZFm*48da;4++mMNC$SiliN{05ddv2$S?>iXoE{J^U3?ExZuC>Mt!E7*sW*byd zxgj%o^m~1j?;gc(yw45raCl$frhf8da}3L-X`2F#Zr^qJ+X_C^3r=gQxm&Wv3(&ha@WL1sA&mVY2EHIONA|R zm!dn{zxaQ6#9gnyPB9ISS;Y}i8T;peMt?WrEWsoxI+4-YJXF&#tt^Y$H({CDr)-if zI2EL_5Td)@sVi}nP_8lWOAAIBZ*o9B%cSPX==b?~DpK#U*6v7yC6@8@@kIqbvl;r4 z==oR*?F4ZjN#A|eIA8S794{E$B4Dr7`MGO^ceEvKo?gVf>HYD~0;6l#i=$g_^9w7X-d0*XtcZXKIXmaJ-WS8XA zCNYeW9>VgKnRH9q-YE|*EN*jsHD2EG-MQhK1I}2mvPRqRV92(DWm(?Ji>ZL%fX z>Wz|=&p9LEuMR|g#_q1l6b5DYsM;%VQc!KzQwL%;V1oeParLu3f>Ni@DJ?QavvRhh z0remJIWq=Ljal_}$68s@;9M@saEy`@c3$Uu>zoF5Zik#tBrh?!ohcgKOI+^bSjy5k zz$Dwb2kvi!udHbY8!LA**=&;=^I}`s^ja1s@LDB@!&J3`UKST{5!OSfgZu}`-gyM{c?)Q!-hk^wVGPg&z6?~vfN95 z-iDb@i1t?10t&UOb?ev1qtkYL<$>^?nv6JKN?FK=Aw(sWV)|-gGzpXt%r_;2z7p_T zEIzgE-QT_=jl~>KN)Pm}?fkrIncqI7PmIZ|6`m8-b_I+3slxnY>)2PNayEATR(Ool zq}v1VgK?E7K)%-Sx@;W3hh6Yjo|Y)i10%LPcJKs#ER!-Yrm9I|XMp^p3WZy~x&FCU z=b!gof1VqoogZSdU2-(>>Df^`*1YHTF(TIt(N*Abgv>&Kmzv5`Y(#!vS={SV@eMo zGj{HlM)_?&_EpS7XaAC@u(2DIG|d)!x+ISECiQ|9T}x#BYsTi{)rh4mW~dvU4qDt2 zSiG7Frp5E?n(>8?ku*dARUaCWdwgaRm2|}9cu5A0$P-%do9vmt zzJ6l!mf7?sH~#i-tYQbURbXxLW(%dxa$Iz-Cl4mxr#rX;M~|$pdpwr@CPcGHOs{MV z!Az2ED042|e}d_kYGh(Hv7RMF6T5H8yz|%in}^l`TjjRQ?^aK?=qU+})i*zMv;?ZA zm+B@k0V*$3k+oGj(GC4vE#9XmpZ>Xzp4Fm2rD`8Tak`ouq7U_e3*|0Y-y&G}O0lHg zy^Z-169aUQVJ~Y$Ja?WH9wr~jKTr#MQn)4RE={T4^a)A=A%*KLC1r;As9XXpDO{$3+NhBplDRxiqe-a7Bo6^Sz_ zZP&WI`Q;~eKsProCqvMhbzOYOIE8^mQH`2bN)V75I0pi2!($u^9J$7Pw#l0z8N zj>X{E;@`hha9;){is(JuF%Pv+45aM+rmi-LNaB2ZzVB*wU1qt^0&LppV(lOD#3?e{ zi9I`EDc!ZWz~m^A<%R+YfU&skr+sba#%Ut8Jh!E}o?RocoRzP=7;NTZ*VR5PmX+=v zm*4$Tazi?m*_l8-zG)fvc5^L|xOp(u0{+ksr0lwNk)o;uAH(f63-tKTp4}lpR0deqY{6^Y(s!+(i!g%H~Nt zM(R7FQ;F_5t`BcmYFFPVZ3hOPeSUGZbQ-w)sCN8`^&MtTW$XWD0UoFHwC+}jz4J>z z&eoMK$J;N`o$Y zGlws&ipE!2IWk{vB{1Pz>djkoh<%4=)nKwvo#Dl9g!kND`w1mbmP%d;lm2V#C6ykz z*$0&~_P*g^&}) z4OqTdIgZ7o4+{0JFm)xz6GKs{DzZIKTc&>z+rP4qebpF?)nM~%1t>OBP9BGyRBd03 z{5)(ONA~Bc26fpf8V{}&ZgpPF6BJ+`h~GL%L_?8)FBI3luM%qBP^;2+l2jI?z6z8v zZ9HE=G`4m0p03bEj@t;MrtGv(%y9x6)OI|(EUsbQ<_^;vTd4$kch;|nkgKlwVh8_+ zsjm!bvwgm9DMgA)af%cIw87ootvJEmwYUTd#a+?>L5mi5cXu!Dq*!sM=$q#^^PhP? zCX)~M+}B>aXU{pislFYvUVIA15qYw=8|MkU#A&>H5*76;KU-OMnvCdZIcD3ZgwF-E zowmRK8~`kfG0=Y0)s5`%3dzYwya(jVT?z@^Ht(~SFZLbbGtSS{@!13D_xRJOvqV!m zCE#<5ZyGCwUhY(tu1{lAJC4nZ+dfgaQKoz74Xr8^EJTXE6L03dL;$fJfjhHopBZ{X zBS!iPbZPIm*`x@9xr`{ZsBPYmNxSpu>#|{_N0Zh@=fR z)kGKRs;m6?L+SwF>itg(r$BMlDwbC9JX{tz55njlY`d1aRJ%i_TcJ!gcola-BlV`T z;qLl{hK&+qw7i5@S}g&<)SEm=xa8k9pk?D!k%_KQOy~nmqDMEy{l`igV zb_b{FhKv+@C(8ZMqrbt)zUB8{&&CU~Pd|iMqHGJu(+-|~YZX5DG-B900)CRT_gbDy-<6|WFm;}CwMCk(MMArm9P!*xduFUK9lP}C zA8frXDr{qF_asb>2iZb7?f=7o90^1U0nBwTYy z7|;oHgg5~S5koS`48!j6(JQi-T>78Te!|cRkuJ>s5jSeI%KHz`eO>V&y*AFV9S=SH z5Aoclz#2)kv3tZK>TQSoTi;oTuH^yP9MWw#sJPXH!@XGVAQfzePHl*EBBNGd zR2=wDv&AR#NgiAt$w8>Fz!YUS&qWc>zx0AX>ibe3-`UX`s$XgJV8WMM8~C-s^Y{ka zM_cO@&ZZ|V-S#>fd4tyIebBfEPG#CwlShX38#dA#nX9SF`=|3-)x9y|-z;A~vC%I@Sr!3o+{Za2fYd=<%No@$`4k=EV zb`K4bw%ERLW^l-WN$#r>dBjez?+fv9x);Y?TdjVo%}))>V~_(y#;;Gm`D?#0Tuc7P z$7jcG0~EdYcC7%@gZq0s zb@e~|wkNNmKNlmYjPPjHZ}~Hf7Y@an1TeAW4`I!VZPGSK#ddwOAhBLMTofAHRX%-D zaQSmDayCtsJ&S@?k5n;!kre@EFX!t*TQZe3Nm3#Z*{oRulo@! z+ETwyZRFRAFhS6Z+JCSA{h~@Tmplp9O~jiZ(R*0#kZXJC`0Fg%AAMEs`B|FHVYAws zHZwGlD9CW^tXp)e&pn=GjE0H%G+TcnxX1`lgpsv~gEUYZcN47ex^1Wez56WOV=M#j zWrA@^Vg_f&5TxSfZ}X%o{M+xz;bq5tQ{1N0@qv?N4gQrjt9?(9y`x)N0#V?laQ6 z9I`w!rVi{q`urKi5)fI-W6f#16V@C5XvK6Sdf;}LM>)^4#%p)W#oWIfCV89hyEc%g zzxq&fxeP|`HZwiN@x=)2Fzb(U)0ScRFT4JC>_Bl|;R{U$t7=Ox3Yq=FXKe-wHSdT6 zU#Vv^HFLj-rO3(Bb1a3F{jdNlaijWgSvq~d1=@EFQ(PEwq}N$9%S~YI<67Z(Z;s}= zcb+4;M5>KOgH&x@?!fKg#}p$F8e~~w#Np?g3{%)2P{Wk}+Z>=@Q>%fDx?@~;^F zhO%H7(3zi*R>Ed|WHcbvOD$%DRJ1!I>T{=}FHoCrvFP&+?#S_>jXF}cX}yTE(Uokx7PD)8x^e%$ zY*VA9$I&+>LikPTZVtHsb!0Abr>K7(2K8w$=w}MYU*W;iA{$r^qY(9=X9dd*a6yXK z4OkQkptHp%kY#^@(ve&((wdzS z*}+Sn`dFos_xXPfZMf|7pQ6sk%9nQD^F0M;_W*ojD7{Mi>s(y{9UUnD2;*=Puc-Za z%}2Xf!zhEip*>ZORo_fn)`|I^P5RgyfNN@!C8g3J?PST*d!P3`83S`vXZQCgo@<3e z@1lgh&-8yiswHjHYYlbMWXN_7cKT}_|Hh=5CG0pC-Oco{V8JFAlMOTee3QS0iSfcs zZF~L@Eivo(R%`o?9$FhImJ2bsYgxG#i1;KFkeEj+mPKhsMha?Jlp84KPHfTBlXtW8 zfH)=hp+fqPz;XpN1u{@(B7Jq`vv5?o<|gK;D!RON&it~>;{u>U5@X3H?*_9)ux|sl zNehx;BOa3bEcMl!{4!?u4{ew~(Sa*4zcnsplLbtO(-i+*F!0>9E#4ZrV1_=wOn?a>YY45xsjaGFgiolUvuZS)AU= znFGsY>hjwzL%)a<0qD|3mVF0>bdwbw@$=g0^D^X2h=LN~Vt^mcPR|4j(JPHS_F;UR zw@xr()_RW#WrE@V)>pP0Cqt6&yo`z5pm}GID<52eu*_%`XcZ$g5e%A`+QEu??&Wm- z-}+dP3iczgJO$1u8h+4l*I)q5fzo^GlS>?iUwe9|QlA=Z6Lk-~W!HG79` zoLkasBmB463X?wn&WsVH!q!}+DG5t^uQg_CJgMg`+8~Q8YruHbLkt%-&4&2wvh_o0 zrDB8AYEHGb_3<)_QC`?F4AajTA0-|ShCp-7=lQDU#{w-C=1WA^o^M9kUv)Qi%I=+s zw5&@hgxbQIxKRh~^OOjROEA84+hjivn^QQqwy@D5)6+|!K}u@=DUJ5I12bUJ8nsjT zU3DI-VUq0#rp4!vPf*2Y9_N!U_H)BCS7qZ*qEX&vcq$*h9`8~{Az^CNG_P3w&USpb z8pKXtncE0CV-8uJM~Mk%sO;QA)WhAo?7ZHC)Swq|rm7;>s7Mo1vhNdVq#1+e>JkW@PB&~7UuOcm~sr+H@3#8Fv&S8Zl3?#)*pdh;c)K68jEvjHbC z`P_u6m`L#JyDb*SLu3;74`!`eD_K)AjB|ji_}8KE<}1PYsn|<4Z)F9gQW>K7gb`}Y zp38Te`qUv^p3F7*7#XLkHb|qh?93_8!!(Br&rz-~f?VTmE)J1SXmPjCAv2A`v&g-| zldljy(zV_P#^&a#wc7a-_P@e;^Q+P}D2U^i&9bVxqYo(h4dZ^?`Vb)6e-1=*nXejWLP4 z@r)paHuU)$Tzi)qYHq%a@_d$H!dL$&+k0)4UA~~}oa-LjKKRn}M>+B?@tWjv+aRGwNwQ>YQBgohgI2uZWGd-`h72Ob5lMWP7ElI?aZs5@AGto zoVXtEPWs$z8ZY_X**n|{94?5^tGeYw=+q<#!>-~^*^fjjBv#6qRc=~1<4ef}K+l-H zWm|L3>h>q<_D8rVYCmWg>q_SI2naPAH*y)7qJndWNIbKXtogf}zKc~=Kkzpk=IU#_ zVN?T0a`D=i8QLdHk#@6DlVmn7wqiw_-1UxmFif*NOt!2xwJNt89@{R~lHyqD{}Bw| zaCzEQJ@8mB^LQSpCjn)c=qH^e$-xj{uT1wGZbg5;PGhM?{Ua2R65T>OIi*}*=UX4a zb*|Q;w@3!FCRJ!GZv2Xpsj!%7)&JfHQ$i`8TMi!Ldr7=^OD>xlr&#Vmsc?o$nM<9~ z>f8!V^fVT&a!zgS>u&b_bU{%dh>3#3?hs9v;dl;=LRvc;sznZ=R<@GX%GzTz9IV?> zpY~eDO9Nc~=;H#5XD#WTSaHiY(?#g=^5B^@<4NF4Q$xwSQ$5pZjoUh>a8llhd;_){ zI0~$1V#Lq>s-cF9REe`?nWPd|yn1&A8~=pi@)!Xu)gX$dlxNMu_k2e~ColB*4&hLi z#|Y%>D?j~0ltaFEjwJ!njhm>tMec120w}`BsR&dj0!5#@WQTpKy+$mA`fC1W90kVO zc7%5goI^LB4LSbC1_{6j`C`!lCP12r3ht&aAkV8Bf+SD}}8b`4+UGcWJ5 zZiOU!IW~j5JQNU9$gl!~)bXsOs?2euS@RdJ0VpOX>)-aW=NSbpTns%ma_YlkkQ5Yv z5Ae{#r@WH6)4A(h+^cx=`@tWzd6r)zNI_*A{M`}!^ zRaSijklFj$C3}Tx!S#^Y)0x-jA0vFgDO+M?`#Bpa4!iM;%$Y^Vix;I1_93~7E+*hx z+t2r(pHXEsKHpCK$L{5xMgdE*{`iD(P(Vr&ZKCyGhp&Zm%~y8%0E|FMQj%>09vONA zY+1rIO35U}tRmH{qeiX_t*UrMXk8RpAT3Zn73_ z6sBZC(AEQ0nC`vizx|Li$VP0MJP@hz4dx|^%32}v<2pvZUf{90JuGb2W$MSa_bIv3 zrNApF7+#(|cq`7U`M!|ZR7k+|x1aXTi;w75?wgbD*+5h99;X-^pAUz}Q097gak8a( zR1biJl7rNPDSCGaGY3F#zra)Y^OE0|f^%P}V5lU@#@?Qirv5<5B1%*UurCxGpk=wb zxb{n8+#^$Hk}(=7kd6APloh%wL*C1k$mxp1G)-r*YTPeu@OD-&<40-%=@MI>pEu50 zTiD?rS1F0s#%E{t z;^ocbC&!ab|F#6Ce+`uD+poUNzIlb6_40wqYuN3U`xYhe&NCWE)W}*#FlW{%qv(LY8F^hAZ%Fg0o_1&5$@ySKJzi_ULs+}(Oso*%rHlOdjv(K~Qxta$UY0EvF zgy$oGyz16n1PT$4n0brPLL$TH&R-RjyvsipK+a=t>4;tUn%E-wvcGb0dh<2pRii0& zh{+;l4taFm=Kwi(Nz>+c${I2Ee#pHUjJ`1y&fC6w{{o%HB@Uvxdq4Qa2ZYWTw%w~T zDPpbtt`-i(jd~vTIud^Ns5eUIRJuIDD`LXVZh z{hqY!_oCkGnC`4MZx8k;Tp9j&`=bM>EKi#q8Tf67i&#LL$R|h>1s1~+%gNVYCxTc} zl`pRZ8he@cXk%^(zx`FY)^}=MN%26Vpwnksb*4M|j9dIUWUBOwkLjzulF2DAz9q!P z-*p7^`b;NVOXllQXk%-QT9OU+nSMJSe@Clas_aaV3}9DjSGkMY|6KFQ*umDGVG}1? zHII!5oyBokp zjREwd9N~r-)pQ*Z4i(osDSZ^FxS5V)Abo-d=C1$BG+g9+@83OC#Q3glmql2I{tDay?GzMa(&(dN-&0|sC~mroXI1W)3F<-qMCCfV^r|^x%o(2P@!Ya z6@kGiC#K?{yN6V<>(vFuCQG+XJY7Jr>ADOrePLcEf9OqI=hjZI@lQasHi0cq9hfoF`^CS0422bN5 zzOdtUwWl&$7Lex82a;Pbg^0&bQ6(`rLq+$!u?x+||Dc9-sNSC0V_qUYnfhTXEF^~I z0>54WKT^ml$>_8;UF}7{l`ikHuyL0cyvLc9ib8D{Y#n|h?qaZ7j3(J}xra>q){hVq ze8au&l<(jXV)>iehP@z#2ZqYsfmaGS;{)d!O$-lA%Z zO9th7PlCWRq|wVWVuRoH6a=%LkqrDkdKu%-uc_(6d@z_YLvIZsuaibqXHYXwe{naG z-hMFmIdpRaKPCHl$1-0ytQUNo#0W`X{D>feF)H*fd0gvOwOEvI&dC}hdUu#JV81~o zF}`6t4vBqCRd+IKP2nq#m`y_FW1e1nyO3Sn%LlGszSpp0stQQ z+RQ$7nBe=0(85Q{b~azkBm-UK8`lkb*lQ%LRwGFQ6avvy?M9k3IvYK?+f5AM;rvC> zCk4A>0eM2sllYC|&Ds30gH&Jcwoeh=c}bcm(+>3)R5S!PA4T?5|m z`Fcv1q0+-ds7LbQ>C49kI9~Wi-$9&Tji+CBV{5O+*Rsw1m}}^)r@%)juHzb}}Teqb+O#sgv{}{`)g7x`C*m!re=qs(dpu;E3z&kYMR+;v8mG)}!B#W2_ zRZ4niL-wpj6$*NajyuY;*YM}gFG=t@k#0{0zI8HKA%QGj@46QM_`&ZML$J4@iu8q4wL^S>Z4GB4YhAm25`VC}SH3LjY_O0Y?jDv|NilkZI{ z8y4oQSek$WQ$7pRC=$)5H|4-lv@lg0C;x~8&3InY_yek}^!Bn-Cz_BhDolB}d-2L? zD*#4!*DFf}2plug(hEa7?sLnpmIyal^fj5+mqWr}yEhLjsNDrginX ztDCA15tEO)%3bo-J@xj2e~hUNc9<%3&xywm$Bq!?Fy0JN4&|Ej8_bt@r!0a@o29zT z(7uEz6ZXa2P;dk60=7#vvsSO!vyzc2AV88K#`NKzrZe0(VU8<)0)Mt@o_#TZP&Br9_D+$08zev+cc>jbzvpjk;YvV&-(6ntTvg;UJMHIQ!VY z^YC86q#66?i-NQo1cBa#%9q)hRVD4P2?DzH9Go6dkx1GQ4I33cw6|8HATCU_+5Zfec_ROcs>1&Kj&#)d_Z#gYPo1xm& zlkWD~FaI>Ei_rV49w=-k(YR+hT+_Mp3)w#$fBd1GWRX7{@~nn4TFpj*rOYVPo`T#v zdwXL0P!PHE7lIa-^&)sCl0043>d;<(274JgUvH%7kaJy~tU9^`whq9=69c=>*Lkn7 zIeV%lc;AEcc2Iql#q+Kgln@xDN|KGSbk9#{0gf9%CnFN9E(0-fylnXpI(&4OJ;3&xHe_^VOw>UJ^-v|N*(CQ$B|O$4l{=Fen-RoNr08= zg?GLJ{0*)(ccG`x&NpmTyS$M={l(#!iv$zNuHKoCe>G?NnY4vw3ah#Vq67~4C}?8;0*zZVQ-)-p-Eb;{GI zYeI8bC%?Ma;v1_?r8#1}H}N~Xdjh+UrgKK%Nl^b#CX7jmkdV%jMoUxgqxbPV;rNjs zZwm_KEhiKRf$ONgQ@|`0PqencSmji$J|Y8ggv}sZ@#;d6lrIxz#3GjJxxgrOQ?X<; z(QA_2%IeV3w<_h=BGQQ;LprCxoRhb&)7ABX^WO@Zql@;#9t74ROv{#7lpUbCLRPDj)omUQUWe+_);{=5d!qNA;}#qOum9?1g;h`l zySf1Oxs-FzQ4#UWq5de2%0#Q6BCQ{3tJosDVVWwadvmgCp0Uj%bU(Q9ll)X9Q0`M~ zjnWWj_wag(T)7XFW^vi>BO^kcQa5f@%<9iL0($`7*)tO;&rbHO_m5D0)2MZ^`+z1L z*=4^E|NYl-rp{!_2gx!zT4KWS6GfvmG#}GfmFaT#v&4kNEG7biXZ`uo z%XYFoC;D>;Lr>okI7*8xd6WGd7D=_`oo(JqrJAinFnFCBBYPzJz#K#c$5Gj!|8TgV z&*${rhGT2#$(Zx}Bf$L00o)K(ZZ7y^Xs*s~qhVIYCdr%QKMxrDxjDt@F0;3 zlErpH{9CW}u2)i`Q?=cPyx@=|Op4nuA;FTyhfJq3(K=6_AMX9gG97}!MRc1Z!JIN@{W3z%@ueO6>>2%kA93b z10&U1;&74HruM7^At#&l2&8a1S3wt5Wst(gC)T*?v+#wcq?tw;?;iu_tsx*!| z`|h};c>C9TAus#Y@O} zuW;$6Q}qr3-Di(rCjt8269P>8=0(ANs=FVcXvPwLnU^(^5VY5Y1=E5p;ijwK)MZO9 zOKe{55L0^kTnkS4gLqHyhyDATG{z%})xo-TxK=f4!X6j^CrWk=`Hi}`4zL7q@cAIP zXm&myi9gv!)0w>3e<=fGU9_idC&~&A@E#`PT-qnAk8oW6(tA1*D9c6B77cy%9TeVX z>-j2zEXMoZC@;t~%>vZ(JS(bBbjXQ>VZ!k*iWmo(SM<(!pVD)8o;7d2f*|H5Ev96F zN3k{yKG<929v|=0emPmF^YA!>z*fAaM^;PdgRI%K9vFjZ;~(AIRnzX`&%(o{2(q82 zZEteAyJu6Hlq07IA;CapAJ3QUGdoe#1|~(crxHr9DKN67yjniOrzsrH`uq*x-nMLg z6>t5p^)!9T#FRLarOiaF;p`_zkNy;4bAi}9i3KMLb6uy+>}QK2#^_jEAwLoZt^Y;P zI|`YByRvzzh>bZ3_j`e(s9uMP(i?~+Ir{_LAq_Q|#?{-O%9aIn{%3sn{1vq60UdDL z{V1K405Es(BCw?6l%bGLOe&&j0reJJ#|YF8#-XaRWva?2qf1O=PgxHmueo#+g#-l3 z_{XBgvuCQh{?*T)evI_Uva|^k$CqX_{HSOhst?t^btJ-#BkpHW`qC18&=&&l-?o_o zi@ zv>9>=HK^Ixj(0fy-5z)_F%{WKsoco0&cSRzf>HMU59@=eErDdaKKezth%SBe&yEhs zuHW2;LgvgO&0uGC^@cBDVaI=Mma!SaH~Iq$w|JgK~7qoaK5Ph5B|}RS)wlOH@!U5T=Gz>RJiIs^VAC z8?088vwpWT^B}Tx_}c#WUwe!NV#D6)Yvp_+Swl0Uw`_m^q4DQ0bx6DADU-xRFf82? zeXBITonJ1<#mR9KT48r}_l`aEQg=3=>B`f#J{Q5O%*gO|<0p@E59w_?NUPRb!CGw?F&;PWk=so!xGUl?6fqQcQ30 z;uc_n4L}6})QvCDeuD}_LU*($?B0owO0AIq>%g6Vni==Kd#NW!ZZjb&ATjGx#VC$U zd(+>D4-(cdstC`MrW-hA{6wxeJJe)Sgg5zn(aTu(Wgu-NQEEOUIAD)P`om=XC=%Vd z+daeWlnH<<;HKK^6}vUtC65hEOhKN_VEdIGLT8ReJPWbgI?IgkV^qypTKqp;u7wST zi_+xgk_&!6@?H-4ZBuT)RF$FGewK(ZLla#h9}ayysIS<|pVyYJjcS7m2|-P~myaqd z0*;e84GlqsOxwfj?uMl`OnJNyqxrUEPQBgs4b%DPJ9BTdf74%kM&J8l&GL}m4$d}( zFD-z0-R;T&2q#Cc|HG;%O-}Pt&pE|FuX)%SdRPEP>g-f{FXs^eF33 zK4-jgS{mdQOAb=1*`kdyS@tOr5_6jn41yKQWC2W>&?;FkfTP6NKjd!5?u997fN;HF*LqP{^ zE7z7^+VweHvjouKhf(R{SfQ*o!UMvGb2l(X@0NN+YBEc_FgbzKYo-_#CrW(gs%c{D zDTBArED7^neYO?>@a{Ku<%fjLIlwe@_Q`FM0!cy}#2z91Obm4}vao z&$nx|llZI4_x4y=2mzTdL)4UwQX2Go3d_D?gi-6wXmikxE*hP5g%QZvOfX%JJ|fS2 zq$fjgy>8j&-8RBpptPdb)X3ZK={RB$-=-^4lusU2R71+>5xORQ4 zG>F(uaW#l)PX*UB`%GmBKj7Y@GFpBiywo|lRHC*N=U959P&1ZwvXQCnMtyb5o+)7K zE|%4brnb#3)I*Jo4AqxC5CCxiE{thI!WXX4WS)Ee4)rXI*0LQVusPe2kVM3eR+uHi z095WLSHQl%K6pKU9=>-OUWBHmZd@u3Vk1?ZvWRVLpD##9aq2Db^UmhtDdbN-#a{c; z=X1N;3l_^b#7++dpt9FP!KVy=R zLs0xAo>b;~UXxk1$97!274Ud${-uW`wNs{+l9Jj&N3&Ler)1}8&i<6c~ zF36d`$6awFxi-qhv@ZNHUBS(CkyHaz^To1KQsq**WGP&tBcU=~oKVs#V^p|jh<81- z|Hfl|lT<|CGskoRKq5#jH?firD(QUw6bK!_$WEW3{0a`XZIw#yPeg^b$KnQarA@Ak zULq-fa_^-#V&l+BYmy70PG}kqmGCu$efo8&xLiZ@o)5usRcjhLxLY zTG{PW#;)p7w2!6kV~_6Iap z^?>On-fH#!&S_S-?RFmfr-Yb!o^&F;`%UMQk(p{Tet}{Ll=DcWtL79)=*Ri*TVapq zd!+v9bCdE=78EVq9PDGk!R1B3*rLi0CDFKz@bew#1G;x3C6 z!cF<-PE{Kvwue_5zl9|u7hozWGQ<%X|4UTpE&btO#5pNN)wO8sS@7$t3-@)B{fZ+t zwx4r*B_cj%K=n2ichv|3s!m_LJy4xr{ZsxJPnJ3 z)>y`vaFj1>e}xB%o!LnzPF$y&!xx%lC|Cjo4+dBy#$>1-_fEU6l$C-PoNC~z^k*maVfM&0>x=3~kdCmgBwMBSuxSkEJdB{;G0G zimAJ57G4J_9*bB%SH!#&K=_Xt%Np67g7AxpGmc)+dsoE|qB%ENB+Najkyc9e~aS@S7t8!_vr96%>Od)1K*&IaEs z{Z(`zZMN3Z(P5n%-;(3}s4kGep#Dk~pFSr4dk8<;OwczcByVbJaoN|wIe}udQu|^t z$VhFNZ^fyt!Z^)zoR5}MR#SAr#tyu*-9kh-ytgqCV<#nP=Tr%yWn4IJZaBP`r`5OM z>>|E&&Py@|t?t^K+e?+)y++k=2Kv7!3W{}~T~?Ko7`Hb2Cw~QRY8ae8H7{6^%(*@Z zxI7{)Z1ms)c!oxC-=l(7t= z@11ePl%$q=S}`ITaM=Adkkks4Pr}uZ#;A3ioyJ(^?LaLM2Z`acyc-nXQw)wp@FnrC z-!nDTbRnQ0uNloC4G0XJ&8*1g@{`bFc)Nde#;aTRgRDzKc7Lm(G${8N@Kb@EF>Ml~ zR4x}CzU2nlNv7wnwewL)V-0*ZlMXExsHnjQSAySO=O3U=8m(_@6PhRWnSgRyaNp(% z<&G$(TXT3vBsAKsv;!U4kA!81cp6$2@kw=|02m7kVZAxNN*w!-P)~9t*^fQXaE)oe z7|r*SDmwx!!jY2T+0b7UG+1i6$3!3pa}q5hL+H)7(aA>J$(#+JkOt>$89IYlq{f2; z0DE2lxV2#6>fj_WvbZAaWv>w_pOE4-kcW6TKnv1Pb!2zKF==+6DT_Rwo?2)Gd)ecC z1K~NK6p;e)R#8a1*kedCj@0zk(7BShw!I_(&x5`VSP_gibmP*^;)U0im~h21U7|?5 zgUoveNrEieeD5_j!GPX`OWwDS+HWj}`G4LCFw8Ut5s);k%UHf63_TKkaRHo7Y?B%| zix~A>2e=f2^;M$a4%)oSA?&3M#1LtDH9`y9p7V9tKR!b_f&-4Lea`DX_A|2#e;@M;)z-rPqKpDcuu0>z-w=bfAd&@@cYR4z8m|~_$l`C^YB=cx?*Uto^ z+n{A%Vg_quSHLhm!Zl>`Qi7vfrkU%p%j*WZ;@8+6EA>dLX+wY5j`Y9VlK#8v6a|#D zi}j>G&+q8}<#)!u?1*SU{@$5yA6%qm)iCOeUB0HTKlzy=4N{IW^YMestPuL3|8A_Z zTEepgQDL+GVZJbnw}8F5bhDjxjYybNj^Gm*s7Yt^Oa8?(FiNfH*tQD*C4GT@txzaB z#)>KnIwnt5AW$`;-5IbQEG6fw-Mo3l@I}`%+50|ZG)ja9S%#_lcvJ@^6qhfk*MjZ! zI|vI2h3Ftx3dWIZ;8*5uohOI-A??3*bKRFDC{0-5H9+)1Sxf=dFZ0TP?=dCiEdkVl zLVTc2ot3p5U#zV^sR#Q_C0$6Hv#WNd{MNZOUUx1;S4Q>DJiPjIM^(R;qmsR)yk4Sb zyRQ2ez%xYP>yg9sDM5d^{S3o5tnb=*O&7r`+rKeV2`DOI*}$j}A#&HpzvhfsVz_bf z@>*fVLJdxjuWa>5I8%%)?ehtBD3I)pRhbR^{t&cxVTnS&P5&Ea_61LA5a|sEUVq{fTAZ|fMt?> zKN5dqj6&-zMeV5s)rS43R}JYtuL?6%0dTp049XyRUf>JE=7$FL#2=a@!jAKObn$fz1C& z8^Y#+c0WIK{`+>|-E4yeI|bHxW(}TmgXR%erZ}6DO#su6$*Jl)1Ymj>bIBi|^~3p_ zh>Q8WFy2 zaKc-7_XlW4R?dU6i7m!pBmepXh2=UOCY4rCOWPxHzz^>I1bXyv)<6XctnyKTQ9IMugJ{@1qGcb*(7k$HpV)=cq*{AEG_g=nPy3!EaI@DJm*~Rfpa%{VBq--rL zI^@-fjQ$&S8+iIK{l|_uftd6420&-25tpcESqgNW22P%aET3SQ2;GP99htzedmcrW z9TD$!WnnQ)IWZ+)EsB7P4fDHDtgAjtVZEZY^NU?irT4%|!OljaT~vq0hk8LI!7()i{jXKA^o!dgFaFSn_Ot zNtV!zoN3Qm0n#F#nEnSO1%1cT@G0)z5SH!;*}+%-OF195R(Y<^8!=#wQAZab^)h5S z_-SB>u{ z-LlB#f_+3^%fV;+_f8Tqg=MK#@b#J<5OrY3^tDYE_g_Oc>$~0XueEv+F;(4bD4PC%w91Y&u#49}D z_&{NHkiOu6VHj7eRANIJ(vlX6G#`=J z`nQ4lXKYoPCPe;r-~J}+8JULL=uDDtf#=vecz5?r*!MSKnbssS7?X&2oAGpv@{hqq zRB(}5wQvsS>?p?LMVrR^c4CC{Ow&q0T3f3m6yiPpYF0gUB!7r=`v3xOkFU;*UdZaa zyX%ghY8kD%{Ved1Z8COZ#xy#3)3Dff4zBYYy2!UnPDv=tfpqVVm!fxWnWXFA>Qk`d zlbX9L?Gz1Wks0NHxiFU>xJElK0G8~<vWLQrc;R6;XXANq1 zD>)8tCb&0<<`MFS9J-fNv(QH6M%ErbVyJ8ZGB%Q%zu_Y{)glRHc3P-FpVimIxTtL{ zfmRS1_&^cE6cT>EDugZTUXeYlczascYFxPJwP#-Z2w3c?=)P~I*8KrPYL zxtjJLeS&d!f3P|%H-{FKhK`i*lZ-Ybl!!xrH^zTD1VBdh6;(0up&A`Gi}i>2s)xk- zJ#37*#2Liud+dyRR)H)@eWk~{@B>K|1KvXt&rTUwBbuHU2?gaB=-wwHnQ&9*sDe|D z4;|DQ6ttG#8a}@UA~43pE5!}^EC{2U7@06bRLQ3epG&AslG>ken-zN1a08jE%!%`Z zQ3Suqj5CUjxNV4NCJ6(9caK}0wa%DEd(J7NIEuXPuIsJuAoGYZT?m>lDr)8Xed6l6 z$V2-Jid;6@$cgORMm1>PIdcfx0hQ=m9^3(}U@I+4Ersp7cL@|7kMFhUdPQ8X&>T1R zIOf_p8z*^elct0pAt~|CB$of0jJS=9C}Zo?9aaj4+CA@$i!rX zVi6-D>VLWmkT>L|Pzr*$=%v#n(Py_J`1}p)pVK8l+42$*iVu3H^r{hAE#NW@msLe z?y16=w(eey@(@!9sd64Vq}a4EY9`qzK$~=L9!F-_=vEqE01c(XN%`7MOC11o4ah|V zs}xmg3I6BVX_1CXbXmpSdns^D&@of)uwh6QXj#7{M2M9wMD25u>Xg&Ye3QS`mz*me zA7!QP0yazt%iaYBtC_7|@xJ*@7LZ^p_lVlU@&r$L*H}`G!iji-c5{7JYGd8-_Fp$U68dFq5}dG9 zq!2s}$Y^QV@|&QR8Hx>eE^!d{R^6z3ova#(clYf^$)>$SLzM##Bfs|zXGqgMFnxwd zyfo+wtOmG$e7Z29$5dYBAP$B0&DI`<)+hy!qaY#j+gtfRz{d=D8cEo2jz(m=K#?lV z?_v_6w1YQOH#;RU0lob-j=q@;MF19w)gH~ky2b$F0u2hUWG-cro47~@6d$NYO}Mz$ z^c5L4biU31f&k@7gpgl>*QFgt*UHFU;=Q=389x#Y;o6g`t-~t4GQw9X&UI`!(k87C zX{nEGb~ck8QpODF`qhG z{ZSjP(Bmvbv3U;@_fosU^80wvwt46Bz4de%(an4}@)%bj2=Y16%v730&cFsX*B*8;@r)<9k}l+PpCtNkHv5A0 zIXmz=mU0&69ESj`D1}eoyroqftIfj7MljRWq0z)awPP*!%^lt6I(Nt9a&F1dX&!}I z;5=0szb35o;ZU>eVh2X?h_B)qXiP!DLLO=*B0?W>{O(A_{ah2W7boU3wqnWo zlu*JmfUE6YmcKW?b5MVF&dJ<4ZN^2SH!Osgrit31VjDllxcJ9#2^+kuHLlNq&_&P~ z40Ef(_lyHn&ggn4>n36}h#k9qy?Ls{j5Q^CVV@83cq`DkBls~-+Dz9YM``B4%A|H z(qc@-b)9!RKk{sO_jHdMzdB{7>APNMP(-C0#%pkM-f>+Fh}&~CM@#04L~y-t$kANC zKkapPb#-}CZTgmeu4*vGt#d*wo=^bM9W3#)9f?>8h{&Yjyo!LcF15d$(kcKly;Dq+1Yi^`7J+ zo%8Fz@R#GjVZ^?Xz>B~~H>0-Iy-ZZEyYDZLq9$Hm>4A@`&r7_X2KF7Khyq7ufh7+4 z^nYG}P~|LUF9C9jz@X#CoU(%yrnk#W(sJTtb@KHMf)sd&98QUs>|Sv|^3NaFfny2QS0&q+DQ`VHbiED2mE z)oJ)nqXD(Vte{oS3a;*!Ct8)Rc_f`_Q_k8!qp9$)UgvT~8VxiKqhSx3;BZa{OIL_rVJ>{}&VznMiWR9+<){y3-~HX+?;>w}G&DQ#oJRc;bf6 zlcx5<9#{Q*d4-odJP3JFH6~(RF_{RoK`uEJ;ZPlTA~;tAi#XsIIEN$BoqKksQzyx> zNy%QEYi^LiEecW@ui&w zF~!p}G2R(^Lm$o>5Xt3;=%-R|<`IQ1ApF34?D;bLOA;GjfD%*%jX{=?(xe!52xGz* zvBA()n_1{z>&%bOhwfZ-rM8uA*gnwNB~ddsukim0=*^7|N)JxB;A-1O{)Dc~2!1C! z{ix8kON{44g_i9n_7w0+3R|WOa%}&`3f%?TQC?|B8MpnsKgQi=`04rg)ArH8Yn*4n zfm-q^)NsnI_CD|9UWcvn9uo?Fb=#e+(=T6KIDl|{_*l*) ztx1J<)&e&IW702sK(#NF-j`J%k6^{nFGVBlYD;2%|Bt4x3W%x;*9Hk`kZuHN>26fI z1wp#ILAsIdX6P66 zJ}6+IAxeBr#opllod7JKuECGAySDZMmAI;+FKUEm3#h{3@hjcpY&ztoRK}V5B#gBYWm8~GtQAM!DQR1a^F~28<}Cn+ zd>-9_V!PQL*#Rb-0%)fMsGq#+0rA_hNp@Qdv%LvUG93~-FaLh& zt{Pc+J-I|9^=r8>B5SznE!|kZ-d{ApGd3PH&u+LNe7^u)-}&?V<^a}cx^>4Vf0#jh zH2Gz?a-hqdA_z1TEfX;4!~y6cauy(lofLdlUgYg}BwNNo;&@&)ug?n4Rcja=sYa&@ z5FmbsGc}y(iP)TpzNmJ7-Yc!jIeM$3RzU17;b;f3y7}(|eeh)9W&MQz76RC=|5sOd ziQ`|pu3&3xmX%K^+Nf>X-^<`r%ztuLo+#9h%E$ELU|3vwQA%Y3#^U{orufWTQ;~E% zj?K~iBPy`7Y4mK9l1IQjOf>eJVu>y6;bOTPTzRM^K!VpWDa3FwC9`xr_j}`t0_(=0 zuCZ~zNhBavzW%_w@}GD4Z;J^-9?Ipe37DaX7=bTCySLjgR5kqZ)}dNz&5(0e^Wr0J z=}d2n-o||X@lsU<3xT$>R`N&9ZKOr(Z%qpM{#X?(1;a#31eYR1;H6@@?;mL|8ob4* zM+JK{MIGaKltNMzktK}o|DF%HcY=q9r*V$$oVH$0xkNg>-RL3AoHS-~iR^5O;DtJ( zg&&rG_jot0Gh8eU+WQ*-f|z_vF0w4TEabSUoV9imrOb!tDtOVp>5;7|Yr;S`hT|>% z!UDy$l~m{ZPugrme;Eo#F{>75C!N&v_Y~sxs5(ArUkU~=1VIw~kXNAAS+M&&(E^_< zK~QJ(5>7fug48W=ho8TO<}SbgMltS2ybtVl-^exRiRYFV1%CgOtCmY=i zueIr;A21JG=s-j%!qW)7hy+L2T$gX1mg}QTGK;ky;I}@*r{BenAvI-L1nz6jO|n$K z=((!aRQPC^vt#5HrYQVv6}R;XFB}%|eW6YfY+k*;b!x{_z6QF!e<~%q0`1H+UIj>TH~otP^$@En5*(a=q%6Z{LXD8Qe&8mDTDW9 zbUgg18T%jbm^?x(`T2ESB8isH%J1u=fcbI4;5F+f?M#-2x8@59Q<8;OnBH%(Rlh$k zOM~dqFa5P&f_R#~&SDlbMNZvE#Tm;^c?JPGqDPYHjZh?+%)$nXd9OIKBQ6p>|IPsp zMX*^E_zn2V#<*_=i>w*<@z%Zp=!@3uK$vu@V(OZ>ZEE0cwf?Jy&*{-$I z7ICQCt=}FNSsu*%!|V#>m!owD^Qinjxo_y9#%b*op?_tC2$9!wTGABhF(Z8+!sw4{ zB2BuxH}rkbM#Q`+dJx~(XMMB||KVBv+NE=N}7jCTkWl3dX9^T%?4uHmlNRJ6in>Z$z2WiLDM!`lR zdvm0QeoKr|n^)X414>ck$T?zgau;Z0tx|~+_>`9iBPuO!r;hmz6^ms|&SY5T)RFXC zbaDOmQB|#<6ZC%J3>qtv#%J8yY#?GKyFk(8+q-$lwny+9eDGQ?eHrqXs^kq@J z4&3MXpwvkdTjM_`J4*2&15Bu=cq&9h+iJ`CZLjY}u`H@BD|Ibvqi~wP-oS~c=edaV zaPXaHW!3g200CtJ={&Q_VsKfbYMZZBfNaSeK>ETLFGalhO8ERDH4cnjoixJ@E%;m4Pq->>6h# z6=}XrDd{>(H{?$Zw)%P47}=Y$Z#4=?8_O77p4P)tO1h`ezFE#UaYvg8&}6$ZMY|s# z>PV{+%6|K*mau~)N6vZBkw46S+p4>iMI6>+CXg9jd&g%q;s5Ht^|owgz`yKZ52efy z?7S6@Qt%F!MFx2OQvOp(NyOto9yvk_gFN4J_PUk8-PzlUCl$Kk>3T@D zd72~?laCaWZSopPDO`lzSx-qIcAtEFZJB#w2VF(n38jzPxWO|H(Lp4dS_i$8*S4ll zsO*2~2xJg5W6={&M01=5!yjt(YDc-mv=k%-q&#;Plv5+(Xpiw|J9kSl?JC5epCza8 z&ee6&qzsbN@W~qr4P-cm6HaxbXUSQ#A2H-W)FIy{MveY;I#833f`3p=Bp;%SEwM)o zMt9YY_7C)GPJfa(p79IWJC7f}*fR4=OvUGf$ zsv&0IJYvbu(7sMF^$T*o3Tq^&t)wZ2Q&hZER7WY`z=)s+3}bJ{GKu^Qre%aNFL;XU zUq33kL?##DxBQewoA@Q(p0o};UrdpIig0e&H$;+`3#NKgv<5iRUr7+&_{47w2*UD*C<$5 zB*-UXaFefZNgJDoq+mXj;&q)16}f5nhq zTW#;>we74X-kn)0YJLrWy}mkqh0#&I-o7TkT5POEfwTP}Y&0dmt~s6ELD!-c> zzu!T2t8s)|d4`cAShMIExtqZsP=!)5r_cOq>f|MBi$ z-6f4$>^{}4a%JFRB8Ctot%=eQsSmDepZj1!6LY#)=5@~{sU`fFMaWiJ#uTH->~$gU zLy6&`EMsxEqoAxc_uf@4?Oi(%QZ7i`O9L^9GxP_)-y_XpO=;o?DP;U1J#-m-Ca>Gj z%+JImo1F4&+10I{79Z;QjivgxrO7GFY=L02z93x<5E;e&kWSBmt|6a}b1`xowW+j+R9^t+*E0@+*QdPaerB3Fe&fRP1Q2rBpeq`Fge3b5-{f&R6j->%c2=t*Hq~LL$Z- z^1bbN$nuEoE)v&r7;M^QXRw8OV1}sr3Ci#PwiDIHuRM*&w240IwGoxe-69hoR44Rm zV$4?@dqWeVXD6Y!$lyQSFC2W6jJ1EUYzr2)Nkbz?D>$@fs<0w4+b{Qj%an$ zE#Oifr7f?uLOMQ8sC7!h-^Cg0RN<-NpHmg;=FmD=%`ksgsR)=8Y9{nW{QN)2r07Qx z%=C^KS(6QA5&3Q0F-_^2JoEv9J}?&z!9ETr-*|zTuOP$&K*ic~%%CA=o>8AguIUn2 zRo0Km@{luBcJKBzk{1Dw+PyAkfD9)LZi&6xt>L7V~L8K3^jM}Lk4&!q!5Pb2vV@Kuqs`jzCUmdq={~JvPhPUTW z%zr~d^EHF#`0w{Uayj?&vQ^R?1>MQsK-S(Xa6PP)#k^&B6u^tgH57;W_C^jXY=v}K ziW`f_qXIpNYOCvaGYnR+8(Z!NxJ+GE#gaM}DQ$d7=Na70iQUX1>$ieq!{8O4JA3Q| z*?KO9$TEb|uGxds&#z|+Ni8y&n*J2ac;?&5>YG})VeWWcei;!TcXw0!`bL$H zdq!ySZ637jh7(lJ%3J8}j=q7`Xd-2Oze{yZ0PML^dxqfVaQjdOa;FmTdioBLvIx2` z4>^ftb$93UdhvZF6RhD~BmeL9DIN~QEg`EHtd|Pw7_wpr1ixS@<=k6>loO}=aTExt zrFTemG;7!|T7Ka3(uO(x8p~GDObHq7?RIxJBvb2*;qj`!Co8d=qFYH_Jdc!!q<&~5 zP#?P)=8m>nt|qYezl1LZgQA3%>`jT^j44GhL9fABF57 zah0Bp;KpxDZRiCz%0}-?P*dtY+qerJnoL#zETN zf9(-TKND$$f}$hV=aMQ;jkxHhB2}}M0mMNA>H(?Ihb<>x%+Qhi0Jk1Xl)rIux9cv2 zBk-e(lB4xVKWxh)50L_UTuC(&F)zl)2W_=nvBU};ffl>AE3B@}3HZ*HF+0B!=l_Ff%Y4bQl9OOo=*0%!{XHyhc*x~@0)Eif=18JXDV&2aKI&p|08 z+7#{fK+$WO)0D~9;4MzIuws}GfKo7xB~9deEHeZsdKF^+@~>=U3b1LF5gsPfW5~^$=&=@P25- z`8p2!eD)G-(0#{=xx`3hb(^;Gy5)9m-sUxmC(=3l-i0PgA4Le?{4=TO8^VuMUaBTF zn0m8SfB4q^DXv-OiEmnpzlOZNP(35OG`~LQogd7=W1p<;Vgs#n3F0rwc|Tm2{hpO) zpGr(vA8I1;1)Upgdi;D!pbKE%CJ_~o!TYH8?wh7`3@qE`G^sFEonq%_=j%AJ9@~?o zuxmDlsg#(Pf8rwf*Tq+2Z`VazCFncm3~a*3 zI{**I>Xm!6qV8N8WFn)%ko;jlnUwuKQU1w+R5$3Do#dGov;7 z_s>wqrZ9vgHaT>h*2pmprj}cV&U;L6^86yq?b!&*<_4xnmntWdMS!u;H?G71IMuc@ ze>3(2+g`>ZHXKfv(culBIef4BwwE*y={qGtVe}CElpRj5T~*n)Lw>KLLrdb`UwFjY za`ovtsUxvHZ)Um%ZI{2yj7!+~L<=0$-)Sj_U68Ay2zAel@gCB2@Vd%k z+v>S@h?e4q(5{+Hw|#!yGunU^$;DZ}5N_PzjpANh9lcox{y915&H@2BEKDjcMi6dP zvUCeKKhjtt%TlV7*YuT@5AKdfPV(im&MC;;w%r0RDk7MO%5;AzI|2|lB9Q9BOA)$U9sF*RceKVk zUM_ICBZzY$`(uK9)vBel@$hDhXYUpZkUvXj@H36gpreW6`N9FD`bAZD1CJN!G@zi- z9w)o!;j74y3RD#@^|`~LuHiqm6+Uf$`K<8!3X`Sd$s+17fXHLSuTc817Qyl))6z2r zG+t-6Am;o}c!DQ&w8x!)VctKlcO-&-=AJB^$@&7Lxo*JBsqypX5#^CD4kZ1Ky zYPUxEE`{PWy*BuCPIdeGi^ebjjsFD8M~%PP9mv3Gi+Q95iM@{`T4D&T8*35%Ec_@r z?G5Fk=*)+9ibnTn>CGb^&lFDbu(Ewm+im)&L~1D7@FJ4D0dL@P|Fm-W*CDKgSKGI- z1*wEJD!cjnPQ4%cu^mphsrl|I1f&try-J13A@Lh-gCCC{$(k7soQn#r&$W*p?IP?F?g6J5JP33#ELuMypk;*0= zUYqALS~0@tiE0aEf=@5}bQ5Q{(RM@SK;~wSJs~y|nOzmc7Y8RffPPBoKUN$7H|tDt z4}{Wpl?q49Eati5!IVbKQXtyKf-W^XF3Kb0g)ymL)=YLoAIMqJ>cQh)$!a+OXoRe2 zd*erPVJD^c1@sMHinrbq(_k(rwe-UUi-C<{Rf<&0mw%{C9I3qxEQKS5EqGtr>s-pp zX^mf9qI_XG;#4Y1dh8ZLt(kolO}yv2qYBZzGIneCx-)AG?3^JIe{HfS&yno0OP)tD zc_W9_q6fnuzxf5KYwiKHg9D)XdM;w;jJdBU!wK4T$NT10>@4d=O;v*%g2}Sf$AOV_ zmOi#)ASX)dZcLW29GJqAkJ4DbJMY%Zj8vC#;965+Z?VS{ez1}< zVwHUWOzrV^L+_1Ji1C!T{~J3KVqL(^OJH#JVlAC_oJA~qllvS5Eu&JyCn+UZzZYKz z_g=6IH@W1E{I=nryu^yV5ha~$d(Sc@husV{5+dzz2dP`fMsZKM4629K$*HEycgp3K z;@>MZ9J`$F8YcNPEGDh03NhSS_)w2^N_@X;R0na87h^m`lVvHz7uqG!G7)|B3;T=0 zG!l)-6zldKP}>4e4#~oPz)i`)?yZ}u4_xv7Cd;4~i_f1HQdhAL3Wr1yUVx^I&TFE% zHG$3C`0v6a%FaJ@_HT6!9rcU`#@g65_S+^tY(J#XgWWaP4ELx4qRJ1JYA#r66}47> zby(fknU939l;0v0&{{t=b zcxq{SW3`aEYmp4lZz1zKo|MP)4NbZ&Kb20;#ujh;z`PUHgw??A!t34iYJ5xgymhX4 zrcbHxku(d-!HD~)JwHHXvw^h*zvbnYN#W<3(|Hzr-=qR^4iH?RA2fS9wS1T5`4UfP zaGQz7#Giq|;EFADBzlhuZIDpypU(|FK1iK|Zgr?QkzNwCGkQzE-nqajDkMpAs%5nF zJX!j3vB)OFY2!8ITGCZ3<*9b9`da*ZZNFKgkogKivQ~;S1ZhB$VN%ChJ-|~mh^Ou+ zd)BVswXdtW(#Kn41s$Mt-D7$2(JLIN0IEY!Bf_qi^zHfw03il@8c1$0e3YkrU#x1& zVj_G>GjmZ9<4$U(kj+SzMfG0ti}oGu^Z-WB9CfM`xVL9oozGc`Zv!>#_xF9SQMIZn z0Xa8>O@bK#m$!W=wv}F~jBPJLKzoTDq*{LuHSt3fmZNut^^hr7y8)KT08n8YV{O3p zUIe0MH$KfnKYed%7h+2ZWvv8DUOw2fAw0vr^K)Djk4%>z1 z_n-3#_@28IH*ic0@NI+B!MEEVHh;x$bvB=6MA36DVn&qeCwa!`ej5QdgdYFFXnPL* zdQ8_|gD^9H+#|&HP z0mK6XqpSBMe=jvUf{D5iSA#cFn(+qCCrlRj7Tx~FNsxz0ZgKAGI<5I0U+MtQG8ek= zirD206v?;AB5AAn8Q4KSWag6eq#t0J8<5cEs6VpUrqOyy<6_nwAvf{UP0(Ahm(bFZ zYvj36W0F%XF0l>yT+U68E_iuS?m4w(a<_Oogc= z%Ht^C)MZPZo9)}Ep0~cgGMBaHpy;Sr0TDqsSbv(ci#wD!^d-$BNCcnCN&lY~z?Czk zZh5A`H}n`uVQo6ekG%Hh%>j{wM$Jala46kn7_3f|>Kp5zXm_B1|K-iF)rG}EWK+El zQ;#Jvvj1T}l)dYFstU@_wON-S6_mfNkv)800y*>s`|hI})~?cHq!}^Q=B*xuvx&?c zB)9-^{L<~;8=q*%MK1OSYw~VZS zED1fX@{4*M2Jn^9_x+wt6-A9P0b=hNa!qf zdR*(ac8oRea6JY!!IxY=oT;l17a{`8q z{F2b6IRMc*Gubqn_B(=zay}J_RM_i^j4a*|e>xVCVU|1JJ2kdgyT3Psqh14Gmcw8? zOWN9ZV%n}Dz?9XrqT?Oz^bl5)Gw@PnOCF&bd?y%`8w$QUHt0KoLe^CrC4}pN z&#>MPp@hKU!zbZPCy~vw0rtw#y=IglmpZ#xoXv)T2ih`r6}-3`F?xu^Lk=|v>+cDD zTyx*A*AS6t>xMOIg$gpICYN0dTWvznA&yGlw6E$n?R1b7Zs?3lRr;7qFf!EjVsSxq z>5l@rX6l7V{BOHt+A4A(CAYWMR+ApS#9@(Y&FOJi&cPH(zf^wL)#Dsx4}N3mu+mBG zM~!nl-z-Paa|pXTv|QWTT}iK=c;GXbu9}24?*7lav76O2QX88x+fMP{vXo*jO&<40 zi&}n@2>(xbxd__IhgewG@0CFc`R{AJ{HgR6ktk0-7OtrA zQ1qdM5~fnMkgb8jA`fs3%xStG$R+0GPT&b}PoJbqpG9xcPAEqJ~87E~824!w~bpaH`;^*nfZgg%s%V z{pzj(RVj=BbQEtHMBj>h~mljy^}7t%%AnwiHcqdgOUw_a#?( zpF&jf&>p;*(3b{4)-y4%*$FD@5+Q6*;I*GP_I)W!d z+#`hXOxIp|Wk%4?*|R&pSzLHlKj=n3g;mbN8BI#HkRn>3>SoOjOO7kt2`s^bd?r_f zNDW~QQUfAeHT3L;QHs_~{`!R;JK)Ns8NMgoE{1*tA7SMM_=QKG49I_f#67g>`=2Q; z)bc-A#yACEYQ?0JR-ue>td^ZJm2S|kz|sd9YUVuizPM_lo7M7Fe}*d8Qc!LJxNpZD!4H=l<9jv;xJlBB@DECoy}rs%WUASUWjf1b3&V+d%gz`D*JTVynMU?~ za}t8`k3WQrc>W!5=FJIaue+L|VGjZ5Cb`?Q!&Fs_#o3mheb7o33+@OaMPpzp|LYgW zQNe7?t8kY!FokBG#;6M{N?a6_-w0WYMJn}d$}*!7WRv%JhECf7{c3}1lST&q4oUJx zpw)%@xPMJFk7)6}@qR_gygF;U3)6>bXrU**8cw(h3AW(|uR}o&p?uyWH9}?KRfy8zaX6BOI(1*~@me z-TuEX9tEJk{!RhJY!Z*RytZjvLdZ9}IchBJ1L;3i_Kf7Q9I2ARN~L{8i$mMI$BA%i zs~;4&HaX~3i1PSjKcvtxT?}A!&r$c&1Mw8(0l_>5<1WdYlu|l4D)Lj?2b;`TWhn3) zEicbeeN1sMoLJ0*e?M@Qoqf|hX>6Mj@aJNJ;TXBnXjEhikE+qd0-YY{FMY#-NM6P3 z2QM*mYw-31q{Kq*1JqTP%Y}5tK^}IdU2VmM5iGrA{?|uZTU~>>SydxldL<2Ii!zQ~ z!26nMv;r}QY<}J#OW-K6%v5i!$Op)$_j@}!ib6Mk#+j;cdiD{cK*0B!AnuV()48z0 zPU){ha>=A@)W#|`F-kH(f#_d7`giOSYy#IhkWh{IP zqclChSaJs3&rZJmzi$iqic}zB8GUl$=j(7$b8S8TWK0)tfH1xew=|ypcgn38Z7P7W zuk=S<2dle-e_#n~aY_gj@z{E_otE5@n}lL&5r|u^XpaJ;a886E%4s)rCzOS;1sexX zMrJxGh3sajo~f?pNEfBt4T$5JI4F^crr|Nf`qiB=eM{PhkiNN z4ZbMBvpTO8$ERLk%oF@Mb=cM6~w(5gtjl1*VZ8CCA? z*gMyN$le|5`e)wO#%X@&FLJ5RZVq!ww|!gsEd7RA$l;@;u`I|ytW)k9&K~hoW6O_* zOQw}-kC7>xcYl8n4$KYM;gtA~`!2qnOoO9^im_8d0tafE#stV;5tj_E!a_BQ9S5Qu zgEfE{X-Bk=P!9>o_G#Un9=iqR|gysenU+Mk3!dcN*r=NMZ>kLyX2R+4RCvDjHd_ zovhj{4`t9i4_$rLW5e}++hCvCYfCfx&aF{bPZwE^oT@C-jcuh1Ypyx)t@3krZc}&PwB2N-^ zbeIDp{Fx{~5eN;M)kSf>HfGyHPFMbvJ4oIM)FBaN!Ll>J;xeNHvh&tLmZyShEDrqk z=*>IEf5hbQxkP@&FY49=AGVoU*WXnYtu`5R9(FsnX*DT1zK(7Ay-_AbPM<|+Z|c9E z1$_NI8*|;HVVx2p2uw}qPnGPFS_V-t`vMFp{0WpYnUH!hsBhq*zP>=y>>SP)9ObfY zZTBMe^TVVPlKS8>TIf0p+MdI2=flT&gYbnrlqGvrHC$!-H0kFM{GlMChI>9KZ6l#5 z+6uz>nqF5=gR@4VAaKaSm3I)f5!VPY)*;bjgDTt``R}_&AHOf-6nytD`?!knz3?=Q zCHe}L#8^u|$?Es-YDP49>cqha8eO~g_a!uYs|=Bc3|?D3b5-^oYiF$z4PI}nMW?J( z??_6Ol2Z+GVJWf=*6+fjX+E$U7%hrZXR~xNz}YV&L;uF%4^N$`6)g8#cj)`w?3R=s zPrU2gav7t)v!(i4%p|8ym6|k&@~hS*SzdKp@BsJcj_0Zx6o!oD?E2!;+?6Q41|Qr< zq$z*QV;{WWNz|eZtoPcC_AY8ZW`9Uz9`pE0r5AI1UMf{4d8O;@f>&3?!kpu8TIm3SV(gzyTZ@IYP?X1Rx&E`B|<$4d(!u60FZNfPgU@5w^vL}PRO=; z&~;*LN>JC0?{0A_8|7Z^WyS4gyFT);#_p%IIHd7R5Z~l-k>#MIAKu^nVf_hnOc+EJhP(vs z)6!v8_koGF{lfGefwh1S+e|Uz&bbHUDP& z7ZT?!vAKuz`IZ9g8<&D?FlNbTkbAPQ_L@FBh)^1wP3s?-x+2A_&x&l2`57$Rd@1Nb z^+MmYRo8hRkp`)m!?CjcK$jaJ1z3CzMGIEEzRo;N$dF%sx3>A8;sID{>Rua@f`2xv z2Rc()?U7Zb5|DX(X!n9beJKqknuv?AxUPN-K9OJ2A zyQ4BZ#y$$HvQ8BnoXM9AbN@8vTT^br-k~d;yV323p8Of=)vizIjHxVj|Kf&ud9-^S z0V>LftI(k-M-1EGMH929ySfn@I-g{Dll>m%bZV-2N$EdkA~H|C*WTA6E+|$iiGmk} z`Bc;A$sv~ZgPyL+(E}A`syJrp^xMko$G*=Q2FA|RlHeya#~zppvs~r0#XQ-+Qric8 z%z+EnNhdyugCr4^{Zl_}R#1DGwXT-Kb*nb1^Vw68j!)#=yEj3+Z<#QppJ7%Vq5C>^ z?)-2+)qxZ&Rd9a58L^h(+1_E*lB_wmfcL1YCl|+z2SRm`^7egCe5L(MIPAual*VT& z{rfEH;vf&OE@_uYrD{aEgL3`S%8Fq4UcT+~KPow^pV|f+9Jo)!2i)7{SCOR>jeY2$ zEY|q`Y8}D2Y#g6SC`$W?8fK}~RbP%u-SX%T!t6JcOnY5tj|vW20dC$h%fHQJAkX$Y zuiwX2od5aGli9=gn4&OBxG%1r=#;04@U<_otE@FEt4n9-Dy_XYTTWdX9+?czHhTHS z%ITw_?VSl-!|2PigmSK*+zUFDnSw>)ze+!^Z#S-eW)3yBh&AvDv;Gpi#~rg2L6_KV zo&p5%fr@$eYi8W@@lmL4io6-(dF}aG^UU*pCCJRL#xq7e+TU8^)_{`is7{N@*Vfy52)Y)P0yRUg= zd<>y0zQgPJD*mCQ6LXyQ=yb=^uHVeUhH2JcC0dUhKp6zgl!F52;K^+TTkXFBJxY`i@VQwEWQ}-fE;MW~4|dgQOK7U_>1$ zYF1;COIV=eq!7H_`uko1lvHseP-!ghu>X=N9{`?fXqt_6_W3?!_iU5_ug}T^RklBW zV~O16w(G`-<6Ftg`~8WU6crFHwi9-qsScH%Kh*a3 zc#Qc@M3cRDFO69o(6)4$qtvIL}<`_tfu>1(UQIz%;&OQ z7bD13`sB5S&LzWU2{0`exO=UCuKA-c;VH7GILVshg@0)HGY^OSi8M7fMEy-UT9ofO z`A*VI75K^GqrSN+-z5Ji7*VzHk=>U5v8=Gx*vIW@Oe)B{7Ejp+9R@_x6xXxhHVA%* zh0HB6iuV3J-1c&L$k?&_dW(GdR2qbB!JB*~Wam?P-l~Vh&+*d-1%Bn&KE)VExf78v z6ff|&({IBuc=aWX7|3D>xfv84{gOa0_I2~F^ItC(m@@ zcK=vkyq6)h|6C7H7yo%srS3+x+ugEB-5Niw$))dMK)kah{W0*1zxQkNUm;=3Wrs!5 zvBa40+H_3x!n4Yc{P`r;4BbLs@ICF(&C|yRA2G1=@~NA^p)~8LwB|P4E`P) zrEAou(m+tk@Om?mrPSmsw%%2r2nQPRwHokP@d5XVCe4sDRrV#CZw@nBP9g&6k`452 z#+jaz))`s-3nSzYY7bd@3;PmstNC8OmWulu);2e736p_68cjw zB8!NZfRqi$FLAB2O|qL@aMLsV^v0P0`sXe0)52>Z?WS-(f_f-<-y6xWVX}9h;U3kku~LxziW10z8rFI*Nur2+nVVqyQ@AmZo7rp2VC#GDhR9$*mg-+KCkFJhK#<}k^onf zbp)cp;FJYRt<*(kbM)Xb)NT@bB2Kfn%&^xkg_~2mf?j5dW$^S)*YTM^(WfrBY^#P- z#9Ps4>&eou*Uq>9p_&RW{FR1|ZKiwWF zim{0fwxbz+KoVH6^ZgxA&UB+lAFSDJVn)d9gEC#0j+s@&t%lYP8rj=huvOB(D(_B| zpIWslYP5juv#YS;vXvSdgze0?bWZ%fP1)z5i|QO~IyLmE1G4v6h9qSN?Am1nj;R2D zuBc(x$`@TA3YH^}l9PgBd0y*fNwQqm^M$p24xD0{EaO`19wM zqlpeH2J6UF&_YYp_cW=XIo$CK@7*utxD37xOuu>X!6&l$ zh2fWV^I#to*Jn1*64%fap(WC^<=1_))HTx5#YlzoNA$zc~JSX>6?72gx;f-I73#=A_-zi?U<+fQtS7hpV~96lku`!@M;ez#-aosQwc{GX6lo|Y zn));poMyKSIBZt)aVIYl@_q8afjm!$E%8lV@kDlK0`9EeK}~C9?qb1hiDA**q|&0C zd*<=lQ2*IkVjw6*U$-3MXH#$<3~wX z>Fglz*uu?v>uzkfKNA3o_k6 zVtXr0MTIWrX51D_B!Cf@t7>+g*l(T=8pOg#`G*m2ptj8~5*FYavwArV5Rkx3)Of(% zXouIw?9{<#odjJ9=s&p>|3bo-dn+OGiZ%K*9fV9^tV>@K=;Yt+`@_>-A?y@)NuP(O zD}swpxvf|FvdnJf`JI|@zZ`bi3{7?n(?t*sBqP2|pi?1t2R0}+-5NfNH7e^A3xEim z(;IA`%WMQp{~*Z~NA&IKvLEup<)zFRJr zlt1D2<-m3@rC_*zHNYUraO5O!_*rV|E^Np#O>o{H{wg@|{PNd&=9<{n&0bLMQ-&Akes;+xyF#=;; z1av*ntR_81thBw5t}iR*c-2xQJ*hw5DTq~(j0F-h^*(bFsG*^aa`ugP;uF5rXO5QV z7*Y)?&?Rnl%a(G=o6VFE!Hz6K1!X1Cf4FdczVo7+N+=WaudTPUOOuwvHwdu%UHxWF ziDM#(R+}8buQ|#@{?Em}Zrx@n%cX@u-R9f~a1bYq(fCDRP$Q@8m}F*6S=cKXT(^HH zUbZ^oK^>cBWIxntsgj8?)gre6(n%8kJQhfPY_wTj>VE zg!}UTSAYxM*Y}?p^9|Bdzp&Zowz&tHuZQsHheXXA~U1Y=0>d)UXq(q!%%ND?JY zYlKG}H?w%0{t)lfizbhpjl&?$k0F=dj?Ht^fG0O71`0*jS;?a=`9wz8RHRbmDKD4O z0DYkTECXG7C7*6JSkb*+oCt!P>oJ-b_}>esq*(cNmM3m4;*W&1^DOw>gr~-@+4gQe3 z4ByI}i01URV8pwK0QfOcn#`QnIF@=dMui^NB$t)EtK&wB#hk~d$^g;z5zY9!WEDu6 zw_{^h>9ija#7)cgR^X_XzV_pHy(|r-wJ81&01BWUFfVj0M+$roIbgV7#7Iyxehm6u z&>|L@)%J-kx(Qw(G*&(7{^~b07!bVpbfT)}k)j&;07ibHXoKA>&2TpyJ0o!Or5Lr?_}ox%9=|z;I}^o?;%DMQRcdp^?;2}4We;){!a@qKWHk4mI^nf z{UNi%W)+qhgRDZ@amCj6)qZ@7G0)mMBw;(lkoRG)ftcO8aK9M=7@RZ`8%!H+Di=H7 z2xXBGH}(ArxbZ_50;)t1YfEr?d%<1d$1`&iY+L`_H-gra<&6ai!)tHqRtAve)zBJP z1(u(qz*-V$0X;*tGnfL40j`TNJ8p|)_M=}o4q|Iq?ZTpO09xmH`nt+R9=2}%ek7OPYI{D`?8W=X+#7`Err_I zm#D;k%BN&}m_$dbo#WH3i zCYdb-u_a=8pj0k$mdr{+BuH~QL_zG{gfqDi(HCOOrL>1h_i-$Y;G;wLR2+Zif75wM34{X}Ol#S$Rg~Lt=BX+LOk%el_WZ$^o`JkL6(0{WD zO`DgASc)i>EfV-N%%+yny%~+-7Gms>RAOz9=*}lxXj(JV#rJhvczzX|=&~^`Q7y@Q ztV<X z1OgZE{enloZ5sKBe+b_xCmBpj`Lm^M^#1Qo`tQtgf3F!8ybg{%dLxg6)T8nbxrIon z>0D-72t000k(yksUz3ra z*j>phP(m-Ey*a)enT`SD7khax7tDVF9Qy3(Z2L7j;X77#wG%BK|K{KELC|)SNkE#h zM5QYh0B^VEAMTm^6%KQ)wt zKp4ckZzVTWw{DtG6g~fZd(CPcioO{TS-Mlsacf{rNf2T1BpKAR^aT zfEJ2qKOt9miC0t@DBz%64SwcjbP1^<$}u>EpH|3hNuL~aroEWhR=O0TeCb*eayvXMVwFD+w<{!MMv6wfQvm<(Tg63}SeyAm-%rPGd^ z{S_036o_PfZ?|#_4?;W>2`ul>hGPrVtUn zBZrv!UJ-!Wq(ssr>%|Ow5PEH7rk|+2TJM6w4E)8BSh1}L{Z?Xq+LyI4x&mId^=BQK z_#9ue#qV7MoFAj9F3H4G$6?%^Bd1eQ1OXY^Cmro31GWE;rn8KS>W$X8C@CG%Asy0= zG=nq@jS37%=g=VC-QA6n(j7_(NOv~~BMc!7-Eq(V-gVbvt@!|p4|CqN&))la-ro~H zCwLN;(wC&fnsxUL7_OXz&`;4!-M;Q)>X?~1`8FQ%H+r_5v_K>FfA5Q#ru< znK&1XZHK=4H{394g~=F_SUSqO5!mM787+p3#R}K$mj9uWC@Yf;tNK&88dUH)Z^9bQ zFcXpDsX)Yx9fbc2`zRT47&@SKtmnRa_!zau+NIsL=G?9%zSG|URy^N{#1^d0jJv{` zSGIM>Wyh`myHEPkZ@?5>J-w9ktKV&5Xj&L1_6!nKJ@C)N+h(n_tt0lEN=acU_J9bX zPsthsfD<&+IL>SyTRyZa0%gYMZ+fr*5hK1 z%1@*s-X&qXkru9#rS#p9bts?fTa-=OFO>R~P%tSfmbQ7+yx*P?%rYA&%LSU;Rzgjm z2LCr&K1!8xr&OApeBuTGv|4?K)-!ERz?wY@h}ykj{@b@@eYp2VDUhU~TSSs5oN>6o z%Jy~P*rEBDcwL8V{7>R~P$}my)!dnWDwBczL2V@|5&iqwXpR~C7eNKzG@^}{&6Ki$ zfS#d4Z~s?z;O`fEZ4lygh7IOSaeAd1I@m)sFBh&tlf;m|A z-rMwu9wBb5``b|P2LuiVkM@7h!G}2H-r@! zE1gWVsIJfaLiex<$w%7`1xCtR3jA_i@Q6TW>_Ci{^l5vi4dOrnEp1LN+j2pgs`lxW zc$h(+J)uWj<$#1}>pEd`%JT0L2|L*go@Flu1a^BDU%q>YR#M2vjAdUNtH~1XZD^Er z)mr}N%L<-BMKnKXvr-;}G+sf>5HHwQ8UH|0ufO{nPq1Z?tHrg@jcXh75$7^{=JHYO z8&0S>@FakbkDq*P^URqvAYxqxAMzXkXn>{5zf=(#|Daj?x;0nZiJ)mCFoo$700ab= zwA~~ewnv)d=c=NnE#K;rCG$n-IDXh^)cJ!BM4Yzh2XMB4FrCb2Z zLjpC?4gs-72l=Xe>^8E{l$B)YOOhGi80l*slCTGY86V{&pBB?=pwbybWe>D~i9e0N ze$Z@rHAV(V=z2eVOELzqkc<3+K9Djq3$_UGHtJ`0V!bZg&fZSLy_8h3f&WY;RGYo6qWTWVl^;Oc^<-PunWjd{h+jge0=+ zTow>~BazWyzFtiWH=eJUk8Y9_?8B|zDO?C42%6W$sM%%+DH@F9q7;js`qP){(;h7ey zV*A|NM_-7xEVg=6b=@5Dyh8rV=C0ksx9+yH=Nc|4( zbT0KR;QC%|{*WY@8ap0>p4W;ciw1F^EV3yB`R^2p{3Ua1dW&v%^KXshEURwT-?~0H zK=R%+3S4hB+(w*ZAbq4t-@(0+0`YhMRl$(|>;zOj9MkU7MHjv@e(G(f-b8!E!^PEv zmXn?e8YGx}dIUPD9<81nu_-}JS@T(UQus0rTmjp5FQOXhU$Un%DII7hsb#Ty*mb+` z4Mu#F4q0ujGw(IWgfWE3>tBuSqbe8KPA&d>FZ^+RU`!*G1^>5gq)HfpZ~Z7stT(w= z-6wxbxGzgE7N(<5ei8j5VfaMg2&2^quN~FERi>K#kqv2OrcO2X4?xljN{(=Xru{98 zC-~#Ktc)?X#?h8dn-aw!kv*B+Y{LJ&;I~1A3`ew(h^X4a0?>5^8qcbMAL71tJy8JC z+)wo%{3OfAm?G|(vG|T1SKoz?k@$*uYJzffpO+L+R;xMGzS4)1^a9K%GVTiE!!ks10DSeCAL z;>8*MxzS^jPX0{~-<%na@Ub^pB86q~=li0k*sedYKM&k>}`VO?HYi3f`Gq>l2 zWnwdt%q6fbA;E@VAl41-&1UmftTFSg{reOxVtqST#e$ojOHL}I$em@P-bS`l^25JO zXJ^5ZS?%u!U5o6yw_|sJw__!dHdz6;lvbjUU6W#uEQ+Zv;Pzfg8V$R6UdqN_L_|Us z#}$h*ORkx3ltHV>o)gedGU^cZv0w9pw;i-;rMNP0p;0`N!FHf*TF55EFj1h3-mZ!` z%y;#OD@2`qK7$iXEGmnK=@`7DJ6W&_-4FD56++-~7$DYm!vs|b)TAA z6k$%@d^X}0aKJ66l&UFI-Fs~Ho?1?!uA_Fsyfsihv*fS&PzCD~PF3>{Hf0{h5w{;- zkO+mc!Rd(g^-@HLY3+P}Jr~Z0WF`tIzvZlV)OW&AZTj6tOkI>sAGdut89I?Uc}7~` zp-b(;h9niOrvZWd+prE{Sz2RCO6j{)41I&75-dfcFSTc^>OJ$h`2|fDb_e3qplXH@ zSqQZXAyLk+?o{yez9I=BcL%RSJVhaKMBBIFh*;zuB+RB=`*N1cj z@)HVhtdcd^Wzsk@UP>`pJ#D?;SiSglt84vExRBHK8(+#WneuJd9phFeh*cI2x}YJO zZrv7-c*Qy3Ji-KKloxTgd_AbeAcE%zZOP*H_9nj%*cM zNk3_jRcFR(h7tFwj7m3zq)~7_-llb&Ww>NXDw{2$`sK%g;>G*v6$nAuGrHpW8u zUKWwGa;005Zn*<$quS(--ESMD5=Z2MJ@EwMn(L`G?*yGTC9I%{_G^g6EEPd0p(d(= zYsYwgiTUKx<1==qh7)jb@W4P2Qdx);8aT@$iv<%iseO7Sr-HlmDHCU)bUnQ0?s^+4 z=ka+!lqx>3A+EY=+~L{eO8&EG!FYjnbR$O(3qB(&{W;X1EKVRZeh-viRV{vDaFL>u zoTY196mC5HlVIE^2Id^*jjU^>WYk{FU3-^IWpwi8*Gdf>%#G;mDz*p|#o69QJr@BH z@?{1*R`PjDS+}&)!xk?R^XMD1lgH7S3{K#xMiv>dZq@Cq-2jZ%9rqJ~T-M`P=y{)0 zzpd9rT>F1-onIW&EnB$%Rh3iWoobZ8dbCrvnE+kZ zK$eaZA87ZS(#_|%SIg;)I4vJ$^VKMiZ?_yZjuK>O(^gU*0UzyIzv;^OP8ojg$6uiV z)8@DYow)lla|f&m#V1m4&KFt`u#auxI6!4~SJ!k(E-PH9W|@QP`ul~wE9Pwb3-kSm zSow}f?m?p;Y!FsqHyQyJhIUPZGu9^hB&=(kr8wR%M5yp<*IZMK3FGn|rzYz7l?62* ze01XI<&Qs34g*$T`&Qf@O3b)XT9#^O~DKDs3J6k(0L!`!TEUNUh! zPbsj{PQ%sXYNYr$_W2lAl}UZ*69!uo6^|cxi{=a!tIB7}j#HVmN)ctbS;eZCpCjX0FcUEzEo!6m>o``?9*5Lk6XN15*7zl z8^3r-U}=0b6YL{kn`~qf0^r0a*edoGS2)+6@vR+R#ZSEH;f!kEjjCr{OR%N5O} zO3<#7Mjd_=KlJ5AZzWxRJ-n_A#tArY!zz7jy(4$uzC4xU#Xlem>hw5a^gBaj3F)cm zYFD=MrGqZ-8vblNi24V2-PAlpKf6DYctG5zKV57{wCJ<NhS{qg0yp`F)0NSu{UCrZD6LIZYTGr^f;jt^WSM+edSBX(Q1Ak$oYZ(4b)`Lk{wq3d|?AVH+ zY_3<Z$w5XWLh+9s1vH zU~8G(ytn?q+`t}L?cd7`<1gfFYa$L2Q(=#i?RJ++GfR=}uzDex zC6^-W`5l^Ktp87CFxGo|FnAHiEi(Kg{9iNFBT_}s-<24EG*lFF82 z76Me-{r|Q|<4P&6-VkQ?qxS~00*lOip?{3U!Smpb;J01it|rMmRvf^+86`?SY&t7J z{HBj5x(lmT5%cFIalT**c-b1qUXg_}ziV4n4Jk^eP4>-UmXDEK;OGfiH?#un;2; zqE!ElyA3A^Lsn!fYdtQgLrFh{zV~N13NT`Kq2GTA!hf$W@KRxBIMGB|zt?U-Wf$o$ zOFif9v2zpQIB#k*^5@T=`?CS!=+BSOzVCIqDpUI_RRwETUXKh@k?%#r|DJEi`dtSj zPag1TPwDQ%pD1QvscQ}Xlkl4n{l|)@E#%3{69QRVH`U>i{}3!IvG&Tp`9C2%Q?N4T zd92BCh}a0Bl86gw`s_J-FUG!2dn3i9*}41Duv?l%N`zduHIU=6pymD#q$g7S>ACyO zFUucCK-6{y%1Qg9Z#uKt-sv1jdS&+2cJbbauPfwLPI^~^4b&^mo*e>v49y4gQDF0r zh$haa(UW`KsfDA?0W%LbWxIFMa7gFks7{-;POl* zn&rHPvvaKFc6sU{_zo9c{_Qa|Zp=)`WR@-g(c-j%7A{KnZR~D9o()UHVQNGCJ!a@a z(m(Li2ORx(%0$n%ZUTC94e4cuZkq>=tz7I;3faQU%7%=dY#McA$W<^*qxk!An;moT zbk4@d^+sT3i%ZSwQXu@aF{c^5$^{eZ8RzDAjrOCG5AWQu)U*?^eqaB?){Rd4c~Wcz5Z;MVp~P? zT)(ldb&VI5>VVW8Db&6U{j7MNlakKko>;$r1mwWK(*836RoQs(cE9;|##(A}6q1|! z0uSGN)f<7Aoo$nT1h}poX#d;t-!jT-=`=}|a;Aw+r<&u-Jd|_(aychou*qAr83Cqk z_p;er0jb&2Qxc_^1(c#G`N1kVJ+!U|usNS>dBMI2kQu5%DD%A zWj)S}9rsr)0o+BFubhZh<*=zD1!7yvWvGV+6PJgL188)~;vke^m`N~m&O179%WC50W}J7L{(~;gt;eh3 zS9#M%V8D%f_=loKsO$alW^av?U3C8AqEW{~j-j|nmsRq1k{FqCI%hwi3T+Xs|2iKx zcUhK%i%aB<9=||B?kYXb{?iK?M)B*+l!@qaNfmzDH&$WkZf&sFx5*hl> zco%>wRaV8niP{cUN)*J#w`-2Gdxd&7wdJ{F|2|DO1_U-!(fp`Mp9$Ns{FU}^Jx}hH6!1Ku_{q4Z_()B z(!<3frFNO>pzNoJ6?SXr_Bj3e793XGRcnGvtE&H+u z0E6(D2h)%UrdQA^yi_y7CZIU{mRFF@t$3yJyb)8;`}6y z17b*`*XH3_4Hu>FJvXCOmp8X;BOX0!T7$tIMb-{F)EUgbCUH+aBSLC-DFT}<=-4yT zB?Y{(9$e*?ZV`qDTG=7DACJ48X4UeG;}1Ko(VFkpmu}q0Wxj5UD9jkUTr(R5eyulK zyuqn*c$d|YZ(LZ83FnDG z^usKt7OE(Mw0<2$OIU~~Do9}n5#FO$1Gh~|zI1Rz?R$_mA21fnC`6__r)P#{C2V7v zgIOnt3fP#`#8R{};;J8)R*E)bmdvCmdFF?g<5*s1+gNqDMc;TRL$x&C&$P>msbL}V z3sV#=&%_&x6$`ev>iv(mof?tWX&eSucQJVnPF1t73M#A8^HeqpIdQipZ5wTMHja;d zJ6_**`dtRl-TyX4M*fYiImi~mqOawono)@OE@(WFZst_^U*&nsDR!^Ejvo2%^dNZ9 zTMt9T9P&PLDiyZl{P?}PjN8mpb)(0ETT)o#c+Y*(zRq8unDJ^Gd)PS}WPkKaaNj@F zcvdiiZDdR5dJecHchdANE2C)0c{52+_VzCdvyGV&w_fCX%8LRXp11(lVFsy{Gx*RU z1q7eKB)DE-ay|wmB2j#%hp*5OG(6)(SaVU^oL94a`GQkWMz1Aq;`A2eDV67)8wZfV zEM`hS$0)>wtC3n?sG{aK12QmQ_p+UGMXY*My-*tux7-c4$sJ!ua045iqv|oR3hZ5r z2as=?kYy_UBq638Eruy1rq^A3ZROo-Blyu>hQ)jTYvwvqZO$(f@VYc4{Zcm_@Q_*gJsc%V1;F31Joxqto^PO1qR|EX=O(`x`%?ontp)qe zy8cJWCpZgF3H7$L*x8tte4CYi->d{~GC<;O8(iMmV=I;>ZzD@y|FXOB$eZvEVy@Sa#=-%?EYxsn?O`a;xSyc?CH-L1KHM+#UPr943 zIK736KQG+q>Tc%oBTLAnAT{)}Eb1GLj7kX1x(vAtvNq~Yuc0b$3Dz7=TEU!gkHK5tAPsING&(*%14B%_$bX1Jf)1K4YjI+P6 z^!0VXLH_7B)*zXUcS2P2a^)gDt0w-g4Zu0&dl)2>c~h9g8$WGN&#I1aO)fL4Sp0NocyKF7VmezdQ=V#K0Jp(kv`!2=AL9K}{OuH+YCmi`V}G-AnYMVvk&R9tc$ z-Lae$MMS7H*}>XfB4kVVXEA_nW=4wgr8E_ZryTXT@bZIOcCANuJSlB<97FxNO^@fN zwjB>W+qE0Qls_1x&1>c&RGW=CrirHsH|_H7546xcVpYca#-F_^2Li#pHPDrN+6LHt zY&$P&FOBZnO3ZC~G#jf6*Cr`;N$R=y8>i2; zofmJxH?|tHC`B--7QOsPqwmijc2SexDh_^$Xvx4i{^(@Y!&^aZnnr_+T0uO8t90cFi2x@$+*7 z{k2c7SM5KLb$9efnox?wmVLJ?WqekNue{<{W^#EkF)?BrH;+$9s!fs0)OaX7I=pGe z2iIqN#N8AArtL?lKbG7>{N%;<`#z|C;qrQQ!{9j%YvW^gIQ!-skSGhMBEh|I|TpNi9uhDZ!G87ODwto z_&Q^piE;yzCHII{Ub2zMK$R_#veFiQ5=t0UxqTWW`}!D|ZOVKQ-vy4|?l-4@1V1Y) zi|(@^v|wi8M(|c)6ivkpIX+G&V*6dBzVW^ZDl=Pr$T%8mBl~uMm~1@trJrd|uyi6y zmh53g-oNeHgGWzqe%|)hxxN3qeOK$!-U&5dlz6VW(-3|gYggc?AcSO)anqQ`QeXOR zly&oi;)*Uf0Mc9PzRV8VPJpPdR8AvZcrbG}&TBg;p_F_S;Ns=uJ@?xM7N5DF(uiwc zo%kZ3sg(>wq%B6#9%xI%>z00B2JejPus^Z zXVj(WWEnzS@oruR{!-y)?@^x^nwFdSPyf-I(C7T*L+AOj_&s7&$E{g#aoM`Q#r=hHwI{CurPw{QiGJ%)@}+E!ipAyUeB9h$+tPvdA~SS61AyU zoPA2*Tb(S$&|+UpXjWC@gX$JJdo&qK!b%cVNw>#G=lcp$W+?{q*m|*Y&KKXZ-q(p* zP!F(mi1AGD+J($gphhF)Ac{nx#e#bDaf*z|1vK}TCqY-%%H9gRZ6Fjc!Uff53teNi zg8Dix)^hPP@KbX10oM%G(*r|6jF4|mgsa?UKQ*^M=pO9~@o3y|4lu;NO=4pePkW$j zFphS5!b;ejXUa{!;vHw83p*s-QON}jzun?ciJk9upSti?8W@k&Q&zp)&{dCJg9J0- z2`zaOch!%aJn9uAeP4}ZZR}08S@m-b8mMvrSNK}?6H2fSd#@l$B`PcL%Tw$RXlxNm zJmM2%frmP5jQtl`zcpkIb{Tc=HW(C5TzUsCqUH{ff=NQg;9O$2e1r3e-LPo*q58)6 z!p7CW1)zHn$i}&Q(c>8aTQdU*6?8g4bXhvxgr&}ieCTu<+9395$*b9k%)wPx3XXy$<^ogZN z34(A|IvtUq(XpPsz3r3a=o@m2V75W5d^oP6X6*W&fiX|M_JR|2zUl#1ZKW9&d#!l1 zBqAw5bS`72w`HpFj!orjNT~7W@*Y*@V%K9ZWbIekM?RO9gkweK6DpBX3?zW^AB;2- zqpN)yqN7jko|-}axs_->zpwb3QqT$AHhc13VDO2}#pPUJd|8qM_QY0M(HHA1`3|yK ztR4XHOifRu%^z%WOn(T(A&KO%dR0BIFB^E3U#v|Ma4t-qjl_@ViAgMtv9&eT)SvAJyfhP%wrnEzigiym8V zY2D$pIIIhFk{y>%fKHQRMAcg^SzEAWBp}Ten&J#&R2W93e_JnwG2z@=tx6t-dbV|T zHIz&#adkFgzK8hkA%2-R%Jx&99jzp>uA^aS=){@nH>FMG$@6P^kn>Icc+;Do^@)vH$>|X0-viLNTFCA4mTu)V?b4Yn3Ra zM=kSB6gFUhYR-sn>l5}XQAzlrkjiCwsL#jK8%3a*M)Y=|O+G93EL5p`4|>s=TCyGO zD`768V{p!98Za%WB_mLo=S_m=^ro+fTSclz!Kg~d2CaenC$zHl@0oTH+T64h4yJT6 z|1@IGz;uxd-)AD;7ecPg_s?7D=xch-i?oJrpL+k37BZ(p)P(ZBTKA|AOR_WEbEA?- z)AQ-t3;I%dwaLb|-JJkQ_kfbMZinm9f#)l8FF%22n!khG6od9cqgsx^MMd?SQ%Eru zC2LEh;Wr!Ftdi}`zZW9i|E8bGum^s-17uYe;`?FlLP@8m!i~wqp3kpiAd2^4{X>se zwH;jOxj^V2t^tcQk3?KSvqq`+vLsBAx|%hlT_l6(4s$O;!O_F|e8) zq|X{DJzmkvT1edgAPvM&z&@TqU%&joBJaQ$^1EXF+s{P*$7&$uQI(g@SQi|72yg&V zx}&Tk5yoxq3R{H9n?Qt{te|DF^+tEHM8S`{SF2g$-@QF?u}|cE2(}lEFJH3bD@#%Vaa_|VwH-;|zUQ+5N?f3gtR|GvpT2~824nW0;=HcDD z+wi}7V!!uJGY8bJNB^6(SK@&@ry1`$b##(DZKU+Sonx^>MtEzSFK1PvzZOj#a1>9t zH9J55qmcnG1>qKFVrnGtc=XkASz^;Syn=cI?yd|?i~8pfy4O16@}ly2!KJkwA$yKD z=#=3VpPsLMPy7v2RLu|6>xeX7Do(@+TYDDO@G7+=v8WFTZE?$p9Vz5Y5^AdlH7$Fj z3IShrq%q#hyW1S=FnjV*GNJY8MA90s{2|A%YHubD9`_sI9TaegznE*XLZO+^##knbZ?%- z$;HV~^TJt%7vFpo+$WFAM0~KIXfAu3JuW2f6Mx>beGd4bw^>@(Ny9Sp518VxcHYM2 zbt)z)6G|(B3|H@?;6Of`DW@edGZpy`VxwjEwr1s;7 zcY*Q{r%;WSR=RUf1=ycY8%AJnDIvP5f5GB4r#jV_1Q~8<#S}S5UF4fD7A0DHJ9rR? ziN+|UveM)?N3mW#l^`7excZhwcC*Z;vaUaRGrY3>ORPlOe@DV3b(&08zNjqrBf4Uv za*UR#srdTh9Jlnt#xuPcN_DMeYTng(=Wfe&=d!5hmOiccX*Z@nzm6DDTeH! zj}G*InK&$r~GM4R>0o}T5(j0pS9Xb5k+l9hUCM(PwzBMM(al8aEuEmBp7 z7@Dqf_ERe&J}t9~Z?X0B9t8{@Tc@Vx#~Npnm;8AD@{T!b`BSYe@krwNG9BY$AIQ+q zFUEB96SeB)x+!Q;dWK4&>DqIpI+W;(MKa1^uRA6HDR8fonFERtkN>*uss+E5cwuX2 zjv~RY+O`Rwf=S$5&anud`ukz;Nzfr_>hc9d#*ie=@|$w5lY3)h8Go+dX#XYEXelA= zWp1H+qUP2|=lXY8Chd^e{Tj~b zz`TxWth1S+QL#fT9am+|Z<{U8^j^!vVk{?+EaXL5>Vr<&{h$TAG4JQ4EA5iO;w8Rr z+ggU-qKq&5&3-SY22Fi}u(a=>jns$jZHq=+Wsn1XqeJ@A-idb(3mshzXg`_&@BiGNW zE8atN&AlR?%oboBe+CWM9$Nis;#PYuoKFlMSYyC@(cf#1Ry_@>TUEhnlcWAjBrq~X z?jmaSQ_gip60_U3J{|vMt$wbgLqLhmY_kt%>5qEk2^14$E=<03jwQ~y-ej4yDVAgA z#P6F)DM;3|B~JS)GfpCxxoL0FcCACPX>SVbM@Qcrg=mEtFH^3~&_bJIwQndm0j##^ zz8+qjrSti@x0ol=kYLx zba&jxc3zqZie`!Kstlza_qe;44**GR0yPm3Ce_QkzqiQOTo8QY|5+u_;6%la*6hFt z`5c)aNcL7@k)b-kOvj;UqwU64siB_=7h9+k%!Y*eA- zL3XAk^G`NX#kA2SqsuFCYzPm#6bjPGIbL=b=RS2!BVEgm||a86mAJCqpPVimVgvUaf zW}f()r;7^t=_t8)r4fIFYeM)l3cY5~5)Qjcfum2_SqtV!vQ?HmFC8z980SZTSSNU% z5sNX3Q28_3zJ2Y@?docG9ZuY3l!_tF zhf>X!JwQ62gmTY>d}gi`p!TX#+s(lt*dm?l&+k3y^x6!w5f-=@<2YNAmh0fl?KPd2 z>2>QI9l7L!u$O^sK<8vM|?GzVSJ}Uiii|za{#aIeUJQmsQ4kj7y*mE=eZZ9NzHj^b}7aVvx@?caS_qi2wrjR(b|3;FOdf5b- zbg>m*-mT}D#W)y{f@k`%Z|J|PjOD#C??&3N6V9Z?P zvtND8n71o|6LSEAHO3j*f@<$7eH<|IuzEC6)iTH-%n8uwvy9*7lY~@eXQR$+A?3lP z&VBY@5VXCLb+WhdzUIm#sSdj!N<4M@8rp%S)Z(ZA8U;!lpOZQ*fc@zbI*nnJ@oM-K zKjbslQucgos`VcZ#tfk-ZD&aDDT-_ssgR06;$GTkN$YX0!Glq<%O==2GdK**Zdr=4&9lvmqfsZz!nC$R* z{NwVTR1GUw_)O8sbKNt}@b1_SR3*e>{HmPlo$>+(y^!Z^DYdvbOC;H+lO6lu*z7ho z75MqFw`b+=FZ=P^i~m;FCEqIJ(RF#sU31f!>Z0qlw7_iNk>jiFHs3C2GTSZmRKS2g zDyjQq34Tb}6EX+p7WnmEO9ChjlPp_l~x@*Q_dAy2u)y0+Xf_TFAZ2)BN@7Nh(iQPt8MYSHHt!e+|m< zMgH|EzK2{s{=D|gyF@dQh|^r{mRkIsq4%I!>0E(EKh@Q+Cs-|e368vjU~ zh6IVo2CC8W$5h)s=Hy)S_bE=(sptYu%FSC%q3T6aZ)nmXRUbK$*>n{fi&NODuFpVK z?HE-t=edlJ)G5H;7Yl)<*l76p+DU;t=k@kTnUBFXSaV&joEZHfo-ZfBrLUv^<9 z!snnd=`wGR)S8-{@Q*nc5OadE$}qWUY@^Tq&GlE zZ09vu#P*MKLq;Z6Y6Yc|G+_ct`4uqSAXtz+seDa4TS+oKyu zxCugT&b~f%Wfas?CnkV3dSmcZUcS87R<=?0%6>+eJC@za)_jVfO z|E|50+{>7jF48P6PqSYv{*tW8kkWJcGCa|XPErffK8-DUx`pVnQZ*#xY(e=OrAnwQ z3XUFP%hMx2ADV7;5gTKI@H~wcwC0@m8DIaPpc%D%VaxM6ZWznP^z4non53X#bv|zw z`YXRf6ir)GQN6*W&{BfuT^h2(?0_=1{!{(tGZHULmm7EjO&XFj$O4d}tEs2);Vt*f zN%8*9r(CpGHJwmXvDVL%5Mxf%nzp%=%c(X?q@v~qw>DR~Yq-H3pX&B0UseghqSdl< zf{&kaAUu;Ayxz;(6;jQE5nzZ`hMMQ#{PPKKApQw==L^f5Ebbpq#SYJSDS(S{YGe#l zz%B0@t!IkVDxRm^T{7w~NTmMW1gHKChGm*b^*XH5<5-;Q#@DVnv#Ja#eo;MlBaJXX z6e*<{5Y;2F)?H4)50{L(;iWEmG%USXVZch#U5a{aQkklhVR3QI=!<)F|0Q~wsmUS> z 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

    In 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

    K zoz$nJB2IG#kB2znUgTrg^>}Yc|15igsd+v{J2$0kD4nzzb9lJ<7nhp?c77< z5^6yAe{r1o4YF0K&i%*p;Dgrz%`EQ7w0(DnZXamQ`Lqan*ZesAJP)w6e($z?Ukxz# zIu9_n_z+B<3<$EO1fi+GZd6H^nlX29O=>?A3`0>t96nsVH}}lAM#97>dxUXBGY6S{ zB~i)n^L;gac`8Q7K6y9KbH6D_yi>gr4m!^0Ix-l_@J??=uPf0ypbF?O5W$C!>%GJRvH$<>Xz5?_rgG1+hq{G^t|+ z^E|lcr!n7B<3|k=nQEa!aAk6=$ewke{L`pmQFeB5*WPWxv=!0aZ6K5{9baPCqnIb$ zagJJ8-6l>k3##kOn-NiDqRZP}rS|&JOc6s?P^y)=1Y8yH_}s zRc^XrbN^q*z97M5TD{Hb!PW94J-)!690}T(=f$vb`*ple5o5}HHlWvaK*|)ACS`(0 zmt-cxap*@!+c0aD?}K2nw4r(hqI&>#`GfxUS#j^e#vOas2_I>@A;p@rKv}2j$k4Ro zOt{7MC~gpz%GP_3J6Ss0i*QDROqlPnzXfwC{ivd)6D#DqLyUh**z#rl!x_=eMvFvF zTiftn%nyr0OKk&P2yIl(BDE;8IEiEjMyM2}6c#e7 zOUbpEx|DDYo3}lJEc21K*av(86Z~M`Zd;w7uMpj-FDKopp0^7pr&eU8?|whgu!G^J zTh^HJjY;aX@aJ8*b>sm>A;#KP)oX>TT4v_@t{Q&h zVcCMw*-u1f-u6&z;2f3z{*Iw&n4KiGyOxBit>&NX{z)xqS?i#+xL+x-bgIbKZo z`4FW8WsF+1fk)u3mL9Tbe=Y?q&)wR(6~Px2oysJ-Zb2#qBr45N$B^YqGBLywiSAn! z?K>a&wK!mseUK(pVO@;)M?nxW>iDzMkKS$zJ~0ly|F>o`m(Oux;}2*Hj)_$$vzTP= zLbX%h!Gs8iWM?|mOGs4I_Xo-Uj}`zYJ8l+A82uSS7{DYIFQ2G`68>*M#;}E7VB(oW z>jABuz~k&egRGa}ES_lsqy7A6J#Lsl(6V@rb*LKKX-Xc)@IQ+W)B*mCHK*f8UM)_6 zkb_m;NYcjN%ye-a8b{3%P<-PCRIvZf_GpV}9UidEWVDN8DJq-hSB`p5TbQchOY?-s zw2PCmhfI0mz*xyOKa%|#x4ffruTD(KX&9ed0{FF(Viq^#*%u?6@E3`=bqa;<~ zt8U!@T7iBH7G;GK9bNv!4TBLD!cxhmS zmpu&N4{-{gFVe)fCseBLBujCPxCrSmnt?0Fe;e592q^Y`g9P0|e*-8GPO)$7MLK_%`%D3}O1{@-9@UZ&Xpn7HF*Q8SQ$&zoh)M z$&jQ)O;tC6^yiwb1*M@ z&b8b`g{jr)R_$kMSvcFJ)v}>!`YVpZxB~{%yT-1OGKQ!CZ?xhZ8M#D%nuzm8w~HIj z9EVjN1|{duF5v^3$Mm-MjtDjt#H_u;Hmg1RUI#&1a?@vXr*12&PnaOQi~EkincGyP z$8hlW0h8~~L1%1e5XD9R3Dcj*=f{whCy2lHQCE_ul5zEdpwf0>9uGif>R^-Q;1u0G zyBMNZk#-rRYf5P$I)D2%-S46TO~PEwtrNGdP9urTU>6&q(6Yq$->oqlqa8s_bG- z3{6UY@c$FudJgQy{Lf=PP%LAJ9tL56WgaU49a1n+z!_8kExqlbeDdLf;>LgvigVf$Pjl8Ow032Y(AiX?Xe{C8)r`f z(bN#jc>+kC@v{|qij+l>=W&AD77>P?Ojf^BrLFy=^&Fi4Fb?t7_DCoXOsxwh(r?O# zmo3hZ;|q+pz2~Ef#HVS3!KSY-n}opIAKysGWn_H?+Z%;y(*q!ri_jP-W5;GD7zUR; z4$lQQy&b}@bKQ%A=3J=F2#jXpT%W#yOl^!0l1Jn#9>7m_ws7s_+uDwlqC#orklRJR z_Avrvr_VE{?oYyi2l#od@5DE*cHQq}&n6#RsEYkslsTVBQrwc2OGTZZw?Iulc}XQf z{sPrUC6^$(e}YCjqYyNC@(qnIk$TM2qyJz^+c>-xN_*dmv=QCAh8rbXJanBygN$im zSxF?J1WBbXc2iI>)5}&sT{@jia)UQ(d>uJO|F)4+_^L}`LKMG(PqqnbueUva2j}df zceB1~H#-w&<^6db;xO3;=Il?Xt25UK@c-}nd466ggepQy9kQ&%OYc?%?Z;XiZ-yH4 zdf+w$_Xui=7he)+81Q>V7|YaDc!4={0TEc0EcmrdVX=RSassfBb=u8J#jXjFeOHVc z=MA|fNGGQ$Ym}tM2Bhdg%Mwyy3q|ksV^V{Qd^AelZpM;$*1omk+m9ccvV25Wf!&b* z-7?VQyWMm$jyw>h*7f_0TH6a3;Ej>vCXZEJq8)C(4BPGgx_rE*ZVDCpo#xZF=1-sk z8{8xMhWE74R422IQ;ZKc|2IXS>oTxEuQq%_?^{5EL1kPyMMzBozllH*&E5yer}XaKgUsp2183_hOh`lPNgMChJ6YZV%s!9^Y-$`+&U&-cJGSS1IBu?lCO==h zD%Pu1JZ9TiB7BDkoJ%eb`!^=}%oj1uWV!>NQVC8*>~Ny3*7Ci< zrt-6==x$SVc8`8ul;k=_Z$4GY%)%Yr??41EwVRc3vO8r6A=JrIZ9Uf?%;mBDXEzgC zDt>r$r?bGv<0g^RT)Ju(Rm74(c!#x8gX+4LwwOyK#ck8)6TX~UejQ2=INtdgF}Fh*N}(6A(g+4IwrUGf`%UsR)RF1jXeDq9sRei zDiA@6P04zLIoSk;`>HxutB!h83Wf$6&r5=?<@kPz$wAI?(5k5k2gmLKKYHe;!bM* zZq%fid8yC+0pjpnCeWWlV7v8B7KaCSz6VJ^JMqq1o$`bto5gtDlzdyf`N>mlu=7hH zc=^<*4Ke++Fm@D<`Tj&VQY2Rmmoo(~r{4ojnq^vNU-Db`^kATNrGqiICg>9y8uA)@ z#)0jRdW$qjSmi}l802D4+1q%)JUQ!cZO<@!iSO!uhv6UK_Lf-DQ=s|Vt66wE0oBz! z6&gy?P3Ki?){uJqs`iUAy8q1dcfzZ>D@UW3&kSMYaI+0F?o1WLZ_MeDdiNgWD6CK< z5TvLcgy^+J%k-vg?mKm1u*Z!LiM|`11mgsZ$8X3hXfOPB%Y~p*v?qbdHNppemzVGa zR=b1boDT>`rh;XA)}tnC_J~bxc~^q*E@*-Lx38O323ZHJh#p;3>P*N|dLFnX817>t zr&RFmEdGM`9FB$`Ex&E@(PQj@FP8Nbcr-s$MtKkK)E{W?IxI8hCZwVJ+hjQ>$p=uU zTV1e!u&O=ylL}&J%5-)mcrn~Y6$TbnqxA_V7+9*YbiTfH8;?Y;jjA)In(LY(L^I4d z5YApM(O}#(+V&TBXoG&Q^BB)K&T;{>j}$8&nsA{S@i0PTwS4RQ7EIm@zA;LoLt>{} z7@so_KI3!-N&2_WKXxaC(QF)2MeN}NJ?60~$Xg<A=lLmao-$k)D#(cTB5>-W8r=^NFQkj>hw_rT+4T-O9WcTn5|4h@2< zEPJU1fkM1wrLRu^h6x5uLn_h^ZR2h>cKe7m#p>Dq>LFsc^Y9)$}SU8 zbLB8ObBJU=iru(*y}UjggV-q}9QQC#&GLhmOTFLtjgf!Kz`G&}yQxpc__h-udxi!j zq=wZ|+Uy$X5KVt6b+5k`27lk=aEB?}y}$M|7B?XN*v$DT%3XdJ~FK}xxG zk(|qxF{`p+Kn#a{Ec38Erw6lq3h~u(Y&%YpXRWAE0Z5YT;X}g~n2uR^EX^4iiUo z_cwAk#w3;B-{zg7b+qP8fG#2|HDzHpB-el2Ctp#CCaL%6Gz??nzS*k}xV%Ept@XHu zOrdHjw4HReOz#PaeoCWME1et;v4J&s4eJ}^V^0yOKhRT83 z{?_9YVeW1j31X8bz{%RfcL;Ude`v>W8tc5Sl+)&edKF-Vke~eiqwiAgt51p2quXaY z`qi;eVR=cgZ-gywlg0@Vf{46r;i6Tp+}6lZFJ>%+4JoE9*6kt4d3-X;+ej0L%=!AG zxg%aBJLX5%(CU`?Wj-6=yAt;s4lhQ)uq_o{#%K6bSAHW$8BNiinJB}2dyd*-BbJg) zYOD3F!>%9Gki8ysgq<-)o)oMw^mkr%0TyXIhGy4}=v@xUyMRgXDiY#Pcomos1~vDX zfAm0Mkh)QcN>(T+q%PdR|b%o0EEY)P5(3xrsS{ zB`ZBHO=b%d;+GOVZ3hfJjLY_xASy~*71`j|u2ePSwwmesYM!ZX@j|rY7?9H4pDixIkELSPG zd#`Cr?0@%ORUxT+G=JR8FoQ+An6*V!47}-`Hk%sFKKB)N{;**=@R{GMA4Pk%;J@ha zj8tgNU*&`eBEp;8fLFsRgg`m7KTrNy95Lmr*Q6MYUcL4;9ao8NZ&X2_YE9eS;1liL zA;bL~p6VQ|#O=T{-1YHmq{uRq763V8bi=hB{<|P4Z|vFVI;GJ!pg!BuU4u2c!e7#M_lzDa0lcF1iu3SFYXzO3syiS&i9qv?MqKq& zPhsl=l#ccO{{uBa%D(Qo5fLXx$@^c2Hm>>t0n!=G-0~WRDR7-F)}9Th9DQ^7_o<9# zYGD<_5D@+8*5ls?+Q<<213JxPOuIn8TgSBK(faE7d9ffVl_X!xQZ2uv)9Nwkf0&tv z5E`X3RQA6i@O$x(mwZeowMM7eq+0$7(^MoWGVGKK36TzlIZdOwLn?dq9H>?{a8faG zx*6dBU|I|30p%fvHIKeV5><4BJ;6XrDG$>buat4ELrlxLbC05Bk3Qp+*2p{TUq5-7 z_{w}E z6oz9bIv`NmV&Hvb(x=pU?%e&V6P~|?XwBzC#-y)*#-f zUP%GHK?BRqVY@b&^c;q%QR1rC!Of&GY^WUkjFY+jItB@<)7^K!Cp%?enCtYr9tc4? zmm^oo5eAS>PhpsvYUPwL3Nh`g9<`l~-;tj=mw0kNW03vrZ*ekL_oU@mOh1}U7?79H z6WkLwUi`nLa#xd{z@H&^t%|4^E=7kSWX_3orkEO%aMn)GhT;qcy=0kgadv8GqSZK; zc4iae8+mPn*fBTSjy@H!@Sp8&;m8Xx%l

    (l1h*%*=RG4Y&h6HP9%F$2{Hu} zH*K@{WS;d;pHMq(Ozhvg4%1Ntevay48=_Id2auoXBLtitwuyp8l$Jbs{+RONi^M)Y zh-IDoyI);KIvCahQYo6XWRnuZbm_L69Pe!q1iu>Erc{VwxpZ0$%KPtt->|$o!@+JP z@mSZZd;q2;$rhi`X*Os#NB6mqwze7#4t8FX%KRPu-c@g1amr$P;Ti2_gLdn7N7rYc z3N~KFeSuQK{6ZC_B+Z78=P#p;DGv9i&fmAk{QMb+kajb<&+$W`v`eR1LFpovtx;+g zA+C|1^RKSwoN)Wy71O% z?32ol?tdZk9Q3Y?!Axs@sM^=-_OWl6JXOnYvCkJMPmeb+?f97*k6#u_kN>V})1A0o zNR2k{Hnt{_YpE1>;fz9BW6WFxgMNd+8&e6C5~(Lw6K|U<0Uv!a`mYIL6n)Uo10L|P z@Id-L08tnaMWg*ngTdiMvy@5lPT$`{NHNjoSQ`?{9YYF@MP!&f;74JIHq&&wANL^= zh9Q<)!pYpP0uhBC2*wh-FbFX1+}PeeZMdZKk3ht^R_}}2b<*dxvD^ZweCj-SH=urY z)dQ&v1Jg<))$FbPX8_gmXx5ftu3_q!Sa|(7I}yOJOq`UBQt{w@S~(@~0~*!07=}%0 zzJ%6m*yj?@Y9+ZcF%D5UOFqAR`TzCm28L-TX84_!$M=1j)>E2i!}q7}T}6RZ4u>bh zXQwp^Q!#Pwb@s_mJD0M^My-LASNk69B=-i{Df>MB;c9ZUzr9B$?AKPDbK3MGL*&-Y(`&+g_H#i`uo0)|rYwdr?UY{O>x(v-SxUj9wfMSU$T~aCm~<&EanlC2 zHQtr7*R|Mt_Y=MD%E&e;1-|F9^Y%yD%@uz8-%Vp$4wd8h8DQB4pZ@BqdV90Vm&$0W zCv~>pzM#|n)yVPPw28JB+249Yt+vkmQi%ZK#)SI1xb^mdobNsuZ< zzth$)a>3_1`kfx_=4+%5Fl`Gro5RUu z&$IT%Ba?qlI`^EjYL(D$<7Nwts}TvIF|9@XK^xmFSjmTn=W z8YA(G&NKRwbNX(RcM2g;${NY(^SwR1UX4k*!Y~9sp-Sj^TMYWAgu&pwrI=%1Gl=^q z!aHU(T}R;cFsvM=J-U(^CJZvy;SbtKDM_UlxM%F*=@!yh?Z+( zx%UeuzloEh3dOl(;?t}(5Hh|eJIw=fQ;RIDKfWY>JMX@vG(UOe|K#vzw4qsgvT|jP z;sqS-eaG}t^6OR(Us0UPp6{cu?awc_<)*TUWU*0evAgvZvx~)%?fYAYSXy5aKihuJ zpkL&0?}+KSX_lU@W0?0dEQlhB<9>FpeJ+qn{|dtxFT0dVlAld;dh|Wz-9MpqhEKlu zpO{RUpJr({_vv=l&>H$(i$8rC_Z4bG@!S9Ol+#MQ;Bm9c2as}4sGa;w zvzZ+0VB3mTqfe!>h&BX*h~vYUQ2xVzS*KY)qT1@O}r!A@{SFs#QODyZdp7~N0=y&3wN2@GK z#>6&EqhV;U}<)>YL^NI@!_CSS@j=$+9#+aw|+@Z)@0 zA)`APR7D}Q8*R=iuO>R`0`z+WoRp2YA?NhH0aA#u#P2$8R{NaPsH|HX#!%MZ&^F7N zSj|(0gFVI^im;0i;?C8+A)GHT3n4Jx;~t2@cwkl9K*-TS*6Y{K|ISD1(eZ!Kzgn0S zaL)+Q$4M}?UP2Lp zjOew72aquAgYRS6Et(xc(h6r3fl?B<`JfOqs_&ScU&a53aXEf)0HVn0{tv+YGNFXf z2%$LH{}G~52~Obq7?zbN`4d7h=ru{@7D%}k<%9|5`#=bdH)!K#<_H6CBp=Ej4A2)7 zdl4Z7@8z=EYSjLJ_TD^5wlpp8`faziS_Vj-Dy0uqUWmQ&X<-VNV zf1KK~@?_m@m|^gJIx6CJp6$z%XZhauectC8*!E!eEhc8a96^*wk6%F*CF=WI!9pLp z?R|`B4kI3+wDtz+@p)={Pp;Iqz40cIc!o|x!EsC+yN|5s#M24PGa@EW3d^+7WF1j# zhAI+nt==SCT;O2)1-i{9kwk(_AxCAajOR|E$`M4dH&V?o@ZsyAN25$#nxnM59vGH8 zksTW1UQ4o=(G}*E#*(iA% zW9{zhneS+^a`z#NFI;Bk+9kFgtYTX>j_tC&QDSm-l3X#%?#AvH+)!85RrIKiZ94SY zT@vX8l4esVOc9U9xcl}WuwU9^zjS<`oK|;(o>CbE8QZjJ)i&8$dWA^zy#vP(MS-!& zD2k*|S}S3nqkAc;%+%!^hL+;t?d4F>m-Kj)bb6fa^$jw)6f5`E256m=^9d4(G<%yC z#RZSuowu;e)3L_W6Ra)Wq~8ly*-U0+8izMRm&tOFOl#DFfN1f0l-=#O=yihx%#{}m zL{Vh_$an9w%6EFKzL}!g9Bsnw*d40-621>tUr^cIxe1J;C_#cy5Op5h8Ls|ceNm-x zcndfU;$UGqeZ6aG|Fgt5lx>))2E3hb!17VQEQwe?^I1iHzJ6V zNV9fGI`@?T*nJzzED=x7phzN-Oo~>sd7(<|F=RPKqxz6c?h^f;6uZ@*KY)D)^p_AW6864GadZ zvKq(i?&JF&o;zI4RFojNSJWuJcQF&_uXCl(a~^#yUx?51sSyN$-~6?Ij;0O%Ccpl# zf0y6;{ZEB%BS{kf;G4dVul)}{Ks**@tF+7S{JW3y+UIV4eg}8%m>>D(ujk9Z><0PV z80#C`eEOBw`J+#K=8HP6FJ(yAZ+zuXez6Dfr3gXr>6j_{Bc8#ksv(IMra3}LK+}e( z7{|~I9nm-GpHu&oC_ApIWz$X$hXjF%3jFOb5*V#f4JOp13-TrAHNf~5WClXO< zH$>uzB)!h*?_~9R#1aP8-71HB?+_o$V2w~|y$JQ{ZBpZT%x>^Q*j9yhqlBg>XjR+9 zlQEjL*3p<$@SvTKo6pFL-y5<)o@DnAGR6a>89mR9|q;fgN z3t41Y;$Zh7m7N}qT4$t8ek2wlmQwM3k;XxZep>-QhN2D{xW|)mauXT$w(nBgcZaB6 ziYhaGC4Um|h4mIC(+S3M8LInh2%u9Pw7QiVOOVN>sn<3cn@E!xE3&?H`W({@ zm2@V@ZfW#+HG88UY?oh*v%kAUDy`u-3dNa8mhT0>ZF($5DwE{iy49}}001BWNkl9GovNg~k*JEcQpMI@DuvAtQN*9{Uyi`PWj%{4lmD07zt>eVIMtr)HsrQI4l z2eX&vSbz9zR0v5|26F5$IzqYE!@m-U6w2dr1V{r6W6g_{K3jQQ8gwJmP zQz&HlhOhq+|LFUEoR9wAC-~iueUjh(*e7|gw1zw4e*57c{7&Bc@-=?-H$KX5{o6mJ z)#~tHe9yN~J*=}aqAlZD@niqwd%3hY%WwYQzt3;~&L6SAf5^9gRST_>qhL!1WwMQ+v*_88k(*m z%gVs2~BjizfPv#FEbQp>bhxxa!cN++T(r^m~%z3~ncQ-y*4!;7FADw)C< zQ_13jW5ODXErJhI&7%8dlJdm4O9OhI|; zb$VTg;&h8EFC^L9e)p*|?6Y$%UU*NEO8FLo2(ki#kfPNLpY&dRQKfcp=VUB%^DQo4 z&#k;C-CQC2<_#!uQSNK$NzK zrX_0o%ZOrNZm-BGWO?pn9YGW@Vj7)Bg;u?bD2l|>Nn}O9?DuIknj=*_gZ{hV+Lz=p zn)N1@WumGY(RggAC-3~Wnm$48U==;04$(MI_g}>KOpGI|2hAwbt~U?`_p$x;&i3|& zFJDHFoD!&7-2#^B;5ya`%iug@ErRE{BMt5qErRd)Be#DPL`g*ugpq-r*)3nV{c$@= zSWlrKD0ogENm7vI;T8c=G7tm_9-|%MuXCmEuNu8`Zl=ig&K`|si&m?1@@I{(U>UEsg{sbA!cx9+f4 zsq*S;@9YvscI8S#LA)NM5}`xd3On;7wJ)G>z6NUnz zV+8gM6KMMTu=?ZFtA_*Xo8_%rj7^U2E!6dwC_UU@ed%+g#|H!ZO8FkKbU0hR(+skG ziFkxe?#%DyC)rtlGZ>rIqklwi709u<^eX*somQtsex`tJ_K2n8OkJ5KKRtmciR@SQ zDNIeA1g;Q>!U)17<pyoxIRbQ;R4> zlRA#$P%S@X6^Y52Ec>M; zb~Y=abURUk{Img%#KT+5SpBeoPh$4cBwK4+2vQxZ-{+vbjx4>5EWZ~~gz1GG>r1cT zI6kpt5!*7^+giotHeewTP+m6^pJjoQ*kig|uALuKdbMXrt^$uUGp#)#!G z`wz*Er|EZ3uLnU8(4#88?*R$o=_IoF9U_^_LoFDkUFw&d& zIX?fGotb27D+u;w`O&?i3-eQyw)d#)4_+(xAFPtkWzf&u1F2-3ANbyHoGs;_*{$bJ9pPyPu1$v6J3q0i@Li`;*(M*AF#YiFmz{(hC&naL*_*K-7T z-qZJ#@O%l?$YS-wDUD`#i>NWIig=8Rf$xz&5i8u0lK+KRM1ty?uJ*CCY1W;?3S*yqKj~Z{XN2f)J(K zTEjLia=9FmtkUmvu`R$)v2pLyOwPZbW^IQ=x=5$lMm024LuSkvL(!smqR8Ckc{bNJ z1_Ca}cG=n5VS0X=)Oen~jm?1`H(j5n)93?zB&9_>J%Q`?X&kIkoc#cabRI=j@H~%B zuTQsC!8UuSN}7JRkJ&eAnLPseg97nnc;E)Xq%kud#}_;VQJ}iJifd(naBoXVmWV_n zWO7M1mTw}8;r(->D3H!+9PDgh_QHSfAmA&o{_rml#2G+gZ|feOI|l?6yoouL?Tt6F z%qhkSZLGdZdGkJw6;zFHd_@rvooZ#YpV>vY^g@iCt(%zrNm3b&%yh3v#-%zmHJ+AaG1D~Mv6Qn+|4i&qsI zwfp#fV7pM9Zj;Q;V)py&?=Ca9kfK??1LTlp4_Wq6wFtF?J$&CKJ$8k+9+n8J{7bTk zfWzVbXeHjqg`%f%9gBXaN-S{$$MNZPg8NLAMB>R9rr9~_!-iUA8Cl7Vq!k~d-|ZgR zHw1PTHANCxft0cT6GX9K@fzUeB=*1Heb8S>{8jsIGcyxR6mtB^FaI=|bdufOeg5!| zU*Y%v;Lk$maIbvkP5$DuZw-AuKUbvF>0uttrHYf|{OnKt2sdAQmtXj$|C3I)$MvfV ze9w1(6Y*G-kALzn9(#JW=Z`O`mp?Xkx79H)3*>3a&eo`Mp2A?URl z0khw@FcP?ks^Ny2yB*>9Wq6UonQet%=&o&HyX{a@Z&_8*BV!{gWEa8rJuIh>W;`hk zK|l~B8nq3K*kI6N+iPf%II(nuNObgsc6aNIp$uuKSwdC};_2`zi)ti@girwiG{azQ zGK-?l6N}|gR0T;0ED~Dvb!0X0G3&Nln0<@w^_%F?M`tMG=@erV`2k@VMO{Gf2G93# zVCQ*0OSeCcZFNwMDB6*-nr%AN5<4n>cU9?y>Wo*KESd?+pF@L-L2Mmt%ywf;Hc z*=NrIC9`P~>Cu$eoy{F$@j#xxS#M%nHvM*wiP>ocL11&`HR9< zwa&M0&0`VF>MN~}IuMVDm?b3w&Z5TXb|oW0E&iR3ty?OW(k zg~t9Non~N3(Wq{)zqLiX*CIWhX6D)gxv2u05&Wi(ZL_^mLJ=TW4EHMoaP2ttN}Ge7 z2guSC<;`7I?mguGJ9k;Sb)UVBZ4UPyV)kkn5sm4E8D4nb4Q4ORlg@_+ZpRQMfmF`G z7lM1!b;P59Zy1R&joeg}iTOOqu_W6YWuS-`;?buY8kb(2rQ0fD^}~N}%}^-LWm#K# z6~`_j%XJPbD<=UTz})o=v1oyQH<%21o=#=w!AZcU8!C=vaQCgzYMmEBmIVZKYSm!> ziR1y2EVHw|M5jHE5s{JPG}Zkeur-Vt-FAnEcV4GGLZR~_#3Die@%qC%G@F;Wd|jiu ze}CkwAd{ULFmAU@5m}bmT)9j2Ad4htDQyPJb;C!JRl4mKd)uoR(f4DUqZ2i!0xr)6 zQQE@uESl9V1STi@<<~Fw32yBW37b7-W zC`XS>(`j|7?cWcrq8|r-jp`=Rc=+?*_XTPPYeeIxY=P?DGDbY4+UK>AWo1BlQ`IJL z&rmT%Sw@fQCzcC(WCleYzGngh_hAUQNV1Hoj#BSzgYO|LPgk|@Tnhn^#0%6zWqstF z!gKq$ZXdHZ>`Uo;7NVpALa3#~$^Io3Q5qh`KizHzx>L-;orHkkR%z$acI^8@sD124@pwcq6W2t72+8gRa>Oje)RV?dtD?& zC3enCym2_}gLX{ujK*%@IyOdhj8s18&)Qu1%n8M_yt$3%x@d-R5)__Av$~9|YUF1M zLxG>!tr3Z*8J`UdvITz~6fpgExPddS#7dI!>$FqII~5ZFNyJk+I1!ikIeq zp#N`eX@#A&^+%pNO-rq* zEKz#+SvvJmVhR#QOhFJOEVIM*`gSOtGnSH(6@i&c1vEWEuam_;XTmN@0)^QWV+Dh? zrBCBJ(*Sf@y9iu59h*r@ei;;jq2_?o$PP07lfIcGzLR zGKnaGBqb?7U2)wuk;Uty>D!7TGdVjtv4-H&u9c9)X<})Y>fQqoI|u@d z<+E637te!MZIkBVI<|Rn5=>TP;;97DSOnj7kmM|_`X&eEH?gf2n!<^l%jhxZXg9+> zBm;x>iIK~LF=PjXuvBdlSsbRh`JRm+iWsrTfRCPa#>dZdY$RDnKVy4y-scaXx_2*h zEWT$V2nv?f3w^Kqz5{qz_S2~=d%lSv$|pX8VUT14)fj#sdTtxvcMt^`S&a@Y_dN?i zRPlWm&l{feI93oSDq0dn9S*|JS~`R!m!9J<2S4?*|B4^`iGRWU2dngYecrkCfdB4) z_}}M>^-~R5$0mzP}xU@LUAAkHaL?Xt(U%k=dvp3)2 zLm&Kd6h&crs&MkB>nf>K{N(>9CoWE8KIyogV-U~jolk+z5sm9{{Dhtc7ghQopl=2o z`Nt2?eBZ-$`sk4{ppI=0PUsxlMm3%$lj!4ET{I(wt3-h(c`^A|{RWB_Clbrk>zt7? z_dP7Li4n_FKRiIuWbBZB9?u0`AEVbkeR;U9h38sGl8zB~u+71$s$+LiwK&mul)5=6 zukBbSvZCPoK3i+A6H86fZ658{F>zfJN!Cf`E}=>it;36(;E&O$E|HJC@6_($0vuC3 zYn2|VdJV_2kyV9cE=^;9;e_JpxjvQB+Z1NMjP!Vx{Ze^==GkqPftQhFnM@(ee(6*M zLz3nZ1O-W!7@wVHXJvy*`2o??812KSfB9C+_nBOHADM|fX0Ja|oZuMEdXwVp1l`6q zkz|pXYm00zuMce3X_gqDc@e>v*xM?fRLNaChlD~r5v6rb$<#6*FuCy6)GMuls=8zQ zKn_hd7@svLJ={36jm6f=CX=&8`rZD3C4r`0rLujSnZ+-|Hm~6-JNRyn^5!1d@f0YN z9BkhrmMUVzvM8cQGM%JRdv=Z_J^t3&HZvOsPUjF`&K+Fb;$oE}HKeDZJ2keHgwv3z$0>&&xA zk#BJ6#c9f0Rk9N<<Iyoui^f! z;5W||f*z#(-Qd|F%K}Dpf#ymobl;DIc6*%aeh=S=YcFaX9^A(F$H`=)xUR~6<<#G8 zYG#bm=AeCpFHTV|_33p3n}*MQ#sz#XU6-kpZxf9#aCk6*tOy{$!Cv_FB}pP?-$9Z@ zF25K-Rz_FPC+8-p9n?dY$%;gB>;~1{CI~)?97U35fewo9gW%C^2WpmjWZ1jzEHqt5 zQ59raqEfzxs-0esMr4Lgd!2*w+w|I#jO8vvG)1d^aN#~bpQu)rNoMEiwFdiQJ*SPN zW-y`=x~-5Towo&C9{T(|G-Db~S1|kMSUv*yzKtjv*0`uQm7*5(F8?>XOck(+qj=)ejz!7O&7eJVcTw5zhP$qM%^* znndC{t-}VnLiVwJ`ud#%%x)b;3#S|nd~h388$MZZKyN9e8p$e#GzeyyPL6T+C<7sMpkWLlpHp&;uq+bN9AE)2# zphu#l^I7({AFa0d@XiA!=Yom7C_?el+(6*x+9`a`LyH7F6v*TiL^*ZzxiNQ1q*8vJQGJ=kIoMj;#<4wQ zrNH)jC3HPe5(4UGExac)H<6`TZy_rpdd%iv?*XcwMUsN|-qy-ZbYpZ?R1`(@h(R6(W(UVwCzD^G+vz{Ga^;gi)h33jeLmn?he&FMQ8Wn8 zalp0cciKEk?p0B>p`g$6Wkg@V>bFr;9T;Rf2*CdKs|ccw5zXVdPe_9lr@#l-86gxS zPvf~3mN|TmWhIL!iHL$18uTgZ(LL@vM~t7?x#f9$r;abH_~Gv|4rZeWb2Q@zxk~{;Q#sUKOFe%!(aa)#>dC_KYo4q7?LE7wAKK~q?7!_ zKm9>AHh1_Jzw{de_6~b{2lP#g@BW^DGDNvNkF!DQ&;I0(@Wz{W_~`F_Vql$Cv(4p8 z;fbU~JWBn{d;6ksJ;xxP*VCU8y3)C@(x>SOMtBW85}JOQi;8`|{}{FnLl6+fB#zx5 zP#ZjksvCh2%TqQSM-!9i7tk=nAS)9{l7{cQL#Im977&=kb3Lqn3{e_=F1wxfpu(EE zh-*vedS)owqpFwaHeJkK2eUt{bSRMJVEY!)xPpLy5jmYWtJ-DkzJMZ$m_3uV2cI6P z7g}F!f<6MND)mO24?Gq2XN5OGm>DDJG zEx!_sL4fS!pmjl|6j1a8(I-AiC#P%$A}u(woP@v%FLzN0jYS;6OhCrrL|j3%@+rkxmikUw;9XNQ(XKiL`h_G zb%R>9MtUsG%)%`3=XDBpC|RDjO>|0hqd+pw&JNltoEk z{z{J3`=1U~@RTHh@yP_GwS6+#KE=5hrS(@a`@y>Du^5sVrMa|OhdPuTJztuN|Ja>6%$;m3zqQql1>c?csZ(Z)R!L))53Nw6bA3MMOcv zh~`k$r+bFDZjai2xPmMM=Hc!LR>pBfMGT?8o`oQUEf;XS_{jN+PXx~s=yW~ee~p8_ zFBW{?$Md{_zt!~;f8#@6K_)ZUi@mro!+1W!(!+HiV6us4D9yQShM)P#A7<&{I{(uz z{`yd0wYzsfxxCMZzy5rc5~hmd{K_x?H1B)Q^~WCj^6Dm6FV7K=57LSY<5}|gF}AjL zA8TCCF^K2p?9YIbYf zjTHTExEy`s@Gh}b6306I-nQkC9naAWq1X979PGVKER(?*V#^4KQj&Ngg=5{|;tsai;GFBL4 zd}cZ@L+>9iBtsJa%eZ(G-?ez z&nG>WCYes5YATW>oxFsjl1B@AxVP)l%|6b^ASXq-L3n0u8AlVP&Jw9D-l|?J>sb(Msy6%^VnIt zjpqgvlf@em${V-ocEWqpuDl$fym=eXix5j#Br|zLL8sGv8_yeO{%VBs);lz65i&WG zbaot3jB>bd2bK<3^DN)n#c`hf_n4k(5ld!STb6JfpBLYwQ{7*p+letf(_-;j5hJ3r z@?f~SHd*YED>$ge7#pi1p68J-WLSF`Jll%XEhc92R4e!Cw1#`E3dI)rVvgFu1FU|G zi5Y>$;Y0e}VS1e?1_6C-f0%MEiUQe*F`Bg|wpB&dQ~175y}E>LwwaoLnO41XavvH| z6-AXmaEQhd=(^5+`4(osaU@8K&k9;-=xQ(@srQT| z$1x0Tpz0OX_h~h2s77pLGFFn}XqrCqU3U!M>tMuUc!EWJ z&#fOV3;*5v{Wg&Zq!Z6YH@*-!IATS8_jmq1%H@3=$K`$Rz0ME)z<2PmfBz}ocr&{vLyML4N?g6gr z^1}5+e&mP#A#c2Shfn?aYmYsy=Qzc4dgosfL{Y*W8GJn&7robf-w(~4x$ZWR#LVay zk1r!@SzwszBg!()2>QpP5mXM%5bFh5HIQu|CnPx5BMJ0~i5`ivw|yTys?ci>W()U9 zZ<5N*5=#`RkLWwmj0J>{{>E;nHIja*M=lLeH_s!mp>Qazy-F%~iC$Ykj~MjYUAEV6 zk||uJ({M?oGE^(I(0v>umP*oXweeh+?X}O5n|hJP{>3y{MO{SK6G*akLR%C>@r2g7 zwfZXg>6fTig8h`%-yoTtp?MHIpm0n?`3D>9);p0>)q{>?`{|`Q`xMe89g$& z6niD}WPG;eu(9$v^2MtIb`63MrPExc-Ke0d37XZAeimVZ-JLs(&%MY&sm{Spg$YeT zk_C)hP~}~?HplYam4W-pv0ZjH0~+Yze)WVRYMTyAx0W!XU8d$9UR-i?Dc5ZIv1+oeW9Qz5;K=3h{jVKRJW;YHgN30Nui=D z%w8`LHBxM?ZlD@6d+T@c-I>sRCNeGv5q8$^;W-N&7d56XrO=cpjcS`n%))hDw%6`q zn*p^aolSxhq1_BuK+WWm_)e5oV}hx<4)N4fV98K=fNj6TSU!&LMyMT3kVq?J@(Wm| z$RlZn4rZ|5I&$W@ocTkj0mC9LxhV}%lIS%1sCpdV_h?kNQRP`O6KVRr9=#*Vv=LR$*!}n?_d+DLh+{YD zG{#i8c)$~wjN0#15kAxD}>Q; z7Mc;kGW#ceSLb{C1i>SgzJ!2})f+7oB`L!_al^-&3AJwUJP%2c5Dy@RT% zQ{B6ZBoFu7%BqTETO)&LSxF$P5i~u6*$WHI0{fRRdaCR8@qBTlB?AO=k}#EM2zuyk zvyEjQ4$*oc@YAN_Zqz_M)q(SP>MjAc@kws-m0|JTR(vrm66 zbp5aS>i3h)ruonZKfs4R_<^D2-}+tuCARIbRodl8|M5TL+duMQe)tE!lXNP{=2n?s z{f*z@)tljrfMIPu)BA_pZ@vh`0d~MqbC~I zbDTo>`yct?=joNF#BSpy+O6&h}m_9L|!g}ZLc#v{Q(R^XRq`wnjWLmI?Wts z3KLjnlXh+RWtk~V;JIBCMPYyEfM~*{(>$jHDEjCzk4PlX!S3kh;!HlnVP$YqZ(D1m za`SXXXlaa%k5SzV->2DMA(LOE(}Y+`pxY8iWYTn+O>EO9TgcF?HA$vZ?C)MIHjo+5 zA<6=WyZd;qPi`{H{?4NX3T7|QVtcT+QNndxJb#%5#w;b%fhty3cp^d~og`Pt(e4gjoDvd|NE}&_krf5Yv}kv`blba_y$-$BqlJK;7Go1pL{XyC zuo<7sa(J*x<1qYqq6Cu*DRd=Cd21gnB2hnR;<=*}U73PPqq>4?PoI328cR@^%CY`% z3t9FtVm8g%24-*e=r{tGUzlQTsXUU_dF93ws}IVUeTSKa4n}O8&E?zlx^qYpTz`3* zhxdZz`H3E5<2kmL-=*DNAd`)fD`+g;Iee_%+(%({uEoryE9~!e*<5Y2ctxR6+hTJ) z@Y$PRY?3WpX8HcR?C%XufTJ;o$zq4x)K#i`Z8lfCy!8GVUjK`YlLW{7r3UHzCDxa2 zadkmfN2Si$8$q4O6@XU%CyNLQ_6h-H7|6pWb)oCpe zjb8~}b{4TjY)Dx&k;!3OO?qwf#K-hJRL!N;*uaPuhWh$q$rP^Bqt_WN^b&~~$f{2B zaQK{g&H+dwqA+adV)j=_WnaekT>2r(;KA55WJRId9{gUu?_l;y#F7j2I=d+9FeO=5 zbVNy^kXk{NpU!~(IiBM=9uLoZ`kn!!9{#R-aAZ{e^fVOH8qJ??)i#jD;fH%9K8+|! z81WJOdEdwL{UZg#K^)se$nuko+4F6DJerMaKrb0OCxHS}m;|>V2*_%TgT04{qK_yH z(@Q*0AdxE4sEu$pK0+9EL{aBal+is9qBy$kQjaVm2ti++D8vy20nIQ-j-`W_=TRka zYxR{2#|6-=ts*Nr$?O=SBqE8@W3_v3uDlLFwpc)v1Vo`oL{FaCRv?wlAj!eCQYk+m zk_aX@?Rp6#rkpGj{0Ve*v?YTiDNM{4j@F$-BAoJ<$iz_f#}g^CEtk#J*NHx&?=d}| zJ?XdGTDytsc&sn2V`wU|#4v@;v9buxskOo}s+A7Df3BM6OQ`BqEYo6ltIXu=U@zV= zO6xlaCqY@B?bWyFcl*R+5fm*!rTifLJK8p-wJmUl14-L-SbMNWW$O;v!l0;1v({kc z-ZHhl28tw8-Cd$my3NkUF3a~Ga{t|X+v zFTU>v)%zRtyA}vN4)<4Z>}m2vh18hF;tK}b8#hA(J_yu0 zw>Mrp>D@EUIGYb|(d*6uaOI^G+gqp0Gx-U2H}BJKF90wxEm5u9`Md;tiXw9D<*x)_ zW2K4fKq@m$X)~DU8j-+jtyb+01$+Rr3o&FhMyJ)Hy!8&Q1Ko}{P;u8|^R$~*Xut=c zMP})?EUJ|_smxVs`$wklbAva2IxoP0oKj5Di2D7`3EIR{s3+LfGyNHrBu&@1{yMrrjE&WLZbi z9$i&9C=c6>c%F-*#!)nPfTDgDjl)$meF5p5pPlb*9laBj3v~u$MH?xIBg$DcZFDcU z=h?XK=!&V`-wb>f&%t$0d&LDY{5>E_!FjixXAr-8j^}ue$HMcV?=Jz8907ztiufsE z_C{yyBsov3HT?2XbpzoM&DM@(VOfKoZnm?5<8;s?S$r2>Aa3iOd{&%%j&0r_Kn1h;0r}{?B4m4_Z7iT7G?d<8wrk;V((w1Kr5r zdp^xt6W4KZ90y6!h$Q1w_m_!h6!gfj(&2gZIzhv+s%vHSW#lBJo%}~6WUE+$q+tisqP&h zi>EK$!%BF0wB6hwo>my2oqD8~7J%pE5q+6R>>{s4jmd=>Bt=Bm11Wyna#+6m3W>CF zVs?HOm2#C#_Ed!B7(z&<`WR=GInM`vmT9rIdX!l3CGaQM+uY;!>-VVct&l4$1~T~} z7}z!hj+Lge9bVbB`WB_tGLD(Xcf)CT07m2`Vu=r+8<*MMD0Ann+uV8UHhVjdR!4ml zBv~Yx)$n`)v)kaoyPpV645e}!Moc1^m1rKWVs_J^`%7jL%wC$Iyfu1kMpS0zQkInm zubc#Q?S_mfTxR}S3Q6+FPD-dso_6z;&L&9$^H;_YrCVgOaeOC5vwj*t9ai3<*P91m zET24~bpj}=h;As%UH%#%T)gGQ_a})bmLB)i4dB{K2HkFrrQ2`Q@A-V?2h#|GauT%7 zF2>P}305BtKj&mwAYUkw&KKEUU!v7qWd4f8+QY$0ckQ6V`oqymu#LkmrS%rR=VSK$ zfKn<6Nb=xsl}HuoG=oY0*rbCf2mLgH0E(Q(bB@gFV>xsqietGLaSug~BgxZPCaC(w zep-=41pf)B%95f29!7LLeFa-wTd-_GAh>%NG`PFFyABc{xVt+;a0%}2Is^;u4#6$B zyIYXKd2{al?)wXSueG|mtGbHhE5A(r2Fm#j9xS0$R*x$&r$jqze*FY}R4Q4fY^=eQ zJ-Pho5BxmL93uVUdMGE`FN@|F06UQ`mP*28Q7QwEi)daKa>*TMhwWx(E4i7CC6g=; z&g=Slc(2Autcm^}TS&XpdJziL{zhnwhQ8$+fuCOHtDFP!OuyS(a)%WY$1&ryfB0^f zRW>zf@jP-!GIb4@g39DbZiPNcYd%FU@dnXuKa&*RdQp((q3gW9A;48>v{Z+i=Z^h( z6uzh{9KoiKMUq|8g8zoLx90!OiE-smI(!j>0{T9T1}^A|t3K?HqWW;#zFvkaE_8f~ z91Ld8A1z|Snbd}va1e#Vg$)E=uwO6j(v3dm#_hs(E156`7LFIu;ltMrm!Gf02a)uf zF-Kk=$Wg;xOB4b!J zMWmZGsWSmG96;&=OA>~w)y>WTGrv~s7+VJ;`A8{T#lbO z=Q%p-GwiV1Yks>mM}z6~y`7_iJ2&L?9HE0&&!Pt1xYDB>8EPV`T!Nxi=kl|dB3g<> z!O8xjYs=qilD$Uzy-Ixtx7r5NEdi(XKo4C2FiI8+sxMT2zFnr1b4R-;G5Jo0=F#%b zueDjmin@B*TSrq0cQU_9b4odTodo_x7DQ2Uot^)Wa4P*TxC~cR&1IPdK1EexYWi0U zx1b1dnWPQl$o2(vm1Vg3%9#NWnO^8NXy0G8&pfX z!+#&zRZ%qAP79`?5XA3w?!&5qNd!<9X$mpQ?FnhPy!;27a#5y&yDWQTeah^~y|{BL zw_5Sdri7y5wn9t5H(s$p zj7Yo(SIz=4{6UVU5GJ5~1KW$i@kH7E)$+Pe($6k+K|+J7542V5l&SpwGv|)olMAzX zYD|}N{J*}+_nE>Kfj!`c8`#?KlDaU}l9`Kl07Y{vrJJZetmDe8fzInaWomQPbN1(? z#1ez<05nJ?ZDQc57f{}DtCbrJ@m#F$2$HQQ{le*xzi(lCIvSX_%;*h zsCup;^EtWtyspy^TP~H>Ak);v_}=OlMJ`9|VY^iubhWZIutx=ldU>_A|6z^H{r8+5 zJ2#uOu?LJ0zrLEgU0O`aVtV$7kk;0rH_Stlon!Kd%0Wguh;Y9{Zas~*5HZxEO1yEc z*OhwuHjS)!g;Ze-p)hKhqv9e}b-ov=nG#uXa#)Qrr4j!0E1k_UqHJ-!jPzBozhQ=c zB9LF9zDubI!`Re34s^*W#^uWuS$$%5v#U5MwWRNR6VimJTJ!mxc`{SK3-i{Rn5gFF zy$)irYHzNWxzT*T@+z(JLx@gYUA6#0Dw~-jr|9<_jYTPb5?*Y>p(woqj43 z+n@HY!kI4??2N+(sMX(j{#te(Aw@ShmgZG6XjTg>Eq}x zE0s1j$4+j%6Dy|;NDojR)8To3`jl~%4CS|!%Llt*Dx_}FgnS#^Cx>VXIItE0I4rfY zB#_Y8oLdmzl@I+x<7oaU4Xo^-C<1O7L7s;4ut+vCzh!lL*|Jq3(XxEyF8L9sCsZN8 zVEAJ6Vczx}YL`p~OR(@jse4q07-bawkCJjgEF1(On3_}3m7yb7#sHxGTEh7gg-sq0P*`)pKTKYga| zb$yN>Fb!5CCyRpN^mlXNw&Oal8`H5u^%cZrL(#KZ5yFu|fy2kYdL|K%82^05tGu-O zkQp+P8(!+3w-*IY=Zd6HC+b>2zq@Ok%ru>F@sWGypT6eie!mbe`i=<+s%AJ`g+KLG&m$4 z?BUS)elQeBTHL#Hzk-(-k>T4IxsmW*mG6p&6`rKD=B`1Z%DeJy*Q*TvT3kL*D4YUL zgM&MK_0s#sj<_bT%E)Sk{?R0~2eP#4C!MViZaoegntlCtGE5}9PKMC-u(9t|qB~GG zmYs8vz%pUN$DMLKpWv$F5mZVOFPj?>AUF3*86Pv)UY}+df5l8UTwQC5>pi4wj5{?4L znH`!&iop3u@|D4&IJnl&u*CTv3?1CuO_0SdYSagTO&K2OM#rp8!yK6k)9&2?>#tAp zTsd>QJP|h&{?)&xt%*(cOEJ}Hv_~xv^?R6?Xer$?&&QuT5IL)0)Aog~hC(Oi7te|hex zai+#ko%H^qOZ&etCq!#5#rBzEn4GQD5K+OrqY#J~4$pXPSECz zG?%+b7Pxc@e@ALTegb_QQmS>%jz`%4it<-O_Hi3j!&sgvFa!C+Y~_||E1OZWl$v`( z!P|ng&Z^4sh9;WGES|~{Jf0u0H_F|$IrS@ouqoEzSAG^+E|21NgUjTP-`K-O1lo$T zOulv{C38BYkE_L9T^^N@Y=PEvCHyYusTmRxuoGUQ1*}T;)_&5flZT%nN8B~2hI3Icz6KF27Z}p7pjDs1zQTyVlZx*mC zK&F}B9$WN^9hI`y=$mPAI?)Y{NN*$0Xywt@j4}-@WURe=BeK9Ra{%-_=1x7Q*#aD1 z$NM^4-!G1GzfGg2%mtH(1vD6{&rv~0CjSecaPah-2juhOZu^o5*iJON`h$CT)S&mU0SSgo zG2t!w1dR8&q=|bcIJ8SS2^&-#Ao!1rT<_&u0Ps?`f4y-;!Hh95*|_G#Bc#pk21rCS zj4lfLC(z-!s_hFbWsxHls2*KER7l`>vPD}qccoU?5cSik{`!?KD^}4VTQBS{9PUxh zbkd+pW7Q_!x^Q^LS>i%JD{1pZ**LYwPy(U$7lj%D1x^ev(h+CXZ-_(lhMqwcD)zHKOu0-Q6xvI$;pY2XScpP7>6y3gPVM4w*@%{=Iy z0L}0XY0`3;x+Gqjy~FSDih_#}XDL@ya9vJo*f%nes)_^Wcr$H79E72Vl!K$KifbsP zRl?Dc9aUpPA}3xSZirg@)9hXh#YIrp|Gm2ktjs;~i4A!wot@D9m@^}t`-s>d|`k5t5^4s!db!ZQ^l4x zVZjbxbhIKJY#ood!p^snnHiLoFaB*h;}{dTVnyqppVt3tEvTcFb;`cp zAzh@){m`DZ8DEorC?*|r*~k%W{)0BE_Mi6i-@W`5Tp1I)eW>+odO!QW;Ah@7e`W7` zmjun?p>cIoslels%>w#s(TaNag+3R%VtO_}(r&+}B9ocpw4?fY(r*tCDoaM@o9Yj* z$jCzGNXgos$yFvvMp}akX{7CG>kCsb8wUp${ak-a1#1NFlK;^7=->Urcv)F`yRJ75 zIe_tDHm2^W)K>H3MNP8pqn_pkOwIV){WeRf@0TVq_ky8Ln#%vNh2)g6Z<4N4@0;ZN zbT{8k!>`0r(qa%?YP;s!@@L`M5i|P!qd};3Wjp~?z)X3|63U1}r}J1mbnx6=VB;>h zXnuOG^6+}g6;^S*%|=EgVep< z_EC)%;ZxpuBmV94@x$8hV$ki4%nW~x)?*<;p{f{|-m;A5aCaepG%fTeyZbj?g!b*Y3RaZx#}B(mYCdD^I`V=E|3@fM108<1;)lg7wK zv--Wu26|K6NheFU)1VwA?z}8+mJ02GNYzJE+O%8UR6&TiYq*ey8ey9y8 zfk%)kZ0T-113E)(jBU0`&9yM))1OVZ3G!I%jklM8SzfPDhsbehNY4!$qphg_y6!W> zpv{-tzj4Z}Rax-J_^BvSiLCXv@JNrdMqlT7g{3r6b_lo)UpKP>)oK}Xm-W6IGFE)t z4y)!q*L2F#j(@fUec_i{(Y48+I{|9x@eFI(3-#^SsF`eUo|rOh?L@14NDI@Di3ZTr zv$jBk@>Du_U#9D4fuU5PhF%-62d7Ug-tuOiI`hXPJVd&S!6zy8Grv9L1M@gGTH8BAIsaYJf5K+ zi_`w*)1YX4(htMmO-0|xt^$IjC-r|;doWhv?w{pdzC{1V{Xubpw!`<%(JhlJh;?{! z<)>H=yftZF_2N;}0iCA4pGYBSX$s}xpHxbh?eFV*8lN28E&Xh&240~I2?V*Wj-HDH zTmGE+vFksNgPL7p)1`xMt4vKB-2?93Mh*!?nvWk88N|T+>mFI_6U{9b_(hJHA66X- zWJ4WRi&isDY)b!(Z0}PWa2#Gee>Cun8VpB^N}Q|;^OglX|3zQGU`$|mhQ7d5QD|bK z?atBkmheJ)ZN!1HwE(%@E4cMkfz(NB-J6yi;t(9G(pU{f)1{zPy_#ed7g_6ti5Cx3vcqld^&=8~4bg!k@;K~3Z#J?zH5Z-1?Fbw@N=FDug5f2$r{KY&WbFz5BuZz+(>)KG8+ z0@aYG(94@ScGu!&f$BFYo1pwlbhu4pFLCoHL~+UxF;T!^xlJf5M!aa3K2$6LQjJhi=Am%lm1=5VATVj z=zungZ$+f^(m^9Dr)`+iaPsS_v-Z=?1zMAnV*v-=9FRc`?0=@YpOcawmFn^!3>) zQ@NdQ4LyZ{cYKY(_zT|pJ=MG-7^%_wXNd})*UK%`KKA#$&#pA&v~_!{K2g24R=s%j zEkoHioDu{hT9bnzBjqNseT~m>6gJ>I+7VDEfgwqdD$$M4!If0RFElZ-?G!Nk*DcS( zHEY9Ll%{0st?0|80V!4}+kVu@ct>zj7IgVB7zl?>qI7ey|8d)U=kPdBUU6!|xgl@; z`F4=>=HV4uws7e+;fJ}GbQC^C%FmnGw2eY9@s~0Pt;+He-_ID&Wuj}9yv*#J>KU8T z&6$9QxV(ZBq*dD*EABA!SB=W3FELMEHz(p1ajI_j+-;O~`8v)^oAQ+m;*nJ@Awiff*aKu=n8qs#tF2|iRN`FmB~QAn(CT#D>Mk#3#;e=gP^=$OBlM^Dcjjeewtr7KgW(vf zAFpDJL8yuc@~#Ca*YV3sT|ivyy51Q|bT70zy&ORxrMLYla|RG;Q1ckkMHAL%ZH-ta;1D(}ee*8y*v5B(zVHRCLc zN9`Kf_{9xzRrc)p;@ARX6w)~;Gjtrr?;$Ik2+Rh4Z7nSkD^_VqOl8A z5YO5;sOF5^+&>P9_TKE}t6}` zohr{2PT}&abF$hBScW{HmV59`-u$~x*pPP$x{-t0R}|dXxLNS_i#mJLXxVY1iFah@ zdNTd@EIRTM=`Dp5Le1glIB2f;h!9A9=*&@g7=mSixBalS+N)FTCAxbgh_AH4-uB~cY6d3WBTS^nI3xCEw zT<4x0iUH&E<;1+fejNL2w55y3`B~D`6B@K%y7b`5uU-)Z969Ko-8$aceaR4iAZRwS zp0UmUc6I%SuCpC0Chqt4HUj#G_?GT280(KSI1XG^++l6Bm6txe$$!V|4oFrP6;U^q znGqgr7|Lo6KoI*JY_$jQO!=>);TeWbl8{-MkLF^$Iq6urpf>=+izFx_KcGFXbTdE# z=fR3yEUoCLcy)^`*0ZG8LR85tuaDA}LlIqnk}JUl)&nYvM8AF9XLlI6P5T{peW3kA zN7OWi`2N`yU+ya52?RNa*pH=zB$Pzf{h@PW&hyq6RXI+YXfd>K8=_a9DdkqBPK^`O zbD3?pN-Mtk32P4(muPr9Xos(b^wLBke+wu4Q@+J3SG)zsO^P76DX1Eh-KW>ST&Sw} zsU1|q!|PBD1OV0D*SF5}!@eg3?EqK07x`_~D)?^OD<*>DgJy5d_J^{_VoPUmKG6g` z`|>Xfi1SdnRw6HAeZuR!M^rXOde*(lRcF_RN|(|*wTV_$yotLG>+fB1igKWK$POf| zu@bwrVy{~ST{WDzJl-jeZW{Ta5`K$apW&trd&3Z4l zcM70~6Sx}Cikagn!JJRu%L%D-)Ul;1IF)wd%P&D)i{oAx|4YmJMTqy?`IKG9dY>nY zFIx?~ufXXr?5lB`jr*je4Yl!>YwcsU$ouI#n^~C?Hf@yAaRH^Ge(I%&@#*XFbPEtS z_r(EPh0q1^cGoN4*;yUJ8&))Pn6B;*QK6b**E|x#Nw~(0zv-{Hd$Ztt&{FtP>1s}i zzPt2*-a(osG!n9OkvQj&Q|aHsjZ`eUFXc!p#i2I~Y4N)XRyfa8R`9#Z$^P^3yQ(zp zis-htgLM?ol;^|s=}Z?*1rkoi?jGy24!%{h!tMIJ>sS~?)zE(D@Cd*;SxaUf`t1i0}GP#Uqa2cZRo>H`a7)&Nf8>HT-*s4_kx=J)yY{%-6 zRkTg;F#YLKIegu#$GA#q*cQ020NC~L)rl3tdZ>7U>GiJpmPpANyC`$;vy%1PHzWCp zS4%FQ3^pu5>AC}9B^%Lgt_}l9ZF=||u-m#@5xbj|gH*6tx=46_hw|!4DHl>G`G?I_ z7t1$31a@N>UP~R+p`-**EDeJhxZdmzc!YLDm&Bf8n=&T)J@9GtnnN<<32Fr5>;}g+ z0L7abK6C0-fojbf2`ozoH+NUu_V_0mL_S3|jd?h6Ln@R$#iuZbwKCVHpWx?;wfpHM zdWZI(Ni{Am4_N(O`e&T>3Dfvc#R-{Y_q~A>kazhRkwzr*J7+ZfKtYs`@-~3PSGESX zkW%=3=m=(6SZLP_V%bNgxAV*$ua1`M{<=jNMt`+Vy}|XRa#aW#=eTt@b>uk}+|Lli z+$`2SM-}_EkoCX|BCtbC898U?g(KB4rJG#I{d!@Za?nRqyLy2UiWEAVcH4gZ`aT0a<)uw)*=qHyx8ItKePcFG;XlQulr#Rsc{SSbeOSVqV{+HMNf(iXZ+J{$)FbfV} zrHpzVCL_h86qF9YU4L4#ZKxsO;jW!oW_1{F*;%r95l{IMOiep)XXDC+RMH2p6jMKK z3n{_Zw_+i z#%AwQ_mUL%rmA8+bqf0uv0SYYa^8*Ut;ZSL_}veu^mceS)$%kvrqDAA{c-hZ3MGH4UdX)b5zB6$4}2w8*Q1I|8h_O0 z5D`-=liM+4)H|e3Z!qvLm!~06QRosCG~o{jhn9)O{|JYKD;T&TB{Nc}Ts;ukXOS1T zI`R@#A_Rl>q@3L}dmtMiD6=TNpa1c!BlNqDG>?=Cl2Nhi6p!>8?4;QB8Qq+bFw2BJ!?C*p&ZwEy|?)E^!jmd(f9xy}}Ch zX9-FD4D#KZl(tl~5WjbAmg#4aBM>!Y1rWZx&ao(*+55}Xt>tq!%hm}>-Eg9|K`X)0 zjg&H4{o&AmkO}$aVS)$`PfzgCKf{l1c*EgK&)-rgehN(5<+C{SS<}0#b4BwNC_=0p z+~*E>IJ7>??wyp@o%el^oGPvq*WFLzDgReeqm&MwSDR;#*`1l<(6&?*aB5#;3CnL5;x=;T1j7rmj#oTfuGlrEr8Eym z_Q9MgJkuN@e_y&(05aJ*W~N1z%xFH7Rk_8US}Fz)UOy-D zKE<;in$cnhFQ?0X%VY(;fuX$u@x@ivF7wf|YL`M)X-`a^eKm+*|1oc-21d~S33s@XCI$kV{@5*)aKi&Bds zVwy76Z1C+O`BnxNsu`3W|vj)zCZj(F%T8i-_v$?VSY)d36G1ULg+1 z>n(BCd+^Je&8swWg={AkK{<`xYMF9*fu%JjRz+?lS!7odiX3qc#q-PSF_*N;-?f@1 zPn4qO1t)ejPGpAnkPfyC+RxDfNsTkmBZKJcF8!yYUrUz^Hiy_z><;gRliF_dR!)3!C#HMf_(_ zX4B~8lV`W?7JNRqQqnkNajdT0`A?iRUJ< zzisJy=HRD7Fm%=t(0kv`9hjz$fU2>3O=>}hS2pbq$GYqTL8<8$2b8^nQgjn|$7gKT z6v;K`p{?&G>YHH>GgdfW%oC?EttwZH#qMvcw}&yPb)J)3d}o1y4j#ZRKxtE{B1&C8 zGe(1v164mwtBggXfFw2`Y*s?QDz<}uR(PJ z&vM+fUe{@bZ^g9``So2NI0S$-mZNZLC!qP4rYvrg{pj@vVpmCZri?!S`He3ulL^^pU z&g*~5z~FynVER}1E{zj;M9~Mx*T)-YKmd^SgLNazX{X%TF3!OSza5kVkre}2KHrvL zWb{UZPt#+=DE1>%3=i#cC?okQYfSgWT?S_c6&EknXeVdwNsacU^U^3}j=|7#Z>;w> z&cJ!y;}0FqpELz%%;$tLI$v{p+;%bY;@bhw(qI+~y9arm+}xa7a7Acq@6zOxwkd;G zW>*kBGtXCWsYdyRuqX`gk~c`IDF9Ey^Yd+14?3IMr~gbsTL9-GWt{%rxzI9j+%a|e zt4pry)){yB6yYV}ywR~vq1mtlj=TNRb7|uNt;`H95nY`3c4ZhgSEWwX%*Wb+k`41S zW|nP$sYgMgRuVR%b4KUgPoui!`z&9 z8ilk1g0FKDZ`%PcGF>mjo7W?kB1OP5cS-H*_Yp^)KXg=xpDAxHiBRy8PCc}B z5XROq4kIdG=UX2{&|`6P`ckAs-Cb2O_VO+BduIjE6*h2aW?Rr-TWry^?VMY{mgV?9 zmz_f!7FGtnVx_El*eYz|x)*Q#qI^Hdp*R(d$kA~6GN8AAO3{NmZg@k(+a|KVGb`XT z*m&3D>&`=cLAO9CzZQt3*>}i20B&8j^FbMXQEkAi4y_-rK@S!99XfN=jX6L_aRuDE zzIXnW6};2vK&sHPYE~b$tk&sqk(U(vBw$DY%OGA(Z~%x&;!-?yA&C%ABhz9#PxhYS zT`mR^8aPV2L|K%M)IDwMDIWR+aeSl%Q>zUV{L0JekeJ648I7g899~ z5NRA^sZNXJ^?KGrf7PsxH%)+>NqZItAr_Va#Fc3xldCqKy($yjV~8h4dk5eYM}h@> z4xzHt1p#_3Ruy_aNhXLSuXmvKk^M;)YRdkGBPCH@lv2-& zCYzWJVp%Oi7v<5GWj`VpN8qd%1;{jfStVH5AGm-JmA5HDC&GnREjec(OmfQCT(l9Z ztGezxrm&oA#t_j6LPqGeykAY6!xBMiEHM0&^ro%RlGG>%E~o##7S5D@g{*feKh{H4 z_aleemRe?YzAUsR6pmhN4s=eCexC0N&N)2t`M3_yEPufWNtfAXj~7_-X9J$E`arZ@ z25&x4WDHJMeeC2uKUWZ;nVQJ+J%8n&@8Zp*z8C4sQvR7s4(4)m+86fIg1AZif>j#13y2c<&AY$5ucOaBH=}{inwrKAB@y3Q>E?m=JOLKF=i4zakfCjg zEj{16%a(OQWi(1>PW|-`h!@gW`p$5Tfs2;s^6HBN?G{6_5{V!G*y2R=h%~ zo2d5jK9K}+jBoD2qXDNvQ{(Kjwtaqc`B~WiW^6_08c(*;FJ>25Fy{db;fIFJ=;>C$ zTV?jqw`d@$d9Led6>8Uzue-v^Whu>^C}47pb8ZO7nXn0U;Qx(t2BiPCzKeM{%7Y3 zgU-M2>Rz5TusPV8{??}-S+`3tJej_05ukPzRj9$(E)NJFFt+`};`jqru{~mwbi?mB zHIjnLp*ivpDTpC?fsB_zTmJ(V%GbD6XT;!{LG^h}!Df}MIOgA(TGI369WMHsi_<8` z{R?WEF&imHvk>&!8!n(y!8gO<(Ph{}i(61Y+UR)F&2uE1J#zES_UD^1*DnZCTj-BZ za)OX}KX1&ry5mNHhA%Z0F%tzD&PH#R-rU?DwP^vj+##N-gBi=Z-0c&SOxpiC=0y? zWtP|3jxL${88e?!X$P=m*$e;yn=(>VZS=M#TTj#0Et43{GY;YPlLcPtk^A%4#6vlX zAA;ux6CH>mc;ZKY7{ukk++#Cubm8scE$him;A4(*-I#@M;YFQaPr_*)UWGFY)UxUG zkNLsiSl}LmEB{Z3md@jz@S{mCEfTMg_tf>9YbH%Q>?@L7wv47_OYHF=3^>=}UZ`1V z*NK=;#t=eY4$fz{#dty-L$|T(c#P_qy4cUiWLBe1^}gGE{%FrGH{0{xdpP&9o!1S! zpS&KEcjV5(^8%&kN9F*QG@Dq%{kW`ill9H>QU0G~wi3+Fbxo z0QVwu-1Q@=LQ4)bg_M3i14fy7Y6zOAsk$I*lGoqapmKY&DWIbqnI>Y7zQLjyx*kI^ z6QM$cBmYGW$HgyxW2&eOFD6ObZFLzj?Kuvgcd26TbmI&H{DlY2Uf6Bz?`>1B<7h?D7_DRupBmCi5i@45*1FO7ik$>34~C z=?wg4VqBG;r;OQ6yXDtwS^ruLtji|kukuG4L{hIue0_6r$|~-LkXY|23sfzcJeeq&35Y^0-Es6r-7Sd9qgbm})h;uQNXG#E$B?-Mh z(A}ha#L`9#-A~0piH-t2^F+x!E4gH;8I)Hhml9uE^{>5DNHyJMu?~1@z@M!BzFbjX z(mhb6*bu5`oOW9juv*hSa4YB}#kis48bg|!li zAx9P&v`6vH_0Kj?J(j==e@o@9KWy6}QG@e7V6K`1Cz8S)$NL$z_Of}VA@14g=~bz88jSpj^c;ar$yzE)ll>x0CNO_S5zSguvroJc-gM zvwyzB!xUAPOm1oOiNx8R^Z)w-+{jbaF0N3O6x!gFUhMLwU1}DKZMmx!haKwxE(F`z z25SLJCk|t_`c=S==hM` zKi^du(U)HIdYEh}GAVFnn!te1J}==vWf@=_mtCbniz_{}(diXTu4$p|z)ZgbxjD0Y z>FMi)?h(hu>%R+#@o-i zRpuI)Y$AHv(X(7ZCcNn;ugTgCG&{fBe+Uh-Y`!5-(pLW&_Q|uy$MuZ=)!@rVEijro z-s3%sV_3DZW93htumw^Xq1gL5K6OpFC@0>PDLgB+d0_F$o)s|A3&5|GXJC2j)#wek z4z;4XjEnYm_)%KJTHSYu16Nhg}jZTwPNrBX5GdJRqdrE%OVs)V0g=!U7wwaasDuw>R_uWxHR{{!``R(=xMr@f~b^cf9{X zjw6R9BU_Q5QG^IDb#!<;Y8NLWsk@*2?;aRXU?rI#lSnDcHAb)@MoZtO_J#20S9Ct> zs*ZjrJgeOK51s+XKDw4z@`j-kimC5Cm&*s4(+

    SNIxl6@f_)Ba^h4r16stDnm;V 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

  • OGQ7b6 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%0AwwO= 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

    FE$2l0M=Kc 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

    9JLZ|9{khzNzE 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

    a1$d@T>sdAGgbIQN1(P&}0E@jgOJeI9f!8I;P-F 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

    0w=lk# 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 literal 0 HcmV?d00001 diff --git a/media/Example_QuadLidDrivenCavity.png b/media/Example_QuadLidDrivenCavity.png new file mode 100644 index 0000000000000000000000000000000000000000..d54e0fd85e6a3174f02340df0e6745d2434f5830 GIT binary patch literal 342052 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

    _fFYJM6aC8|5@VaZKAh>*~)UySBTvkzfef?oZ) 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

      +Q=wkvfA%TCEBM^rNNz_ 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

      6ppn5^;6~cy5mkUOMvL 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

      7&tldxJXxxBpO{OpWk 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�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≈8W^%XKy9Oo)+?JONF}#i1+! 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

      bsK<0y8Q*d$ggo_ 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 literal 0 HcmV?d00001 diff --git a/media/damBreak1.png b/media/damBreak1.png new file mode 100644 index 0000000000000000000000000000000000000000..a2e7729fad8591c790ea893e1f872a005b4ccd63 GIT binary patch literal 11649 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 literal 0 HcmV?d00001 diff --git a/media/damBreak2.png b/media/damBreak2.png new file mode 100644 index 0000000000000000000000000000000000000000..e67e84e3f79520f3a7dbcd3774ddebe591dccbc4 GIT binary patch literal 12707 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 H_x|`lX3a1t literal 0 HcmV?d00001 diff --git a/media/drop.png b/media/drop.png new file mode 100644 index 0000000000000000000000000000000000000000..35e3f066a4831d6c696955c0abfdd6a00d9f70e7 GIT binary patch literal 414448 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�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�O-6!qegzrd^;X&#&ap6 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%0AOD1>&z~`#OqtK7#Bofo4Kj&ICu8ov`!?@=^Z~{3 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≤v1jchN=WfszU- zb+8Y0@^+){P<$mJaNK)=#1SP1)9%=t=a_9r79D|4Y1Rf6wRo@Tj3rJyReM8}#$@@J z#mOT!`xjWh4+A1K-g+*UzoM*{Mr)2pQ>pa`N!nxJ(TnwSS z#vo%Io(%^K)(O@ID?D67<5%45Vov7wiPN0M?r@?-DMOqIx+V|<+iJt89HDg)xIW*8 zcS`lt{Uy74g;FtTQX)lyh#HI!HZVd9yz9AHKcz_SAR|Gu?=jYqB#OFe21{Mo*K3Sl z^5SBPb3Lbvw@H#QcTNis4MN6jcNM$3=HmLCBv(X*q%(rf)@UJE?i$LxU^JbxTp17s zlnH=xG~^fAa8L`W2CG;bKv)&BY_)_4gRQSv)sDPL7)_^SNr{d%){pS3meu|Ok3vN% z+&@}sd(Gv#W>l6CIg|_PQSU9z86xf2_e-wUDR)lZV1D!vA+M>M75i?DtPMwt2e_-4 zy1fQfL+l`tm}ngo%4tLEuKDcg4@u*@%*JmsF7G2+#bk0!U9SL#j(da%c8O^;MTs#@ zAK|(h5x4ZVW53&?VnvimOy|&A1sg7c{YIobwp+1jp3!tYv791RjHO{dn=w6_(wQA* zyX5Klhd5F3@WDHbXBnwIWxc3mYc9CF0`Zd6_?v*#Ht`yN2Kv2kp8Wst2<7P7RYphZT2)qqtg`P z2BHq1Y8s`uu`AM2&Z(Br$81rc`!&}e{R88y{P;;FTxmoA821Vh|S0I3?^Q_eM`V@>%u zhcnBQ4_o@CpJ6lD+G&%LcpN(2Aas%Gh3B^7E(v z1^cYyU;fWW$m0=lnNln0d^p&ZQ6U3G3ape^(-SKha#BTbF%VJ&p~LI>TCWME4x3oY z!89q5_a5@_^gilOHGSWs5m+CHH?I{U)>M5gNVWhk(N5xrud*- zPK743jvsvYd;H>iKfvBBDP6=D&pyLO319v4Kj*DK{x<2CAFvV*qdi^?{egAFQlfiL zY#_CY#DcPpv$IS7>jxjOYHR-V&;Je4v(zr|Z$ zeGio-SV73}s|@aZO?!S#-*hC4DaY@=$wmh&Lm`5eF+rdk!*71}2{Mhi^VTDZNf0xX zcNT1O#ZT7HiGYoB%-(v$^zI3j2%;c0fEfYbc0*4Uat%x*Nls?G@r~c%S5N+${ne6Z zAN-hA;&|tqU&Uf^afB&6*`rgw{>OjBkN)yM@!=0XfHdZf(KisOLMlb;!*;^_@jd?J z-~T)Q!~gcbQ}1r@U4yqh&C4^Qal!J7GZvFMZ@=>nfAJUpE8qP;{!c#o>+jJtHDCJY z-zHg1=<(!}l0W*_f5O9u5Bbp#e}wCMwD))kdmLRMi5|}R*1!MPytiEO=`Vi82jBZ4 zc2o1&M<3uSTt)D61n$RkZ27rg9hs%pz8fA<6Yw&Cml;txqrXB4A?s7O&s z3@T(=I<07XhjSfS65$kd*3cUph+w6ORU8&>Oc2(oSkZN1bJZzA|2}sgJtUuwLO&-2S(>5=Tc8R_WCc%u{V5-R_z};ZJ)>z_(kQ_g z%T={yJS|XnXT)j7+wcAk=TFahySvXD*KhN|cmFfr`@jB@NO@GG@sZ&FW9!X+ExYbJ zzt5WXbjCZ?Tx4;SWV6H<|PCGJ^GJzdhz62bPUt!Ij2Ue=hUVo!(HmTlY-lALVQeNu75jyGz}rdbi@6|vBWdm3@m(d>Foss(k?AeF&J2+qpYjHO+%1G&N2MF0|vKZ&}_edGCjx^3(S};n|~S{Q4K4^VPpR=cu~J0z4VLqE&x`ezub;2j-L#~kWm+Weoy|~{&@Y9`YONYC}{WhSKv z8SoSu87pLQ%<=J4j^~dl^#TzM*Ed((-d@o4S0w4E%Z8(qQ)bgsv@rx6+wPjrzx)UG z{W(c)L3c>$v)lXd_KifLA`=XfBHxo!?nOjtq!M`1vuddSpY9genzA&ks@OoO6FNWn|wzQNgy%ER1;jyqttaBTOKsNLkO&RfP?X-EMIY_a|~p${__{V<$C=Mjw@8%k{F1> zB8@_bG848El*~>eku=e1Qq(k)Ig{C(MB-}ohAynLTTwWo2$`7FC4$^xrw$RE;qWMm zyLH3C3oH(65TrDD{*5`oMT!F94RyJoXewM9=-nP^6iMk(0335)@H^bW0sAJ7r0_fO zqgon7EJ(IS>m|p>XVlY*?Xbd$9Z`2#;3>1aGfF}4I(Do4T2tzXadg*8L+-W`Xe9`# z=klr}rbJLBm3hFu<)<{oF_kIk`aS)yW#6sPlYy)4H+XrCsw|OFv}$tXZt|Mo4Wg(y zJ$*=3EGbGwV9)yInip?=OYbg0_h>B$B8&+BTNm})d-P#jIJ`-t%kc0FXKCPn^L3z= zB1S)wT=|ZY-y4lcDp$tDp5AV;4vyy&&Q6{n;+(#<2$86&>Mm(0#4Rt+zu@Bb_XKf+ zu51=UMTL?TrJ7P#Gn(0q?S93!yTXY!lSF5xaqOZauQ@3*jvE3(Ge)N>VpMkm3^8)$`TG{A zG)2Z4O>>`V{eZeS<7oLlRaMgtYtFB(cysY3LEYro(zpkc&{F4pJ&nm82hoJo2)Ik- zisXBxHU)*LsmckZnPM8r_4*at?HcR$2;~u#Ma2Pmh<+6klDYf16YmHL4}9#1^@n%> zY9uLV6u;f~?kFPxXx<@}5F(?_S{9UbMLn%BmErZ}Yr1`pvko8Z=+M+CErHxoUrq{Q z@`M0NS12(-QB#)-%AzI&$E%BP(AqFx9I@^%2zrguo|pnYM6}LpAxTRRJ;6#eH42Fk z8l^S+_7+o2&<1iPl+Lm22}BxkvxA^UDU_7&IKmHhwzou`PGn{>=UL0q0-ZIx>F{^D z8_ysmLP}$njX)N8Ax05Lr^(yzBMzSw2bI=4@BiJVI;yK;{s5&MBQK*sMuSQdbXs6I zrclQmA3dTh8j4brM9*fsXSM&H+wB_$)+E!7om=8=+sNRzM5~-*D@9h=G}VG3?)mDw zU*Wx_w_8NDN0uSysfvWc77fnXOt_7pzBHhu<9hp&%Jd{z=6->jEv8aT zrZYNgak0&dNgXl_9YfeLgr3Q4N{~}Jx6MRqp~rzHJ0fFDIl@f@I=iFj_cYTfdROHf zV-@m7E3*slPLDDUXi6DCky7q-6jFeW*x0e{7+q?SBqdT8ND=cmml6bzh?bOEtXmNV z&vde&tV=@7msCjX_Z?A0v|2EmJfa&qg4lwz2$LW>aCkdU^<;5lw-ZSrMHo?TCi9yQI%)cUeVbbV(Ktj5ZSTo1BIGWl?~cR zs;0z8LlmAEz=xj8>(@*tC+JduGxU8&RWFIs;=_&*9m*604h7aKKf^}ml46yRA|X>C z1&d?DYAcx3OPa}okUWEPL8TU>fv)-N4yEPF@AGe&Zo)ev6HaVjzCoGRn*$zEvbQnu1Q88h| zig|fNVI~ME7&^<~Jcg2xpfrZrLgRKGp9U_jzsEVn)5jm9$=!rT*VOfr*6y%lG-o8c zzLZKJEYW+Ss*$EfmlKE)RPH|$A|lgxQ5A28M4=>V1Y#rtlE=puQCWO|tL--kWq5f1 z158oihH=oB6-6<_jgGJ=Af~_&_Q)aPaU?ySJt8}fQ}hgR$L;Qdh+;8&$Si@}gLP|q z7dR>B933m<4mx)M(h`DY=dLr^XBoJ;>h*W7DbOgwN^&JSoq*>x)VAZuaEJ9|oI)yCq$Z8}< zNIPO2NIEN-#>6tBk0_z7ufYx*RI8YZQ)8i#4JRq%mI(LQ8p26E3g)^zKx@{f@_vpRm39hPK^cqN1h%AJA5! zuPv)zf5$%+|2IGUAOC{l@hMePmlE#y|@HD!n4bNbU(a!dCl`*{)Ww~OLSCt5^ac7rxT7oe9ZFMW1NwslqjSk_*|-9X#;(r z2!i2e&2PT=iqHS?7c^zXzU%q&#kaHyjvhVWv;X1GX=F_iVRgOXw}1b0^kzUffh~I8 zTwD@<^(+4TC(lTAgHE7rq`hAA_y7C<#qYlOlJ`FPh#&veUr;_c!d7bRElbSKmi*g4 z|5Nm&0<91sp?pFOfq(q}{*Kj~OWu3-9-n;nhjcm--br3Mxajt;ulW6c`8C@x@KL+t zCx7`m1FrAXb`ca>hsVhUKICY+hdQ zcmL=A!}`@Z!X~z>9n(@UD=Q|lpg_>|9S|v!q}X}(U%lkF?cXBi6}^naLK76UZeVeA zM6;YTzjw;~{weixMm1|_ih@Xf?hIf;;Fmx9CoW&UW^x-MG)C`5p`3wmj zK6=Q>WJc%)Qpla{$0sM0O^q;mJliBn2(I3o^X8lHxcvSV`?e!J0bQ^_=*r)u3QWIj{84)0w2|^jvR|dBZ|n>Xo?hQqM(VIVp7qk5+4&GM&f=z zQKAbCQ^U@8d>yXYI7@NT5atus#&IKW(90?96mE>*R(po3BbEjkK~EBOC+Jd7EuloC zVj_k}A0r`6Xvp^iTL|`Q&rk}2$skJ_#XUg^g7SEgN%me!MBlSg1&u7Tz-<&XI+@r} z5YvoCLM#*e8iMgSrASiK8AY24dK|Y`Z}@H7bL;o)&*n_d9-;4j!2M@WI4u=wR&h~k zzUkg@@%oa#e)W0Y9|Kq~alOK|B{E3L5{6pv+TZZvo7e1I%f{~5+6}$fL!F5WqC)uG zX+NKz;9Txao*$pm%<54Tx95wm{~6o$>~|e8NbKNg>IrGk?7DN3*%D)mlo6#$h#D0e z7SmHCineP>#uHUfF<1EL@ga=B_W|sVcW209!^ud>2!)FgzzjL&Pa1_zB~`IN7lz)o z41Sl>i^g;n#yBmByi3tZ;~iS-96R2}J+}7*VUdMGE1gA(L8A2(ZEDJ@A~=n8d)i^o z)yuEx+!aY}sixThAZ5j3euC1HeSgE?HwY6@qw`Os0?mxG#fKEdB=^IqJ%e{#-h4;f z?hwKy2D=wQYR6;XFJ^HZg-t=3?T#|=7a;O zRsO^UcTOW24TO^U{2pgVPg%^5(MDkHj+@Q*Y`Y6OKLVr1j-u!QTI7gIHDZONJGY4# z31&HVBN9LfgNTMg)#$PSmGQ~4nlPQ$AfW3zqVyy&po;ul`U7cHoe&c^dQvguxUv+` zGGn6|NHr)SNvWh#OXkxvj*iZdCLyAu^S9jYUeVcWbmNHHfzBkTRQm3oFUHQoyO_Xt z*I*JPpPe6)f~uIXn4e(#z+kgeuBj_bDY(3SNx&ksMW#TGW314o8QqP6!FS{RTY<{B zRThco$i4g#M~DXjwL}Voj0L0`nHp>-NK=h24PD>y`>%h^?f!d$yhW59LF_Q4Afgx( zzL7@fPPseK-GDUIlQ~6ID#5gdMXc<F`( z@hu@Q1w-h$-Q2L<3=DgLkqz@{iBvgFFo-=q>=|53h&JOs$)dGEQc>s`)5!^SIc4AO zXzdmsTeJ}L>syA<6LpV}SwLfw$vk4ry?`+Vj4lvC)9nYkeG3uFTA}no7(31}(&P#X zGtul?SuCF)p*b(&QnH@dJn=<_M9) z`b=-%@BcnYcgVdK?+~aWKa@hDL`^B@RO*OIpHP}5;Mld7^s5b>y`k+d=~-dZmZXOa zkdb2r^H7-8C`K6YxzDaFrYKc0xIj!Btm_ELW*5iQBa}xHi7`8cv}}-}rqEN$s-mh5 zN(VOk3%2_eecYg%OgY9wDdgCDAP~8qkpmHWc-^^ML#W)D^pFw*j&4XOYZ%;~oBj$NCumt#~j0LdI#LhrYD8!)9|(j3!T%@DgBS&?D}yp(6xUT5Wd zGT2TNk{aV1M)E02vNt#(i^LGO?CllH$tlfjLhl@&lpSoNyWrhJOpfkKDf2}o=k+RN znU|tVK3{IMA)-*KM9P35jML9Z_9{zI8=UK@mvcxxuIq8hLketmD<+dERds~c66ZYY z{zdM#lN}IHCJot#xL7Vhc=laKJM6I0Q^bn0Dd|Ij z5(Wqe;ZXDpuA>h-2veG3N;?S3W`ZdyhQVQnNZYQ6!V>kG(kfgSsOuS~&~(F!!Ecb- z0s{$`_eM1qu_lv$Uh*22$|2~mHX`~&UCwEmhSX2+DG&&`hfU?4LMa3yj1C7ah(dCR z_7_Baa_rrXx}H$QnjscM83}^y5DT6mu4rw^VsSz@bPQq0QNJ><57!V1ONQ4|Mq23w156_rXcLR=yx%*J+ zgiJl1JLk~{s_;6sGq@u_3g zUZPDy-OLc`i0xM3tY_bP%6dwj=D2oClHhHN7ejUq%b2@^N=tGrzQ1BOB*b>0sP1EJ zi!n7v%liZd*4q{BuB8tSnFa)P4hN~G2w7pB&4i0-h_WN$$Jm0rZnQ|GU`b+)?>AU6 z(D{x{XNmF{Q)=c%OW1gv-*dBlj=0?AXcy;EB~0Xk6eZohXV(TyC7I2RXorZ_A;+ks zF=8f{)a7UrH4p*}(J-rysDmI1jgLE!{YdO*myDDWf*^Q{QU(_XeDq9bGxnh-rhzCE zh)lEyBvNPyi4X>y9Ed8Qlo$msfKa0&`t6m1@mzh2JB=r;ka!>Ns&P{aXk{2eM{GA} z(NH!MY}n;tbW}D=kz<74QGpMRsL4?bDj_C`PG&_cE^)(vM!~e=YH+B_ zYXT839H~-x6Y(--fGGvaO5tlsvMDS36>MV9tSNasUm}-hl=J&c%SA4sP6?$2NGxa@TUPCg;CFZth$fOI37HZ> zL{_mI-TH#0!Rd&O*$p4NKzAEi+(zbF@t~u({WBDk_E?8k&`ODN>@DQ)2d>^I!cAAtl9w zV;1i}M8?9a7+=An08F9f?_Z0QrKK1O`PJC52C!tQj2Z>sxMKU(jBzu(w;f zn-%SP$7;Kw`{AcFeZou|WT7*(s3pSa{N9%ZLJA6{D3lu2$pJeIc<06l%|P@XA0s{l zymj=e9l!bepL6m2d-lV?K)@@>$%A|R=->U6_y5h0DC(LJ6LnI^E|Ofpbpz|`SA6mL zzfcH?>w3QZ`Wt@!Pe14J)2BT7@I!v^Z$CpXr!4Q^BaC7|?Gydwitm5@B@fC4T0!3r zJU@TUdSUqE7%9gn*8Pi1{`nt%##di_#r^l6@`r!yI)2~`-DCrkW@ zqbUSf$NJ)mZ@>N;=N7>ovdl&wtO0FMrSSy@yOE6GF`K zlHOU8b4-eohxZ=v)BpG%IJtjs#CbEZ>eB(}eG8K0t4)@-nL;x?T2L=%h#;w}8toH) z+aiyv+?%QtqB5A{86W-GXRQAE@A&(G`h{zx#8`pBVz2@=BBaV)b=}(T?A1yGG3SCz@ z?oK8gi201kd^(;5xfP*G z66qtuw&VQOYrgv3@2RSiuI;!yKj-S=k{BbO{_qEU_~Zd)Q!`!6IlXtEYC55=8}jiL zkV&903~|Hvx3^rrc!4=!7l6?P(_(^9ikVc{5SYhc?k1>&YBGCbq(^Nhodr)2xT1DLVq@skGVP_oYn+>bRvv^jJ zPGF@h*KvSFVyGlT0li7IX&{w>6cVaT6fUui9vv+zNr?GgkR*7)C|-j=Vo08#B~fLu zKop~}M=3&zxtB8ul+w6m&o(+LX^}$YBo_e~g%jYUAWDe^LK-9U$lWv4Q$%%y*E9BJ zhMLS!^J9*m8891B`YJ$+}{b}g&b7T{0LPKqiIc^>!e2J8bs#J&~VB?m-cHFKn8HPR4JM7?* zaf*@!L$D0JWr!;%_hccGLQo(?&FS$|X455`%?-nTM=CAoKvX%#PK{WPJj~YOfX%!+ zcW06yI$>i@Navx6OfHyJ9a>;JK*yCarfQn?0 zDwD0!6iljPCglVh_r#R&a>sgiNnl6Rd!!kV%4Zi{%u#?o3=Cm|EG+?_i5x0ano^r% zrn6&Yg4SKK8#>y3%g$~{Qc;+KvaYG84T+Xjm*YYA{VnVMCDH6CYLRW|DdjX3G2%Jz zI!_Mjv6M(DcUDU!GgzBEF-B}ks5(a(9^QXs%KdJ7jBZS0hZl?vpB%R)bnagBK4hSH zBvf>@q$=hh1^Z!5XICUMKnf!mY%&-evKS!YNy6tDgpr_OBv{`C5AW{tAXFsCF@a@d zPNd2X|BMfg$y{N)uSJcLHD$TrZ25@AbU}n}Sr z8RmUs6lSW7AH8#}`|sTQ@;_NznO%WGnw*YRRyg0&#~recV~An?y8OK5H7rsVbdFmX zhZP=U%ovX>z*lHBqp6lu#RMCAI={uyl1#`oLKNU@s>z%X9Bsb=odwB~1Lm3WVkHD3 z%JDG}R8`Gl^m%Eyx~SIfSwKbs>>P=b4^6IR70YZX|ygQ}*5k{r}bbe|Vk`|1Z1G z4no>Yl4T-VL`{kk=bV%vfk#GQlm(0z6QG4t~l7=lBUaMz%fKfmV{DP-x}x zzQYHL5D~2o>u22m$A4=?W`xrn33mYA$9MDKh#PZ6lYGmH3MCO{T%aSVa_ELhDXZ}E z!9RXPW7K6(wpJ4GjIjU@b|2 zkAZTMbJ>%s8PXo14L(`GWwl)4@UBCsf`B4YGMSuEiz%{Iq`^b-qvA1+uXWs%(m^GZ zkV>Jo#7m!J{-hc=yOhbX~k!UxNK*t3|NP*x2=1-u<_zT@Qh0bLK# z`y3ylG$Cb`nsXK{9FxhEzTaWpfRF`sJ!jg~#Nmo4EQyFr*`2ZL)>Nq?iHI($kr+E{ z*yPSNITCv!kwTAUMIR;Av>@~)(GMhHvolZ~xTsvromD!yJA;%#YlOn6Ttb^D3EE+V)h<34fGKlktALI z`K*W76Q!q%JM4CYD)KX0lyhcydSBAZHA!?Ja*W6w(FSi1fji?`cVLLu-3p-rf++ zQ-&_&c+aM$kjF$buUu{riv?(kh;)$XX41#~36z3TVa-v)=U-!caFQ!5R|9NXEZC&r%Y|1VRraAKCRV zoh&m^7be&Ms)&RTkVz6#&vsbxrwZz$ue%NxmhgcfCXbB<{;!!7}$?7kpN2u)hjVcez zZk$c>@5q;SX=IMS^8-aS#ncsAHxy<U=|Tk-8`-3yGJO;-ui~FR%Fh`S+}Dt`I))=;R@v z%7zCI9`pG02~ryDeapq_mN(swi+;`3?t-?zY&v3D#nAC_OyMa_`GC8Lu%4nok)Mc3+ZX+S*28;JD$8v>$vjfgryz_YH z>9%`*{trK6v)@z9CrnO`m_5AD`yai}pZ)v4&*=@WW?RM;VN>&Z2E3ZF+_`H}r3Acs9GwFburh z-{Q)^`zObg(oopQ@aBeBzy5;X{ql3}J$}e%fAyE#`}7&HHaU49Buq+Zk(I3><}QTX zu_qZ;JAVJ0FW9v$C-+V{dVC)g;0b8OcmMP`>*p_7ef||UR~HylQXMVmzdPsU|Nkq>rsj*+ z-*WnsA25A%hMF}z{Nx!3k;QZ&qQ=Bg%QjkN@N|F28-j zw_m?N3C%JyYQgr2!%YWv%F$_X+A@rUFe-QI1QoN&x=8d1_6Ud;?(X*a-XIV7gcKwp#~#>B z@QPX*rg~1L=1iM2j%N30 z^b8{kPzo)SVM>=gqoQRm*H=oQQQj7Ci<%@nN)BAy|2+_dL(ZcFkO zmmHLmK@9m0EELj%4kbp^OsWT*OyB2h_K2I;S2=M&Iy%4Qc6UMVxAb<4R1s51l#*y) zW0b(U9X6~{jVCIfJ6uu$v82#*j!qsBW57#GD2ANgVbUlN$YLYz`c5Hb`N2rkn@PKtbgO>z8MK&l*Rm4kxv9vPy~PCk)xN{lW^p+c(( zrI}Eg2BRy$v)R2t5D229k8h}^0;L9`7)XFpHKm;3Q)KWxQ4VO62tGS#G*b$7OjR6V z{Xh&`27kj~ZyEZYXbh#EQfyK$UqPdQCL*;NF#7gqEtg^mgsVd$Ku33$6SuJ zAh{zR_jmZ*y zJCaU}H8}!Jq2~BOQI&IwVn#m%l1S9kib5M=igd0;7i26!3Y4hGQMWU+m_w4p(4ke4 zpDCq?N{&K>G~SsG7|s}PDN0n-6yk_k`G7@rpF%7+THZ%1!^PEWUR`_zW{YVCbnOr( zJ6WAeqpLG#nPrkopk#?M4Mt9>izz84_U#&*b|l>)bQo)y^c@i(B-wQ+@-m9~#~;-k zZ|{0zAHZ(JnO{_jSV){rzJYJ{{XDhdvm+xyJQyJ%74 zT%ZqY7Q078xg~_acHPtNmZ(ai3q6W$E!NgVUs35pN;N0C#BR4`P&;HbpmiMKNO^Op z5JKDzA0fuhvr(!tVoe!F$a`fBIdv^}EavB_geG}`k_Kxllr;414o6GULr%<7k|c5p zirBj}M@;;dZBBVV7BV|^gMv^ZLyb~%4(dD14^EIqu>fjwP4|bcYZl zmoe@eH%WeSOiR2WxX1Tm6#M1HJ>B5+r9vi&`pE2mU=d$s7hRDS@)L=VnZz2QOFEgh%uf&a|co0pOebfO-d7^Bn6Eh za-6d*3`Jqk2Ap#YUXY?C1WimDA@#V|2Aqf#h0b_V%+FM*oW}O@Iwk-u$1=}78K%_U zUigxwT#T%!$cN-8$CqA=i)JW+x}OKF~HTFIE>^U0orS=HO^frRGRu&_yxY zBX5_gJ=ZDs8%E6b>3t#M?fSMKp0{m%#6SuiJu6DBF_l0LiI4__9LooT!h6T$utY>f z3=q7BxTSH4&~{MlNX0RQE(vN!*Yx<{L5yXzQqr{@)6!Dar(A8eARWXU>!lPVKVU3K z5pvW9j#Uds^E0ONDY8p6t;ml}MF!W8OSnN|5n@7;5~~cxbh)5H21Z#Ie zQB8@;6M`SrKl`lgyia9PmYWMp8eNuBDwHq;Cy}W_GeL@iNjb+m$1rROp+_r)k~S+{ zWOleD5`)-~tV5=b*!H+?!@N4APb=E3f*_boYvz;t(1Sn`4gncP5-=G;kZiYs`E16)bb^#iXqJdDaDBPv@MMOvb6S@bEZU~*^c*57b_69* zx@Og!b2z`l;qfU$Ul3Jdy$zsRl8!_itM;0+x}cuS5ElAtpA|~df@lb;%c@G52_4dY zOUmSqQsnN=e#iA@%PaTq6V-&|eeU*=1B94?aRkYa-9B>M)CG`oDQo99^r9r0fG89A zd>|fMzDP0Br!~v&98n~+l(-l{XZ5BMn&>-vv8G2OOGrcdoef+INJEEH80)I*;FJj;jOahckrsbbUhz zo)`mt+|hOoXu))P#8l5&Z#$IKgw)|;2Qr|nAVxQ?qkzvSV^5pIz!c+*I1s!g%+`IPSBj4Tl0vBxX%sS)5DmeDcVP51ySf-NO=QS=J+Y6%&HWUlzy@NoGmq8>#81N3f=$IYXh(fU1tax^Q!Gi}6IXXEZgo>uM z?Ai@3xExg?N|G@6=;{2LfrfS0bFoTTT~Jj=+`sn<^Vy7|6Ho>Q+0c253mt(>;wBss z3ABJC#2$>uu7!O}p%nPwa@Ru24kB$!f|Q&d-{;}ocer=>Dy6I$8jtH8+89(R+4*b! z{=>g!GhB@BqkQ2TNO-I9G7=RiE4b<#b}v3*-R@|@z}7py_~j$iptyf_hx_-=DCY&o zckeP;oKkJBX@Y0BSkt(`r=LCI{Mj-WuvZ5h&QFgQyM>Hr;}2-6I*5= zC*$1tS|?+MbFCCqw!o;I262;$5CT#N3T-L0A$A>|>v;Xm*ZA{)`)~R0{`(){w4jTQ zp&MAAulee;FZlSUAM)a>Cn#V#o#w|O1@n_5-u>45eEpjraPQSuklNr=A|!}iBzli* zTjH*xeQ{0u=mqnn(J`^;Hf-IF)8jk*;9q^8X%KXmD?b0(FZukVU-QbVuka`T)Biwm z@0h-j_!!YZ=>*CLqU-S?7=5rn~W{rrN12Y0B=F``t25XMXN z%X+9$OJ7Vk?uc&w|`#A|>DZ;h!=)ImB;UHYQS?OnLiT@8e!9`S_DZEY6=J zQo| zY3REKk4Isc7|S;0*QxpZIsU6ltkTRwu0?PT`sdgDgYZ41wSR-g$y^ zxTa%!b;L>{7MHLrc}HQxKq zw>UdH!8pe+|I5$WUT!!NHOdFhfAuBlORz^JYHrx-fwl;ozI7ip6`WtK`Qoz+?j22; zmleWCeCjb(L3KFenO`s*N8;Uz+2oK=^=u2zP6Zkworq)1tH{pi5HRI9v=yqDp|vM?hwuYQd6d?qBniI2m?`twFvOh#fvmD1DT##IcX*{N zB$Gnt^EG>1B7q3wz2f$gCZr(vy_!DbL?I5W+a+2mjLA%mkQFK=(&!S(Sdkyka`}u3 z0for~3ksPEw5UN%C``?4c0f@U?3yi$)j5OP<$hxwD31oD4!GFm7&2*)Kv@~q%N5S; zkUIAt+hT&G!pIt{Duhg2EWW}GTZC#+#-mD!FqTPWs7gbMJ&&)R;L9#lDfpbAWXbP`$Z@7Ijma1zLARHT z|33L41Sld6tMoe;d|YVn-GHTfQ>a{OmX zI!_~;@M4#vCZ#|njqnOZ{+TkFOwyq_}Ax@B?Mk|HU6-HJJaZS{cBm+rgk^a8_k#P@|$)Z9_Qo2Gy?~yKi_4L0&f>nk6HJUrT9#RLpQ<>(4}o2~W{4fpxUs)FV;m&U@j=OQ zu_UGjRe>M!S|DU5qjQU;A_akxc`lb`ia>F(dWJEU(v&&vtzRRm0<^{(a{Ywq$NO}F zLLg;-h@sO8^l~Gif z#y`JI;_v^zcTwLOfU+?mjcz?93q+idqD6~}QqQQ(F*AFL?{hktvQQp++~N{h^iX9% zZD}n=6q)2h=jTg_E$2+D1KM57uFKt)IU+k|B3Vg-&jz9xN8B#kC$!1zo?U?bj&n&}BdwN0hgFlMs6Y%u7ZHGWnElw(zm8 zU}P<&+!NdT_YV*rq8}5BjpOKs*A?SflB1F9 zmPi!i<77-yl0p;5GlS8Z(oQJV5veuU!VsLorGeIWG=s#+z-D*Ja`S>fgDxcpM>9;J z>4puf?GhKapocMeFXKE)*zxt*n@YIBc7;%&3`uCb6BuO~hMulnW6hKpCC&%>UJ^of ziE3R?6(uPRwB4Gv*$}1zYZFF~b3?o|w{GSO=$uKK-?rSz8E%+yA@<)aN1`pi*-}Kb z%$HE3Ge9wn>Ny{?%PSw~GN4LIsASMdgDW8%U{ysq(MUb8ZLb+`$!-XpEdv6bBS?N?DXFR~PhYjjTIR9gz+x6B>a{ zC6W@?NmQCMuODzw-$$i_>&q2>aCq;CNpWy^j8a)$3m#b9DVG$ zSZ~;;y^Dih$O<^TUz;4@fa_|O6vomCx61^b} zfvGO2L{Bd}oDZ~1!`+i_v28YZpNpUqo?iAO9SIDCp+{MpV*&#CfHPh=5V>nBrGSq; z2#0eWQO40KZO9C>zlDlL996hk-IEP^<3T?}jH)o{5SxzC%rL%Wstv8%(TA4GmQ2c; z!DZ!{7ai;NoX0P|psYa~fz=8-Ex6eIhF7Lvqp$}ITWH(B(eW#oV#2zw+4&2cTBD{d zQFZ9DVp^V2$P|FR5H&>EB2py8Fdon)#GEIuwPn$NMJqN;Mu_(&#ES5TYZcE)xmbulbTW*I;Uxd6{aAI z9mb+{##wy(k=pA%(7)IOJNOM#Y}AvmmZk z*^O)C4$p$^)}kmmnBJw3MJc%qbLaTr zm`{)Be8=VTDVPCO2C%u0Oq#KOBZ};Z^eHRzlt&wZw6F;;DD)I*6h0+hT&_qY=F>T) znbLM$j!V!xqzbg+g6(R7?*#XcUqJw^-_nL9Uhasx%|e;c#V*MaLos!T7$Ek<*s$IfJ0+c8>M(g6UBOVuI2hp#v_p z7&GpRX&-$O(S;rr$vKiF;m0Cmc{6Kr6hqvf1IJks$Af7;`zSQI*gjDzO(7~|tZ)Mu zb%YN+A|p}QPqM2pr2Pmc=)rzfv)xp+ZjAf_B)smj3R`U!`#dzAHr zBoyoInydA5)=feQP(o6dr%Z|yw3smTf}!^W+2Qmx$+!3vKslV~NTTJl=g&sfa_)aU zyK|4T`T-%v9OKk%Y1%Db?!c}|N+M(=q};VZ@_8-^g^?L7N`Wlel8QH9d4u;}`wp+4 zev^~(A#o@8hY$Z>x_02LcV6esH{Yd+OSV^AE;e7V-d)i&8+z9xl)$9{se63v@u^2C z!H_z>+C5_N$t53t@-wFWjMA4h?AXbc=}^-?c073XA+J1qh#wrG^Mtmi-E>@CELd#@ zWHP*a?`v2y<9fB_>ctg9=vc0Hw2OppOAh3ms@4SAkdi~C?2;84tdUvFKz0CziDG(Z zj=F}cr=I@$k~?Y6{O+8S!r(2e&pU?8Ew8_Om(o<3?6n|Nj*qHsO;t~*(-f^|l;#fg zy#r3){D80j>&V5I&-wVrKj-zg-r?xvm?zJkv-_LBrP}nAT_CO-o-Quvb>P4K^FQZ1 zfBt8PS;=oc`z`$*WP@K z)B1o%M<@J$|M%a}5IMbjkGu0DL?1YRalxX!plKZqfj%YtxRu0k>tKmw91zF^mXOq@ z;CMRajW=HB^zay~HCk(=k{GS1OhIKVDhQV6SN!;&e?t3w$>R@y&GPlPFq4v>{OqUv ztWJH+KV;6{qPt3_LEPrM^k?I@BbZ>+R#2*u>RyRakax7)=Xc!i#a`@Hws|{ zk%(_S@p4K3=mK}K!X8bTKfF(Idc>d<$tQ{+SvZ`~1mY z{)l(K_s#5>QyEmx_thNfEAx$!kn-5m(~^VNAD|9rNUiCv*L?ENAMxGqd@Y0W<1rvg za0CwSA2U5W#LK{Pam9;IKI5KwhvJ|js6Q^!}!3!W~o zIG!HRZg(IRS{n*wQ9<$i;+$AYb{E%NefgNf_Z~9n3|1sfPL3Em9vA}GPoDGT&ws@y zKmL%k-16Y`4)47CE^oZ^HYca2y!YnY+?yY>yXXFeD;Xze#e{JKjPJIf1T>&5T8Qs?MRVr=y~w%|LQMz_|BW?sw7I0Q#jCEfB6i5)u20%i5?>(C;AkHqQC4}KHd;y$J^h0 zlP5oUK~r|bIh-CF-u%ux^h3|$*%iZP$HCbV?#Lqb5nef3?dX&vsDO|GEAy#6OII?$ z8D%1byiZ#r*+Vlif!)_1!3|NDQo0f6?*SxZeg}rlWLMlL{f}T%-1n?-1FAqE27yw7 z6tjCejSxl_x0ZBn$>&dcKKM2O&%XQz%+9v1_ku)0D;4NhZyjSX`&Q|=x2m5$Bgr7~CSec&eT# zT^3Nqcyk{z){p`;{gO?$M5u@;bCOGl5=n_tHP+10rRBx?3tGR((R-pt8<}6gko$fm zIetr%JM2=jB%#P1(hZ0qyYFRAL5ajsgq#Q>jM3O06-u-ykjWB4MBkjjG{zKERfSJ2 zUbggUO^6#1DGPd{Mz|bBX~m3ca)7Z0A3N5|=WN?+lnzAM=fn>Yk)v=#jsH%@sshXY zIYBYTN|yP`kPP$b5oIxD7(AC(j}W5A)O#RaBTUJ`@d;8ITDPR}YdX6D)nylf7}fNE z6Yh5$V|mp79zSsNv3K+2d#*JZy-B0XL2I-Bj+^tU7|A&yvV$yl-U~=FgQ@#D5(Ua? zqL*kjq0}?1uGuWsx!zk?j6BAwnn`(x(wd@52;H!1UT}W(B}sMIT40Q&?LAWETU8SK zyZLSSX(kEBKZ=O9lIX{Km=*c%n?^DNjf@jCr&RWc%9aQjSglud{s~d_gt8%#1rt`6 z=rJbR$B^&9$&rxRAt)+Ts*zz%p^h+mf|3?nDr_AX;)+do#kN~wrizVUBUOo!Qzm-O zq_k|>r!?V;p!@7zi54A8R4k~gDYj5-+e`YiAelb9Uy>k2jiN%ODI!fVa>lftVNK$C zd5LoaN-K0(Ag~Awk_sVBh(jj&2usGMjH$BFeBzL%qw5;l zbz)LY8GOffdreG^yLVs7V87oYRYYMZ&0*fy_jjS7I6S_ORt2sf=!YH2v=p+$n-vWn z7aN4g_xThA`?x-af>IoDIJrk@rno+_T3sTsEZS$ZVa2t7LiI|*%Lc6kGER}MM#VX$ zIYClnlR+Btnyg^8S<-rel|9u|5yg(E)?gh%1$^(YR*&&=W6jM-6boX;F-EfNrY=eB zF@WEnfqOh8jte`RX%@D%#}|_@F`{@RSOV#ge$?A_9e4%!wUo@A|4^)gv!jAPG%H^ z<^1~d+_y$gusz8->@0!^Abd{t8oOZAo?k=U5NWsASwxZ(>*8MM4r7(fNV>%YNsRbm zBKm|>DbFX7g`62n9Z9|1SA|jvAHav4GJ}%Dkkjpi0K&+92st{6Gcm1&$?H(m+1w*F z#4Pxd!cZ19Wl;l$q9`d#ja1Ngf$QxOHM)a$-I7&%#no4idTtSFAgHlMM>wv#7Wyng z2|6M~PIyA(&bTy^H%cf-8OIhWVM;^t5}YO}iwlx&xkY-IR+f5Vk!r-Yq-8cg!tiV5>O z72fU8D&Tx#we0Z(4iE2<^gtIH+F?iU6ILmL*gF?e&L#IPDJGhJgP>qGJtQfI5Q^Xg zI7{Cv=7$GNt0PE~;B!H-n9T7$Qi=&>SrPE4VMb5ME;x6r13=4BE^z{HGy4zEp!4k#;?TNvHClcM(i&V+>lmqOIYovq};Rj0g{h6 zAID-*iE|**jF~-VT1=_S389QMu3_g^Oe=|(8=_njq|b^E1`v`RPl=*KS5vH<(R3}= z&N!_~rv8A%_A!0BA_-4BbU3$WYD#A13~g)Lbx*hLNR^>1j~8&EQ$R91-YpMM&=1Jc+@fRdR=mkwP?teGKtLFWgON+2SC zSk`^B`sFnt#eItW&DYW&e1F8p+-EqlzuXX9Ddjkw=m;rc#=fEav-cE6fD|AN`MnVd zY4SlL3J5YgM6O3JF{)IMO{T+#U*s2;Q< z$ezLNP+E-T+T+$Ul5#g95x5;E;^mRFr|`4m7WQ3e3NaOILgBWuWcigaOTBh@Y*r?o}A_t_+ov1+u#3_ykPovEJxQw=@D8po1d_4SNW_k zt~s6!Tdyh1F}kXls+wJQ$&mUyRimPJj`{R1MwU75SO=oiv~i0|8bR)bbuss13M~n7 zj1P{Q<$6KecT`o)q@GYuru5x_iw%vtriqsbQ6NJ{j9G;&MI!mUhlw!;4VfLLmlqfK z<*!-I4R0P792a-E{IbCfp5~<^TX707*naR2LwhB#O#V6qd@COsg6r6-V(6f+1`md6d{+ zI3hxYti~50C%J2qd4)Zw7`}9T{OJYrpm^uxRisRWe&A>_AwAo%x>z#5f57SMcPQ-y zBTKBRD9i*a>l~9_&5?RWq()2?hX+%>`|3UFqQVrG*WbFw!5jA(9$)a~Pk+hc%cqpP zf)@o%KP8`77yNdjpzc4iwi#e#jknx=rPY9J*Mdfwtww-?fv)o`uD!g zogwFL9fWuYUU(zxwbap3-vo<^x`RaF2REN0%kGD)SuH z3T-sT7_`yoqQF`^0;_os7S3~2&nToqgxpD;LI58yKG9q+`Rzv^^Tp?%v)yd4w&3E+ zC;Z3%@V{_&|32r-E7ah5g>0e#p_o`*^GHfKGxUDi+Vq*XL{+(IC>rSd$vdfDd;794v%={!7H3Ryw8vR>M!~Hrw?hKU2*>8F^+^m&?S!v z9_1sm!$V$q_>hl&{tFBR&ULi?F2_Tc1(XG<52(Jxlh_1@Efi>lmx`e(32DON?36b? zc#pTf^8wR`cL--Qih7#i`IMNJlDaoU>JJ5fwl?^GUg7y6cAa@3}f6g72mLSbs!T|+TNOl!PC3aa#Vl~s(t=l%#S~>Kk`x4bqTDis zHAC3s2y2xw7pZc$8VP*w(8f}g6)MgVeuC5%qZN~Cf)LrQ;N!r0y+PPG_6|z)=pYeT ztesQqW2$0~5Q@%i*|`OMSVGa_Qj0Kq>?gbb!wo#2$CrpH_YEnHlm;U!BpRzr2Ipvp zOJefqazKcXT@)h6Wf@!2`4%77nM_nI=#D6QxVe*!H4WoULx>Uh=hmt7yLYxdlCvl2 zxB;;ddo1JS8=ScL+)W(WD0YWP4C%)Cq{f&_MnJGoQ?#fV`h>O`TUKalbgHpx&a6H` z8-a^!w#|xW*Px9gX+gk~f=6V9R(=fP<>!%J`c(dU9Km*J^7-3Eht`(h$&ZN&s}DIo zc!T-m1c7JUUNH0xPHl*~BdUJHwjz$^CP77MO$d<~z~~aq1QjMI=2&seytqSM9bl{_ zsezs=2IuHQix)kzfaphjPAO9ITr97Mc1g0?6%&&{N{i7olVVE3vu&?%Y!Sv2WrWdP zMX-oaVf36yamK_Pp@rn~`b%Q;6lFO&-88{LS=71HdvG|{Qq`8;?{LY(NIF*KDP}mN zR%c9$6O63T#?r?v&2YiCX>h)0GC81WcJyvXl995?eXd>8;)9^H2MAv>pFF^b34ZYO zZA(ZI9cIj@2RPlaN|83U?1l!<7H-LasEV3tJ)@dT*fiI)yA5sJP#&3_P9?@F1;zO9_ct5c*lLCl8l{UI?J6qj zat=w+v<=;MiP8}@2?W&>7{+<1P(l$@$m>8z*<~m-DJV)iqcC~x-L_j&I}p?kX~sU% zAdtc2_e0LGqQ;1t(#$A}2|~jVcWn9#c3$07_2dYRm)9t6o=;v&v)fF`{a%&u`?Ae( z0a02(kU2g!6%a~ldxu$Z9~}$&HVdZ9xnet<(|5Vsu~$o?X)@M?fT%HQj`oMt_8yg< zQ<#dP)O3E$)$$o_SfFPPY)>*_6zYn9dAy`O+i|=0-LA{G97($Q?N-1b_LybNdqE(d z8}d)ck%nw~@hNw&2`O)!-ARay8Qjb(MiX`> zx|J3ggOb1)=^mpW1&7(J6k|?BlNgd1BSS@A|E(@5Y{jIUjzcHM0S|*`x!$netuY3) z&HLn_18d*ngQF8W#H>f_1Xaefay3gFF_U<^r{9d{{c9#}67AA>5WR`)967EO6D~M* zO~YYzLW!X;AXUbtVoWr<9#ixv4aR7~uw%EmBE^lF=1NgIIC{h($k{Kh)@}% zzX7QeB-DOLvCm9R$+K@DmWt6LoMQ%r%q5f}7)-1v^c*8c6E@gSYwbTN{3`$!fsK9_wQMjq`#L=XcZH3UBvPDV{B515t*%<371Eh%lm zV!bBz5i1qSC>%>#JW20}#^=a2t7ybIkru0F_;f&B+(GGr!W>cCLn<}rdiMp};R=^L zUOHO0B)Y^wah3s^p@#^^lS2XqDJ4eMbX>7b&ylJj$*gqD&%wX6sU@Pwv2yU$goBg4qH~#`Vci(`mkk) zYdqVmIMSY&Jczy0B!bKxUJ=27L5TyDsWHVoM-WK=(pvlf_wk2c|3i_*p2QF@5yIn2 zp5iUwmlEiIL47v9UpJhX*eg?W-(BvSb zod%Nd^ayrA5aR$t#n=l?A!}x4N=%XEW(m@ebV7&>yhtU$BvNW~q;SwU<`lE?zq0lw zKeDFhmEZ3jzafU4?_6`SSS(3JiV{t#i5}2^8!+tl#()=Ic;k(|^V0u@0r$qRfi~dY zG}?eI*lkEQx~*2X22vuM5?K_NCOh7+h;nRzqwMr6Fh z^PF>@a}d!nrjeuqN(ln-#(FVjp+>f9ng}!m$!lWFzYl8!x)iv+&7c$+aL~1(R(rI) zBKZ-i191-cLkWM;H~oPb6O=3xNod zBs@X}lnkWQ6DBYBsyx8T8H@P=(t4Wsl8w)2L(dgL#tERh0X34y`{}w$k!d1ncWYrf zV?_GWMp4`}5;5K=yF&61I|O+us8S_X&S12JQRR#kqbRLGNXH=C$)Y)j-4lD9P;}m+ ziy0~w_|TDL%2RdZMli%gX%5h}MvH_Co*-N&O+4hiUq9jG=pOrG!QJ*A@2uWqwR*|L`UR`)E4KY5eb^AwkTWTi zL&<>58r+hGq2gdx<`5Ekdvp+Szli9$;ZFslV5(u%kxvZ^_prvV~C#jKm35h z`*)~L4tQ|q0Dx}2rF{J^)!Pqv=jw{R<0B4^kEv!g${4gYsKO#-ZXUJDWSue^V{@~X zLd1_FIFF18d_abXji7oDP0!1pf6CL(KIins3!cAviT8n-RGgom^YqnIs`;GPUVEMQ z?;o*vaKiDU`yAalo~(^B`tG`c=5obnAAiEQ-lE1pbGG8u(-&O6JVQr8X)JDZ=ta%N z&{Jy5{YUqB?X^c7UtMu^eu2C^M-G9PpFUyjdcOVl{toxveUpRNA0ljl@d3APID7h> zSC5~tes#gKPd}&c2bL#Cyz|C;9Nal!d$HyR|K@v~{o*mTmxw~cix)g{Bjq&RV?v@1 z5HB{Ie({v1ZTadqex27o_zG%&hSyWWJOnPDoztDID5GF8-=p&*tLBWm_wI0TaF7KE z6VRQ$bhq8qi@UZ$kTXs9j}MveEqE0Zaof{BJLikfHx%~|Iezm2ea!A74w&CR=G||7 zoiPMH`N?1L(f9u?UyF(RUwI2tXo8F+C5b|23#0@H$>R7Jb+F({28J-QtV_zWMwXUd z!dc&vW;v7j^!X`|fBZ4u{O#Xne(wk^B|!!GE=;fZJ}@C_AIft)hYe3 zMIzZ~@H#OH!x$?zL(5rv4&LzS-M4w;{dXz$=DevTdR}q#=sw4<-$yTJG&(ZsT;5Be zk%i*Xd+$)GJQ+hw=m_q7!;gRb5$p9DgrI9$zWDSrd_Qn}bj+QHcR6_TArHU#YaAUO za(C|#)q9?N{3)Au!`0@JaU7|S7yQPzKH&XQ^ObM>IwueAp$kJyiL29de*V*+(Kih; zBwl^-fxPwXGxe~S zkX|tg&q$9=l9Y00kqiohz=;gv_>`x;Qi2fjB!8GDV-k}s&*17tltN ztiYSVC_B(C?YP3ZmN0t4pxCe8K#P(T9nQ6kV~0N%xZV3fttF}RjK zY#2pDv>ifCBvMweW-%7ibjHqaB<3k-jYf$QD{4wJ$LfM@v&O~#+R;E7323yiC}lxP zTyhM)C!~R-22d`GPRTu4UW+#h_i4`JR!RA*INFW`*vW5if8DJf=KA|~6>R>=acWA$ zEm2vv4xJzc$+RZG7@MbWV!_ytIa}J))cTOx98%ah$i${O=c;{9>s}FMi>mW}@&tki z`DdzMeKcG@-`)FZhg&E)P0S=@REVT7G6V011$A)@$&w`a)YG%Z=`EOH!c6>i&mWVU zdb=$ARKlQjiDr&Y3#>YzkO%m!MYw`wz^jfStk{MZY{NOD+>)#V6dFq*D`FgI-3DhG zD8|XYQX!MYP*UickOE`e;8`PVCJmL+ga9!ZtXfd2eHP|~nLR{N&^8+)0i{f~=~D;P z#U6chC=_1yAhvYF1u{rRwuIy$DYU3Fc47C?aYh^^(L|!@X@_$*;{{H%2o>0jr}*Rv zGN6n`mzJjAGWG!xETycO&5kh4P*hm0sOPzEu(qHynnX*GTUO0eTzNsV4bkMRZPcUXDa5P@=$;noW3#PtDXDv^irknM`1+J!a|-r8vTh8NoS{cR1JJ z!hlpI)vQ2Q4ksHre@@UXN$)J?(&U75Yn$96iqoyVv%|_rw=kp$H@?|T;>+0k^_tG) z#BP!`>z<~3R*|#L#e}trWROCmV~t@Ct(MG-JJe=LX{wyLCk9r{OPcYFPM#C%EvoQD z;qwHc*g4VxWU-Y<0+|#dYP6`3slwVSW6(v#db7fb4wNU^1aipkUdc^AFJ@OGorR-X zS!67cu_PuS+jMu;{SQUiFB%J;ch%DMuSZ8X3YBL%3v!=Oi-; zsb!e5*=}5FM7qJM)s83($KdV<^%K!1xn1R%puF_A&cS=BQ4%{oUfj<>YmYYfiJdT^Y^0SgoQzt?A+os z#O;-nU$cDBehE3d^)>NJa6-0eWI9_Wf^Nb-W6FY-lqM&ol=46a8I##LQ^}wq8DuI^ za)!|h7WENjS>ZxU*PqeLb3)OP#E>1ngqxnnjwhKm#?C!xdTd!tKiyo}A3xt6;ubN9 zm~3yegN`8WV&x!6kOn0xRGe}-uQTH!i7cMZH-jW4kCZ-V9LkBeQR4b?5g1e~rkbom ziwdC?RaqcK7FbD{$;=o%F(y(Pi9~t^Mzx)CLv!vo5@JD)Qo)ldhn5MYA!$KOE@QEZ z$ywpc7T(vd^InDNz zm>O&mDN3gG;kk)}+u^i-yAJ|tL7lrZTTKlsJgzb3{WwfBI!IAB&SFxt|*T(Mf8F<&e=tnN{khnb}72im9*X+shNK@J3wnedQC zv=)ds5@kn_1+tpfXUqp7X+WyT*!1+xC1R{7(jJxtgA;VUrl@RI@TxhZb6A@xlrTDE zG~g^{z0W~)hoVxfhZ;BZxX>WPfY1>yJU-n_P>G48%M14!*_h6O$$J+uSy<%16W7~p znqZK_L|jEgij1A2kR?^ESuE-)Ljbnh4WmyKb%{)oMR6aQ0=+!Pt0^;11$^Al#~zo~ zNPmU31|tnp&Z*Rrnb}7~iIz1@Sm9ESPc1{&5XOeo7C5IM%`kcokrYxKP^dj@n&I6@ zkeVQ~I!-7*<)Gb~`%39r5xQ$~5{WqZ;O~fdNV(>U)1@P`U5yY8NxN(@r%O@_^juLC z6{Rha$v9p=$LISVQa)B-? z+|*?L4UF6WhqoJhpxr4hrVB_iHGnBjg~iS5bA9UX@)WNB6VqsX_Lz>75+%m*dfG;% zfbS#c>wxqNj`triU)-lEOPp-E>K%Q$U>JHxlKt5Os$$6yG>!KRA(E74msgQQw%NUT z25HJCOxNq=R;1xngou1^+`6xB)|-Ion$J^Uj=^mZV~y2&7`Z@-03J#+M~+=?jAR9( z$1@^iflxVrH3^R`D>~OOujg1{30~k*K-v5|7V)}tg0%D4&o-1K2ilRmz#$P@qAQc9 zb7Q2#;oV3n7ARd{jX;Poi&T_H+L1<_;!;hi7Fb{-q)Dhji{ga#zj0Tyg7n+lM`|PO&wz3#mU+Koq?HOadV)P?H zWZ<(Wu=Nt*70-H!Jk`i(klrGP0^uy00_#fJ^^%XCS`Ib`RPzP%<&v+z{te=Tk&E>! zUR->^)3Z-`dGSTA@n}KxXyvdbp=81&fh?e$7tHPztez@3F%+{oWzxttLYXk5LXDF4 zRmbJo8TaA?%KHn%zNI`US=^}+reKI!%$8IJ#)iq>E!Tn~PZr$Us}$4)+DD#!@+p^>7d$_G z3DNOE_1jeUj`3FJ%&2O?z2mR(@Eh+#%1w2W*(xMXdrBI4ZSyfzD+B>ymrb1nskCTS z;+#jsM1eqg;Bw3Q{EW|^e9mW&KcnkfTuKZC{Mev8BoP_i$ns#H`)|I<^0m9zMNQMR zY|bwk*IQ_F4R~>S#*hB^d$eblEObGkElDZ-wnG#ad$`a3!9I896|b5r%>IIh@4d@c z-}wsd%X9wa@BVXq=Q2@jBrh+Y5N8EyF+&uVp&wX%{+#vmQ=a_%6P`VOjQ5^{lOs;v zc*wo?-sZtq-lnQ*e)O;YlxM&EobxZ9QL6%9C{BN-`C#*14iVWF*G1|PKK|*)y!iYH z#omnf|DE4N9xNEN$QijwkeuVwpZ|hk)3C55^TMzmd+5$NxqFwrgMCOK5jmGmiZAs- z`3Oln2k88;^MCtO{_65MkG}P5+rDnqIaZ497QCLHR5va-B){4Gp`*pH0s zmS%Ou>}Vg?_K29+v`w};ef|vkk!UqiRQM1X1{h;cg~JU4P1CSEK4#OmG;w5$Cn0J4 z1~rTXDd?4BBSsn=+Rjq35tIM`AOJ~3K~#9_y@$N@@BS_3CkK>^IY9}$0wpB18CG9Vt@#p{B?{Rv5#>vA6yz%baJUlv~n9n$Q{ULW=e@Jz( zhg#HFsaQXK$sA}%M@c@nFPPw2S6X&0N!RWxJz+!*S{=;Lchf7}n?RT*cYWlM0 zDqdx>ZD&X6v#p~NnlwgCl#EF-M9H8$BMFys#g=XAa@2$uF_UyD65Lrn_$C8-t^DHF0PQMX(dM-_MTudp8Nf7uTrW_c_81nSq^;;BZ)MRIs?Hna@v|6&X zk2tR03pS zh8&j?H6m#0;sC4XNU3nKr*&((a79!@7XHaN)vq^Ga{`%d+~FD%A?~IlODemEl{H2h z5{Y))plqI)&m!L}!Zf-jkr;i;;2NUprx=S7p+Xj)r5)IL8>s#3B;C!*y9Km;$+qei zDfcCUF5UY3YpL0k%RY4v*S2H&`dhNYNd{o8Eik44uTeTt7>(5xRWV~$Es$DrzJAKf z<}us;6-l?0RU+w;I9Yw|Z2r=9&vhGwPJit)LTIk@;*l6t5J!vA3#42i(+nX>I@b~V zF~<#rQ=Hi#i`+knG}%dtY~!hfMnsA58ZAo{H7d<1uh!KOVfuNswJfO1 zLyEYhD&`n%7>9voxIz~SkqlPOsO&z=`VOhz(sWl0Y0JnJNv#=U%8nZX6a_|9SW!~y zn%G8Gn{z_wQB_YDFNtPE6%a(WaJIHUs~ROWQ3$$jn?>8ArZh9^azVd!jALL{Em$u1 zvfwp3n*N+s_XX?mF^zbJnRzIN>>!a8G8zgs$5NvxP(l%f_ zi0dsNu9w^n6S{FhVOo1kpS!^WZWD4hyo&gh9VTw=!ThIB0cj?E{e(S9VbBy9Y6`KW zHYXg;A5z&l5E;fb>+YP>?Z-HMg*Oec=t(-0`+}WK?e0-!!GlaPM-K^$CcAAIU89sC z;_1_xR1Byhh>+c*k`s9isv0Fr+TN36cY6ACiMJinWZ`_01{n*q zT2RJAmgRkx^$A*7LI|||C7bpIT|8x!7xY|^Y!7POS$wg>RIUw2Q|^1SgC5t;G&?6T zF-7`_WRS@qy~$*-T2iuyW)ECG`y(S>t?_!zIy@)XmbeqHlCu3_vXpX3Ef1;XA^X(< zR$AQHu{{q&Qr z$-HT5a2KyZ#-fwVqG2H?t70(`mueEo$dVWpQqHhy53840T~U-4m$o$ils27_s-Bn} z35O7QeQ~{lr}rj%WTu)S?-g(|gBcLyDRiGCF$vgB+69dYHCE2iVh+hLPI!A!N`xATVk9td)vO80 z=L%A0SHU!MNFqXIVlDwOqzPNkK|xvg;U{r?&elyb$j9u0m0*jGknoAx^wDMVGDtn;x2FW#VT(x6iQe@S zLA4u0%$tC86JC2gQz3KnAY~5hjv*qIMxh8^A);ko?Q>WjxlY>ugz;M9k_D za^R#=1@q++Eh@Tp;9_-(kPe|oqV9l^qR@!Z;I@H_u4nKKNsb&Wjwp(n+DJrIQp6=; zdx@6`g&{B?L_{+}h*?~hmnlg(f*kQ87fRVHcbo{v$uC|Ac50(^Yw9lBjRutTDD6<8 z=k)3cN*MO*yOiaE%IvYGCAE^|9Z6*JMB0c;Jwkefb@c8EQlRTMEQ&)G^COmv88jfh zWgG)tbA{4^!=oiql?-7(d4rCI-mekLBk+XKfsnK=Thr9`n0o(+Vw4C|&}w^BJM>^p|V;rbC%PA3MhWl3{&GvIEQd9@du3bq!)4H;i1Kukqed znB}B`5Ex~siaDcL($W(`M9PR(iYPphY_FD8C%eslv-x)X!EQ<^zs6~ICQSP)PnHUu zZ3d;03}a;2Y>{fDm_@9qXu2(Zx+Dop3=%0Nd$T(fLUH8{n{Wokg6I)CWNSx}Ck9?_ zf5F{7C{%@yB{FIj)d|(C=4|_fv&}Pva@aC*e)>7%R$%2Gsy?PonzF1RWKwEw59z`& zQI-s;VT=t)<{l=R;z3XX2WH&mVQp)*S)0rdyX$3MSM2N_c5MJ_P z{R{fgvR9vAWsQ#>QwO?kg)I!m)-;V{fA1b?9BF*Vn6^Zz!0cqXo)`j2cv9#PIQ-~n zHVu_NV1Is(xtXIzN9P<-3ZjTywdZuwGqZ;jrl3-Dgb(yFlYZLd5pO1#B2L7h5SkEM z`gnyVf=S@RbeaE6RuBJg-*(O5ts|YADn+WDQu#KKaq}jA<^6n*hiQO$I-jLP5J*0g zsA3{JH=7k=oMT2o?F|dH$Nu3Sq8Yeq9D|oAZ5Y}SJ=2-sBC^^h+M&f(B|!{~sRbFX zH_T4BAf`PcCJV#q86kFLu(*9+-HiC>XB)03CqK81R0` z>K_6_-=acIT`rl~B|eS}ZVM_u{vkGa=Md3S+C2H$Ie~KyYb9ga`(jV!YZCQxDQ0RR+*v%&KSa zdz29TkTxr$LK@JeM+z9PR)j%OmNkwUg*KGZu+&Rr7{LdewD`0or2e{S z%gRUcdYlM9v74Y|w+(KrgEHBhKiFA1N|8YkKRTolXay-m`nE#^LEmUZJIBU7jF=Hq z!aE2mB4siCyLs{`O?J>O^+bP3QCgIV$S~!X$~+w(;+8%|A{EL?B0WAfpt4=4G7>k8 zY`1IN<{4&fn9WpHyG4U{+0XvXw;xg(h4dvwG(=glX-7P{v5ql&g;`y&T{Y;?aCmr! z{pyIBULt3KU4CdtIp>a0l6+Q;DHFMS^pGQapM~2)H3p*O@^XtZCCg>S{IEdQErUJ) z;}}MVcUe3&Y#YA#smgL`toww8kJgytj{y3Zy^_OXW)*Jbc7~K0s^* zr;jiA^rw$`^4U3`e|(N93+_C8!22IcmiGjzE)b<8+C-EQsWqby_>?WY(1P9v3acni zmONU1z-wQ9hvvyEe)5AK@x>RPb2e;weDMYPi>LhgAN~PnAAdpeJ)P_5l4oQjhKLGK3(a5r`44${cE(#T zpY#52e#o2ezQyC8{1u=6?B_iGtDn=HU2?S8Lup07UK5&*PJ6188Zj%_-@AvN*POiZ zi1)tnAT?^oYT`+1n0Q7e~gnLuAcMx@ z{e8Bl=ctq@O3UHN3BUb!zsucs-hjP1PDzGU!{`Hct*el2U0TIUr^Q+eTt+I ziQc2MzSe!E=}z1MR@Xq3fIs=c_j&fwUvk_FthD^aAAOHaA-VhR8-(6r78W_3kz)uX zBbnVh=9_=(+x+SJU-0Qqeuh6^^PS)M9kyf7_kZ+5X3HhN{*ABm;H@`sT2ffUcfR>8 z4rIwczx=1fLDGbQacDVubjK zqLpl72AzBg*@DezR7~ikNG=j^$dpi8p`yS>!Nv14{^)mqkKyBItUmn=Ed|G~m3;TZ zZ}Q;Xw+WS@HHlUwI+bWtViaM@`8(zAn-BTU?|hd>j~-FZYQ_}V3@y!e!}Dj)_{C3u z#^)dZlI_(Rr4$#J7wjz-JbL4GzVTb%WdHaWEfnL$hUXuB!cT{UxaxTM@(EQ6+`E6D z_rCcxRDM6lSiCN(gA-k9eg~et^7<3k)ruzKB1A^lan-LF`!l=~oUPWhLx)I;O6{?< z_qjj&Dy7QP$YI{l?p^Z9)1Tng2D|jwr6-x5F*R)3OEz19caFI(F)nd+c}ml-7`Vin zEy8w$*kqxukfbO{$xP83lf}~X7DYa1b3}$Dct1HcDM%Vy80s`*xC#_WGq+2EcPQ%- zYMR0lC05T_R42$(&}~QBrXh!XNJwgVAk{Fo*x-ce0lqfVR zl^8Xr)N_5$bx zB=?P^oIk&FTHDqCDP{0bq7aygRI#X3WnrZ@bbZ6+>KuxIv=S+%Y$*(Thlh;L({yWw zw1Hwk8&61%K*our7L&ksDkRel4)xc2rd`E(3r|b8zV~k==(zR&+iz)#6Um@rj0vL1 zm_U*cH8Lu+C<)0>nq?+@l0=q*x-KbAiI#yboY6L0o?U*-C^qOlhbkh-fx&MODxz$5 zNeP|_f4lxgf9dhoRFr0hqQ>YMF(}rXbLM+B9X)-#pqDFxZeeoU zk*NHdAaP^fvnrKnS)wV4US~VXYC&a6eCvq1rRg?=uz|Qm%?G0GiDm%d^RHM)W;4Up z8|nKktKovns~2Fe zSe_Kr^NOevn`VQVNrZ?PV^E@I=shtCR1}o6in=OsL&Ij+;Kzt852Q8&mk1MhJn;H4DPxxI6r5jVSP zH`&H5=cN>HEzMgv(ycwjm$z>I?%k)aafRIho9*TV79kW;mN^5F8CsMSrl2kgr11pV zve{g6arKNgydspBc(Y*?ZH~Oq`HsquNltco*;OtRbOtF3geWn3MpeuaLNNG-&aIJE zkJK(ZtB8Oy`T0r|!6%54S-BvN0v{m-lkLN`q>mfY*rCdRC~^#okP0RgT}`- zgLj;7o^iQ-ikSDz7tp7UXgtECYiuaD|9_nX`4VO%c7LQ>*b%qB4t9eTUpgMAVkKR3 z7(0?O<4!s9B4K16ut`x}PxmKh5y@iIoLRL;Rn7^)aeDQbF|3KI1=DAqV8R!2ZezUl zobs8Sah?1a1R|5D>GoZe>#bc65t7d}#pHxI1({7*aTy!J8)Tee*+<6(gd*E!YeiKW z>@1R0PqS^fdUi@x=b;`EI|PA{BtFFn50j**&|$&e><(5}Y@3$z%V(^wMyk0&m*JYI z8)BDpcXa|eVYK*(xZ4q2k|YyK>70Q`!UvD{BSPl0B@13|b6x3rE!wp=4GpIo`iZRV|Q85mMmkt0&a6in6XU81G`vnz;9Mlh)*}GU>Foq55 z;RRdwf9wSCRA`$(Yzed%sD)G$kE9OtIY*O zg=;iotl6I(LrT=kf?!7)v7+OW?f5*8kkgQaLmLHXl%JuyBj)J=NA*Lx)-jA7b|%oX zNIRUWO-1bgke@3vncOks5w17rCu9X|F;C_|1$(J*VAlxO?<~ zd3{0{3%Vw7=j1M%?iE-5F^zc2ATNnFXQBBC^jBI=suK-yDr$U1B@S5>N0f3#^of4l zvI%E-f`*7hVsy!JafFbXrfb=DtI7L(3#tRG{cHfToLt#qy{{@LTwUrk*-OYC{xa~nby$t zlOmCcyS!F*pUWzv>0(47(Wt0VUQ@A$TWOlpL~J!umh2zyk?a7)z`>n;w4JkVHVk7! zhz&lq=pqtjhZh||4pWY*$c;6-xvkvm8=dW`cDWuxfOiovC}~kjF#7EzmXoNINwa>P zkiKGnafiCvqwQK6zrx2h+X@gEJ5LG~$A|YY*3ykFty|&6ilnneLP!~mQQ819E7+q% zNkgeC`b|WPGiK(PMRi1ofzEAkX-yO@q=-p5({ffEp>;viujtb&23B}E+1<*35H8z( zhDZpB4E1Y-l3Beg{8X?iVs9{RAJH%AuE46AJ9q9ObimV7FKPsmZfMvJmkePIW+bSQ zF|E)O5R z!_nabm@ID8mC9?xT zDq4aFjDuk46V8u}=_*gfamg6hjBZ4@0z;mnBMF2CJp;6xa^glDS9o=b=N#mQBsxNL zSi?>B0SXZnDjJl~s434^MuANhoh(`!w6+wwpb#3X3yiLi(jtWA;lnprF7m`uvt4s} zamp~Rfu2Hp$|6$eh)fQHV5UlHHN%90{o)uCDk`~8E%%UvV)J~(PyhTcIsf7X!UgK8 zVt%mX{SQCn&Refx_Ls!M5VU3_F^WV~AhpK(fQS*9a$cE^z~Bg@%cqEv1Sz1hpk+R} zV?xH<{E3+D&;95a`ysndkSJy~YF5#P5w8S7DJEY!L`-O=518&^ z@;#i9^y%6b48bD-BNhE>&8I*98DIS5=X~^MKji6WPZ-ucMU03TnIR|<%%x>tEol4z zN>G&*#|OvUJ3i+8i)RdNL+@IWNX+Uz%ELWGZ5c%(SjqDK9X|NZZ*lLPH!#Z?(Hiuu zW+0*p3n3!=02dqnmw)t+`S{O%$RbFN=KE~No-djU{?5Pm5BTbD{2JS?<$K@z9^JM< zmxlMg{sHg*)`!gR9ui9hg&`W9!Qk_j|NX!I$2|Y&WBOsFvl6!~_z(Z{|CBdB{3_+L zMu&j7Z24FJ!$0HYf3zq_rAl)SKs0)j6|)n%XARP-t%Yw#~<+f|MY*R`Sdya zqQFbo9u)j%|J8rV2jBTkyh;pyzz;pPveZ3Z~4pL|3l2H zhS!S&9^AQ)n-~1rfADvC|KI=HY;8hog^xaamIy)V63cDm|NJNa6Q>`2!omxTOPoG` zju4XhV!>>GA3d)qj`n%$*T2St_ufHOhEIO_Gk*8K{~y_0Tu>h@`S82n<{$ni|1lSS z;FC{2<$M3vzu}V~{)By1a57skx0b@FETWnfq|)%=Q^P9iH!E5&^_m>pQIo?kDt288&^EC>gAm+TzloBc>N(62k2?CN)(}cI6NP=oe zeEw&D$v^vV{yWO^mee~w_~zI7t-t@bIeP06<((tq+_Ke?D-{^5AXr889@}}!)?}HQu z)ivA^IO862T7JlVa8bpUAFNY>0B+#`I79Btwbp-PDv_xq;;f)crGo!SDk-S~bg6z; zGgv28Q5QuBKLD zAJCaAjPYawr|Av9{`SAHPrsvAuNinlU)~~qL`T(nvB`r@1|RO|fH*+b|K^T5^;Mz^I1Cb}SYhZ*IRKsR?m`Y$I7m@;yPM0(1t2 zSDKt+wcG@hZqO`Hxx=ItrY!KZESiQ>zpvypJ5hAPI7b>4o;97>AOgGTHL6KfWuhx6 zh)Iabm9WC>9CDe>Nd1Z!xT@vy8Rv6Rh!}|M*87|UmBFIWNmb;nTDpm&KJO( zxzFbNgTe>TN6qR$DbScDDl8yW*P83i6)^?IcqZh5BonqZjHxFwf{pbx)&ZkH6@$(e zof{l0B>4I31>SXZt0jWa4`+sPKna`=Jt+@pH({3%v&cjf$tu;lkg8JhEJ(4C2oxJD ziBu_4tbK>qmJ}*@T}kmZKVGF4A0A<4MdLa|GKb@i#@m{qC=RPzx@Lj#3M3Pz5sIQ~ zSN!&uUo-Say0u|-l)Le1_z_5E)3f;>1( z-eTE6u`E}f;!Riig z7c|X+Vif&wVv0vfIU{f@6 zRh@{ND!`x%-gcxMtF5Wc70A-1f&^-g15z_kd{HD^z+yEE74G4B#YMGr0V&?m;J*Va zzgxi<@MZqT{naW|HD?B+TC^-sc?qebwO6dWE1b53Y2>&+;=Jc@xMP@(C>v?E3cCsf zIU%OH%f(b@Z0cfTH``n4;xN*nONS~QnwG_4!#JKu(j#Udsxz6PTBB->(ss5uuW=$K zSG!`HyE%eEXxk2Dh28Nr%~}!48D@J_qa36L37*DmShY7S+YOS0)A3ZZ&{W~o>#sTO zzM{Qx*mZ$fL7hl*o_oE1YPQ*T<9S3?JHsq>#*P?_s`F_h4wD*mTH?xv$E!~uw&b7* zQ)HOVY;GL8^9!OrqI@7R&6!{|4^q?8xR%Xog;v5aoEXO*Z4{{#`myG&DpwU<*o5_p zERmE0s9NKGcRzjr&Zvj~?;TL{FLvb%(EDHoy#vaCdz@lcvPpFasK8X6OL)^lc9h^T zvcahhx-?v0-H_76dDt_C1Lz6cW{R3f5^8R!Vm^gxl+Z;jcQHg1m1otx%=6NRbFp_I zHM7+vGoY6xB2pi3&8A$S#Ls8E!m}Hck++O_N6H{!3%Q}O zhOX5ZBi!BHk%=s~4c($)>@(rqV(@5NNSqkL9_hZLHaQM2h6vuh==_ zY_1b3P-n=c+#j35yMEyU)O}~xdH=T07}KS%z3dUCf_}=>Y`Ro8CTw=JY00|WaO0k{ z)z4U%EmGikK5;zm*=`p!wkrCRS9z{u*S3Uk5EG-Crvhv##t72LzqUU*pv0h#0k1Uk_pHd1*wdP zzIbfR<9aDG>%0!z-dzA0G4H|xg?5oKX2NmA+Ky#& z&CT{PHn%VVNzg{vhdY8g;&scU8iH!;MlHF5aYZOhXq##V&5Yt}eTgxwzW2FgGCihg zFp|hIa2R^_uiw(@Cp@}(hSr5x2D-MR^NM0ujPXoAo(XvZU9gQM7a``6BvASn7+N~J zV14Z=8HVweltUc^^@&^zi^UU`ZpjdYA&iKbFbZ;+$hum1P16n+I~up9yXvq(IFCoB z@)lza`l`?tn9M6qr-`Qfh_2~S#WD>E84a#|%yqM&EjOIgE0VG#*-;p(1*VC_az;5# zQ9_n#Us#xjrDZ~Si*6mw(jpR>R0XA#Z+1W850r(=RJP4;qEx#XW2StAa*@d5{e!O(~)%YY!}a1FIR|JVv|CJ zM4tkpJ$kmdOF7S~Iblwzn6G*B?%2DqP;{QR&l$v`fM|pa1&Rce3Duu@t;n`8lv|8j zJ;7*L0RY@bLy0;Xm!Qz?(sSu)Y2!W|=Y4wVB zu^^@elO!^g;S$uD*QYa9FL7qUaMK^u zE4sx3J0?!!Eu?~oAxvOcvhEs2u?!`XsrJXB()?I24`}|IO6Fr>2D;UJIM)YMb35nj z>E5$mYm{SNQ;Adp+H0m5$el;lnvCYrtqktfVTyOeG~!l3E(CQ#WI@w5G|R`_9fz429ARc0VJfprW|k1T5L7~S7ULXQdd^9+ zYOmO|8~T{&V`acjRbDG#)4@ts3Si_QyrDFlYfLN==YU0qdsN@<*5FohA(1!EwT zfB>%PDCUR|pg@G(8yVHvwjbh!ext& zFvNYWJ9NZoFv^qXqFGc`&1N-%HW(Z@&{XAU&7`Ty4bcIywysrmLhFpu7KOVfb!g)d z;|U~Q9|e7=?DDp$HOc$$KSzy<&?k_{>$kt<&6{t?p`)`~w#yr?x7DUDPCdiSglAo-?IYIidd?}s?k*`kf#aC%)qVFlWN0WWiPcxFQAKNiAGYcIi#lL$DjOw zKX~sW{`_D48OPm$;c#Mnz2nWVzT}&q{hI0Sz(QFX>j`Njr-+*@+?}}F_2l!J4$Y(0 z4R+blOJT4rL6JWJGDS2s#PzaN^Z3f6H%v_A{pA ziHNWdCmPf6)1Us7m*0HL-F}B_8``er&;HH7=H|m^EZ=)X^JtB%8nUh#Zw0{sqCj20 z#sn#FJ{<`$Fsj7OC!g>?{;&TFAOGQJ_|9W;rkr|qUw*~i>$k*`SwDHi=J^xOIij7t z2O|KKR=oGY`}xv)tZI^@BabkJgcVV_VyO@-XlKz zqtEb*jt}4efM5NWzvrvZe}|qXo-S5AU2n-ov+qy5`Ppyy&6B@p{p<<$YK7T!JpJKE zTz&Wqf3-$ggS8G(5T%~=)_WS`u}Lsp%W}Qq=GhY-fBFH3uU_!-?|#AlmtWF|qNKoS z>N&=qUPelGocn?OeowPqqpd}x&|a-UMU2)M(WDrVJ`m1TMUg{fJf8XX*T1FY%=Po9 zJpK4XR@Yk=%LOt7`d4=hpTFR-YFTs+yU@hbz~B5o|C#Xjf6Gn+TrF_#J>v0?KjDXe z@h7BQ?X1k4^R(aZ`Sm~joZaiUGsIsbfjd3nW_toNt$-qA(J90VZGY&=}-SP>mNVD zJZ~tC5Nx0iXF?tcWyEWX&w-{SV#!23gLGvE>2x8NL@JuBGxfh}f0?LY-c;s3gGvq% z$ume-5YaOzVUgkxJR%NJm0Xl_K&b^y_Z+95BB^1$SYk{8(^rya*^l zXj;LTBRL!}al)k<=5ec|S6!?w#5*D|RUSu%&a1Fv4aAe{}nn>Rdt^bu{dW|#(E z-hIxi^Uq1mEvea)><%#pvaW6}S=YhZSSAu@@Mcyl=ea_)vxT8Tl}fo)V$jrlA(cEv z{9Niz)#l#>l+KipF}g+L(Xzm+D_Xr~`}lpX{1d!wkRlw;2adxn?b5T@v`p#5?)WXk z*t0vGISf6Rk!Cdznn1BVNey5N#%d&00<@u{bsa{QY`PmLim~r&?n=BvQvt0hMZ$1K zcMBzaiN(N%s^pkxiuNQis9v4hSm(QK_Ae1Vfe&D-y*S#j*>3S=P3+;=?~rB$7bq?uYPLkPb?#Iy%4B1!1JZ@$ zHl&Y4OXpFLeAqLQ5ajL`FC02KAyDPL< zrf}joyd=t*XzoxplXWKQgl=j+q?)smP?_q`G^_Ykoheo8t?&1sm*>R{l9XymNhNk$ zG4-*Sj=SR?OdxS0nG?!qq7jM?C|y7^=d=q-IkZ^F4pNKc2CvsF7F)b)$&xt^`#Qs8 zAUD-kOsRy|8SNv=O(YeFx%Sgqn_9m}Vv-DAQD(K4wu%@7)@vXUWkNh;)V$wVRPlJV zW?`Swupx!O7*BQG`$Wn;zFE+;Em;Qk{T`)C%{dZb9PTK-XVrO{P9ZuFN}^jWIrb+g zg4YHqkzxYLCsH?}B-3;)&8il!%2XRoi3XJxc(tH$*BDtaO@Z_AjGEO)Ne$R8FA8A=ZdT_Vk;4MMykE< zShO3AS&|}r`}!ry^+a`|n4WASVrtDQ8nT)wdcs&3a*y#V~de z)3D{RKcUHV&635o!Q{Xo^|~pHh)NZpO9rnOw2Li`TOtC7!;T^&S&bAsg2|OQq^sJ> zI7K0mbEc?j$EfWLYn2DFJM-}Meh+^jnY&+0zh{rGYR>zA%rm4~!_=Mq;uSp483ZUb zJJrnd(~=81TMQj4H=sPeS#Y<%MVU~qC4U4vGMQNoqG|jU3;&3PYtf}J^e4;|8HOF<)H5tHUAx7VEk-%KE!eK%$}P}s1?c*;XMZ|# zI^NNA7G-KgS(f@-M5X(=a0TIXb+AgchSZm6AFXSi-Ruh^Gp19?CJ)!Mn&_(t*Ub9$vyay%m9-vcFD7lgm>hH^hSZ2j;C2f{cFvi^P zweRq^?|^jQXV3gM2F5e9r&_m_+5fcqWt-B`loh3TqB^5fVh968^(5VsO)ZQPQ$0Af zsxMl)prRMw)ENjQ&97e#`V~Rs7q(@nUZW>exS&!NDNoWH5)&bfOlcy{)>GLWDLPWjY#5@{JYW1&2VC_#t96<-EW2x(oEgI~+l0--cZ8_-Ole1vj#9d+ zy6^_)J7ON0@*Y8B#UepaCetk!gji~DsE!mJD0(C&MN}PGB8%=3e%Ubf5g{OLwXQ6s z5b&sL!_>S+tAbNooZg~RM+q9@f=)FwW=&EzjPiytzF|^3l;w?T_07s2X=K9cJtE_5;ZYlx%V1cf1~%WHbTj&Y@v1EfG6~&`Sm!Z~kaOTYl!YN5i0ZZ$&n}R-B}{va4_Mz|ZG&i-(wR6O zFbjoiHMvxV=%mIvux28rBjP-r7moQ{Lx{a*(_EudL}v(MNo620&O^yGGd}7jSb=%< zu79~$8$8^akDJ#Z& zWXyL&G}#JS4Rz3o)FMl2Qzj~tVxYu<%!-BHU_7*@Ws-?0pUEX4r6)-bYC~g}G~Qt7 zAO(`t{7F?QgoutaGwA}&$^Co(-+Oz9vwf$m`fuMv?tkdveZQlsQ-yoO_W3junH6m_ zAX3-yg!WYpqB4XK*yTV7M;h7FnkyEIMK!5W4pnLnM@k8jMLUmkTf`QIB50K1dmlxKxVuc-6I#DAe#}rJ&?$gR1SE%~J9_46pA; zQJJJC6bapGD4CoSqfAH{FvVjm7z|NSUu*`V&J;Bgi${xQv05?4TnF(wqFl9Vy$m9l zkHi4aRcth~#*pt4())|Hs! z-dUB(1vpiKVnN%0>oj?c47Mj&UzvoZI)J0EXiSST3U3-j2{Ab+8Kn|Z%)KSTWzD<; zaODAjTRqx~)EYxwtRbMPj8N6yj8YY_x<_veO{>T;kbPZCQBeyx9IaR=7A!3N5C1C|RGjVH^< zF72xog>sClV`53GmP{u>XGh}}w5|gJQ`pn@FWL8&mphMjaGv%xD_BQtN=O*6E@PF) z*dxlnB}|&#FwmD1om1p?fiw%8_PElKjX_0EqdR2uC}${HGsQFK@h#K2;LU=~@)6hD zCtPiwk&-1wOPGY53#JLszQ*S@V|+njho}>j5p?ytH@ar!C}XN6qbX>eF-mZ?I1TjbjFoGg?Jzj5+beW;0}@cBCrz*LCgYUH>JDetIJ2Q~ zTfAKXEg@U{(z5<&!TRxI*3X`>c=nhQBB%YHZ@>MP-+lfiAtg4CzF_(IhV2K>SU$Z$ zjG5p6suNao^C1S}d=8-iXKQsn*9Uc=DOgj7dbOm{v#L<$AA8qHSKID+TD)smUtQsrEjbN*@YB!u(O>=npD}pYF)0OC@HM-ROc^C)2x_!y((=E?G`;;I5)t~d(|L{}vc8N6_H%4~9 zd&NKgU;ml?`OK$3`4P{5^eK8-?W?rbwbr@x&${sJ`7<8h+%THjKdkd zX)YvMtezb@RAIEjqaS`qIh-l`GlyUPj>k`)uzUH2Fpfy6E8_I(Ek-L|eYxj%|NKkZ z!$>&}bP?9J#Y~Cc{_LOm!PCFQuRGrRgHKs+)?7WkVgKSK``>+yyt;$q1Y@9?3gcnV z?VA&~zx{@?Z1B&v^oJwMZ@z`rgV8Lz1&^ORVS96pwuZy)j^F;~3sOJw?8#F;{P-iT zuD1B=HJc|lyn6kbuYUGV=zb!Nk#QP1#4~4^P|0Gx{F43o!1kYi!FsvIdq=ZqF^xwz z4%fD{-jjz336VHOa*W6r*?s#G1j6+TjyGRo8prkZHB6E5_Q2uWS8Qn*!j6n0?Dpg| za&~Z+M$%Qs2b-4ny9ING14iKW*WdE?7hll7y5;j<{hDbUdHnP#&p-Zv4}S6)P22MR z2k-Or$y1hHHv{>au^$+ZJMMn<1>gLqf8_X^uNmK-P-wLGlq|H`;?^ttyc-mw$X4+p zoY1=E=|>;(*PK}vQ&7$mQsTpWClh`Wkr`#s$G^CC>?Nx$O=&lj9JiiEkX|{tX>mG&zs$z z*SlM~g`rtSTtgi~#f&Wu1z4pq5^?j)B8GwE-5ZX#g%mTJ8_Vi(z`22}&m?nZ%4a5a zM1LTr#LMX=`#1lDF&(KChO}d9Um)#~;!hOUqjW$>6q#AxQuj@W7}cP1B{WeQEWQql zB%@T#f)RfnR^Y-oI~^`vA{9?9lR zawnpi&_*Ff5p^c|iDs$Ex=_h-HT$mX426MI&Ljds4U}dC9l+F_oeObODK)do>pquq z#;RJkNvU_UVrX1bRpcrXN>A>NGr74&PN>=Lv}7SN5KSQY9dwsLZ_T|^s^%USYA>X; znaP3josav71{78C^PNVjetgF#?E>OmfIJ@DN51#7_dkKw8c8y%&02JBFv-q<7t*X4Y1Edrc}5o= z;mU%coY18@y_iLr8!e{oO`1Q zQ2}f<5NukHw+>@GS{y2SoLR6~T%pD#L!Z&A#WxMARTP^zjysB}Ky)d$=oO51?&C!< zse)+}s*E!*tC4J2cUPF)kaJ>6CnnBBGg3@MNN6c29GByS7BmWFpf%yH+M)oea2 zvnV-NqMmxUFFpKxKd+kS7HW2^QIZjl$6m?bz+zWml2!HC6 zx;X4S0OG#8Ezf<>JGhto^*BcbJecKOoB*|{{YiC2bL8aEvPQEaXNdIpwh-7Ms)}5S znZPDuiDXGN$I#5@-erdI9XsO7*L9|R|Go&bxaV?qF+X=^mnnnDeyjjuc772>;abS11t01zTvuv|Nl4sLy z@vg(Q1=S2hWf}9HA@odgqSz7L6~tEjLoV~X+KJAyNqrBN7OI1jzRygbXRY}G@#G?W zdHAM&=LnvGIyGl3##~<))nc_rl&U-dM3Z{K$U{%%Zm`gFMg-hC_P)KD$nQHA~8_jsUQHDC}(m>HAuBtGo;sy;Y6#h*f#HDrfc$; zQKiM{mPRc|r4GuxS~JRPrt}tL98xBdp2({Dy5Ar6riPg#0j(n_!+jotjA+-RThFQN z>C-omTAr*wB9;VGi%}iR#g-`=MAg9Kqy}P`n8uMz##u*0gVq-B=Ypp6Bsr4Gkvy}D zM3q@hF^5~;pMIBM?8_y1IZPB{A?1W#7;0%bP*u(vv?1rjuAI?Xlbp~t*J!(C>V;M> z@GP)pi3%2SExIPTBdH$o0kN5*`l{wpnGO-f5Y8Nj9or`hP>~eR)uOOWXeA&cV$WFL zaw-$Y(BjJ#OM8v?9V@rSM4^v0Y`)rWRe-tZ3^P!oNOO_J<=NNGYCaU-fkp2W2h2sF zvbE?oRKUN;#E=upSajPWC9sPp4%2J4>KO}L4~Nz~rHgC!gQhPDC6NmB%p3j;&Y@E! zBiKlG14BNNIbl>+8!2j-Y1U(9>6Ji~2n;yWQgT9@dI&^PoDYcL@6%a##Gzz-_)f&e1hL99WwOG?s<&!%ys5>MW94oHcXPDg47>6ZM zbRe*&l%WpFt)U=u=&YIx$N9Y>QHoTyoK|zN@!UpuT_yGsQ6^%HATpw4proD<_o&#i zT&!#GHibOf*oZcyaw5lSC3&^ILRVU2ZPHC;)G8hp4h5r4wZqh@0&EPVVGqGo)|YXJ zHHa%@btac1xf}?o#l#IxI`_a9>!@)U!UvfN^!mTyia<)Xc6`rhuGRS8T4HGwEn%sAtSqKO6ips~4Q zI%~XIbLF4l+Ut5&s)0OBoX-Q(p(nx!E!Ura&evc3j@{iIUw-v9pZ?)bSl(QrQKTYZDhpc8q!p!9byS%19h9lL zvoYs;g_}?ti!w8)MQUxL6*vqz&5HCH{5Pf6pT*4ZwVG?lQttn*RT^b9F{im{)s#}m zDPy&%Wycg5?~WY5dCQwGzT(9fzhkvt^U2jy%Bmrh%;D`VFMsnTzx{`w^YdT)obh;= zT?T|@u{^?I=UD8%)LdrgJiUt~dfHT=^ZejX{)p?3-a|UiIZcfH#Nq87WeVgeAR%K4 z#Ph&-d*H>dzvNdx`x(Ff%`foAkhNmH-f(sOh}Y)>{(8-)Pe0-Lk3QvtpM1vZ*&`;a z=ykQGLYaBkq-vQ>wOZSsj=Y(U>}=*w{`d#{JgA z=JpNm{ppWsyu~-3M;|`p=Gh~>(R}@nKj&xv+yBWofBg@%V`kl~a9B>m!0EIjpB&fE zAJY~^xIJ=v*m1kNW9eHy{rD5!fB$`~v3&jc7yQkC{7-~_;Nwp|q5rc#;pu0e(0u%q z=4Qjy58h|->2vm9y`)T4mE}uYNfV`7+TFc;$?4lybjso8nVzxLzS4NdcC&$8aLOP# zBPr7;OIIp0I=t<dsbbC5vV$6gDHjE(=B7pxV++O^^6Zc{FD!`7Q|JH+=QW-_RD#)0@Zmrs4fhKjxDkf5!Il4M_^qII%k(dHKz^XX z=lt-m{v7+raVmR+6W~$FVpT&d10j2Yb~M^Dm61>)v1HN=)I}+zl4pR93f3{}c1q2q zO9)OUvJ?vQ9;d5EMmeo zf{`B8Z<(fT9VB^=Zw!4ML>S+4 z*JolhXw%>~8rPnQ`T+WjGO-Q?i^51{rdKsowFuK#Y}sPeBb>UzlonMArHs|32Z7?b z?mj}5MhwrkR!zmWH%5w zqb-%-EC#C-#TH5dBP}}5geV*7r#)G!3PN10wYRQBgo`^+DK)}EDLXqXDKMEV3Y|6N zSuw3DDY=+4i9}#PUyXz?po+mti^7toOe_bqD<~h){!BL23RCGa*W)t(-T6Gc3}nrv zDu35^*7x&!z0>7B_jTsnOMS<3>;lx4@7?$Ey$Y}>>Yi-1t9G7wg)2+EUEp+!(KV+m zslZ`)Rms;jkX%nO0b`}wyv>mZRe(`{XQcpDLbj$7d!Y6w#+ZBJ<#&3(?>#=|oUQse zA}Jpj=+SL`Pqj~ABBe|qV05j|q$o5NRUB59IJQ`~#?s=gr%0fWdxpFtn;!f`)&rvB z90Q}kdP=TDb*&OwE3B>H-i7GTY;9KU!%B@5ky2+eu^?grPgMpcz~g0u&)1l;#-s+T zJdJCKc!o64qA7~nU&Psd&Br=ZQ?@E$i=o?W7*4}Xtj>rG3{0p+1r?L7^?u3|7LV(e zSXZq}bzafvEt(cvI#zN`p{0}oHP1_w4Y*Y%mOV)wuuVpHXR?c=lF-_swWX9;2?LTb z#-gQxKqY>O5Ym~EJ7@x~$xJy^yKEYCYVoqc=`}_z(5k6wPRUHuo2j?Ahr ztsF{8wH`&P%bBY0gVSoZF`m_Ll_fH-r3xNb2a`0b-(~{$cfjm&KNq_H-aQ5}vy?6a z?+3_|y4W;A1_S$Tr;}b!ufQE zYb@63N>(fyZ$+d9^g^+#gzFu zJp_kpJVXWPq}1pL5fJUUtD?06W%9g#J=kwA4fp*zEBDyfJsIQvK9{>+ z{{OpNw^`14zc$qj7;7 zH7l(i&gm+7;$p>o|48rglnZ_{NBI;xTUj>f+~QbJCWocN=>?K?jY`NK=c^5D9(xYc z4%IreTH(CI+Xmk>HM3R;N($b442f~NXl^BX2pzmt=oHbt7)A5K|t^9@V|D1qG_i1a1+~1!byu3#E{pt1AuFmG0df>bqyQ z$UEZAELojj*7+L1;ApUBg;7g@8{QX5)vNU{vaz{(iB(=}8&A93qM zc1LhkQXNaA={!Z&6taO}X;cz^X zMwo`k`_JEJwdqJD5zjq2*MW>G)y~Z5HF;>5Lc-W3&O36NP+HTP7Kw>I28vkXU@&b# zyNoe)@Fy0qmO&CjdW+bEaU-D|Q7)m45W`54fcI;(A30BF#%Yg>PuR5YvC!A(oS7ye zOp(QU!E*T_L9N&gEncq(;efV1$@HYygDDgV%-&CckY%cc_`K#sz?g*Okz9Htw`kY$ zCPwnfvu&R9X!QZHz~Ovkz1gyCIzk@lrvt?+G9#40={O-WaQ)~hA`V+LG5^1$z1fpw z$#v%U^W*M!i7nUKda2&fO)LZfQo{`thcg*JcXl1r3#%Ih#HB7b(A0m@-S2)NjY5DVr)d!!Wcc>c+JqmTle0jk(Rhu z4BJ3-hS~f+Dp-21iDr*j$KZDmN7nlnIPaLxTk3Hhck_*$AJTZ=FI}l9ICid+61&thVw75?_YiMFi2y;Yoks6{SrXkDjb#7#* zJh>Pkg`P1vTyOAupX~)2kJg?TJz_LIj)d6JkA~fLPu*CwO`rluX85EyUGuvc0N>i1 z|H~iWvinQldd`%Jh4AzRYcv-TnJaR)N#dZpvyXg|C{%jf&s{F-cZ%qG{>{ z%2k-ypiO4jTwiVx-QZ#%>O90A`+@t%OH!X0U4Rs_B}9T076cp_($SbyXWIuLD4+8) zs!O6wmZIgQ7X{soYEua@jfl0V5Fz;dz9k>tE_AriQME0@;6Q4IVNVzp^}NE?JyAt; zRgpsCayOzv%Y1gotZoU(5Qm-+XF111Wh*C#Ba&55sSIVrKni)#V?<+g9<)!_Aw_PO zpb=LH1_r5WMAsk#y~=hz!SvY{QHHFF3qn#BqZ-b3`)p%pG6?R{knMj}y0MuOC7JE2 zBN0zbj^6KR=W|q5Gwyo46RZ)U^qJY3JS2})5PQYd_7YVIW??{$#m+Iaz!ZuYMoeRf zF$4di$qaI>AjJaM74~zh%N|hd+?0SOGv`9h7;1*FBMt&lnAJ1dc80YT*P9I?d19;y zX(XhfuoTDq*%x3WrrRSRTPNx4e;;T0yu)OIL{ZbEV$CJS5oHZ#xV^u0Vssr!TYTEk z^%W-7Y`Q)3*_*5u*|U7N+mfQ-oFPPm7@NVdv?r>ekc0BRs!d_fr9_AjQb0@ulQK{q zUBOEXN`#;?z=b4~t?*;RsluQ__%Y%!9=taVCtR!N)l<9WeT9B3rb$ z%+U7Pli#R>!857sj3jhnk1HI6p2{TV#?UB(auK5fO;u+WHUX<^DipC_vmX+ERP1+K z-g)DY)@ZD*5ot-GqBaK@-Qrxr`H0qrqy-lvQB)qLB*o|h_T+#MkAK8_-~TOMy?Dt# z{=?6C{GInXdGr8fEq!n~GbqM9s8&J@Ap=dKkdnjfy(ff-t!!@mi|Q>nm)+U}m>8&) zqKOK|L>xVS81ci16_Y*vD^095$qJa9{xex%s(iR(LS_^i1YE-H0}?#G8(E)S@cdU_ z@XP=3H+=KS=fr;GgAYICn>XKQ_2FY)tuOh9|NHOx`@i~Yo_zc%7P2+1Qnbl%N=pm0 zR0LD8wUO(%$A^J9dgO9sS+%_T_(NX4e2G3;QuQnLe&E%sSA6`BKj)h-pK^V6frP|^ z)e-mG72#@2Sa;N$o=37kY)z*kx~j3KE57%mkNBOR{644eyos!4I4krvF>1vS@|mp5 z(9$X)`fM3Jjw5GRm(1>;uzYxrcfR)>j^21cFgmNj2gesb|Cpcu?N6E2Gk)^t|CZzT zACqP^UPT7ysEy5st4OiC7Hp-N&*v-;R(Ngb2gL^;eTd9wOf;V4Jt=rpicH%3jQt8x z-L!usGN6-CERGI&{NZ=_=zHH~_{G=wen1U@xb3I|xT5a%ArNE4SWA$|5CXd}@~YeN z#rbQhWY9+FHEjAFYHs-O-4EzQF-l^2u;k?Ah$mls!u^ALFa(}`@&%XTdHzqI@h>o{^f?x?B-?|$$;Km3zFfY$QqlP~z`&wd7@ z=lM6!dHMA>4BI^yFJAH0FMow3#l_R-eD;fvdH1)!%kTg9f6l{q-{wa@`Z161J>t_} z{E|54UekNe=(6>vN{L~!Lk$i!dcwY^Qo1Nhb5ELL%7Zs0=mg3~Vn3o>1|oe7DCe-F z&-wB{ea)-w8E?OJ%D?-wpYZmSGiw%`jjL|ZP#YT&ZBQAPe2!s?EW5CCNPZ}2`TV9gYbwO^2bYq~L`MJ)I5n_@I ze5FJbA(Dv#%bDS7?|Aj}bdXJMcMjZ)tfSKZ=J13?Mm<^%>%|XLFRJgIi zd6UUdbP7#C7wLpyc=t)s!n&_X+j>;}L z){pVDY{rDhj74=wRUH!53dbqV@7Qd&eEsSirwalrm3)1f@&a1&LB5dlZg1>i7{epLrRq2 zC$!dgcGkPCRq2(!)vHZC*RK!WJ9F{TiS4=*5ULJyDMYH4v1;8k2{g3AEBhRWF2CtlY^NU@4|d+CxnOEON}muK}4i z_+RME_ubVOo9W0V;#xbHsRE<(KS{iE8(AXN1;_Unxfexu1 z(hfwm$FU>noL`-7OS9FpmMa~)kI>xw@N;yMltpymCTW}0zW4O11g|Z zgZ6X6w&8NKL$x#Nm8GgddQZ3Bkh+SdT4t=q1+26XJW_yMQHH8&sZ7n;`3p!pX7hwu z1qRkx38;O+BoahH(I8=tjR(}6pwj^ha}T3x#@=)JdXH9t`Km!xJ^OIM_3)g~?TE7t zm_5!6c-0fc6=8|w%-R%jZiltm`ks&wV|ae?l*%;d%0bf=J6fSq6~qdOEtWY}7A%`% z6o&n7;QIO!tu)qFSOv}-v?z26q!`djBTDeWqjh$Oi7t>rys@2|)`$}Fo?m*Z?4&i2 z)POQ7uZ_utM%^75-%L=xHTIqeXt#5te6Ok`SrMFamZ?gaM4(lb2>{dZ!X)as;M|Vh zZ5h*+VE1^v1DyxNNoCTeBB8CyS$crAHNkO%K~2srqHp2!?0Gii)vm_!U4bNyp!SHF zFp8Xmu-5^ClBQl%Pc+T39ZYWE;~B+kS)CfXqj*p;*U` zdGAbPalwoD7;!0LbQ!7@(+*=yeqY74ukCW~8XGwxzA-gwb<$_9~lwXpNC3*Qg=ib3P2D)MF~2KR@k=lCmA5 z~-8a8&igOX}bB!IPAueM@pVs zi;OEOwIDf2PN?;YFfQr45mPDZIRt$T)ksWT-aEDASQb?T88PH6N14>+ltF2^*VSa@ zS)x12kWfWIQU$3(#Tp6u-#XTqRH0*w3N3!GXzhwwyCSN3s=k+hWWDQ!N~(8 z)tEG+s%Nx^D;CWm>)n=TFVEQRFR6yeGRz=dGW3q!rYEGx>R!Xi!qE;`m5$Npkq z8#G;K*zPa6>RvLc4ec?+dW)*}Bs-8)4<=g}XRP#2T+no+mPIBS65-~URXQO$$AP7o z&s(kK*LXFl{J#w9QYsf&6Govn^FpL*Fw(M`A3|@4+kwtqF>e({<#R|$EH%nl#2dM; z2~h5Hg%-I{HcmLUNVXbHX;Q9EuWiC!73N02R%#9{k^}lm?oYl^vUSDekLyAtS&G$D zjY=)}mf#Xn1$O?N>-YsMu8D0P0z`3n)71&@JEp=!Y(DH`Q9(=}-pz-`B&Cg{7%?U@ zZ(|6AknN*nrfKGaq9>+-h(?sfmJe8m21yO8g`rh5X8M@9eneX@5eanelKt?Ep?gKA z&M}QcW+Ui5fjx;KFZ4VLfTDzoDk3J}U0{p~nF$ZxywBh}`m`gdExOKwgr>E`BTLwU z^IQ7Ww#dUZgSy~Fcm^BIb~7+`P}?OB4jwU|y@{aNZF{!cJqb^g9ZH8{g%}Ca5%m=@ z<^atkksw}r z$H0g-7O5=JZAiZ3a(vC&HMFwg=;Q&bbU?r9*}cv|j7Q7wpljIrGuGn^I`tZhR19aSbOsFtgG~)hc!Ugd z+%7P7ju@e?=a^a%?Ve!QNVP@T%#eu$Qf0BN=2Cx#-wAVbpVhrLsK*&@uVFZ0-rhrO zU^kwV)N2$wnuVj1Ku~A704{12k;$S{=gmw7lFb~(5C@dWs#M1nqpInBjbKsO9AX>i z#MC0*<(xJ%U}piBt_k!-VK_A`(|#MXjbYjHZvDrnZLHWS+-WVOSmL5wDSk$j-ZO>` z5-WUc>H24ww4yOH8rz`bA+gtpcW5)_!1L4*#p9AIKPTIuL_A3fXrp4WY4Ic-vw^1! zKvsJ-22}R=$g*fv-jALJU$>iby4jrnWsh6G79~-pPG);vL_vpty4{cS# z>VQ)ti4N2*??r?RyaV6~F*mk>cr&PGvH&S;W0EJ3h}xk{$H1CgViXIT;)5TRCZQSG zlT5a)Q>73sW3RIB6^mn)@Tglm5;C)AOxYh^S&L1%>k#XFnyGmJ03ZNKL_t)_b4h+l zX+Y*Z?M#uBCW;h=eO9ARO_m7RnpP$za@p&q0(r{AP;vuZh$?G@l4TiFQJ9UHja_LZ z8pb%V9`@K_#?kyfDp`in(~o<`v?tViyxKCdCaQg5T$Sq{6JbpFUBHf-S|2i#Q!Fc# zuLyl+iK2Ag3+y$%d5)J$l6|^OB19_Y4;$9~SM1L(nd?&y7x$>ln{4)L z*25LOyM}rVb|A9P#iAC(B%=2Ca$Zf=c0t8bCx!AkQfyoEbySjz)gTUOrUAMqsvV92 z)oKKbR)*DyLUcmwJxWDP9@Eey(0Y^Envxl$qQRKVyatUif~XB`Gl~83wbWI%kg>Ct zZgo$N0JRnkLU!FGWnzmEwj}ezuj_m{WV{|_*=%lrK(#_?$<02G@ZL- zvp>UD@LRw29h&8FZXBb+NXyt8y6u4S0b2!>?hx4_$)jTd{&bI+HI?qE#8Ih4Rp)`f zRux(-TASQVDvy;uGl83iqk}`*Syl;Z)nHVENR6b5=(3_$XBXYfj8j?R7vs~a)VHh|$JYuyv;IuvDi_f1izP@5675CdiUJYC3 z_m6o0_kPIt{_8*B{zva3%a&jjPV$=aF)`^eQ%Xq8!RX^KU~>0IKa5=OcRc>?NBsE5 zKjxheKgjo=OVmlTd2zhn*W-Ao$Eso^;`vfi9(9%=@D#NG@k^zy0=O{)hkZf8yu-CD$)r zb7W>TyFfcas9;nPWi^7v$9%7<2+z;XczX7l<)a6D`o%M3^bi%N4LD$>kZ&SQe)z`TDN6y!Ge}zWR?pu^(B~Emab>=T|)W<;Q&S$!F}gTfSMp;^pqV ztiQ+t&4c=ssy1{l)*Qqca}q&oPV|B*f$Dp7YiX252Z%abVc`_BdvD|0Qy3gCzkJ5$ zzxbG^pMSyr>YCbCc|VDfeb;e)amI`D7d(3SHg>TjSi@%6^7QpHUib~C4^R2-zxpvh z{K+5i-bde|wKb+2Is4x)Se+j5yTA8Ce)o@mpVeCrQOg$Rd(>E}ZV}KkL|aC`r!oc; zt72(fVN`W9r1R0?bt-JGo>7 zso4|!=d=sU+wWDx&=#kJhLkjMa_7?!Vqa?R1DeI0_Tdqyhf7qPqf!M4YJGsjiq<}0 zZXRLOoRkKVv|MgGwrjze#L;q*gU|>xt;W=fz8`ZAoLOSx0V!6*FjB>V5V9qz(n3lV zKE&*jQk2M6W*82c$zzuKeGbf! zT%2F>>g7v%x1%`}nz`ceK|`}h4DKsF-@MLb!V}Nop+!_p^qKUDS2;7YL}X~0FqTMk z0b5E@9|EEb^Z5aiEZ6%pa$cK*qaB0J)@(t1sYPNLn&|vo$z^4OlyivbAd7Q58p(M5MzKMjEtK*rq}0 zg!g+c$CsJtyD9`i9nd!S)e^$(TtJncMIz4S&rs=1Vaz>vzB4lAKliB4gBFc76*_5f zfSbeq6f-=a=8(3ksdPoZ8`$qUS_{jSMbGwJb}zUdU(&2h&MzCXi<4yr!QjTM!mJui zHB%%#@Z$U{(#(;Xp1o{~^`|cw1?Z3!o|;2sSW(Ag7V16=a}Sl~bk~l~4Tudak196( z8CPrx@fv5ZaLop9x{}|R6*fstnOM0$m{dVptFp#@xkg*;@eCjH`W12Dg~}bF{UYbz z*(HYuCv?M}>+Xu+do+=DQ6ob|8XIgl#8RV8&0;ajq?VZX66YO`JWvoN7;UI+&2F>J z?l~osGwDFJ5L7kLg)_GOOT5}s&lAa%$O4sDp+Yka?55#twyV55JSMAYZeYDUEYY!s z&|p}Q6O=8><${5`--+BDLIPzFt;)Iz zx7d}+I8+i3X@Jy~ey*S}MTin_2KL3h#oVsD{BE-yZ_=J5rjSTyFt*fcMq9Nsl>tVs zH?Qz&hm(#l?{MNu^g~u53L)d6gqtCoXqERM$oqoiR~gBeA8Hz7za-UL4(=Tg%^IiIIF;~mEb64<5&=xPdbd`Qpx@2}T5s2B#6D zX0+7;Nj1;UU*We2?^?78tY(KGmZS$1iREHNYfcG+rdtnOZ!YMDEu$Z3mI+Y}x`oB@ z3?KI#HZA=iTwYypz5j;MJIs)+&Vw_-#>HEy2o=D}NqjyE-TI6?W zg7q@+5Kx$^fmoqplk3uDD%c8KT%wgcHPR%a;N5p@ahEy12K6&8#tKD~;Yf@#_g z)YL?!$+ApPqHuBKCU8{pZWObbW^RRwKyW+OyA9j@ z8C^Vwc8{%l26I7DU1q*0PY7d?_D|Ez%<>2-E5N8DGS^hL#;(Bi0sKhNefCrpg)$aZ zSLlV1{D_-xNXh_;Ky|+XI!k-+JFAcs*#|>^HDlNXhTdb0=J8PNqs-<5kmZ!q}~EepHI=cjfcs*&w(OWH(IZ*mxGs)>VP5Kn3%X^}D` zQUk^mU{|3uIJGC$nlW9o9yMt{=csvux;Y@EL^te+L0FzFNVR838@jM#Oxq$aFPUKF zuqN5ETTGUf8GuKRsI*6+5e#~gRZ}CeflxCJiurtrNx~Q+`0O9AY(kl=@bST;Cv`75 zuOX32!viG~!UsJiz(P}Jqu?imyX{?a2!le}^R0J0o{lM|zAwdR)lo-;O zxhcx$LqNz)6(eP4QEY6=&ZTZy?n#Zsle);vZ;pd>I~Xp_QvUiKX3W3zk)~$%P67L0 z{$!>2&upEnD9WF$y7{j%kVy)Z#m% zoJ+U1lV#{i$`)RVl-YaYi{;#8fojMwKd543k;roPm;~nyMzu(4k<>7T7ViY_!J3M; zZP2yivOCX&2?3<+G1IAgvp3ygZ>hTq_xxUBVd+s`@5FB-Wjm#bRg@bXb#sMoEgZN3 z8uAw=ukX9?!fg`~k|XMTp58FGWHJtsVvRE~o)ZyW3SU+3mtt>Hx|X}lvAHIc^86g^mIMSttA?+XzxhBFBLRQ&()dK;oB{w%R5@W!l z=rLS%2?-TVGiSLt#3n;WAZa1$lr3$9oJXj}8=D8F5aYGi$h63r)-y`l19=VsrTr5V6|8=TMS%XT(RGc?DmG`!4a!vV!i-tG->D~o827M<0C z%3zDSRVI5&HA7P)S+kO@eaMRNoCj74Ep@wVPR&J-l-Is0tI!A%%b+?YDiSRkn zDt2*ECC1?S`uTGjpLp`C&p02hdHn4AeE+}sW6a^4F%_kO=sa8|a{A^QJp9gkeELtH z;57)5gT<2SaLMJ^kxrHzJY4dFHx7C4had9t^RF0dVH04x9%+_KzWdR4k*4BrfBK(s zxef$ zdY>dJt3XH3$*iXHBl7vL2uCef7bD~T8f7$(n@5b78~*t}{b!zj^@PP6_c?rYpLQ_= ztxMKijj1b030oPA&ADa6;0RF@f+D#{iXK0X-~*pN{gl^VJ>&e@OE%{htT$J5zGJak z@!`P-oV|L5avqc5>S{w6676cqcKwPJp{eIY@A=;{1zu~KVoru%)#*yVH}Ck;c@i4H7}oh$^W&xMlBjx)aauHvxldg zzW0&l!h`;B|JFN%`!Y&5tp4CJ3ddu=jF>Mygd7ooqNsvB(e;awh2_a!CFJYqfA1j z8Q!(HFoV$I`~az@Hc-_XYb{!8P{ox4ht`?Yru+&s9MZ-)b2~?kf*VG}TXbmHtapg- zF>%JQ8`x|v*^k#;ZNFxQTh`wgS-P-8+HgR^-khaPZglQVO~70hNj?CuP(iWOCo z;)GJj2;6{~`OM0FP=rhmn+{EKlQq?@X{s2rB2Q89f&#W`b=zB|LcEnJyISQzvq)AB zmO6UMw$4O0xxu||Ev9Y(+x)!T)Z@3Wo!i%ZbK2jn&!#^snK|Vhif*;(reVK?j#RKHJF>;&F zoNm7Q>+cHEO{;JR{)8mN;`KJ+CsC36q#Ov8d-Mni!H<#3C~Q@stziruA@q1Q1iK+M z10IKuBUxjVKYLwrdb4OC69y9?Hd`n9SaPSBECDqdP0Z6mEGE}%-jckalg4sDqwg`R z-(e{asHH-s#5!Ftgje{ui)ph1N~;#wctGlFa8=G!o>iDe;q{(fIOn>5 zL1@-c?V#Qft8Cd>nhnadC+Fxo!=gE1uI?ejjO}KRih;VRu?s~XcbpBci1mhG)_A)n zm<_>n1aZYGKVLURslUq(8z)tk%6cFbRk0GzL;6_k&?N~v)l~k7rFn$bGe(!Vc-|qk zA_R*N&_t9sG;%=G+#?J##!jO~!@=wrV~d(UMZC>%K*~tT;05m-!Oe24LanhgK{bwz zf5oQ1VpKh1BU&Xe*~KhJ6r_S%#?lX$;c}V)b@|pkJ7t{bB`BzvYdJw-Z9{Dq1P|-Y zI=jx8k$M%u^f>9uzBXZ!sgMMwKD;1KclugVaivTXx>NddmCE0_vt+)thHn30S}(U) z%I%()%H9!Bq%dMk3o#JALnN?R&d{;KyMgQ7HBma8ToKF;Z}xbd6_(S!z}?q5*@>2Q zPs-6Px6^>q+cOd5Cu%~$-V3IB+mGrJ*-@eylDc*2Q2|Mb7!}bcjB1(JCp7wyFbWqh zH<@Ul5?W8u5Dt-wwwlrMkSeZd?F#35y3mnEMNk3n2E25*w9kV{T>jirRu~E@_n$Hi zLgSs!z6c`|IpfMYGn4I3x#mGKtxsuE%D)&h@zhdb)trhGTKgvR_6>}x z@V;l)ZP@JA^zMp|EmrN3w569VL5A$8Q}*&{@N_dIo{o`F<|BEmLDmfB4DC!>F+``S z;tb=LXn#nZ9ueyRNU-%$gZugnFh?RZn%?GK8LO-?8%psSor5X|%ZD z5F42t%rGV*VW8Vxan)aQeGzDvnkp!Qc!v3&P+ikC9lFX%j4@~=)R+f#PU|uQs@ju` z!|O;;83PW}38mES{d>E(%lez{-CRrD-n(}&uIc{f&X<1Uac6aA&sTy^%-cD&ZSiqr zKWy-JhcS_a&3BSmqRX=zRWQQa^*%jc#zk(|-v7(bSHHPCOfT5nK3yqHlw_7s32;_7 z62SuAB};P9?S!barJdGuf~p`0Nheh8&~^ZubIm4zKW}rz6T5&A8SPfLMbZt!zHEv& zKAk1TK0(g$k>Uegp=lu6n*cIn+^exToFL!8->Wo&ZbeN@>-F|+cg0yY(U z#4-rdHrwK)oU0fx=$Ny8V%p(TML?mJxsmQvVssniV2%zo(L09Nvogmt)rwhc2yu>& z9it04SK-*xhY@iDI#qf2CZ4E5VE~ONDM8ys0Wx9ONm70fDv)H%U}v)6HO^OfHb{C& zSQuP*_G47~m7UzYeRRKKn&}Ujnxt7hxV^CA^JT2L>q_p6o5RD;* zEzWHbHK*bdC+F-!i)jolbvUjW!WDzRV!o&d!7;imDP&LSMwXxyBLh);sz%eNa?O;# zvl&e+p@iT`MhF$CwkIY->NF-aSmp%hNwTMkfqA_^H4Bmw+yHI_B;wg(RAz*`m@Nf5 z{R)MJRG}>_j1bM9Azl$ok5r1}Q?^l)l94o7Qd08BZWi>o&48j54Eb^Afc@5<_M6*Zy7RSc3pbGtBFQMwhUiBI z)!~!Ptagd?D(_L@4oI#@`H)w6EvLzXp%iGTY{0qs`*!h?rXucJjLHJl-7WY~{~w3Q z|DT5{Sn+RkSO0>iyz_nt&p4C9yjJaLz>9GyW(n-Esg88W+^pd4zSHJz3ALL27_}Q&I{gX4?*Z%OajWwy926aN|s?D4zSO4CqROp?>Xa#^w-Xonq!0 zOKz<5pXY*KtAv$lmns7cMIHbZ%Oqj?-h4k~&N584#G(=!pEF~~f%TBVGga1{L1$*N zQYZqF228U<=FrY-76*#H8?icaa5Q4ALP?@B6^b5-S@%+F#iI2nW-Mlrww_U0gVBn_ z$mPWq`;A9S&B5Ubt%53bRH~xZ9kq@$xpnMc#l0WtY6^gUj{P2~0>-3A9g$^Q8UA_Voq3vrBfD*9={USHQgHgCG5X z<%3g3qjD~7$Si4eUJIev;wmLrn=@OUK7GpNK5`f>(s}%LPxPL;Fh$4Ro^HRzUtK`0 zS)X5UeR0LXt23IT6{fBUF3?@AxqAMZ^JmXlpI?%!aQwyt4)sG2VS!=4-Qz^FU$wMH zE8ctmG2i*&4>?^P(4SxP^vP2`efET}*Js2qGOrpcZP~dUV}f-G#Msl0TMk>z>d~8= zeE1lRLK)3fzoR`^a`@nsgOekw*$izgMrnqt4PX7!Cw%?O&)DpDRBeqimURexeYN4r zMCzj@a&HBzmLX4=2{D#4m^&o43`$IZXO85^_w8ae=kW*ca{s|Y=2Zh@;Nq(neExU; z$oa3H@a)OgtWJ;k?jQUfkG}sMXtFg|X8+%wmMWzi!b3vgP2$0akJ)xxY*M`O{SSy% z5o698C3(@Dy_`}ItAT!k2acm)?llWb>sqijF`bAy@SD_d}4EP$@Qx< zc9++TUC-F>Ny#%`Rvb5n)GG+1Lrl)58ALGFu-_y+0d0jLMV>r;$`y_mn@gI51#e!Q z^We=lc>dxg&tJSCDR}Vk0S6D?qY5o{++n*V(d{|kZkZn#j^25b!+R&ZUs?9fadiJ4 zkKccf>84o`CfYn=%XpUCsI_EbfmHTTY7Nu+^;He6odQ5VJCq?>p+MV&2v?O|~H3Y_@E7Ya)(jW~i1; z0U>)v0za}ygsvXhx^wm`s zcbc4ajJWKaqwn^~Q=L};+*F7sWiO)CZh7DP_92+2I+aQJa|^EBD%QBcgOW^S(0KFf zrZBogf}Bp@$=pndDxJyXPLox%d7qyE{yV_mZ4u44hIDXq&fh+!8u~7TIK7|S*EUsD zxi%;@?d>Zp)ocb=H5MIVKb)hL;Prr0TY~J6W*|zBPXkc}CNq=CD)cuWcYwk>L%N%~ z<>nOnc9A)KCi$4U`Q06^SSDDd(g#ji;F-)Q<)hS~ES0s4eb10QA_H0red>wY6X}Tb zAReE50rhXY$|MCXj6S2$S`qw+F%=S1CWOoM^DGjZY)_UKYW76wh!XPW9`frlZ;J|MnmhTNN}ONFu^9{CWPLf#uj3k%=ZfB&r_*Ol-<=lu z<=(u_F{xrzaMoZ`Vr0dD63m|9c0{uS-;r!zdTx#far6@14WFb#2PWk4oWb zrI;|lTsX>WDP+vV+MG-0zIOSTswHPkSvXUfOB(kW6BdLa_koYS7FD&uRxOKVO=O3` z(VB+V)R<`K`&;hzZ@C-3WU#Ms^N!K)2zJG2Hw4pX95>TYGo7@MffJK$=R_JlDT@|0 zYMxGx3~^;bw-g)KGzo*qHj*~gc=hGJTF{!sIZ`WCvRROkT+`=}j31LSc zJ+1=vfk9S`e$D6xv=w$HpjL@K6YqoVh&C%yQ6a`Hem=`Bb7VlJD;W6nJdPXcabC;G z94XJI#2ok0-f1WwbF9OU%a}z^NA)xf%1WaVqn>ImM7HeGmSB29yCbmAHrTOc&=QxK zh)wCR7L}moaF$Z8`5rKE??mkZdUkh~ z-a@_f)QcK#8#cFFF6T3BBZx~_pCyh*kU~o^IUa8KbVJQ_VVVbIK8IK)N?x!ufwfts zBkB{)c3=j?fu?Es&EaCwEYUyqM2jR67F$^D z83;xP)V8?RWQK{~vgH~b4Z|=J#>~*HXXhjfK?I{2w9KH*RP2=OKQ6h+qOr%#Mpetg zP=Hevz!EB@wsZP%OSgZGiE|!YeT-63V;==47YsHK z%pBvCz{n6shR_krmgF6nJxXpqi%D3ivm~2hDQaS|N)4Gg=Q~vQU=6Nq2=SJow~Twi zE*`RTHM_oJq-RlOn~16Dt{yBer`dD_d*cBtzBkizb65p+Led@L*Vv{Z>J8mk6GqE< zeL+ZpK6doFWw1Nyc1}O$z$yd&hR8cKIg&A0=P{%m}h&YDqtE%-OeyBtJQ|RBBP;hEXg{ohd5Xg;F`!rpOcbOxh3=FjJk>3 z^*8L(yR2%fia$Q7d?3 zWV4ZE0%>aGT|B?vTS*TA((zZP3C8Ig?jzhuv~1F4qjn>jB2hY29VCMW!%Fvgjd0RgEM^NVyMX8WdMoh|N7Hbuui=k^bRX zO$9d&N%v9Zc6b_cngkq!`H4s)s)vLrKcp!zpO}3)shFN0rC6c|UvrRy2mKMgIE1t* z_kulTG3sG$nCyW{;7U$Pr-I_?nmf(nQwHI&cSkslv+~Y)qBuQ{#VORvKMBbo&f~PD zj}0l*nCPjSD)*Jt5z&Y@5F{c_!R8*bQF_#lRLzLAJGAzUYtNfuLpQ8AcONtN4{)=D zchKz>jSdMFwO^pt(U>_BEfOqg92wIJ^+REa?NH6&;}~uswp21>=5o&`tGRbiD!tLH zJ$YopL@uAmd}Ynezcx~8j3T86n;wd9QvuIg!3ss|nBQZi6w1UL3VO~YtfWKXE`vuN zBd+vHooqA(5iP0ER4B~quIbcsL9Z~#ON02#KlE58`=vbAtc<{hrWrUp_ZS63z`HwC z1DZ;aPF+#pSxn=2cv0uEu6wL_oaDYZRvmZ4Ej~Gxvoju@J;1tvQA=YTt#7Ghp!PPe zJ;s9ZSgG;M@XV>q5^tASX-Qg>ZGQ80A2+91gwa!4dW!R%q!%*HRgkE3H!F5`TheNe zZuZ2R4KM!Yb8eo0#qQ>ge&5rZL_BMG)Gj&q4YsyKqcqOtVt~uGVy3JkP7EJBdP4Pk zKcwC#%)2dqJ96`zmt5c8up2ilsv4(}tA|f`^7s)!vfWLpEY?>l9 zY9A?9ZAL*;?i0E=ThcBUS)CDucQ0S^)Bp9)`HTPYU*O(uxwv}3*Z=7E`Nr>k4?S-) z5lE)u*|dTmBNib~+5kNL^kbxQgucgJEf{Q88EH(IlyZ>{$x6AHN~~OL-c-sw6O0jp z7KX0_rcKl>>mjg0#NmjV(DufF&a8H>%MF~yNYa~~*cFm1)7Z#?5qXa9iRYR9X8 z^$WINU9)|6%{X_wdH0sf%Nl7NGP6`)f6TW&dd&WM#p2l$p8w?My!zEkzWCdp@~FzL z3EP_$l^7nLol_O?BpB$%kuQGsIS)Sm0DCdx{L>G4_UP+;@V&3or9hAzdmC$sFZkUU2=JuXy|B4Y#WmH@A17&=0w{Yf`1}I&R2(;hKRS0S}ndgV;2qEenU+I1Eeu=c78!XX_j-O@!ajV z{Ob9aywONtM7*+`H_R^2Xl6BbbB3KaEG{pRy5i|4&!`_PG2Zd?*#~_3txq9F&YxZJ z@EcEg_v#JT*Kc|9@iRXD_NRRC@kg9pUSeG)m>FYUV)~Bx*PgOiZJ7-T@HuuBGC3BHXfD!8%!=ZW zDvb769dQz{c#Kv=Q;KpL2@(#4x{-kKc^#C|kZ_1`8HAL86D3MTj90||Yozfh8WxaR zyuYBa7pSjDP6%OSmu|S*jcoU8Oi*fLshe!?7I=f$JFM9w)xeWE>^917y=J?9&UVw$ z&SCKwnuX$;fnYWaW`nmCh6hMopz1LuBB>(zny8+X3}G)cGe=uHoD;@4FmyMp?_L*T zN`tR!M%fXAMaDbE-5cJ$9O$>o+42FG7gsdxf>|T%U+>v#g&0G-m@~I?V(MAU&hac6 zdSySX*bcX-AF&3EwRq<;K}Ks@eZZU#@ZpmEa6=d(3^|YSKIDF1a>pPmstR;gvwC-f z*nlvxnm_XEU0I)PAtU2aXaxeO#UENPpT>7RhQz!g+QVg6XdeeGV)KF4# z;VJq%x{n-HUQ=9n%2uD^$27$&n$_u2exZ|6=C`=(9AoAw$2}Ib?knY{Kc80g2>?Dl zra2z#Ks-N*-6sqBl4rt5N{P*Gg|~uKA(O~WpTShd+%pfsIbRMnJ%#DG$DHN#dh~FA z^!Q9q?%loUWy(8F)qw|cYCcwWa7;|}o;E1-L0| z&|@r{afGob7INNfjDsi`$;EIn31=)Z#N2afoa56OGrt7sK`llXxO7J4TEvWyvf3`D z9h-gN-Mc&X`!&h#XwDO}s~Vd;$thArjFUXKqQMv?nl0<_f+4I4agDD=+-yYV9a?Qk zvL?v@G8I3y;D)70XB1<4j2+mo-?EE0)V^lEoRJ7@$2EIhF;-jRVo#h@las3EH2cx) z<)NC%3PvPb`A@mhfk>HiE+ZD39G(`F8mf54j3@Z;h+%C}NmPxeonO-J90bc*v*6M% zalXcKMjAbxt}!}bY+|*3L)`Qv8L%E^i<(9pVc#)?J^Nu#-}QLYGDb&a&py4QPuHZy zEwNscTya}76Uiv$c_HC&#kokAuO*eaoDR9OOrdod>zS;pDIlhY%G1Z5zR&luni-UA z7n@`#mZ8(CQJhejE2%OO zyN^myO)0M(Hj>hwZMPyZttU4@)~gLWj3Aj5f?aqJ&v>EN_SiX z4llW{Vm{=0hLR^5BwCERY&#m3ROSI*FX(rXvEQ?pwagbaA@*$c9bq4tFKc{bQBAqH zn%*!DiOueo&G44ay@h6txlDvQs|KU(OQA;rTVn1*7MevzXpV(Wt|{+9dAtdxDEYvo z+-uU}a(t4c2nYnDHB~yJkr@Y$K&%;cLFz3r8B{#h3z#kI{fgaw%ci?w9bYpxE1JuQ zU3LV&V$c=hHIGA`dNB&6d1DqMY0hhN{-5_Tt3KPFju&Y3)JCYQZ0{?!^q-3j4nyrg z#y#8JmJs%gVZ~;=rn5J=R_SHOX1Hb06^$gsn;24jy*B=-*phH z5m^pcpGbZr#6DB1#lqxVB}d{g2}b&Z+EU5Ag<+~!aBv3F1O9gUI@w#x#6SMU{}+gw zbDbl;^xnAFgi4RE1O4`zF=jVJ(`5Tm#@wSlrj*;h{g!!g{25F&pWhZ@+`pFT-_v?= z#JJr1Z_p`*I1KI#v>2%f5xU);n|FI8&Drg5Sl_*4akb~-!6UZAz@=~SRgKl$lO&mu zbh3#fB?&&PdwO^%xsa46cZ>;5*&p4gL!(1SgSBmGZtSpR6{Cuiup`!LX(Bj1q$7(;3NthZrtX9}iV?%=s4KmJ=@w_ml5^8rKDNDD{=cLx4 zN$B?-gB8@)7-O?%t|S->%Uev59h=<9T2m>0<^F3~#Z{CU(@^ljkov6rt1GH%!7Uw5 zW-xO^g%|4=_`5H;oPPk(l0ss+JmdWG63dRpMJitrbx!3g`e9_>kGR+~#ulUn`g{&4 zdm5_Ku?buxqyb-9LfjLh#nu&mQL#%MsDn0JsIJBvqHIXgofPPf z$-ogX2JEz0zgLy#xJV=gH9M3YB6}oxhJ9qkO}6Z;1lxcku;-RR_DB`8ibIPUQ7cT< zfbsOI;Bud)!z4cd_eX&_nve#9+hOXOcG;4)Bi)-jFqYX_g}tcQXiwN0cB{y^bJTvp z*~LTZ`2r=ejRRd8@@C}*D(8_nvfr=hhJoZ0&Uqq%aU2OT;(ggG%p`F?0iCpf>{_h2 zbYeJ8%({t5nf;xk4rmyt{Q~D}QWExQPc%KIDoH>}h>@I79d5{J>UEkVog^WDCwZC* z4Y}wM4{k;T}RfgKbi7A+UcGsc+v1Eyry?N_7}5z~SSX)M-<)}S&HRTu$uz}Se$c%pVZ zP29`3qG-xYNwvALb4(+K4(mNxsBX{*0at>N0hNJ7IM$>nL3AOclvIRCJwExs>l6&g zdx-)?QCA*^q3jpJp$|xYlG8eq4)Muh%>9;OcRamP{F`D&^4ut4RXL3bw8`t$glkMa z<&LjOfpnUV9ET8xc{dgPr=($uA>`y8(>+OtixJ7}T(J$fniwr(Fi4DG#$2eenp+2$ zviFm+eU2Fr?Qy2Y`WioLV6UvVd)AvbG~;FNqt$%Hrhm&gdMbO#e0heys<2oMFupF$TqA&5X)gYUij-gLi^01v*TFkp@q;xAfBD%nTz9k~~T| z=R*Q~wAYbIMPQ1;QwunA7{kZaJ%z}xfB6M3{`Tj*{l%B;UtVKYd)B}HifT+;&6iv( z&S|XU`ETCx?z1ncT}^B&%&ekr8mguSXEQ+WEOnXtUJT!S`VqhTXCKof%k7t6@zcNj zKiTNW7r%VRZNH)4j{Lj7`wf2Z<9`QfDw?(-Ss^tJX*}v3wstt@sI8}Q9%miVWc$Wb z+d2_pND=i8wT59FvBvPrpZ<(5zWAKi?_RQ>TjIk7-Qej`Vv`0;>ew`iU5fnakG{{J z{i8qQ>)-n}$(ankljt?~;gGf}3Ux@TgqSeavRY_XtLw8e)MeJOPNu@S04Zqhr=fYJveps1k)Qqb z-}1lzi~pJHFTdn_XCE@FS`xxOM!d<^Y^PAI7&+n`6q`0tVhl9PCC|R|E#f#bc$51% z71EwTNHJSBsU{}dEF&(jq@_1X?o41XPSBXuNn$P4e9lT=mSi!J_B}VR-jarh4hdTu zjFH?oLL}R28jEWy&OW%}AN`mAg#Y2c`S18_wPp+h*Q+}|`|Rg@_u(0{>Kt`~t1M}Z zG*2%1*5!|Q_RUZE#h?G*{Kdcga~y^?8Ai!u$38@C$ZD!>7+A%gFV}B)^Uwb|ulfyt zD1XYu#~;A5MqO4?iYYc~r64hcz@QP=IHDMmHyC@)V!2@UvEh^New+2{xBT+6pY!w2 zKIi)NTl)QgI?FKhbX`xckx*OqnixZmuDZN$CS{=xd-;^hiz^(KaTwTa_mJ`$w2D1< zD9&5znP+z1(kycCsPiXR%r4LAUp?n1pZ!bX+*12F7mv@Gf9GR<_lLj7^6HZ4gxSS8 z^9SePGe83n2kPvd=F)F+Lp3Qp0e!b>bpMB2j z7tgu7eutnudGv_$%X5~dLbp3YQk)1fpJN&aI$*uS7tMfd42CqiOmuUKGl^Wb z^F+C1+g-3#8i)xE3Hm^5$kvgt~}xk@|eba?v0*s{w_EtA|&3nbGY6VNBVg&sDhxlri`! z(pHwi3dTEz6cLkHo-LTo8pdAn!BC}0+H8ojVKc1hb}MwZ!*>Jr!48@4aBjyaJ-1!L z&V?i+k&a+GqV!ogXfpv!!xUT=d&a2{b1!b3axR(p$CHrwm@7^YRw>ZM36Pw2NG&m7 z*+=EDzD+st3HW>p%)hS&kqK(f?=nKM2AfWCI` zetO7}PXT;WfXBS=sHO}aYlo!7r~{%KLWA|1&D;)ya_lMqtE8DDPS5i^*+ z=2(1EB;L~$lv9#>-@gBnL!s{Urv;ZtlM-+$YD`Zy9{!Hhu^r!{O~l!VR3lNwOiC|A z5(JFNR^xF9xz7`YJZ=E-7%I>jJGRu?;08w;bDrV6WsDt$3JncbTNd*R3<)nadS)##`T)8!yjC<##p0}{uI6;k z((e*8Q_<2Q7(z5TzpVp{2jFV>>dkB3+jSgqIxGhxd<~*S>sB znWU6LVhB5iIA*0_rC`QlLA)o(fH-rkDVG29vN4^@sY4Zqe;=`k(?WmV`VJUFxv6?` zk0w_fBOX)w+ND$qoWVnISoKu2xyaiay0N3{dyGWt^9t)D-O!W5EjOzhZl4D(9@khW zs8)=fVY}Utw4*r_>e&E($7pv4j94e3!&EetL@KU38Q+s*t>JLHCp^FWTn#3AOscT4 z!W~?|GC2^JGIpq*TFzNCXIPhr41^IRDYv^@?lv24H_FBGg4!;4{rWBYevNMv?Ulu~ zJ<@iBYRhOgB!)xpI}k*&qYKkLj14BWI4Ydv-gcyb6@xPicAX;(&@5Y)ZHrh%#S&v= zw|>oP|B|7(VeTIB;@vB5uD>G5j@d(xT@LuA677J|J>GUmTjG`!NKx1iE8fM|RHjBQ zVI~pd6OlbpMn)Zo8o@)dW1i2Na-kdnafk6{0ON!)rIRO7a%Vk7K=UZG#vJ$3^7S~I z(tS*h`*ZF6SB96;dp|s#2W6h5kuKb#l^`;b?7*mjNX*!f&A5n7=3tg`tkF$z#gRCF z|L5<&-osFT%UQdl)j*l7DF+dzbgvwSh<6#Fh)M8%&V#dx7q8#3tQ1|Waq|J1JIi)kyW2r8Vn)zx#6`0j)8n(CzJ?ZinKTtmDT<2SU3Wr8H9F~C4`YtBVsMga-m7Y z;9Lfv$8pF5!Ruk)CQX2Db#1+kK$hj)a|~vF9vjPqBW9H8sN)w*5dK zNBr3WXJH&xj56T8#n7WVX5bw`)f}2sQ|`$GNF9TIDRyQh(V7a=MoDgDdK4QqK5t|zu=i){t z3FLzML@X#x*daIk6fMoubHZt+;2A+uQD_zwVjf%h9_BUziKD+cWc!f!Z3q5;zNWzT zki7l94hC?Lm7n$qJkAbIwvZh7q@tjfD*rO15pDL^c|&^+yPGZja!F`~V9J_oGD~@{ zfw&uC^z`pM!%lc``H-`RPpNc!UEb>)lD}|gJuRQjyJB}ZflTO&DgQa}d`^=$J zc>BnWp5B>G{&teImNh^WBv5$jgCrDB#fA>Q&%4R%b>3FBHAR}P;V9zS@@+5D0eJ-dBi z-|tAWgE3&7fSnrN&+wA_Zlp9|Dj|t2dq=+hgOz3ZZ<=}TT#2WLCM!$zV=aDy+H^k|m5YILS7nuC~k?M+yPb3M)O% zG#R`wf;R?l+k@KBQX#Y$azV~$jo?W*#==&`v#{_1aj!qunW z+`sDj{W1KVy`F zNy=xRea5)m@W~Iq#~=SkKgKl;zNx|Hb4+zb00v^7PcAEhG)7X4xi6y#nsWbRYdjP% zJ*LPIOOj~(;e2!eA1!yU-tp>-mn>z@>(z!|Z|?Zb47N|t`47JJ4F--qxHRQ8I8OOZ z0;4IXC2ASEfVCFa&Il=zOg4DZ6bT`cLLzEbfEh6u=h5PLB9h~z6w59k25&rq@Zqyh z_{abGKjFXq>c3{OAE~xmhV>mD$IaV2E-x;!wX3sKV(8OAAospgG2p;mw)}(t>_6q| z>H$Cf^S`2LT7L1fU-0bP-{S1@iewF8R4U)F-R~L1(LQ~|*Z$!9tSZYdZf|(poUu5Y z(}i4=e0%ebE{)vL^Nt;ZTH1c#XFvH@yn6l$Z7crqfAwEbKY74t93v1ywv-7Wq1IuX zBP6A=E<3&0oRzIY!p%JL@l&2Yx#a3keuy(JyObb=6d6MxrGz&YRi*C-x~^yFdv@y$ z<9bJnW$tQR5@L+}_y6>t^7+sH7DFx?RCUXaHyO{$AIqlNZtN%D?fv!z^BH3!lGc!XS}g9@Yu(?H5( zT%8;OQZ5$9g4tUf6QezifxaJk`)nfB6V=9dCCD)I6ok^Mts01|5 zXiS5cGX`lmuc5Z*5IhnrRn;(WFIco!Xz<+iTkeJx3`)CjTr_j4)(~XJHX3I3f^Cev ze0Rt7>Mg64a`vdgd4nWJzfx|WZ%8YHYg+1uLbVuRwkNe)w9a{PikXbrR1I1jew;BG zWHp5>rTNL5(#Hll(hKi_oYT5}FNr?2Vn6*w-cy~CV>~@YEOLm9@9(80W|b))JbcY| zc++PHQ?Yw`Zzix=qb1H2D9V17)BRmea>kSEnR4+Hr=4scKlPK7doC>nz&bgm9?m}< z4pFcq1DP5aK)al;FnLKRSPFTnU=-#2?39b0*eCy1E6yoXo8pwy-|0kzEAh$ucwvck z4rI)OlBl$=(dqcpImkhkf+*1l8u!@7gQQHp)`Yb#UsIaM2)Xxn&MnKcm)t9sRKvK$ zj^|Y29J{NrgNGzkm1TL^p!1F~bzJXmxxRkM>h(1buAb1C7N<2{YMgQG))BBQ7Y)k? zGmKU4?mAw*`I1$?qTa)DUNOWi_<=a@(6*;bN|0Ar9N}ujUG!KVkt!0jBg&X>R+{dE zD|e;jWh5pSiAr&V81@PgjD&yb_KiPlIb5L+G<&(}HtZv29#&z(6wb;$8v3Oi)Id&!>1C z995_J`^i#L%etbR7P6-K$05f)PD4G2BMyg!dxYCO-GvwhV|^~lMFe(34OYu>KE;`SAsT{XByk%t}2%Ph#yDwFh*T4+7hMJWo|>^zqH78V7h z97=H$Du1{K6j!-o2Y9&Ga+=p^%os@W(9Nm!iYhLluL*lVEwe>K+Zaq8h$%AmhTGda zqHJ*OfUT6h8*q;zl_ac%L2u}yXS`S=^w^m}W`@9!)sSY)0sy9**CJYDQiH?_?HxWY zsL};CEYQJ{LgeCdfomd3_Bm!*!1eVt@7_IUvr9BfNAkIlmg*jLftC4^yT0MB*%F_Q z_(qVW5bKW7^|=+5$>N<+^IX9ia6(K2$T}C@Vj|n@8!$2Vd)1tep^(Ph9>B?jcxGH7 z<7GwQFogh9ErjBpmX6OR*IF}4Ca2f=nH~w=6D~Z>ozv%gf*t+8!Jnsd;N+zQM%iGU zJK(^Ap)oZsR=CmOqGe`lTr#*M7(MR3xgR(j#SPP1@%{$O$?yO5ulLY1$v~Hwl3eD3 zjED#I)V`*24z$DREt}1bBwOr4kyPQ0VxrbtFYmM^X4g)U2=P~Vz}-wZI3(iR8(jhh%$g?i%lctm`GuvI8^6M zvH;IOFu(Id01}l-s(hwVm+ZY8 z61LiAH3|un9G8m*7aD4@*nMQ!bPPMe(J*Tl%-cE6dCn@OOIrqWLG%yM zYG5A+cEb%rcuR5y3ImCBtmPOpH5o3zI9VbuX{zE|P{(A`HZ2a*q*nBxdYY#Alr)&K z$qGsu0`(+uR>>P^0gf2+-?XM7ro%c^7K;RFvd^2Ihsgj=`K*J=L?Uvqh|A{{G-ag( zCieq!ru3wl7KQx&${3;pV-%+Y#6(4f_YKSnBQqo{aaxP=8EzVkqZ7VXc}$wp^>p$IJbh^2U(w zMOGCVJz=?#dp@RVtjOVvOTl9bhKhBly2G9O`@fE3`QOYdTejqDNF|U{CYI(=1bR%M zqvj^nh-P(9z9V1)wlXwVGprM$$wg4_d^Q&_5EUW@=RNafL#!;dgSgw$jgjGc&$u1A zTr4=hn&Fqi-Wu-4$PfoqN34tGY#c^1E2`=Z5+II=ehvK^3^OhsUsBfBfuC5>nTFBPTw%f0biB9$pQO^0Bz%ohwK zUxLv9B_XuQLD}EZf!!w4PY%gT{xW&`AB%KHHKd%(vlHd#wEmTZVX8Gx3RyL=^r6dh z&>V_%N9FP1O79KnlVnKBYN6BmH%*cQ(^!wTH7>TasYcd@ zxD&>eA@&tt`}hO!BUF)O`fT5^Pk0?fGH5O+ zYRcbRYjEOmrox#9(Y)_kv3Q^7q%{@Bv>2ITq|N|k0YS7RsUp>3oT(g>-MmLk^H`?9 zfTS5zOR=yDOA~udMa9`AQoZEsKl~9NeDEp5+dJO=;tT%vFaIxo_Vx|cZp*^Yc=*9n zuFfCv=%Y_?%Nbw3e8Ka-{yEog-_i|xoEWa==k%8YH?OyR@%$}z(c;<$tk6_7gh=WK zQa|#`&%fZS-N@B;&);0XV`v>z4pVuIwTLlTXEH&~9E-FRJ4Iu&v&4~)BZ$d%OIa0= zt%h7xV@sfvqEcCli-{@*=3(T~IM8(+-`uQOJUA!J&rq9-D5BYJSSCf0+NmRD9^aaG z@n>KE4mw8W?TmK0AQ&MSn^kMTmlzG*xvE_`3v4g#c5(UbhIHb6UWk37*`{1#^PeZ z$De$_!%seDezqj_Bft68ulcK={Dgn@&;BRA`zL=$`{asPTU=8Y1(QL%I}}`7D+ijE zh+wVHEfFe%*0UUoSVxS78J-d$mgfq&kP;#iA}&Pg-5x)EwO$iaw0|MUr$O~W@n z`GjZBK4i9>Ge19LezBxGKjYnU4$fj+UKi!rhy1}m{D(BNmc@fBXlgpL<3vAZ5@=Ky zV_*m)Ll`gy!Wf8Q#4Ci&mYe4<8Qlwu8FoE)Z{P9jUwy%=>o;6Hdc-%s z_gy}E^o;gw!P(=F_~`q;j~ce$5^|4pBZeU*L|jhMV#2BBJRl`( zQZnu-h*}7lA)Znsj)C26%GUiU;e5k#v81XTA%q;lNp|I^7$G@GGpOf0c-Rv5hOd6} zn!CF-)_NXZMP^UWFe;caVa7z??O9*n@#d?Mb}6*yf}00$9Tm!zU(%i%@B>Ch(17ZQ z)XLRkkGX8H#$l=eRU-MwXc93dEP|&2lhy4p9?4!4SSv*hf@V^48jec13`8BXj03Pf z?TK096skXpFiaLCw7-fj>Il> zI`;dy*HIxS@8y-5usU_*Jvt;EuJgS!KY)tq_><$uO>pM%-Nt4TS&C_5z#jJDDKDM& z!{cK(1^!OY|NVCgcmJB#K`kVQyL-qVIDC~HyUV0%0n}nO6R@I|oGdvs>A~7k zRf*$NfHip@CdD`hu|@iGe0a#xJYmsZkdm@lZP?##*={0s88NM8>6TO%HAG9pjJa9R z+6FIG?uQj3cXu1s-8;hmhUHm>cY7`$I9m1DK2}F6lNiH*m_TI}bs*Y-3U!q+2G!yK zfkjism5k=GfR-mZjrG!Az+%hafF~4HU5SCE#@cLO8bcv#m>jE4xz|*r6YL=$KWIf0 zST#6x81Xit=5NV&b1s{E)1}gD7*%8}v1=&=2$`g)1xuas-ifYw9Q&sr z`w`pH;;eB1=nr%KWL=zc^V6y-6IPYrUd|0itoXh4CfuKq3_{N4Y5>wW75&TcPmVej zB#)o29EtAc@YDP6&3WDN+~x4^Y0VJ~Ce`>f&tzyb%T8I<0;D1K5W0cXjYt&2xI?68 zIWxF=0o90c5lsW$jChyp0x~&vXhIqCT5fXuhj>ydt(!{DH<6l;S2#VRqnIX-ry~XV zfKQ?sw+k&{d&Wiml%;!&)rRe^XSLc8Hi>?ds1{(n#UyB@LTv*n5r;jk&FyiLhAfD2 z6>1{(%%gzy31c9tN7bRBI;^Bd9H>K517l6xTg*_g^bcA3$5d`f-$&lQd&_PcX_kq4 z;W1uGW8}PUiIrfh5o@v%*u+560cFHWf-17SNMy$izy*@caj?gtSYk9JwS`pW3WkzU z8S;8|c_@N_*a5B>g*ej+Nk_hni;j^o>?MWY_ZxK#(i;A6v#C3EJO!4x9$kt}eS?WHzw ze^))hr2kH=G5x;$>SV2O@5d%7C9JhsNr>QVMG6-0TddS{`;pCRjcCtVTTv}9X=er} z4X|LAW=L;gTwwJ>wtFEBTf~O!pDt3cjEQHWrSfV?Nef{$12v6Q#9rw;g9!^R?IksH zDq|V!9+#AMsECq?Mo3zrX-3pOE9OdrVM)h@{rFHbI~9tTvzh`lN-6FY7M#Z1J1b_7 zT-C&6EoHj!+yt+k8kxnc|J)$+j46929b?gVwF3_hnfq=6;#wDu7 zKs~Q<=8P1w)k!}Y~-6+Z?{ z6e@)MrUQ-CZHsH>#Lb3r9H?5wFXl+R_Ib>uya*Z`$ypj#voteeH;}qL zuB({YCG(3*L?aq;l*+wpU&a;i*A!Lq2UF3bqakK$1@D-H$o;JRFp z)i&9-rRjMbkP;g4r(s?)epvK+3bn*lA>7pQWK~rcKQc{D;gRSix%n7g5J(W~V7VAM zctXx0%yj6`S-6mo9-E~}HrQ@<5LE~|NbX_BgbV5L^2HY0-45GsgFIy1zgOsSgWcu@ zHkTI>VpasHD<1%t8oB)tk&qYna-<#Q$~vDD7v;c?St03W%~ujM3_8>KBUz{`8|a zf9kF0ep=^Upmxa`uYOkeRS&f(^vJXk(0GsnK=D$DHgGzgE?Z&UPLZjrOyyb#G4q(Q z797xgTED5kn#CquU1I>TN$wtkzt_Hv>Jb!UlEnlX?-3EsTHT=*-gxjHEYk6nB_Ttm;akO#OWoC6w$pcICe%9K z%Pc->4G~b0u@6i#}GV# z5_WL}FvbR_pje-mJbV)6P(;YK2=5soz~k~gRJWm^LqD~{sRvbS(zX?^LZ>tdlK z`T~P)k%uEh1^ew4zTI8oEgW`mnC;;=dw9<1HDP$z&{_S^=%N_pe%`I;K zufM>s>%#-M7EkYH|?Jz+g+2Of(p{E4xIvj@)DC=B7Y`D)MUCUOB z$GSfyg;?1HjeRnVxn|FlvSFWN{C0zQMwc_Xy9XTp{rlcQuj>*drBEQLq7y|D#V&?>!#L(pULQ03FrZ6Y*sIU6`(lsX#T|xT@mK%( zH+cWzukiZQPw@J312@O+B0-Un$0IC{a20%acZa*12OPe=$Ng}`UKL~7;4l8;-{bG@ z_ONXa-*(tsTwplFxQP7`cW>U|<)8dFz{3bdg1KUE4oCuWjyl~ly&EVM<^MYlAjX4yuMG2K8;r{w_$mOTlzy1<$FJ9rU>+#jy5qAFu{?)heNa%@d z7KR=gGL9xiO1~-L(Sb4N2)(XhI5rj~@Hh?-jeca~0L=#3AMxhzeubM~{}$LE@X6H+ zytuwD1CZc2c6fjJ3P8N!jlFa^5{4oM?BnR3=f8U+~dtxZ*jQ4L%%hsM*mJpVK!jQ z1Kc|7AKv2r<~tHAKuI|i-DS-#DwE8ZzO;^UDkkt}4Fca9Q5HHHY zW5%Tb_rrku_c!?FeveHSTwYw`cz;Ab+`^6z=x{(nM#_L30qGoR4CAqvxWdcsGV*yJ z_i!Cz%rb%QI;4J6o;$qs^LW7M`&eJr4S%HhG0XfO^K?dND8q|BX;&0^m?J4nD-kJj zjLaMBC&EXpwS4uZPl~+e+;(1-c6A%Ga=WIS=iWvRjh(XjtVv-~kJaV*?KVzR*40X& zDOugfudA80rF>i7<*!~1Yi==7ofMWDna{|}hv$~#}6^!dO^f_5{`C0oG z)@7FU-=$8gq1l5AqyPXQ07*naR9+Zr&PJ*A+$kp(O4%h%jx1V|ExT2Z3@~FzG9P>kX?0A)TW6!7VUq&vyFn05@eyH!KNPLvbL#H?B(uf2D zY=DnPbQtjE)hEcZ19XH-g#Gp6xfEk*Q9x`uKm-|)@=@@U;?RBSDCol1(m(JW5+VLUe)^?Ow?Q69?#-~%}Yfj^mO=X{+ zq}{JVJud!K<6S9h*|MZ5A$*HGZJ5@+bKTA3lB}L>%9-7C{ds??%73-o<#$wtOpz~L zA>Ko6hw%_U_i2Z|yF`awtZ_8v9DxBjqR8y}E96Zd^OlWpi?l!D7W;9Q!#>$0qC|K^ zOHzw9wV6kbVyz}x^IkzUVx8MV`9=UigxU^LIV1X)4_mzbwipy$Y;c(_aFuqr+H5fT z5n=i=`F?Ycd`KAX z4Kj3i>96rZUZU3v9A!jz`5M^|=<|Snh+quQ;Sy2F;3Gyq098rnxfloZbqhQc z(+EQ&7ekGVl1ub3)dcqhw^Bb{I4DIv`0CqL72BQ z-Hv#9{W;vi#q+!GzJbUdm)9LGKIze2BxFypafhoHuVFdk;o&_-JYewK$j_!Z!VOgO znQD<=2B}Uv*qEmUT(*p^ORx+K4*+tHtL;m4=u5>LL?XP#;2EAg;x}tXWQnUAa8^2| zK+wkv*6=tROMWVtK}^x1i;zym>Nz8FCrp~!@CQa!+*FJEXkb;ikHuFsmDrS-^2kgB zTX^Xu>44ICl5An4;`Zi4yZaW zTLp8&)8gS}MViSOo`EjKfECM#4&pt0+)VETkm41mc=zrd#ynuN?XcbM@b2~&N4v-N zrQ!0W!F51NC5bQ+x)S@_Y?ueYswmK+VDc0lDu#~Ic8Ud@08>txw&#dWWt%kh(%9^k zks++Yv{>jwt&EnZ5Q$ajiFOh#$4rpN$iFrX7!E8#I+g_=1duMQXpzI?E5^E#U#*lM z=19_qLPR7s0ZEutIWUKZY!+>eaL_K6 zS_NJ0bE+X+X3t@%mo{){St#du_%=)n=jt&VV`8a4_v$8#+SBWtGyRcSu`y2zvl4&K z*=J>uof>PUAIrR8`RS-rsn1ng$3D!@in36wT>AVDKaQOT+HUBYa`C=FJ|#_);GsLD0jk zhvg0;9a0jE$Bg^C0sDs|vh4B6A1I{Xm-z#8dvXCLk2(OzFwf8wLr=~Ic=br|Vi7ry zmy<;2MZle_Hhz#)+E2!me0o|GSy{-~0OnVyqluo0fa>wc@75K29q^>Xt@l68^1 z*)E~jV6+_9@QnN8J#O#cLA#907d`r|0Gi9@MJbttRpHbQrf|Kb)Ftfdr2KM(x7ajG z6>}&XrnX#1#cF{bi{diNSs9aL9@FZAIdWpet+Uk;zIfJ(RNqY0Et}Xw@OqJ{1xg7I zV^Y0S1(CrY=nuC^FDiTuarB}`*9=w39!wTiBj9zX!W_I2znYyy4V?mYgwy~p$rs_HZtanuIppX;q!*W z!Nw_+2`m(LUgn!t;EdZxU+7@iju|iZN4)tDe+~cY8*GjvvL?L$^b()^=|4mI^c9XN z!BRqQJSLV1N3-$O*uZ91gB10=i-lSpNWcg8%CEH6HG6@!PvSesdUc zGZ=>K7ze|695EaRjAMp$sZ3Q>sqW~^aCv{gi*LTe?%fTn?{NPoe*pjVCBFRfGyKtK zpWu3z@Zut&lMES;=tQu)y1+NLH~8-D4IbV-Any%s317dx!ClU{_sA)DKaP;ThnS-` z;JVx3<<$$^-{0fmVIOM(DDrUxM#FeG#J|S@H~R;C`X_%3@B3(f9-E$`iqQ>&0G2{A zSM9>GL|{cVV3VVbxeBs6vPWphI+cXAc+~i0VAXgZx|Q`@X@i0YZ<&f$aI#<>dyuU4rx>&zcT^M9vtIgd|<874=w@BZxI< z2~}Q4>qr?v5ANm)Krv)Nwwb?-ink(GM8?2qc5a7)DG|)>j%)bi5c^PoeAj zKE_@z#&lAogt`gum^`DVwp2G1B$vkx6D^-c>H7V=Up9MB6$#3#(}ANJ7rWPVL=iC~ zX9K1=cz%P^UX!=7QkwUJG54Lg{`{F1;kd5@5luUDu;a zsXW726iAUeNm7-OitJ#e{b&tu7|LEv#jAGo5=BLeu~XDfE}{9cs{4?C%g8)+t5nuj z5uqZEuKPGK_u0_l%~ucD-~unUSGd~kunlwuDI zsIqlLBdIGb6r%)aq@O@eup=-&WFP~(euquJg-XIW<}j%A0nh`G4q+UHXcyrx8lG&i z2b)Wzu(JLwGH5%`gz>ygeZ}1%#W*UAoJxeA6v|RqIClsajf*WNl8~u=#pX>>xOEF z!@=K%81C=yae2AHT2}!to4;PPz$SG8A#l;M=@XkZ zNfe4rEV9Ls%YP+W0mLLMUF!anhGk|(6?RGo!|YvEH%jX=B!saDTUWy!MWZiaddh$B z2y2owp(=u60UVveTyY#6H}CK9?YHkC0(|!QOT2o01(f_*0)=ITTL;y?EC#$7XB8Ep zS8ENK8ongKkdNUxR|FM!#F0%gy2NHz--l&!v2^J)1b%q2deXR-AqGmb5^ue1NY_Ph zLRhwEABqrECL~wDdqjBCy6TRBst(L>LDEPno-siBBeXxlFd~-?8TEt?#d6h3PBFy$ zhXPiUOgFC2Qu0E1Z7*IHwW|&rli{pz08j?rc?-05zUp05l48KXN8bnH)!E?YoIJb%D_}NSc_tO-oq?{McH_d%?m5a zUM=CIM)aG0vam1OG=#v_hO?{+fM!v4GT7Czt_m$WEv~C4oq0wsV~a@SkgyUPuUaMv z>ZV>@K*^+VjkRSFQsAr7mBG1H(lzC&3Y6)%a(?uepU#tRDf0d}PHI_}Q{lAWjNt=) z7hyzmQB*_Xy?P0mBhz~TpeZ)N%%K)zTP_>^Dhl-xHIYMXNc7O0Ag&l;$O1^}kv&3* z9qkTdzC+hX$;M$oCqUmtPEpH14SfrAk(UdCJUDzTf=~}wx`S)UrRtda`#i};yBCQK zYSCEuXS48RZ9JY*(%4ulV{$dSX$9Y@rll+LNQ6->SD029Qmyb-?P`8gidj+T2v5K! z{3R5VITft5!MUHrdo1>4RTz+2nLI7ffoYNIlj3NOXTPLffM78eyDYy$+3bm@Sub4L zXZ6`yw;9K4+Ky1HmzmkhW@VkX5eu)#9|+XG9m7r$upNMBsAqJOLNEHb)s0Z|V!;|A zGR-~Oq~;DSIq~I6$6kfXs zp=BJIEt`w?e>yiFND*Sn_=d8j8*=puw^ST_1t=IoSU665>^UF1_zg_&a*2c)hG1F_L2g`k)F z)b>>CCDnC@m+?a*tetsA@{G$N_~tiX;Xi%-24CGD zv6mjY*~a=g`_!gG;S+1~DT0G#T95?s&u-H~~T?YtoJRG7; z*NwgMB1g;9NP@EAk+gaj>!cX8G9S%RSc=R$j?kp&y99M0KOE4DU?+;?z?esPuNd56 zDv+)NQo>M;TdRQq9Q`)oa2%$4dr?GLQM`vTU6J!Rt&hFPu&K0ZQ;WO_ix5d=V+keqP~Dcvc?@HVqyQ4~C?!<0 z0x;x!Y&O!h7$nAgTtnwg^G{i)q%OjojpI<{Fb90zyaFPshKLrWqQp86Qu4beh=j+y zTX>4PC!{1W46qz)M^%A_*j)0tg-q%e<6OV#OBZ#BCLFWP8~-+Tx%(gwwSW$NmQqq#T1;At+kRdWe-xzzqcj$BrRmV6S0g;kYAVbm!*D*G%%^}tU`4Z|~ ziKvn><`IxoHq67kQ#+sfeKqD7M?mcL}gH|X^Ns>55s`I>oJ8XE$bY3*{2l=c_+o# zTccdqm?0j~1gb(Kyet<_SIU_u*|QqR&h0r*@<&kR#~1_0JjVE4HYcQ5e#J9}QGy#H z|5hn?HB^=20ols@^M2rLd@zqAA;$>-wMG_~YS>VY7n?Trr(ExilCJLFO#73tsTWUU zhSar3S+5qEYoVlTl$=$bsrz;FF|z^gG%hy^0{5~ZUPro`f4)^JdU&nJyi-Quq%dR* z`3TpH$g?7L8oD8tpje zkRM||7Sq}Sq7h9Bu^*{O5R363A=Yy><&?Q0b!80G5$?xg99i4TEU$)#a)h>&B8Nsq z0Tj>0GJcl`UNvvFszVjUfDAEaN*8ia_ShfO$T6=PIux(_6RYg_c$B=$sC*X$3~_FI*7Q#Y#T*15Gg+sioF8VSjCR9!JdT|xjY#w67M zRqFU-F@C4yldLdZ!;2EO?wi3-4Vc=#wU~3~#RujGi9ho17D~EUNM?(e<(4CHw3(pm zHW3a-Bo?@mG1?fPr7bKc41?hM#U~i^fV;aJ9F7lo`~EFnzj}?`?jnY{WH7&nrfAS^ zu~Ff*Q_a^n^8g+HG@+fc&1Isx-gu6w=(R_6*OB$Pj6^i)YXj+Z(g`hf0uy_ zWvj}U4WMlj>!oM2bSq`|B1EshEzeUHa@8}S%-d+K9;%XLYH;nUcJc50O!f1+$gT}U zyjk!9QHH6(*Shh=RUmU`YM0>4IxUv%iv?hP7wv@6)=h2fD7~~;O-T-mjA?1y-eWFB zv&@9IjlWsA&t-4Rv?@xSsAO4t?f2`x6<2S(KV)t@%Z9ZQ5LQ=Mf73okwN$hz+(j*a z4AP+kXghv0DWhyyi%ye!TyLJR!un+nY3b8F>ebqIP~Vp~&+1s-Sr$J{6KDIpvV42< zIraMWIG^9))OXMM{~=jN3@EvNziF0ltuen z*3%Ei&$h{*3O`%CDk#^dXrB*L1-Z{PJ1HL8w&C^NoPIWsL)CIKs0mtQymCay+gP|u z8E2zRKG$)(z--#sWDzP3mjN~8hRPHETiU0GQOran=vjcfL##q2D=q~1RnQs+gw~&d zMZa|kMct@v%XoY^tK_8bv?seS>wL8aXnXMa9_y3A3mj$RwJC$l?QXRU z#Cp`JSDk$f>i4k;kUZmRaC~}i`1=3*Pq=x11HIhg>JPt!fBp#`I)zCXoK&yr7(3?n zC*H~`WnGnkJRSil-o1|4Qxk=2LYD-ucOCwxfBsMKw}12h;_u$P#k;K7O9#^qt|fmU zLctexSdCg@Q&%BK!-($g9&-N>hAppOVd#qj$*XaNmCO{5PJym?H70fRa9nPBeE#Yc ze(}X;xPEbou8VM72H>|}zrmZ|{sw70;*Y=l4FCO~{?{1ufN$P>i~szq-{Nn-dV@E& z2RvYhy>}R~f$J9Nw=j*(G`A5d9?Fc;ePg3Q77ea_b9Ix;fo3jPQubi6Y}2cLy1062 zGtHsv`MX}tSD&_r$@-IXL)q%?^GYy0FBI)Yo;Nv;XUphmi?SI6=NYQru&ZOXDb_r^A+lR9QTsn_Xxr5?|%56XQPE3d`7TfU>Y4K&|2&Fbum?`%Kx=9w37sg`1zTWmT< zPTuOWjF0`^a&8tsTk134FV|G@(Ry7o%Pi|Y=cR5RH^!XzsFrR2k>Wpcofvn{Jkw(1 z{@ghF*nP@b(~#kdv5h36=Jh7=Cl@Ccs<(m zjMM&6b6u}>RU#uz>+!nJ+B|iwwdK}MEpM|n#kxJV^|fZ*e(Uwm&AaDl z$CCARo1>ckI`74t_KnkVr9Agy{Azl}danGw%~}_9Cta~xzKVo&03anmb%d%F>%p*d z6Y*m4HI%SD3Gj?@IAR zwkj|#N6ZyQrx%!|Z91&#A!6v1@Om zb8kV;mT^^jUq9_*$kYzbEhf&Lx43ed$mTYCde(>TJ#l7$Q$JINrth3s0Y=ZBn%s2u zG%40kyqy17%U|EMPTD>_>toM!zSd+akDocZ{aqfZ!$-77%kniPtCLdu-8}q0VZc9I z_if1@Y4eM*=6sv_akQ3pKRt83E${ePNdT`K0}|zppE8U1N`3Z#_D#XO;71Tej_UN1tBre6BM_ zw*UYj07*naRGXBhy*7)RHH&xo;kI`=q(44_o-5z^dw*ztS&o^f$DJQX=Gr(jB2Dw< z@(Kbh+HNhMEXLS#wO{9o?!bDglq;4p*qM`RGe3K+RoT6GP=)RE`Ma;hhmV-~ z&J_Of(QG{oFTZ=NuGa79@s_$?5BU1#^(rT?O{S~Izs>JbWQ~=9$dE_;&ENh##={Zv z@*3%j*T9#bVd%Rem(AWJUblk<&HAxgV;8|(5V;{r6bR2ThjobP2bLYfm~lV`B=Yv= zY~jHp9deO>BG`pPQ&%ijqdyhHRX`M$dW^eEAa&uPkvbS6EPO8AuNoHAXP41n`G}1Q zIymkQN8Ike!JGH*u}MHDjy?&lE-vxQU;Yw*{NMg5UThSvE;sn>#f&0kF>8i?)(~V{ls%Q)<-ta>&vHq%52+KbNZ-u^VDO$@3<$f zYfj#+oc%d|J15^icJ)WfcG6a!zDAq}qQ}P3=4y|~VX{85-7A^oxccmKUpr|VWrM$6 z3&^CfuAj^^eV}LifBU?1+g-NQ`QLMGsXh0xt3USM*4H>SU_5=Vr;_rtZ@KU=t8(s{ zzF*69cDkz1-%dKGeZBqnv=7U2zX@l)U$bZnkF@8NY!y7Tn&s{OU+oEv*T*yp{ih0}KX{o}>@vv&UakbGHpPPMG3^~`v% z>Rmq9{Ri7fz5Vyh0_`)$->06xb3H7_4R3ymQtH`pcexv|=nWqz|GH()>bhk=jk;c5 z;dGDd+}%#v${D$S-G|Zi-+9Ds-%`6C0p_Pa{d+F{X-hxlsdMw{>Aq*LVtww%%#HJY z*hwute!h6~&3aJ%$Tg?b;F)dNs^@_SQqtnRh1s1Sv&*eWDq)|-vN0eS#v({U(WMUE zMG6=4w1J?*I2w}nkxxT%xvotvz|)Xa+bWv-!kebjG?$g7U08GY`AV9ODt|v(XCFHI zX?)zd>w=tJt)4&c2Nv>sYUW92oIUPLoj$#Y=U>S84%Ux+cYc%VX;(Wv-5SW`uum>XMVb?|Fm!D=}-S-?)x-;7uWphul}LYXi$b9fhkAC;#N30)n+)vGqyYI)prH{Sm^VQ2o4_)=V_Lmy!^+%WH_s#EqMKIf1 z`@$I`p@>z0sh48~qA4~p zrg%OEaYF|~FA4A=Le>@|MeRB$BFs>PrUT3}!gF^PuH8%MXb7z9At^!J;8R|+QVV*z z1uBT+BCJrx(MCKR40q!JumP|Uod8$c2izQiKmNt%z$ceTX@K0^VJjJ$1lvu*?Rllh0=#?P^|!2kGX{C$n%E$24XpTcvE%RfaO z`6EC7nCpC)$7lYht|p#3TmJCX$?~|T*Yi`#@k86w$F7`zKYUDG{nRVKpSIuq(6|2h z+j?wo=&8p(uFQG7WIwHh@znc1{q7&?F;A(3AHMVPF{98At;MJ9_WgL-=40fCA2KR_ zd|B(!KV)S7@X=5mtn&23)-S$Y@ z!A+1yhik;AS9LgY$vIIkEF~;jW9wRSI=F`gsFVUuAu<=C(+DAi5JCtc05!zVWVJqvOqimkODMpA$c+-Yh_oDD z)Ml2Eka3}om)j1S_t^HprV~i^$k$PfC8t0>d5&~aZ{^h*+XYE$K5fV7HBSi|v8nOE zlCXY;_Amv^B7cU$VX6Q&k-**!_XptX|M+Ws^Y#|6uQqtG6?2p3(V$i==qD0k(d`RdQTy67G(I<2b^R;4T<*L?KBU zUUdt}#~tQCo-|)Y5eA8Jtnw{a_1+ZTy&Nmm^Ui@$6fOy-32qtL4PB@B>iq-${{xIGFmpyhHV9daG-@V1_ zPhUeNA=>~*hptP=;~wxx02@wmHr)^99yMv`95yBrC;FtM1Io$xUFKyXgb+dqA%y(H zMG(q3Ly>RJ<(q}T#BmhC0Ec--h5)MQppXo>l~9x_u-c#R`7ZY47(0*#2|+~AV9ypfq4Vd<$7IUL*t z*&JVg{T(!2;QD$85y$QA4N^J+l3;cKL~;G{65oFJ2CqN;6#cdbpb!C607+vJ081zs z%f%xul8TEcyh+%xOd1|xW*i~#eQbU{LI@#*5JJe$1fNxD+9nKNrF(V}co*`8mB5rz z6j##f&p-+OVeuLN78+`fl3a@uP(yME{xjEw3H+N7A zBgSl2t{f=`3=XJ=XW!&h=f&7j8kHQH!md8`$&W6sUA+SvX;4#|&KTVw(g83?N<{%E z@MIXw%dD3NjeDV^n?gV#t zhNI;vcX#Bq6PSgEo{7yKfvwzh)`D>kc{wW)<5RN;iCI1H)~A_;2O-RnL?Nnx3PyJT z38ub0p%gYe{RD7>c}aBuS$Y5xLI@#*5JJe$j7ODp0)dN1LUdrIpmT`KVNoKKN(hLX z%?`Wm1&)V3j>CxE?g}YosKz;?kGOt$iM#uu=>Il2>>rQ^ASFfLJ5tv{B$sQKP?ip8 z$ywly&^asOYL11Ptev7BA%qY@2qENgs#uXuKRwCXrbVHIBBN9VR*mPebW&R;$*u~z z>H1a_bHyFc0gRS$yT8Zq@D}4Y1ODYd{Q}$V1-eeL-E5HdLnzQvniPsj1?J(!hUrSh z!12t(E*$@+!tA~ETU%Y%EesSWQk((>THM{O#ab*B3ls?s1&VuvQ(9aL1c&0qodCg$ zyA#|Uio2gY@7+H4Ip3e~UGGoH70AxsYt1?4m}AYgCa3rBLX^rub@4o@e35pBS1rsZ z&!QWK&QlrGlbQ1i1;?VAPePv@tQcmmBDOQ@|xYy706CCbO z&@}uSf^_HS7h4y~cZB3ck;ssF&Qko_9Xrm$6mt$xM6fUL0`J>{2W89WFl(~5Z_BSH zoDNmVX(8XNUq?n5@#1b~|8cI@08Akm7F?}yMboO-BNYSKyCVo#2cBA0*QxqW-hEb& zuMI#^0p!FazZ}YYM9oHCGyX!kv~uWk|NL{q%VrO;)j4qBuNsFPf=Ihe;el)^0T~hc z^^9b7uc5JhrKH`ZMd2xq^xC~!;i-1A@dYDJ)rhkv-PXDCyA!Y=I(k?3s%^?R?m+g`uz$Ruw|t?#f%4A|PS z=lWWJ{Wq}k&>qPScGm=x62c~vpD^7gBfsc8RiZW2*P~m{BzN(3B-Qa)4{+jMr+CZU ziW&$ZPP3zKP&BIR`s8_+{y1#d`m%1%aK-Kxt?K|KJ7_9dJO5k*)!?nQ=7yeoA`y$- zu~b}Eve(kalDzkn+r7fm=Ugs{gxr69snD=NYbLrL=8V()67WlA^ z$;mwY9mi=4Bst0FT3m$7SV}0h1o3IWnf^q!B^j?sB$s-3r(H0|9mh79J}`AO!{jJ>rh!xUI?c!V9}vesc^l{QiX=X{ z8p9S{Miv;*7aSJmAGUyPBZO&if)l(;&)CJl8)zK0#!YSU>tNOO`tFNyPkHeOM0Kn@ z=xLgm2BCR~8_D(T#Ma*n8W*CD7G^f))QJzyn*-l|xH&UsUfBG-a7rp5HOKpGlbEc^ zzla#QL%N3ddGJN+CRUTEL9<5Pi<9pT7B2&BB!$u`5W4>Fafp4r^YO86-q}OO`~*N# zaU(UujiA1Gw}3JIv^T}RdF&)|?-@E|`M)Ualfkq=*_DGT;1^6|*=1K$H*J8}86zy4 z|7y8h9-|b*u7;M7Kje}emJO*@+k3e{$}Vvv)UPWGUo0!=DzNw_~yG{ z=ZQN-BR;w$%l`)Wq2+>z0O5+p}Fi29O?CK z@A6I)Dz#kS=&?$oIs3E}91PvP|NBr(J`Qz?YJNIyun>&p7qp=ZrR{dkA&?q3x4MYe zm=1|%8kr*t2##h_+thImT|2PrxWD%d)=rE;A?psGKrWQb!&L1M@Zx}Tl*r`aC&n%- z{JFAX&iPrPve9_0b!}BvT})h-<%V%hUDs~1v#j9zQQ6t5K{`BeJnj$ThJ^IB&4Vd7 z;d#0g+FaaC@$0pu7X!R8g0F1CD!KZn0-F*0JTDcM!nS@KI+5RxQQdB?i-t7>dahi? zef?(yr5{F*+aWF}`HbOf_$^r9If4Z8nZFRkzl^{9&M&E+BB7iavyA(ZBAU3)XVkPx zjS?4c`i$Z?XDQONFE5R(=MywD~%}2_6tQ3 zyR@gJ3Zt45pbYFZhzjfgDMW9HmK&oI`yzX#)_!qqfAGo0H)MHLOge>A45k7ElS6e* z!7?zTwr|`4nI)EC!+LbVoZgaam{aRp&dBc@qhW;!E0ilA3;X#Lb{Ydw^&uWD!fdvTMg?`g4UZJ~|TbJx9*NEAOMFfj&kbXutaY7cE)f208+ zWoX6vrK~Ca4*q(o;;Tat#+%WIYX!?GK;t;wE3xK4bXN_zx?QQMt2P0wdbzSW4Seta zQZ5Uhx|kvJBBiGpg=DrEimGTxLBVfjzQ17?jb+SdJ`s-h-wBk@G~yP^+7o2RbPEK0 z1w4HoKo`I)7T{zlV~I4PAhjhx`sCc@&&@j*r!^J|Ar>4VvIHL{EjA+vRmh=pt3f)J zABH7*^WRuM;bGhDD^aW_+!4(o<%%Bsp6RepU06=(-bzH?nTk!Fc~ca%3@qgk-)M0b zVWOQxO0eDTlV#CDD=I{sYi+8j#p!&OM!#n5Hqc*2?)qQu6h^h7p!Kb$PHY}6o(?sv zux+JB1mXxhWp{HM2%yQAmZ3Ir5C+B^wSAMqU(vg`)q8y*y;3{C;G-NYMw%G#$G=|5 zX-ZW8aBUuvsBJSFQWq*HZj95PbxRfx$cK#dbP9M~)DVT>C(b<6L5-=8!F%04I8qSE z^y7&_n6QxLl~rb;m7^w>_|FWnf+y^u4X^u-^WQV>QM|U|*ZJV5cqsi(#K*W6Icawu zvm_`jgysm>m!^~`)2w`8vUVH}yVQH`L4ge{Sk>{bA+FdwgL~S&c*P)YyE^jc27BlR zc;98Z7U&umMZtH*&GAHZe0Hlut&%P|1*Q_;%rK&5Y6Xc$G8)APn3-3t;xX!2KJSykCC^6wX`rxSKyb#S}{j+fOZ8yiT>v(~^Lydez&UO~m-T zrV>xkjQjHi;Po+}KHdK`lMV9^-u!tOjO*@TpU3~tXEgrb(+OF3{%)0O|zbq8S@uK{{H`Wi$K61p8xkFeCZ!A{`Z22QTyL9{2z1rU$gli5BmSTr|kGF zp;7+<5GP!FpZFzRmcN*AXP5C8I!Gd%2(WoPStXFau4sUR!%#dHi!X-_wbnf&cKwYlQ;9i=g&5#H6&LHj(&J zsGGP1ejQ~FWCMJa5%_T@x5Z~ig-1NC12kD=U75_gNPZ}sGL~A{H27-yR*-JKd7LkU zTOop5tWHDRd>E*OSS+A?8@etpe^1#V5xbQSI=K#2s&cSjZ?Z|U7Y*NiucDz?F6DmO zmAX>C<6aff6OZheXd(IRfUXj!N3iXURXcmT*SlR}&E1KY+*Fyp#^P<>s7RmGOw6l* z=5m5z;H)o&5Uo{wsYX(qPS6|9l+GrG$o_alA>o^bLKMP{ufp`5t{>1)0ss&$&%pfF zN-3E&i;rZo!Q@V_xHpkE>5!g$UyJI#t+W~U31 z1hZ0yPPi&gCSd@lpe3ZAhWPlj3&K)yzPukcH^(0>*x`5-*4w3e(jk#Q^d}_TdHp+` zL~A`CkmIChHXIOzlLVM(0b&Cs%*Vyd+NfECTlGO%a;WCG{UXE;t1_dT+qby1nQpvn zfH&a84Fw)%!q5iQQtAT<7L4{-tBW4CbW*gK22)BtYDoa5{uGTXW{Q%;0w1vjItzev z^oaYL+{^bq&UW$&h!vSa%)(GemVq?Q(;VXTBptP65q@MA9(#6KDto=-q2b&RpklKb=X~DY-1p1^xtK zB*~lc#{R5LvkJpBXgNA+lE`{)>5AjrGjyc(0eVkEsG4I@CgRp#1GmBr@93k$LkSbE@cKmvm=$-3z{IR&r4j~7cBd!F+PZxg0z%zuey5=GU&SY#qoKJXuzCL~JgwzPnC; zeDQGJazlFcIOAEx)DS5)d>EUwHLrV%PF#p3nTd6)jE{=!@LX%(q{ysRZlNUPg;<-h zoY?Q+W8dXG_j0QHbs-72VoPwxCy-|?hj~|xQEqkQQ8bk zT+%BlQiLlFRMpq-j^oy!_ROox=GQaFgvh}+Ik|Udse#N1c4NX|{T$lED`zcDc9QF= zvZi1`ZlM-Q7%&UQvYJxX)FyHF+t%EIR7Y3$iFJs^yF&FIpb039!P(dSS5XC4imU5x zj)QV#ER)L7*^VhY=fHQe-m*on6n+7NiK=FtG^Bipk&zL0nfHCzZ}Q(8X?UfTHJavD zPVf*H;0>0Ij+H!emk8kkR3Rru+q7af?B~QnK-WiH{)E|a@(9({AC-1M;p0*R)*)bm zV!)x;j=nPi96MrgaL{XSxY_^uHl0VPPh64Pfa z{Jy-E0e_(|0czS1Lc(wdOOXoZ0;jE<3PDm9w66!HxXS5X;X@ZB57$~2<+Mc1X{uZP zdi(kz2V|DX9#h%Qt7iMmbmy4na(^ZV@ggi;-~V^6sE@XL$3LuEg}zXtWMR5++lqrL z7duK=hmUeXX)|0=v{#wiOh!dzuvEt|-%5Wu@2-?Jy*pLz=moxBRX4fmGt$g<{i>{f zxO~dOOvgltXBOS9#{+`BN*!zBbF>LosX^BrorRhPiyT*i=#n*15zs<5Iz?*_mm|yQl+*v|@7t ziAhSVjRb)84+L!@$hoTSAOH#D^^;6#VQv3ZF*yOvpB1gXYk34am!Ft z2&&dw)rK+mwn^fSy!V58UTQh2&1r~>DFf3FG(4gw-sGuk9S()`uvmhSflOGsd%LT- z0;m*>mV_~(F1Xk@|#m6v0qsY6lW(|YAald0-}J%}*y)Bcc|nR|fmW6PrQoqF1Udu$l*^P5%ovS?rwn;)y~GA?e2^Z+}$OzC3G6s&rWLbxR2e-)a?xyye%=Rv)VM1=nM-Yu;ed{;5Y@A#@5aGk7M5S z@%$5Cunf&chY%r{-N=1CfOKxozn)d zkp1F2j8E3~YaJm(zZV)}e;f#65o*Gpk#ZSq?#fLirlrv+03j!lA}oz5y++|bOG@JI zZ!etJduY&a8bav$K`a{wJ;GY0dK)+ADFztf+>B_}J3Bj@69swGJauV97qmcfxDY>; zw@aGy7H4H$UHCgS_AaljxuxY2utY{lQ<$k7-uO%@;ubbKxl&iRqnnCL<8`!4fdvrv zwFpCA0f7xv*+X+Sk`%XtBqE!o<~ZNGYq5cW_a;@dR_<7UDdpUA!hXe57Z(?YlipZ} zkWc5p*=v#~@>l_hAfTy(!E2y(%qGEH?wf0;=xKu_)87Wy` z|~6Rk~kc%Pt4#` znmfC@IYrh)62A9JF1cN#KYU}}G}NA6h;4~@T`@n=6&f8QR4-r*S7ASbOFZ&nhlRnu z=&*PE=gC+1!He0@k|0w#s_ddSSxrrGS_WRp-Be;d`(mbzr;9<27f@37y)?W!mmSd} zHip*8tuWfok&(|A`%5Yo7Nina4=OBieHg|ekesTbZ{vB&Jp7GuLp3O%Ja%?_hmBn` z*0@k-xO?{xC<+aGfXTqc{+#=2$l9}KXCuJxkfOljUUyFY`i^~Fa6X){vK~z9Of6Wy zeqwm&$^K8=`;R|k(CYseXs?Lz#UoaSR%~6s0?wNQFAQUcLaYD^v!E3B%`-LeI)@~F zgAkNAs7+#l{Y z^bO#{Tx}b(>_+Ki2n#>7;<1$zy~ZvpuOS6bqER}Ao;XY<@bfc-73a+~ngvGyLnfiF ztJ)*8v%P%7sV1kJ217rZS_e~VSxB&7e|C`o%XTLjYFjutC0l{{o?cSG;qauiq`Ydi z?2!pX*Mle&EW6em>wl1neE`uEH!-$~}i) zVRe%9ZG3=Rn|+*UTl5y2Y4K&UEOg(UkU|8tLnB*2g?3I}UJzH)&FeQQHx*=XMFyAT zvDw+a0`+bl(Oi5|7UGoaN!>$WfyRvJNI#(%fJkiK}e*rl%WGOxuxajc6~vA;+j*|wzQ z_2WFBjSXa`#{0`gCmIBmCKH;Qlr4vMbXC#)>2SVdc9wPn7*{vaw!AFpQR|}4OkC%F zDu{4M48PWfeJ{LCZR9MqBy78e|6+&=($2IgIT-*v%2kaCNkHnOexAGyx zU*k8;1JR#a+H>#lcyIIW~U_P z7Mn?_$>v5zU)1wdobEzQQ$;+}!brJz#DtWHF>CDh!NV^lWRpRgo0|k=mB}VTcJu4M zXPnP2E*y5(c}l%pzSS;@w)gdkih*%Y2X>y=yqs=J6U%1jDyt_>1UX+FAU=bu*0ww-zzI0{oXOPSrBdQ=^?hZrqIS_RGO)>5K0lUHTnGc z$6W2Ln~6VAYC0jRstC;8g`UV_SVK* zM}j^VH)Sx#J>0!q96{UJfe<2buL74f@$Fz2c3 z<#~~xd3hnUy%+ns|CyJkc)#;%^U~sS(IAj7X2S<*sa_|-x;1A<2e+g!uWMfGJ%;-F zdW8Q_$wgAGUt6feFbdc$yvhU>m~daMx|Xi&-%G#zCG&@yBjDy@3Hv)e;Tia$hRL+gU9U@ByNS-3AxT z^O6$^iV)^3FX!%_o+exJ+7El}y30(Lovqhcja6DmCXE5oO>y6cmhp-3^bY$zpi_A{ z;M(##7AGbpnSA`{4@(khK22C!9m)I#=`(xf`5Qwn>eX6FE!WZg;iG><1de~XWM7&X z7!iHReIEwxM<*vcM2MYz6g??V`VJ7lS#2 zzvkwexma1+aaQ_1;#-0?cjJmM^qQK5Lr+1jIy!tT3;>qC4Xj%GC1Xq1Z~6@v+`OWL za$03izA{G&yBSew64yDMvqG(KvT*=1@6^J9F>pAE!EKjTQeyIY1fo00^(iTLR~E#? z?sKGWtsS4Z;IGFsp+|JZ_mti5qD_o4qPV<|KMbW_f1!F@XL=v5LYpg%)jM$Z46zEf zJlt~4VBm2qLK3g35R2+33HY@-#%kZ}9XVzAh!$t{70xZnJG9-yEEa@5Bhr{sQSpK# zAznXJ1)Ex4{Vhx{cV0tETM?*;h-@}CHmbpMhc8UK$Xp85`e?mEN7&7B;h09kF55^! zcvLG*mz<~HsP4WaMx)qK;0Y5GBh2lX(Dzj6F`gqOQq))-BfR4E{h1}g|J>FR>`zrB zd>1B#iDPDFbP!ai&U1_N@xb??mYtomqOyMI>IzksB8TuCx6u%Sjq-2QtHZmVGbH>c z`}&{q=dFA%&0&p+hva6Hjb;kOqOSI=$rqn{|U6E?#ujrQ^Xo=+^9TEY>*x+9mN}xUCr3EAlQ-1SCEl&iL8p(A?WB zUXhfG#w;94SlmITNGxMBQRKb4cSSX;c-aDL{QBZtIPSW^{g>+5U{rD4j-=BbV8S6RPE_<43wGPgZJUHmQ> zgT-X5!{Kz31Ef2*{rmSjYlI`kx$+rBw1WJ2nhDq!qkpQhqNi#Hy4q67L_1U8T<~^L z=STx&JUySLc!CNbn^%ZRTt5ITG=?Cf6$>@=L^clWb5Ao>7KKEeo7IpP)VwGdPx7T(#6cftI>+1nvu#oSjM45*A|C_#DfxkgtH;u7Teu z?d@-EsODw0z)T82Q)6RfQ`+L^+ZuE^GJt@JK%nIl8hUAF&|LCK5u`2cn;?3zjC=ro zjE1$QCR`YNfFc+5+ib4Y{HEp%SPDU4FF$tw^MgobwUQ4Z8mMri62-Cn2q}eN(*Otx z4TCfWYaFY^@Q=0a%mtgJ`jExN!Q#@=qxD!7>TDA8&4cpl>UVm<(LiGYGSlEJ#NI8= zDb8Ghz71YDsG3JUvm71&tCfJUi3wH-9<9UqECR!k`uqB@q`$=UO~R^-BGAxsBY2C7 ztPyk_$lPHAVbiu&81qN8$0>$l&_v5u2k=87aG~!&f^IZ_2NT-G0>)fvY6AIZZO{Vy zCqb>CFvwU)vtZGYd32u$UWu!;16T_WF^4&pZ6_zZ3LI#arXt;xD4Uxk+B!P91=JOq zBel8d@J;g{!k>dno-}nUuhise5$hF<6pok)uR??#?HP4a&_$*hua%gbZ0z0C=J)NXj)9KZ?Zv*$oH!yRn+^;P#xkS^Kw@SXWz3D&Kfnya#~=#+l#}ElMOug&4M*{ z4lZZ#$8Z1?kg3}GX>D!@c0We{3#3TdoiA@}RbXFRAEtyQRiQo5$!%I~O)-D2z@iZ0 z3SIW{7GPrsC}d5)Y}fv#L718PeY1ljj7L0zNm)ZlU5QwRd1JSw7yUA6uyn}^_29G^ zZ0O+~E?u!r>GJ83^BX?C96^Be?|AhHF!T)E1M3go7axDAi z?+CTZA{>5KybX_xi1Iqpi)VEw@UHNq(%7eUV9R*kn045bToQtsKP!cSvk zc+`liT&=10_e;Vflw#-$h{DP>Sf87lTWb^sE^_E@?;M!>_z;x4>x&l9my{?WXkN#_ z0Do+3>@%C4td^FjH=dsz*KRN@W4@Lf_*G#rOxL(l0GZ=uZH+)Ed zeo%zH&o_(puC(8ZJX{g1e$B~+^=xl5S5;LRylcNt*^w}q8U;0|AQZ76giB4?g&%bg zMIB#Nye%%}EVsDCNA#o{MnH^nR*KV(1R5a=y+TZRd7V7eYWr}h@8=J-pLrJERG4~! zvQlyu6rPv3L^21y1d0?4@$p(C%;@0X8P#gWwk7L##%&^fp`ElTg07o^@Ykzd35d3#SxZ8`6dF=kY|arPo<8ilRGiv+eFWIZfC3Y@OlW=2WAHOl#h=PI_ z4?E|ERpoV(F^r4uOd(l`@OTpRr%$y(AX7`r$*|}y><*l%Rr24LsY?ISxhlYaW!V29 zuLxXJC>B2y5&gyQj^17z>~8g}+&{y)Fpd!zN)uB7Dpqs>OEeKgm#0>HZDL3L8Qy*d z6dG5jnxSozRZx)h^6gu%{XN4~L+@MN-}A7!JTiY_Cukpn=O?A=ueJVarxbPhUUTso z3(?kU4ipU-9Uc8Ow6gyU&u(>APAloh4|8)LGy>>JT$xuA;sHAXf|=tHIn*axYh&j_ z^X8K{uG79Et}1Vb6z7`jJ)$;PnU%uom_AkjgaF7Kj!Z*as^6jjWOG~%`Iai~oqW85 zFgDTx4XYujMYsg+7fFSXGn9A;)^kKDa|y@s^h(p~(}8gf;IE!(;jpkU z<=-cqvODVba4P{4l7z%Wovqe~x0J8lz92YVmi#Cj4xnTc6`e!m6v5q8OKJpCx`(Cgb^N`tWH#oJQDmLXXfB3WASy6ztyotW=S;!CLW*e5R#{Guq6X!SN1 zwAQe6|9Ca!driJ{b;EXMKQ|PBy~Sc*TxF>)l&385%kRl8%*!+eZ^*aj`1Ty42#mFF<0fyWNRENBj~*GcF_IvHK)b7@K9=j90Jn11hG zkpcaMAX=T;sC0DM?*|7QZwl5Z=c^(fkH8Y<#>NCR4Di))Io9HmDQ+U^WmmSXz7rD? z`Jd+IiK+UlE}nS9Y2rh-q@{ds-l!y7`9pF<(RSvoX6sq4;s9}n-iH#W`;VJ!UZ+s5 z3e!))mrI`Mot+FfHNRI2^3vC*E9lrcECpRHEM@2rsB*pN`|#>~tjhjok?tAT{Yq?k%=0IC0c|zs z@h@0abv3Jj=l%x|4-dE7eM4u&q~XWwH+(+X;A%n8Hi``=z|V|ag|=Zs-*08!8)(fp zxmz=h?$}#gsTOv2k&%(Ok#Bq;T(5nT=fIoS+p`?z78au*b#~&>3uE9y`zvg#f8+lD zBTsZ-paNLa$$>`2#%8W@r=*;xzsKbelITX?M$v!h4~DJYLdA(}K#^A2@xmeb#lBci zZ)~^w!OWTwzraG@d>hJ?xM=qV8ofTf4V!Ua ztUF=U;xsgOEqMpldMb`>#+jwCvsdRXlm;Z|(uRb}6An(C(bAbZ^9u+dR4*Jjd`cfn zey?NTx3Fs_E+n*~Ew^++v~zX0O9wmKbZx%Q@!Nev?eT%wVO3>iWT?rO>?w5eh*Khr zT1lYRZUJ$C&>^A&&ia3}h8d_c#TZ;($?qJPbh&u@1q#J6xM~}x4{80>e{#Y~g^&h( zuMRF}Y9H~LR4CVA7Lhc?X0}fb7Sl|;yh48*yplvFWJ&$TrO5oEn+K5=j*_#{OJij* z(@vsWqXA{t8MbmdZf1QtO_15hOWU!m6#4?N6N2MDKKearyxCP`{vk_LRoyrgL|T>w z$-);B%gfe4y2B%sdBu5pk0PbUCh+CZik~BL z)?-9A7*>!Z69_(7X}N(c?h~!9)cgm~Lpc z2R9HEO%8#WKtH~Ck!Iv&lbXB1fQnMW(Q-F=tHFx7hY*3-v<?m z(|dv6PlJ}tcguysng=d2y6AcM41mSRl!qh_l`RO4ZpglCA2!%J$rZPouWRp;MPusG z5$rQtM0jyw962AKGX^oJeRdW-fpf{o64nv$hy(_S>|_N=_}aTOB^o`Fviu# z=?jL?bglJEn*S?w;$P(iPd)5CGW=focZnaB?mKk+3)*0cTY%=~<&GyOK3??)SFbuxfagt2A*Zh9T(?Sp-m-{sb zoYs2`nlCRUHV1A=^C$V0hY0eS+dw<-l%8RP5xY97->mIvm=+)HZyB)VbdZPeEY>oz zcYRuwCO~BUegZ}jGDfLuDr8HgT~m|JTl<|!5k+UOeAuc?OkmM2h zR~P85x;oL5`+J1nV*h95hU#J4qVe$ojdjvr-VcaKpJjFN32EY-$BZjPWn>7tgjbX> zf=#57Cq`tq3V7q33iwLUvP)FZcgHQU!a9w@rFw%kto@O4^#;Yl_p~fP&Qp{HJ+;n) zaCRVOweqQ`kE|GJHjmvrXr8S4(;@NqV`^)0OE3I(QN`nEp~WyQBg#AX-j?g?{%UZao!rNx!?S{XPQA`_D}vu& z{BJG5c~-}vPep{q<&nYN!jECpprDqj6{Pg&o;uqrnihJ;CFhU&uJ%iBrY~kbS$cJi zWjtTFMQ+(BuC(!if7Ku~ma^7j8i<*+<&%F-liNnVcdL?>6--}1<4=?wKB}DYRyev7 z#FS$;Wu{-)|9&8ZR%=PwX#O}ydT$~Qm;tLiKmV0o1>3hyQ>Np zFrWl#uwe#BhYPYO0H3f2FrT=t5UbJ410x`znVB>|E}vZ-*EZ!41knDFo7nramSNv|!&k5Yzq9|*1+ew-gVbqc2U&-iwF?|PCM{F9lyVvzc?{Cyx-{Dx4tBj_nD8Xe?eEjexRqP$VfL&X5gFaXRbdOXAo4 zd@I*Bwk*7J&ctQ*eWcb*OW{Gm1P^*?<8N2pa3_)ygQ{3=?!?-bTv_ssbW(D`%P+@6=f0}Y#YS7zUr z2ae#Egr*#Xen)l;rqxA*GH=DG7bX>$y2wmNWW}PH#F$LWHM1d)?AVscgfePPzTrfH zw9oH*<)$kQ1~;SkD1`7Tnezv`jRd3oNr%{hEIBdT8n+%GLex*D-%$>6d5N*ntf1sw zVnwMGoD}^A4)|Z0oum_?Nx?MV4fIC4(n~ZFz3KotPIMC=ork7)#tj-z#d)U=A5N<; zqC{`WqeFYYw#>kghJHR~>oZ$;X+>1}TaOREJ_9@B zD#y^W=671R{o2&eW9Di}uZ~p=x9+Y_Z6Mb2&oh-);g*<_R&mUsQu$uXtj{<0h%STg zd=?dJeO~B!OW1ljyq+Wb($BHe%r&1(CPM(qvwL~u8!oV|(a;}+0tT&nTA(?BBO&PWqz9NwwDx5ox|a-6#nFp!C+ibW~8r@W&x z_(l#&_GB7rG6}tXI5nM)+9@8&Q3UT9B#FGqJ=EnDGP&?xF-(AI=epQw73+>etT1%7 z_vYZ<&5*J5Z{SQot@%d^w0RF#3Ez&0N5e0-hgd$b?5v1_6!ltztLs>LOxC{5Xluir zL(3e}E9mE??x7cZo8=TtW5Z~B2kzzk&r?pw(`LNCIlsS+qixaZAFB2V`t}^wJ_-9_ z+kXF%@t{GVbEF!U_84+idgwmv16fI#t8u!YU+wjFpzeL^U?e5UB_%Ev$eEQH zkRPS0Kdmya&)8&DE~X#DprCT z)@W0e6JoGjL-L|PuOnPzUH#=v<}R8rb$Tpp*bYH-q=>8?98VI!O(T^cLAhRk%P!uvbCh6Io+@H6k{2)rz=*&9MkmL@EPjI{Ia zJ(b4L*I{Mq^Sz(Mi;kOHMuOcAdosy46^E0wD>6#Qts)Y^iYhvXA}kEH`?fZVjY&h1 zn#sw;Kn$w_bK8=Efq~ck{r#}*82S*Emn;e~5az-%1*$10B+ZW;Bjt>`GT)|#4ZqoH zgBLcDY{$BOZ8vM(_igzsI?x(=E>Qh|^%z@fAIRNh`y(W)>p~rdEuc%4 zx`-wblQ}wc#8O{UYTE0Gl#c{;W8zKgi1l6RqZg10 zb~%6k`ifSC(Zg&t{&**>>X6VBr_DUe*4tFRS*>GL9Zw8d>qd#XE7^-L=7QpT4!F*w z%60AG7W&)f{yy@2t#5w?cIY#9Gpu3PR1L@8wHrcs_2ny0Xo+iqy?64$d$rQA?mqic zH`Qj`f27DOZw%!>GDOt(C<2K}Bg1d1K@N6gG}H<}!v-uWn|?~snUuRxDknFsy}qXz z`W4i~Geh=C5*Fd^bq5!%u&ut%Z_;U>yk5ex>A zxvQu>8R@a6-Shu!tq{pU@; z4jnG->fSN+$Vbb}@zxT%RSe%`-_Dw1q+q`sip%p>onQC6W{=Z6P}OjKI$(jaq}(Q| z29!w>0<25PUPkpi$DaB;VQq4aWX9OPzJtoJ-4UV;z~U07;PL_-a%YL7pTLa0%J0-d z@O@D-Ra0PVl}~wTD7w13qfsD)*Rp|n-Iryq6qu>4_7qlQGOT@RUa)B_BX)R$M9z}` z_q^~bI9l^PPZjLi2rwH|TlD>)s`zMCBpx~`psA&KZ;nc;F+4ADKxg}4&xmU-@mTX< zeFv(0to2;l(~1l1B7&ow5BCET`q(Xgim^>8KZr3JM&(aY4p2(X@a*o%ZgR%KTK!3N zs-~D(DqxZudk@#A_(`gvL{Ig!06BL=y5COh+>aWol$eyOYp)ZX-%e*J-3wd|3SyMc zhS2gpK3sGYWf>QPxU%Zb-^pVdU<_C(%zAcEtZl_8K36(XGuFa+BkDPCOsVq5Y6+Q1fp&tLBVr$dgvE9-?nZ(h| z^24f_j%1)G_>G015(_E-R&95!dy+PDDf*%q+$DgnxiD^UbRzY`ru%bR6!!Po+aK0f zI`fyQwFEQhzu2**&BZFKoCiLKtc@?h^mp7WGE~ae^@Xo-?RJrueE0-UC7i#jnjs zsBNBgynQ8K?d~uo&TTHv#y^x@Y#VS$#S&0fGP%s&+qs3F*=~Ly^sOAd*l}&@BkmhS zBDwdZtjmq39ZeKXSsMtXIg#L%s2wIsa#mfpj#Fuvp&r<LdClOtM1k;xm>zr>I~e|1wIx!rcvHDxpo5)z(x*HoHO0rNZ` zjqmXD(rt$<|c-@tFRQ1)kdk6T>6P>rYVSl-+v)KfbWf-y`p%=zp%ayk8D55Y zqMcTXlrqY#9g~Glc3}fNnF`ge%DL||VzF{*ttJZ<*;o&kem&+zDIRZZ22bLg%6}Y^ zPWRx9TzFmHCF1EdA|?S7?7;6ycv}ax78^xA1##j!3l2pHSynz#P z*LZIq=;}IH>EfWxq!~Kk{>kZh@r_T}IGa*zqhKzyR5QEs`%i(EvyZg3DHK4Dgaj3W zgb1~9_Q4BpfRWl#Yix)eBk9%rbpL^RrRPg636;&ZRH7G6&X-l|J$V0E zpckiEBcjktLKi9RA6$T|tHb3c_J| z4#YfMtrO~uEmC3Pnf;z)`3e=>o0J0%g7GJ@7EZ-W*S%br)jlZUOSt#)MLHQ(XYQD= z5@70LQJ`!PeK%X@6OJhMEh6kD&>>d=zYLu)w62*mpjg{&P%Q(GYp?@nr;o&D(&kE4 z*}s7C&GzjhWV@ovf-Fv#O9hjef!ar_QmfwrcpopTR&$8z+#$8;>2kT1))FfVp^h|+ z=cheiiQe$ZVa=}@IoeuB1MoYWNixoG=~CGSKw%2%m#=*yF`wkfhv0=`jZK^*@bWMm z+Lnv+p=~mb4`&Cjgh$&r1Pg6si0A7UW=;AKDTNI^1zDq}s}27h_K2UlZ+BVPt3awK z&nLf4L<6_^e@&KGlhLWNItzM#RXkQM8|Yo%^}jju`*OzFM6Ym{8#aG#5l+E{Qv1rB zcKWcH@mgS7Ok&~fkULQU#@d3{a;h~n$KY}>?I(qAsS>cY1le)jpVpdV)~dKvteM(b zjGSv0W-9RWG%l;TW<7<6J=oJ~$IPz$ciB6N2q;TZ`|Twu*CWOe=e1t&ahrKlbE?x~ z*L+Eeh_60XP5}{gO?W6R!LC_e=peV_lTt3|7$u{~xj<=G@LKz=X3!*N2BEbcg`Bvp z6Gy?u(D+lB?|UEgn|1K2!SU^yf4@zBy=c{eCwgNBoO+0*AozZhd98D=@p}oHKSOBh zvi;rsb8*+7f_5+aoAYFvk@rk*=$GCxsQQcpYjiTS2M(Cl=1UCOiPJKE{5)q9a#b4! zVRu1;;Fdp5#wMp+PUk;G91A$gG_S0j3Y!13xa0-OzYkJ=wD;YP{bw!uNT>Bg(yBko zQ~%(zQv(FrJN7YT9@!+^kv369oy8w}{Yy~*BPvXu4%PiWk6k#&)fAxMi(N(zM912`pb3=VPfPcN4_B zO7`r)HMMzz=rvqc}+U@5je*0YRlEDFNj!0r_hszahvv*QCKTLiSSwvy|ntm zA{L+TJgId5BBrQs#@}}7xF{;VV8R&w5xJH*a(>9oVg-r%#BV{*;gh`nB~uiYiu)NT)^j(f89+hjO1NtV|_Pe;AH$nng2ch(Pa7Gl=X$sIqh)XZ4_$8=Rb}+8eH(}fD4>9} zba$5^4I2UJ2I<&@bc1wvNrRLKTR_;PfONB^yIVRp&9gk`{Lk}zc;63>;gI1TaI@~U z=Dgo~Ks>w?$R`lPC>kd8}xRGO;vBHyT~f#ffR?_J7W zwiC=ma*~{Pq7T28SYDL6L?qd%%BIuO(@!hcX}M^{VVtl_x|ebQWcP807P$j3Ko*9=NU8KYb0!d2mmnaPuAgDMVQ4-L@8a0T3KHV$zEZVXiWcC*K9J0kumhx1%RM6>Mw z4N5F2V`u&k7D>j@!XOooQB9Dz@z5KZr^O6_0y5N^^U>)AOsy2nQh?NR2@3Yj%n;$z z;ab9!eJ9^qvW?NZ9!z%vethe%C6!9Z*-tZb^OVX;<&BNargz0;j&{%ebFbg{k=JBC zDQ=4Fyl@UsmZZi@wx%f$9a&sN3}v;S+D^ac;7sZZNvrqh>h1>oOrPraXB7XS3PiTg zDH1uNl0;o%W!vDMc!Lq@0N6&ieeeC&z65x(c!Fg=CuixoomO6Z#X zANtD9Q*%EsfBJ-=`1hcOv*Cu(Y1@Qd(lT1Qx=uq9400|Kx2!qYO0rW;7Ow+mYlo+& zA=E5|Kh4d}V}^%83;z1o=hdqUzuX-CMz;!+iZ`V^>k($2=Kk^V&j1T|F$it7c%C|9 zi~ON)GvAy%G{lRJ-lyI>wnj~r@20KwrCTSOV<;L=hC@Yq?0dKp9@F;Dfr-02pN~(5 z6>FQcz`u_g9_FB>rL7Q&CY~4>8EO0T=Y{LRf})d?BrKhi<83#fKUEl$^{3_^X}r9R zRB4(R<&FsH=ByO*qn0lX$1?Upz6lT>pFcp{?)>O|yk$4U*_k#0U${sp#Y6C$~&61MK!#ZlbgFI?^dXeORy8BYr;HG{uzehq;1`G#dG^?2+QFBp^WR{@B(0B2T)Nh z9aaub&bFQ&G+_8z*4YTC>KzF~7n6r_0nW+-VA?S?lv?e5I&G%|xBzj@Q)8@0s3~e) zwmB*Nbje-pg@~-@B_(X9(b&zA7Smbth1vd%XGWNpfvLc!CGy9Q zAD5MtIiBwdv`iNo?aO1!7C7^u!Qk{1(@kz{?d`MM`!=mQ?KdlesjT|OW@b-dJ8-M2 zq@pe@>;-B=2y&`$&+&l=*Tt5CKJ=55^!w1Vc zi!x~TkVja!4FVgulURmn$eh#-nk-*5wX&KP zT0K1LpF=rWD|*L&eZF5*-f?@ zP8Tyer$>#?qe8`?$%BC*AsN2{z?-E0@j1MJ8~)1uQTfH>`j=Hp+8eCBDqCk~w#!?? zR3xIlQ7I|3#__q)ruo*|Q(W@6O#5@q0R25uO!o9)j?Bx41wMZI;?v(#2EeT_bl{hn z=YOASaSL;L$bBGfV~M^0LuMufSSA zpOp3Faj%X{1nUq*Ex@ys-uk4&W>M)o9!ZIR)zzAQ+fl@{=Y6p(Rb&CU*TbC>uW3aFMGPtJNoYUcZaoesgIzkqRqPMoVDvN zL9@ktv}7=ZsM3Iui1e6zY!h~y*=?_X8pk-deB^(l)$Q=>qdPg zea%h0)j|Ma7*XS^UIa!*?)vl5fass*mX^c^zh3yk=vhPMp`Qm8^IL zarAj{FB=*J-M52_w~4ok3F<`@-}|4R^Dg)tGrt6)ESq39? z;L^rAz(+GwfAYG{{fKdAXNUh)-m9Im#jTU+hSdKl7DH+O<5M8xcvCCXM1~)c|AiZd z)5+n5+}&WiKW2-2^p9B7Yx0cd9^ai2=*YR9j;yYQlNT-xq+!w9t65rGJ2oEq2o?^- zfPCii76o}HVqm~q9+<8I67ElvZgRuxzpvfb*Db7|R_oWI7dR7#&mN6yKe%enIWr|*NN(wA6TM|hl#zZP&`dXSjNb#sd}wD9%KR><&lKd+~Azq_Q{o}cT#zn*WA z>J3w+Q#$TrVpD-7U$$c1g&!R`q-SJ+YXTk`xG!@9#QA3Fspv*mv~EGTSl_qhvVFJ5 z+?jrNWBHNPQjklvaP4T}*O@UGPZTrV+w^7NZLxl*u>eo4+u`?&du_n4;HKH`Qo!1z zPQoz4O%Y=PHn2g%+i^p3l$(`kLx=UhJmBDV+QeSG+K@lB+ZSW(EnoDQoV<+$7P*&v z<%SlUhuCb*r<8kH`W|sg6z#3FgRTX&Py;%<6xaGFcRCi<(7cdI3bMyC_JJ#aHcw<2G3l_W655!Sqn$Y>2*Zy4R&vMh=1ZH_&2IUphm(*y+bmt4m!tc;Q z8e;=VQw`t`fdtTh?vp8=-unCZdtXmj&)EH?D54#}=l2&`ueG$ke<^rhx6R=y>7 zx_k3|Gc!K8;sLc?$f7j8jF>{VK3BSyOg+@IJ{sg9tzblkI*s<9_t z9u9r6!enMktPqtzIq3L4op{$5wtX8cRgah z7dJRD%`TZW#{R{A2Mi*}X{D;Vy5BQ@iSlAb-V0dq;YC$Kyk4KX4_dqzHM|lkU5i?I zu!x*$@}l#*2sM;OYmMCZ<%}_Q-JKe8LWoG&E76JnCbm!7-nHDsFmzAJYxPyk5$KMm zvj6$Bp>JQm@v?*NO!>{xkTf=-Xmd5@Y6tN*h{cb-dA*X3i9EC(kMqpGy|G&S0 zf0>h{mYP5gd56Q{K_puT7Mn2~SAxrnx8r^*BkQGO)-FMD%*+Fv93E++m-%d;HnVLr z{gA>&T;wt0y28AFH0XcYACT2NcRMm{zKbRCIU%(k7u115pipL(p_4Qvk=A)P+s$=N zPkI>a6>3dS0&dKzR%2#u$4Jk5rEGX*s{z_WWs=zeI;r&1uLZGFxz?)Lrrj~NyED8U zjTQ^bvx^@7@bQ{eT%^b|_2oVA7|`b7v?BQVdqT3QNkB z->v>_K96>}Oh3^zWB%j}iFE3Y;qYu+0?+%tyR(0FGI~+H`Fz}>-su2;;q5)E7Zag@B!{gwC1|WeK#_ zwwwq9Gl{H~mX6*>Gmmf?vgTMNpBo1Qccafo;S8vuyd3=8ebX2xnfwkBDjvzn<21)2 z-e*`X9aB^Eg(|_;h5pzE4fwv}CinHRkvTpw*pKpjlaZc&kdI8#uc))oAPoOj{=RKs zrl?ndy&uv8?Dg?z8Y%c`8Ce_4q5JDjV3&FAC;YBy=645_-`P5Ctb`3&UOU{ZYTo zEayPm4dt12ApOWi-{ZXPgPrx5y?o5`^$XGaV^MYy5vly)2SK;jCC{3#k`X`MCJ8Kt zGV=^dIfR8FrV(XjJoKs77rrt4FR-B5p!8D6+@6F0^kw40tRkQL^-b z=?q@gY_Qt3@6Sj1*G{BB)`rnGug|=i;OZ&rq0`>BLx)4;HY09MK4cOne6BH6E zQQzsPl#~0q|HH1K;aW?_cE;mF$+QD@fG4c=qJ#QO`kjR)P#>DglKYm>D+vOd_s|#k zo<36^o}ZU;b9*Dt)O(?>N|~<=%&`Je`Gh0G)8NR!Vk(8&+0{-AA0D!=Lw=7OGp?VZ z3)VP^q7$c(vuYB||Lgh9k1r|v>`fdzGV7crNHs4sx!&VnyO`3o@-J{AK4a`27UuOcwIG76&@$pg^tPeFE}b` zVsE`;mh%QXx=hRp2mbzLRK`s_c^km~(bv~MZQ3KKk4sp%t!;%9h(yBoHyDx*mRv&5 zC6y(s2+5;>-S|#t?LwjqUl9@#_h*t|iBpe_rC`T_6;IN%2M zr|ar#n^{>sN$%(1=I@x>eQET;p~f?14KxBW9=6OdHElgT=RuN}f08Epz^Z!HmEiBM z;Oyd}3}eO)sZllpPWxN8{emTE^Zo6c!*0Xd#~G`1!Gq-yl*PG;B_oFuY=?`o$1 zV#{6Sh-ky;!cM7xKfDh+EGHmlw6w+HQMoOCp8@X9xYG+?Xf}1zeEs&VPg(L~Aa9k7 zTT|-{>A<@##vT3+(q_%ipPrp@OxkdA3PW%^$E+0^C%%U9Psrwt?6@8i`i)L@&0_IB z9^ELNc8JOUQuN|bICvu6-(Mu#^H@$$$m{Yb)^G#7eu{FmN8YjQQM)_zR!*d=DW0xo zX2Bo}gKQDO<;&AcnKbs7CjnD9KYCUI7VQQaJ}=h;llwa%LXzFQxIhTr55267)9q2c zX74AYR>JG~1**G5(d;!=->UKxV}=ayQ+AkHU@EW)Z2Gv6W1Td5n-BJ=&S$3;X8rg; z3baHKadPS}Yv`i%TEyYx;81|86x9|do}ar~!yD9}$e%fJzTo=rq63rA_pK?l{=b?7 z{KInXBiQp!<9OrBtZ|iS^FQyaM53;J@`rN`u#SE`BHhcrfK&dxTNV0tKq zomfXsIJviIgQ5m~I79F0)u@c_=o=IG^xR?V&s%2~`>!h6Maq$fzaHi12V&a$k}M+Y zJ}py@e`gu!aM;3iN(Y4!XnUpLD$=rguj`pCi6q?IUK@QYnIKXO&r{)~iK6@)O*@Ev z<#|oN7Ww(B8Y_-eJUsq=7hO!r#NRQZbYtD8oyM(qD|}Q5UWRch*fP9<&z8r$rAO!I zqvJ#hkH53TV5GVJ-qBJm=d z0>UVaSk)*d_hqQ7&*VkpFV)}sS$%vd48(^r&2*H(9__agNkNvp85(Jp!k%89%>IEL zA2XpD1-0d|(p<((Ds(Y$s`;|Nd=bWf&u9lfjEv68i{w~%cyz8iqk|vo>e>s0Q(!zj zKQJ+>e_x_Uiza?OJbzj5lhT74uuoL|;w#PHpPRWrr>?NbJ4fNe{^0 zH*oZ2oexAwIo$cXg_1{~4DE185Lj1h@8XRf`%BST;~Ehh&`$~1cEXx-i@UocV>S5I z*9kW6bP580TyzFJ*o8v;%Rm4))!kJseBONt^2Ne&B1Sw};K$X2{I0RzC->lGO-+H~ z%^#7UC{zN9w3t88<7ykQ6nlLcOs!HNIMd0}dE14Ibar*EU}qyFBl`;CT)bY)%NZKt zJVT)X2?dVp$0#Q!75y1GJuVDU6rrw44rXP)yT z6_5UDBfIg}^(LES-YtNNmy8bc&I@hwI>@c9CB=TPq%iBl(X=mLfCA&OwUwHgnPDjB z1MQrhuePHegH)47u}e;K}okG$tYBf7VXW7ZKA}N(m08 zHr?KpAE+%+x3n6+!(c`74D7VDXgtc8!Qx~Lm_k4=ySv8X_~jACw;(*&n^^p9a_8Su zwLrWetGg#x@;;>q$Q?>%dc~bVAr8%GqUJ`6jw6zYa&R>ts(pb1yk>3mlxP7OdBb?l zm?88L&(b-9#rxvxU{JS7MAPK|T1q?cWk8Mi@XW`qt{+q~aZ@e@&)UAw z*LWlVp+>KP`-wC~0c39|NhK;enzP0%D!7p6G}&K)1UY@#)cm zSLm~G80Cgj^}I$07HbtjnsAo5+FJOl5F9b=qMa_CBOUoJe%_$GR>Y+&!?QqaTg+f@ z|G^9y{!dG+FBZK%-}xI1W%{IA!xeF*KTlF-i2UYgykv(R5bqvDg%5ZAnK0+V4 zYh>jwot0=lr4dVRj+v=?`wD9sUffeY?)bSYsk`SUcNpiB-pvoh|6tmn7CJkzQW)8c zDnzM}H52o;cnOK#bn5*k3T&3#;m+-bg#X@4F^lMJKuv~doS2z~Kqak6!HfO8p5((t==O=(Dts%te^G;*%Ttr3#;NJh9yc#5jc{hu~E=) zvy1uN4|8dA168oHaFlrNm@?0U09&9w5L(TocC#g27K{Y385G=&2IfrgnP>X6A z7<`?!q*PBZgKpN;54w&1Pj}r83;n;%^-aj9$2>t*EL<}izvZmP1!v;5#RV~>P#nf2 zsd+6zs+k01Z1dO{oEZ@k#1dt2swa}xOtb~gA=>++Xzs`1-P_xHt1@iOU6E{eC=6w` zD>uKuTq_~`=-FNE{W?NRPw%VV4^FPP@~k=STLgisO0r^kaqY;rD^uS)qlVqHl|*u= zBE&P0Uz1omi0RrLzWdXo+fs0{TX*RH@%UvJ+=me3m4$h*hcd{ed2# zzgNSaC9F{A1og8=WJp8OM6#!zG8Wnl_ft=3j%ask7a9PwxltHp^d_`G?V?$UgswiI zW{RoshLouuJu2oX!KL82w6!LFt;wUhUGCa_m7j9hQZQ!e3hSq^=MH76j)On)r(jfR zFO|r{+x`q`S_m-~7L?b&YbSPkDxkAa=R zXikGwlZY%_=vCA+NRgi&PtzUwU`ZN_{Z-SlvxSo4baOb6jsMEgQ6 zp|&uZrVQmKqTZ*LY&V;Q_r|7s*wV{ZiPs!vQay~upxn35r!$*Vm|&%`#j^t;#@1i~ z7CfD9I}wTIC1v|DU_xE}bvnZIPnYBr?sG!;fKW28F!8(|WHS;GWaRufvJIfY0G z{ZNN;@h%gwS+|*eJLk29ZLyfO?6r7HmZ+)<+72i1W?W2-Dvc~6J?`#W`~uJV1V^U4 zc!jWj=Z3r3I9b5K2H!3PB;ftjva&N`#X6u9Yx#qaJ40rK5^ZZ#4rNRH`P>>$khX1@n z_5`r~zr^bpw|~o#1}#c(NtjGwL1Sa2f3xexMzMg~IkSLhC~ksQx1|ZjQlUzk8`}VT zomCLb#6+!cr`pZ=W0W+**8YA6Qdn?imXMGzZ#pato~NQ+tWio{_*+%OmLizi+9S*M z_nFBjDygY!W=f(X-4A0;SYLJ!t!F7F#7S>OkslTpwdRavd@+_&)8sV-oCiG>TIg&l z+U^#groAlBWmt2ncEfewueX?Pvf#5o7%W|G`n}J`X+|LL*o{n_+7SB^zY(`tK4Z5q ze{<85yr56tsbpT#nuc(Mm{;`@+y5FWQKcgwB3fE#e|ov~Dt6gR!1p3>Gc7Hxs?)+j zh`!eMA&IuDNu9@)yuRTAbaCE&e&!;K=8@3M>{QFW;=V{-^uhfSU8bPR%Y22IcezR8 z4B;H<{58*sW#u~Eaxid%*&sN1-#JsSzx0{r0sCjtW|ms+Bgfu47-NxJFV1JtQQ= zk_n&R+ftM&<7pNwh2?DOJ^rDSfOJS`iQ03n(JFVyVXu-%_KXl1=8cSxOSxT(o$t;? z#5`BF;rF`ZT)e+K0cxwU#eIQoT{_%A9@nSsdrDFQY^7YbY}RI(Szv)b2D@zrPJ?Ld z!asQ&s%}5+B&D+?p~VxC1am5bH%l{oOR9#TyA8FHDdE)e6Zy)!IRPiPivEO^baXx_qMttLc@S$`nt9 z!=S8D)sD{Q`1h8mO5Uz;8k6H02qY;XD*E|JxRQ4i#%nqdDW?A~1Vm@{?d%Uud2-pq zxrVVBv!nzqa=!{HWGRJqyQm+_Y-LFGWgA1Ot%24~I(eam`e=ic9^_eNjqA8{hNLsv z6tvNyPmadt*dx{y_Tat3(97<0fNWh>Z@O7~rd$TUe4G(NNK9-3Qxo4=>DgP<|DTqfFBICasc>aa zK~11QASG!e>7{$k<3~$Qv+XGGtRu*1DZ-6%@4+N((ZaXH{>`{aXC7#E4Zf^^;fe<@ zlEo6$5~gjSvwU;e51jkPP(sVdO%4^bp-cfKI6jxJ3)mF9!rg`h)FlV@-!^_Qh^fD% z0ZzsDB*d5rC21Z3l9q;$ z56BfG2w`~UVWL<5`AXq8o(ar8=a!acQ2Nzx^HI2>)0IA&mR10Q|jeHR?Z6Vz$?K0cg-=7o<_w>a#c-BB_Jn}9`VQdGI3_Qf+o#k zTnBFv*|UD*+*o~HasCuhb*)9fJzZUrGuYlPX*7^FY7wUQ!T>vnnU&Sye78~fXp3TI z=9oN6wT4=1eKzPD`@xaGbCxzWEukeHSi~lSV|^y{N)}B>e(189+7KH>ERa58goH`H zi!dY7y6o!dr%8hKb3A!-XXgv>wdQ6rX&D)ywZ^sFU)yuGu*a$d7*{UsT0HR`3G+u~ zh}T*#;m8e2^{ttGe86MBD>83mSBDyRJX%s%nv@_ehSN=9gex$jLRF}5_%F5{Crdwz zIHXW2ib*M&vR2qTKiTXJGzSl{J=pauL937M4NOt{o4(m_UX3!`}G9{V#b zv7v7~zBD(B82Db|EqLy*q@-w!AeQTQg#zbmlT}Pt2L4mn3`$CmnElrb4wKN1l9!!p z5?9-=CY_=%*PvXrTywhF<%>6~lKO-#2bzCUTt6N?z7J!vVDjGvRXcbCJdpgOt!?s9 z49R8YCOR*Rl%z;beiKV9E(eo*{{S1a3hW7JtWIuX4a^)I(&%H3-XhHAEd?6|r{GRc zPfq&F%95i3Kp{;|lO?GxRe z>A1+XYmrW4|6goc+WMVHYny3Kh?}NR_9jlJoU$r;^4BI0MA4qX zd$S?En?8)=8oa4-OI`vIPvi=9id9Mq>b*7A&&1*qYZ-S5rd`xbW@~Vc>xJ>Om6U!Z zwZW*Q3P*BPU~#xDuV~AsF#!*lUqz+Fy1CpDS(0oml2hFDMJ6I_9F7+it_%TkB|GQ| zzXU$T`gAqG05V^S-z&by=|*Mn5#d%pko>cQX0hDGmew_Bo;W_PE+}+9btHdI@i2Gq zqTa{S#TGBB#xQQ*s+5Td_c$Wv{Htn~4oxcgG~e->w?s)b#6pwKZGS#;A{`{2V0S8% zjSNZ1Ns&MU&{D(kO{!JZ7RW|mP}%g9dB$yT_`MBB5lAxA&|p}53l`#sY)Z^()kaHU z!(oj9gP?^88u*kNC4=gQ_Bj=p>n(65A zaozT3&3Yf?^{hKpxnL(*#gEZVqIR#!{~_G8qB+a_PSj6+dO|DUvEeR^ioiFA@3{*AVGP7!#p z*?XA)sd|X&YO^@h6#4>uiZra|#XA!1TjRXAVy#mgN}#{Ch`COMn6MN3H5V%N*rRk! zh0q2yZ9bBK>2zX`PHR)=AVzH(NZyr^ngcP@!w{RBm^RfrsnLWHbQ3Rasl~WH+Sz53M+x}sQyKD&W*JLC>ILF138$f2v8Y!F8zK$iw>sOPlaEAhm?WpNk~Lw>R=U2 zAAzGXGCbV1HAOG-fg!a-z4XTv{j0zsXy|zZg`a)Isir{fM6)V`Su(R=&ADmYzeqv? zHIR^LWO+i))DI03LlOToJUx`clJEW!Quq>#UkLIUa52`7Mc_KgDpt`dR>5}*k4#Lc zxYHk=c|LwMP0manS7a7sz!j2=1X^Vv=DSHD~HiEZD`PRi#v4WG}|Qqx$EnHeme zfjdF_IevC)l#i$7<32A3rB2>1TmY?(A?f0-~!SxkQX#c^MVRKFavo*k|W2&)iZm0n~=T22l~csm%zlz zBiykbQ!BE)veF3kO2}&L-;@r!d-!?m!Q1ilH=YEP#orZeO!B7|yat8_ak#%@Vx4hu z3ih?#a1Q>SIdXMz`3ap=JQiVQWBF;oy6QnjO1ih^C{j2=1VAZzOULdSF(%Fphr)9XW_jI_bv)Ga|%@N?IbFqBgM&BH>41poH+v;bV|xD|0z} zf3B~XEhujVOETZ4i5P&xIiXOdQ`bu{Zl;WRa;B5WUxOr`t$8u3F#s~Z+DDE7xRL_P z7rx%5v$8)}N!DCk$+_FU?x^fKF}1d5$RyH+n1sLghp#GD(fp_6CiM0B*5vl~wB^1= zRPsO5vh&bS9^8|6u{oEIGB)$zMF#fdg@|*Z{k4Vm(0Fm25FFCIz1>B>*C0sw^)vC_ zVZOy>a49Q2?y>MqPrEmu)_(wE!m1GebAFvNCaR8h z%!HH^KAa(N-CJm%fX${E>aDC4_M?b>j-wpZgL0?a5D~2oHSQZD7P88cC&FEN&TVx) zu8`Slhqp+FqdsP~rW?i+3=C&iWTo4pFPZxxcHyyLE+GlYQeG(8QvIgLV8HTNQ+lw{E?+k)oX)V?^a-0)4x?%s#h1!bcr47sshBU`h;vBvsM20V<|H=XP%d zl^_ascCM+iU$kpJhcD8FQFkwh40d9q+7?A!zgH2rx5pB4+xrTGf!KdU#m`>>tuxrP zlGzgz27~5Acg9yNgC85^@{t*zlXy438%ip!XY* zDDnSv_rv|mlQoPdWWEU~RZG>CvzqOMif9cxoZinfb=TMfH$La7>hGeD= zLG#&~J?~Sh*uy`!ZXlHHmgzOCUIBRR;p)|GA(;qW%wEsCX&;v9S)ECOGA=<4t9uIoNIr1Qm)<^MD=nmvbsH?jNTqFZ#R z(!^ewF?nn2uleSFlknlvty(Ewb@)8lIXOZE$v|7A0m!~uj}zGH&1s?L<&jd%;k=(` zw%_eh=}rGh`5_ykWq{Z|+w^`Od3ZIf`s;926NC>68(EG|Ot7lY?h4u>i*)f|PM=nH zF1ku1c{!pzvts_Ou9<%D^D7nVi0ypI%To}(+IkFLFeQ!_t>vD0J`ha_w$@0xoEtR1 z3mHRWW8+LfgLt?6o*?ydUut~{+71+otSs=dw#1hEo*{>6yJrtFS9jCgw3%SamOE=p z^GJ}I8g5<{gI(cvK=uz_ESj1aiqEI3b6@`2pS?a~!qLl7O(rqd*LXV^ip`p;tb>`EBqT22~c|kJO4K~5omZ*p4Ld78dA4Ilu-JclVFl1{k6>1u6_QX@kQXDyDtHxbl zG|S{qzmqGKP7(j}*QL${`M*<^z0mjnJHD*5!ak__hy#t@yd*Foc$2gCrumE%DAi); z2aErX+YZ(AFCt*U-Nrs&IdVpE;cXo7CtAj3(l);u((W9vkRF#q?)kA6z76qd+!zcjgD~Dj>?S%3FP6Js#3xUWsn+5-txr} z#;@Z(V(?uWW3Qcfpa%>4_{@XHTW0dZAZuyI5BWUXeT51fA)nhr_uG&Zydozjr6fM9 zEQ(pe64+Xu9}@5qN!&=FU+I5#v!F;rOFuh{8IOd#5m?#39T?Tk$mIe9Qegxv|JmKL z?&5N5DA~%7+iL;uE!M^u$?WZEQ_?JjlV6Skppkx&RBVa*5bdIiuVv6AR-|oX*{Jy< z7?FUC)|KG_S)iI8n^~`9w;d4kp;Lmq14~6BGZ=0T-6;>Dh&r)Pss`mpllRLRWt!G4 zgGN{Hz>PS12Ajl-7re1=&#^N?LoZe~bLQE7UEg?ukFm7<09n2!v+bmW=!kP+QUO%H z7_`CDRc=@a5PpO1`x!@oXz&Z)qF^t0!irpBXaRAn-AXS*IFR#xUt)cBBxwtXv2c)2A}Y7Mn-GT?_uebk*#5Ue7%sCaZ<$MB}_4DmVS`S4$uKyA@!UMn?J+C9wQcA(D>p&Du8+sr#@JdNoY#}lZg42<} zWx;whA}>RblUbx=uTuK-L6CCTriX0&)XKAfqC5?(l5s$7{K<04@Jo%0WE`~l<>E%@ ze^JjGPwW?ubmAsfh-o_G9hCmP+>V?%I*~{^MKkW*9({eetz>9s?1&mvtuaPQx^}XM zi@rxdRp-9V=y#7?Tsi7~V|ITRNFq}GMoBE!XU-uyMD(lOB z>vjktcgbEoku3Us+=mXN{N;|`D(>`F7bFd(?ZIudx4; zFhO^2E;>^MJdR12N=q%@F`5l(Mb|K@Bf4|vT@K%PY~_X4LGSfRM4aieIXl+Ae9>7s zn~Zh58q)?yp@8#26DHO$f z_Vo*sW_P&pV8;bNs{D{%gEwAWR8-8!=)4#Q+c!R*6O4YnCeERoHsKLGshu<0O>m2d z2YleKPH@c7qrE4w>;awYAY(g*i;qup#6 z2S?|6e=4)~7ks?(+E=&J0VdW$o{2_WA8~VsyXtOA(fmQ55pFWLngrRweExhyqqwd)B*?y1A}bjacZSJpkP)Yfr5)oB;DL_3|l=}J{lQ?%crtd z)#$iJ;Ck8U%sw(HQQO!v>9&H}1FmS=OkF!+Fq>}`k`S)E1(R31akO05QD;;K9|Ry; zQ+LxZ`$LqF1{dzyp5VyWTDnXR0WJb=)j(G!0pETM2X=ReeCm$}0mJdio()0_8+d0$ zAbv8uRPzUCOT{~pR1qOPt@w>ySQL`1G>p@YB( zx#Ff+VNgO@pg=W5W%ch^eeEwo&RKMdSx7yCB|A$^Pq+abI#WO0vRSN_Cq!Tng zKuw4zNY66`_uusP%0UUCY>x^id!cB84uh39``FI-ZG$E-ml+h(xmAov`7vSz4bA?j z7~7)!K^bUkpLKBQ>S|PMY<`xCPm{{}z_int_4A@l{4isQdZ6N7Mp{z0w`YL+z^YP` z3Q-TTMGw1}cE}OtrYf$p(c+CoI!c^_OF4*6r!!GNe0LbiJiQ3oF(#WH5tGlDdd+X$&{RT5z z7CdEBC(O-_)G!mM3u~qVEZV8*O!L$KwrBwtbE$Wei?GJw|ERt8q+OOW>C~dLvp9&V zTL~Sg?oH}T(w#ALW%Tf4VU!f?3J(g-!H}Qz$~9vtTEsJtlB5~lm?TWrSbx_WDmExz zz0Ou|BQyzrQyfu|HFM4d{C#?ibJt8X$|KD(#wCTq$urE13>*YeH5zH+)iIia{YqYX za`C+d2Tua{W5QQ^w7GTE+u`_DlZh@i?#UVYvYbnfODp`SCWlTQ>Cp}9PFC_kG?zZ% zG`YAhDaa$>#3s6GsgSP)mG!PeypZl1ulbpUX=Kz20peu$3kXj)5VUh3p-Apf9f>Jd z+x8;n8-g$($?VXgD;a+yMO5s5sBhUnI`^*rc`i!_{TX9i>sp{@Nm_iKsDhrPf@Xv$ zWOWEb(?}=y$S}x9?NC!GP5Fq+TEU*`Q%vs@ zo;&$}+WD)YF>>ojE%(#UZq5zfKd%bOQ+QAEbZAH^0LPN*P;H181MP!2_RiExzDMt< zl705rqmJIbfth^ehv0>eL|5Hny4qKMCw3Uj&er(~dDc~TGH#76>+83(A|1hX!j%$- zYI0IvaiWGEu9m=#c{mRzk6<~NVx}9bT$8klMK|CUNuD!zq7H?}_71U#GF7@9D*Js>29j@to76lrkO5 z28R4z^6Mm+yB^3S$7nv{W?sFgPk2QYi35vqm2s!NxC+DIiYHRZNwR5kjSOwK?rZ+)@#)%2b;l z$xii0qDEuA1iwOf;a!qS$%r^w_`8?g6EA!5`|z?iBb2fs7_z8(%W?wZ5)CW3`|zYa zVYlGiAaZWS`t@rOBWwXj$n?*q3EAYhSeS4rz7eH<>r+iMO7+hS>(fZ5C*5mx`qR+% z7Qcnb!JrBhQ`|gw4LXj@5cL!5<)IQ41IQ-`!_h5CSDkU`anJgR>o0gsr;}|gTWWvf zSJxeTr{;s9NQ>k|oyVL$h@d5IEy@oJ$=@F*IHluGCI;vpPqC3T>NY+|#qNZ;s8OS} zIqwtm$-L72Q1VixXTz8#$X?vW^Z3eTjUqS|UlylV(6OKlXWKK}q?9swu-~OD4CJ5Xsf?J5nfGhq@H#1Y7oPDJM zI>5u&utu^}X16!hf7bJ^op*)*|nn$$9cp6BZ$U53Mz~(PB90C zuKoxW*W#R8PmtSQ_P7f{nEvUCXCTga5@hL9dE`Fz?p^b}z=eU~LGlK&-*4WV+DQw| z>VT($TBji%{##CReDUU0tn&tTAklXL7z@%W;55iUx_XFG5*= zf8@Q$aF#V*w<*+F>!swjNL}!|&RfQWJ7B`)gB&6zOGp}u_d}(0fM4;4|40_w_C)#g z$LGvPP6BR&?}^BG_ly63Fb)drwi3)B7SqljJ&#!0WQ2A=s$)`zI5oar%|$r26@|2i z$h#{yx%i>GH0SwQj=tLeL)2L~M72g+91sKqq?8n-LsC+@ySqDvp*y8px_jt`p}Pd> zuAy6c=uUaOcfI%h33KK<`|Q2;`hF{Gz9w3wPwaz^PIJLG&;kq9DN&z;Hiji6{?%(S z4gSSV8i6&f(Doxijb1F;{gNmxn2uW;!S8}sMsbrR1w)cn8BUCL0_Qg=!^TTdg!{Y* zQZed3(Mg%0E2PZB@?KKvTfU1nP0IARPMy&xR{Xsy-meTq83GUR0#Vzu z6m-t>W6uddTxV+#r%XrG=g4}m0#2qd*z7S?dLoX&GNL{;lSVN~m9~5P(TAHUzQrE; z`xz6*( zfUO=@JJ^l*Fb9Omgwv6hz*ypXHL2IMG1avsM9Vq_HLHS!B&@7o0#%k;8f6t&d(#rxI zs6qaMcj8OQ&r)aYULj*18pA+t;Ud$q{%G^k4n9`tP<&UYA z;o*sRKU^|9J7eK8vl12rDUfNES>1PV0 zhbZSiM0@$8C+lDtR&x{%g(^y6t_WV_eC@{>$8yP{+m#~qrFt(p;Gm5p^IA~I=z9wG zIBKeb3cS{EJ|4GB9=KC{Dct5W(U4uSfFxn$Hu1rO2Z5hF=)qbNf@P|b^bZ`#9}-+B z`Wm1mg}kcn!)~v3?E$^kyw;Ww`bJ(Wna#7d@Hx07X>RCz)MG4Vor)Ky_C!PQ$+nrc zle+B!^${_tvY5q1D&?_k*(^KZjnZ__T`1y^yER3Lw?GQkTdBZ6HJ!9Mr$QAkdFCoHa7NU4J*A?&*Oje?UmfHKCBNtG(QDJ552C1ItGTc$b+$FrwY#+fzg)i! z7>UZaUiAM`h*8$y<^?+aFl~EONI6yiRTS*scgcsfJbHDVXvO%Gqig}nX)ECP`w+>p zjk+v3$~kXz;QPk>h|cp-KS z=FyRWuThqyz243En4c7i3$jqG>lDi7d!Y^57@8lSq;h7?-+=Fzag3;@PdrRkn)CJg ziRMc;su4PA`c?EF{!sLJ#yu^^moAmUPm{6O%J+Uwe(x@!Opt~Jqdg!AsjZiF^u(g; zHPx58e`&h4?TDusN?QOB$Em#%cE$tXn{k1(aUYo8{6LY6B}Up;@*{>vT0mS?uYyAo zdO~{$)~2Tr^wfk+toEyh!`YVS1eD2#v>kMhu8i@KvHYG5pYbl6=>)0Z<8Rv9`b2$t zTp11ZC@|9GOVgNGn(n04jg?mTE~$SBQ`bE-Y3o6gx~bXOd?SMsFwvhM>7>lWeQACU z-yHl)OqygFFK36I8$Ax|TlrpmGVr&+-pX#|jg=GmeY;S>p2p$gkFgAJP8Qdq@EQSr zLTs$dSmh>T(uye2z3w`uqpRVROQz-GHqJ)tS3%^+iaj?>w#cgMj6atiW8qon(^)bA zVpp4^2x_L5%ZDqz)Wq%C7DJN;&oO_O{2!kB&tj{!`$xBReemtzE^8WZHJ z$>XgoMcYYAw4xAua-wc*7%b(U zNQm%^b^5s^N4PTY><8=(s+)t#xSW9MMm2ni3nGtC1Zw{r>`wJ=T> zjb9uMO?fgYT}vk3ydE1hyXF3Wy#SQkW~HL~{&?%X)nB}|XLC3Tk^L~hIMHSCKIVc= zM2|~a+mX%evt~d~?-N6tm|lcY$7HSX2v2RPcbBNf}_i$l*d4;~bRd2}Y6_*$KD;pEz`Nvps#E>FJ#KsM3?^T=eD`8db z$mU|hY17=0XR%AOS}b;EW|1s2q6LzOjgYv|1f`@?7+f-zqWT}d5<^>DMiV`i- znmY4jj0#gOKQ63=i(BhxDv|P`Xs$EW&i8Xv?^6*nx~NF5!jS)1FP(RV=>Kri@80{; z@5e3J=rA@)@FP)4dYPHc$oBL@s)Py8ZCu2&kCcnIC2>Iu)~*ZfjE@WutCnL#9Lra~ zsv_#*QE`red?Lfmbh9F(qUaDIMH-Iko-ghCi7S;_pX@_D4T2xIj^-glbl&Efo<XA!tGJc zuS>FZS%m@7+jaKgw3MTX_Ifz7Y!JQaingM1BaFlFTyAx&H>x6>xmf19QJb`ji;|AS zn&T0m-_ygig_3tw(&pje)PUFAYL)Agvyd++w?JZR@l-arqv-Q!`!7n=xx95DC`p|e z7Kg6$0(^W@lA@;$DJaS9vm7LIifNXgm|9?Zn{^r8JzM8o<%W$l_Z3;U^%(02V5lk3 zmfbt_`!b9z0d{FAX4i+4m+`v?5>LqA^URp0f?i*C=EkfS@g?U=8mll3MM|nAE;C0e zV|}n1m|A~lB|FFiCuSPRaynlj%DQrAdzt6S!UvBhGY*r9$dDLnVk01}3621fr&wt= zxt%iFtQB(rl+&;2nSiIo#ndoAt&LuWIbgd-*=2Jo+!TAxim^jxtJ+-Wv~=8L^b)>! z6!iP#NlE2L=2#7lqc^ZwMaP(DX8$Dm%N z*qT3YLI!dPG`c?zla_6ko7u$G4Z?6S&3WxDrA35O=zewT9*9x6hz4!1d?l>_T*oF~ znn{H>u`S}qL|Q{*qk*S!+TYuVo%JYoXQWb^R@=nKlOA~bUcjlvK|Mjx>!BSBc9s}O z-ZnAGsh>x@3vCKL2uN^&Ytc1PA*%y*WW=g%+HM^4r$qHonw}r0`{1b0$>Lu|jNdxG z)c@)6wXAt_BIho+(ha_)@v>Vg4q*a>R|}G~`@YCej6n;jkaP(DIblw)&nYig zzCO!cpWpl+{q(!I`^m%)?>C|NL3ggTd;VjDg)lUb%W+iBM5L7a0JE=-xpD9H>q43g zb6Oy~2fXp)s9J%!(eDX_ni@fMC-qIM_owT={--|IdX!Jr#qAzvHZ-&0drh5P&#D?x z3ULkV`~@M4&}(h9lTr8p4?6ak6!n{7<1V_FV)S$3){Gy0etdE&dn%N@>7c;0q|sFK zyPFClae20{$JxU+FykzZv*g4#b$9MNg&|QP|Ez-Y4d-sn#NMTphxh{BB(f|I~Op zB!R5s#DBoCYe;wFpY2C=pHKt$mBtcP(~FQ3<1+(`LqNdvvk`$mB2N&5Kj?RhoCfF! z>oX}nIbCW|pw+k8k&Mo%8_Yt8*5y?o4VCmW3E#WZP2Y#lFN9B9xa(VvEruXK0UIRN zY2a;-4oB*02JXc32dFk47<*LgXbNAUraCC=$7B=XbTS=_Czup9*!WalM{<` zcA`JUIt1!G3x^jikzcL_o|(?FpZk0x3pVZMu^ulcebT?#MXzLIPN(B|uu)FC?05C8 zKUUf~q%o%MMS#)@KhP4{#e73Y?kS?@lP;}^6_L$PjryCXg)jGwe+p(qj;&!n0{4(^X<{aPF8GCqc%C8==uSn~Eo&a}s z27hvcxJ~$|D?`d3zb-$$`Uu*1@V*r@Af=2T`2P9)=WFNl4IydmwQd^@V>POXVU@0@ zAI8b41lDyz3lwadR*DbYJb5~$ z5vM#@^kMhfqx?q9k{!;D=SkqEMM<`}-_vj3@YmP&GiR3>{e`XHhp`^~L*r|=VeVJ~ zPcJ$yrP0hJ{w&;oZ!=q`M!))y9(r13*uocNBL3R1_c#%pskVWZCR1S(U5TTwqJo;> zer08t=QMm;z~h>~kSreZB8s3198ddfvG;W+v+()4;wKQxPW%An+!L6)8@U2=sJq`& z-WgAMCugFI{q&S@GZ_4}7(Xu%JWy7@I6+GK;i*+Fs*TlE+17oj(NkMCgK?KQp^ zn)u11SM?eC>_GS&w)zg(K941#6V?DDz*H}gs5s_qZ@*s6Im|^m6{j!Z zRX`Ewv;aY|k-$ZC5-VBhpaYg%Q!a9QX>7cxdLBeO7Z)vTmw}DabcXOI>AJP8;p;sz zcn(}c5Mxd+!EUU52mdPVY0E>_GHy_#D2VQwSIf@R#zBq2Oo$QHyr&KLcI8{_?Np_! zL&M7Iq+=DO&(Y`af8$GFh5lwwy5o(`1jXaBA2CZay5F7zD8EZ?H`GcVe#36tO=#}k z?9w>38>Rt+-gM*g?eghM9Ve)-1;cNImvj$-5|G%wpAfL~fGL`Al*ptd@}jl;c&1kA zW30+wC$PpSgsAD8S!lweL1TbxKmPi>%%y3#0!a!urh+`um85U9>?FPEubfOM9tgWL zOLx3w?$Icp}5*Y#~uu`3{If_X?njjQB04ddBz) z^K@901>vzWb5WnD5AN_~-@BUJh?7}+W!d@hc6VL3vyar$4;CVEaZ=M$z9Ff$1*h#I zw}4_i;(e<8Ik~+Hvt~*&Z0%>tk7t4yN7Uwqfp2Mso`T#phC@Ij{tg?odmZl(mHr7; z-Wd3=YbSm?ionGr+=IETn?SbNzDsKaqS*cPm8S==^1e$by`zlsM19fo)SRvMl2=7P zKRFzRDu7r4k&NqwUTGRb17GF3o{kS&7`6Haf1IL{A3bx25}6v1j#VTz?!Oh^jgZ6U zkCHFgGrmfk;M2()D|9KTMmNAj2>)$}OC}hF@ly5IyJ1f@{{xWGz3k2!)_5tCTgdg) zOu}p7DtujKOuI-5AB10`DC!wzr5u@%>TCM;3@Y_}eL`Hax6Sj`g_Zu#14n z_9?;LIES(L!QKXu!{2}SlKLHD&0wlwZW>%^v_dyD!}-+KSzWOlo3j&ru4@P$NGs7Oj+<*O+*jQq-Xe2I2$yM z=+b|{uqm#*ip7lO0$;Wb>FjwdDq)D}Cj9bxzcsi&{^cDOCXEzy5006NnF`~TF*~cc zjMSPmmG$5WGNNERHkgC_ZhW?RZX9XGmWXHjv`QNomocC07(N>7lNK-fb%ta7yI7CK zr{XAR_K!3b%X47mk>n1y&zR2pt0N(3uIy~PLX1s7^EIP00B`MAF4fbO zi^nPM&#^IX_EVv%Zg7Fq8tKG(sId3J3S*J0X+dWU#g>pX@@T;`7=S_@&*hU^(ssUV ze);JBBF6&#%jI{1|C@2YVVVi}`E4eIcB&DH5*GuOmXd-@7x(K$fv8K0&n8oK^~sTe zhh4)+ckk@x%ynnYOm@>!Q0N4e#L*Z}h}1>Pdrw4l=xqo8?jOr<8s$FZZ%trn@+VPA zNcB4V@<2GETT*e{bfBOdD{*mha@h0lTmipL#j5U|yda1x*enimkH?t)UT+sU;8JfM zJG*?VIwJ$LgdYp>+4K}y?014Zd}5UG3O|t27P$>3s$UuRP)>jvlp$WCjz!OWMhwQ1=g&R{aRV(sU64jJusM{I11pI~aN5KJe? zAAKhf<4xjEnW?(3O+P+A__d-JZxL}o#q){1My~R`z1q3+-0Mbj1#A_?I}7xT!5sZ~ z!s&^p^_d7c0Zf-X7^-HtUo zUi!J3C47!u&csjDus@Syy3I$ZHR=TIG}>CRjD@=$z2dJJ^$49zyGRdDOXl=@x5RG8 zTwsNGn^n>kS@O3dN6f^{C7TV!(ISrVdpfiml7gRln75lDot+E;CI1A=*fR$F4Yac- z8>ilvPZ|`29r56hZRTfa9>vA@$jr1+3nS^S-Pt#=V>KuQH0Gr^9CL$T?XY>vvll+= zjYyHXE1i`bGi%-}7FDt>E0}ndSzwN&n_MAIrHw05u=ZAPyl*HM=WvF_qJ?X3JcJ>{ z%2jQ$Q6(T@(6#pVm~L~+&rGYe5#v`TYi}uEWg=W&49U}51+%w;cZ!{TEZ%5E6vWZJ z(@c;ODi=B_)Lmrwh_E!LDZQJ@vm(24XK2dVLT zZRU9AX!l810LSxe2_GtxfWG562dcVv1{*pn`Cj35`Duh_m0|8J3{o%^y*oOHF_p<+ z>vz1rC{1FPeo^OWAR8M9QdZa9#$EsL?p$}k+eXLrbtj+j;J9PYd(I-ycR794YJ1J( zlz-R1=cr)H)?>|+)nLMipk`dVR~8yPhhUO!Dn~;@@}Yo>lxa&U1uM2FQkMlOLGn`9 zFd%-q(g*bZ`dFE65jZVCeRChu$eEV0W&$rhy)zMI0-&*@EPFZ(=fJW(#Fl1UG18!# zZx^iyx!0#QZ<^C89U3oB^A7Ps8kT)#Jc zJh@U(sf;-QTB&M)eGRx+;-9TzayDtzQj9-=Fy=N;ivsNUf81_q+;iUD9N2wjP;eKZ zOzfgdorae#5Y>YOGL& zPP3K22UnaF`z5j#mX2lR+APZgCQVOslEWe(t5?`|b<&c+^>oW^$J4lRHM5&jNzUql zY*tej+IAZG9)`kAB{PPp@ztT6hWsMz%hpbal08H;T+=jxDeZ6BwYI*u3 zL&YqI5dc;d`QRV)O~sL{ko3x+0l;2sk)CmoIf#!#JkMk2A`ehHC8O`|$gBXfLMEA1sxV%48xso>M*C+93WKo0NxC2%*eZrs^E z;CnXG^>f`vf<}~PkmSQ?w4X7Cv@}fvdhZ5fOz|950XMash3E_lZ~gB{5O`eOw_HYH z8WvdX65VT%^sNv_eYzMC-Nxo2H%`kZ)A}lg+9*o4cET7wgpizQQxakQyVTuQ1k?HF zXKG*n^*?TZKCyWtPx8=8NkxjycY*NM8^KW%7#GjtesHD}-%L*T+y2+t_pi)r67stH!O>sWu} zd)hjE=J5Fwu`ZO(*i)%W&UriX`nO^_!Jk&b6CECVX~o&BSultuM2R_G$UWDfML6)V z4O{HI<1*hiBVX1|U^C92m09=IoyVS5K(?D7E}7u-fF)UOhKr?dXOy~6DtO~hONwp3 z^S_M7)8FMxT|WgLtNu7`uYdoUXllI^e~l{FWG)!irmaEeK{7eG)LlbaIg~kmG}s<3 za>0^yBn@UKD~1?k+wA@#32cz1bgtm%KwcbjasKz zu70?;+Z=JjeM(q=3B8jT$=*WIKSTKHZbV5JjB0T4k#{1${b=Ar5ZC_^Z#t<&a>9MVjc+hG~uaiAu9x{y`Fc#iCOpi4~(9Zmg6$@)vSx|Cg z^bQU0?#{|k3ntcmiqu4!wMfdsi2_cIiTjPw@<{gb;|}9{%6I=n*L@@UZ*D0#O9}XN4V_>JA;5zRPF(Yt40@1EiPr9P@k5O`owCeGJScBv@u>jk~Szc zZeT?(WWwGKz!6LxeQn0xWO62WlwlUNc&M{sjX7I~Xgbm-VCpoeYvaaxU|bz^939rE zFB`5>CCS2(Q}(lYi{=?@K2IJ5)_k(;+crQJ@2yx*)zLK1o^@GVi8_>niYD7q4 z{=Hsy?)*CEQtH5ZMy9aUw9VdHNW0e#jJLOVZQ~9rN<*YZ8vqopf`y)M=j+<7@tQiH z{XAzEbb~UCItnGmX13XhqV8CJcUCoFBGyJe)P}T6>*95* z^WA;{PE9Z4dmEyzc|r6_#tj2b%;V*YLxDPDXo{!=iaQazcM<#hzP+ZUPX3r+RCp}v*j-01B<_g8w% zu)rx&N0D7phZu&oH*|6%$;U62rAUAdn7s3W8%9gAwyNu=*@NG!B8B2}>(<$eyMuh% z;>Yp@mcCbM`nu4 z+Da(TK|rgXJPm@)6Ua^O<|YO==UsJuqp&Q%oSeH|-2HT|_jBLbyH&r<$LzM^k2`H7 zB|sIfUeZ@bFAAnoqy?*x$2v)SP( zdzB85<=r-pxqSPt5^Cw$PvCB}Ymf5J5P%3>3F%l^8%WexwwLD4557MM>2sWY-@JPd zE(}&`ebrSa%|SQ3crcvYcOA#^XR_;V8?8?V(g z%sG9&r70t&38)>H2KiiRxzB5#o!tAfI`RD>-$C=?JQ54?=jE^(Ar69}y^bqO9|Je@ z*!aj26MraR>~yg3OB>c3>AbYgBpS;H&b&e2p2Dw1`OUlmLnj|o){#^^K3WW5D^D@U z&ZNNbZ}54;pD7{NMwZS&c5Zh(0?M~LiS4d}iQbUjWrK^YYiKuhy^qkSRSC?hK z6y0XfL+PTeB8+O6qd#bpaJj0m;e23n@`s54OcD$QIZleMnOkpJT)Fz_^g|Ol7efa} zajY{{{?Lvw%Z?Uf%b4)kD0`M#j8bxdI7LDTw(Dv>H(vPuNX3pe{zJuK9)%v-i*^Ok zPLmM%_R%L53+`DFGA>rd-u!4>QfwK<3*>$`-MJ;Vj+cSFw%__r35Z$O9+(58k6c* zq>*ZpPRAx^hctuRf-VbG(6sk?BqmYKWD?9xjd}eAFXsoveyJ7(LE#LgB}>zn+ktDy zIvEERchH~E`s;+H%cSBIz025`hl%Ya+wc8>x`M6KO}FN0dRZC7bKoppjiNX=pqdgb zC+4i-dtKJ*l0Yd&EC>2A;ewi7x(6w6RO=r_&1{b>e7Wo;oRy}0$dDw{g^M10Pys8^ zcP~hzv&s0kO6k0N2SGxQDTCRs99ITe>X2$Xy3qS(HsjtwE?|C8;?iw#F&)3p_nt?l zH6Um!!opF!*7o{92judRmW0pLN^ZJl*?vQc!Lg6Iv_+iz|=Y*jq2>!bjgR+cg! za{NATp6lB=mok-h2Tr?l!0etKOJFl1QK((gpg@btM&Hj-jAvnd*oio@bN^@@m7UB| zY&y=}-M{r_C%4o3q8{uOlztIPmXS4ppF{d3BOq8NYd1I|R+lP9$tB4?-X@rZrNSj! zA8^@j?ZS}<1}n*KWHty}kea&U5e?;JKNYpXuzp_7ipzgaODI{8C zZ`$o&jvYS+()-KlAQfwPXhr4~IKpBJfu3J}#92ibK!vU5h}Op=#=f$LOGdiv7Mi05 zlMj^fo9^A&C;ejQo1J{URqdD^2FaK1Di-eTXV+Y^eGc$Jqyi-JjHO&SX?$Ga z8F^Pp3u<5GqFB#NjOb?$zj?M)N=_)*+1h9?&n*wxX?UQm`I=r=|0$S;s)PoXt9a|b zeMXkl)0AnuxHYX#QvRZp=G1-Ny1`=bGxqXets~GqEjDW>s1$n8Ow3!i^uh^{4M&FTf(xQg{Wt`FY|2#G3S;Kr2Y?{18mYZ?^&8WnJM*n zTK4j6K(Wu`ue*B*qYt@*+jLrziZHq%9}%xu9x ztc2&B&`|JD{KT9JDTtl8m{Rv-y!RFp2PvDJ{GlsghM>P|stJUd&(8Lr;IC zL;<7BnE4^vc**>Y9Xqd@1b0hHyZ|(+Ok-BkI#P|Llq5>W1HmNIdhSGQU;o3hujIJkakVrD_@J8`J91yjwmEj*$dbkEsYSmiW##r5V%N$Z^hDK_6p%WyaN8weQc-pIr$0 z3$wdcZ!4`d3=@R7iM?X9%Wf4p-z=;cnaj?=lf8nh82Uy-*N3c}HX1GuoT_ z-B*e?C)c|Z>I0l|c|jhaW4Uk01c6F20ioGwyxr$6kfzW43q0J%oTss>>L;i#+QS_z zD=vjOUJXUAaUp1XClx+vKD&PZaM(3h%G_6tC%>5@7k`_E<#J+|1+R5&@Uby4!ebzfpI+aY0Unq^cBA1d z$DA0VLbU2c{v}G&8lDKqR4(swOvbgYeElSd>?^|hCk9>P$g;*uBdwffGQtd7 zAdD%c#d?QVF>%O0!YN!fXHUZ4MVW{n2}mp4{5ny^2^)%UC3)B6`$+h7>3cr!-uef` z+J17>PlcjYD9!^X>2{I9nYq9_hIDwT%-+sv&mN@0?hcpb-^eGrIwQ|ESTlPpOVDD- zj5TPCJf~jcm^G9TA8Qw`O~77;xdgrzr%L5F&pC$5Jg3O3AP?QYUw_f-?s{rCSdR1w zPakU|_+0u?i99S9J--=_lc(NQNp0Yk8R8pqWbStR))*kmXm} zfOkMH0}KE#&|kc`y0|EX_}-sn&GlusZMQ^ucFIh;M}e7yn#wbSuPU^m3ehRW88Roh z9;pL#-9b0g;)&XcvT?-K@mA>24~ja^e^FgSP(1w_h6~;?5`Ue4T({WdHsa5(66xXw zIvqOTb`K99vookTp$CzVoq9|3MckZ&kbwl!NO8PclNvf;HxUDwQ$xs-ildm6AbxgK zcW!R|Yvjs6%Z5NGfm)FvlZ_c^4#g)wx;LNs->KLTYa-ZgHIMSXb40jMbWfRs9zu52 zUzwe#CWb5737dR(Pa6i^poEOn6HluPh*i^|%bKq(>FVe_XSexks5$v~&dZ*G5#yFe z8eT1)oRkPXj)xl++{K!On~i3~H4~O zk4Hig_`@YuHz&)e1tDaNY1U(~^=|oDpEyysj)R0b9FS$dsFt^%hXNilqvS1@4Y)!n zxg588i0fQhK2!|VY2p!YM@T6~@O|$3b9(m&U=YaY^jMi21;T<&T=EF~_mFY@tI(d| z85#~DTz(gtzT8jsrybkS-L@_{2tfBF(b#j|mBL`RoSP}4kEF!R*(+0x#jD3EWE4)n zQ0y4MI9O!UHe|gh?)-imuALq{z0IE$!;Z{#9^ATOC1YAgs|=|eKGE$GF9#?5wjP}` zJ(iLAa%0|8ARr~HNrVax8Xm(2SS1^r>+{KOWUgemJyrl4v6<@ zxLjOfMB`a}jIBb(Ikf+jz8YKJy1?BlA98@o=1V9rF#Jj>`h25b&C#8X<~MV5?QID%cPu zmg3oXXqhS5HoXAL8*8NQOzF#(r33T5S6NHP`G{Nuc)Q!TJ6i`XB`t323l24>u#fOx zY+blby53{7rqB7aR-%xq6A@d8uTM7jUewQKy9OYJ#8rz+E)^!dJ}0N@g)-adbRA;# zIRGnq)%_H=H4~-C1CH|iA!9m7_Z^m;B(1;Dt8Xia`JeD*jJwhQd~TsaWWwVu_&1~= zBjbg5r^$=!rL0x>9DB_>EQd}-g?VPWf#CUdZ`FN(JKtl$Oz;eJE z&0w*E!Zt50D_E-|*Hz~03MKA~Qjdx>%_L(G5y`Erh_`;^UH%-4YkyXfoz1Zt)wD^l zDp@WOTAw9#)h5zdGr%mBPa|7vP)0%f{s!9KH3_X+Lfb8G=VP}|?^zn1MG~5>BSRk>^llFihoxnIlk+XtXyt`#{c0@DO_O0~ zqqcGm7!?AfejedKUobhN3(&Pw{dFzT^bT^hCNh3I;2J(l8OssRI*ugW-u#|ikZ(?X z&ie|GUt@Z6T?+kzet%WR*ef!i9nVHfK303P2Pa$Cnp7qO1QODyrZS3xhQ4~}(dAxu z8NAW^eee3IW80Ewfd9(6<)c!__mkFSF6VSexSkip_0r`vSx(=aSm#Z^R1!2o6C%Te zox4pJhA)b3f%R;WE<__ZRO@f1SOxh7i8}tyeHfzh1-Y*&_q>*|tD`M)-_m9Nbv~I0 zyOHJ{whN?E0M(EeLmx^{|45f$`eR?YNtPQH+c7kC81108yB1Y?R4$%XtZit2V@20( ziGHyim2_VtFiV6XJGZnRJ9Reni$G~9J)ZvNsU#f6KXUx*`_d_8f32<%357JxU@N0k zYkb7}q)G?8zc!Kk|7M67SWEL9*P!SlV+BzxX%zfdM;kiIqU)(8JPTn>tmcU!HzxAi z-0C1BV|Mkpx{47AERhC+u5^d7Y1yb!=DKfIG!m(NsY#+UOC|DtPUW{*`ulvobr2VqI=aG&NAYKv z4vCMA8GRQTApZwvpyO>zoEy>dpf)<)dhoTb$1vJ=1j8USZB+?EbNK-!x3>8#F968* zAqE;BUBafdi?;(|9sijzN6lH(K3_no*)YI>VFUuq$EZ#e7=FIL7Y8>y7%@vM2jZc_wieyI6$0I>CObC#YO@|VbZPe69Kjh?6_3G=Uf zZobN8H|!?j%ee-+x<>4WM(`^1?YCSzIvFdb;xF1eY$+_23c>^LAOLv=X2n^avJX*h zC|Y6tbpzJSkTQG930dAc_$J#K@i$V+m+nb&+_TYBPG1(&%CmSWk<5@Byr}7r#iVxq zcNhvilIOT8Jl%{wUAH|YNoxw7F1B@eHZI*Uin$*N3v<-&_kwkA2mx0TeL)4FgYmYQ zr8AQ`kBMXb+DCC1*8+3pEEz&L@#>j{qGM|wouu^J{LvHBU;eY845)a@)D7=p1N}%@E!RYc*L7 zD59gn>vqu~R>n;{iP2jimm)xkxyALq_GrljEY{%p*c zZDoe%f{Pq<+cO95;5@-B#xvh^vbpG5o;(X+d*f@j zs2AMa?#~F9)o?k8m~P`Ly9W;UF;vmzq-tGun>yekn6_j7em(Vmlf7hqq@!@fP~o`8 zgqvk-86vSYmi=RPrmZ$^KYG+0gKRY5$VP^TZ&z=zXGYS^|I&L*4oHk=qi zhk#4cN#46pO5bs1Z>4hR*%CKUHddzOAiIT zxa$=5pd-I-^+E0DPsKx4K=(nOKdl>#Rb5qtA?jVilSC#9;w%teb~MEyZUgYcQ#UV4 z)3#B0-+L~)yg(QzAR*=OQm_5*I$fu2wt#*gcQt z`0Z3tb(yEd*?gUY2>5i;-^^sE5TlcwMDrLI*4pOo!gDqS*EoH=v#RZIGi}StAWnVP zW}3^v_fktXa^y5%Z=hx^{-j2rG0yL@F+}Wo@EzZR0v#`k#@UyFk?bMTb7nxQS3RBK zn!iS&ywl62Ihc^{d7)R2MqVKnZM_ZU@YKUR>$uI=0QKG`=R^5=wV!j@BR^?M?+Ir> zbSQuPF2TAEAO4;Mdz#@9*G+uOJ6RpBiPw1=}5p0U^Zhk3l)#6 z`e7Ss1OCC2FvoP5VF$_binQ5sIC{xS)5R}2PRe1*TH&ec*qpPX%v~1SDqs3&lHu>X zQuP6=Qmf`#R`QL}g z|NqmlpllGsVB*5`D27Ep>8Y5%rKyP`u5pctr3JG9H(}l?b7mY zWn5_!qU}eilWvO`U3NOObwvERWXPw3fe0U}`8^lYGVfQvUNhNod;1bX!G*3eRUF{9 zqHDmUO|bHlLE{+4$Z}K+EI(1r5ysJp3qs=vL|&Mas*N9S*=uiYAHsQaD^tyNEicjZ zC8tVg%4!{(x8P0cyWadl{9k6M4PHlKJbGz@qvL^^g)C5An+q!)CmEUilQw;TSNtYO{6tCRZco~xrG_n)M&8>^O>R9$6dlT8Z;MF=5^b$v= z)iJj894nc&y`{)wZ|hSd&WLi{wOGUwy^g{VgYs5On=86UzzWzqAm*|&W>DRy z%K}@wAJUKB$ZCUc4LGZugGmcTFwy5UD^p&n{J;PdSbKP|aj_&!Xm9P(&u?y1&^!FE zy2t$Zue!g*De47}nnQw)2hpPqnU-m9{jHPJ$g@xg6j&^nqVxhxiuD&K^ID@fRO4c%T!{db@3B zzP%o72k>$gsUvr=tDh>%1h6gOi*J5juWkoOt^?!>N}J@4_+M@M1F_ zR?~qxF(4^6t+XN@n< ^oW*XsD65FTxeD&p&1zGXQiXvD&g=eJN0FB{jxT)cU#|7 zV*pJ{&9_Zy$*r@n>2;aKG5yicNeAy+OE6?l=N8$+gPuI~YN?+*<{&e(0AgiC6tNAd zPO7x+7n)9iYfQ9$`o+-K#WLAAJIdAPwq4=1gyo(M1&*;}!wimq1UuJw?{mZcV0 zpXIK`IPZCXKC(o7ttAJzp0g-ye6Pu+Rt zemi5R;~?!+7NlVy$i^P`I`dmf(+&Uay?UiU;#8dWY{pKuh+yTRm5pG=Dm0?vK-~NE zx_ke=Y2L0=z!n0`RKo)gw0qr7Alm8LVUqm5t^6);VC&|oEH_UDaJM^HIV?_Su7t6c z=@T@EQDo{ocG_)U8;|Xpb_%4x$A+Nc@~$|URrJtkx3VO5cVv#au1PnE@!MP{Fxkz9 zB6f6SR&uv_9SIzJ(hPLE1^_i1t2kA^M{ZfFs!418m2FE+uwzjyq;gs$R+#%qa1sNyGs>ubd-Rut6b=L1m1{RKSa2U%3{3FC>XzV9wPYL`w9$ekb$T~FinGuO_=eVFH=_UE8qy84Pg%Glo!gG~` zj5jdX**R@k-|D82U|Z70!y(~LjW{XH9pBcra|t!yJ{)C}a8%tgrB^v|=wP&sw+uI5 znP>O+-}Tr-+!a?VF==WT|Lvx5=R9xXH|yZq+&ZbgDjPBv&cF;+1kJD7J|g(zZ`q8V z@Px07M-EdO1C~03d z85(?Dn$`8AOUAOe6On_{L-nkN;EJ|SB5*P%2f1n&2kq_rI9{CFKS&Zf9_ys}Qqq1k zKadKMlq1BRsBteH$it2y=(zNGojWlZO2XI>`&=30}V!`A>K{h|LN+=!=dWKw#Y7`NOln- z#Jo~7wjyKS3Nf~_jD6q6GKfryu|vUhj8(=bv-_ zJLg>2v)#{g-_OtDiNn;_A_tLMCLeSge>vX1Df#(Il#!$utvPMy1l0tRHfN*YR%-QT z5hsNT$8$}Lvw=(Ox`uv6vEX-M{E0^GfGV&IH`!e3t&O~t`)S<}_zHjT{)1s(_1}lJ zPE?Fu>o0B_ABOZEHes=@wy^;&W~1Iy3xcwSCBJ&c8DXI7@26dTk0!kia#!ajo(pm` zuiNZ&1zB91E)b{*^i`O4?EBe6tXeqgtpEbb6O}Q+PSKwh&GG{bE|3+htn4m(!Q7A0 zwJ#6Gh`Qk#197l^L;JWTdsYb`HMsIy3uj`2d2srNmNIdazqA2WjZ|S`FP~Nd^wCGD zqZn4y3UM;K9Tw&Tt5v>99(TdgdFQ9M(W#OUvmS<lB}R59uPsA8ovv&wA2*J(oay4J&C;VQ*o$nddNbBo4Mcxw9gLjFawckRJ$Kk zI?UQ90=&CWyW+gl$Eg!Z=>_pSt0ieIyI2p9#j z4)+fpH?VOEjOk~RyQ>)3lfMf7EnqP|8NWRy6zh?iR|5~2T482f$RwXdHf9`$UiTKJx6RKAGfNHu7D z31Mv1It}X8M>11c-GRojxTE>QJ&(;qIGGsc*1aLZwZ|yE3TkT*b3{77=;V&S^0ZF< z$G``-j5Bz(mrGaQ22gRl$FO~oW?yW`LP1A{+i@UOECq9&sp#T~esV6cTINemZJmPo zw}(oMj_oy?60XfpH52MP>nzIWWNLH_09Pm$kN){y+TKc@-1IZ7UPFgWk8a14dt_W8 zH_kSCZRpB-=!)8)J!O5C*|n@_m7M{VKL4YipI8v5rzwSI+O1)Qq~xbAilqqV_%Gi^ zemsAO)v!N&-lGToO`t4PvAW4-NH9>pL$%C6XoY;Z-5zbGVVvh)ej3~QShJ!<4|NVd=m5N$jJJ%RJ!nc z>!j`V!VpkuykqBq_X4tSY&h10R)%GNyfXl?PAI z7s|cr0T!!~bat|*KaNfI012*^LaYkaomXA=*_SOAW0C|x(zusdo^(utsJIw1esxlV zH0Xw|sC2h0Dp05w>y~C#=Un(s5vOw|C97}-qKNJ|SxICdt+hS#bzX^U zm;C-zfP7m+;PaGE(=T4KJed9oMaO~?+{@kdiW7<3OczM1`Z1y2ToY^JyYu*6xA_q# zgiXRU5k}3>=qZG+zQKUjD|~>a2vOq$|KOG(6N`Gfh9+Sn1XTB|;aWjs51Z+He3cg* zXj6Yo`e_BIDTY+e$cG(tX#qYHgat|a)P$eDd>9GjQ5E;2ON9aD3Luoe6O6i-`|Fxd z6qx~FkdWk;7F~{#x;Gd9dilwM-t#5T=f|a^n2jgP@!n+Kj4rq5Ahv`JOJ@7!13V^J zSEikRkgjWFyOx8?ek~AmdEEzQb)N8+dK1v#HS_@2wHU0pOZ6e(z_^9l>xvhQ9NM=8eCJ*8lO4zPKRaq*_ z+L}hwsg-UL-{;2M?fdBT@Dkt3eP0z>d8XQraW1aU73UP%B66MqNjDWAUVL?FGo>AL zs4>0Q1XLa578+*cSjbe)$JB@50OjYozNo(Nehftbci}Y9hUHlyrlGb(*hpq8Nn0oPZ29!zfN`(P|Jc>-&u< z)IE5De323x*n$UA^j|aRkt(iCm+^}T0?pmWbTy4L29T-OQ%`=5ExzJjJJg}iRIQ8z zFkHGGpy+Wu`g2;tg_Jy^9R1dVa`ZCa_=Gn#0u#$4_>!>~!~xmn8(ew$i<}1P9{pX7 zICd|KVt$o9hxb)pI4Xu(P0W{65IDz}kVlK?)jpMwO&-pu1U-$=Zby4?md%N-W01!=!`+PIxU;#xakg( z*faot=K&YaVHR~52Q^|qd*9OSa=xz-KBbnHKQvEuV4dT)%wnYiJyEulAqtjPXY{9y zdOfL&IPr zy`qHUgS7yA?xKj@3mT`cXRCJP64bP()|?_(hJ2?D&j>^=(8#TbdMQZc`%*m7BWNE3 z-;G)1T7T`kv|cPlGYZzKg4)jr%8tryO-YSztQGim|l=uXgZn- zX&>Wfs~ZnVEdCqPyZ!?k%!Uwu7iamQ%)RPn@?$E<;sOmQ8Cmh_UD<^ocboDmHuf)wB-baR`eYha=sF{uF zu{i(E$1$~Cc(xSh=u9Px)b<}2Q%>qD^f>&AtH40FZn-OSU{9Ra{vAr8lR&Fe1!`~m z7W|dLUeH5bUUG^9lMmVZGPq$18}Xk{MGPCtr)LLBkIJ$FQMQo+;ir5foO-o`YLj@E zhn$&+chO$2Ja#_;TQ;6eiuE2C&t~(7B$X|~m7)jhPm6i%);Aw3Mn&w-PrSvsq_=&u4tj!o&l+Vm^ao#t&GelyacSc>Wv|z!jPB+sYOg6Vt(v z*f#)LLY$ux*ZlQ;5wMeIg@j+H6gwMR1;MOBc)f+%!Tfa7=q2fj_TA0Z1`p@pdPGOp zQr9!wKzR5W{LE2r{s>q47Wb6?ZT!72YxvZ8L~l(*m)#vP4^PO{$z6x2%uh(d?cMA2 zoKL{gtVcmfojZaP;wN`)3i!k|^EsfI*2W=usygF}li;P&WmrCfO>VHo`I!LNv)OlJ zi{6d~Iu3i!NP2~ATLT5ujSjlVn4f4bwtx$I|Cm{9#CZ#m!BnsYJ_?JK(Ff}(o8p)7 zgIjf)83P^9#!DAsoLtZ?QO|r;8ys($kyg>(Dnlm?I{-BrF$8$7LY9q3oa27G4=|hLH;qO?3l5?Q5r@$PA1WqWzWfsouY@Uv^ zt9t_kU>%jnd)kk9I6rR49~!Va$uqerxUWx^%4t|A_60B4 z&A)bYxOHJO&Y2nwTs!aYt1&8I5G0yBDD3t$sWCfe(<2>1$cCD76A8P|*0A>nZQR;n zJ2pP|MqYHO4b7*~A?KY3QApfuV^-C>RsiCS>y8>ij>xz#NkLqZcq!no`iRtTdDa4~ zmLu%uJ%QcA-{aiX$u8~9YUCM$EEosN#lh1!$?i^r0u9aMJ>LIdw+t-V{Z~7>rFQN% zn6?cjKfmAP5!LWyW{p#LO5C)B4!|%|q*z_fc*!LBlox{_!s-Ie#;Yh%w@ES9){5=) z|NCUdK*W*pN%Oebbp_Zmo{ zE5BRLx+$Hs>vT`O=<${}PoO}=Y?ZAy0iGV0hn^vCfo%Y=a0zjm(`+P*5qYYkO~0;d!+ERR@}FHCb9;kUAh=QcpbY+J3eY3<|jX zjoD0B9taSeGwHzY6%|;gL>B~RmkC0{kuO<;BipXnHj{J1Juh|-$xB*N3YQI(R}N&N zErvq~WAssYmH<_^y^HuLQugEQ`@6;UBd7y-pf$zKzuAxV|4@7Y69zJ&vJ@Hh0_+*W z5lj!F{k7YYEk92JgkT}1xDKO}=jqxht}pKe7dCn6gXgY`qDoNdVUfnygP@0VP0c2t zIT^c6bwOutf462<+>MOSx$8b$aTe3KpiSmT|K|Ox`3!5LTt3T(LamDj%vgFfT^+Bw zu*1)hcS(P~fV!wS ztZ*lMPnxhb0|Jc|J(0;6;VrMJZR*$Sd{MO)G&03%;tm2}F`TFyf5+JQ=Z*B(3*>dC z31l4O^+_`JPQ1VT8<5wwez@n^xe=gtXaP$;l1=%`D^WmVY?aQmfkR(@f>qc%t2Kr` zubUyF3W&1c(h-n#K#5O4ny@%rf)oqpz(J8pQU0(S`UiB&asPV#e{kyZik7~gxYEHT z<7vKqqnIG5DrXSu;G%b`a9R?c%j`O#W50W*~KU5!~_M-mo#3+#g5WFKK}BKcr9Ca1^YA;Z&n78Hs{AGXixlF5DY>!!G>Kq>zqxCp^Zg0XnemA}=57ufXf3 z$nNoXg-+^uI8YAbzU6mpR^-+67XBoitMpq4O7gID)~wmW@1Km|5q$5qY1L9GGI=yK zA{&(drM%rZ!$Cz6(u|*1R%G6zqwXH|(p8){?yK^cBlohS=^v$gb7ZtnA5!zz&d@K< z^UlQxz7I*C-n#}t2%HqU^2zaQ9yATR+xMg20ek{uj#?ILL7ahW!;WqXy4T`ICzYR65HaEoA8HKAE9EvPOSxQ zGhLk!QY^a6^3P8z%?!oEohkoz;Qs#&j5%W>7g%SPORCi&`+ccD(ordUX!YWM02X*e AT>t<8 literal 0 HcmV?d00001 From 6575f0c314483ed1e103fcfc8c3f6b6c029de18a Mon Sep 17 00:00:00 2001 From: Jonathan Schnitzler Date: Fri, 9 Feb 2024 10:35:22 +0100 Subject: [PATCH 67/67] Update README --- .gitignore | 2 +- README.md | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index da574f67..5e863244 100644 --- a/.gitignore +++ b/.gitignore @@ -41,5 +41,5 @@ build/ resources/ sol/ -input/bitmap/others +input/bitmap/others .vscode/ diff --git a/README.md b/README.md index 506b5cf1..037ee75b 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,10 @@ In the following you can specify wheter you want to load your domain from a bitm * `useFluidTracer`: Set to true if you want to simulate free surfaces * `particlePerCell`: Number of fluid particles per cell as integer +* `useParticleSource`: Enables the creation of particle at a specified location +* `particleSourceX`, `particleSourceY`: specifies the location + +Since it yielded the best results, the settings `fluidTracerMethod` is always *fixed* with `fluidTracerThreshold` of 1 as introduced in the lecture. This means that one virtual particle is enough for a cell to be declared fluid instead of e.g. $k$ or a *calculated* which aims at a constant number of fluid cells. ## Creating a domain using a bitmap @@ -136,6 +140,8 @@ A scenario which was also simulated with *OpenFOAM*. Our solver has yet to impro +The simulation doesn't complete, since there are some mistakes in creating particles in the air, which violates the velocity condition. + ## Contributors

      AGj$TW)7G2v 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, j) = 0; discretization_->u(i, j) = 0; discretization_->v(i, j) = 0; - discretization_->f(i, j) = 0; - discretization_->g(i, j) = 0; - discretization_->rhs(i, j) = 0; } } } diff --git a/src/boundary/mask.cpp b/src/boundary/mask.cpp index d08ce4f5..6bb4285d 100644 --- a/src/boundary/mask.cpp +++ b/src/boundary/mask.cpp @@ -88,7 +88,6 @@ int Mask::getNumberOfFluidCells() const { } - void Mask::makeRectangularObstacle() { @@ -300,7 +299,6 @@ void Mask::setObstacleBC() } - void Mask::printMask() const{ for (int j = size_[1] - 1; j >= 0; j--){ for (int i = 0; i < size_[0]; i++){ diff --git a/src/boundary/mask.h b/src/boundary/mask.h index f93f1d28..dc6d2ec4 100644 --- a/src/boundary/mask.h +++ b/src/boundary/mask.h @@ -101,8 +101,6 @@ class Mask */ void resetMask(); - // ******************************************************** - // R E Q U E S T S /** * @brief Cell at (i,j) is fluid or not diff --git a/src/computation.cpp b/src/computation.cpp index 38c05603..fcf45f32 100644 --- a/src/computation.cpp +++ b/src/computation.cpp @@ -71,20 +71,15 @@ void Computation::initialize(int argc, char *argv[]) void Computation::runSimulation() { - // setting - double printInterval = 0.05; - // initialize double currentTime = 0.; - double printTime = 0.; + double nextPrintTime = 0.; int stepsBetweenPrints = 0; boundary_->setVelocityBoundaryValues(); boundary_->setPressureSurfaceBC(); do { - // fluidTracer_->createParticles(0.1, 1.4); - // mask_->printMask(); // usleep(100000000); // std::cout << "\033[2J\033[1;1H"; @@ -94,28 +89,29 @@ void Computation::runSimulation() computeRightHandSide(); computePressure(); computeVelocities(); + currentTime += dt_; if (settings_.useFluidTracer) { - // if (settings_.useParticleSource) { - // fluidTracer_->createParticles(settings_.particleSource[0], settings_.particleSource[1]); - // } boundary_->setVelocityBoundaryValues(dt_); - currentTime += dt_; + // Fulfill CFL condition for particles computeTimeStepWidth(currentTime); fluidTracer_->moveParticles(dt_); + boundary_->updateBoundary(); } - boundary_->updateBoundary(); + boundary_->setVelocityBoundaryValues(); boundary_->setPressureSurfaceBC(); + if (currentTime > nextPrintTime) { + if (settings_.useParticleSource) { + fluidTracer_->createParticles(settings_.particleSource[0], settings_.particleSource[1]); + } - // currentTime += dt_; - if (currentTime > printTime) { outputWriterParaview_->writeFile(currentTime); - printTime += printInterval; - std::cout << currentTime << " -> write file, took steps: " << stepsBetweenPrints << std::endl; + nextPrintTime += settings_.printInterval; + std::cout << currentTime << " -> Write VTK, took: " << stepsBetweenPrints << " steps" << std::endl; stepsBetweenPrints = 0; } @@ -125,7 +121,6 @@ void Computation::runSimulation() outputWriterText_->writeFile(currentTime); outputWriterText_->writePressureFile(); std::cout << currentTime << std::endl; - // usleep(100000000); #endif } while (currentTime < settings_.endTime); diff --git a/src/settings_parser/settings.cpp b/src/settings_parser/settings.cpp index b7a3c7fa..ebd4aecb 100644 --- a/src/settings_parser/settings.cpp +++ b/src/settings_parser/settings.cpp @@ -248,8 +248,25 @@ void Settings::setParameter(std::string parameterName, std::string value) else if(parameterName == "particlePerCell") particlePerCell = atof(value.c_str()); else if(parameterName == "fluidTracerMethod") - if (value == "single" || value == "threshold") + if (value == "fixed" || value == "calculated") Settings::fluidTracerMethod = value; else throw std::invalid_argument("Supported values for fluidTracerMethod are single and threshold"); + else if(parameterName == "fluidTracerThreshold") + fluidTracerThreshold = atof(value.c_str()); + else if(parameterName == "useParticleSource") + { + if (value == "true" || value == "True") + Settings::useParticleSource = true; + else if (value == "false" || value == "False") + Settings::useParticleSource = false; + else + throw std::invalid_argument("useParticleSource must be a boolean (true or false)."); + } + else if(parameterName == "particleSourceX") + particleSource[0] = atof(value.c_str()); + else if(parameterName == "particleSourceY") + particleSource[1] = atof(value.c_str()); + else if(parameterName == "printInterval") + printInterval = atof(value.c_str()); } diff --git a/src/settings_parser/settings.h b/src/settings_parser/settings.h index 01b982f0..bf1504f7 100644 --- a/src/settings_parser/settings.h +++ b/src/settings_parser/settings.h @@ -59,15 +59,18 @@ struct Settings // Fluid Tracer - bool useFluidTracer = true; //!< Enables Open Surface Evolution + bool useFluidTracer = false; //!< Enables Open Surface Evolution int particlePerCell = 100; //!< Initializes with given virtual particles per cell /** - * `single` -> one virtual particles is enough for fluid cell - * `threshold` -> aims at a constant amount of fluid cells + * `fixed` -> `n` virtual particles is enough for fluid cell, standard is 1 + * `calculated` -> aims at a constant amount of fluid cells and calculates the threshold accordingly */ - std::string fluidTracerMethod = "single"; - // bool useParticleSource = false; //!< Enables virtual particles source - // std::array particleSource = {0.5, 0.5}; //!< Source of virtual particles + std::string fluidTracerMethod = "fixed"; + int fluidTracerThreshold = 1; //!< Threshold for fluidTracerMethod `fixed` + bool useParticleSource = false; //!< Enables virtual particles source + std::array particleSource = {0.0, 0.0}; //!< Source of virtual particles + + double printInterval = 0.05; //!< generates output VTK every `printInterval` seconds diff --git a/src/surface/fluid_tracer.cpp b/src/surface/fluid_tracer.cpp index 9118645e..7b7a55d0 100644 --- a/src/surface/fluid_tracer.cpp +++ b/src/surface/fluid_tracer.cpp @@ -99,13 +99,12 @@ int FluidTracer::getThresholdParticlesFluidCell() { std::sort(copy.begin(), copy.end(), std::greater()); if (numFluidCells_ > copy.size()){ - std::cout << " WARNING, NO FLUID CELLS" << std::endl; - std::cout << numFluidCells_ << " " << std::endl; + std::cout << "PARTICLE COUNT CURROPTED" << std::endl; return 1; } int threshold = copy[numFluidCells_ - 1]; if (threshold < 1){ - std::cout << " WARNING, THRESHOLD LOW" << std::endl; + std::cout << " WARNING, THRESHOLD 0" << std::endl; return 1; } return threshold; @@ -124,26 +123,25 @@ void FluidTracer::moveParticles(double dt) { for (int i = 0; i < numParticles_; i++) { std::array vel = {discretization_->u().interpolateAt(x_[i], y_[i]), discretization_->v().interpolateAt(x_[i], y_[i])}; + std::array idx = cellOfParticle(i); - - // std::array newIdx = updateParticle(i, idx, dt, vel); - x_[i] += vel[0] * dt; - y_[i] += vel[1] * dt; - std::array newIdx = cellOfParticle(i); + std::array newIdx = updateParticle(i, idx, dt, vel); + // x_[i] += vel[0] * dt; + // y_[i] += vel[1] * dt; + // std::array newIdx = cellOfParticle(i); if (mask_->isObstacle(newIdx[0], newIdx[1])){ - std::cout<< "CFL Violated" << std::endl; - // remove from domain + // SAFETY FEATURE -> if bug x_.erase(x_.begin() + i); y_.erase(y_.begin() + i); - } else { currentParticlesPerCell_[newIdx[0] + newIdx[1] * mask_->size()[0]] += 1; (*mask_)(newIdx[0], newIdx[1]) = Mask::FLUID; } } - int threshold = 0; //getThresholdParticlesFluidCell(); + int threshold = 0; + //getThresholdParticlesFluidCell(); for (int i = 0; i < mask_->size()[0]; i++){ for (int j = 0; j < mask_->size()[1]; j++){ @@ -152,19 +150,20 @@ void FluidTracer::moveParticles(double dt) { } } } - // std::cout<< "Threshold: " << threshold << std::endl; - - resetVelocityInAirCells(); // Update BC in mask mask_->setFluidBC(); + checkForNewCreatedFluidCells(oldParticlesPerCell); +} + +void FluidTracer::checkForNewCreatedFluidCells(std::vector oldParticlesPerCell){ + // Debug against Rocket Phenomen, that a drop with small velocity in tangential direction builds up momentum for (int i = 0; i < mask_->size()[0]; i++){ for (int j = 0; j < mask_->size()[1]; j++){ if (currentParticlesPerCell_[i + j * mask_->size()[0]] > 0 && oldParticlesPerCell[i + j * mask_->size()[0]] == 0){ - // std::cout << std::setw(2) << std::setfill('0') << i << " " << std::setw(2) << std::setfill('0') << j << " " << " New Fluid" << std::endl; switch ((*mask_)(i, j)){ case Mask::FLUID_SINGLE_RIGHT: discretization_->u(i, j) = discretization_->u(i + 1, j); @@ -182,33 +181,8 @@ void FluidTracer::moveParticles(double dt) { } } } - - -} - -// TODO: remove -void FluidTracer::resetVelocityInAirCells(){ - for (int i = 1; i < mask_->size()[0]-1; i++){ - for (int j = 1; j < mask_->size()[1]-1; j++){ - if (!mask_->isFluid(i- 1, j - 1) - && !mask_->isFluid(i, j - 1) - && !mask_->isFluid(i + 1, j - 1) - && !mask_->isFluid(i - 1, j) - && !mask_->isFluid(i, j) - && !mask_->isFluid(i + 1, j) - && !mask_->isFluid(i - 1, j + 1) - && !mask_->isFluid(i, j + 1) - && !mask_->isFluid(i + 1, j + 1) - ){ - discretization_->u(i, j) = 0; - discretization_->v(i, j) = 0; - } - } - } - } - std::array FluidTracer::updateParticle(int i, std::array idx, double dt, std::array vel) { double newPos_x = x_[i] + dt * vel[0]; @@ -356,7 +330,7 @@ std::array FluidTracer::updateParticle(int i, std::array idx, do if (dt < dtBeforeCollision) { x_[i] += dt * vel[0]; y_[i] += dt * vel[1]; - return newIdx; + return idx; } x_[i] += dtBeforeCollision * vel[0]; diff --git a/src/surface/fluid_tracer.h b/src/surface/fluid_tracer.h index fc82c305..0f1bb0bc 100644 --- a/src/surface/fluid_tracer.h +++ b/src/surface/fluid_tracer.h @@ -64,16 +64,30 @@ class FluidTracer { */ std::array getParticlePosition(int i) const; + /** + * @brief returns the 2D idx of particle `i` + * + * @param i + * @return std::array + */ std::array cellOfParticle(int i); + + /** + * @brief translates from x-coordinate to cell index in x-direction + */ int val2CellX(double xVal); + /** + * @brief translate from y-coordinate to cell index in y-direction + */ int val2CellY(double yVal); - // Only test + /** + * Methods for debugging and test purposes + */ std::array updateParticle(int i, std::array idx, double dt, std::array vel, int depth); std::array moveParticles(double dt, std::array vel); - void printParticles(); @@ -85,13 +99,29 @@ class FluidTracer { void initializeFluidCell(int i, int j, int idx); - // Helper for move Particles - int getThresholdParticlesFluidCell(); + /** + * @brief updates the position of particle `i` according to the velocity field and possible collisions (recursive function) + * + * @param i particle to move + * @param idx 2D idx of the cell in which particle `i` currently is + * @param dt time step (particle will travel with *remainder* of dt if it collides with border or obstacle in opposite direction) + * @param vel velocity derived from flow field + * @return std::array new 2D idx of the cell in which particle `i` is after update + */ std::array updateParticle(int i, std::array idx, double dt, std::array vel); - void resetVelocityInAirCells(); + + /** + * @brief Updates velocities if a new cell is created to avoid **rocket** effect for droplets + * + * @param oldParticlesPerCell + */ + void checkForNewCreatedFluidCells(std::vector oldParticlesPerCell); + + // Under construction: for making fluid update step more stable, by majority vote of particles in cell + int getThresholdParticlesFluidCell(); - int numParticles_; + int numParticles_; // // aspect ratio e.g. 1.0 for square cells and 0.5 for (dx = 2*dy) cells @@ -105,6 +135,6 @@ class FluidTracer { std::shared_ptr mask_; std::vector x_; std::vector y_; - std::vector currentParticlesPerCell_; + std::vector currentParticlesPerCell_; // Date: Thu, 8 Feb 2024 23:45:07 +0100 Subject: [PATCH 66/67] Nur noch einmal schlafen ... --- .gitignore | 1 + README.md | 14 ++++-- build.sh | 56 +++--------------------- input/bitmap/faucetModified.png | Bin 428 -> 0 bytes input/bitmap/maze.png | Bin 2182 -> 0 bytes input/bitmap/maze2.png | Bin 1464 -> 0 bytes input/bitmap/maze3.png | Bin 486 -> 0 bytes input/bitmap/waterTab.png | Bin 304 -> 0 bytes input/bitmap/wineTab.png | Bin 391 -> 0 bytes input/settings_debug_joni.txt | 73 -------------------------------- media/aero_vector.png | Bin 0 -> 1023418 bytes media/damBreak1.png | Bin 0 -> 11649 bytes media/damBreak2.png | Bin 0 -> 12707 bytes media/damBreak3.png | Bin 0 -> 13799 bytes media/drop.png | Bin 0 -> 414448 bytes 15 files changed, 17 insertions(+), 127 deletions(-) delete mode 100644 input/bitmap/faucetModified.png delete mode 100644 input/bitmap/maze.png delete mode 100644 input/bitmap/maze2.png delete mode 100644 input/bitmap/maze3.png delete mode 100644 input/bitmap/waterTab.png delete mode 100644 input/bitmap/wineTab.png delete mode 100644 input/settings_debug_joni.txt create mode 100644 media/aero_vector.png create mode 100644 media/damBreak1.png create mode 100644 media/damBreak2.png create mode 100644 media/damBreak3.png create mode 100644 media/drop.png diff --git a/.gitignore b/.gitignore index 06ef1855..da574f67 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,5 @@ build/ resources/ sol/ +input/bitmap/others .vscode/ diff --git a/README.md b/README.md index 91bc50d1..506b5cf1 100644 --- a/README.md +++ b/README.md @@ -69,8 +69,7 @@ In the following you can specify wheter you want to load your domain from a bitm ### Open surfaces * `useFluidTracer`: Set to true if you want to simulate free surfaces -* `particlesPerCell`: Number of fluid particles per cell as integer - +* `particlePerCell`: Number of fluid particles per cell as integer ## Creating a domain using a bitmap @@ -120,13 +119,22 @@ Again the settings are provided [here](input/settings_cavity_with_a_step.txt) ### Aerodynamic With pressure Boundary Condition and a bitmap an aerodynamic shape can be simulated. The settings can be found [here](input/settings_aerodynamic_obstacle.txt). - +![Aero with Glyphs](media/aero_vector.png) ### Water drop +A water drop falls with gravity in shallow fluid, where generated waves propagate. + +![drop](media/drop.png) + ### Dam break +A scenario which was also simulated with *OpenFOAM*. Our solver has yet to improve to achieve the same accuarcy. + + + + ## Contributors diff --git a/build.sh b/build.sh index fd645e09..eecc3395 100755 --- a/build.sh +++ b/build.sh @@ -18,70 +18,24 @@ fi make install -j4 -# ./numsim ../input/settings.txt -./numsim ../input/settings_aerodynamic_obstacle.txt +./numsim ../input/settings.txt +# ./numsim ../input/settings_aerodynamic_obstacle.txt # ./numsim ../input/settings_damBreak.txt # ./numsim ../input/settings_drop.txt # ./numsim ../input/settings_quadruple_cavity.txt # ./numsim ../input/settings_lid_driven_cavity_with_a_step.txt -# ./numsim ../input/settings_debug_joni.txt # maze # ./numsim ../input/settings_water_tap.txt -###################### -## DEBUG -> DELETE ## -###################### -dir="/home/jonat/Documents/02_Workspace/05_NumSim_misc/Project/Simulations/data" -# rm -rf $dir/damBreak/slow -# mkdir $dir/damBreak/slow -# cp -r out $dir/damBreak/slow - - -# ./numsim ../input/settings_drop.txt -# newdir="dropTheCometHard" -# rm -rf $dir/$newdir -# mkdir $dir/$newdir -# cp -r out $dir/$newdir/ - - - -# ./numsim ../input/bitmap/doubleDam/doubleDam.txt -# rm -rf "$dir"/doubleDam/* -# cp -r out "$dir"/doubleDam/ - -# ./numsim ../input/bitmap/doubleDam/doubleDamLeft.txt -# rm -rf "$dir"/doubleDamLeft/* -# cp -r out "$dir"/doubleDamLeft/ - -# ./numsim ../input/bitmap/doubleDam/doubleDamRight.txt -# rm -rf "$dir"/doubleDamRight/* -# cp -r out "$dir"/doubleDamRight/ - -# ./numsim ../input/bitmap/doubleDam/doubleDamTop.txt -# rm -rf "$dir"/doubleDamTop/* -# cp -r out "$dir"/doubleDamTop/out - - -# ./numsim ../input/settings_debug_joni.txt - - -######################## cd .. -# directly open output in paraview +# Documentation -# paraview out/output_* - -# for writing documentation - -# cd .. # mkdir documentation # cd documentation # doxygen ../Doxyfile # cd .. -# run tests -#build/tests/run_tests - -# zip -r submission.zip src/ CMakeLists.txt \ No newline at end of file +# Tests +build/tests/run_tests \ No newline at end of file diff --git a/input/bitmap/faucetModified.png b/input/bitmap/faucetModified.png deleted file mode 100644 index 7301569966b0f33c29671d9a0e2d1d8207371c7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 428 zcmV;d0aN~oP)^sqO)C%c5GA4gvh8Pi{O?%1r}YTEINmds%Eng{J^6D9XD{EGxaM za0~F#*D7>3V5`ssZnbjU-Rdt)L3ae%^sPW%{du&T{V-k3f zvp%<>!hnd=(wiVMhXIaK4Z$2%g)7~dIm{de*r;|0?Pn93`y@YdM;-BKCbDfi8u$fC W8J%27#3;Q00000<@VdE^-vJ>#uXxsPGwrMy!ahj}z(hM1aAl$7^K(kYr0F-DnjhR5}C zj7Z@|jF*E%ONT;6DYwYW?UdIfB`>!Kot)?Xb?;s4u65VCf9(C+d#}BJ-?e|A?_O(* z_H)@PO4>>Q0I0ZdmoYHawGZo)zxZ8A-9cp zPrXr(vqZVEwhx4b%L%QDMCc)(0id}A=p$uBwYF1IZUDk1E`O_UVgu-6Bk!dU5LlD* zY?mNJuCuc|4`yHnXz!#>;_6IH=1O_jfUVB@q2ih6w~V(E!q6Abo2Od8A@ihkBtGKE ztS{>@81}=X_@_TpCU}2UZ;`FNT8_W`-F|dfIng*UnvF>teR{J2!8!Nqzn0rM7lNY%Lb+tEvTBEkLaKHgZ5_ICt`Br3#s7VaAYaY8{9S1yg)@E%Zifs> zk>G)d&ET>cw8zx8fY@n7gGi?4ypA-?6`LmVTcWhCy~bkTcG!v(33&vWfEUOD-3?N= zjKC~)Az_15M(yO#IF!lyj1)kiuasK+NS%T4Cw(m_1kgo8i!IrffXsI{1yG65UktaW zY3~EjG3nV3CJ5{Eytmj~2L$a_@5CYq;S|;E3b!YKqR?lW>J$dX^gq+bCqimH`6dR` z1Vr?3tZW`Xbba?BHzt6pC3o<~@xs`jt;+ph!b`7a7U%5EE(f<~nqIu9952beR-?k(;>vOgjch%wo8<0_y&Ks095ou%ed(mA+_!D z>9=rrcJ53p_{-Z1%aKsgn|gI$VQ~wh#lJ z_<|1PWTdHfqFx1>Q+TC3%bP6sRIbPi$gl0v$@@Z?DUpn+*R99|iwXDRfNrljl-dAQdXoBfg z6pR8zH!ks2n7cs!{xn2!Zu{P1{l=AnTRGj-MJEh;e5@)FdeFMw>?(2<7|zxcs1J^u zqD;X2EU4gE)_OfVV>ae;DaD*zK4^)XTZ1BY|LRXarGN_Cy21|l`C$-+?^t$n?{3sS znIXJKZT|h#M6vg@mOx|Ai__&Q^vF0x6l`-bzUTEP6uvq2d0o917Xw0ki|_{!reRxI zg>#4w@wCQ0EO~hAWi-y=*-v6;oC9yL{vH=V`=z|+xP`5it{oh}IoMelYvcBJ_V1mx zBY-}k&MZBggJHzsqd5Ez-DM}3Bj3Lbn>8;!xqEE0J5U*~KUa+Cg+SKS_IF-T1bN~1 zg^Ami+Mnn3kDJON6QTr~Z&FJ7|!lrUJa4^5j`Wh;gu7KSZEgKb&rRVrI?iH zEc|*Yhv9-cKV>VmzYfj1viNR?f>fmMN(J*=#_!ocwOw!aBEli%_S?#6bL*SJ;W3}J ztN11CP2l#-Pgm~`zfOcFiWqNvwb1&75$gaDW^RYmidn$_ImIG7rOVt`*~6v`cwDqa zAwGEUQDt7l&ap4e^6YN7U4L?I=ca$HCL;#9(YBiu(vaD@*x=GuF+C;oh}fTgC%mDO zY6V)PE)7UD+G4_AMjT;u-lc|=iLB#Au^lxp=Z!4KRmZGt{$2BDw#*|7 z`q9;#cRyfo`m2WYjN+L*?T(s)!#1xDW^5AVc0AGRH*y7c({juFEFz*WiMtzC2rEqredtd*ijq|FOnr~N% zcwdbjbqDBmx8)BN(TIib4Ntm(bD2RoT`lIzra8S)#u0S7veF*-!O5J?fjYyQQM@o) z>qs}vK`shx_7@3^y$3iMxSAK?!|ZsZ}ih+y_`(n{f3HTxONials!7 CJ*&w8 diff --git a/input/bitmap/maze2.png b/input/bitmap/maze2.png deleted file mode 100644 index 2424337cd967256d5ed800cf70c5e29fa57ba17b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1464 zcmcK4ZB$YR90qXiJ-5858JE)3F#{A&ruep5)+q;wl4&oRp>ZaXFG*?|Em>;W#mrI= ztuqv7DRV{JO4O72Rw`-DnhIDh&F0IgEELU`$;z5Cw=es)vk%*c=l^{9|GqwXdv~)| zncJIVFql!Z*;Q8)<8^D8I->RpDbKBg7b|T|Jp3#Uc0j9~f%y(4hk*a3q=I7^M1^-kv?H0X|WGmjLMQuon1{18OE_7V09;O~NAfA@- zg9W)O=GhJ|ZeYf^p(@&4VJ4!uf*JfomCQyb?#{?E4i_4K#Ws$th<4wcpnXRl_?<8W zW&{UDdem|Z*DUn+)AMUW`s-hgLCLNkv>S7b_{W^K7LImMD?82 zP97Bsp18^r)ETA0X%aL{(C4}mFvPq6>;>+;A6jh--6&}a?}Rs4vsz+sHQZNWA3G|- z3C4W-e+rnL)fGyATAr_l+W!8M7g%1l_(z2ald^jAAIE%^y${7`LzYtgKwugJUdmVba+$WCReE_Q!ND$ocY)sqw=hu&As zd8o%pPc3t;`Zmq8Q z?o>wZl@M)l+7De_a<+YKe*>=O>e&8^ zWPY&yRFV|YC8ifE;KLVApKOt!HcBoX(UHYyYz|jAvSuyNIpYmvZ6R=m0%X++QF%X9sdqD!Q6YFGP8$7TVU0!vVKVLw7229cHsu>~rSr%TtUA3fRq5F?iX304CUi_W%F@ diff --git a/input/bitmap/maze3.png b/input/bitmap/maze3.png deleted file mode 100644 index 5fd682edfcb328a285f99c219fcf9a7698543767..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 486 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8O8AyIx*uM`*v7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaf@tPl)UP|Nr&PW&(L> zO@FrmDaIskcNc~ZR#^`qhrPtp*OmPR6Nj*_u(7k>4WQ61PZ!6Kh{JEMIr1G+5NJ(I zIk|88jNl4Ry@#4rBGc0RGP~DaTvAx)({=SsbbW0m2T#j`j}4%2bnGU53U?pBgmt#RW;vqW0D@{yxu>d2WF%{cd440bMS1wA&*fVUvS}z z5Bd*yn^SZ|r@wjP3iPFFiEBhjN@7W>RdP`(kYX@0Ff!3KFw!-!2r)FbGB&a@w$L^( pure^1KC$E$iiX_$l+3hBEE?m^8{f_5zrTmMzpVc&PJZBMWEsiZvFsPIH`=E+kl1(}Lcj2P}RU1|tB ze1~n5)G>wh>Wr&GhmYsKKUV!dv7aTgATmKu((uF?XRfsN`^t;|dv4y67WddV|Ho-J zw__purCqL?%uQC_q8WP5EyVY-rJ2+0pr<)x2)<)2=6jc|x^Axq(ANx}u6{1-oD!M< Dt=xNq diff --git a/input/bitmap/wineTab.png b/input/bitmap/wineTab.png deleted file mode 100644 index 2b8aa85e791bcc8bee52ac34e4cb61242a777e23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 391 zcmV;20eJq2P)Px$K}keGRA@u(no$nKAP7YD{)cwsCT*;X?tn_r(r+q02DDgXN-2c{o>+s#7`s?j zxz7bD<+#+bs={Ngy&BmHB!qAmdmZ^BK+7s`F3;1<7{SV8kHS zV1_^}!3={~foZNI+gtIyjONwT;x*J3&_W=Vg1q zZPr+dXn}AczFjNYA+BtuMwGZ}37_}_`HXa=#-0k&OS_rTcMv2;k-AxxR;+ylh3Q>5a1bDhUhJ(Pd1?Xa(=+kZ l`ga|Q6W|%EnOG5PARis&LVESmuxbDR002ovPDHLkV1mQ)qjLZN diff --git a/input/settings_debug_joni.txt b/input/settings_debug_joni.txt deleted file mode 100644 index 51396421..00000000 --- a/input/settings_debug_joni.txt +++ /dev/null @@ -1,73 +0,0 @@ -# Settings file for numsim program -# Run ./numsim lid_driven_cavity.txt - -# Problem description -physicalSizeX = 10.0 # physical size of the domain -physicalSizeY = 10.0 -endTime = 10.0 # duration of the simulation -re = 100 # Reynolds number -gX = 0.0 # external forces, set to (gX,gY) = (0,-9.81) to account for gravity -gY = -10.0 - - -# Boundary Conditions Type - -BCTop = NoSlip -BCRight = NoSlip -BCBottom = NoSlip -BCLeft = NoSlip - - -# NoSlip boundary conditions - -NoSlipVelTopX = 0 -NoSlipVelTopY = 0 -NoSlipVelRightX = 0 -NoSlipVelRightY = 0 -NoSlipVelBottomX = 0 -NoSlipVelBottomY = 0 -NoSlipVelLeftX = 0 -NoSlipVelLeftY = 0 - - -# Pressure BoundaryConditions - -PressureTop = 0 -PressureRight = 0.0 -PressureBottom = 0 -PressureLeft = 0.0 - -# Create Rectangular object in domain - -createRectangularObject = false - -obstaclePositionX = 0.75 -obstaclePositionY = 0.75 -obstacleDimensionX = 0.5 -obstacleDimensionY = 0.5 - -# Create domain from PNGBitmap - -createDomainfromBitmap = true -pathToBitmap = ../input/bitmap/maze3.png - -# Discretization parameters -nCellsX = 20 # number of cells in x and y direction -nCellsY = 20 - -useDonorCell = true # if donor cell discretization should be used, possible values: true false -alpha = 0.5 # factor for donor-cell scheme, 0 is equivalent to central differences -tau = 0.5 # safety factor for time step width -maximumDt = 0.0005 # maximum values for time step width - -# Solver parameters -pressureSolver = SOR # which pressure solver to use, possible values: GaussSeidel SOR CG -omega = 1.6 # overrelaxation factor, only for SOR solver -epsilon = 1e-5 # tolerance for 2-norm of residual -maximumNumberOfIterations = 1e5 # maximum number of iterations in the solver - -# Particle Tracker -useFluidTracer = true -particlePerCell = 100 -fluidTracerMethod = fixed - diff --git a/media/aero_vector.png b/media/aero_vector.png new file mode 100644 index 0000000000000000000000000000000000000000..f0871c93e8b0965f6c85e4ad0f2ca0d74d215c59 GIT binary patch literal 1023418 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ⅇgG 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 Y+5aXN#1Eo{CClb@<{?K!r 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≦-B2$ST2ReT}OQgZ#M=*f1k2N@T9+{f=sPM=3l- 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