OpenLB 1.8.1
Loading...
Searching...
No Matches
olb::SuperAverage3D< T, W > Class Template Referencefinal

SuperAverage3D returns the average in each component of f on a indicated subset. More...

#include <superAverage3D.h>

+ Inheritance diagram for olb::SuperAverage3D< T, W >:
+ Collaboration diagram for olb::SuperAverage3D< T, W >:

Public Member Functions

 SuperAverage3D (FunctorPtr< SuperF3D< T, W > > &&f, FunctorPtr< SuperIndicatorF3D< T > > &&indicatorF)
 Constructor for determining the average of f on a indicated subset.
 
 SuperAverage3D (FunctorPtr< SuperF3D< T, W > > &&f, SuperGeometry< T, 3 > &superGeometry, const int material)
 Constructor for determining the average of f on a given material.
 
bool operator() (W output[], const int input[]) override
 Global average operator.
 
- Public Member Functions inherited from olb::SuperF3D< T, T >
SuperF3D< T, W > & operator- (SuperF3D< T, W > &rhs)
 
SuperF3D< T, W > & operator+ (SuperF3D< T, W > &rhs)
 
SuperF3D< T, W > & operator* (SuperF3D< T, W > &rhs)
 
SuperF3D< T, W > & operator/ (SuperF3D< T, W > &rhs)
 
SuperStructure< T, 3 > & getSuperStructure ()
 
int getBlockFSize () const
 
BlockF3D< W > & getBlockF (int iCloc)
 
bool operator() (W output[], const int input[])
 has to be implemented for 'every' derived class
 
- Public Member Functions inherited from olb::GenericF< W, int >
virtual ~GenericF ()=default
 
int getSourceDim () const
 read only access to member variable _m
 
int getTargetDim () const
 read only access to member variable _n
 
std::string & getName ()
 read and write access to name
 
std::string const & getName () const
 read only access to name
 
bool operator() (W output[])
 wrapper that call the pure virtual operator() (T output[], const S input[]) from above
 
bool operator() (W output[], int input0)
 
bool operator() (W output[], int input0, int input1)
 
bool operator() (W output[], int input0, int input1, int input2)
 
bool operator() (W output[], int input0, int input1, int input2, int input3)
 

Additional Inherited Members

- Public Types inherited from olb::SuperF3D< T, T >
using identity_functor_type
 
- Public Types inherited from olb::GenericF< W, int >
using targetType
 
using sourceType
 
- Public Attributes inherited from olb::GenericF< W, int >
std::shared_ptr< GenericF< W, int > > _ptrCalcC
 memory management, frees resouces (calcClass)
 
- Static Public Attributes inherited from olb::SuperF3D< T, T >
static constexpr bool isSuper
 
static constexpr unsigned d
 
- Protected Member Functions inherited from olb::SuperF3D< T, T >
 SuperF3D (SuperStructure< T, 3 > &superStructure, int targetDim)
 
- Protected Member Functions inherited from olb::GenericF< W, int >
 GenericF (int targetDim, int sourceDim)
 
- Protected Attributes inherited from olb::SuperF3D< T, T >
SuperStructure< T, 3 > & _superStructure
 
std::vector< std::unique_ptr< BlockF3D< W > > > _blockF
 Super functors may consist of several BlockF3D<W> derived functors.
 

Detailed Description

template<typename T, typename W = T>
class olb::SuperAverage3D< T, W >

SuperAverage3D returns the average in each component of f on a indicated subset.

Definition at line 37 of file superAverage3D.h.

Constructor & Destructor Documentation

◆ SuperAverage3D() [1/2]

template<typename T , typename W >
olb::SuperAverage3D< T, W >::SuperAverage3D ( FunctorPtr< SuperF3D< T, W > > && f,
FunctorPtr< SuperIndicatorF3D< T > > && indicatorF )

Constructor for determining the average of f on a indicated subset.

Parameters
ffunctor of which the average is to be determined
indicatorFindicator describing the subset on which to evaluate f

Definition at line 34 of file superAverage3D.hh.

36 : SuperF3D<T,W>(f->getSuperStructure(), f->getTargetDim()+1),
37 _f(std::move(f)),
38 _indicatorF(std::move(indicatorF))
39{
40 this->getName() = "Average("+_f->getName()+")";
41
42 LoadBalancer<T>& load = _f->getSuperStructure().getLoadBalancer();
43
44 if ( _f->getBlockFSize() == load.size() &&
45 _indicatorF->getBlockFSize() == load.size() ) {
46 for (int iC = 0; iC < load.size(); ++iC) {
47 this->_blockF.emplace_back(
48 new BlockAverage3D<T,W>(_f->getBlockF(iC),
49 _indicatorF->getBlockIndicatorF(iC))
50 );
51 }
52 }
53}
std::string & getName()
Definition genericF.hh:51
std::vector< std::unique_ptr< BlockF3D< W > > > _blockF

References olb::SuperF3D< T, T >::_blockF, olb::GenericF< W, int >::getName(), and olb::LoadBalancer< T >::size().

+ Here is the call graph for this function:

◆ SuperAverage3D() [2/2]

template<typename T , typename W >
olb::SuperAverage3D< T, W >::SuperAverage3D ( FunctorPtr< SuperF3D< T, W > > && f,
SuperGeometry< T, 3 > & superGeometry,
const int material )

Constructor for determining the average of f on a given material.

Parameters
ffunctor of which the average is to be determined
superGeometrysuper geometry for constructing material indicator
materialnumber of the relevant material

Definition at line 56 of file superAverage3D.hh.

60 std::forward<decltype(f)>(f),
61 superGeometry.getMaterialIndicator(material))
62{ }
SuperAverage3D(FunctorPtr< SuperF3D< T, W > > &&f, FunctorPtr< SuperIndicatorF3D< T > > &&indicatorF)
Constructor for determining the average of f on a indicated subset.

Member Function Documentation

◆ operator()()

template<typename T , typename W >
bool olb::SuperAverage3D< T, W >::operator() ( W output[],
const int input[] )
overridevirtual

Global average operator.

Note: While this functor exposes BlockAverage3D functors if possible, a call to this function will not use them but calculate the global average by summing all components and voxel counts. Calling BlockAverage3D in this situation would unnecessarily complicate this as we would have to weight the aggregated averages according to their share in the global average.

Implements olb::GenericF< W, int >.

Definition at line 65 of file superAverage3D.hh.

66{
67 _f->getSuperStructure().communicate();
68 auto& geometry = _f->getSuperStructure().getCuboidDecomposition();
69 LoadBalancer<T>& load = _f->getSuperStructure().getLoadBalancer();
70
71 for (int i = 0; i < _f->getTargetDim(); ++i) {
72 output[i] = W(0);
73 }
74
75 W outputTmp[_f->getTargetDim()];
76 int inputTmp[_f->getSourceDim()];
77 std::size_t voxels(0);
78 std::vector<util::KahanSummator<W>> summators(_f->getTargetDim(), util::KahanSummator<W>());
79
80 for (int iC = 0; iC < load.size(); ++iC) {
81 const Cuboid3D<T>& cuboid = geometry.get(load.glob(iC));
82 inputTmp[0] = load.glob(iC);
83 for (inputTmp[1] = 0; inputTmp[1] < cuboid.getNx(); ++inputTmp[1]) {
84 for (inputTmp[2] = 0; inputTmp[2] < cuboid.getNy(); ++inputTmp[2]) {
85 for (inputTmp[3] = 0; inputTmp[3] < cuboid.getNz(); ++inputTmp[3]) {
86 if (_indicatorF(inputTmp)) {
87 _f(outputTmp,inputTmp);
88 for (int i = 0; i < _f->getTargetDim(); ++i) {
89 summators[i].add(outputTmp[i]);
90 }
91 voxels += 1;
92 }
93 }
94 }
95 }
96 }
97
98 for (int i = 0; i < _f->getTargetDim(); ++i) {
99 output[i] = summators[i].getSum();
100 }
101
102#ifdef PARALLEL_MODE_MPI
103 for (int i = 0; i < _f->getTargetDim(); ++i) {
104 singleton::mpi().reduceAndBcast(output[i], MPI_SUM);
105 }
106 singleton::mpi().reduceAndBcast(voxels, MPI_SUM);
107#endif
108
109 output[_f->getTargetDim()] = voxels;
110 for (int i = 0; i < _f->getTargetDim(); ++i) {
111 output[i] /= output[_f->getTargetDim()];
112 }
113
114 return true;
115}
void reduceAndBcast(T &reductVal, MPI_Op op, int root=0, MPI_Comm comm=MPI_COMM_WORLD)
Reduction operation, followed by a broadcast.
MpiManager & mpi()
Cuboid< T, 3 > Cuboid3D
Definition cuboid.h:151

References olb::SuperStructure< T, D >::communicate(), olb::Cuboid< T, D >::getNx(), olb::Cuboid< T, D >::getNy(), olb::Cuboid< T, D >::getNz(), olb::SuperF3D< T, U >::getSuperStructure(), olb::LoadBalancer< T >::glob(), olb::singleton::mpi(), olb::singleton::MpiManager::reduceAndBcast(), and olb::LoadBalancer< T >::size().

+ Here is the call graph for this function:

The documentation for this class was generated from the following files: