diff --git a/src/foam/Make/files b/src/foam/Make/files index bcf358ec5..1031c22f1 100644 --- a/src/foam/Make/files +++ b/src/foam/Make/files @@ -330,6 +330,7 @@ SAMGInterfaceFields = $(AMG)/interfaceFields/SAMGInterfaceFields $(SAMGInterfaceFields)/SAMGInterfaceField/SAMGInterfaceField.C $(SAMGInterfaceFields)/SAMGInterfaceField/newSAMGInterfaceField.C $(SAMGInterfaceFields)/processorSAMGInterfaceField/processorSAMGInterfaceField.C +$(SAMGInterfaceFields)/ggiSAMGInterfaceField/ggiSAMGInterfaceField.C AMGAgglomerations = $(AMG)/AMGAgglomerations diff --git a/src/foam/matrices/lduMatrix/solvers/AMG/interfaceFields/SAMGInterfaceFields/ggiSAMGInterfaceField/ggiSAMGInterfaceField.C b/src/foam/matrices/lduMatrix/solvers/AMG/interfaceFields/SAMGInterfaceFields/ggiSAMGInterfaceField/ggiSAMGInterfaceField.C new file mode 100644 index 000000000..2752ae36f --- /dev/null +++ b/src/foam/matrices/lduMatrix/solvers/AMG/interfaceFields/SAMGInterfaceFields/ggiSAMGInterfaceField/ggiSAMGInterfaceField.C @@ -0,0 +1,137 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | foam-extend: Open Source CFD + \\ / O peration | Version: 4.0 + \\ / A nd | Web: http://www.foam-extend.org + \\/ M anipulation | For copyright notice see file Copyright +------------------------------------------------------------------------------- +License + This file is part of foam-extend. + + foam-extend 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. + + foam-extend 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 foam-extend. If not, see . + +\*---------------------------------------------------------------------------*/ + +#include "ggiSAMGInterfaceField.H" +#include "addToRunTimeSelectionTable.H" +#include "lduMatrix.H" + +#include "OSspecific.H" + +// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // + +namespace Foam +{ + defineTypeNameAndDebug(ggiSAMGInterfaceField, 0); + addToRunTimeSelectionTable + ( + SAMGInterfaceField, + ggiSAMGInterfaceField, + lduInterface + ); +} + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::ggiSAMGInterfaceField::ggiSAMGInterfaceField +( + const SAMGInterface& SAMGCp, + const lduInterfaceField& fineInterface +) +: + SAMGInterfaceField(SAMGCp, fineInterface), + ggiInterface_(refCast(SAMGCp)), + doTransform_(false), + rank_(0) +{ + const ggiLduInterfaceField& p = + refCast(fineInterface); + + doTransform_ = p.doTransform(); + rank_ = p.rank(); +} + + +// * * * * * * * * * * * * * * * * Desstructor * * * * * * * * * * * * * * * // + +Foam::ggiSAMGInterfaceField::~ggiSAMGInterfaceField() +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::ggiSAMGInterfaceField::initInterfaceMatrixUpdate +( + const scalarField& psiInternal, + scalarField& result, + const lduMatrix&, + const scalarField& coeffs, + const direction cmpt, + const Pstream::commsTypes commsType, + const bool switchToLhs +) const +{ + // This must have a reduce in it. HJ, 15/May/2009 + ggiInterface_.initInternalFieldTransfer(commsType, psiInternal); +} + + +void Foam::ggiSAMGInterfaceField::updateInterfaceMatrix +( + const scalarField& psiInternal, + scalarField& result, + const lduMatrix&, + const scalarField& coeffs, + const direction cmpt, + const Pstream::commsTypes commsType, + const bool switchToLhs +) const +{ + // Get expanded data to zone size. No global reduce allowed + // HJ, 15/May/2009 + scalarField pnf = + ggiInterface_.internalFieldTransfer(commsType, psiInternal); + transformCoupleField(pnf, cmpt); + + const unallocLabelList& faceCells = ggiInterface_.faceCells(); + + // New treatment. HJ, 26/Jun/2011 + if (pnf.size() != faceCells.size()) + { + FatalErrorIn("ggiSAMGInterfaceField::updateInterfaceMatrix") + << "Error in interface update: incorrect size of zone fields" << nl + << "Field size = " << pnf.size() + << " Zone size = " << faceCells.size() + << abort(FatalError); + } + + if (switchToLhs) + { + forAll(faceCells, elemI) + { + result[faceCells[elemI]] += coeffs[elemI]*pnf[elemI]; + } + } + else + { + forAll(faceCells, elemI) + { + result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI]; + } + } +} + + +// ************************************************************************* // diff --git a/src/foam/matrices/lduMatrix/solvers/AMG/interfaceFields/SAMGInterfaceFields/ggiSAMGInterfaceField/ggiSAMGInterfaceField.H b/src/foam/matrices/lduMatrix/solvers/AMG/interfaceFields/SAMGInterfaceFields/ggiSAMGInterfaceField/ggiSAMGInterfaceField.H new file mode 100644 index 000000000..4b529be6d --- /dev/null +++ b/src/foam/matrices/lduMatrix/solvers/AMG/interfaceFields/SAMGInterfaceFields/ggiSAMGInterfaceField/ggiSAMGInterfaceField.H @@ -0,0 +1,184 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | foam-extend: Open Source CFD + \\ / O peration | Version: 4.0 + \\ / A nd | Web: http://www.foam-extend.org + \\/ M anipulation | For copyright notice see file Copyright +------------------------------------------------------------------------------- +License + This file is part of foam-extend. + + foam-extend 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. + + foam-extend 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 foam-extend. If not, see . + +Class + Foam::ggiSAMGInterfaceField + +Description + AMG selected ggi interface field. + +Author + Hrvoje Jasak, Wikki Ltd. All rights reserved. + +SourceFiles + ggiSAMGInterfaceField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef ggiSAMGInterfaceField_H +#define ggiSAMGInterfaceField_H + +#include "SAMGInterfaceField.H" +#include "ggiSAMGInterface.H" +#include "ggiLduInterfaceField.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class ggiSAMGInterfaceField Declaration +\*---------------------------------------------------------------------------*/ + +class ggiSAMGInterfaceField +: + public SAMGInterfaceField, + virtual public ggiLduInterfaceField +{ + // Private data + + //- Local reference cast into the ggi interface + const ggiSAMGInterface& ggiInterface_; + + //- Is the transform required + bool doTransform_; + + //- Rank of component for transformation + int rank_; + + + // Private Member Functions + + //- Disallow default bitwise copy construct + ggiSAMGInterfaceField(const ggiSAMGInterfaceField&); + + //- Disallow default bitwise assignment + void operator=(const ggiSAMGInterfaceField&); + + +public: + + //- Runtime type information + TypeName("ggi"); + + + // Constructors + + //- Construct from AMG interface and fine level interface field + ggiSAMGInterfaceField + ( + const SAMGInterface& SAMGCp, + const lduInterfaceField& fineInterfaceField + ); + + + //- Destructor + virtual ~ggiSAMGInterfaceField(); + + + // Member Functions + + // Access + + //- Return size + label size() const + { + return ggiInterface_.size(); + } + + + // Coupled interface matrix update + + //- Transform neighbour field + virtual void transformCoupleField + ( + scalarField& pnf, + const direction cmpt + ) const + { + ggiLduInterfaceField::transformCoupleField(pnf, cmpt); + } + + //- Initialise neighbour matrix update + virtual void initInterfaceMatrixUpdate + ( + const scalarField& psiInternal, + scalarField& result, + const lduMatrix& m, + const scalarField& coeffs, + const direction cmpt, + const Pstream::commsTypes commsType, + const bool switchToLhs + ) const; + + //- Update result field based on interface functionality + virtual void updateInterfaceMatrix + ( + const scalarField& psiInternal, + scalarField& result, + const lduMatrix&, + const scalarField& coeffs, + const direction cmpt, + const Pstream::commsTypes commsType, + const bool switchToLhs + ) const; + + + //- Ggi interface functions + + //- Does the interface field perform the transfromation + virtual bool doTransform() const + { + return doTransform_; + } + + //- Return face transformation tensor + virtual const tensorField& forwardT() const + { + return ggiInterface_.forwardT(); + } + + //- Return neighbour-cell transformation tensor + virtual const tensorField& reverseT() const + { + return ggiInterface_.reverseT(); + } + + //- Return rank of component for transform + virtual int rank() const + { + return rank_; + } +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* //