summaryrefslogtreecommitdiff
path: root/box.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'box.cpp')
-rw-r--r--box.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/box.cpp b/box.cpp
new file mode 100644
index 0000000..ecb3296
--- /dev/null
+++ b/box.cpp
@@ -0,0 +1,73 @@
+#include "lattice.h"
+
+#include "LLBM/collide.h"
+#include "LLBM/initialize.h"
+#include "LLBM/bounce_back.h"
+
+#include <chrono>
+#include <iostream>
+
+#include "pattern/all.h"
+
+using T = SWEEPLB_PRECISION;
+using PATTERN = pattern::SWEEPLB_PATTERN<T>;
+
+void simulate(Cuboid cuboid, std::size_t nStep) {
+ const int nThread = omp_get_max_threads();
+
+ Lattice<PATTERN> lattice(cuboid);
+
+ std::vector<simd::Pack<T>::index_t> discontinuity;
+
+ LatticeMask<T> bulk_mask(lattice.volume());
+ LatticeMask<T> wall_mask(lattice.volume());
+
+ cuboid.traverse([&](int iX, int iY, int iZ, std::size_t iCell) {
+ if (std::abs(iX - cuboid[0]/2) < cuboid[0]/16 &&
+ std::abs(iY - cuboid[1]/2) < cuboid[1]/16 &&
+ std::abs(iZ - cuboid[2]/2) < cuboid[2]/16) {
+ discontinuity.emplace_back(iCell);
+ }
+ if ( iX > 0 && iX < cuboid[0]-1
+ && iY > 0 && iY < cuboid[1]-1
+ && iZ > 0 && iZ < cuboid[2]-1) {
+ bulk_mask.set(iCell, true);
+ } else {
+ wall_mask.set(iCell, true);
+ }
+ });
+
+ bulk_mask.serialize();
+ wall_mask.serialize();
+
+ lattice.apply<InitializeO>(discontinuity, 2.0);
+
+ T tau = 0.56;
+
+ auto start = std::chrono::steady_clock::now();
+
+ for (std::size_t iStep = 0; iStep < nStep; ++iStep) {
+ lattice.apply(Operator(BgkCollideO(), bulk_mask, tau),
+ Operator(BounceBackO(), wall_mask));
+ lattice.stream();
+ }
+
+ auto duration = std::chrono::duration_cast<std::chrono::duration<double>>(
+ std::chrono::steady_clock::now() - start);
+
+ std::cout << cuboid[0]
+ << ", " << nStep
+ << ", " << nThread
+ << ", " << (nStep * lattice.volume()) / (1e6 * duration.count())
+ << std::endl;
+
+ lattice.write_momenta(bulk_mask, "result.vtk");
+}
+
+int main(int argc, char* argv[]) {
+ const std::size_t nX = atoi(argv[1]);
+ const std::size_t nY = atoi(argv[2]);
+ const std::size_t nZ = atoi(argv[3]);
+ const std::size_t steps = atoi(argv[4]);
+ simulate({ nX, nY, nZ }, steps);
+}