Files
OpenFOAM-12/src/meshTools/AMIInterpolation/patches/cyclicAMI/cyclicAMIPolyPatch/cyclicAMIPolyPatch.H

385 lines
11 KiB
C++

/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2020 OpenFOAM Foundation
\\/ 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 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 <http://www.gnu.org/licenses/>.
Class
Foam::cyclicAMIPolyPatch
Description
Cyclic patch for Arbitrary Mesh Interface (AMI)
SourceFiles
cyclicAMIPolyPatch.C
\*---------------------------------------------------------------------------*/
#ifndef cyclicAMIPolyPatch_H
#define cyclicAMIPolyPatch_H
#include "coupledPolyPatch.H"
#include "cyclicTransform.H"
#include "AMIInterpolation.H"
#include "polyBoundaryMesh.H"
#include "coupleGroupIdentifier.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class cyclicAMIPolyPatch Declaration
\*---------------------------------------------------------------------------*/
class cyclicAMIPolyPatch
:
public coupledPolyPatch,
public cyclicTransform
{
protected:
// Protected data
//- Name of cyclic neighbour patch
mutable word nbrPatchName_;
//- Optional patchGroup to find nbrPatch
const coupleGroupIdentifier coupleGroup_;
//- Index of cyclic neighbour patch
mutable label nbrPatchID_;
//- AMI interpolation classes
mutable PtrList<AMIInterpolation> AMIs_;
//- AMI transforms (from source to target)
mutable List<transformer> AMITransforms_;
//- Flag to indicate that slave patch should be reversed for AMI
const bool AMIReverse_;
//- Flag to indicate that patches should match/overlap
const bool AMIRequireMatch_;
//- Low weight correction threshold for AMI
const scalar AMILowWeightCorrection_;
//- AMI Method
const AMIInterpolation::interpolationMethod AMIMethod_;
//- Projection surface
mutable autoPtr<searchableSurface> surfPtr_;
//- Dictionary used during projection surface construction
const dictionary surfDict_;
// Protected Member Functions
//- Reset the AMI interpolator
virtual void resetAMI() const;
//- Initialise the calculation of the patch geometry
virtual void initCalcGeometry(PstreamBuffers&);
//- Calculate the patch geometry
virtual void calcGeometry(PstreamBuffers&);
//- Initialise the patches for moving points
virtual void initMovePoints(PstreamBuffers& pBufs, const pointField&);
//- Correct patches after moving points
virtual void movePoints(PstreamBuffers& pBufs, const pointField&);
//- Initialise the update of the patch topology
virtual void initUpdateMesh(PstreamBuffers&);
//- Update of the patch topology
virtual void updateMesh(PstreamBuffers&);
//- Clear geometry
virtual void clearGeom();
//- Reset the patch name
virtual void rename(const wordList& newNames);
//- Reset the patch index
virtual void reorder(const labelUList& newToOldIndex);
public:
//- Runtime type information
TypeName("cyclicAMI");
// Constructors
//- Construct from (base couped patch) components
cyclicAMIPolyPatch
(
const word& name,
const label size,
const label start,
const label index,
const polyBoundaryMesh& bm,
const word& patchType,
const bool AMIRequireMatch = true,
const AMIInterpolation::interpolationMethod AMIMethod =
AMIInterpolation::imFaceAreaWeight
);
//- Construct from dictionary
cyclicAMIPolyPatch
(
const word& name,
const dictionary& dict,
const label index,
const polyBoundaryMesh& bm,
const word& patchType,
const bool AMIRequireMatch = true,
const AMIInterpolation::interpolationMethod AMIMethod =
AMIInterpolation::imFaceAreaWeight
);
//- Construct as copy, resetting the boundary mesh
cyclicAMIPolyPatch(const cyclicAMIPolyPatch&, const polyBoundaryMesh&);
//- Construct given the original patch and resetting the
// face list and boundary mesh information
cyclicAMIPolyPatch
(
const cyclicAMIPolyPatch& pp,
const polyBoundaryMesh& bm,
const label index,
const label newSize,
const label newStart,
const word& nbrPatchName
);
//- Construct given the original patch and a map
cyclicAMIPolyPatch
(
const cyclicAMIPolyPatch& pp,
const polyBoundaryMesh& bm,
const label index,
const labelUList& mapAddressing,
const label newStart
);
//- Construct and return a clone, resetting the boundary mesh
virtual autoPtr<polyPatch> clone(const polyBoundaryMesh& bm) const
{
return autoPtr<polyPatch>(new cyclicAMIPolyPatch(*this, bm));
}
//- Construct and return a clone, resetting the face list
// and boundary mesh
virtual autoPtr<polyPatch> clone
(
const polyBoundaryMesh& bm,
const label index,
const label newSize,
const label newStart
) const
{
return autoPtr<polyPatch>
(
new cyclicAMIPolyPatch
(
*this,
bm,
index,
newSize,
newStart,
nbrPatchName_
)
);
}
//- Construct and return a clone, resetting the face list
// and boundary mesh
virtual autoPtr<polyPatch> clone
(
const polyBoundaryMesh& bm,
const label index,
const labelUList& mapAddressing,
const label newStart
) const
{
return autoPtr<polyPatch>
(
new cyclicAMIPolyPatch
(
*this,
bm,
index,
mapAddressing,
newStart
)
);
}
//- Destructor
virtual ~cyclicAMIPolyPatch();
// Member Functions
// Access
//- Is patch 'coupled'. Note that on AMI the geometry is not
// coupled but the fields are!
virtual bool coupled() const
{
return false;
}
//- Neighbour patch name
inline const word& nbrPatchName() const;
//- Neighbour patch ID
virtual label nbrPatchID() const;
//- Does this side own the patch?
virtual bool owner() const;
//- Return a reference to the neighbour patch
virtual const cyclicAMIPolyPatch& nbrPatch() const;
//- Return a reference to the projection surface
const autoPtr<searchableSurface>& surfPtr() const;
//- Return a reference to the AMI interpolators
const PtrList<AMIInterpolation>& AMIs() const;
//- Return a reference to the AMI transforms
const List<transformer>& AMITransforms() const;
//- Return true if applying the low weight correction
bool applyLowWeightCorrection() const;
//- Return the weights sum for this patch
virtual const scalarField& weightsSum() const;
//- Return the weights sum for the neighbour patch
virtual const scalarField& nbrWeightsSum() const;
// Transformations
//- Return transformation between the coupled patches
virtual const transformer& transform() const
{
return cyclicTransform::transform();
}
// Interpolations
//- Interpolate field
template<class Type>
tmp<Field<Type>> interpolate
(
const Field<Type>& fld,
const UList<Type>& defaultValues = UList<Type>()
) const;
//- Interpolate tmp field
template<class Type>
tmp<Field<Type>> interpolate
(
const tmp<Field<Type>>& tFld,
const UList<Type>& defaultValues = UList<Type>()
) const;
//- Interpolate field component
tmp<scalarField> interpolate
(
const scalarField& field,
const direction cmpt,
const direction rank,
const scalarUList& defaultValues = scalarUList()
) const;
//- Initialize ordering for primitivePatch. Does not
// refer to *this (except for name() and type() etc.)
virtual void initOrder
(
PstreamBuffers&,
const primitivePatch&
) const;
//- 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;
//- Return the transform and face indices on neighbour patch which
// shares point p following trajectory vector n
labelPair pointAMIAndFace
(
const label facei,
const vector& n,
point& p
) const;
//- Index of processor that holds all of both sides, or -1 if
// distributed
label singlePatchProc() const;
//- Write the polyPatch data as a dictionary
virtual void write(Ostream&) const;
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "cyclicAMIPolyPatchI.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#ifdef NoRepository
#include "cyclicAMIPolyPatchTemplates.C"
#endif
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //