/* This file is part of the OpenLB library * * Copyright (C) 2012-2015 Mathias J. Krause, Jonas Latt, Patrick Nathen * 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. */ /** \file * BGK Dynamics with adjusted omega -- header file. */ #ifndef SMAGORINSKY_BGK_DYNAMICS_H #define SMAGORINSKY_BGK_DYNAMICS_H #include "dynamics/dynamics.h" #include "core/cell.h" #include // For shear kalman Smagorinsky - Populations namespace olb { /// Interface for the Large-Eddy-Simulation dynamics classes template struct LESDynamics { /// Destructor: virtual to enable inheritance virtual ~LESDynamics() { } /// Get local effective relaxation parameter of the dynamics virtual T getEffectiveOmega(Cell& cell_) =0; }; /// Implementation of Smagorinsky Dynamics template class SmagorinskyDynamics : public LESDynamics { public: /// Constructor SmagorinskyDynamics(T smagoConst_); /// get the constant preFactor variable used to speed up calculations virtual T getPreFactor(); private: /// Smagorinsky constant T smagoConst; protected: /// get the Smagorinsky constant virtual T getSmagoConst(); /// Compute constant prefactor variable in order to speed up the computation virtual T computePreFactor(); /// Precomputed constant which speeeds up the computation T preFactor; }; /// Implementation of the Smagorinsky BGK collision step template class SmagorinskyBGKdynamics : public SmagorinskyDynamics, public BGKdynamics { public: /// Constructor SmagorinskyBGKdynamics(T omega_, Momenta& momenta_, T smagoConst_); /// Collision step void collide(Cell& cell, LatticeStatistics& statistics_) override; /// Get local smagorinsky relaxation parameter of the dynamics T getEffectiveOmega(Cell& cell_) override; protected: /// Computes the local smagorinsky relaxation parameter virtual T computeEffectiveOmega(Cell& cell); }; /// Implementation of the ForcedBGK collision step template class SmagorinskyForcedBGKdynamics : public SmagorinskyDynamics, public ForcedBGKdynamics { public: /// Constructor SmagorinskyForcedBGKdynamics(T omega_, Momenta& momenta_, T smagoConst_); /// Collision step virtual void collide(Cell& cell, LatticeStatistics& statistics_) override; /// Get local smagorinsky relaxation parameter of the dynamics virtual T getEffectiveOmega(Cell& cell_) override; protected: /// Computes the local smagorinsky relaxation parameter virtual T computeEffectiveOmega(Cell& cell_); }; /// Implementation of a LES BGK with non local effective tau calculation through external field template class ExternalTauEffLESBGKdynamics : public SmagorinskyBGKdynamics { public: /// Constructor ExternalTauEffLESBGKdynamics(T omega_, Momenta& momenta_, T smagoConst_ = (T)0); /// Collision step void collide(Cell& cell, LatticeStatistics& statistics_) override; }; /// Implementation of a LES ForcedBGK with non local effective tau calculation through external field template class ExternalTauEffLESForcedBGKdynamics : public SmagorinskyForcedBGKdynamics { public: /// Constructor ExternalTauEffLESForcedBGKdynamics(T omega_, Momenta& momenta_, T smagoConst_ = (T)0); /// Collision step void collide(Cell& cell, LatticeStatistics& statistics_) override; }; /// Implementation of the consistent Strain Smagorinsky BGK collision step /// /// Consistent subgrid scale modelling for lattice Boltzmann methods /// Orestis Malaspinas and Pierre Sagaut /// Journal of Fluid Mechanics / Volume / June 2012, pp 514-542 /// DOI: http://dx.doi.org/10.1017/jfm.2012.155 template class ConStrainSmagorinskyBGKdynamics : public SmagorinskyBGKdynamics { public: /// Constructor ConStrainSmagorinskyBGKdynamics(T omega_, Momenta& momenta_, T smagoConst_=T(.1)); protected: /// Computes the local smagorinsky relaxation parameter T computeEffectiveOmega(Cell& cell_); }; /// Implementation of the consistent Smagorinsky BGK collision step /// /// Consistent subgrid scale modelling for lattice Boltzmann methods /// Orestis Malaspinas and Pierre Sagaut /// Journal of Fluid Mechanics / Volume / June 2012, pp 514-542 /// DOI: http://dx.doi.org/10.1017/jfm.2012.155 template class ConSmagorinskyBGKdynamics : public SmagorinskyBGKdynamics { public: /// Constructor ConSmagorinskyBGKdynamics(T omega_, Momenta& momenta_, T smagoConst_); protected: /// should be remove --> David T computeEffectiveOmega(Cell& cell_); }; /// Implementation of a the dynamic Smarorinsky BGK collision step template class DynSmagorinskyBGKdynamics : public SmagorinskyBGKdynamics { public: /// Constructor DynSmagorinskyBGKdynamics(T omega_, Momenta& momenta_); protected: /// Computes the local smagorinsky relaxation parameter T computeEffectiveOmega(Cell& cell); }; /// Implementation of the ADM BGK collision step /*template class ADMBGKdynamics : public BGKdynamics { public: /// Constructor ADMBGKdynamics(T omega_, Momenta& momenta_); /// Collision step virtual void collide(Cell& cell, LatticeStatistics& statistics_); private: T omega; };*/ /// Implementation of the ForcedADMBGK collision step template class ForcedADMBGKdynamics : public BGKdynamics { public: /// Constructor ForcedADMBGKdynamics(T omega_, Momenta& momenta_); /// Collision step virtual void collide(Cell& cell, LatticeStatistics& statistics_); private: T omega; }; /// Implementation of a Shear Smarorinsky BGK collision step /// Shown good results for wall-bounded flows /// Leveque et al.: Shear-Improved Smagorinsky Model for Large-Eddy Simulation /// of Wall-Bounded Turbulent Flows /// DOI: http://dx.doi.org/10.1017/S0022112006003429 template class ShearSmagorinskyBGKdynamics : public SmagorinskyBGKdynamics { public: /// Constructor ShearSmagorinskyBGKdynamics(T omega_, Momenta& momenta_, T smagoConst_); /// Collision step virtual void collide(Cell& cell, LatticeStatistics& statistics_); /// Get Effective Omega stored in a external field virtual T getEffectiveOmega(Cell& cell); protected: /// Computes the local smagorinsky relaxation parameter T computeEffectiveOmega(Cell& cell, int iT); /// The external field variables' positions }; /// Implementation of the ForcedBGK collision step template class ShearSmagorinskyForcedBGKdynamics : public SmagorinskyForcedBGKdynamics { public: /// Constructor ShearSmagorinskyForcedBGKdynamics(T omega_, Momenta& momenta_, T smagoConst_); /// Collision step virtual void collide(Cell& cell, LatticeStatistics& statistics_); /// Get Effective Omega stored in a external field virtual T getEffectiveOmega(Cell& cell); protected: /// Computes the local smagorinsky relaxation parameter T computeEffectiveOmega(Cell& cell, int iT); // Define current time step /// Smagorinsky constant }; /// Implementation of the ForcedBGK collision step template class SmagorinskyLinearVelocityForcedBGKdynamics : public SmagorinskyForcedBGKdynamics { public: /// Constructor SmagorinskyLinearVelocityForcedBGKdynamics(T omega_, Momenta& momenta_, T smagoConst_); /// Collision step virtual void collide(Cell& cell, LatticeStatistics& statistics_); }; /// Implementation of the BGK collision step template class KrauseBGKdynamics : public SmagorinskyBGKdynamics { public: /// Constructor KrauseBGKdynamics(T omega_, Momenta& momenta_, T smagoConst_); /// Collision step void collide(Cell& cell, LatticeStatistics& statistics_) override; /// Get local smagorinsky relaxation parameter of the dynamics T getEffectiveOmega(Cell& cell_) override; private: /// Computes a constant prefactor in order to speed up the computation T computePreFactor() override; /// Computes the local smagorinsky relaxation parameter void computeEffectiveOmega(T omega0, Cell& cell, T preFactor_, T rho, T u[DESCRIPTOR::d], T newOmega[DESCRIPTOR::q]); T preFactor; }; /// Implementation of the BGK collision step template class WALEBGKdynamics : public SmagorinskyBGKdynamics { public: /// Constructor WALEBGKdynamics(T omega_, Momenta& momenta_, T smagoConst_); protected: /// Computes a constant prefactor in order to speed up the computation T computePreFactor() override; /// Computes the local smagorinsky relaxation parameter T computeEffectiveOmega(Cell& cell_) override; }; /// Implementation of the BGK collision step template class WALEForcedBGKdynamics : public SmagorinskyForcedBGKdynamics { public: /// Constructor WALEForcedBGKdynamics(T omega_, Momenta& momenta_, T smagoConst_); protected: /// Computes a constant prefactor in order to speed up the computation T computePreFactor() override; /// Computes the local smagorinsky relaxation parameter T computeEffectiveOmega(Cell& cell_) override; }; /// Implementation of the BGK collision step template class FDKalmanShearSmagorinskyBGKdynamics : public SmagorinskyBGKdynamics { public: /// Constructor FDKalmanShearSmagorinskyBGKdynamics(T omega_, Momenta& momenta_, T smagoConst_, T u_char_lat, T f_char_lat); /// Get local effective relaxation parameter of the dynamics virtual T getEffectiveOmega(Cell& cell_); protected: /// Computes a constant prefactor in order to speed up the computation virtual T computePreFactor(); /// Computes the local smagorinsky relaxation parameter virtual T computeOmega(Cell& cell_); // The variance of increment of kalman filtered velocity T VarInVelKal; T UCharLat; private: void computeNormStrainRate(Cell& cell, T& NormStrainRate); void KalmanStep(Cell& cell); }; //////////////////////////////////////////////////////////////////////////////// /// Implementation of a Shear Smarorinsky BGK collision step with Kalman Filter // /// Leveque et al.: Shear-Improved Smagorinsky Model for Large-Eddy Simulation /// of Wall-Bounded Turbulent Flows /// /// Boudet et al. (2016) A Kalman filter adapted of the estimation of mean gradients // in the a large-eddy simulation of unsteady turbulent flows. template class ShearKalmanSmagorinskyBGKdynamics : public SmagorinskyBGKdynamics { public: /// Constructor ShearKalmanSmagorinskyBGKdynamics(T omega_, Momenta& momenta_, T smagoConst_, T u_char_lat, T f_char_lat); /// Get local effective relaxation parameter of the dynamics virtual T getEffectiveOmega(Cell& cell_); protected: /// Computes the local smagorinsky relaxation parameter T computeEffectiveOmega(Cell& cell_); private: /// Updates the filtered velocity with a Kalman procedure void KalmanStep(Cell& cell); /// Computes the kalman filtered velocity and strain rate using the filtered population stored in a externa field void computeKalmanUStress(Cell& cell, T (&KalmanU)[DESCRIPTOR::d], T (&KalmanPi)[util::TensorVal::n]); /// Computes The Kalman filtered velocity using the filtered populations stored in a external field void computeKalmanU(Cell& cell, T (&KalmanU)[DESCRIPTOR::d]); /// Computes the Kalman filtered strain rate using the filtered populations stored in a external field void computeKalmanStress(Cell& cell, T (&KalmanU)[DESCRIPTOR::d], T (&KalmanPi)[util::TensorVal::n]); /// Computes instantaneous tau_sgs and update kalman tau_sgs void computeAndupdateTauSgs(Cell& cell, T rho, T pi[util::TensorVal::n], T KalmanPiNeqN[util::TensorVal::n], T KalmanPiNeqN1[util::TensorVal::n], T K, T &tau_sgs); /// Methods to compute the square Norm of second order moment non-quilibrium distribution function void computeNormSOM(T pi[util::TensorVal::n], T &piNorm); void computeNormSOM(T pi1[util::TensorVal::n], T pi2[util::TensorVal::n], T rho, T &piNorm); void computeNormSOM(T pi[util::TensorVal::n], T rho, T &piNorm); /// Compute the instantaneous tau_sgs void computeTauSgs(Cell& cell, T rho, T KalmanPiNeqNormSqr, T KalmanInstPiNeqNormSqr, T PiNeqNormSqr, T K, T &tau_sgs); void computeRoots4thPoly(T A, T B, T C, T D, T E, std::complex (&Roots)[4]); // Update the local kalman tau_sgs stored in a external field void updateTauSgsKalman(Cell& cell, T NN, T Nn1, T n1n1, T N1N1, T K, T tau_sgs_n1); // The variance of increment of kalman filtered velocity T VarInVelKal; T UCharLat; }; } #endif