From 94d3e79a8617f88dc0219cfdeedfa3147833719d Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Mon, 24 Jun 2019 14:43:36 +0200 Subject: Initialize at openlb-1-3 --- src/functors/lattice/blockLatticeLocalF3D.h | 587 ++++++++++++++++++++++++++++ 1 file changed, 587 insertions(+) create mode 100644 src/functors/lattice/blockLatticeLocalF3D.h (limited to 'src/functors/lattice/blockLatticeLocalF3D.h') diff --git a/src/functors/lattice/blockLatticeLocalF3D.h b/src/functors/lattice/blockLatticeLocalF3D.h new file mode 100644 index 0000000..2dfe3bd --- /dev/null +++ b/src/functors/lattice/blockLatticeLocalF3D.h @@ -0,0 +1,587 @@ +/* This file is part of the OpenLB library + * + * Copyright (C) 2012 Lukas Baron, Mathias J. Krause, Albert Mink + * E-mail contact: info@openlb.net + * The most recent release of OpenLB can be downloaded at + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the Free + * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. +*/ + +#ifndef BLOCK_LATTICE_LOCAL_F_3D_H +#define BLOCK_LATTICE_LOCAL_F_3D_H + +#include "blockBaseF3D.h" +#include "geometry/blockGeometry3D.h" +#include "functors/analytical/indicator/indicatorBaseF3D.h" +#include "indicator/blockIndicatorBaseF3D.h" +#include "dynamics/smagorinskyBGKdynamics.h" +#include "dynamics/porousBGKdynamics.h" + +/** Note: Throughout the whole source code directory genericFunctions, the + * template parameters for i/o dimensions are: + * F: S^m -> T^n (S=source, T=target) + */ + +namespace olb { + +template class blockLatticeStructure3D; +template class ParticleIndicatorF3D; + +//////////////////////////////////////////////////////////////////////////////// +//// if globIC is not on the local processor, the returned vector is empty////// +//////////////////////////////////////////////////////////////////////////////// + +/// functor returns pointwise f population on local lattices +template +class BlockLatticeFpop3D final : public BlockLatticeF3D { +public: + BlockLatticeFpop3D(BlockLatticeStructure3D& blockLattice); + bool operator() (T output[], const int input[]) override; +}; + +/// functor returns pointwise dissipation density on local lattices +template +class BlockLatticeDissipation3D final : public BlockLatticeF3D { +protected: + const UnitConverter& _converter; +public: + BlockLatticeDissipation3D(BlockLatticeStructure3D& blockLattice, + const UnitConverter& converter); + bool operator() (T output[], const int input[]) override; +}; + +/// functor returns pointwise dissipation density on local lattices +template +class BlockLatticePhysDissipation3D final : public BlockLatticeF3D { +protected: + const int _overlap; + const UnitConverter& _converter; +public: + BlockLatticePhysDissipation3D(BlockLatticeStructure3D& blockLattice, + int overlap, + const UnitConverter& converter); + bool operator() (T output[], const int input[]) override; +}; + +/// functor returns pointwise turbulent dissipation density on local lattices +template +class BlockLatticeEffevtiveDissipation3D final : public BlockLatticeF3D { +protected: + const UnitConverter& _converter; + T _smagoConst; + LESDynamics& _LESdynamics; +public: + BlockLatticeEffevtiveDissipation3D(BlockLatticeStructure3D& blockLattice, + const UnitConverter& converter, T smagoConst, + LESDynamics& LESdynamics); + bool operator() (T output[], const int input[]) override; +}; + +/// functor returns pointwise turbulent dissipation density on local lattices +template +class BlockLatticePhysEffevtiveDissipation3D final : public BlockLatticeF3D { +protected: + const UnitConverter& _converter; + T _smagoConst; + LESDynamics& _LESdynamics; +public: + BlockLatticePhysEffevtiveDissipation3D(BlockLatticeStructure3D& blockLattice, + const UnitConverter& converter, T smagoConst, + LESDynamics& LESdynamics); + bool operator() (T output[], const int input[]) override; +}; + + +/// functor returns pointwise density rho on local lattices +template +class BlockLatticeDensity3D final : public BlockLatticeF3D { +public: + BlockLatticeDensity3D(BlockLatticeStructure3D& blockLattice); + bool operator() (T output[], const int input[]) override; +}; + + +/// functor returns pointwise velocity on local lattice +template +class BlockLatticeVelocity3D final : public BlockLatticeF3D { +public: + BlockLatticeVelocity3D(BlockLatticeStructure3D& blockLattice); + bool operator() (T output[], const int input[]) override; +}; + +/// functor returns pointwise external velocity (external field) on local lattice +template +class BlockLatticeExternalVelocity3D final : public BlockLatticeF3D { +public: + BlockLatticeExternalVelocity3D(BlockLatticeStructure3D& blockLattice); + bool operator() (T output[], const int input[]); +}; + +/// functor returns pointwise the material no. presenting the geometry on local lattice +template +class BlockLatticeGeometry3D final : public BlockLatticeF3D { + BlockGeometryStructure3D& _blockGeometry; + int _material; +public: + BlockLatticeGeometry3D(BlockLatticeStructure3D& blockLattice, + BlockGeometryStructure3D& blockGeometry, int material = -1); + bool operator() (T output[], const int input[]) override; +}; + +/// functor to get pointwise the rank no. + 1 on local lattice +template +class BlockLatticeRank3D final : public BlockLatticeF3D { +public: + BlockLatticeRank3D(BlockLatticeStructure3D& blockLattice); + bool operator() (T output[], const int input[]) override; +}; + +/// functor to get pointwise the cuboid no. + 1 on local lattice +template +class BlockLatticeCuboid3D final : public BlockLatticeF3D { +private: + // holds cuboid nmb of current block + int _iC; +public: + BlockLatticeCuboid3D(BlockLatticeStructure3D& blockLattice, int iC); + bool operator() (T output[], const int input[]) override; +}; + + +/// functor returns pointwise phys pressure from rho on local lattices +template +class BlockLatticePhysPressure3D final : public BlockLatticePhysF3D { +private: + const int _overlap; +public: + BlockLatticePhysPressure3D(BlockLatticeStructure3D& blockLattice, + int overlap, + const UnitConverter& converter); + bool operator() (T output[], const int input[]) override; +}; + + +/// functor returns pointwise phys velocity on local lattice +template +class BlockLatticePhysVelocity3D final : public BlockLatticePhysF3D { +private: + const int _overlap; + const bool _print; +public: + BlockLatticePhysVelocity3D(BlockLatticeStructure3D& blockLattice, + int overlap, + const UnitConverter& converter, + bool print=false); + bool operator() (T output[], const int input[]) override; +}; + +template +class BlockLatticePhysExternalVelocity3D final : public BlockLatticePhysF3D { +public: + BlockLatticePhysExternalVelocity3D(BlockLatticeStructure3D& blockLattice, + const UnitConverter& converter); + bool operator() (T output[], const int input[]); +}; + +template +class BlockLatticePhysExternalPorosity3D final : public BlockLatticePhysF3D { +private: + const int _overlap; +public: + BlockLatticePhysExternalPorosity3D(BlockLatticeStructure3D& blockLattice, + int overlap, + const UnitConverter& converter); + bool operator() (T output[], const int input[]); +}; + +template +class BlockLatticePhysExternalParticleVelocity3D final : public BlockLatticePhysF3D { +public: + BlockLatticePhysExternalParticleVelocity3D(BlockLatticeStructure3D& blockLattice, + const UnitConverter& converter); + bool operator() (T output[], const int input[]); +}; + +template +class BlockLatticePhysExternal3D final : public BlockLatticeF3D { +public: + BlockLatticePhysExternal3D(BlockLatticeStructure3D& blockLattice, + T convFactorToPhysUnits, int offset, int size); + bool operator() (T output[], const int input[]) override; +private: + T _convFactorToPhysUnits; + int _offset, _size; +}; + +/// functor returns pointwise lattice flux on local lattice +template +class BlockLatticeFlux3D final : public BlockLatticeF3D { +private: +public: + BlockLatticeFlux3D(BlockLatticeStructure3D& blockLattice); + bool operator() (T output[3], const int input[3]) override; +}; + +/// functor returns pointwise strain rate on local lattice, s_ij = 1/2*(du_idr_j + du_jdr_i) +template +class BlockLatticeStrainRate3D final : public BlockLatticePhysF3D { +public: + BlockLatticeStrainRate3D(BlockLatticeStructure3D& blockLattice, + const UnitConverter& converter); + bool operator() (T output[], const int input[]) override; +}; + +/// functor returns pointwise phys strain rate on local lattice, s_ij = 1/2*(du_idr_j + du_jdr_i) +template +class BlockLatticePhysStrainRate3D final : public BlockLatticePhysF3D { +private: + const int _overlap; +public: + BlockLatticePhysStrainRate3D(BlockLatticeStructure3D& blockLattice, + int overlap, + const UnitConverter& converter); + bool operator() (T output[], const int input[]); +}; + +/// functor returns pointwise phys force acting on a boundary with a given material on local lattice +template +class BlockLatticePhysBoundaryForce3D final : public BlockLatticePhysF3D { +private: + BlockIndicatorF3D& _indicatorF; + BlockGeometryStructure3D& _blockGeometry; +public: + BlockLatticePhysBoundaryForce3D(BlockLatticeStructure3D& blockLattice, + BlockIndicatorF3D& indicatorF, + const UnitConverter& converter); + bool operator() (T output[], const int input[]) override; +}; + +/// functor returns pointwise phys force for PSM dynamics +template +class BlockLatticePSMPhysForce3D final : public BlockLatticePhysF3D { +public: + BlockLatticePSMPhysForce3D(BlockLatticeStructure3D& blockLattice, + const UnitConverter& converter, int mode_); + bool operator() (T output[], const int input[]) override; +private: + Mode mode; +}; + +/// functor returns pointwise phys wall shear stress acting on a boundary with a given material on local lattice +template +class BlockLatticePhysWallShearStress3D final : public BlockLatticePhysF3D { +private: + BlockGeometryStructure3D& _blockGeometry; + const int _overlap; + const int _material; + std::vector>>> _discreteNormal; + std::vector>>> _normal; + T _physFactor; +public: + BlockLatticePhysWallShearStress3D(BlockLatticeStructure3D& blockLattice, + BlockGeometryStructure3D& blockGeometry, + int overlap, + int material, + const UnitConverter& converter, + IndicatorF3D& indicator); + bool operator() (T output[], const int input[]) override; +}; + +/** + * functor returns pointwise phys force acting on a indicated boundary on local lattice + * see: Caiazzo, Junk: Boundary Forces in lattice Boltzmann: Analysis of MEA + */ +template +class BlockLatticePhysCorrBoundaryForce3D final : public BlockLatticePhysF3D { +private: + BlockIndicatorF3D& _indicatorF; + BlockGeometryStructure3D& _blockGeometry; +public: + BlockLatticePhysCorrBoundaryForce3D(BlockLatticeStructure3D& blockLattice, + BlockIndicatorF3D& indicatorF, + const UnitConverter& converter); + bool operator() (T output[], const int input[]) override; +}; + + +/// functor to get pointwise, lattice-dependent external field +template +class BlockLatticeField3D final : public BlockLatticeF3D { +public: + BlockLatticeField3D(BlockLatticeStructure3D& blockLattice); + bool operator() (T output[], const int input[]) override; +}; + +/** + * functor returns pointwise, lattice-dependent porosity values in [0,1] + * in combination with (Extended)PorousBGKdynamics: 0->solid, 1->fluid + */ +template +class BlockLatticePorosity3D final : public BlockLatticeF3D { +public: + BlockLatticePorosity3D(BlockLatticeStructure3D& blockLattice); + bool operator() (T output[], const int input[]); +}; + +/** + * functor returns pointwise an approximation for the volume fraction + */ +template +class BlockLatticeVolumeFractionApproximation3D final : public BlockLatticeF3D { +private: + BlockGeometryStructure3D& _blockGeometry; + IndicatorF3D& _indicator; + int _refinementLevel; + const UnitConverter& _converter; + bool _insideOut; + T _physSubGridMinPhysRshift; + T _physSubGridDeltaX; + T _latticeSubGridVolume; +public: + BlockLatticeVolumeFractionApproximation3D(BlockLatticeStructure3D& blockLattice, + BlockGeometryStructure3D& blockGeometry, + IndicatorF3D& indicator, + int refinementLevel, + const UnitConverter& converter, bool insideOut); + bool operator() (T output[], const int input[]); +}; + +/** + * functor to get pointwise mesh-independent permeability values in (0,inf) + * in combination with (Extended)PorousBGKdynamics + * note: result is cropped to 999999 + */ +template +class BlockLatticePhysPermeability3D final : public BlockLatticePhysF3D { +public: + BlockLatticePhysPermeability3D(BlockLatticeStructure3D& blockLattice, const UnitConverter& converter); + bool operator() (T output[], const int input[]); +}; + + +/** + * functor to get pointwise mesh-independent permeability values in (0,inf) + * in combination with (Extended)PorousBGKdynamics + * note: result is cropped to 1 + */ +template +class BlockLatticePhysCroppedPermeability3D final : public BlockLatticePhysF3D { +public: + BlockLatticePhysCroppedPermeability3D(BlockLatticeStructure3D& blockLattice, const UnitConverter& converter); + bool operator() (T output[], const int input[]); +}; + +//TODO: consistency with 2D (181219) +/* +template +class BlockLatticePhysPermeability3D final : public BlockLatticePhysF3D { +private: + BlockGeometry3D& _blockGeometry; + int _material; +public: + BlockLatticePhysPermeability3D(BlockLatticeStructure3D& blockLattice, + BlockGeometry3D& blockGeometry, + int material, const UnitConverter& converter); + bool operator() (T output[], const int input[]); +};*/ + + +/// functor returns pointwise -nu/K*u on the lattice, can be used with BlockSum3D as objective +template +class BlockLatticePhysDarcyForce3D final : public BlockLatticePhysF3D { +private: + BlockGeometry3D& _blockGeometry; + int _material; +public: + BlockLatticePhysDarcyForce3D(BlockLatticeStructure3D& blockLattice, + BlockGeometry3D& blockGeometry, + int material, const UnitConverter& converter); + bool operator() (T output[], const int input[]); +}; + + +/// functor returns pointwise the l2-norm, e.g. of a velocity +template +class BlockEuklidNorm3D final : public BlockF3D { +protected: + BlockF3D& _f; +public: + BlockEuklidNorm3D(BlockF3D& f); + bool operator() (T output[], const int input[]) override; +}; + + +template +class BlockLatticeInterpPhysVelocity3D final : public BlockLatticePhysF3D { +protected: + Cuboid3D* _cuboid; + int _overlap; +public: + BlockLatticeInterpPhysVelocity3D(BlockLatticeStructure3D& blockLattice, + const UnitConverter& conv, Cuboid3D* c, int overlap); + BlockLatticeInterpPhysVelocity3D(const BlockLatticeInterpPhysVelocity3D& rhs); + bool operator() (T output[3], const int input[3]) override + { + return false; + } + void operator() (T output[3], const T input[3]); +}; + +/** Functor that returns forces acting on a particle surface, returns data in output for every particle in a row(described are return values for the first particle). + * \return output[0]-output[2] translational force - physical units + * \return output[3]-output[5] torque - physical units + * \return output[7] number of voxels + */ + +template +class BlockLatticePorousMomentumLossForce3D final : public BlockLatticePhysF3D { +private: + BlockGeometryStructure3D& _blockGeometry; + std::vector* >& _vectorOfIndicator; +public: + BlockLatticePorousMomentumLossForce3D(BlockLatticeStructure3D& blockLattice, + BlockGeometryStructure3D& blockGeometry, + std::vector* >& indicator, + const UnitConverter& converter); + bool operator() (T output[], const int input[]) override; +}; + +template +class BlockLatticePhysTemperature3D final : public BlockLatticeThermalPhysF3D { +public: + BlockLatticePhysTemperature3D(BlockLatticeStructure3D& blockLattice, + ThermalUnitConverter const& converter); + bool operator() (T output[], const int input[]); +}; + +/// BlockLatticePhysHeatFlux3D returns pointwise phys heat flux on local lattice. +template +class BlockLatticePhysHeatFlux3D final : public BlockLatticeThermalPhysF3D { +public: + BlockLatticePhysHeatFlux3D(BlockLatticeStructure3D& blockLattice, + const ThermalUnitConverter& converter); + bool operator() (T output[], const int input[]) override; +private: + T _temp; // contains latticeSpecificHeatCapacity * (tau - 0.5) / tau +}; + +/// functor returns pointwise minimum distance to boundary given by indicators +template +class BlockLatticePhysBoundaryDistance3D final : public BlockLatticeF3D { +private: + BlockGeometryStructure3D& _blockGeometry; + std::shared_ptr> _tmpIndicator = nullptr; + std::vector>> _indicatorList; +public: + BlockLatticePhysBoundaryDistance3D(BlockLatticeStructure3D& blockLattice, + BlockGeometryStructure3D& blockGeometry, + XMLreader const& xmlReader); + bool operator() (T output[], const int input[]) override; +}; + +/// functor returns pointwise pore radius for packings of spheres given by indicators +/// returns NAN for non-pore voxels +template +class BlockLatticePhysPoreSizeDistribution3D final : public BlockLatticeF3D { +private: + BlockGeometryStructure3D& _blockGeometry; + int _material; + std::shared_ptr> _tmpIndicator = nullptr; + std::vector>> _indicatorList; + BlockLatticePhysBoundaryDistance3D _distanceFunctor; + BlockData3D _distanceCache; +public: + BlockLatticePhysPoreSizeDistribution3D(BlockLatticeStructure3D& blockLattice, + BlockGeometryStructure3D& blockGeometry, int material, + XMLreader const& xmlReader); + bool operator() (T output[], const int input[]) override; +}; + +/// functor returns pointwise pore radius for packings of spheres given by indicators +/// returns NAN for non-pore voxels +template +class BlockLatticePhysTauFromBoundaryDistance3D final : public BlockLatticeThermalPhysF3D { +private: + BlockGeometryStructure3D& _blockGeometry; + BlockLatticePhysBoundaryDistance3D _distanceFunctor; + const T _tmp1, _tmp2; +public: + BlockLatticePhysTauFromBoundaryDistance3D(BlockLatticeStructure3D& blockLattice, + BlockGeometryStructure3D& blockGeometry, + XMLreader const& xmlReader, + ThermalUnitConverter const& converter, + const T p, const T T_avg, const T c_p, const T beta, const T lambda_0, const T sigma, const T p_0, const T n_0); + bool operator() (T output[], const int input[]) override; +}; + +/// functor that returns 1 if SmoothIndicatorF A intersects IndicatorF B; otherwise, 0 +template +class BlockLatticeIndicatorSmoothIndicatorIntersection3D final : public BlockLatticeF3D { +private: + BlockGeometryStructure3D& _blockGeometry; + IndicatorF3D& _normalInd; + SmoothIndicatorF3D& _smoothInd; +public: + BlockLatticeIndicatorSmoothIndicatorIntersection3D( + BlockLatticeStructure3D& blockLattice, + BlockGeometryStructure3D& blockGeometry, + IndicatorF3D& normalInd, + SmoothIndicatorF3D& smoothInd ); + bool operator() (T output[], const int input[]) override; +}; + +/// Returns pointwise porosity on local lattices for Guo & Zhao (2002)'s model. +template +class BlockLatticeGuoZhaoEpsilon3D final : public BlockLatticeF3D { +public: + BlockLatticeGuoZhaoEpsilon3D(BlockLatticeStructure3D& blockLattice); + bool operator() (T output[], const int input[]) override; +}; + +/// Returns pointwise porous conductivity on local lattices for Guo & Zhao (2002)'s model. +template +class BlockLatticeGuoZhaoPhysK3D final : public BlockLatticePhysF3D { +public: + BlockLatticeGuoZhaoPhysK3D(BlockLatticeStructure3D& blockLattice, + const UnitConverter& converter); + bool operator() (T output[], const int input[]) override; +}; + +/// Returns pointwise body force on local lattices for Guo & Zhao (2002)'s model. +template +class BlockLatticeGuoZhaoPhysBodyForce3D final : public BlockLatticePhysF3D { +public: + BlockLatticeGuoZhaoPhysBodyForce3D(BlockLatticeStructure3D& blockLattice, + const UnitConverter& converter); + bool operator() (T output[], const int input[]) override; +}; + +/// functor to scale particle distributions to a time step +template +class BlockLatticeTimeStepScale3D final : public BlockLatticeF3D { +private: + T _tau_old; + const UnitConverter& _converter; +public: + BlockLatticeTimeStepScale3D(BlockLatticeStructure3D& blockLattice, + T oldTau, const UnitConverter& converter); + bool operator() (T output[], const int input[]) override; +}; + +} // end namespace olb + +#endif -- cgit v1.2.3