Commit 4356a9b9 authored by Martin Bauer's avatar Martin Bauer

Extended LB code generation tests, and adapted it to new lbmpy_walberla

parent 43accd00
Pipeline #16771 passed with stages
in 408 minutes and 23 seconds
......@@ -71,9 +71,9 @@ waLBerla_compile_test( FILES SuViscoelasticityTest.cpp DEPENDS field blockforest
waLBerla_execute_test( NAME SuViscoelasticityTest COMMAND $<TARGET_FILE:SuViscoelasticityTest> ${CMAKE_CURRENT_SOURCE_DIR}/Su.prm )
# Code Generation
waLBerla_python_file_generates(codegen/SrtWithForceFieldModel.py
SrtWithForceFieldModel.cpp SrtWithForceFieldModel.h
MyNoSlip.cpp MyNoSlip.h
MyUBB.cpp MyUBB.h)
waLBerla_compile_test( FILES codegen/SrtWithForceFieldModel.py
codegen/SrtWithForceField.cpp )
waLBerla_python_file_generates(codegen/LbCodeGenerationExample.py
LbCodeGenerationExample_LatticeModel.cpp
LbCodeGenerationExample_NoSlip.cpp
LbCodeGenerationExample_UBB.cpp )
waLBerla_compile_test( FILES codegen/LbCodeGenerationExample.py
codegen/LbCodeGenerationExample.cpp)
......@@ -18,8 +18,6 @@
//
//======================================================================================================================
#include "SrtWithForceFieldModel.h"
#include "blockforest/all.h"
#include "core/all.h"
#include "domain_decomposition/all.h"
......@@ -34,18 +32,20 @@
#include "lbm/gui/Connection.h"
#include "lbm/vtk/VTKOutput.h"
#include "MyUBB.h"
#include "MyNoSlip.h"
#include "LbCodeGenerationExample_UBB.h"
#include "LbCodeGenerationExample_NoSlip.h"
#include "LbCodeGenerationExample_LatticeModel.h"
using namespace walberla;
typedef lbm::SrtWithForceFieldModel LatticeModel_T;
typedef LatticeModel_T::Stencil Stencil_T;
typedef LatticeModel_T::CommunicationStencil CommunicationStencil_T;
typedef lbm::PdfField< LatticeModel_T > PdfField_T;
typedef lbm::LbCodeGenerationExample_LatticeModel LatticeModel_T;
typedef LatticeModel_T::Stencil Stencil_T;
typedef LatticeModel_T::CommunicationStencil CommunicationStencil_T;
typedef lbm::PdfField< LatticeModel_T > PdfField_T;
typedef GhostLayerField<real_t, LatticeModel_T::Stencil::D > ForceField_T;
typedef GhostLayerField< real_t, LatticeModel_T::Stencil::D > VectorField_T;
typedef GhostLayerField< real_t, 1 > ScalarField_T;
typedef walberla::uint8_t flag_t;
typedef FlagField< flag_t > FlagField_T;
......@@ -68,9 +68,11 @@ int main( int argc, char ** argv )
const double remainingTimeLoggerFrequency = parameters.getParameter< double >( "remainingTimeLoggerFrequency", 3.0 ); // in seconds
// create fields
BlockDataID forceFieldId = field::addToStorage<ForceField_T>(blocks, "Force", real_t(0.0) );
BlockDataID forceFieldId = field::addToStorage<VectorField_T>( blocks, "Force", real_t( 0.0 ));
BlockDataID velFieldId = field::addToStorage<VectorField_T>( blocks, "Velocity", real_t( 0.0 ));
BlockDataID omegaFieldId = field::addToStorage<ScalarField_T>( blocks, "Omega", real_t( 0.0 ));
LatticeModel_T latticeModel = LatticeModel_T( forceFieldId, omega );
LatticeModel_T latticeModel = LatticeModel_T( forceFieldId, omegaFieldId, velFieldId, omega );
BlockDataID pdfFieldId = lbm::addPdfFieldToStorage( blocks, "pdf field", latticeModel, initialVelocity, real_t(1) );
BlockDataID flagFieldId = field::addFlagFieldToStorage< FlagField_T >( blocks, "flag field" );
......@@ -80,8 +82,8 @@ int main( int argc, char ** argv )
auto boundariesConfig = walberlaEnv.config()->getOneBlock( "Boundaries" );
lbm::MyUBB ubb(blocks, pdfFieldId);
lbm::MyNoSlip noSlip(blocks, pdfFieldId);
lbm::LbCodeGenerationExample_UBB ubb(blocks, pdfFieldId);
lbm::LbCodeGenerationExample_NoSlip noSlip(blocks, pdfFieldId);
geometry::initBoundaryHandling<FlagField_T>(*blocks, flagFieldId, boundariesConfig);
geometry::setNonBoundaryCellsToDomain<FlagField_T>(*blocks, flagFieldId, fluidFlagUID);
......
Parameters
{
omega 1.8;
timesteps 500;
useGui 0;
remainingTimeLoggerFrequency 3; // in seconds
}
DomainSetup
{
blocks < 1, 1, 1 >;
cellsPerBlock < 30, 30, 10 >;
periodic < 0, 0, 1 >;
}
StabilityChecker
{
checkFrequency 100;
streamOutput false;
vtkOutput true;
}
Boundaries
{
/*
possible sub-blocks: documentation for the subblocks can be found in src/geometry/initializers/BoundaryFrom*.h
- CellInterval BoundaryFromCellInterval.h
- Border BoundaryFromDomainBorder.h
- VoxelFile BoundaryFromVoxelFile.h
- Body BoundaryFromBody.h
- GrayScaleImage BoundaryFromImage.h
- RGBAImage BoundaryFromImage.h
*/
Border { direction W; walldistance -1; flag NoSlip; }
Border { direction E; walldistance -1; flag NoSlip; }
Border { direction S; walldistance -1; flag NoSlip; }
Border { direction N; walldistance -1; flag UBB; }
}
VTK
{
fluid_field
{
writeFrequency 100;
ghostLayers 1;
before_functions {
PDFGhostLayerSync;
}
inclusion_filters {
DomainFilter;
}
writers {
Velocity;
Density;
}
}
flag_field
{
writeFrequency 10000000; // write only once
ghostLayers 1;
writers {
FlagField;
}
}
}
import sympy as sp
import pystencils as ps
from lbmpy.creationfunctions import create_lb_collision_rule
from lbmpy.boundaries import NoSlip, UBB
from pystencils_walberla import CodeGeneration
from lbmpy_walberla import RefinementScaling, generate_boundary, generate_lattice_model
with CodeGeneration() as ctx:
omega, omega_free = sp.symbols("omega, omega_free")
force_field, vel_field, omega_out = ps.fields("force(3), velocity(3), omega_out: [3D]", layout='fzyx')
# the collision rule of the LB method where the some advanced features
collision_rule = create_lb_collision_rule(
stencil='D3Q19', compressible=True,
method='mrt3', relaxation_rates=[omega, omega, omega_free],
entropic=True, # entropic method where second omega is chosen s.t. entropy condition
omega_output_field=omega_out, # scalar field where automatically chosen omega of entropic or Smagorinsky method is written to
force=force_field.center_vector, # read forces for each lattice cell from an external force field
# that is initialized and changed in C++ app
output={'velocity': vel_field}, # write macroscopic velocity to field in every time step
# useful for coupling multiple LB methods, e.g. hydrodynamic to advection/diffusion LBM
optimization={'cse_global': True}
)
# the refinement scaling object describes how certain parameters are scaled across grid scales
# there are two default scaling behaviors available for relaxation rates and forces:
scaling = RefinementScaling()
scaling.add_standard_relaxation_rate_scaling(omega)
scaling.add_force_scaling(force_field)
# generate lattice model and (optionally) boundary conditions
# for CPU simulations waLBerla's internal boundary handling can be used as well
generate_lattice_model(ctx, 'LbCodeGenerationExample_LatticeModel', collision_rule, refinement_scaling=scaling)
generate_boundary(ctx, 'LbCodeGenerationExample_UBB', UBB([0.05, 0, 0]), collision_rule.method)
generate_boundary(ctx, 'LbCodeGenerationExample_NoSlip', NoSlip(), collision_rule.method)
import sympy as sp
import pystencils as ps
from lbmpy.creationfunctions import create_lb_method
from lbmpy.boundaries import NoSlip, UBB
from pystencils_walberla import CodeGeneration
from lbmpy_walberla import generate_lattice_model, RefinementScaling, generate_boundary
with CodeGeneration() as ctx:
omega = sp.Symbol("omega")
force_field = ps.fields("force(3): [3D]", layout='fzyx')
# lattice Boltzmann method
lb_method = create_lb_method(stencil='D3Q19', method='srt', relaxation_rates=[omega],
force_model='guo', force=force_field.center_vector)
scaling = RefinementScaling()
scaling.add_standard_relaxation_rate_scaling(omega)
scaling.add_force_scaling(force_field)
# generate components
generate_lattice_model(ctx, 'SrtWithForceFieldModel', lb_method, refinement_scaling=scaling)
generate_boundary(ctx, 'MyUBB', UBB([0.05, 0, 0]), lb_method)
generate_boundary(ctx, 'MyNoSlip', NoSlip(), lb_method)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment