diff --git a/apps/showcases/LeesEdwards/CMakeLists.txt b/apps/showcases/LeesEdwards/CMakeLists.txt index ddcbf6bb392b57ee2bb2379c515bf57d10e3dbdc..66133febd836c0300f3dc3291da282d8e51ea9f8 100644 --- a/apps/showcases/LeesEdwards/CMakeLists.txt +++ b/apps/showcases/LeesEdwards/CMakeLists.txt @@ -8,6 +8,7 @@ waLBerla_generate_target_from_python(NAME LeesEdwardsGen LeesEdwards_Stream.cpp LeesEdwards_Stream.h LeesEdwards_Setter.cpp LeesEdwards_Setter.h LeesEdwards_PackInfo.cpp LeesEdwards_PackInfo.h + LeesEdwards_PackInfo_Velocity.cpp LeesEdwards_PackInfo_Velocity.h LeesEdwards_InfoHeader.h) waLBerla_add_executable(NAME LeesEdwards diff --git a/apps/showcases/LeesEdwards/LeesEdwards.cpp b/apps/showcases/LeesEdwards/LeesEdwards.cpp index 169f17c0673bd2eea651642d218a2170d6ffa941..f4e8c27e941735280fd51e955d497c7c87b88986 100644 --- a/apps/showcases/LeesEdwards/LeesEdwards.cpp +++ b/apps/showcases/LeesEdwards/LeesEdwards.cpp @@ -34,6 +34,7 @@ using namespace walberla; using PackInfo_T = lbm::LeesEdwards_PackInfo; +using PackInfoVelocity_T = pystencils::LeesEdwards_PackInfo_Velocity; using flag_t = walberla::uint8_t; using FlagField_T = FlagField< flag_t >; @@ -122,7 +123,7 @@ int main(int argc, char** argv) auto parameters = walberlaEnv.config()->getOneBlock("Parameters"); const uint_t timesteps = parameters.getParameter< uint_t >("timesteps", uint_c(10)); - const real_t offset = parameters.getParameter< real_t >("offset", real_c(10)); + // const real_t offset = parameters.getParameter< real_t >("offset", real_c(10)); const double remainingTimeLoggerFrequency = parameters.getParameter< double >("remainingTimeLoggerFrequency", 3.0); // in seconds @@ -133,23 +134,39 @@ int main(int argc, char** argv) 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); - pystencils::LeesEdwards_Setter setterSweep(densityFieldID, forceFieldID, pdfFieldID); + pystencils::LeesEdwards_Setter setterSweep(densityFieldID, forceFieldID, pdfFieldID, velFieldID); for (auto& block : *blocks) setterSweep(&block); - // create time loop - SweepTimeloop timeloop(blocks->getBlockStorage(), timesteps); - // create communication for PdfField blockforest::communication::UniformBufferedScheme< Stencil_T > communication(blocks); communication.addPackInfo(make_shared< PackInfo_T >(pdfFieldID)); + communication.addPackInfo(make_shared< PackInfoVelocity_T >(velFieldID)); pystencils::LeesEdwards_Collision CollisionSweep(densityFieldID, forceFieldID, pdfFieldID, velFieldID); pystencils::LeesEdwards_Stream StreamSweep(densityFieldID, forceFieldID, pdfFieldID, velFieldID); + auto normalTimeStep = [&]() { + communication.communicate(); + for (auto& block : *blocks) + { + StreamSweep(&block); + CollisionSweep(&block); + } + + }; + + // create time loop + SweepTimeloop timeloop(blocks->getBlockStorage(), timesteps); + + std::function< void() > timeStep; + timeStep = std::function< void() >(normalTimeStep); + timeloop.add() << BeforeFunction(timeStep) << Sweep([](IBlock*) {}, "time step"); + + // add LBM sweep and communication to time loop - timeloop.add() << Sweep(CollisionSweep, "collision"); - timeloop.add() << Sweep(StreamSweep, "stream") << AfterFunction(communication, "communication"); +// timeloop.add() << Sweep(CollisionSweep, "collision"); +// timeloop.add() << Sweep(StreamSweep, "stream") << AfterFunction(communication, "communication"); // log remaining time timeloop.addFuncAfterTimeStep(timing::RemainingTimeLogger(timeloop.getNrOfTimeSteps(), remainingTimeLoggerFrequency), diff --git a/apps/showcases/LeesEdwards/LeesEdwards.prm b/apps/showcases/LeesEdwards/LeesEdwards.prm index 4b4ccaa45ecd37bdb935a1499f94f33fff3b7ffc..660771485cabd62a00b8e11edbebf55c70a53244 100644 --- a/apps/showcases/LeesEdwards/LeesEdwards.prm +++ b/apps/showcases/LeesEdwards/LeesEdwards.prm @@ -1,8 +1,8 @@ Parameters { - timesteps 10001; - vtkWriteFrequency 500; + timesteps 101; + vtkWriteFrequency 100; remainingTimeLoggerFrequency 3; // in seconds offset 10; } @@ -10,7 +10,7 @@ Parameters DomainSetup { blocks < 1, 1, 1 >; - cellsPerBlock < 64, 64, 1 >; - periodic < 1, 1, 0 >; + cellsPerBlock < 64, 64, 64 >; + periodic < 1, 1, 1 >; } diff --git a/apps/showcases/LeesEdwards/LeesEdwards.py b/apps/showcases/LeesEdwards/LeesEdwards.py index feedeea2279a90970d146e929e3cdfe7094de1a0..f3d764c86de5be58dcbb4f7d3adc23ca909d1393 100644 --- a/apps/showcases/LeesEdwards/LeesEdwards.py +++ b/apps/showcases/LeesEdwards/LeesEdwards.py @@ -8,7 +8,7 @@ from lbmpy.advanced_streaming.utility import get_accessor, Timestep from lbmpy.creationfunctions import create_lb_update_rule from lbmpy.updatekernels import create_stream_pull_with_output_kernel from lbmpy.macroscopic_value_kernels import macroscopic_values_setter -from pystencils_walberla import CodeGeneration, generate_sweep, generate_info_header +from pystencils_walberla import CodeGeneration, generate_sweep, generate_info_header, generate_pack_info_for_field from lbmpy_walberla import RefinementScaling, generate_boundary, generate_lb_pack_info import sympy as sp @@ -17,7 +17,7 @@ import sympy as sp # For advanced streaming patterns (AA, EsoTwist) the timestep is seperated into Odd and Even steps. In each of these # steps a different streaming is executed. For more common two population methods this is not the case. # In lbmpy we indicate this with Timestep.BOTH -streaming_pattern = "push" +streaming_pattern = "pull" accessor = get_accessor(streaming_pattern, Timestep.BOTH) omega = 1.0 # relaxation rate of first component @@ -25,7 +25,7 @@ shear_velocity = 0.5 # shear velocity shear_dir = 0 # direction of shear flow shear_dir_normal = 1 # direction normal to shear plane, for interpolation -stencil = LBStencil(Stencil.D2Q9) +stencil = LBStencil(Stencil.D3Q19) q = stencil.Q dim = stencil.D @@ -42,7 +42,7 @@ u_p = sp.Piecewise((1, sp.And(type_all_numbers(counters[1] <= 0, 'int'), points_ (0, True)) * shear_velocity lb_config = LBMConfig(stencil=stencil, method=Method.SRT, relaxation_rate=omega, compressible=True, - velocity_input=velocity_field.center_vector + sp.Matrix([u_p, 0]), + velocity_input=velocity_field.center_vector + sp.Matrix([u_p, 0, 0]), density_input=density_field, force_model=ForceModel.GUO, force=force_field.center_vector, kernel_type='collide_only') lbm_opt = LBMOptimisation(symbolic_field=pdfs) @@ -56,10 +56,10 @@ for s in to_insert: collision = collision.new_with_inserted_subexpression(s) ma = [] for a, c in zip(collision.main_assignments, collision.method.stencil): - if c[shear_dir_normal] == -1: - b = (True, False) - elif c[shear_dir_normal] == 1: + if c[2] == -1: b = (False, True) + elif c[2] == 1: + b = (True, False) else: b = (False, False) a = Assignment(a.lhs, a.rhs.replace(points_down, b[0])) @@ -71,7 +71,7 @@ stream = create_stream_pull_with_output_kernel(collision.method, pdfs, pdfs_tmp, {'density': density_field, 'velocity': velocity_field}, accessor=accessor) -init = macroscopic_values_setter(collision.method, velocity=(0, 0), +init = macroscopic_values_setter(collision.method, velocity=velocity_field.center_vector, pdfs=pdfs, density=density_field.center, streaming_pattern=streaming_pattern) @@ -88,6 +88,7 @@ with CodeGeneration() as ctx: # communication generate_lb_pack_info(ctx, 'LeesEdwards_PackInfo', stencil, pdfs, streaming_pattern=streaming_pattern) + generate_pack_info_for_field(ctx, 'LeesEdwards_PackInfo_Velocity', velocity_field) # Info header containing correct template definitions for stencil and field generate_info_header(ctx, 'LeesEdwards_InfoHeader',