mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-12-28 03:37:59 +00:00
316 lines
8.7 KiB
C++
316 lines
8.7 KiB
C++
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
\\ / O peration |
|
|
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
|
|
\\/ M anipulation |
|
|
-------------------------------------------------------------------------------
|
|
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 2 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, write to the Free Software Foundation,
|
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
Class
|
|
Foam::coupledPolyPatch
|
|
|
|
Description
|
|
The coupledPolyPatch is an abstract base class for patches that couple
|
|
regions of the computational domain e.g. cyclic and processor-processor
|
|
links.
|
|
|
|
SourceFiles
|
|
coupledPolyPatch.C
|
|
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
#ifndef coupledPolyPatch_H
|
|
#define coupledPolyPatch_H
|
|
|
|
#include "polyPatch.H"
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
namespace Foam
|
|
{
|
|
|
|
/*---------------------------------------------------------------------------*\
|
|
Class coupledPolyPatch Declaration
|
|
\*---------------------------------------------------------------------------*/
|
|
|
|
class coupledPolyPatch
|
|
:
|
|
public polyPatch
|
|
{
|
|
// 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_;
|
|
|
|
public:
|
|
|
|
// Static data members
|
|
|
|
//- Relative tolerance (for geometric matching).
|
|
static scalar matchTol;
|
|
|
|
|
|
protected:
|
|
|
|
// Protected Member Functions
|
|
|
|
//- Calculate the transformation tensors
|
|
// smallDist : matching distance per face
|
|
// absTol : absolute error in normal
|
|
void calcTransformTensors
|
|
(
|
|
const vectorField& Cf,
|
|
const vectorField& Cr,
|
|
const vectorField& nf,
|
|
const vectorField& nr,
|
|
const scalarField& smallDist,
|
|
const scalar absTol = matchTol
|
|
) const;
|
|
|
|
//- 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;
|
|
|
|
//- Initialise the update of the patch topology
|
|
virtual void initUpdateMesh(PstreamBuffers&) = 0;
|
|
|
|
//- Update of the patch topology
|
|
virtual void updateMesh(PstreamBuffers&) = 0;
|
|
|
|
|
|
//- Write point in OBJ format
|
|
static void writeOBJ(Ostream& os, const point& pt);
|
|
|
|
//- Write selected points in OBJ format
|
|
static void writeOBJ(Ostream&, const pointField&, const labelList&);
|
|
|
|
//- Write patch
|
|
static void writeOBJ
|
|
(
|
|
const fileName&,
|
|
const UList<face>&,
|
|
const pointField&
|
|
);
|
|
|
|
//- Write edge in OBJ format
|
|
static void writeOBJ
|
|
(
|
|
Ostream& os,
|
|
const point& p0,
|
|
const point& p1,
|
|
label& vertI
|
|
);
|
|
|
|
//- Calculate face centres
|
|
static pointField calcFaceCentres
|
|
(
|
|
const UList<face>&,
|
|
const pointField&
|
|
);
|
|
|
|
//- Get f[0] for all faces
|
|
static pointField getAnchorPoints
|
|
(
|
|
const UList<face>&,
|
|
const pointField&
|
|
);
|
|
|
|
//- Is face (in old face labels) in current patch?
|
|
bool inPatch
|
|
(
|
|
const labelList& oldToNew,
|
|
const label oldFaceI
|
|
) const;
|
|
|
|
//- Given list of starts of patches and a face label determine
|
|
// the patch.
|
|
static label whichPatch
|
|
(
|
|
const labelList& patchStarts,
|
|
const label faceI
|
|
);
|
|
|
|
//- Calculate typical tolerance per face. Is currently max distance
|
|
// from face centre to any of the face vertices.
|
|
static scalarField calcFaceTol
|
|
(
|
|
const UList<face>& faces,
|
|
const pointField& points,
|
|
const pointField& faceCentres
|
|
);
|
|
|
|
//- Get the number of vertices face f needs to be rotated such that
|
|
// its f[0] point aligns with given anchor (within tol).
|
|
static label getRotation
|
|
(
|
|
const pointField& points,
|
|
const face& f,
|
|
const point& anchor,
|
|
const scalar tol
|
|
);
|
|
|
|
|
|
public:
|
|
|
|
//- Runtime type information
|
|
TypeName("coupled");
|
|
|
|
|
|
// Constructors
|
|
|
|
//- Construct from components
|
|
coupledPolyPatch
|
|
(
|
|
const word& name,
|
|
const label size,
|
|
const label start,
|
|
const label index,
|
|
const polyBoundaryMesh& bm
|
|
);
|
|
|
|
//- Construct from dictionary
|
|
coupledPolyPatch
|
|
(
|
|
const word& name,
|
|
const dictionary& dict,
|
|
const label index,
|
|
const polyBoundaryMesh& bm
|
|
);
|
|
|
|
//- Construct as copy, resetting the boundary mesh
|
|
coupledPolyPatch(const coupledPolyPatch&, const polyBoundaryMesh&);
|
|
|
|
//- Construct given the original patch and resetting the
|
|
// face list and boundary mesh information
|
|
coupledPolyPatch
|
|
(
|
|
const coupledPolyPatch& pp,
|
|
const polyBoundaryMesh& bm,
|
|
const label index,
|
|
const label newSize,
|
|
const label newStart
|
|
);
|
|
|
|
//- Construct given the original patch and a map
|
|
coupledPolyPatch
|
|
(
|
|
const coupledPolyPatch& pp,
|
|
const polyBoundaryMesh& bm,
|
|
const label index,
|
|
const unallocLabelList& mapAddressing,
|
|
const label newStart
|
|
);
|
|
|
|
|
|
// Destructor
|
|
|
|
virtual ~coupledPolyPatch();
|
|
|
|
|
|
// Member Functions
|
|
|
|
// Access
|
|
|
|
//- Return true because this patch is coupled
|
|
virtual bool coupled() const
|
|
{
|
|
return true;
|
|
}
|
|
|
|
|
|
//- 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
|
|
{
|
|
return separation_;
|
|
}
|
|
|
|
|
|
//- Are the cyclic planes parallel
|
|
bool parallel() const
|
|
{
|
|
return forwardT_.empty();
|
|
}
|
|
|
|
//- Return face transformation tensor
|
|
const tensorField& forwardT() const
|
|
{
|
|
return forwardT_;
|
|
}
|
|
|
|
//- Return neighbour-cell transformation tensor
|
|
const tensorField& reverseT() const
|
|
{
|
|
return reverseT_;
|
|
}
|
|
|
|
|
|
//- Initialize ordering for primitivePatch. Does not
|
|
// refer to *this (except for name() and type() etc.)
|
|
virtual void initOrder
|
|
(
|
|
PstreamBuffers&,
|
|
const primitivePatch&
|
|
) const = 0;
|
|
|
|
//- Return new ordering for primitivePatch.
|
|
// Ordering is -faceMap: for every face
|
|
// index of the new face -rotation:for every new face the clockwise
|
|
// shift of the original face. Return false if nothing changes
|
|
// (faceMap is identity, rotation is 0), true otherwise.
|
|
virtual bool order
|
|
(
|
|
PstreamBuffers&,
|
|
const primitivePatch&,
|
|
labelList& faceMap,
|
|
labelList& rotation
|
|
) const = 0;
|
|
};
|
|
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
} // End namespace Foam
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
#endif
|
|
|
|
// ************************************************************************* //
|