/* This file is part of the OpenLB library
*
* Copyright (C) 2016-2017 Davide Dapelo, Mathias J. Krause
* OpenLB 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
* Specific dynamics classes for Guo and Zhao (2002) porous model, with
* which a Cell object can be instantiated -- generic implementation.
*/
#ifndef LB_GUOZHAO_DYNAMICS_HH
#define LB_GUOZHAO_DYNAMICS_HH
#include
#include
#include "dynamics/dynamics.h"
#include "core/cell.h"
#include "dynamics/guoZhaoLbHelpers.h"
#include "dynamics/firstOrderLbHelpers.h"
#include "dynamics/guoZhaoDynamics.h"
namespace olb {
////////////////////// Class GuoZhaoBGKdynamics /////////////////////////
/** \param omega_ relaxation parameter, related to the dynamic viscosity
* \param momenta_ a Momenta object to know how to compute velocity momenta
*/
template
GuoZhaoBGKdynamics::GuoZhaoBGKdynamics (
T omega, Momenta& momenta )
: BasicDynamics(momenta),
_omega(omega)
{
OLB_PRECONDITION( DESCRIPTOR::template provides() );
_epsilon = (T)1.0; // This to avoid a NaN error at the first timestep.
}
template
T GuoZhaoBGKdynamics::computeEquilibrium(int iPop, T rho, const T u[DESCRIPTOR::d], T uSqr) const
{
return GuoZhaoLbHelpers::equilibrium(iPop, _epsilon, rho, u, uSqr);
}
template
void GuoZhaoBGKdynamics::computeU (Cell const& cell, T u[DESCRIPTOR::d] ) const
{
T rho;
this->_momenta.computeRhoU(cell, rho, u);
for (int iVel=0; iVel()[iVel] / (T)2.;
}
}
template
void GuoZhaoBGKdynamics::computeRhoU (Cell const& cell, T& rho, T u[DESCRIPTOR::d] ) const
{
this->_momenta.computeRhoU(cell, rho, u);
T epsilon = cell.template getFieldPointer()[0];
T nu = cell.template getFieldPointer()[0];
T k = cell.template getFieldPointer()[0];
T Fe = 0.; //1.75/sqrt(150.*pow(epsilon,3));
T c_0 = 0.5*(1 + 0.5*epsilon*nu/k);
T c_1 = 0.5*epsilon*Fe/sqrt(k);
T uMag = 0.;
for (int iDim=0; iDim()[iDim];
}
}
template
void GuoZhaoBGKdynamics::updateEpsilon (Cell& cell)
{
_epsilon = *cell.template getFieldPointer(); //Copying epsilon from
// external to member variable to provide access for computeEquilibrium.
}
template
void GuoZhaoBGKdynamics::collide (
Cell& cell,
LatticeStatistics& statistics )
{
// Copying epsilon from
// external to member variable to provide access for computeEquilibrium.
updateEpsilon(cell);
T rho, u[DESCRIPTOR::d];
this->_momenta.computeRhoU(cell, rho, u);
GuoZhaoLbHelpers::updateGuoZhaoForce(cell, u);
T uSqr = GuoZhaoLbHelpers::bgkCollision(cell, _epsilon, rho, u, _omega);
GuoZhaoLbHelpers::addExternalForce(cell, u, _omega, rho, _epsilon);
statistics.incrementStats(rho, uSqr);
}
template
T GuoZhaoBGKdynamics::getOmega() const
{
return _omega;
}
template
T GuoZhaoBGKdynamics::getEpsilon()
{
return _epsilon;
}
template
void GuoZhaoBGKdynamics::setOmega(T omega)
{
_omega = omega;
}
}
#endif