#include "lattice.h" #include "LLBM/collide.h" #include "LLBM/initialize.h" #include "LLBM/bounce_back.h" #include #include #include "pattern/all.h" using T = SWEEPLB_PRECISION; using PATTERN = pattern::SWEEPLB_PATTERN; void simulate(Cuboid cuboid, std::size_t nStep) { const int nThread = omp_get_max_threads(); Lattice lattice(cuboid); std::vector::index_t> discontinuity; LatticeMask bulk_mask(lattice.volume()); LatticeMask 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(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::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); }