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/dynamics/porousBGKdynamics.h | 273 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 273 insertions(+)
 create mode 100644 src/dynamics/porousBGKdynamics.h
(limited to 'src/dynamics/porousBGKdynamics.h')
diff --git a/src/dynamics/porousBGKdynamics.h b/src/dynamics/porousBGKdynamics.h
new file mode 100644
index 0000000..f0f3347
--- /dev/null
+++ b/src/dynamics/porousBGKdynamics.h
@@ -0,0 +1,273 @@
+/*  This file is part of the OpenLB library
+ *
+ *  Copyright (C) 2012 Lukas Baron, Mathias J. Krause, Jonas Latt
+ *  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 for porous media -- header file.
+ */
+#ifndef POROUS_BGK_DYNAMICS_H
+#define POROUS_BGK_DYNAMICS_H
+
+#include "dynamics/dynamics.h"
+#include "core/cell.h"
+
+namespace olb {
+
+/// Implementation of the BGK collision step for a porosity model
+template
+class PorousBGKdynamics : public BGKdynamics {
+public:
+  /// Constructor
+  PorousBGKdynamics(T omega_, Momenta& momenta_);
+
+  /// Collision step
+  virtual void collide(Cell& cell,
+                       LatticeStatistics& statistics_);
+
+  /// get relaxation parameter
+  T    getOmega() const;
+  /// set relaxation parameter
+  void setOmega(T omega_);
+
+
+private:
+  T omega;      ///< relaxation parameter
+};
+
+/// Implementation of the BGK collision step for a porosity model enabling
+/// drag computation
+template
+class ExtendedPorousBGKdynamics : public BGKdynamics {
+public:
+  /// Constructor
+  ExtendedPorousBGKdynamics(T omega_, Momenta& momenta_);
+  /// extended Collision step, computes local drag in a given direction
+  virtual void collide(Cell& cell,
+                       LatticeStatistics& statistics_);
+  /// get relaxation parameter
+  T    getOmega() const;
+  /// set relaxation parameter
+  void setOmega(T omega_);
+
+
+private:
+  T omega;      ///< relaxation parameter
+};
+
+/// Implementation of the BGK collision step for subgridscale particles
+template
+class SubgridParticleBGKdynamics : public BGKdynamics {
+public:
+  /// Constructor
+  SubgridParticleBGKdynamics(T omega_, Momenta& momenta_);
+  /// extended Collision step, computes local drag in a given direction
+  virtual void collide(Cell& cell,
+                       LatticeStatistics& statistics_);
+  /// get relaxation parameter
+  T    getOmega() const;
+  /// set relaxation parameter
+  void setOmega(T omega_);
+
+
+private:
+  T omega;      ///< relaxation parameter
+  T _fieldTmp[4];
+};
+
+/* Implementation of the BGK collision for moving porous media (HLBM approach).
+ * As this scheme requires additionla data stored in an external field, 
+ * it is meant to be used along with a PorousParticle descriptor.
+ * \param omega Lattice relaxation frequency
+ * \param momenta A standard object for the momenta computation
+ */
+template
+class PorousParticleBGKdynamics : public BGKdynamics {
+public:
+  /// Constructor
+  PorousParticleBGKdynamics(T omega_, Momenta& momenta_);
+  /// extended Collision step, computes local drag in a given direction
+  virtual void collide(Cell& cell,
+                       LatticeStatistics& statistics_);
+  /// get relaxation parameter
+  T    getOmega() const;
+  /// set relaxation parameter
+  void setOmega(T omega_);
+
+
+private:
+  T omega;      ///< relaxation parameter
+  /// This structure is used to emulate a "static if" to switch between static and
+  /// dynamic case. It can be replaced by a "constexpr if" when switching to C++17
+  /// standard.
+  template struct effectiveVelocity {
+      static void calculate(T* pExternal, T* pVelocity);
+  };
+};
+
+/// Implementation of the HBGK collision step for a porosity model enabling
+/// drag computation for many particles
+/// including the Krause turbulence modell
+
+template
+class KrauseHBGKdynamics : public BGKdynamics {
+public:
+  /// Constructor
+  KrauseHBGKdynamics(T omega_, Momenta& momenta_, T smagoConst_, T dx_ = 1, T dt_ = 1);
+  /// extended Collision step, computes local drag in a given direction
+  virtual void collide(Cell& cell,
+                       LatticeStatistics& statistics_);
+  /// get relaxation parameter
+  T    getOmega() const;
+  /// set relaxation parameter
+  void setOmega(T omega_);
+
+
+private:
+  /// Computes a constant prefactor in order to speed up the computation
+  T computePreFactor(T omega_, T smagoConst_);
+  /// Computes the local smagorinsky relaxation parameter
+  void computeOmega(T omega0_, Cell& cell, T preFactor_, T rho_,
+                    T u[DESCRIPTOR::d],
+                    T newOmega[DESCRIPTOR::q] );
+
+private:
+
+  T omega;      ///< relaxation parameter
+  /// effective collision time based upon Smagorisnky approach
+  T tau_eff;
+  /// Smagorinsky constant
+  T smagoConst;
+  /// Precomputed constant which speeeds up the computation
+  T preFactor;
+  T dx;
+  T dt;
+
+  T _fieldTmp[4];
+
+};
+
+/// Implementation of the BGK collision step for a porosity model enabling
+/// drag computation
+template
+class ParticlePorousBGKdynamics : public BGKdynamics {
+public:
+  /// Constructor
+  ParticlePorousBGKdynamics(T omega_, Momenta& momenta_);
+  /// extended Collision step, computes local drag in a given direction
+  virtual void collide(Cell& cell,
+                       LatticeStatistics& statistics_);
+  /// get relaxation parameter
+  T    getOmega() const;
+  /// set relaxation parameter
+  void setOmega(T omega_);
+
+
+private:
+  T omega;      ///< relaxation parameter
+};
+
+/// Implementation of the BGK collision step for a small particles enabling
+/// two way coupling
+template
+class SmallParticleBGKdynamics : public BGKdynamics {
+public:
+  /// Constructor
+  SmallParticleBGKdynamics(T omega_, Momenta& momenta_);
+  /// extended Collision step, computes local drag in a given direction
+  virtual void collide(Cell& cell,
+                       LatticeStatistics& statistics_);
+  /// get relaxation parameter
+  T    getOmega() const;
+  /// set relaxation parameter
+  void setOmega(T omega_);
+
+
+private:
+  T omega;      ///< relaxation parameter
+};
+
+
+enum Mode {M2, M3};
+
+/// Implementation of the Partially Saturated Method (PSM),
+/// see Krüger, Timm, et al. The Lattice Boltzmann Method. Springer, 2017. (p.447-451)
+template
+class PSMBGKdynamics : public BGKdynamics {
+public:
+  /// Constructor
+  PSMBGKdynamics(T omega_, Momenta& momenta_, int mode_=0);
+  ///  Compute fluid velocity on the cell.
+  void computeU (
+    Cell const& cell,
+    T u[DESCRIPTOR::d] ) const override;
+  /// Compute fluid velocity and particle density on the cell.
+  void computeRhoU (
+    Cell const& cell,
+    T& rho, T u[DESCRIPTOR::d]) const override;
+  /// Collision step
+  void collide(Cell& cell,
+                       LatticeStatistics& statistics_) override;
+  /// get relaxation parameter
+  T    getOmega() const;
+  /// set relaxation parameter
+  void setOmega(T omega_);
+
+
+private:
+  T omega;      ///< relaxation parameter
+  T paramA;      /// speed up parameter
+  Mode mode;
+};
+
+/// Implementation of the Partially Saturated Method (PSM),
+/// see Krüger, Timm, et al. The Lattice Boltzmann Method. Springer, 2017. (p.447-451)
+template
+class ForcedPSMBGKdynamics : public ForcedBGKdynamics {
+public:
+  /// Constructor
+  ForcedPSMBGKdynamics(T omega_, Momenta& momenta_, int mode_=0);
+  ///  Compute fluid velocity on the cell.
+  void computeU (
+    Cell const& cell,
+    T u[DESCRIPTOR::d] ) const override;
+  /// Compute fluid velocity and particle density on the cell.
+  void computeRhoU (
+    Cell const& cell,
+    T& rho, T u[DESCRIPTOR::d]) const override;
+  /// Collision step
+  void collide(Cell& cell,
+                       LatticeStatistics& statistics_) override;
+  /// get relaxation parameter
+  T    getOmega() const;
+  /// set relaxation parameter
+  void setOmega(T omega_);
+
+
+private:
+  T omega;      ///< relaxation parameter
+  T paramA;      /// speed up parameter
+  Mode mode;
+};
+
+} // olb
+
+#endif
-- 
cgit v1.2.3