/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2013-2017 OpenFOAM Foundation Copyright (C) 2020-2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. OpenFOAM 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 3 of the License, or (at your option) any later version. OpenFOAM 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 OpenFOAM. If not, see . \*---------------------------------------------------------------------------*/ #include "Explicit.H" // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // template Foam::PackingModels::Explicit::Explicit ( const dictionary& dict, CloudType& owner ) : PackingModel(dict, owner, typeName), stressAverage_(nullptr), correctionLimiting_ ( CorrectionLimitingMethod::New ( this->coeffDict().subDict(CorrectionLimitingMethod::typeName) ) ) {} template Foam::PackingModels::Explicit::Explicit ( const Explicit& cm ) : PackingModel(cm), stressAverage_(cm.stressAverage_->clone()), correctionLimiting_ ( cm.correctionLimiting_->clone() ) {} // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // template Foam::PackingModels::Explicit::~Explicit() {} // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // template void Foam::PackingModels::Explicit::cacheFields(const bool store) { PackingModel::cacheFields(store); if (store) { const fvMesh& mesh = this->owner().mesh(); const word& cloudName = this->owner().name(); const auto& volumeAverage = mesh.lookupObject> ( IOobject::scopedName(cloudName, "volumeAverage") ); const auto& rhoAverage = mesh.lookupObject> ( IOobject::scopedName(cloudName, "rhoAverage") ); const auto& uAverage = mesh.lookupObject> ( IOobject::scopedName(cloudName, "uAverage") ); const auto& uSqrAverage = mesh.lookupObject> ( IOobject::scopedName(cloudName, "uSqrAverage") ); volumeAverage_ = &volumeAverage; uAverage_ = &uAverage; stressAverage_.reset ( AveragingMethod::New ( IOobject ( IOobject::scopedName(cloudName, "stressAverage"), this->owner().db().time().timeName(), mesh ), this->owner().solution().dict(), mesh ).ptr() ); stressAverage_() = this->particleStressModel_->tau ( *volumeAverage_, rhoAverage, uSqrAverage )(); } else { volumeAverage_ = nullptr; uAverage_ = nullptr; stressAverage_.clear(); } } template Foam::vector Foam::PackingModels::Explicit::velocityCorrection ( typename CloudType::parcelType& p, const scalar deltaT ) const { const tetIndices tetIs(p.currentTetIndices()); // interpolated quantities const scalar alpha = this->volumeAverage_->interpolate(p.coordinates(), tetIs); const vector alphaGrad = this->volumeAverage_->interpolateGrad(p.coordinates(), tetIs); const vector uMean = this->uAverage_->interpolate(p.coordinates(), tetIs); // stress gradient const vector tauGrad = stressAverage_->interpolateGrad(p.coordinates(), tetIs); // parcel relative velocity const vector uRelative = p.U() - uMean; // correction velocity vector dU = Zero; //// existing forces //const scalar Re = p.Re(td); //const typename CloudType::forceType& forces = this->owner().forces(); //const forceSuSp F = // forces.calcCoupled(p, td, deltaT, p.mass(), Re, td.muc()) // + forces.calcNonCoupled(p, td, deltaT, p.mass(), Re, td.muc()); // correction velocity if ((uRelative & alphaGrad) > 0) { dU = - deltaT*tauGrad/(p.rho()*(alpha + SMALL)/* + deltaT*F.Sp()*/); } // apply the velocity limiters return correctionLimiting_->limitedVelocity ( p.U(), dU, uMean ); } // ************************************************************************* //