From 913c45affff2144f511adce6474548ebee0fdb45 Mon Sep 17 00:00:00 2001 From: Andrew Heather <> Date: Fri, 9 Sep 2022 13:12:15 +0100 Subject: [PATCH] ENH: faMatrix - added dot operator functions --- src/finiteArea/faMatrices/faMatrix/faMatrix.C | 121 ++++++++++++++++++ src/finiteArea/faMatrices/faMatrix/faMatrix.H | 72 +++++++++++ 2 files changed, 193 insertions(+) diff --git a/src/finiteArea/faMatrices/faMatrix/faMatrix.C b/src/finiteArea/faMatrices/faMatrix/faMatrix.C index 2307a1bb79..e5a1eed1a5 100644 --- a/src/finiteArea/faMatrices/faMatrix/faMatrix.C +++ b/src/finiteArea/faMatrices/faMatrix/faMatrix.C @@ -2074,6 +2074,127 @@ Foam::tmp> Foam::operator* } +template +Foam::tmp> +Foam::operator& +( + const faMatrix& M, + const DimensionedField& psi +) +{ + auto tMphi = tmp>::New + ( + IOobject + ( + "M&" + psi.name(), + psi.instance(), + psi.mesh().mesh(), + IOobject::NO_READ, + IOobject::NO_WRITE + ), + psi.mesh(), + M.dimensions()/dimArea + ); + auto& Mphi = tMphi.ref(); + + // Loop over field components + if (M.hasDiag()) + { + for (direction cmpt=0; cmpt::nComponents; cmpt++) + { + scalarField psiCmpt(psi.field().component(cmpt)); + scalarField boundaryDiagCmpt(M.diag()); + M.addBoundaryDiag(boundaryDiagCmpt, cmpt); + Mphi.primitiveFieldRef().replace(cmpt, -boundaryDiagCmpt*psiCmpt); + } + } + else + { + Mphi.primitiveFieldRef() = Zero; + } + + Mphi.primitiveFieldRef() += M.lduMatrix::H(psi.field()) + M.source(); + M.addBoundarySource(Mphi.primitiveFieldRef()); + + Mphi.primitiveFieldRef() /= -psi.mesh().S(); + Mphi.correctBoundaryConditions(); + + return tMphi; +} + + +template +Foam::tmp> +Foam::operator& +( + const faMatrix& M, + const tmp>& tpsi +) +{ + tmp> tMpsi = M & tpsi(); + tpsi.clear(); + return tMpsi; +} + + +template +Foam::tmp> +Foam::operator& +( + const faMatrix& M, + const tmp>& tpsi +) +{ + tmp> tMpsi = M & tpsi(); + tpsi.clear(); + return tMpsi; +} + + +template +Foam::tmp> +Foam::operator& +( + const tmp>& tM, + const DimensionedField& psi +) +{ + tmp> tMpsi = tM() & psi; + tM.clear(); + return tMpsi; +} + + +template +Foam::tmp> +Foam::operator& +( + const tmp>& tM, + const tmp>& tpsi +) +{ + tmp> tMpsi = tM() & tpsi(); + tM.clear(); + tpsi.clear(); + return tMpsi; +} + + +template +Foam::tmp> +Foam::operator& +( + const tmp>& tM, + const tmp>& tpsi +) +{ + tmp> tMpsi = tM() & tpsi(); + tM.clear(); + tpsi.clear(); + return tMpsi; +} + + // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // template diff --git a/src/finiteArea/faMatrices/faMatrix/faMatrix.H b/src/finiteArea/faMatrices/faMatrix/faMatrix.H index b0fc26c2e1..e5b6dfae97 100644 --- a/src/finiteArea/faMatrices/faMatrix/faMatrix.H +++ b/src/finiteArea/faMatrices/faMatrix/faMatrix.H @@ -64,6 +64,47 @@ template class UIndirectList; template Ostream& operator<<(Ostream&, const faMatrix&); +template +tmp> operator& +( + const faMatrix&, + const DimensionedField& +); + +template +tmp> operator& +( + const faMatrix&, + const tmp>& +); + +template +tmp> operator& +( + const faMatrix&, + const tmp>& +); + +template +tmp> operator& +( + const tmp>&, + const DimensionedField& +); + +template +tmp> operator& +( + const tmp>&, + const tmp>& +); + +template +tmp> operator& +( + const tmp>&, + const tmp>& +); /*---------------------------------------------------------------------------*\ Class faMatrix Declaration @@ -469,6 +510,37 @@ public: void operator*=(const dimensioned&); + // Friend Operators + + friend tmp> + operator& + ( + const faMatrix&, + const DimensionedField& + ); + + friend tmp> + operator& + ( + const faMatrix&, + const tmp>& + ); + + friend tmp> + operator& + ( + const tmp>&, + const DimensionedField& + ); + + friend tmp> + operator& + ( + const tmp>&, + const tmp>& + ); + + // Ostream Operator friend Ostream& operator<<