/* Lattice Boltzmann sample, written in C++, using the OpenLB * library * * Copyright (C) 2019 Davide Dapelo * 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. */ /* Helper functionals for Lagrangian two-way coupling methods -- header file. */ #ifndef LB_TWO_WAY_HELPER_FUNCTIONALS_H #define LB_TWO_WAY_HELPER_FUNCTIONALS_H #include "functors/lattice/reductionF3D.h" namespace olb { /** Data structure for smoothing functionals. * Stores the lattice position of a cell within smoothing kernel length * and the related multiplicative weight. */ template struct LatticePosAndWeight { int globic = 0; int latticePos[3] = {0, 0, 0}; T weight = T(); }; /** Abstract class for particle Reynolds number computation within drag model. * Its raison d'etre consists of not being templetized in Lattice. */ template class Particle> class ParticleReynoldsNumber { public: /// Returns the particle Reynolds number. globicFull = { globic, latticeRoundedP[0, ..., 2] } virtual T operator() (Particle* p, T magU, int globicFull[])=0; /// Destructor virtual ~ParticleReynoldsNumber() {}; protected: T _RePmin = 0.01; }; /** Abstract class for particle Reynolds number computation within drag model. */ template class Particle> class ParticleReynoldsNumberBase : public ParticleReynoldsNumber { public: /// Destructor virtual ~ParticleReynoldsNumberBase() {}; protected: /// Constructor ParticleReynoldsNumberBase(UnitConverter& converter); UnitConverter& _converter; // reference to a UnitConverter }; /** Class class for Newtonian particle Reynolds number computation within drag model. */ template class Particle> class NewtonianParticleReynoldsNumber: public ParticleReynoldsNumberBase { public: /// Constructor NewtonianParticleReynoldsNumber(UnitConverter& converter); /// Destructor ~NewtonianParticleReynoldsNumber() {}; /// Returns the particle Reynolds number. globicFull = { globic, latticeRoundedP[0, ..., 2] } virtual T operator() (Particle* p, T magU, int globicFull[]) override; }; /** Class class for power-law particle Reynolds number computation within drag model. */ template class Particle> class PowerLawParticleReynoldsNumber: public ParticleReynoldsNumberBase { public: /// Constructor PowerLawParticleReynoldsNumber ( UnitConverter& converter, SuperLattice3D& sLattice ); /// Destructor ~PowerLawParticleReynoldsNumber() {}; /// Returns the particle Reynolds number. globicFull = { globic, latticeRoundedP[0, ..., 2] } virtual T operator() (Particle* p, T magU, int globicFull[]) override; protected: SuperLattice3D& _sLattice; // reference to a lattice }; /** Abstact class for all the local forward-coupling models, * viz., momentum coupling from fluid to particle. * Input parameters in attice units. */ template class TwoWayHelperFunctional { public: /// Computes the momentum transfer from fluid to particle. virtual bool operator() ( T gF[], T latticeVelF[], T latticeVelP[], T physPosP[], int latticeRoundedP[], int globic )=0; virtual ~TwoWayHelperFunctional(); protected: /// Constructor TwoWayHelperFunctional ( UnitConverter& converter, SuperLattice3D& sLattice ); UnitConverter& _converter; // reference to a UnitConverter SuperLattice3D& _sLattice; // reference to a lattice std::shared_ptr > _interpLatticeDensity; std::shared_ptr > _interpLatticeVelocity ; }; /** Naive way */ template class NaiveMomentumExchange : public TwoWayHelperFunctional { public: /// Constructor NaiveMomentumExchange ( UnitConverter& converter, SuperLattice3D& sLattice, std::shared_ptr > interpLatticeDensity ); /// Computes the momentum transfer from fluid to particle. virtual bool operator() ( T gF[], T latticeVelF[], T latticeVelP[], T physPosP[], int latticeRoundedP[], int globic ) override; }; /** Using Ladd mechanism */ template class LaddMomentumExchange : public TwoWayHelperFunctional { public: /// Constructor LaddMomentumExchange ( UnitConverter& converter, SuperLattice3D& sLattice, std::shared_ptr > interpLatticeDensity, std::shared_ptr > interpLatticeVelocity ); /// Computes the momentum transfer from fluid to particle. virtual bool operator() ( T gF[], T latticeVelF[], T latticeVelP[], T physPosP[], int latticeRoundedP[], int globic ) override; }; /** Abstact class for all the smoothing functionals. */ template class SmoothingFunctional { public: // Returns the size of _latticePosAndWeight int getSize(); // Returns the lattice position of the i-th element of _latticePosAndWeight void getLatticePos(int latticePos[], int i); // Returns the globic of the i-th element of _latticePosAndWeight int getGlobic(int i); // Returns the weight relative to the i-th element of _latticePosAndWeight T getWeight(int i); // Rebuilds _latticePosAndWeight with the new cells within _kernelLength from the bubble's position bool update(T physPosP[], int globic); protected: /// Constructor SmoothingFunctional(T kernelLength, UnitConverter& converter, SuperLattice3D& sLattice); /// The actual smoothing function virtual T smoothingFunction(T delta)=0; /// Returns the weight for smoothing. virtual T compute(T physPosP[], T physPosL[])=0; T _kernelLength; // Kernel's smoothing length. UnitConverter& _converter; // reference to a UnitConverter SuperLattice3D& _sLattice; // reference to a lattice // positions and weights of the cells within _kernelLength from bubble's position std::deque > _latticePosAndWeight; }; /** Abstact class for all the linear-averaging smoothing functionals. */ template class LinearAveragingSmoothingFunctional : public SmoothingFunctional { protected: /// Constructor LinearAveragingSmoothingFunctional(T kernelLength, UnitConverter& converter, SuperLattice3D& sLattice); /// Returns the weight for smoothing. virtual T compute(T physPosP[], T physPosL[]) override; }; /** Abstact class for all the volume-averaging smoothing functionals. */ template class VolumeAveragingSmoothingFunctional : public SmoothingFunctional { protected: /// Constructor VolumeAveragingSmoothingFunctional(T kernelLength, UnitConverter& converter, SuperLattice3D& sLattice); /// Returns the weight for smoothing. virtual T compute(T physPosP[], T physPosL[]) override; }; /** Smoothing functional as in Deen et al (2004), Chem. Eng. Sci 59. */ template class DeenSmoothingFunctional : public LinearAveragingSmoothingFunctional { public: /// Constructor DeenSmoothingFunctional(T kernelLength, UnitConverter& converter, SuperLattice3D& sLattice); protected: /// The actual smoothing function virtual T smoothingFunction(T delta) override; }; /** Stepwise smoothing functional. */ template class StepSmoothingFunctional : public VolumeAveragingSmoothingFunctional { public: /// Constructor StepSmoothingFunctional(T kernelLength, UnitConverter& converter, SuperLattice3D& sLattice); protected: /// The actual smoothing function virtual T smoothingFunction(T delta) override; }; } #endif