diff options
Manage dynamics, boundary condition memory in Grid2D
Mainly to further declutter simulation and refinement setup
-rw-r--r-- | apps/adrian/cylinder2d/cylinder2d.cpp | 51 | ||||
-rw-r--r-- | apps/adrian/poiseuille2d/poiseuille2d.cpp | 31 | ||||
-rw-r--r-- | src/refinement/grid2D.h | 6 | ||||
-rw-r--r-- | src/refinement/grid2D.hh | 17 |
4 files changed, 49 insertions, 56 deletions
diff --git a/apps/adrian/cylinder2d/cylinder2d.cpp b/apps/adrian/cylinder2d/cylinder2d.cpp index bf25417..0893928 100644 --- a/apps/adrian/cylinder2d/cylinder2d.cpp +++ b/apps/adrian/cylinder2d/cylinder2d.cpp @@ -108,9 +108,7 @@ void disableRefinedArea(Grid2D<T,DESCRIPTOR>& coarseGrid, sGeometry.rename(5,0,*refinedOverlap); } -void prepareLattice(Grid2D<T,DESCRIPTOR>& grid, - Dynamics<T, DESCRIPTOR>& bulkDynamics, - sOnLatticeBoundaryCondition2D<T,DESCRIPTOR>& sBoundaryCondition) +void prepareLattice(Grid2D<T,DESCRIPTOR>& grid) { OstreamManager clout(std::cout,"prepareLattice"); clout << "Prepare lattice ..." << std::endl; @@ -119,6 +117,15 @@ void prepareLattice(Grid2D<T,DESCRIPTOR>& grid, auto& sGeometry = grid.getSuperGeometry(); auto& sLattice = grid.getSuperLattice(); + Dynamics<T,DESCRIPTOR>& bulkDynamics = grid.addDynamics( + std::unique_ptr<Dynamics<T,DESCRIPTOR>>( + new BGKdynamics<T,DESCRIPTOR>( + grid.getConverter().getLatticeRelaxationFrequency(), + instances::getBulkMomenta<T,DESCRIPTOR>()))); + + sOnLatticeBoundaryCondition2D<T,DESCRIPTOR>& sBoundaryCondition = grid.getOnLatticeBoundaryCondition(); + createLocalBoundaryCondition2D<T,DESCRIPTOR>(sBoundaryCondition); + const T omega = converter.getLatticeRelaxationFrequency(); sLattice.defineDynamics(sGeometry, 0, &instances::getNoDynamics<T,DESCRIPTOR>()); @@ -212,13 +219,6 @@ int main(int argc, char* argv[]) Grid2D<T,DESCRIPTOR> coarseGrid(coarseCuboid, N, LatticeVelocity<T>(uLat), Re); prepareGeometry(coarseGrid); - BGKdynamics<T, DESCRIPTOR> coarseBulkDynamics( - coarseGrid.getConverter().getLatticeRelaxationFrequency(), - instances::getBulkMomenta<T, DESCRIPTOR>()); - - sOnLatticeBoundaryCondition2D<T, DESCRIPTOR> coarseBoundaryCondition(coarseGrid.getSuperLattice()); - createLocalBoundaryCondition2D<T, DESCRIPTOR>(coarseBoundaryCondition); - const auto coarseDeltaX = coarseGrid.getConverter().getPhysDeltaX(); const Vector<T,2> fineExtend {8*cylinderD, ly-2*coarseDeltaX}; @@ -251,22 +251,6 @@ int main(int argc, char* argv[]) disableRefinedArea(coarseGrid, fineGrid); - BGKdynamics<T, DESCRIPTOR> fineBulkDynamics( - fineGrid.getConverter().getLatticeRelaxationFrequency(), - instances::getBulkMomenta<T, DESCRIPTOR>()); - - sOnLatticeBoundaryCondition2D<T, DESCRIPTOR> fineBoundaryCondition(fineGrid.getSuperLattice()); - createLocalBoundaryCondition2D<T, DESCRIPTOR>(fineBoundaryCondition); - - BGKdynamics<T, DESCRIPTOR> fineOutflowBulkDynamics( - fineOutflowGrid.getConverter().getLatticeRelaxationFrequency(), - instances::getBulkMomenta<T, DESCRIPTOR>()); - - sOnLatticeBoundaryCondition2D<T, DESCRIPTOR> fineOutflowBoundaryCondition(fineOutflowGrid.getSuperLattice()); - createLocalBoundaryCondition2D<T, DESCRIPTOR>(fineOutflowBoundaryCondition); - - prepareLattice(coarseGrid, coarseBulkDynamics, coarseBoundaryCondition); - const Vector<T,2> fineExtend2 {4*cylinderD, 2*cylinderD}; const Vector<T,2> fineOrigin2 {1*cylinderD, 2*cylinderD-fineExtend2[1]/2}; @@ -275,17 +259,10 @@ int main(int argc, char* argv[]) disableRefinedArea(fineGrid, fineGrid2); - BGKdynamics<T, DESCRIPTOR> fineBulkDynamics2( - fineGrid2.getConverter().getLatticeRelaxationFrequency(), - instances::getBulkMomenta<T, DESCRIPTOR>()); - - sOnLatticeBoundaryCondition2D<T, DESCRIPTOR> fineBoundaryCondition2(fineGrid2.getSuperLattice()); - createLocalBoundaryCondition2D<T, DESCRIPTOR>(fineBoundaryCondition2); - - prepareLattice(fineGrid, fineBulkDynamics, fineBoundaryCondition); - prepareLattice(fineOutflowGrid, fineOutflowBulkDynamics, fineOutflowBoundaryCondition); - - prepareLattice(fineGrid2, fineBulkDynamics2, fineBoundaryCondition2); + prepareLattice(coarseGrid); + prepareLattice(fineGrid); + prepareLattice(fineOutflowGrid); + prepareLattice(fineGrid2); clout << "Starting simulation..." << endl; Timer<T> timer( diff --git a/apps/adrian/poiseuille2d/poiseuille2d.cpp b/apps/adrian/poiseuille2d/poiseuille2d.cpp index 034fb08..4091905 100644 --- a/apps/adrian/poiseuille2d/poiseuille2d.cpp +++ b/apps/adrian/poiseuille2d/poiseuille2d.cpp @@ -90,9 +90,7 @@ void prepareGeometry(Grid2D<T,DESCRIPTOR>& grid) clout << "Prepare Geometry ... OK" << std::endl; } -void prepareLattice(Grid2D<T,DESCRIPTOR>& grid, - Dynamics<T,DESCRIPTOR>& bulkDynamics, - sOnLatticeBoundaryCondition2D<T,DESCRIPTOR>& sBoundaryCondition) +void prepareLattice(Grid2D<T,DESCRIPTOR>& grid) { OstreamManager clout(std::cout,"prepareLattice"); clout << "Prepare lattice ..." << std::endl; @@ -101,6 +99,15 @@ void prepareLattice(Grid2D<T,DESCRIPTOR>& grid, auto& sGeometry = grid.getSuperGeometry(); auto& sLattice = grid.getSuperLattice(); + Dynamics<T,DESCRIPTOR>& bulkDynamics = grid.addDynamics( + std::unique_ptr<Dynamics<T,DESCRIPTOR>>( + new BGKdynamics<T,DESCRIPTOR>( + grid.getConverter().getLatticeRelaxationFrequency(), + instances::getBulkMomenta<T,DESCRIPTOR>()))); + + sOnLatticeBoundaryCondition2D<T,DESCRIPTOR>& sBoundaryCondition = grid.getOnLatticeBoundaryCondition(); + createInterpBoundaryCondition2D<T,DESCRIPTOR>(sBoundaryCondition); + const T omega = converter.getLatticeRelaxationFrequency(); sLattice.defineDynamics(sGeometry, 0, &instances::getNoDynamics<T,DESCRIPTOR>()); @@ -237,23 +244,9 @@ int main(int argc, char* argv[]) prepareGeometry(fineGrid); - BGKdynamics<T,DESCRIPTOR> coarseBulkDynamics( - coarseGrid.getConverter().getLatticeRelaxationFrequency(), - instances::getBulkMomenta<T,DESCRIPTOR>()); - - sOnLatticeBoundaryCondition2D<T,DESCRIPTOR> coarseSBoundaryCondition(coarseGrid.getSuperLattice()); - createInterpBoundaryCondition2D<T,DESCRIPTOR>(coarseSBoundaryCondition); - - prepareLattice(coarseGrid, coarseBulkDynamics, coarseSBoundaryCondition); - - BGKdynamics<T,DESCRIPTOR> fineBulkDynamics( - fineGrid.getConverter().getLatticeRelaxationFrequency(), - instances::getBulkMomenta<T,DESCRIPTOR>()); - - sOnLatticeBoundaryCondition2D<T,DESCRIPTOR> fineSBoundaryCondition(fineGrid.getSuperLattice()); - createInterpBoundaryCondition2D<T,DESCRIPTOR>(fineSBoundaryCondition); + prepareLattice(coarseGrid); - prepareLattice(fineGrid, fineBulkDynamics, fineSBoundaryCondition); + prepareLattice(fineGrid); clout << "starting simulation..." << endl; Timer<T> timer( diff --git a/src/refinement/grid2D.h b/src/refinement/grid2D.h index f58a4ea..37e764a 100644 --- a/src/refinement/grid2D.h +++ b/src/refinement/grid2D.h @@ -77,6 +77,9 @@ protected: std::unique_ptr<SuperGeometry2D<T>> _geometry; std::unique_ptr<SuperLattice2D<T,DESCRIPTOR>> _lattice; + std::vector<std::unique_ptr<Dynamics<T,DESCRIPTOR>>> _dynamics; + std::vector<std::unique_ptr<sOnLatticeBoundaryCondition2D<T,DESCRIPTOR>>> _onLatticeBoundaryConditions; + std::vector<std::unique_ptr<RefiningGrid2D<T,DESCRIPTOR>>> _fineGrids; std::vector<std::unique_ptr<FineCoupler2D<T,DESCRIPTOR>>> _fineCouplers; @@ -92,6 +95,9 @@ public: SuperGeometry2D<T>& getSuperGeometry(); SuperLattice2D<T,DESCRIPTOR>& getSuperLattice(); + Dynamics<T,DESCRIPTOR>& addDynamics(std::unique_ptr<Dynamics<T,DESCRIPTOR>>&& dynamics); + sOnLatticeBoundaryCondition2D<T,DESCRIPTOR>& getOnLatticeBoundaryCondition(); + void collideAndStream(); FineCoupler2D<T,DESCRIPTOR>& addFineCoupling( diff --git a/src/refinement/grid2D.hh b/src/refinement/grid2D.hh index f1caf84..941bff7 100644 --- a/src/refinement/grid2D.hh +++ b/src/refinement/grid2D.hh @@ -134,6 +134,23 @@ SuperLattice2D<T,DESCRIPTOR>& Grid2D<T,DESCRIPTOR>::getSuperLattice() } template <typename T, template<typename> class DESCRIPTOR> +Dynamics<T,DESCRIPTOR>& Grid2D<T,DESCRIPTOR>::addDynamics( + std::unique_ptr<Dynamics<T,DESCRIPTOR>>&& dynamics) +{ + Dynamics<T,DESCRIPTOR>& ref = *dynamics; + _dynamics.emplace_back(std::move(dynamics)); + return ref; +} + +template <typename T, template<typename> class DESCRIPTOR> +sOnLatticeBoundaryCondition2D<T,DESCRIPTOR>& Grid2D<T,DESCRIPTOR>::getOnLatticeBoundaryCondition() +{ + _onLatticeBoundaryConditions.emplace_back( + new sOnLatticeBoundaryCondition2D<T,DESCRIPTOR>(getSuperLattice())); + return *_onLatticeBoundaryConditions.back(); +} + +template <typename T, template<typename> class DESCRIPTOR> void Grid2D<T,DESCRIPTOR>::collideAndStream() { for ( auto& fineCoupler : _fineCouplers ) { |