/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2012 OpenFOAM Foundation
Copyright (C) 2021 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 "mixedEnergyFvPatchScalarField.H"
#include "addToRunTimeSelectionTable.H"
#include "fvPatchFieldMapper.H"
#include "volFields.H"
#include "basicThermo.H"
#include "fvMatrix.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::mixedEnergyFvPatchScalarField::
mixedEnergyFvPatchScalarField
(
const fvPatch& p,
const DimensionedField& iF
)
:
mixedFvPatchScalarField(p, iF)
{
valueFraction() = 0.0;
refValue() = Zero;
refGrad() = Zero;
source() = 0.0;
}
Foam::mixedEnergyFvPatchScalarField::
mixedEnergyFvPatchScalarField
(
const mixedEnergyFvPatchScalarField& ptf,
const fvPatch& p,
const DimensionedField& iF,
const fvPatchFieldMapper& mapper
)
:
mixedFvPatchScalarField(ptf, p, iF, mapper)
{}
Foam::mixedEnergyFvPatchScalarField::
mixedEnergyFvPatchScalarField
(
const fvPatch& p,
const DimensionedField& iF,
const dictionary& dict
)
:
mixedFvPatchScalarField(p, iF, dict)
{}
Foam::mixedEnergyFvPatchScalarField::
mixedEnergyFvPatchScalarField
(
const mixedEnergyFvPatchScalarField& tppsf
)
:
mixedFvPatchScalarField(tppsf)
{}
Foam::mixedEnergyFvPatchScalarField::
mixedEnergyFvPatchScalarField
(
const mixedEnergyFvPatchScalarField& tppsf,
const DimensionedField& iF
)
:
mixedFvPatchScalarField(tppsf, iF)
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void Foam::mixedEnergyFvPatchScalarField::updateCoeffs()
{
if (updated())
{
return;
}
const basicThermo& thermo = basicThermo::lookupThermo(*this);
const label patchi = patch().index();
const scalarField& pw = thermo.p().boundaryField()[patchi];
mixedFvPatchScalarField& Tw = refCast
(
const_cast(thermo.T().boundaryField()[patchi])
);
Tw.evaluate();
valueFraction() = Tw.valueFraction();
refValue() = thermo.he(pw, Tw.refValue(), patchi);
refGrad() =
thermo.Cpv(pw, Tw, patchi)*Tw.refGrad()
+ patch().deltaCoeffs()*
(
thermo.he(pw, Tw, patchi)
- thermo.he(pw, Tw, patch().faceCells())
);
mixedFvPatchScalarField::updateCoeffs();
}
void Foam::mixedEnergyFvPatchScalarField::manipulateMatrix
(
fvMatrix& matrix,
const label mat,
const direction cmpt
)
{
const basicThermo& thermo = basicThermo::lookupThermo(*this);
label index = this->patch().index();
const label nbrPatchId = this->patch().patch().neighbPolyPatchID();
const label globalPatchID =
matrix.lduMeshAssembly().patchLocalToGlobalMap()[mat][index];
const label meshNrbId = matrix.lduMeshAssembly().findNbrMeshId
(
this->patch().patch(),
mat
);
const mixedFvPatchField& fPatch =
refCast(thermo.T().boundaryField()[index]);
const Field intCoeffsCmpt
(
matrix.internalCoeffs()[globalPatchID].component(cmpt)
);
const scalarField sourceCorr(fPatch.source());
const labelList& faceMap =
matrix.lduMeshAssembly().faceBoundMap()[mat][index];
const labelList& myCells =
matrix.lduMeshAssembly().cellBoundMap()[meshNrbId][nbrPatchId];
const labelList& nbrCells =
matrix.lduMeshAssembly().cellBoundMap()[mat][index];
forAll(faceMap, j)
{
label globalFaceI = faceMap[j];
label myCellI = myCells[j];
label nbrCellI = nbrCells[j];
const scalar intCorr = -intCoeffsCmpt[j];
const scalar srcCorr = -sourceCorr[j];
if (this->patch().patch().masterImplicit())
{
if (myCellI > nbrCellI)
{
if (matrix.asymmetric())
{
matrix.lower()[globalFaceI] += intCorr;
}
}
else
{
matrix.upper()[globalFaceI] += intCorr;
}
matrix.diag()[myCellI] -= intCorr;
matrix.source()[myCellI] += srcCorr;
}
else
{
if (myCellI < nbrCellI)
{
matrix.upper()[globalFaceI] += intCorr;
}
else
{
if (matrix.asymmetric())
{
matrix.lower()[globalFaceI] += intCorr;
}
}
matrix.diag()[myCellI] -= intCorr;
matrix.source()[myCellI] += srcCorr;
}
// if (globalFaceI != -1)
// {
// const scalar intCorr = -intCoeffsCmpt[j];
// const scalar srcCorr = -sourceCorr[j];
//
// if (this->patch().patch().masterImplicit())
// {
// matrix.diag()[u[globalFaceI]] -= intCorr;
// if (matrix.asymmetric())
// {
// matrix.lower()[globalFaceI] += intCorr;
// }
// matrix.source()[u[globalFaceI]] += srcCorr;
// }
// else
// {
// matrix.diag()[l[globalFaceI]] -= intCorr;
// matrix.upper()[globalFaceI] += intCorr;
// matrix.source()[l[globalFaceI]] += srcCorr;
// }
// }
}
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
makePatchTypeField
(
fvPatchScalarField,
mixedEnergyFvPatchScalarField
);
}
// ************************************************************************* //