/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2016-2017 Wikki Ltd Copyright (C) 2022 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 . Class Foam::coupledFaPatch Author Zeljko Tukovic and Hrvoje Jasak Description coupledFaPatch is an abstract base class for patches that couple regions of the computational domain e.g. cyclic, arbitrary interfaces, sliding interfaces and processor-processor links. SourceFiles coupledFaPatch.C \*---------------------------------------------------------------------------*/ #ifndef Foam_coupledFaPatch_H #define Foam_coupledFaPatch_H #include "lduInterface.H" #include "faPatch.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { /*---------------------------------------------------------------------------*\ Class coupledFaPatch Declaration \*---------------------------------------------------------------------------*/ class coupledFaPatch : public lduInterface, public faPatch { // Private Data //- offset (distance) vector from one side of the couple to the other mutable vectorField separation_; //- Face transformation tensor mutable tensorField forwardT_; //- Neighbour-cell transformation tensor mutable tensorField reverseT_; protected: // Protected Member Functions //- Make patch weighting factors virtual void makeWeights(scalarField&) const = 0; //- Make patch geodesic distance between P and N virtual void makeLPN(scalarField&) const = 0; //- Make patch face - neighbour cell distances virtual void makeDeltaCoeffs(scalarField&) const = 0; //- Make non-orthogonality correction vectors virtual void makeCorrectionVectors(vectorField&) const = 0; //- Calculate the uniform transformation tensors void calcTransformTensors ( const vector& Cf, const vector& Cr, const vector& nf, const vector& nr ) const; //- Calculate the transformation tensors void calcTransformTensors ( const vectorField& Cf, const vectorField& Cr, const vectorField& nf, const vectorField& nr ) const; public: //- Runtime type information TypeNameNoDebug("coupled"); // Constructors //- Construct from components coupledFaPatch ( const word& name, const labelUList& edgeLabels, const label index, const faBoundaryMesh& bm, const label nbrPolyPatchIndex, const word& patchType ) : faPatch(name, edgeLabels, index, bm, nbrPolyPatchIndex, patchType) {} //- Construct from dictionary coupledFaPatch ( const word& name, const dictionary& dict, const label index, const faBoundaryMesh& bm, const word& patchType ) : faPatch(name, dict, index, bm, patchType) {} //- Destructor virtual ~coupledFaPatch() = default; // Member Functions // Access //- Return true because this patch is coupled virtual bool coupled() const { return true; } //- Does this side own the patch ? virtual bool owner() const = 0; //- Does the coupled side own the patch ? virtual bool neighbour() const { return !owner(); } //- The referring patchID (eg, for cyclics). // Here for consistency with coupledPolyPatch virtual label referPatchID() const { return -1; } //- Are the coupled planes separated? bool separated() const { return separation_.size(); } //- Return the offset (distance) vector from one side of the couple // to the other const vectorField& separation() const { if (!separation_.size()) { FatalErrorInFunction << "Coupled patches are not separated" << abort(FatalError); } return separation_; } //- Return face transformation tensor const tensorField& forwardT() const { if (!forwardT_.size()) { FatalErrorInFunction << "Coupled planes do not need transformation" << abort(FatalError); } return forwardT_; } //- Return neighbour-cell transformation tensor const tensorField& reverseT() const { if (!reverseT_.size()) { FatalErrorInFunction << "Coupled planes do not need transformation" << abort(FatalError); } return reverseT_; } //- Are the cyclic planes parallel bool parallel() const { return forwardT_.size() == 0; } //- Initialise the calculation of the patch geometry virtual void initGeometry(PstreamBuffers&) = 0; //- Calculate the patch geometry virtual void calcGeometry(PstreamBuffers&) = 0; //- Initialise the patches for moving points virtual void initMovePoints(PstreamBuffers&, const pointField&) = 0; //- Correct patches after moving points virtual void movePoints(PstreamBuffers&, const pointField&) = 0; // Access functions for demand driven data //- Return delta (P to N) vectors across coupled patch virtual tmp delta() const = 0; // Interface transfer functions //- Return faceCell addressing: lduInterface virtual function virtual const labelUList& faceCells() const { return edgeFaces(); } //- Return the values of the given internal data adjacent to // the interface as a field virtual tmp interfaceInternalField ( const labelUList& internalData ) const = 0; //- Initialise interface data transfer virtual void initTransfer ( const Pstream::commsTypes commsType, const labelUList& interfaceData ) const {} //- Transfer and return neighbour field virtual tmp transfer ( const Pstream::commsTypes commsType, const labelUList& interfaceData ) const = 0; //- Initialise neighbour field transfer virtual void initInternalFieldTransfer ( const Pstream::commsTypes commsType, const labelUList& iF ) const {} //- Return neighbour field virtual tmp internalFieldTransfer ( const Pstream::commsTypes commsType, const labelUList& iF ) const = 0; }; // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif // ************************************************************************* //