OpenLB 1.7
Loading...
Searching...
No Matches
setRobinBoundary3D.hh
Go to the documentation of this file.
1/* This file is part of the OpenLB library
2 *
3 * Copyright (C) 2023 Fedor Bukreev, Adrian Kummerländer,
4 * 2024 Marc Heinzelmann
5 * E-mail contact: info@openlb.net
6 * The most recent release of OpenLB can be downloaded at
7 * <http://www.openlb.net/>
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public
20 * License along with this program; if not, write to the Free
21 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22 * Boston, MA 02110-1301, USA.
23 */
24
25//This file contains the RobinBoundary
26
27#ifndef SET_ROBIN_BOUNDARY_3D_HH
28#define SET_ROBIN_BOUNDARY_3D_HH
29
30#include "setRobinBoundary3D.h"
31
33
34
35namespace olb {
36
38template<typename T, typename DESCRIPTOR, typename MixinDynamics>
39void setRobinBoundary(SuperLattice<T, DESCRIPTOR>& sLattice, T omega, SuperGeometry<T,3>& superGeometry, int material)
40{
41 setRobinBoundary<T,DESCRIPTOR,MixinDynamics>(sLattice, omega, superGeometry.getMaterialIndicator(material));
42}
43
45template<typename T, typename DESCRIPTOR, typename MixinDynamics>
47{
48 OstreamManager clout(std::cout, "setRobinBoundary");
49 bool includeOuterCells = false;
50 bool useOtherStrategy = false;
51 if (indicator->getSuperGeometry().getOverlap() == 1) {
52 includeOuterCells = true;
53 clout << "WARNING: overlap == 1, boundary conditions set on overlap despite unknown neighbor materials" << std::endl;
54 }
55 for (int iCloc = 0; iCloc < sLattice.getLoadBalancer().size(); iCloc++) {
56 setRobinBoundary<T,DESCRIPTOR,MixinDynamics>(sLattice.getBlock(iCloc), indicator->getBlockIndicatorF(iCloc), omega, includeOuterCells, useOtherStrategy);
57 }
58}
59
60
62template<typename T, typename DESCRIPTOR, typename MixinDynamics>
63void setRobinBoundary(BlockLattice<T,DESCRIPTOR>& _block, BlockIndicatorF3D<T>& indicator, T omega, bool includeOuterCells, bool useOtherStrategy)
64{
65 using namespace boundaryhelper;
66 const auto& blockGeometryStructure = indicator.getBlockGeometry();
67 const int margin = includeOuterCells ? 0 : 1;
68 std::vector<int> discreteNormal(4,0);
69 blockGeometryStructure.forSpatialLocations([&](auto iX, auto iY, auto iZ) {
70 if (blockGeometryStructure.getNeighborhoodRadius({iX, iY, iZ}) >= margin
71 && indicator(iX, iY, iZ)) {
72 discreteNormal = blockGeometryStructure.getStatistics().getType(iX, iY, iZ);
73 Dynamics<T,DESCRIPTOR>* dynamics = nullptr;
74
75 if(discreteNormal[0] == 0){ //flat
76 if(!useOtherStrategy){
77 _block.addPostProcessor(
78 typeid(stage::PostStream), {iX,iY,iZ},
79 promisePostProcessorForNormal<T, DESCRIPTOR, robinBoundaryLatticePostProcessor3D>(
80 Vector <int,3> (discreteNormal.data()+1)
81 )
82 );
83 } else{
84 _block.addPostProcessor(
85 typeid(stage::PostStream), {iX,iY,iZ},
86 promisePostProcessorForNormal<T, DESCRIPTOR, robinBoundaryLatticePostProcessor3Dother>(
87 Vector <int,3> (discreteNormal.data()+1)
88 )
89 );
90 }
91 dynamics = _block.template getDynamics<AdvectionDiffusionBGKdynamics<T,DESCRIPTOR>>();
92 }
93 setBoundary(_block, iX, iY, iZ, dynamics);
94 }
95 });
96}
97
98
99}//namespace olb
100#endif
Base block indicator functor.
BlockGeometry< T, 3 > & getBlockGeometry()
Get underlying block geometry structure.
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.
Smart pointer for managing the various ways of passing functors around.
Definition functorPtr.h:60
class for marking output with some text
Representation of a statistic for a parallel 2D geometry.
std::unique_ptr< SuperIndicatorF< T, D > > getMaterialIndicator(std::vector< int > &&materials)
Returns a material indicator using the given vector of materials.
Base indicator functor (discrete)
Super class maintaining block lattices for a cuboid decomposition.
BlockLattice< T, DESCRIPTOR > & getBlock(int locC)
Return BlockLattice with local index locC.
LoadBalancer< T > & getLoadBalancer()
Read and write access to the load balancer.
Top level namespace for all of OpenLB.
void setRobinBoundary(SuperLattice< T, DESCRIPTOR > &sLattice, T omega, SuperGeometry< T, 3 > &superGeometry, int material)
Initialising the setRobinBoundary function on the superLattice domain This is an AdvectionDiffusionBo...
void setBoundary(BlockLattice< T, DESCRIPTOR > &block, int iX, int iY, Dynamics< T, DESCRIPTOR > *dynamics, PostProcessorGenerator2D< T, DESCRIPTOR > *postProcessor)
Interface for per-cell dynamics.
Definition interface.h:54
Communication after propagation.
Definition stages.h:36