diff --git a/apps/showcases/LeesEdwards/LeesEdwards.cpp b/apps/showcases/LeesEdwards/LeesEdwards.cpp index d93b93eff876d051708b70ecd88747514cc9acd0..77c7462a04f08a59fee99646da1a3b58b51b08ed 100644 --- a/apps/showcases/LeesEdwards/LeesEdwards.cpp +++ b/apps/showcases/LeesEdwards/LeesEdwards.cpp @@ -44,8 +44,8 @@ using FlagField_T = FlagField< flag_t >; class LeesEdwardsUpdate { public: - LeesEdwardsUpdate(const shared_ptr< StructuredBlockForest >& blocks, BlockDataID fieldID, real_t offset) - : blocks_(blocks), fieldID_(fieldID), offset_(offset) + LeesEdwardsUpdate(const shared_ptr< StructuredBlockForest >& blocks, BlockDataID fieldID, BlockDataID tmpfieldID, real_t offset) + : blocks_(blocks), fieldID_(fieldID), tmpfieldID_(tmpfieldID), offset_(offset) {} void operator()(IBlock* block) @@ -61,10 +61,12 @@ class LeesEdwardsUpdate real_t weight = fmod(offset_ + real_c(dimension_x), 1.0); auto pdf_field = block->getData< PdfField_T >(fieldID_); + auto pdf_tmp_field = block->getData< PdfField_T >(tmpfieldID_); CellInterval ci; pdf_field->getGhostRegion(stencil::N, ci, 1, true); + // shift for (auto cell = ci.begin(); cell != ci.end(); ++cell) { cell_idx_t x = cell->x(); @@ -74,8 +76,17 @@ class LeesEdwardsUpdate for (uint_t q = 0; q < Stencil_T::Q; ++q) { - pdf_field->get(*cell, q) = (1 - weight) * pdf_field->get(cell_idx_c(ind1), cell->y(), cell->z(), q) + - weight * pdf_field->get(cell_idx_c(ind2), cell->y(), cell->z(), q); + pdf_tmp_field->get(*cell, q) = (1 - weight) * pdf_field->get(cell_idx_c(ind1), cell->y(), cell->z(), q) + + weight * pdf_field->get(cell_idx_c(ind2), cell->y(), cell->z(), q); + } + } + + // swap + for (auto cell = ci.begin(); cell != ci.end(); ++cell) + { + for (uint_t q = 0; q < Stencil_T::Q; ++q) + { + pdf_field->get(*cell, q) = pdf_tmp_field->get(*cell, q); } } } @@ -86,10 +97,12 @@ class LeesEdwardsUpdate real_t weight = fmod(offset_ + real_c(dimension_x), 1.0); auto pdf_field = block->getData< PdfField_T >(fieldID_); + auto pdf_tmp_field = block->getData< PdfField_T >(tmpfieldID_); CellInterval ci; pdf_field->getGhostRegion(stencil::S, ci, 1, true); + // shift for (auto cell = ci.begin(); cell != ci.end(); ++cell) { cell_idx_t x = cell->x(); @@ -99,8 +112,17 @@ class LeesEdwardsUpdate for (uint_t q = 0; q < Stencil_T::Q; ++q) { - pdf_field->get(*cell, q) = (1 - weight) * pdf_field->get(cell_idx_c(ind1), cell->y(), cell->z(), q) + - weight * pdf_field->get(cell_idx_c(ind2), cell->y(), cell->z(), q); + pdf_tmp_field->get(*cell, q) = (1 - weight) * pdf_field->get(cell_idx_c(ind1), cell->y(), cell->z(), q) + + weight * pdf_field->get(cell_idx_c(ind2), cell->y(), cell->z(), q); + } + } + + // swap + for (auto cell = ci.begin(); cell != ci.end(); ++cell) + { + for (uint_t q = 0; q < Stencil_T::Q; ++q) + { + pdf_tmp_field->get(*cell, q) = pdf_field->get(*cell, q); } } } @@ -109,6 +131,7 @@ class LeesEdwardsUpdate private: const shared_ptr< StructuredBlockForest >& blocks_; BlockDataID fieldID_; + BlockDataID tmpfieldID_; real_t offset_; }; @@ -129,6 +152,7 @@ int main(int argc, char** argv) // create fields BlockDataID pdfFieldID = field::addToStorage< PdfField_T >(blocks, "PDFs", real_t(1.0), field::fzyx); + BlockDataID pdfTmpFieldID = field::addToStorage< PdfField_T >(blocks, "TmpPDFs", real_t(1.0), field::fzyx); BlockDataID velFieldID = field::addToStorage< VectorField_T >(blocks, "velocity", real_t(0), field::fzyx); BlockDataID forceFieldID = field::addToStorage< VectorField_T >(blocks, "force", real_t(0), field::fzyx); BlockDataID densityFieldID = field::addToStorage< ScalarField_T >(blocks, "density", real_t(1.0), field::fzyx); @@ -150,7 +174,7 @@ int main(int argc, char** argv) // add LBM sweep and communication to time loop timeloop.add() << Sweep(CollisionSweep, "collision"); timeloop.add() << BeforeFunction(communication, "communication") - << Sweep(LeesEdwardsUpdate(blocks, pdfFieldID, offset), "Lees Edwards"); + << Sweep(LeesEdwardsUpdate(blocks, pdfFieldID, pdfTmpFieldID, offset), "Lees Edwards"); timeloop.add() << Sweep(StreamSweep, "stream"); // log remaining time