/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2007-2023 PCOpt/NTUA Copyright (C) 2013-2023 FOSS GP Copyright (C) 2019-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 "RASModelVariables.H" #include "addToRunTimeSelectionTable.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { namespace incompressible { // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // defineTypeNameAndDebug(RASModelVariables, 0); defineRunTimeSelectionTable(RASModelVariables, dictionary); // * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * // void RASModelVariables::allocateInitValues() { if (solverControl_.storeInitValues()) { Info<< "Storing initial values of turbulence variables" << endl; if (hasTMVar1()) { TMVar1InitPtr_.reset ( new volScalarField(TMVar1Inst().name()+"Init", TMVar1Inst()) ); } if (hasTMVar2()) { TMVar2InitPtr_.reset ( new volScalarField(TMVar2Inst().name()+"Init", TMVar2Inst()) ); } if (hasNut()) { nutInitPtr_.reset ( new volScalarField(nutRefInst().name()+"Init", nutRefInst()) ); } } } void RASModelVariables::allocateMeanFields() { if (solverControl_.average()) { Info<< "Allocating mean values of turbulence variables" << endl; if (hasTMVar1()) { TMVar1MeanPtr_.reset ( new volScalarField ( IOobject ( TMVar1Inst().name()+"Mean", mesh_.time().timeName(), mesh_, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE ), TMVar1Inst() ) ); } if (hasTMVar2()) { TMVar2MeanPtr_.reset ( new volScalarField ( IOobject ( TMVar2Inst().name()+"Mean", mesh_.time().timeName(), mesh_, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE ), TMVar2Inst() ) ); } if (hasNut()) { nutMeanPtr_.reset ( new volScalarField ( IOobject ( nutRefInst().name()+"Mean", mesh_.time().timeName(), mesh_, IOobject::READ_IF_PRESENT, IOobject::AUTO_WRITE ), nutRefInst() ) ); } } } Foam::refPtr RASModelVariables::cloneRefPtr(const refPtr& obj) const { if (obj) { const volScalarField& sf = obj(); const word timeName = mesh_.time().timeName(); return refPtr::New(sf.name() + timeName, sf); } return nullptr; } void RASModelVariables::copyAndRename ( volScalarField& f1, volScalarField& f2 ) { f1 == f2; const word name1 = f1.name(); const word name2 = f2.name(); // Extra rename to avoid databese collision f2.rename("temp"); f1.rename(name2); f2.rename(name1); } // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // RASModelVariables::RASModelVariables ( const fvMesh& mesh, const solverControl& SolverControl ) : mesh_(mesh), solverControl_(SolverControl), TMVar1BaseName_(), TMVar2BaseName_(), nutBaseName_("nut"), TMVar1Ptr_(nullptr), TMVar2Ptr_(nullptr), nutPtr_(nullptr), distPtr_(nullptr), TMVar1InitPtr_(nullptr), TMVar2InitPtr_(nullptr), nutInitPtr_(nullptr), TMVar1MeanPtr_(nullptr), TMVar2MeanPtr_(nullptr), nutMeanPtr_(nullptr) {} RASModelVariables::RASModelVariables ( const RASModelVariables& rmv ) : mesh_(rmv.mesh_), solverControl_(rmv.solverControl_), TMVar1BaseName_(rmv.TMVar1BaseName_), TMVar2BaseName_(rmv.TMVar2BaseName_), nutBaseName_(rmv.nutBaseName_), TMVar1Ptr_(cloneRefPtr(rmv.TMVar1Ptr_)), TMVar2Ptr_(cloneRefPtr(rmv.TMVar2Ptr_)), nutPtr_(cloneRefPtr(rmv.nutPtr_)), distPtr_(cloneRefPtr(rmv.distPtr_)), TMVar1InitPtr_(nullptr), TMVar2InitPtr_(nullptr), nutInitPtr_(nullptr), TMVar1MeanPtr_(nullptr), TMVar2MeanPtr_(nullptr), nutMeanPtr_(nullptr) {} autoPtr RASModelVariables::clone() const { return autoPtr::New(*this); } // * * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * // autoPtr RASModelVariables::New ( const fvMesh& mesh, const solverControl& SolverControl ) { const IOdictionary modelDict ( IOobject ( turbulenceModel::propertiesName, mesh.time().constant(), mesh, IOobject::MUST_READ, IOobject::NO_WRITE, IOobject::NO_REGISTER ) ); word modelType("laminar"); // default to laminar const dictionary* dictptr = modelDict.findDict("RAS"); if (dictptr) { // "RASModel" for v2006 and earlier dictptr->readCompat("model", {{"RASModel", -2006}}, modelType); } else { dictptr = &dictionary::null; } Info<< "Creating references for RASModel variables : " << modelType << endl; auto* ctorPtr = dictionaryConstructorTable(modelType); if (!ctorPtr) { FatalIOErrorInLookup ( *dictptr, "RASModelVariables", modelType, *dictionaryConstructorTablePtr_ ) << exit(FatalIOError); } return autoPtr(ctorPtr(mesh, SolverControl)); } // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // tmp RASModelVariables::nutJacobianVar1 ( const singlePhaseTransportModel& laminarTransport ) const { WarningInFunction << "jutJacobianVar1 not implemented for the current turbulence model." << "Returning zero field" << endl; return volScalarField::New ( "nutJacobianVar1", IOobject::NO_REGISTER, mesh_, dimensionedScalar(dimless, Zero) ); } tmp RASModelVariables::nutJacobianVar2 ( const singlePhaseTransportModel& laminarTransport ) const { WarningInFunction << "nutJacobianVar2 not implemented for the current turbulence model." << "Returning zero field" << endl; return volScalarField::New ( "nutJacobianVar2", IOobject::NO_REGISTER, mesh_, dimensionedScalar(dimless, Zero) ); } void RASModelVariables::restoreInitValues() { if (solverControl_.storeInitValues()) { if (hasTMVar1()) { TMVar1Inst() == TMVar1InitPtr_(); } if (hasTMVar2()) { TMVar2Inst() == TMVar2InitPtr_(); } if (hasNut()) { nutRefInst() == nutInitPtr_(); } } } void RASModelVariables::resetMeanFields() { if (solverControl_.average()) { Info<< "Resetting mean turbulent fields to zero" << endl; // Reset fields to zero if (TMVar1MeanPtr_) { TMVar1MeanPtr_.ref() == dimensionedScalar(TMVar1Inst().dimensions(), Zero); } if (TMVar2MeanPtr_) { TMVar2MeanPtr_.ref() == dimensionedScalar(TMVar2Inst().dimensions(), Zero); } if (nutMeanPtr_) { nutMeanPtr_.ref() == dimensionedScalar(nutRefInst().dimensions(), Zero); } } } void RASModelVariables::computeMeanFields() { if (solverControl_.doAverageIter()) { const label iAverageIter = solverControl_.averageIter(); const scalar avIter(iAverageIter); const scalar oneOverItP1 = 1./(avIter + 1); const scalar mult = avIter*oneOverItP1; if (hasTMVar1()) { TMVar1MeanPtr_.ref() == (TMVar1MeanPtr_()*mult + TMVar1Inst()*oneOverItP1); } if (hasTMVar2()) { TMVar2MeanPtr_.ref() == (TMVar2MeanPtr_()*mult + TMVar2Inst()*oneOverItP1); } if (hasNut()) { nutMeanPtr_.ref() == (nutMeanPtr_()*mult + nutRefInst()*oneOverItP1); } } } tmp RASModelVariables::devReff ( const singlePhaseTransportModel& laminarTransport, const volVectorField& U ) const { return volSymmTensorField::New ( "devRhoReff", IOobject::NO_REGISTER, - (laminarTransport.nu() + nut())*devTwoSymm(fvc::grad(U)) ); } void RASModelVariables::correctBoundaryConditions ( const incompressible::turbulenceModel& turbulence ) { if (hasTMVar1()) { TMVar1Inst().correctBoundaryConditions(); if (solverControl_.average()) { TMVar1MeanPtr_.ref().correctBoundaryConditions(); } } if (hasTMVar2()) { TMVar2Inst().correctBoundaryConditions(); if (solverControl_.average()) { TMVar2MeanPtr_.ref().correctBoundaryConditions(); } } if (hasNut()) { nutRefInst().correctBoundaryConditions(); if (solverControl_.average()) { nutMeanPtr_.ref().correctBoundaryConditions(); } } } void RASModelVariables::transfer(RASModelVariables& rmv) { if (rmv.hasTMVar1() && hasTMVar1()) { copyAndRename(TMVar1Inst(), rmv.TMVar1Inst()); } if (rmv.hasTMVar2() && hasTMVar2()) { copyAndRename(TMVar2Inst(), rmv.TMVar2Inst()); } if (rmv.hasNut() && hasNut()) { copyAndRename(nutRefInst(), rmv.nutRefInst()); } if (rmv.hasDist() && hasDist()) { copyAndRename(d(), rmv.d()); } } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace incompressible } // End namespace Foam // ************************************************************************* //