24#ifndef SET_BOUNDARY_3D_H
25#define SET_BOUNDARY_3D_H
30template<
typename T,
typename DESCRIPTOR >
36 auto cell = _block.
get(iX,iY,iZ);
39 if (postProcessor && !_block.
isPadding({iX,iY,iZ})) {
44template<
typename T,
typename DESCRIPTOR >
50 auto cell = _block.
get(iX,iY,iZ);
56template<
typename T,
typename DESCRIPTOR>
71 communicator.template requestField<descriptors::POPULATION>();
74 for (
int iCloc = 0; iCloc < sLattice.
getLoadBalancer().size(); ++iCloc) {
79 for (
int iX = -_overlap; iX < nX+_overlap; ++iX) {
80 for (
int iY = -_overlap; iY < nY+_overlap; ++iY) {
81 for (
int iZ = -_overlap; iZ < nZ+_overlap; ++iZ) {
82 if (iX < 0 || iX > nX - 1 ||
83 iY < 0 || iY > nY - 1 ||
84 iZ < 0 || iZ > nZ - 1 ) {
87 for (
int iXo = -_overlap; iXo <= _overlap && !found; ++iXo) {
88 for (
int iYo = -_overlap; iYo <= _overlap && !found; ++iYo) {
89 for (
int iZo = -_overlap; iZo <= _overlap && !found; ++iZo) {
90 const int nextX = iXo + iX;
91 const int nextY = iYo + iY;
92 const int nextZ = iZo + iZ;
93 if (indicator->getBlockIndicatorF(iCloc)(nextX, nextY, nextZ)
94 && nextX >= -_overlap && nextX < nX+_overlap
95 && nextY >= -_overlap && nextY < nY+_overlap
96 && nextZ >= -_overlap && nextZ < nZ+_overlap) {
97 communicator.requestCell({iCloc, iX, iY, iZ});
110 communicator.exchangeRequests();
113namespace boundaryhelper {
117 typename T,
typename DESCRIPTOR,
118 template <
int...>
typename DYNAMICS
147 throw std::runtime_error(
"Could not set Boundary.");
153 typename T,
typename DESCRIPTOR,
154 template <
int...>
typename DYNAMICS
195 throw std::invalid_argument(
"Invalid normal");
201 typename T,
typename DESCRIPTOR,
202 template <
int...>
typename DYNAMICS
225 throw std::runtime_error(
"Could not set Boundary.");
231 typename T,
typename DESCRIPTOR,
232 template <
typename,
typename,
typename,
int,
int,
int>
typename DYNAMICS,
236 template <
int x,
int y,
int z>
240 return constructConcreteDynamicsForNormalSpecial<T,DESCRIPTOR,ConcreteDynamics>(n);
246 typename T,
typename DESCRIPTOR,
247 template <
typename,
typename,
typename,
typename>
typename DYNAMICS,
249 template <
int...>
typename MOMENTA
252 template <
int... PlaneAndNormal>
256 return constructConcreteDynamicsForNormalSpecial<T,DESCRIPTOR,ConcreteDynamics>(n);
262 typename T,
typename DESCRIPTOR,
263 template <
typename,
typename,
typename,
typename,
int,
int,
int>
typename DYNAMICS,
268 template <
int x,
int y,
int z>
272 return constructConcreteDynamicsForNormalSpecial<T,DESCRIPTOR,ConcreteDynamics>(n);
279 typename RESULT,
typename T,
typename DESCRIPTOR,
280 template <
typename,
typename,
int,
int,
int>
typename TYPE,
286 return new TYPE<T,DESCRIPTOR,1,1,1>(std::forward<
decltype(args)>(args)...);
289 return new TYPE<T,DESCRIPTOR,1,-1,1>(std::forward<decltype(args)>(args)...);
292 return new TYPE<T,DESCRIPTOR,1,1,-1>(std::forward<decltype(args)>(args)...);
295 return new TYPE<T,DESCRIPTOR,1,-1,-1>(std::forward<decltype(args)>(args)...);
298 return new TYPE<T,DESCRIPTOR,-1,1,1>(std::forward<decltype(args)>(args)...);
301 return new TYPE<T,DESCRIPTOR,-1,-1,1>(std::forward<decltype(args)>(args)...);
304 return new TYPE<T,DESCRIPTOR,-1,1,-1>(std::forward<decltype(args)>(args)...);
307 return new TYPE<T,DESCRIPTOR,-1,-1,-1>(std::forward<decltype(args)>(args)...);
315 typename RESULT,
typename T,
typename DESCRIPTOR,
316 template <
typename,
typename,
int,
int,
int>
typename TYPE
324 return meta::id<TYPE<T,DESCRIPTOR,1,-1,1>>();
327 return meta::id<TYPE<T,DESCRIPTOR,1,1,-1>>();
330 return meta::id<TYPE<T,DESCRIPTOR,1,-1,-1>>();
333 return meta::id<TYPE<T,DESCRIPTOR,-1,1,1>>();
336 return meta::id<TYPE<T,DESCRIPTOR,-1,-1,1>>();
339 return meta::id<TYPE<T,DESCRIPTOR,-1,1,-1>>();
342 return meta::id<TYPE<T,DESCRIPTOR,-1,-1,-1>>();
345 return meta::id<TYPE<T,DESCRIPTOR,-1,-1,0>>();
348 return meta::id<TYPE<T,DESCRIPTOR,-1,0,0>>();
354 return meta::id<TYPE<T,DESCRIPTOR,0,-1,0>>();
357 return meta::id<TYPE<T,DESCRIPTOR,-1,0,-1>>();
363 return meta::id<TYPE<T,DESCRIPTOR,0,0,-1>>();
366 return meta::id<TYPE<T,DESCRIPTOR,-1,1,0>>();
369 return meta::id<TYPE<T,DESCRIPTOR,0,-1,-1>>();
372 return meta::id<TYPE<T,DESCRIPTOR,0,-1,1>>();
375 return meta::id<TYPE<T,DESCRIPTOR,-1,0,1>>();
378 return meta::id<TYPE<T,DESCRIPTOR,1,0,-1>>();
384 return meta::id<TYPE<T,DESCRIPTOR,0,1,-1>>();
393 return meta::id<TYPE<T,DESCRIPTOR,1,-1,0>>();
399 throw std::domain_error(
"Invalid normal");
406 typename RESULT,
typename T,
typename DESCRIPTOR,
407 template <
typename,
typename,
int,
int,
int>
typename TYPE,
413 return new TYPE<T,DESCRIPTOR,0,1,1>(std::forward<
decltype(args)>(args)...);
416 return new TYPE<T,DESCRIPTOR,0,-1,1>(std::forward<decltype(args)>(args)...);
419 return new TYPE<T,DESCRIPTOR,0,1,-1>(std::forward<decltype(args)>(args)...);
422 return new TYPE<T,DESCRIPTOR,0,-1,-1>(std::forward<decltype(args)>(args)...);
425 return new TYPE<T,DESCRIPTOR,1,1,1>(std::forward<
decltype(args)>(args)...);
428 return new TYPE<T,DESCRIPTOR,1,-1,-1>(std::forward<decltype(args)>(args)...);
431 return new TYPE<T,DESCRIPTOR,1,1,-1>(std::forward<decltype(args)>(args)...);
434 return new TYPE<T,DESCRIPTOR,1,-1,1>(std::forward<decltype(args)>(args)...);
437 return new TYPE<T,DESCRIPTOR,2,1,1>(std::forward<
decltype(args)>(args)...);
440 return new TYPE<T,DESCRIPTOR,2,-1,1>(std::forward<decltype(args)>(args)...);
443 return new TYPE<T,DESCRIPTOR,2,1,-1>(std::forward<decltype(args)>(args)...);
446 return new TYPE<T,DESCRIPTOR,2,-1,-1>(std::forward<decltype(args)>(args)...);
455 typename T,
typename DESCRIPTOR,
456 template <
typename,
typename,
int,
int,
int>
typename TYPE
464 return meta::id<TYPE<T,DESCRIPTOR,0,-1,1>>();
467 return meta::id<TYPE<T,DESCRIPTOR,0,1,-1>>();
470 return meta::id<TYPE<T,DESCRIPTOR,0,-1,-1>>();
476 return meta::id<TYPE<T,DESCRIPTOR,1,-1,-1>>();
479 return meta::id<TYPE<T,DESCRIPTOR,1,1,-1>>();
482 return meta::id<TYPE<T,DESCRIPTOR,1,-1,1>>();
488 return meta::id<TYPE<T,DESCRIPTOR,2,-1,1>>();
491 return meta::id<TYPE<T,DESCRIPTOR,2,1,-1>>();
494 return meta::id<TYPE<T,DESCRIPTOR,2,-1,-1>>();
497 throw std::domain_error(
"Invalid normal");
503 typename T,
typename DESCRIPTOR,
504 template<
typename,
typename,
int,
int,
int>
typename TYPE,
509 return constructForNormal<PostProcessorGenerator3D<T,DESCRIPTOR>,T,DESCRIPTOR,TYPE>(n, std::forward<decltype(args)>(args)...);
513 typename T,
typename DESCRIPTOR,
514 template<
typename,
typename,
int,
int,
int>
typename TYPE
518 return promiseForNormal<PostProcessorPromise<T,DESCRIPTOR>,T,DESCRIPTOR,TYPE>(n);
523 typename T,
typename DESCRIPTOR,
524 template<
typename,
typename,
int,
int,
int>
typename TYPE,
529 return constructForNormalSpecial<PostProcessorGenerator3D<T,DESCRIPTOR>,T,DESCRIPTOR,TYPE>(n, std::forward<decltype(args)>(args)...);
533 typename T,
typename DESCRIPTOR,
534 template<
typename,
typename,
int,
int,
int>
typename TYPE
538 return promiseForNormalSpecial<PostProcessorPromise<T,DESCRIPTOR>,T,DESCRIPTOR,TYPE>(n);
Platform-abstracted block lattice for external access and inter-block interaction.
virtual void addPostProcessor(std::type_index stage, LatticeR< DESCRIPTOR::d > latticeR, PostProcessorPromise< T, DESCRIPTOR > &&promise)=0
Schedule post processor for application to latticeR in stage.
void defineDynamics(LatticeR< DESCRIPTOR::d > latticeR, DynamicsPromise< T, DESCRIPTOR > &&promise)
Assign promised DYNAMICS to latticeR.
Cell< T, DESCRIPTOR > get(CellID iCell)
Get Cell interface for index iCell.
bool isPadding(LatticeR< D > latticeR) const
Return whether location is valid.
Factory for instances of a specific Dynamics type.
Smart pointer for managing the various ways of passing functors around.
Factory for instances of a specific POST_PROCESSOR type.
Representation of a statistic for a parallel 2D geometry.
BlockGeometry< T, D > & getBlockGeometry(int locIC)
Read and write access to a single block geometry.
Base indicator functor (discrete)
Super class maintaining block lattices for a cuboid decomposition.
SuperCommunicator< T, SuperLattice > & getCommunicator(STAGE stage=STAGE())
Return communicator for given communication stage.
LoadBalancer< T > & getLoadBalancer()
Read and write access to the load balancer.
DynamicsPromise< T, DESCRIPTOR > constructConcreteDynamicsForDirectionOrientation(Vector< int, 2 > n)
PostProcessorGenerator2D< T, DESCRIPTOR > * constructPostProcessorForNormal(Vector< int, 2 > n, ARGS &&... args)
RESULT * constructForNormalSpecial(Vector< int, 3 > n, ARGS &&... args)
PostProcessorPromise< T, DESCRIPTOR > promisePostProcessorForNormalSpecial(Vector< int, 3 > n)
RESULT * constructForNormal(Vector< int, 2 > n, ARGS &&... args)
PostProcessorPromise< T, DESCRIPTOR > promisePostProcessorForNormal(Vector< int, 2 > n)
PostProcessorGenerator3D< T, DESCRIPTOR > * constructPostProcessorForNormalSpecial(Vector< int, 3 > n, ARGS &&... args)
DynamicsPromise< T, DESCRIPTOR > constructConcreteDynamicsForNormalSpecial(Vector< int, 3 > n)
RESULT promiseForNormal(Vector< int, 2 > n)
DynamicsPromise< T, DESCRIPTOR > constructConcreteDynamicsForNormal(Vector< int, 2 > n)
PROMISE promiseForNormalSpecial(Vector< int, 3 > n)
Top level namespace for all of OpenLB.
void addPoints2CommBC(SuperLattice< T, DESCRIPTOR > &sLattice, FunctorPtr< SuperIndicatorF2D< T > > &&indicator, int _overlap)
Adds needed Cells to the Communicator _commBC in SuperLattice.
DynamicsPromise(meta::id< DYNAMICS >) -> DynamicsPromise< typename DYNAMICS::value_t, typename DYNAMICS::descriptor_t >
void setBoundary(BlockLattice< T, DESCRIPTOR > &block, int iX, int iY, Dynamics< T, DESCRIPTOR > *dynamics, PostProcessorGenerator2D< T, DESCRIPTOR > *postProcessor)
Interface for per-cell dynamics.
virtual void initialize(Cell< T, DESCRIPTOR > &cell)
Initialize dynamics-specific data for cell.
DYNAMICS< T, DESCRIPTOR, MOMENTA, x, y, z > ConcreteDynamics
static auto construct(Vector< int, 3 > n)
static auto construct(Vector< int, 3 > n)
DYNAMICS< T, DESCRIPTOR, MIXIN, MOMENTA, x, y, z > ConcreteDynamics
static auto construct(Vector< int, 3 > n)
DYNAMICS< T, DESCRIPTOR, MIXIN, MOMENTA< PlaneAndNormal... > > ConcreteDynamics
Communication after propagation.