mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: AMI - added supporting ACMI patches and boundary conditions
This commit is contained in:
@ -18,6 +18,7 @@ $(basicFvPatches)/generic/genericFvPatch.C
|
|||||||
constraintFvPatches = $(fvPatches)/constraint
|
constraintFvPatches = $(fvPatches)/constraint
|
||||||
$(constraintFvPatches)/cyclic/cyclicFvPatch.C
|
$(constraintFvPatches)/cyclic/cyclicFvPatch.C
|
||||||
$(constraintFvPatches)/cyclicAMI/cyclicAMIFvPatch.C
|
$(constraintFvPatches)/cyclicAMI/cyclicAMIFvPatch.C
|
||||||
|
$(constraintFvPatches)/cyclicACMI/cyclicACMIFvPatch.C
|
||||||
$(constraintFvPatches)/cyclicSlip/cyclicSlipFvPatch.C
|
$(constraintFvPatches)/cyclicSlip/cyclicSlipFvPatch.C
|
||||||
$(constraintFvPatches)/empty/emptyFvPatch.C
|
$(constraintFvPatches)/empty/emptyFvPatch.C
|
||||||
$(constraintFvPatches)/nonuniformTransformCyclic/nonuniformTransformCyclicFvPatch.C
|
$(constraintFvPatches)/nonuniformTransformCyclic/nonuniformTransformCyclicFvPatch.C
|
||||||
@ -109,6 +110,7 @@ $(basicFvPatchFields)/zeroGradient/zeroGradientFvPatchFields.C
|
|||||||
constraintFvPatchFields = $(fvPatchFields)/constraint
|
constraintFvPatchFields = $(fvPatchFields)/constraint
|
||||||
$(constraintFvPatchFields)/cyclic/cyclicFvPatchFields.C
|
$(constraintFvPatchFields)/cyclic/cyclicFvPatchFields.C
|
||||||
$(constraintFvPatchFields)/cyclicAMI/cyclicAMIFvPatchFields.C
|
$(constraintFvPatchFields)/cyclicAMI/cyclicAMIFvPatchFields.C
|
||||||
|
$(constraintFvPatchFields)/cyclicACMI/cyclicACMIFvPatchFields.C
|
||||||
$(constraintFvPatchFields)/cyclicSlip/cyclicSlipFvPatchFields.C
|
$(constraintFvPatchFields)/cyclicSlip/cyclicSlipFvPatchFields.C
|
||||||
$(constraintFvPatchFields)/empty/emptyFvPatchFields.C
|
$(constraintFvPatchFields)/empty/emptyFvPatchFields.C
|
||||||
$(constraintFvPatchFields)/jumpCyclic/jumpCyclicFvPatchFields.C
|
$(constraintFvPatchFields)/jumpCyclic/jumpCyclicFvPatchFields.C
|
||||||
@ -203,6 +205,7 @@ $(basicFvsPatchFields)/sliced/slicedFvsPatchFields.C
|
|||||||
constraintFvsPatchFields = $(fvsPatchFields)/constraint
|
constraintFvsPatchFields = $(fvsPatchFields)/constraint
|
||||||
$(constraintFvsPatchFields)/cyclic/cyclicFvsPatchFields.C
|
$(constraintFvsPatchFields)/cyclic/cyclicFvsPatchFields.C
|
||||||
$(constraintFvsPatchFields)/cyclicAMI/cyclicAMIFvsPatchFields.C
|
$(constraintFvsPatchFields)/cyclicAMI/cyclicAMIFvsPatchFields.C
|
||||||
|
$(constraintFvsPatchFields)/cyclicACMI/cyclicACMIFvsPatchFields.C
|
||||||
$(constraintFvsPatchFields)/cyclicSlip/cyclicSlipFvsPatchFields.C
|
$(constraintFvsPatchFields)/cyclicSlip/cyclicSlipFvsPatchFields.C
|
||||||
$(constraintFvsPatchFields)/empty/emptyFvsPatchFields.C
|
$(constraintFvsPatchFields)/empty/emptyFvsPatchFields.C
|
||||||
$(constraintFvsPatchFields)/nonuniformTransformCyclic/nonuniformTransformCyclicFvsPatchFields.C
|
$(constraintFvsPatchFields)/nonuniformTransformCyclic/nonuniformTransformCyclicFvsPatchFields.C
|
||||||
|
|||||||
@ -0,0 +1,387 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "cyclicACMIFvPatchField.H"
|
||||||
|
#include "transformField.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::cyclicACMIFvPatchField<Type>::cyclicACMIFvPatchField
|
||||||
|
(
|
||||||
|
const fvPatch& p,
|
||||||
|
const DimensionedField<Type, volMesh>& iF
|
||||||
|
)
|
||||||
|
:
|
||||||
|
cyclicACMILduInterfaceField(),
|
||||||
|
coupledFvPatchField<Type>(p, iF),
|
||||||
|
cyclicACMIPatch_(refCast<const cyclicACMIFvPatch>(p))
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::cyclicACMIFvPatchField<Type>::cyclicACMIFvPatchField
|
||||||
|
(
|
||||||
|
const cyclicACMIFvPatchField<Type>& ptf,
|
||||||
|
const fvPatch& p,
|
||||||
|
const DimensionedField<Type, volMesh>& iF,
|
||||||
|
const fvPatchFieldMapper& mapper
|
||||||
|
)
|
||||||
|
:
|
||||||
|
cyclicACMILduInterfaceField(),
|
||||||
|
coupledFvPatchField<Type>(ptf, p, iF, mapper),
|
||||||
|
cyclicACMIPatch_(refCast<const cyclicACMIFvPatch>(p))
|
||||||
|
{
|
||||||
|
if (!isA<cyclicACMIFvPatch>(this->patch()))
|
||||||
|
{
|
||||||
|
FatalErrorIn
|
||||||
|
(
|
||||||
|
"cyclicACMIFvPatchField<Type>::cyclicACMIFvPatchField"
|
||||||
|
"("
|
||||||
|
"const cyclicACMIFvPatchField<Type>& ,"
|
||||||
|
"const fvPatch&, "
|
||||||
|
"const DimensionedField<Type, volMesh>&, "
|
||||||
|
"const fvPatchFieldMapper&"
|
||||||
|
")"
|
||||||
|
) << " patch type '" << p.type()
|
||||||
|
<< "' not constraint type '" << typeName << "'"
|
||||||
|
<< "\n for patch " << p.name()
|
||||||
|
<< " of field " << this->dimensionedInternalField().name()
|
||||||
|
<< " in file " << this->dimensionedInternalField().objectPath()
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::cyclicACMIFvPatchField<Type>::cyclicACMIFvPatchField
|
||||||
|
(
|
||||||
|
const fvPatch& p,
|
||||||
|
const DimensionedField<Type, volMesh>& iF,
|
||||||
|
const dictionary& dict
|
||||||
|
)
|
||||||
|
:
|
||||||
|
cyclicACMILduInterfaceField(),
|
||||||
|
coupledFvPatchField<Type>(p, iF, dict),
|
||||||
|
cyclicACMIPatch_(refCast<const cyclicACMIFvPatch>(p))
|
||||||
|
{
|
||||||
|
if (!isA<cyclicACMIFvPatch>(p))
|
||||||
|
{
|
||||||
|
FatalIOErrorIn
|
||||||
|
(
|
||||||
|
"cyclicACMIFvPatchField<Type>::cyclicACMIFvPatchField"
|
||||||
|
"("
|
||||||
|
"const fvPatch&, "
|
||||||
|
"const DimensionedField<Type, volMesh>&, "
|
||||||
|
"const dictionary&"
|
||||||
|
")",
|
||||||
|
dict
|
||||||
|
) << " patch type '" << p.type()
|
||||||
|
<< "' not constraint type '" << typeName << "'"
|
||||||
|
<< "\n for patch " << p.name()
|
||||||
|
<< " of field " << this->dimensionedInternalField().name()
|
||||||
|
<< " in file " << this->dimensionedInternalField().objectPath()
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dict.found("value") && this->coupled())
|
||||||
|
{
|
||||||
|
this->evaluate(Pstream::blocking);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::cyclicACMIFvPatchField<Type>::cyclicACMIFvPatchField
|
||||||
|
(
|
||||||
|
const cyclicACMIFvPatchField<Type>& ptf
|
||||||
|
)
|
||||||
|
:
|
||||||
|
cyclicACMILduInterfaceField(),
|
||||||
|
coupledFvPatchField<Type>(ptf),
|
||||||
|
cyclicACMIPatch_(ptf.cyclicACMIPatch_)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::cyclicACMIFvPatchField<Type>::cyclicACMIFvPatchField
|
||||||
|
(
|
||||||
|
const cyclicACMIFvPatchField<Type>& ptf,
|
||||||
|
const DimensionedField<Type, volMesh>& iF
|
||||||
|
)
|
||||||
|
:
|
||||||
|
cyclicACMILduInterfaceField(),
|
||||||
|
coupledFvPatchField<Type>(ptf, iF),
|
||||||
|
cyclicACMIPatch_(ptf.cyclicACMIPatch_)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
bool Foam::cyclicACMIFvPatchField<Type>::coupled() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPatch_.coupled();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::tmp<Foam::Field<Type> >
|
||||||
|
Foam::cyclicACMIFvPatchField<Type>::patchNeighbourField() const
|
||||||
|
{
|
||||||
|
const Field<Type>& iField = this->internalField();
|
||||||
|
const labelUList& nbrFaceCellsCoupled =
|
||||||
|
cyclicACMIPatch_.cyclicACMIPatch().neighbPatch().faceCells();
|
||||||
|
const labelUList& nbrFaceCellsNonOverlap =
|
||||||
|
cyclicACMIPatch_.cyclicACMIPatch().nonOverlapPatch().faceCells();
|
||||||
|
|
||||||
|
Field<Type> pnfCoupled(iField, nbrFaceCellsCoupled);
|
||||||
|
Field<Type> pnfNonOverlap(iField, nbrFaceCellsNonOverlap);
|
||||||
|
|
||||||
|
tmp<Field<Type> > tpnf
|
||||||
|
(
|
||||||
|
new Field<Type>
|
||||||
|
(
|
||||||
|
cyclicACMIPatch_.interpolate
|
||||||
|
(
|
||||||
|
pnfCoupled,
|
||||||
|
pnfNonOverlap
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (doTransform())
|
||||||
|
{
|
||||||
|
tpnf() = transform(forwardT(), tpnf());
|
||||||
|
}
|
||||||
|
|
||||||
|
return tpnf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
const Foam::cyclicACMIFvPatchField<Type>&
|
||||||
|
Foam::cyclicACMIFvPatchField<Type>::neighbourPatchField() const
|
||||||
|
{
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>& fld =
|
||||||
|
static_cast<const GeometricField<Type, fvPatchField, volMesh>&>
|
||||||
|
(
|
||||||
|
this->internalField()
|
||||||
|
);
|
||||||
|
|
||||||
|
return refCast<const cyclicACMIFvPatchField<Type> >
|
||||||
|
(
|
||||||
|
fld.boundaryField()[cyclicACMIPatch_.neighbPatchID()]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
const Foam::fvPatchField<Type>&
|
||||||
|
Foam::cyclicACMIFvPatchField<Type>::nonOverlapPatchField() const
|
||||||
|
{
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>& fld =
|
||||||
|
static_cast<const GeometricField<Type, fvPatchField, volMesh>&>
|
||||||
|
(
|
||||||
|
this->internalField()
|
||||||
|
);
|
||||||
|
|
||||||
|
return fld.boundaryField()[cyclicACMIPatch_.nonOverlapPatchID()];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
void Foam::cyclicACMIFvPatchField<Type>::updateInterfaceMatrix
|
||||||
|
(
|
||||||
|
scalarField& result,
|
||||||
|
const scalarField& psiInternal,
|
||||||
|
const scalarField& coeffs,
|
||||||
|
const direction cmpt,
|
||||||
|
const Pstream::commsTypes
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
// note: only applying coupled contribution
|
||||||
|
|
||||||
|
const labelUList& nbrFaceCellsCoupled =
|
||||||
|
cyclicACMIPatch_.cyclicACMIPatch().neighbPatch().faceCells();
|
||||||
|
|
||||||
|
scalarField pnf(psiInternal, nbrFaceCellsCoupled);
|
||||||
|
|
||||||
|
// Transform according to the transformation tensors
|
||||||
|
transformCoupleField(pnf, cmpt);
|
||||||
|
|
||||||
|
const labelUList& faceCells = cyclicACMIPatch_.faceCells();
|
||||||
|
|
||||||
|
pnf = cyclicACMIPatch_.interpolate(pnf);
|
||||||
|
|
||||||
|
forAll(faceCells, elemI)
|
||||||
|
{
|
||||||
|
result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
void Foam::cyclicACMIFvPatchField<Type>::updateInterfaceMatrix
|
||||||
|
(
|
||||||
|
Field<Type>& result,
|
||||||
|
const Field<Type>& psiInternal,
|
||||||
|
const scalarField& coeffs,
|
||||||
|
const Pstream::commsTypes
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
// note: only applying coupled contribution
|
||||||
|
|
||||||
|
const labelUList& nbrFaceCellsCoupled =
|
||||||
|
cyclicACMIPatch_.cyclicACMIPatch().neighbPatch().faceCells();
|
||||||
|
|
||||||
|
Field<Type> pnf(psiInternal, nbrFaceCellsCoupled);
|
||||||
|
|
||||||
|
// Transform according to the transformation tensors
|
||||||
|
transformCoupleField(pnf);
|
||||||
|
|
||||||
|
const labelUList& faceCells = cyclicACMIPatch_.faceCells();
|
||||||
|
|
||||||
|
pnf = cyclicACMIPatch_.interpolate(pnf);
|
||||||
|
|
||||||
|
forAll(faceCells, elemI)
|
||||||
|
{
|
||||||
|
result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::tmp<Foam::Field<Type> > Foam::cyclicACMIFvPatchField<Type>::snGrad
|
||||||
|
(
|
||||||
|
const scalarField& deltaCoeffs
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
// note: only applying coupled contribution
|
||||||
|
return coupledFvPatchField<Type>::snGrad(deltaCoeffs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
void Foam::cyclicACMIFvPatchField<Type>::evaluate
|
||||||
|
(
|
||||||
|
const Pstream::commsTypes comms
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// blend contrubutions from the coupled and non-overlap patches
|
||||||
|
const fvPatchField<Type>& npf = nonOverlapPatchField();
|
||||||
|
const_cast<fvPatchField<Type>&>(npf).evaluate();
|
||||||
|
|
||||||
|
coupledFvPatchField<Type>::evaluate(comms);
|
||||||
|
const Field<Type>& cpf = *this;
|
||||||
|
|
||||||
|
const scalarField& mask = cyclicACMIPatch_.cyclicACMIPatch().mask();
|
||||||
|
Field<Type>::operator=(mask*cpf + (1.0 - mask)*npf);
|
||||||
|
|
||||||
|
fvPatchField<Type>::evaluate();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::tmp<Foam::Field<Type> >
|
||||||
|
Foam::cyclicACMIFvPatchField<Type>::valueInternalCoeffs
|
||||||
|
(
|
||||||
|
const tmp<scalarField>& w
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
// note: do not blend based on mask field
|
||||||
|
// - when applied this is scaled by the areas which area already scaled
|
||||||
|
return coupledFvPatchField<Type>::valueInternalCoeffs(w);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::tmp<Foam::Field<Type> >
|
||||||
|
Foam::cyclicACMIFvPatchField<Type>::valueBoundaryCoeffs
|
||||||
|
(
|
||||||
|
const tmp<scalarField>& w
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
// note: do not blend based on mask field
|
||||||
|
// - when applied this is scaled by the areas which area already scaled
|
||||||
|
return coupledFvPatchField<Type>::valueBoundaryCoeffs(w);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::tmp<Foam::Field<Type> >
|
||||||
|
Foam::cyclicACMIFvPatchField<Type>::gradientInternalCoeffs
|
||||||
|
(
|
||||||
|
const scalarField& deltaCoeffs
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
// note: do not blend based on mask field
|
||||||
|
// - when applied this is scaled by the areas which area already scaled
|
||||||
|
return coupledFvPatchField<Type>::gradientInternalCoeffs(deltaCoeffs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::tmp<Foam::Field<Type> >
|
||||||
|
Foam::cyclicACMIFvPatchField<Type>::gradientInternalCoeffs() const
|
||||||
|
{
|
||||||
|
// note: do not blend based on mask field
|
||||||
|
// - when applied this is scaled by the areas which area already scaled
|
||||||
|
return coupledFvPatchField<Type>::gradientInternalCoeffs();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::tmp<Foam::Field<Type> >
|
||||||
|
Foam::cyclicACMIFvPatchField<Type>::gradientBoundaryCoeffs
|
||||||
|
(
|
||||||
|
const scalarField& deltaCoeffs
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
// note: do not blend based on mask field
|
||||||
|
// - when applied this is scaled by the areas which area already scaled
|
||||||
|
return coupledFvPatchField<Type>::gradientBoundaryCoeffs(deltaCoeffs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::tmp<Foam::Field<Type> >
|
||||||
|
Foam::cyclicACMIFvPatchField<Type>::gradientBoundaryCoeffs() const
|
||||||
|
{
|
||||||
|
// note: do not blend based on mask field
|
||||||
|
// - when applied this is scaled by the areas which area already scaled
|
||||||
|
return coupledFvPatchField<Type>::gradientBoundaryCoeffs();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
void Foam::cyclicACMIFvPatchField<Type>::write(Ostream& os) const
|
||||||
|
{
|
||||||
|
fvPatchField<Type>::write(os);
|
||||||
|
this->writeEntry("value", os);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,298 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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::cyclicACMIFvPatchField
|
||||||
|
|
||||||
|
Group
|
||||||
|
grpCoupledBoundaryConditions
|
||||||
|
|
||||||
|
Description
|
||||||
|
This boundary condition enforces a cyclic condition between a pair of
|
||||||
|
boundaries, whereby communication between the patches is performed using
|
||||||
|
an arbitrarily coupled mesh interface (ACMI) interpolation.
|
||||||
|
|
||||||
|
\heading Patch usage
|
||||||
|
|
||||||
|
Example of the boundary condition specification:
|
||||||
|
\verbatim
|
||||||
|
myPatch
|
||||||
|
{
|
||||||
|
type cyclicACMI;
|
||||||
|
}
|
||||||
|
\endverbatim
|
||||||
|
|
||||||
|
SeeAlso
|
||||||
|
Foam::AMIInterpolation
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
cyclicACMIFvPatchField.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef cyclicACMIFvPatchField_H
|
||||||
|
#define cyclicACMIFvPatchField_H
|
||||||
|
|
||||||
|
#include "coupledFvPatchField.H"
|
||||||
|
#include "cyclicACMILduInterfaceField.H"
|
||||||
|
#include "cyclicACMIFvPatch.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class cyclicACMIFvPatchField Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
class cyclicACMIFvPatchField
|
||||||
|
:
|
||||||
|
virtual public cyclicACMILduInterfaceField,
|
||||||
|
public coupledFvPatchField<Type>
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Local reference cast into the cyclic patch
|
||||||
|
const cyclicACMIFvPatch& cyclicACMIPatch_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Return neighbour side field given internal fields
|
||||||
|
template<class Type2>
|
||||||
|
tmp<Field<Type2> > neighbourSideField
|
||||||
|
(
|
||||||
|
const Field<Type2>&
|
||||||
|
) const;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName(cyclicACMIFvPatch::typeName_());
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from patch and internal field
|
||||||
|
cyclicACMIFvPatchField
|
||||||
|
(
|
||||||
|
const fvPatch&,
|
||||||
|
const DimensionedField<Type, volMesh>&
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct from patch, internal field and dictionary
|
||||||
|
cyclicACMIFvPatchField
|
||||||
|
(
|
||||||
|
const fvPatch&,
|
||||||
|
const DimensionedField<Type, volMesh>&,
|
||||||
|
const dictionary&
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct by mapping given cyclicACMIFvPatchField onto a new patch
|
||||||
|
cyclicACMIFvPatchField
|
||||||
|
(
|
||||||
|
const cyclicACMIFvPatchField<Type>&,
|
||||||
|
const fvPatch&,
|
||||||
|
const DimensionedField<Type, volMesh>&,
|
||||||
|
const fvPatchFieldMapper&
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct as copy
|
||||||
|
cyclicACMIFvPatchField(const cyclicACMIFvPatchField<Type>&);
|
||||||
|
|
||||||
|
//- Construct and return a clone
|
||||||
|
virtual tmp<fvPatchField<Type> > clone() const
|
||||||
|
{
|
||||||
|
return tmp<fvPatchField<Type> >
|
||||||
|
(
|
||||||
|
new cyclicACMIFvPatchField<Type>(*this)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Construct as copy setting internal field reference
|
||||||
|
cyclicACMIFvPatchField
|
||||||
|
(
|
||||||
|
const cyclicACMIFvPatchField<Type>&,
|
||||||
|
const DimensionedField<Type, volMesh>&
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct and return a clone setting internal field reference
|
||||||
|
virtual tmp<fvPatchField<Type> > clone
|
||||||
|
(
|
||||||
|
const DimensionedField<Type, volMesh>& iF
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return tmp<fvPatchField<Type> >
|
||||||
|
(
|
||||||
|
new cyclicACMIFvPatchField<Type>(*this, iF)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Member functions
|
||||||
|
|
||||||
|
// Access
|
||||||
|
|
||||||
|
//- Return local reference cast into the cyclic AMI patch
|
||||||
|
const cyclicACMIFvPatch& cyclicACMIPatch() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPatch_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Evaluation functions
|
||||||
|
|
||||||
|
//- Return true if coupled. Note that the underlying patch
|
||||||
|
// is not coupled() - the points don't align.
|
||||||
|
virtual bool coupled() const;
|
||||||
|
|
||||||
|
//- Return neighbour coupled internal cell data
|
||||||
|
virtual tmp<Field<Type> > patchNeighbourField() const;
|
||||||
|
|
||||||
|
//- Return reference to neighbour patchField
|
||||||
|
const cyclicACMIFvPatchField<Type>& neighbourPatchField() const;
|
||||||
|
|
||||||
|
//- Return reference to non-overlapping patchField
|
||||||
|
const fvPatchField<Type>& nonOverlapPatchField() const;
|
||||||
|
|
||||||
|
//- Return patch-normal gradient
|
||||||
|
virtual tmp<Field<Type> > snGrad
|
||||||
|
(
|
||||||
|
const scalarField& deltaCoeffs
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Evaluate the patch field
|
||||||
|
virtual void evaluate
|
||||||
|
(
|
||||||
|
const Pstream::commsTypes commsType
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Return the matrix diagonal coefficients corresponding to the
|
||||||
|
// evaluation of the value of this patchField with given weights
|
||||||
|
virtual tmp<Field<Type> > valueInternalCoeffs
|
||||||
|
(
|
||||||
|
const tmp<scalarField>&
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Return the matrix source coefficients corresponding to the
|
||||||
|
// evaluation of the value of this patchField with given weights
|
||||||
|
virtual tmp<Field<Type> > valueBoundaryCoeffs
|
||||||
|
(
|
||||||
|
const tmp<scalarField>&
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Return the matrix diagonal coefficients corresponding to the
|
||||||
|
// evaluation of the gradient of this patchField
|
||||||
|
virtual tmp<Field<Type> > gradientInternalCoeffs
|
||||||
|
(
|
||||||
|
const scalarField& deltaCoeffs
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Return the matrix diagonal coefficients corresponding to the
|
||||||
|
// evaluation of the gradient of this patchField
|
||||||
|
virtual tmp<Field<Type> > gradientInternalCoeffs() const;
|
||||||
|
|
||||||
|
//- Return the matrix source coefficients corresponding to the
|
||||||
|
// evaluation of the gradient of this patchField
|
||||||
|
virtual tmp<Field<Type> > gradientBoundaryCoeffs
|
||||||
|
(
|
||||||
|
const scalarField& deltaCoeffs
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Return the matrix source coefficients corresponding to the
|
||||||
|
// evaluation of the gradient of this patchField
|
||||||
|
virtual tmp<Field<Type> > gradientBoundaryCoeffs() const;
|
||||||
|
|
||||||
|
//- Update result field based on interface functionality
|
||||||
|
virtual void updateInterfaceMatrix
|
||||||
|
(
|
||||||
|
scalarField& result,
|
||||||
|
const scalarField& psiInternal,
|
||||||
|
const scalarField& coeffs,
|
||||||
|
const direction cmpt,
|
||||||
|
const Pstream::commsTypes commsType
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Update result field based on interface functionality
|
||||||
|
virtual void updateInterfaceMatrix
|
||||||
|
(
|
||||||
|
Field<Type>&,
|
||||||
|
const Field<Type>&,
|
||||||
|
const scalarField&,
|
||||||
|
const Pstream::commsTypes commsType
|
||||||
|
) const;
|
||||||
|
|
||||||
|
|
||||||
|
// Cyclic AMI coupled interface functions
|
||||||
|
|
||||||
|
//- Does the patch field perform the transformation
|
||||||
|
virtual bool doTransform() const
|
||||||
|
{
|
||||||
|
return
|
||||||
|
!(cyclicACMIPatch_.parallel() || pTraits<Type>::rank == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return face transformation tensor
|
||||||
|
virtual const tensorField& forwardT() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPatch_.forwardT();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return neighbour-cell transformation tensor
|
||||||
|
virtual const tensorField& reverseT() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPatch_.reverseT();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return rank of component for transform
|
||||||
|
virtual int rank() const
|
||||||
|
{
|
||||||
|
return pTraits<Type>::rank;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// I-O
|
||||||
|
|
||||||
|
//- Write
|
||||||
|
virtual void write(Ostream& os) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#ifdef NoRepository
|
||||||
|
# include "cyclicACMIFvPatchField.C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,43 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "cyclicACMIFvPatchFields.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
#include "volFields.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
makePatchFields(cyclicACMI);
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef cyclicACMIFvPatchFields_H
|
||||||
|
#define cyclicACMIFvPatchFields_H
|
||||||
|
|
||||||
|
#include "cyclicACMIFvPatchField.H"
|
||||||
|
#include "fieldTypes.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
makePatchTypeFieldTypedefs(cyclicACMI);
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef cyclicACMIFvPatchFieldsFwd_H
|
||||||
|
#define cyclicACMIFvPatchFieldsFwd_H
|
||||||
|
|
||||||
|
#include "fieldTypes.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type> class cyclicACMIFvPatchField;
|
||||||
|
|
||||||
|
makePatchTypeFieldTypedefs(cyclicACMI);
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,149 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "cyclicACMIFvsPatchField.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::cyclicACMIFvsPatchField<Type>::cyclicACMIFvsPatchField
|
||||||
|
(
|
||||||
|
const fvPatch& p,
|
||||||
|
const DimensionedField<Type, surfaceMesh>& iF
|
||||||
|
)
|
||||||
|
:
|
||||||
|
coupledFvsPatchField<Type>(p, iF),
|
||||||
|
cyclicACMIPatch_(refCast<const cyclicACMIFvPatch>(p))
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::cyclicACMIFvsPatchField<Type>::cyclicACMIFvsPatchField
|
||||||
|
(
|
||||||
|
const cyclicACMIFvsPatchField<Type>& ptf,
|
||||||
|
const fvPatch& p,
|
||||||
|
const DimensionedField<Type, surfaceMesh>& iF,
|
||||||
|
const fvPatchFieldMapper& mapper
|
||||||
|
)
|
||||||
|
:
|
||||||
|
coupledFvsPatchField<Type>(ptf, p, iF, mapper),
|
||||||
|
cyclicACMIPatch_(refCast<const cyclicACMIFvPatch>(p))
|
||||||
|
{
|
||||||
|
if (!isA<cyclicACMIFvPatch>(this->patch()))
|
||||||
|
{
|
||||||
|
FatalErrorIn
|
||||||
|
(
|
||||||
|
"cyclicACMIFvsPatchField<Type>::cyclicACMIFvsPatchField\n"
|
||||||
|
"("
|
||||||
|
"const cyclicACMIFvsPatchField<Type>&, "
|
||||||
|
"const fvPatch&, "
|
||||||
|
"const DimensionedField<Type, surfaceMesh>&, "
|
||||||
|
"const fvPatchFieldMapper&"
|
||||||
|
")"
|
||||||
|
) << "Field type does not correspond to patch type for patch "
|
||||||
|
<< this->patch().index() << "." << endl
|
||||||
|
<< "Field type: " << typeName << endl
|
||||||
|
<< "Patch type: " << this->patch().type()
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::cyclicACMIFvsPatchField<Type>::cyclicACMIFvsPatchField
|
||||||
|
(
|
||||||
|
const fvPatch& p,
|
||||||
|
const DimensionedField<Type, surfaceMesh>& iF,
|
||||||
|
const dictionary& dict
|
||||||
|
)
|
||||||
|
:
|
||||||
|
coupledFvsPatchField<Type>(p, iF, dict),
|
||||||
|
cyclicACMIPatch_(refCast<const cyclicACMIFvPatch>(p))
|
||||||
|
{
|
||||||
|
if (!isA<cyclicACMIFvPatch>(p))
|
||||||
|
{
|
||||||
|
FatalIOErrorIn
|
||||||
|
(
|
||||||
|
"cyclicACMIFvsPatchField<Type>::cyclicACMIFvsPatchField"
|
||||||
|
"("
|
||||||
|
"const fvPatch&, "
|
||||||
|
"const Field<Type>&, "
|
||||||
|
"const dictionary&"
|
||||||
|
")",
|
||||||
|
dict
|
||||||
|
) << "patch " << this->patch().index() << " not cyclicACMI type. "
|
||||||
|
<< "Patch type = " << p.type()
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::cyclicACMIFvsPatchField<Type>::cyclicACMIFvsPatchField
|
||||||
|
(
|
||||||
|
const cyclicACMIFvsPatchField<Type>& ptf
|
||||||
|
)
|
||||||
|
:
|
||||||
|
coupledFvsPatchField<Type>(ptf),
|
||||||
|
cyclicACMIPatch_(ptf.cyclicACMIPatch_)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::cyclicACMIFvsPatchField<Type>::cyclicACMIFvsPatchField
|
||||||
|
(
|
||||||
|
const cyclicACMIFvsPatchField<Type>& ptf,
|
||||||
|
const DimensionedField<Type, surfaceMesh>& iF
|
||||||
|
)
|
||||||
|
:
|
||||||
|
coupledFvsPatchField<Type>(ptf, iF),
|
||||||
|
cyclicACMIPatch_(ptf.cyclicACMIPatch_)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
bool Foam::cyclicACMIFvsPatchField<Type>::coupled() const
|
||||||
|
{
|
||||||
|
if
|
||||||
|
(
|
||||||
|
Pstream::parRun()
|
||||||
|
|| (
|
||||||
|
this->cyclicACMIPatch_.size()
|
||||||
|
&& this->cyclicACMIPatch_.cyclicACMIPatch().neighbPatch().size()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,150 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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::cyclicACMIFvsPatchField
|
||||||
|
|
||||||
|
Description
|
||||||
|
Foam::cyclicACMIFvsPatchField
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
cyclicACMIFvsPatchField.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef cyclicACMIFvsPatchField_H
|
||||||
|
#define cyclicACMIFvsPatchField_H
|
||||||
|
|
||||||
|
#include "coupledFvsPatchField.H"
|
||||||
|
#include "cyclicACMIFvPatch.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class cyclicACMIFvsPatchField Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
class cyclicACMIFvsPatchField
|
||||||
|
:
|
||||||
|
public coupledFvsPatchField<Type>
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Local reference cast into the cyclic patch
|
||||||
|
const cyclicACMIFvPatch& cyclicACMIPatch_;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName(cyclicACMIFvPatch::typeName_());
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from patch and internal field
|
||||||
|
cyclicACMIFvsPatchField
|
||||||
|
(
|
||||||
|
const fvPatch&,
|
||||||
|
const DimensionedField<Type, surfaceMesh>&
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct from patch, internal field and dictionary
|
||||||
|
cyclicACMIFvsPatchField
|
||||||
|
(
|
||||||
|
const fvPatch&,
|
||||||
|
const DimensionedField<Type, surfaceMesh>&,
|
||||||
|
const dictionary&
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct by mapping given cyclicACMIFvsPatchField onto a new patch
|
||||||
|
cyclicACMIFvsPatchField
|
||||||
|
(
|
||||||
|
const cyclicACMIFvsPatchField<Type>&,
|
||||||
|
const fvPatch&,
|
||||||
|
const DimensionedField<Type, surfaceMesh>&,
|
||||||
|
const fvPatchFieldMapper&
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct as copy
|
||||||
|
cyclicACMIFvsPatchField
|
||||||
|
(
|
||||||
|
const cyclicACMIFvsPatchField<Type>&
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct and return a clone
|
||||||
|
virtual tmp<fvsPatchField<Type> > clone() const
|
||||||
|
{
|
||||||
|
return tmp<fvsPatchField<Type> >
|
||||||
|
(
|
||||||
|
new cyclicACMIFvsPatchField<Type>(*this)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Construct as copy setting internal field reference
|
||||||
|
cyclicACMIFvsPatchField
|
||||||
|
(
|
||||||
|
const cyclicACMIFvsPatchField<Type>&,
|
||||||
|
const DimensionedField<Type, surfaceMesh>&
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct and return a clone setting internal field reference
|
||||||
|
virtual tmp<fvsPatchField<Type> > clone
|
||||||
|
(
|
||||||
|
const DimensionedField<Type, surfaceMesh>& iF
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return tmp<fvsPatchField<Type> >
|
||||||
|
(
|
||||||
|
new cyclicACMIFvsPatchField<Type>(*this, iF)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Member functions
|
||||||
|
|
||||||
|
// Access
|
||||||
|
|
||||||
|
//- Return true if running parallel
|
||||||
|
virtual bool coupled() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#ifdef NoRepository
|
||||||
|
# include "cyclicACMIFvsPatchField.C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,43 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "cyclicACMIFvsPatchFields.H"
|
||||||
|
#include "fvsPatchFields.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
makeFvsPatchFields(cyclicACMI);
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef cyclicACMIFvsPatchFields_H
|
||||||
|
#define cyclicACMIFvsPatchFields_H
|
||||||
|
|
||||||
|
#include "cyclicACMIFvsPatchField.H"
|
||||||
|
#include "fieldTypes.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
makeFvsPatchTypeFieldTypedefs(cyclicACMI);
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,50 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef cyclicACMIFvsPatchFieldsFwd_H
|
||||||
|
#define cyclicACMIFvsPatchFieldsFwd_H
|
||||||
|
|
||||||
|
#include "fieldTypes.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type> class cyclicACMIFvsPatchField;
|
||||||
|
|
||||||
|
makeFvsPatchTypeFieldTypedefs(cyclicACMI);
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,202 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "cyclicACMIFvPatch.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
#include "fvMesh.H"
|
||||||
|
#include "transform.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(cyclicACMIFvPatch, 0);
|
||||||
|
addToRunTimeSelectionTable(fvPatch, cyclicACMIFvPatch, polyPatch);
|
||||||
|
}
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::cyclicACMIFvPatch::updateAreas() const
|
||||||
|
{
|
||||||
|
if (cyclicACMIPolyPatch_.updated())
|
||||||
|
{
|
||||||
|
// Set Sf and magSf for both sides' coupled and non-overlapping patches
|
||||||
|
|
||||||
|
// owner couple
|
||||||
|
const_cast<vectorField&>(Sf()) = patch().faceAreas();
|
||||||
|
const_cast<scalarField&>(magSf()) = mag(patch().faceAreas());
|
||||||
|
|
||||||
|
// owner non-overlapping
|
||||||
|
const fvPatch& nonOverlapPatch = this->nonOverlapPatch();
|
||||||
|
const_cast<vectorField&>(nonOverlapPatch.Sf()) =
|
||||||
|
nonOverlapPatch.patch().faceAreas();
|
||||||
|
const_cast<scalarField&>(nonOverlapPatch.magSf()) =
|
||||||
|
mag(nonOverlapPatch.patch().faceAreas());
|
||||||
|
|
||||||
|
// neighbour couple
|
||||||
|
const cyclicACMIFvPatch& nbrACMI = neighbPatch();
|
||||||
|
const_cast<vectorField&>(nbrACMI.Sf()) =
|
||||||
|
nbrACMI.patch().faceAreas();
|
||||||
|
const_cast<scalarField&>(nbrACMI.magSf()) =
|
||||||
|
mag(nbrACMI.patch().faceAreas());
|
||||||
|
|
||||||
|
// neighbour non-overlapping
|
||||||
|
const fvPatch& nbrNonOverlapPatch = nbrACMI.nonOverlapPatch();
|
||||||
|
const_cast<vectorField&>(nbrNonOverlapPatch.Sf()) =
|
||||||
|
nbrNonOverlapPatch.patch().faceAreas();
|
||||||
|
const_cast<scalarField&>(nbrNonOverlapPatch.magSf()) =
|
||||||
|
mag(nbrNonOverlapPatch.patch().faceAreas());
|
||||||
|
|
||||||
|
// set the updated flag
|
||||||
|
cyclicACMIPolyPatch_.setUpdated(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIFvPatch::makeWeights(scalarField& w) const
|
||||||
|
{
|
||||||
|
if (coupled())
|
||||||
|
{
|
||||||
|
const cyclicACMIFvPatch& nbrPatch = neighbFvPatch();
|
||||||
|
const fvPatch& nbrPatchNonOverlap = nonOverlapPatch();
|
||||||
|
|
||||||
|
const scalarField deltas(nf() & fvPatch::delta());
|
||||||
|
|
||||||
|
const scalarField nbrDeltas
|
||||||
|
(
|
||||||
|
interpolate
|
||||||
|
(
|
||||||
|
nbrPatch.nf() & nbrPatch.fvPatch::delta(),
|
||||||
|
nbrPatchNonOverlap.nf() & nbrPatchNonOverlap.delta()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
forAll(deltas, faceI)
|
||||||
|
{
|
||||||
|
scalar di = deltas[faceI];
|
||||||
|
scalar dni = nbrDeltas[faceI];
|
||||||
|
|
||||||
|
w[faceI] = dni/(di + dni);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Behave as uncoupled patch
|
||||||
|
fvPatch::makeWeights(w);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
bool Foam::cyclicACMIFvPatch::coupled() const
|
||||||
|
{
|
||||||
|
return Pstream::parRun() || (this->size() && neighbFvPatch().size());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::tmp<Foam::vectorField> Foam::cyclicACMIFvPatch::delta() const
|
||||||
|
{
|
||||||
|
if (coupled())
|
||||||
|
{
|
||||||
|
const cyclicACMIFvPatch& nbrPatchCoupled = neighbFvPatch();
|
||||||
|
const fvPatch& nbrPatchNonOverlap = nonOverlapPatch();
|
||||||
|
|
||||||
|
const vectorField patchD(fvPatch::delta());
|
||||||
|
|
||||||
|
vectorField nbrPatchD
|
||||||
|
(
|
||||||
|
interpolate
|
||||||
|
(
|
||||||
|
nbrPatchCoupled.fvPatch::delta(),
|
||||||
|
nbrPatchNonOverlap.delta()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
const vectorField nbrPatchD0
|
||||||
|
(
|
||||||
|
interpolate
|
||||||
|
(
|
||||||
|
vectorField(nbrPatchCoupled.size(), vector::zero),
|
||||||
|
nbrPatchNonOverlap.delta()()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
nbrPatchD -= nbrPatchD0;
|
||||||
|
|
||||||
|
tmp<vectorField> tpdv(new vectorField(patchD.size()));
|
||||||
|
vectorField& pdv = tpdv();
|
||||||
|
|
||||||
|
// do the transformation if necessary
|
||||||
|
if (parallel())
|
||||||
|
{
|
||||||
|
forAll(patchD, faceI)
|
||||||
|
{
|
||||||
|
const vector& ddi = patchD[faceI];
|
||||||
|
const vector& dni = nbrPatchD[faceI];
|
||||||
|
|
||||||
|
pdv[faceI] = ddi - dni;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
forAll(patchD, faceI)
|
||||||
|
{
|
||||||
|
const vector& ddi = patchD[faceI];
|
||||||
|
const vector& dni = nbrPatchD[faceI];
|
||||||
|
|
||||||
|
pdv[faceI] = ddi - transform(forwardT()[0], dni);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tpdv;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return fvPatch::delta();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::tmp<Foam::labelField> Foam::cyclicACMIFvPatch::interfaceInternalField
|
||||||
|
(
|
||||||
|
const labelUList& internalData
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return patchInternalField(internalData);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::tmp<Foam::labelField> Foam::cyclicACMIFvPatch::internalFieldTransfer
|
||||||
|
(
|
||||||
|
const Pstream::commsTypes commsType,
|
||||||
|
const labelUList& iF
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return neighbFvPatch().patchInternalField(iF);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,268 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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::cyclicACMIFvPatch
|
||||||
|
|
||||||
|
Description
|
||||||
|
Cyclic patch for Arbitrarily Coupled Mesh Interface (ACMI)
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
cyclicACMIFvPatch.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef cyclicACMIFvPatch_H
|
||||||
|
#define cyclicACMIFvPatch_H
|
||||||
|
|
||||||
|
#include "coupledFvPatch.H"
|
||||||
|
#include "cyclicACMILduInterface.H"
|
||||||
|
#include "cyclicACMIPolyPatch.H"
|
||||||
|
#include "fvBoundaryMesh.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class cyclicACMIFvPatch Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class cyclicACMIFvPatch
|
||||||
|
:
|
||||||
|
public coupledFvPatch,
|
||||||
|
public cyclicACMILduInterface
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
const cyclicACMIPolyPatch& cyclicACMIPolyPatch_;
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// Protected Member functions
|
||||||
|
|
||||||
|
//- Update the patch areas after AMI update
|
||||||
|
void updateAreas() const;
|
||||||
|
|
||||||
|
//- Make patch weighting factors
|
||||||
|
void makeWeights(scalarField&) const;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName(cyclicACMIPolyPatch::typeName_());
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from polyPatch
|
||||||
|
cyclicACMIFvPatch(const polyPatch& patch, const fvBoundaryMesh& bm)
|
||||||
|
:
|
||||||
|
coupledFvPatch(patch, bm),
|
||||||
|
cyclicACMILduInterface(),
|
||||||
|
cyclicACMIPolyPatch_(refCast<const cyclicACMIPolyPatch>(patch))
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// Member functions
|
||||||
|
|
||||||
|
// Access
|
||||||
|
|
||||||
|
//- Return local reference cast into the cyclic patch
|
||||||
|
const cyclicACMIPolyPatch& cyclicACMIPatch() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPolyPatch_;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return neighbour
|
||||||
|
virtual label neighbPatchID() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPolyPatch_.neighbPatchID();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool owner() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPolyPatch_.owner();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return neighbour fvPatch
|
||||||
|
virtual const cyclicACMIFvPatch& neighbPatch() const
|
||||||
|
{
|
||||||
|
return refCast<const cyclicACMIFvPatch>
|
||||||
|
(
|
||||||
|
this->boundaryMesh()[cyclicACMIPolyPatch_.neighbPatchID()]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return neighbour
|
||||||
|
virtual label nonOverlapPatchID() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPolyPatch_.nonOverlapPatchID();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return non-overlapping fvPatch
|
||||||
|
virtual const fvPatch& nonOverlapPatch() const
|
||||||
|
{
|
||||||
|
return this->boundaryMesh()[nonOverlapPatchID()];
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return a reference to the AMI interpolator
|
||||||
|
virtual const AMIPatchToPatchInterpolation& AMI() const
|
||||||
|
{
|
||||||
|
const AMIPatchToPatchInterpolation& AMI =
|
||||||
|
cyclicACMIPolyPatch_.AMI();
|
||||||
|
|
||||||
|
updateAreas();
|
||||||
|
|
||||||
|
return AMI;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Are the cyclic planes parallel
|
||||||
|
virtual bool parallel() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPolyPatch_.parallel();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return face transformation tensor
|
||||||
|
virtual const tensorField& forwardT() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPolyPatch_.forwardT();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return neighbour-cell transformation tensor
|
||||||
|
virtual const tensorField& reverseT() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPolyPatch_.reverseT();
|
||||||
|
}
|
||||||
|
|
||||||
|
const cyclicACMIFvPatch& neighbFvPatch() const
|
||||||
|
{
|
||||||
|
return refCast<const cyclicACMIFvPatch>
|
||||||
|
(
|
||||||
|
this->boundaryMesh()[cyclicACMIPolyPatch_.neighbPatchID()]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return true if this patch is coupled. This is equivalent
|
||||||
|
// to the coupledPolyPatch::coupled() if parallel running or
|
||||||
|
// both sides present, false otherwise
|
||||||
|
virtual bool coupled() const;
|
||||||
|
|
||||||
|
//- Return delta (P to N) vectors across coupled patch
|
||||||
|
virtual tmp<vectorField> delta() const;
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
tmp<Field<Type> > interpolate
|
||||||
|
(
|
||||||
|
const Field<Type>& fldCoupled
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
updateAreas();
|
||||||
|
|
||||||
|
return
|
||||||
|
cyclicACMIPolyPatch_.cyclicAMIPolyPatch::interpolate
|
||||||
|
(
|
||||||
|
fldCoupled
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
tmp<Field<Type> > interpolate
|
||||||
|
(
|
||||||
|
const tmp<Field<Type> >& tfldCoupled
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
updateAreas();
|
||||||
|
|
||||||
|
return
|
||||||
|
cyclicACMIPolyPatch_.cyclicAMIPolyPatch::interpolate
|
||||||
|
(
|
||||||
|
tfldCoupled
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
tmp<Field<Type> > interpolate
|
||||||
|
(
|
||||||
|
const Field<Type>& fldCoupled,
|
||||||
|
const Field<Type>& fldNonOverlap
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
updateAreas();
|
||||||
|
|
||||||
|
return
|
||||||
|
cyclicACMIPolyPatch_.interpolate
|
||||||
|
(
|
||||||
|
fldCoupled,
|
||||||
|
fldNonOverlap
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
tmp<Field<Type> > interpolate
|
||||||
|
(
|
||||||
|
const tmp<Field<Type> >& tFldCoupled,
|
||||||
|
const tmp<Field<Type> >& tFldNonOverlap
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
updateAreas();
|
||||||
|
|
||||||
|
return
|
||||||
|
cyclicACMIPolyPatch_.interpolate
|
||||||
|
(
|
||||||
|
tFldCoupled,
|
||||||
|
tFldNonOverlap
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Interface transfer functions
|
||||||
|
|
||||||
|
//- Return the values of the given internal data adjacent to
|
||||||
|
// the interface as a field
|
||||||
|
virtual tmp<labelField> interfaceInternalField
|
||||||
|
(
|
||||||
|
const labelUList& internalData
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Return neighbour field
|
||||||
|
virtual tmp<labelField> internalFieldTransfer
|
||||||
|
(
|
||||||
|
const Pstream::commsTypes commsType,
|
||||||
|
const labelUList& internalData
|
||||||
|
) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,129 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "cyclicACMIGAMGInterfaceField.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
#include "lduMatrix.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(cyclicACMIGAMGInterfaceField, 0);
|
||||||
|
addToRunTimeSelectionTable
|
||||||
|
(
|
||||||
|
GAMGInterfaceField,
|
||||||
|
cyclicACMIGAMGInterfaceField,
|
||||||
|
lduInterface
|
||||||
|
);
|
||||||
|
addToRunTimeSelectionTable
|
||||||
|
(
|
||||||
|
GAMGInterfaceField,
|
||||||
|
cyclicACMIGAMGInterfaceField,
|
||||||
|
lduInterfaceField
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::cyclicACMIGAMGInterfaceField::cyclicACMIGAMGInterfaceField
|
||||||
|
(
|
||||||
|
const GAMGInterface& GAMGCp,
|
||||||
|
const lduInterfaceField& fineInterface
|
||||||
|
)
|
||||||
|
:
|
||||||
|
GAMGInterfaceField(GAMGCp, fineInterface),
|
||||||
|
cyclicACMIInterface_(refCast<const cyclicACMIGAMGInterface>(GAMGCp)),
|
||||||
|
doTransform_(false),
|
||||||
|
rank_(0)
|
||||||
|
{
|
||||||
|
const cyclicAMILduInterfaceField& p =
|
||||||
|
refCast<const cyclicAMILduInterfaceField>(fineInterface);
|
||||||
|
|
||||||
|
doTransform_ = p.doTransform();
|
||||||
|
rank_ = p.rank();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::cyclicACMIGAMGInterfaceField::cyclicACMIGAMGInterfaceField
|
||||||
|
(
|
||||||
|
const GAMGInterface& GAMGCp,
|
||||||
|
const bool doTransform,
|
||||||
|
const int rank
|
||||||
|
)
|
||||||
|
:
|
||||||
|
GAMGInterfaceField(GAMGCp, doTransform, rank),
|
||||||
|
cyclicACMIInterface_(refCast<const cyclicACMIGAMGInterface>(GAMGCp)),
|
||||||
|
doTransform_(doTransform),
|
||||||
|
rank_(rank)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Desstructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::cyclicACMIGAMGInterfaceField::~cyclicACMIGAMGInterfaceField()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::cyclicACMIGAMGInterfaceField::updateInterfaceMatrix
|
||||||
|
(
|
||||||
|
scalarField& result,
|
||||||
|
const scalarField& psiInternal,
|
||||||
|
const scalarField& coeffs,
|
||||||
|
const direction cmpt,
|
||||||
|
const Pstream::commsTypes
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
// Get neighbouring field
|
||||||
|
scalarField pnf
|
||||||
|
(
|
||||||
|
cyclicACMIInterface_.neighbPatch().interfaceInternalField(psiInternal)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Transform according to the transformation tensors
|
||||||
|
transformCoupleField(pnf, cmpt);
|
||||||
|
|
||||||
|
if (cyclicACMIInterface_.owner())
|
||||||
|
{
|
||||||
|
pnf = cyclicACMIInterface_.AMI().interpolateToSource(pnf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pnf = cyclicACMIInterface_.neighbPatch().AMI().interpolateToTarget(pnf);
|
||||||
|
}
|
||||||
|
|
||||||
|
const labelUList& faceCells = cyclicACMIInterface_.faceCells();
|
||||||
|
|
||||||
|
forAll(faceCells, elemI)
|
||||||
|
{
|
||||||
|
result[faceCells[elemI]] -= coeffs[elemI]*pnf[elemI];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,166 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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::cyclicACMIGAMGInterfaceField
|
||||||
|
|
||||||
|
Description
|
||||||
|
GAMG agglomerated cyclic interface for Arbitrarily Coupled Mesh Interface
|
||||||
|
(ACMI) fields.
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
cyclicACMIGAMGInterfaceField.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef cyclicACMIGAMGInterfaceField_H
|
||||||
|
#define cyclicACMIGAMGInterfaceField_H
|
||||||
|
|
||||||
|
#include "GAMGInterfaceField.H"
|
||||||
|
#include "cyclicACMIGAMGInterface.H"
|
||||||
|
#include "cyclicACMILduInterfaceField.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class cyclicACMIGAMGInterfaceField Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class cyclicACMIGAMGInterfaceField
|
||||||
|
:
|
||||||
|
public GAMGInterfaceField,
|
||||||
|
virtual public cyclicACMILduInterfaceField
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Local reference cast into the cyclic interface
|
||||||
|
const cyclicACMIGAMGInterface& cyclicACMIInterface_;
|
||||||
|
|
||||||
|
//- Is the transform required
|
||||||
|
bool doTransform_;
|
||||||
|
|
||||||
|
//- Rank of component for transformation
|
||||||
|
int rank_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Disallow default bitwise copy construct
|
||||||
|
cyclicACMIGAMGInterfaceField(const cyclicACMIGAMGInterfaceField&);
|
||||||
|
|
||||||
|
//- Disallow default bitwise assignment
|
||||||
|
void operator=(const cyclicACMIGAMGInterfaceField&);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("cyclicACMI");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from GAMG interface and fine level interface field
|
||||||
|
cyclicACMIGAMGInterfaceField
|
||||||
|
(
|
||||||
|
const GAMGInterface& GAMGCp,
|
||||||
|
const lduInterfaceField& fineInterfaceField
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct from GAMG interface and fine level interface field
|
||||||
|
cyclicACMIGAMGInterfaceField
|
||||||
|
(
|
||||||
|
const GAMGInterface& GAMGCp,
|
||||||
|
const bool doTransform,
|
||||||
|
const int rank
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~cyclicACMIGAMGInterfaceField();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
// Access
|
||||||
|
|
||||||
|
//- Return size
|
||||||
|
label size() const
|
||||||
|
{
|
||||||
|
return cyclicACMIInterface_.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Interface matrix update
|
||||||
|
|
||||||
|
//- Update result field based on interface functionality
|
||||||
|
virtual void updateInterfaceMatrix
|
||||||
|
(
|
||||||
|
scalarField& result,
|
||||||
|
const scalarField& psiInternal,
|
||||||
|
const scalarField& coeffs,
|
||||||
|
const direction cmpt,
|
||||||
|
const Pstream::commsTypes commsType
|
||||||
|
) const;
|
||||||
|
|
||||||
|
|
||||||
|
//- Cyclic 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 cyclicACMIInterface_.forwardT();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return neighbour-cell transformation tensor
|
||||||
|
virtual const tensorField& reverseT() const
|
||||||
|
{
|
||||||
|
return cyclicACMIInterface_.reverseT();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return rank of component for transform
|
||||||
|
virtual int rank() const
|
||||||
|
{
|
||||||
|
return rank_;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,198 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "AMIInterpolation.H"
|
||||||
|
#include "cyclicACMIGAMGInterface.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
#include "Map.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(cyclicACMIGAMGInterface, 0);
|
||||||
|
addToRunTimeSelectionTable
|
||||||
|
(
|
||||||
|
GAMGInterface,
|
||||||
|
cyclicACMIGAMGInterface,
|
||||||
|
lduInterface
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::cyclicACMIGAMGInterface::cyclicACMIGAMGInterface
|
||||||
|
(
|
||||||
|
const label index,
|
||||||
|
const lduInterfacePtrsList& coarseInterfaces,
|
||||||
|
const lduInterface& fineInterface,
|
||||||
|
const labelField& localRestrictAddressing,
|
||||||
|
const labelField& neighbourRestrictAddressing,
|
||||||
|
const label fineLevelIndex,
|
||||||
|
const label coarseComm
|
||||||
|
)
|
||||||
|
:
|
||||||
|
GAMGInterface
|
||||||
|
(
|
||||||
|
index,
|
||||||
|
coarseInterfaces
|
||||||
|
),
|
||||||
|
fineCyclicACMIInterface_
|
||||||
|
(
|
||||||
|
refCast<const cyclicACMILduInterface>(fineInterface)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
// Construct face agglomeration from cell agglomeration
|
||||||
|
{
|
||||||
|
// From coarse face to cell
|
||||||
|
DynamicList<label> dynFaceCells(localRestrictAddressing.size());
|
||||||
|
|
||||||
|
// From face to coarse face
|
||||||
|
DynamicList<label> dynFaceRestrictAddressing
|
||||||
|
(
|
||||||
|
localRestrictAddressing.size()
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<label> masterToCoarseFace(localRestrictAddressing.size());
|
||||||
|
|
||||||
|
forAll(localRestrictAddressing, ffi)
|
||||||
|
{
|
||||||
|
label curMaster = localRestrictAddressing[ffi];
|
||||||
|
|
||||||
|
Map<label>::const_iterator fnd = masterToCoarseFace.find
|
||||||
|
(
|
||||||
|
curMaster
|
||||||
|
);
|
||||||
|
|
||||||
|
if (fnd == masterToCoarseFace.end())
|
||||||
|
{
|
||||||
|
// New coarse face
|
||||||
|
label coarseI = dynFaceCells.size();
|
||||||
|
dynFaceRestrictAddressing.append(coarseI);
|
||||||
|
dynFaceCells.append(curMaster);
|
||||||
|
masterToCoarseFace.insert(curMaster, coarseI);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Already have coarse face
|
||||||
|
dynFaceRestrictAddressing.append(fnd());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
faceCells_.transfer(dynFaceCells);
|
||||||
|
faceRestrictAddressing_.transfer(dynFaceRestrictAddressing);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// On the owner side construct the AMI
|
||||||
|
|
||||||
|
if (fineCyclicACMIInterface_.owner())
|
||||||
|
{
|
||||||
|
// Construct the neighbour side agglomeration (as the neighbour would
|
||||||
|
// do it so it the exact loop above using neighbourRestrictAddressing
|
||||||
|
// instead of localRestrictAddressing)
|
||||||
|
|
||||||
|
labelList nbrFaceRestrictAddressing;
|
||||||
|
{
|
||||||
|
// From face to coarse face
|
||||||
|
DynamicList<label> dynNbrFaceRestrictAddressing
|
||||||
|
(
|
||||||
|
neighbourRestrictAddressing.size()
|
||||||
|
);
|
||||||
|
|
||||||
|
Map<label> masterToCoarseFace(neighbourRestrictAddressing.size());
|
||||||
|
|
||||||
|
forAll(neighbourRestrictAddressing, ffi)
|
||||||
|
{
|
||||||
|
label curMaster = neighbourRestrictAddressing[ffi];
|
||||||
|
|
||||||
|
Map<label>::const_iterator fnd = masterToCoarseFace.find
|
||||||
|
(
|
||||||
|
curMaster
|
||||||
|
);
|
||||||
|
|
||||||
|
if (fnd == masterToCoarseFace.end())
|
||||||
|
{
|
||||||
|
// New coarse face
|
||||||
|
label coarseI = masterToCoarseFace.size();
|
||||||
|
dynNbrFaceRestrictAddressing.append(coarseI);
|
||||||
|
masterToCoarseFace.insert(curMaster, coarseI);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Already have coarse face
|
||||||
|
dynNbrFaceRestrictAddressing.append(fnd());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nbrFaceRestrictAddressing.transfer(dynNbrFaceRestrictAddressing);
|
||||||
|
}
|
||||||
|
|
||||||
|
amiPtr_.reset
|
||||||
|
(
|
||||||
|
new AMIPatchToPatchInterpolation
|
||||||
|
(
|
||||||
|
fineCyclicACMIInterface_.AMI(),
|
||||||
|
faceRestrictAddressing_,
|
||||||
|
nbrFaceRestrictAddressing
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Desstructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::cyclicACMIGAMGInterface::~cyclicACMIGAMGInterface()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::tmp<Foam::labelField>
|
||||||
|
Foam::cyclicACMIGAMGInterface::internalFieldTransfer
|
||||||
|
(
|
||||||
|
const Pstream::commsTypes,
|
||||||
|
const labelUList& iF
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
const cyclicACMIGAMGInterface& nbr =
|
||||||
|
dynamic_cast<const cyclicACMIGAMGInterface&>(neighbPatch());
|
||||||
|
const labelUList& nbrFaceCells = nbr.faceCells();
|
||||||
|
|
||||||
|
tmp<labelField> tpnf(new labelField(nbrFaceCells.size()));
|
||||||
|
labelField& pnf = tpnf();
|
||||||
|
|
||||||
|
forAll(pnf, facei)
|
||||||
|
{
|
||||||
|
pnf[facei] = iF[nbrFaceCells[facei]];
|
||||||
|
}
|
||||||
|
|
||||||
|
return tpnf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,174 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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::cyclicACMIGAMGInterface
|
||||||
|
|
||||||
|
Description
|
||||||
|
GAMG agglomerated cyclic ACMI interface.
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
cyclicACMIGAMGInterface.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef cyclicACMIGAMGInterface_H
|
||||||
|
#define cyclicACMIGAMGInterface_H
|
||||||
|
|
||||||
|
#include "GAMGInterface.H"
|
||||||
|
#include "cyclicACMILduInterface.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class cyclicACMIGAMGInterface Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class cyclicACMIGAMGInterface
|
||||||
|
:
|
||||||
|
public GAMGInterface,
|
||||||
|
virtual public cyclicACMILduInterface
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Reference for the cyclicLduInterface from which this is
|
||||||
|
// agglomerated
|
||||||
|
const cyclicACMILduInterface& fineCyclicACMIInterface_;
|
||||||
|
|
||||||
|
//- AMI interface
|
||||||
|
autoPtr<AMIPatchToPatchInterpolation> amiPtr_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Disallow default bitwise copy construct
|
||||||
|
cyclicACMIGAMGInterface(const cyclicACMIGAMGInterface&);
|
||||||
|
|
||||||
|
//- Disallow default bitwise assignment
|
||||||
|
void operator=(const cyclicACMIGAMGInterface&);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("cyclicACMI");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from fine level interface,
|
||||||
|
// local and neighbour restrict addressing
|
||||||
|
cyclicACMIGAMGInterface
|
||||||
|
(
|
||||||
|
const label index,
|
||||||
|
const lduInterfacePtrsList& coarseInterfaces,
|
||||||
|
const lduInterface& fineInterface,
|
||||||
|
const labelField& restrictAddressing,
|
||||||
|
const labelField& neighbourRestrictAddressing,
|
||||||
|
const label fineLevelIndex,
|
||||||
|
const label coarseComm
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~cyclicACMIGAMGInterface();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
// Interface transfer functions
|
||||||
|
|
||||||
|
//- Transfer and return internal field adjacent to the interface
|
||||||
|
virtual tmp<labelField> internalFieldTransfer
|
||||||
|
(
|
||||||
|
const Pstream::commsTypes commsType,
|
||||||
|
const labelUList& iF
|
||||||
|
) const;
|
||||||
|
|
||||||
|
|
||||||
|
//- Cyclic interface functions
|
||||||
|
|
||||||
|
//- Return neigbour processor number
|
||||||
|
virtual label neighbPatchID() const
|
||||||
|
{
|
||||||
|
return fineCyclicACMIInterface_.neighbPatchID();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool owner() const
|
||||||
|
{
|
||||||
|
return fineCyclicACMIInterface_.owner();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual const cyclicACMIGAMGInterface& neighbPatch() const
|
||||||
|
{
|
||||||
|
return dynamic_cast<const cyclicACMIGAMGInterface&>
|
||||||
|
(
|
||||||
|
coarseInterfaces_[neighbPatchID()]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual const AMIPatchToPatchInterpolation& AMI() const
|
||||||
|
{
|
||||||
|
return amiPtr_();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return face transformation tensor
|
||||||
|
virtual const tensorField& forwardT() const
|
||||||
|
{
|
||||||
|
return fineCyclicACMIInterface_.forwardT();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return neighbour-cell transformation tensor
|
||||||
|
virtual const tensorField& reverseT() const
|
||||||
|
{
|
||||||
|
return fineCyclicACMIInterface_.reverseT();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// I/O
|
||||||
|
|
||||||
|
//- Write to stream
|
||||||
|
virtual void write(Ostream&) const
|
||||||
|
{
|
||||||
|
//TBD. How to serialise the AMI such that we can stream
|
||||||
|
// cyclicACMIGAMGInterface.
|
||||||
|
notImplemented
|
||||||
|
(
|
||||||
|
"cyclicACMIGAMGInterface::write(Ostream&) const"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,42 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "cyclicACMILduInterface.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(cyclicACMILduInterface, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::cyclicACMILduInterface::~cyclicACMILduInterface()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,80 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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::cyclicACMILduInterface
|
||||||
|
|
||||||
|
Description
|
||||||
|
An abstract base class for cyclic ACMI coupled interfaces
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
cyclicACMILduInterface.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef cyclicACMILduInterface_H
|
||||||
|
#define cyclicACMILduInterface_H
|
||||||
|
|
||||||
|
#include "cyclicAMILduInterface.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class cyclicACMILduInterface Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class cyclicACMILduInterface
|
||||||
|
:
|
||||||
|
public cyclicAMILduInterface
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("cyclicACMILduInterface");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct null
|
||||||
|
cyclicACMILduInterface()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~cyclicACMILduInterface();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,55 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "cyclicACMILduInterfaceField.H"
|
||||||
|
#include "diagTensorField.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(cyclicACMILduInterfaceField, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::cyclicACMILduInterfaceField::~cyclicACMILduInterfaceField()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::cyclicACMILduInterfaceField::transformCoupleField
|
||||||
|
(
|
||||||
|
scalarField& f,
|
||||||
|
const direction cmpt
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
cyclicAMILduInterfaceField::transformCoupleField(f, cmpt);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,108 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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::cyclicACMILduInterfaceField
|
||||||
|
|
||||||
|
Description
|
||||||
|
Abstract base class for cyclic ACMI coupled interfaces
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
cyclicACMILduInterfaceField.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef cyclicACMILduInterfaceField_H
|
||||||
|
#define cyclicACMILduInterfaceField_H
|
||||||
|
|
||||||
|
#include "cyclicAMILduInterfaceField.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class cyclicACMILduInterfaceField Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class cyclicACMILduInterfaceField
|
||||||
|
:
|
||||||
|
public cyclicAMILduInterfaceField
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("cyclicACMILduInterfaceField");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct null
|
||||||
|
cyclicACMILduInterfaceField()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~cyclicACMILduInterfaceField();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Transform given patch field
|
||||||
|
template<class Type>
|
||||||
|
void transformCoupleField(Field<Type>& f) const;
|
||||||
|
|
||||||
|
//- Transform given patch internal field
|
||||||
|
void transformCoupleField
|
||||||
|
(
|
||||||
|
scalarField& psiInternal,
|
||||||
|
const direction cmpt
|
||||||
|
) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#include "tensorField.H"
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
void Foam::cyclicACMILduInterfaceField::transformCoupleField
|
||||||
|
(
|
||||||
|
Field<Type>& f
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
cyclicAMILduInterfaceField::transformCoupleField(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,99 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "cyclicACMIPointPatch.H"
|
||||||
|
#include "pointBoundaryMesh.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(cyclicACMIPointPatch, 0);
|
||||||
|
addToRunTimeSelectionTable
|
||||||
|
(
|
||||||
|
facePointPatch,
|
||||||
|
cyclicACMIPointPatch,
|
||||||
|
polyPatch
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPointPatch::initGeometry(PstreamBuffers&)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPointPatch::calcGeometry(PstreamBuffers&)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPointPatch::initMovePoints
|
||||||
|
(
|
||||||
|
PstreamBuffers&,
|
||||||
|
const pointField&
|
||||||
|
)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPointPatch::movePoints(PstreamBuffers&, const pointField&)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPointPatch::initUpdateMesh(PstreamBuffers& pBufs)
|
||||||
|
{
|
||||||
|
facePointPatch::initUpdateMesh(pBufs);
|
||||||
|
// cyclicACMIPointPatch::initGeometry(pBufs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPointPatch::updateMesh(PstreamBuffers& pBufs)
|
||||||
|
{
|
||||||
|
facePointPatch::updateMesh(pBufs);
|
||||||
|
// cyclicACMIPointPatch::calcGeometry(pBufs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::cyclicACMIPointPatch::cyclicACMIPointPatch
|
||||||
|
(
|
||||||
|
const polyPatch& patch,
|
||||||
|
const pointBoundaryMesh& bm
|
||||||
|
)
|
||||||
|
:
|
||||||
|
coupledFacePointPatch(patch, bm),
|
||||||
|
cyclicACMIPolyPatch_(refCast<const cyclicACMIPolyPatch>(patch))
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::cyclicACMIPointPatch::~cyclicACMIPointPatch()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,170 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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::cyclicACMIPointPatch
|
||||||
|
|
||||||
|
Description
|
||||||
|
Cyclic AMI point patch - place holder only
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
cyclicACMIPointPatch.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef cyclicACMIPointPatch_H
|
||||||
|
#define cyclicACMIPointPatch_H
|
||||||
|
|
||||||
|
#include "coupledFacePointPatch.H"
|
||||||
|
#include "cyclicACMIPolyPatch.H"
|
||||||
|
#include "pointBoundaryMesh.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class cyclicACMIPointPatch Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class cyclicACMIPointPatch
|
||||||
|
:
|
||||||
|
public coupledFacePointPatch
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Local reference cast into the cyclic AMI patch
|
||||||
|
const cyclicACMIPolyPatch& cyclicACMIPolyPatch_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Disallow default construct as copy
|
||||||
|
cyclicACMIPointPatch(const cyclicACMIPointPatch&);
|
||||||
|
|
||||||
|
//- Disallow default assignment
|
||||||
|
void operator=(const cyclicACMIPointPatch&);
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// Protected Member Functions
|
||||||
|
|
||||||
|
//- Initialise the calculation of the patch geometry
|
||||||
|
virtual void initGeometry(PstreamBuffers&);
|
||||||
|
|
||||||
|
//- Calculate the patch geometry
|
||||||
|
virtual void calcGeometry(PstreamBuffers&);
|
||||||
|
|
||||||
|
//- Initialise the patches for moving points
|
||||||
|
virtual void initMovePoints(PstreamBuffers&, const pointField&);
|
||||||
|
|
||||||
|
//- Correct patches after moving points
|
||||||
|
virtual void movePoints(PstreamBuffers&, const pointField&);
|
||||||
|
|
||||||
|
//- Initialise the update of the patch topology
|
||||||
|
virtual void initUpdateMesh(PstreamBuffers&);
|
||||||
|
|
||||||
|
//- Update of the patch topology
|
||||||
|
virtual void updateMesh(PstreamBuffers&);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName(cyclicACMIPolyPatch::typeName_());
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from components
|
||||||
|
cyclicACMIPointPatch
|
||||||
|
(
|
||||||
|
const polyPatch& patch,
|
||||||
|
const pointBoundaryMesh& bm
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~cyclicACMIPointPatch();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Is patch 'coupled'. Note that on AMI the geometry is not
|
||||||
|
// coupled but the fields are!
|
||||||
|
virtual bool coupled() const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return the constraint type this pointPatch implements.
|
||||||
|
virtual const word& constraintType() const
|
||||||
|
{
|
||||||
|
return type();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return the underlying cyclicAMIPolyPatch
|
||||||
|
const cyclicACMIPolyPatch& cyclicACMIPatch() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPolyPatch_;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return neighbour point patch
|
||||||
|
const cyclicACMIPointPatch& neighbPatch() const
|
||||||
|
{
|
||||||
|
label patchI = cyclicACMIPolyPatch_.neighbPatchID();
|
||||||
|
const pointPatch& pp = this->boundaryMesh()[patchI];
|
||||||
|
return refCast<const cyclicACMIPointPatch>(pp);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Are the cyclic planes parallel
|
||||||
|
bool parallel() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPolyPatch_.parallel();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return face transformation tensor
|
||||||
|
const tensorField& forwardT() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPolyPatch_.forwardT();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return neighbour-cell transformation tensor
|
||||||
|
const tensorField& reverseT() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPolyPatch_.reverseT();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,210 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "cyclicACMIPointPatchField.H"
|
||||||
|
#include "Swap.H"
|
||||||
|
#include "transformField.H"
|
||||||
|
#include "pointFields.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::cyclicACMIPointPatchField<Type>::cyclicACMIPointPatchField
|
||||||
|
(
|
||||||
|
const pointPatch& p,
|
||||||
|
const DimensionedField<Type, pointMesh>& iF
|
||||||
|
)
|
||||||
|
:
|
||||||
|
coupledPointPatchField<Type>(p, iF),
|
||||||
|
cyclicACMIPatch_(refCast<const cyclicACMIPointPatch>(p)),
|
||||||
|
ppiPtr_(NULL),
|
||||||
|
nbrPpiPtr_(NULL)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::cyclicACMIPointPatchField<Type>::cyclicACMIPointPatchField
|
||||||
|
(
|
||||||
|
const pointPatch& p,
|
||||||
|
const DimensionedField<Type, pointMesh>& iF,
|
||||||
|
const dictionary& dict
|
||||||
|
)
|
||||||
|
:
|
||||||
|
coupledPointPatchField<Type>(p, iF, dict),
|
||||||
|
cyclicACMIPatch_(refCast<const cyclicACMIPointPatch>(p)),
|
||||||
|
ppiPtr_(NULL),
|
||||||
|
nbrPpiPtr_(NULL)
|
||||||
|
{
|
||||||
|
if (!isType<cyclicACMIPointPatch>(p))
|
||||||
|
{
|
||||||
|
FatalIOErrorIn
|
||||||
|
(
|
||||||
|
"cyclicACMIPointPatchField<Type>::cyclicACMIPointPatchField\n"
|
||||||
|
"(\n"
|
||||||
|
" const pointPatch&,\n"
|
||||||
|
" const DimensionedField<Type, pointMesh>&,\n"
|
||||||
|
" const dictionary&\n"
|
||||||
|
")\n",
|
||||||
|
dict
|
||||||
|
) << "patch " << this->patch().index() << " not cyclicACMI type. "
|
||||||
|
<< "Patch type = " << p.type()
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::cyclicACMIPointPatchField<Type>::cyclicACMIPointPatchField
|
||||||
|
(
|
||||||
|
const cyclicACMIPointPatchField<Type>& ptf,
|
||||||
|
const pointPatch& p,
|
||||||
|
const DimensionedField<Type, pointMesh>& iF,
|
||||||
|
const pointPatchFieldMapper& mapper
|
||||||
|
)
|
||||||
|
:
|
||||||
|
coupledPointPatchField<Type>(ptf, p, iF, mapper),
|
||||||
|
cyclicACMIPatch_(refCast<const cyclicACMIPointPatch>(p)),
|
||||||
|
ppiPtr_(NULL),
|
||||||
|
nbrPpiPtr_(NULL)
|
||||||
|
{
|
||||||
|
if (!isType<cyclicACMIPointPatch>(this->patch()))
|
||||||
|
{
|
||||||
|
FatalErrorIn
|
||||||
|
(
|
||||||
|
"cyclicACMIPointPatchField<Type>::cyclicACMIPointPatchField\n"
|
||||||
|
"(\n"
|
||||||
|
" const cyclicACMIPointPatchField<Type>&,\n"
|
||||||
|
" const pointPatch&,\n"
|
||||||
|
" const DimensionedField<Type, pointMesh>&,\n"
|
||||||
|
" const pointPatchFieldMapper&\n"
|
||||||
|
")\n"
|
||||||
|
) << "Field type does not correspond to patch type for patch "
|
||||||
|
<< this->patch().index() << "." << endl
|
||||||
|
<< "Field type: " << typeName << endl
|
||||||
|
<< "Patch type: " << this->patch().type()
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::cyclicACMIPointPatchField<Type>::cyclicACMIPointPatchField
|
||||||
|
(
|
||||||
|
const cyclicACMIPointPatchField<Type>& ptf,
|
||||||
|
const DimensionedField<Type, pointMesh>& iF
|
||||||
|
)
|
||||||
|
:
|
||||||
|
coupledPointPatchField<Type>(ptf, iF),
|
||||||
|
cyclicACMIPatch_(ptf.cyclicACMIPatch_),
|
||||||
|
ppiPtr_(NULL),
|
||||||
|
nbrPpiPtr_(NULL)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
void Foam::cyclicACMIPointPatchField<Type>::swapAddSeparated
|
||||||
|
(
|
||||||
|
const Pstream::commsTypes,
|
||||||
|
Field<Type>& pField
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
if (cyclicACMIPatch_.cyclicACMIPatch().owner())
|
||||||
|
{
|
||||||
|
// We inplace modify pField. To prevent the other side (which gets
|
||||||
|
// evaluated at a later date) using already changed values we do
|
||||||
|
// all swaps on the side that gets evaluated first.
|
||||||
|
|
||||||
|
// Get neighbouring pointPatch
|
||||||
|
const cyclicACMIPointPatch& nbrPatch = cyclicACMIPatch_.neighbPatch();
|
||||||
|
|
||||||
|
// Get neighbouring pointPatchField
|
||||||
|
const GeometricField<Type, pointPatchField, pointMesh>& fld =
|
||||||
|
refCast<const GeometricField<Type, pointPatchField, pointMesh> >
|
||||||
|
(
|
||||||
|
this->dimensionedInternalField()
|
||||||
|
);
|
||||||
|
|
||||||
|
const cyclicACMIPointPatchField<Type>& nbr =
|
||||||
|
refCast<const cyclicACMIPointPatchField<Type> >
|
||||||
|
(
|
||||||
|
fld.boundaryField()[nbrPatch.index()]
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
Field<Type> ptFld(this->patchInternalField(pField));
|
||||||
|
Field<Type> nbrPtFld(nbr.patchInternalField(pField));
|
||||||
|
|
||||||
|
|
||||||
|
if (doTransform())
|
||||||
|
{
|
||||||
|
const tensor& forwardT = this->forwardT()[0];
|
||||||
|
const tensor& reverseT = this->reverseT()[0];
|
||||||
|
|
||||||
|
transform(ptFld, reverseT, ptFld);
|
||||||
|
transform(nbrPtFld, forwardT, nbrPtFld);
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert point field to face field, AMI interpolate, then
|
||||||
|
// face back to point
|
||||||
|
{
|
||||||
|
// add neighbour side contribution to owner
|
||||||
|
Field<Type> nbrFcFld(nbrPpi().pointToFaceInterpolate(nbrPtFld));
|
||||||
|
|
||||||
|
const cyclicAMIPolyPatch& cami = cyclicACMIPatch_.cyclicACMIPatch();
|
||||||
|
|
||||||
|
// interpolate to owner
|
||||||
|
nbrFcFld = cami.interpolate(nbrFcFld);
|
||||||
|
|
||||||
|
// add to internal field
|
||||||
|
this->addToInternalField
|
||||||
|
(
|
||||||
|
pField,
|
||||||
|
ppi().faceToPointInterpolate(nbrFcFld)()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// add owner side contribution to neighbour
|
||||||
|
Field<Type> fcFld(ppi().pointToFaceInterpolate(ptFld));
|
||||||
|
|
||||||
|
const cyclicAMIPolyPatch& cami = cyclicACMIPatch_.cyclicACMIPatch();
|
||||||
|
|
||||||
|
// interpolate to neighbour
|
||||||
|
fcFld = cami.neighbPatch().cyclicAMIPolyPatch::interpolate(fcFld);
|
||||||
|
|
||||||
|
// add to internal field
|
||||||
|
nbr.addToInternalField
|
||||||
|
(
|
||||||
|
pField,
|
||||||
|
nbrPpi().faceToPointInterpolate(fcFld)()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,241 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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::cyclicACMIPointPatchField
|
||||||
|
|
||||||
|
Description
|
||||||
|
Cyclic ACMI front and back plane patch field
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
cyclicACMIPointPatchField.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef cyclicACMIPointPatchField_H
|
||||||
|
#define cyclicACMIPointPatchField_H
|
||||||
|
|
||||||
|
#include "coupledPointPatchField.H"
|
||||||
|
#include "cyclicACMIPointPatch.H"
|
||||||
|
#include "PrimitivePatchInterpolation.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class cyclicACMIPointPatchField Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
class cyclicACMIPointPatchField
|
||||||
|
:
|
||||||
|
public coupledPointPatchField<Type>
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Local reference cast into the cyclicACMI patch
|
||||||
|
const cyclicACMIPointPatch& cyclicACMIPatch_;
|
||||||
|
|
||||||
|
//- Owner side patch interpolation pointer
|
||||||
|
mutable autoPtr<PrimitivePatchInterpolation<primitivePatch> > ppiPtr_;
|
||||||
|
|
||||||
|
//- Neighbour side patch interpolation pointer
|
||||||
|
mutable autoPtr<PrimitivePatchInterpolation<primitivePatch> >
|
||||||
|
nbrPpiPtr_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Owner side patch interpolation
|
||||||
|
const PrimitivePatchInterpolation<primitivePatch>& ppi() const
|
||||||
|
{
|
||||||
|
if (!ppiPtr_.valid())
|
||||||
|
{
|
||||||
|
ppiPtr_.reset
|
||||||
|
(
|
||||||
|
new PrimitivePatchInterpolation<primitivePatch>
|
||||||
|
(
|
||||||
|
cyclicACMIPatch_.cyclicACMIPatch()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ppiPtr_();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Neighbour side patch interpolation
|
||||||
|
const PrimitivePatchInterpolation<primitivePatch>& nbrPpi() const
|
||||||
|
{
|
||||||
|
if (!nbrPpiPtr_.valid())
|
||||||
|
{
|
||||||
|
nbrPpiPtr_.reset
|
||||||
|
(
|
||||||
|
new PrimitivePatchInterpolation<primitivePatch>
|
||||||
|
(
|
||||||
|
cyclicACMIPatch_.cyclicACMIPatch().neighbPatch()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nbrPpiPtr_();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName(cyclicACMIPointPatch::typeName_());
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from patch and internal field
|
||||||
|
cyclicACMIPointPatchField
|
||||||
|
(
|
||||||
|
const pointPatch&,
|
||||||
|
const DimensionedField<Type, pointMesh>&
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct from patch, internal field and dictionary
|
||||||
|
cyclicACMIPointPatchField
|
||||||
|
(
|
||||||
|
const pointPatch&,
|
||||||
|
const DimensionedField<Type, pointMesh>&,
|
||||||
|
const dictionary&
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct by mapping given patchField<Type> onto a new patch
|
||||||
|
cyclicACMIPointPatchField
|
||||||
|
(
|
||||||
|
const cyclicACMIPointPatchField<Type>&,
|
||||||
|
const pointPatch&,
|
||||||
|
const DimensionedField<Type, pointMesh>&,
|
||||||
|
const pointPatchFieldMapper&
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct and return a clone
|
||||||
|
virtual autoPtr<pointPatchField<Type> > clone() const
|
||||||
|
{
|
||||||
|
return autoPtr<pointPatchField<Type> >
|
||||||
|
(
|
||||||
|
new cyclicACMIPointPatchField<Type>
|
||||||
|
(
|
||||||
|
*this
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Construct as copy setting internal field reference
|
||||||
|
cyclicACMIPointPatchField
|
||||||
|
(
|
||||||
|
const cyclicACMIPointPatchField<Type>&,
|
||||||
|
const DimensionedField<Type, pointMesh>&
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct and return a clone setting internal field reference
|
||||||
|
virtual autoPtr<pointPatchField<Type> > clone
|
||||||
|
(
|
||||||
|
const DimensionedField<Type, pointMesh>& iF
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return autoPtr<pointPatchField<Type> >
|
||||||
|
(
|
||||||
|
new cyclicACMIPointPatchField<Type>
|
||||||
|
(
|
||||||
|
*this, iF
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Member functions
|
||||||
|
|
||||||
|
// Constraint handling
|
||||||
|
|
||||||
|
//- Return the constraint type this pointPatchField implements
|
||||||
|
virtual const word& constraintType() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPointPatch::typeName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Cyclic AMI coupled interface functions
|
||||||
|
|
||||||
|
//- Does the patch field perform the transfromation
|
||||||
|
virtual bool doTransform() const
|
||||||
|
{
|
||||||
|
return
|
||||||
|
!(
|
||||||
|
cyclicACMIPatch_.parallel()
|
||||||
|
|| pTraits<Type>::rank == 0
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return face transformation tensor
|
||||||
|
virtual const tensorField& forwardT() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPatch_.forwardT();
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return neighbour-cell transformation tensor
|
||||||
|
virtual const tensorField& reverseT() const
|
||||||
|
{
|
||||||
|
return cyclicACMIPatch_.reverseT();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Evaluation functions
|
||||||
|
|
||||||
|
//- Evaluate the patch field
|
||||||
|
virtual void evaluate
|
||||||
|
(
|
||||||
|
const Pstream::commsTypes commsType=Pstream::blocking
|
||||||
|
)
|
||||||
|
{}
|
||||||
|
|
||||||
|
//- Complete swap of patch point values and add to local values
|
||||||
|
virtual void swapAddSeparated
|
||||||
|
(
|
||||||
|
const Pstream::commsTypes commsType,
|
||||||
|
Field<Type>&
|
||||||
|
) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#ifdef NoRepository
|
||||||
|
# include "cyclicACMIPointPatchField.C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,43 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "cyclicACMIPointPatchFields.H"
|
||||||
|
#include "pointPatchFields.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
makePointPatchFields(cyclicACMI);
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef cyclicACMIPointPatchFields_H
|
||||||
|
#define cyclicACMIPointPatchFields_H
|
||||||
|
|
||||||
|
#include "cyclicACMIPointPatchField.H"
|
||||||
|
#include "fieldTypes.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
makePointPatchFieldTypedefs(cyclicACMI);
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,441 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "cyclicACMIPolyPatch.H"
|
||||||
|
#include "transformField.H"
|
||||||
|
#include "SubField.H"
|
||||||
|
#include "polyMesh.H"
|
||||||
|
#include "Time.H"
|
||||||
|
#include "faceAreaIntersect.H"
|
||||||
|
#include "ops.H"
|
||||||
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(cyclicACMIPolyPatch, 0);
|
||||||
|
|
||||||
|
addToRunTimeSelectionTable(polyPatch, cyclicACMIPolyPatch, word);
|
||||||
|
addToRunTimeSelectionTable(polyPatch, cyclicACMIPolyPatch, dictionary);
|
||||||
|
}
|
||||||
|
|
||||||
|
const Foam::scalar Foam::cyclicACMIPolyPatch::tolerance_ = 1e-6;
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPolyPatch::initPatchFaceAreas() const
|
||||||
|
{
|
||||||
|
if (!empty() && faceAreas0_.empty())
|
||||||
|
{
|
||||||
|
faceAreas0_ = faceAreas();
|
||||||
|
}
|
||||||
|
|
||||||
|
const cyclicACMIPolyPatch& nbrACMI =
|
||||||
|
refCast<const cyclicACMIPolyPatch>(this->neighbPatch());
|
||||||
|
|
||||||
|
if (!nbrACMI.empty() && nbrACMI.faceAreas0().empty())
|
||||||
|
{
|
||||||
|
nbrACMI.initPatchFaceAreas();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPolyPatch::resetAMI
|
||||||
|
(
|
||||||
|
const AMIPatchToPatchInterpolation::interpolationMethod&
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
if (owner())
|
||||||
|
{
|
||||||
|
const polyPatch& nonOverlapPatch = this->nonOverlapPatch();
|
||||||
|
|
||||||
|
initPatchFaceAreas();
|
||||||
|
|
||||||
|
// reset patch face areas based on original patch for AMI calculation
|
||||||
|
vectorField::subField Sf = faceAreas();
|
||||||
|
vectorField::subField noSf = nonOverlapPatch.faceAreas();
|
||||||
|
|
||||||
|
forAll(Sf, faceI)
|
||||||
|
{
|
||||||
|
Sf[faceI] = faceAreas0_[faceI];
|
||||||
|
noSf[faceI] = faceAreas0_[faceI];
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculate the AMI using partial face-area-weighted
|
||||||
|
cyclicAMIPolyPatch::resetAMI
|
||||||
|
(
|
||||||
|
AMIPatchToPatchInterpolation::imPartialFaceAreaWeight
|
||||||
|
);
|
||||||
|
|
||||||
|
const scalarField& srcWeightSum = AMI().srcWeightsSum();
|
||||||
|
|
||||||
|
// set patch face areas based on sum of AMI weights per face
|
||||||
|
forAll(Sf, faceI)
|
||||||
|
{
|
||||||
|
scalar w = srcWeightSum[faceI];
|
||||||
|
w = min(1.0 - tolerance_, max(tolerance_, w));
|
||||||
|
|
||||||
|
Sf[faceI] *= w;
|
||||||
|
noSf[faceI] *= 1.0 - w;
|
||||||
|
}
|
||||||
|
|
||||||
|
setNeighbourFaceAreas();
|
||||||
|
|
||||||
|
// set the updated flag
|
||||||
|
updated_ = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPolyPatch::setNeighbourFaceAreas() const
|
||||||
|
{
|
||||||
|
const cyclicACMIPolyPatch& cp =
|
||||||
|
refCast<const cyclicACMIPolyPatch>(this->neighbPatch());
|
||||||
|
const polyPatch& pp = cp.nonOverlapPatch();
|
||||||
|
|
||||||
|
const scalarField& tgtWeightSum = AMI().tgtWeightsSum();
|
||||||
|
|
||||||
|
const vectorField& faceAreas0 = cp.faceAreas0();
|
||||||
|
|
||||||
|
vectorField::subField Sf = cp.faceAreas();
|
||||||
|
vectorField::subField noSf = pp.faceAreas();
|
||||||
|
|
||||||
|
forAll(Sf, faceI)
|
||||||
|
{
|
||||||
|
scalar w = tgtWeightSum[faceI];
|
||||||
|
w = min(1.0 - tolerance_, max(tolerance_, w));
|
||||||
|
|
||||||
|
Sf[faceI] = w*faceAreas0[faceI];
|
||||||
|
noSf[faceI] = (1.0 - w)*faceAreas0[faceI];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPolyPatch::initGeometry(PstreamBuffers& pBufs)
|
||||||
|
{
|
||||||
|
cyclicAMIPolyPatch::initGeometry(pBufs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPolyPatch::calcGeometry(PstreamBuffers& pBufs)
|
||||||
|
{
|
||||||
|
cyclicAMIPolyPatch::calcGeometry(pBufs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPolyPatch::initMovePoints
|
||||||
|
(
|
||||||
|
PstreamBuffers& pBufs,
|
||||||
|
const pointField& p
|
||||||
|
)
|
||||||
|
{
|
||||||
|
cyclicAMIPolyPatch::initMovePoints(pBufs, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPolyPatch::movePoints
|
||||||
|
(
|
||||||
|
PstreamBuffers& pBufs,
|
||||||
|
const pointField& p
|
||||||
|
)
|
||||||
|
{
|
||||||
|
cyclicAMIPolyPatch::movePoints(pBufs, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPolyPatch::initUpdateMesh(PstreamBuffers& pBufs)
|
||||||
|
{
|
||||||
|
cyclicAMIPolyPatch::initUpdateMesh(pBufs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPolyPatch::updateMesh(PstreamBuffers& pBufs)
|
||||||
|
{
|
||||||
|
cyclicAMIPolyPatch::updateMesh(pBufs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPolyPatch::clearGeom()
|
||||||
|
{
|
||||||
|
cyclicAMIPolyPatch::clearGeom();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::cyclicACMIPolyPatch::cyclicACMIPolyPatch
|
||||||
|
(
|
||||||
|
const word& name,
|
||||||
|
const label size,
|
||||||
|
const label start,
|
||||||
|
const label index,
|
||||||
|
const polyBoundaryMesh& bm,
|
||||||
|
const word& patchType,
|
||||||
|
const transformType transform
|
||||||
|
)
|
||||||
|
:
|
||||||
|
cyclicAMIPolyPatch(name, size, start, index, bm, patchType, transform),
|
||||||
|
faceAreas0_(),
|
||||||
|
nonOverlapPatchName_(word::null),
|
||||||
|
nonOverlapPatchID_(-1),
|
||||||
|
updated_(false)
|
||||||
|
{
|
||||||
|
// Non-overlapping patch might not be valid yet so cannot determine
|
||||||
|
// associated patchID
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::cyclicACMIPolyPatch::cyclicACMIPolyPatch
|
||||||
|
(
|
||||||
|
const word& name,
|
||||||
|
const dictionary& dict,
|
||||||
|
const label index,
|
||||||
|
const polyBoundaryMesh& bm,
|
||||||
|
const word& patchType
|
||||||
|
)
|
||||||
|
:
|
||||||
|
cyclicAMIPolyPatch(name, dict, index, bm, patchType),
|
||||||
|
faceAreas0_(),
|
||||||
|
nonOverlapPatchName_(dict.lookup("nonOverlapPatch")),
|
||||||
|
nonOverlapPatchID_(-1),
|
||||||
|
updated_(false)
|
||||||
|
{
|
||||||
|
if (nonOverlapPatchName_ == name)
|
||||||
|
{
|
||||||
|
FatalIOErrorIn
|
||||||
|
(
|
||||||
|
"cyclicACMIPolyPatch::cyclicACMIPolyPatch"
|
||||||
|
"("
|
||||||
|
"const word&, "
|
||||||
|
"const dictionary&, "
|
||||||
|
"const label, "
|
||||||
|
"const polyBoundaryMesh&, "
|
||||||
|
"const word&"
|
||||||
|
")",
|
||||||
|
dict
|
||||||
|
) << "Non-overlapping patch name " << nonOverlapPatchName_
|
||||||
|
<< " cannot be the same as this patch " << name
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Non-overlapping patch might not be valid yet so cannot determine
|
||||||
|
// associated patchID
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::cyclicACMIPolyPatch::cyclicACMIPolyPatch
|
||||||
|
(
|
||||||
|
const cyclicACMIPolyPatch& pp,
|
||||||
|
const polyBoundaryMesh& bm
|
||||||
|
)
|
||||||
|
:
|
||||||
|
cyclicAMIPolyPatch(pp, bm),
|
||||||
|
faceAreas0_(),
|
||||||
|
nonOverlapPatchName_(pp.nonOverlapPatchName_),
|
||||||
|
nonOverlapPatchID_(-1),
|
||||||
|
updated_(false)
|
||||||
|
{
|
||||||
|
// Non-overlapping patch might not be valid yet so cannot determine
|
||||||
|
// associated patchID
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::cyclicACMIPolyPatch::cyclicACMIPolyPatch
|
||||||
|
(
|
||||||
|
const cyclicACMIPolyPatch& pp,
|
||||||
|
const polyBoundaryMesh& bm,
|
||||||
|
const label index,
|
||||||
|
const label newSize,
|
||||||
|
const label newStart,
|
||||||
|
const word& nbrPatchName,
|
||||||
|
const word& nonOverlapPatchName
|
||||||
|
)
|
||||||
|
:
|
||||||
|
cyclicAMIPolyPatch(pp, bm, index, newSize, newStart, nbrPatchName),
|
||||||
|
faceAreas0_(),
|
||||||
|
nonOverlapPatchName_(nonOverlapPatchName),
|
||||||
|
nonOverlapPatchID_(-1),
|
||||||
|
updated_(false)
|
||||||
|
{
|
||||||
|
if (nonOverlapPatchName_ == name())
|
||||||
|
{
|
||||||
|
FatalErrorIn
|
||||||
|
(
|
||||||
|
"const cyclicACMIPolyPatch& "
|
||||||
|
"const polyBoundaryMesh&, "
|
||||||
|
"const label, "
|
||||||
|
"const label, "
|
||||||
|
"const label, "
|
||||||
|
"const word&, "
|
||||||
|
"const word&"
|
||||||
|
) << "Non-overlapping patch name " << nonOverlapPatchName_
|
||||||
|
<< " cannot be the same as this patch " << name()
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Non-overlapping patch might not be valid yet so cannot determine
|
||||||
|
// associated patchID
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::cyclicACMIPolyPatch::cyclicACMIPolyPatch
|
||||||
|
(
|
||||||
|
const cyclicACMIPolyPatch& pp,
|
||||||
|
const polyBoundaryMesh& bm,
|
||||||
|
const label index,
|
||||||
|
const labelUList& mapAddressing,
|
||||||
|
const label newStart
|
||||||
|
)
|
||||||
|
:
|
||||||
|
cyclicAMIPolyPatch(pp, bm, index, mapAddressing, newStart),
|
||||||
|
faceAreas0_(),
|
||||||
|
nonOverlapPatchName_(pp.nonOverlapPatchName_),
|
||||||
|
nonOverlapPatchID_(-1),
|
||||||
|
updated_(false)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::cyclicACMIPolyPatch::~cyclicACMIPolyPatch()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::label Foam::cyclicACMIPolyPatch::nonOverlapPatchID() const
|
||||||
|
{
|
||||||
|
if (nonOverlapPatchID_ == -1)
|
||||||
|
{
|
||||||
|
nonOverlapPatchID_ =
|
||||||
|
this->boundaryMesh().findPatchID(nonOverlapPatchName_);
|
||||||
|
|
||||||
|
if (nonOverlapPatchID_ == -1)
|
||||||
|
{
|
||||||
|
FatalErrorIn("cyclicPolyAMIPatch::neighbPatchID() const")
|
||||||
|
<< "Illegal non-overlapping patch name " << nonOverlapPatchName_
|
||||||
|
<< nl << "Valid patch names are "
|
||||||
|
<< this->boundaryMesh().names()
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
const polyPatch& noPp = this->boundaryMesh()[nonOverlapPatchID_];
|
||||||
|
|
||||||
|
bool ok = true;
|
||||||
|
|
||||||
|
if (size() == noPp.size())
|
||||||
|
{
|
||||||
|
const scalarField magSf(mag(faceAreas()));
|
||||||
|
const scalarField noMagSf(mag(noPp.faceAreas()));
|
||||||
|
|
||||||
|
forAll(magSf, faceI)
|
||||||
|
{
|
||||||
|
scalar ratio = mag(magSf[faceI]/(noMagSf[faceI] + ROOTVSMALL));
|
||||||
|
|
||||||
|
if (ratio - 1 > tolerance_)
|
||||||
|
{
|
||||||
|
ok = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ok = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ok)
|
||||||
|
{
|
||||||
|
FatalErrorIn
|
||||||
|
(
|
||||||
|
"Foam::label "
|
||||||
|
"Foam::cyclicACMIPolyPatch::nonOverlapPatchID() const"
|
||||||
|
) << "Inconsistent ACMI patches " << name() << " and "
|
||||||
|
<< noPp.name() << ". Patches should have identical topology"
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nonOverlapPatchID_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPolyPatch::calcGeometry
|
||||||
|
(
|
||||||
|
const primitivePatch& referPatch,
|
||||||
|
const pointField& thisCtrs,
|
||||||
|
const vectorField& thisAreas,
|
||||||
|
const pointField& thisCc,
|
||||||
|
const pointField& nbrCtrs,
|
||||||
|
const vectorField& nbrAreas,
|
||||||
|
const pointField& nbrCc
|
||||||
|
)
|
||||||
|
{
|
||||||
|
cyclicAMIPolyPatch::calcGeometry
|
||||||
|
(
|
||||||
|
referPatch,
|
||||||
|
thisCtrs,
|
||||||
|
thisAreas,
|
||||||
|
thisCc,
|
||||||
|
nbrCtrs,
|
||||||
|
nbrAreas,
|
||||||
|
nbrCc
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPolyPatch::initOrder
|
||||||
|
(
|
||||||
|
PstreamBuffers& pBufs,
|
||||||
|
const primitivePatch& pp
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
cyclicAMIPolyPatch::initOrder(pBufs, pp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::cyclicACMIPolyPatch::order
|
||||||
|
(
|
||||||
|
PstreamBuffers& pBufs,
|
||||||
|
const primitivePatch& pp,
|
||||||
|
labelList& faceMap,
|
||||||
|
labelList& rotation
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return cyclicAMIPolyPatch::order(pBufs, pp, faceMap, rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::cyclicACMIPolyPatch::write(Ostream& os) const
|
||||||
|
{
|
||||||
|
cyclicAMIPolyPatch::write(os);
|
||||||
|
|
||||||
|
os.writeKeyword("nonOverlapPatch") << nonOverlapPatchName_
|
||||||
|
<< token::END_STATEMENT << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,349 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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::cyclicACMIPolyPatch
|
||||||
|
|
||||||
|
Description
|
||||||
|
Cyclic patch for Arbitrarily Coupled Mesh Interface (ACMI)
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
cyclicACMIPolyPatch.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef cyclicACMIPolyPatch_H
|
||||||
|
#define cyclicACMIPolyPatch_H
|
||||||
|
|
||||||
|
#include "cyclicAMIPolyPatch.H"
|
||||||
|
#include "AMIPatchToPatchInterpolation.H"
|
||||||
|
#include "polyBoundaryMesh.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class cyclicACMIPolyPatch Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class cyclicACMIPolyPatch
|
||||||
|
:
|
||||||
|
public cyclicAMIPolyPatch
|
||||||
|
{
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Copy of the original patch face areas
|
||||||
|
mutable vectorField faceAreas0_;
|
||||||
|
|
||||||
|
//- Name of non-overlapping patch
|
||||||
|
const word nonOverlapPatchName_;
|
||||||
|
|
||||||
|
//- Index of non-overlapping patch
|
||||||
|
mutable label nonOverlapPatchID_;
|
||||||
|
|
||||||
|
//- Flag to indicate that AMI has been updated
|
||||||
|
mutable bool updated_;
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
static const scalar tolerance_;
|
||||||
|
|
||||||
|
|
||||||
|
// Protected Member Functions
|
||||||
|
|
||||||
|
//- Initialise patch face areas
|
||||||
|
virtual void initPatchFaceAreas() const;
|
||||||
|
|
||||||
|
//- Reset the AMI interpolator
|
||||||
|
virtual void resetAMI
|
||||||
|
(
|
||||||
|
const AMIPatchToPatchInterpolation::interpolationMethod& AMIMethod =
|
||||||
|
AMIPatchToPatchInterpolation::imFaceAreaWeight
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Set neighbour ACMI patch areas
|
||||||
|
virtual void setNeighbourFaceAreas() const;
|
||||||
|
|
||||||
|
//- Initialise the calculation of the patch geometry
|
||||||
|
virtual void initGeometry(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();
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Runtime type information
|
||||||
|
TypeName("cyclicACMI");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct from (base couped patch) components
|
||||||
|
cyclicACMIPolyPatch
|
||||||
|
(
|
||||||
|
const word& name,
|
||||||
|
const label size,
|
||||||
|
const label start,
|
||||||
|
const label index,
|
||||||
|
const polyBoundaryMesh& bm,
|
||||||
|
const word& patchType,
|
||||||
|
const transformType transform = UNKNOWN
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct from dictionary
|
||||||
|
cyclicACMIPolyPatch
|
||||||
|
(
|
||||||
|
const word& name,
|
||||||
|
const dictionary& dict,
|
||||||
|
const label index,
|
||||||
|
const polyBoundaryMesh& bm,
|
||||||
|
const word& patchType
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct as copy, resetting the boundary mesh
|
||||||
|
cyclicACMIPolyPatch
|
||||||
|
(
|
||||||
|
const cyclicACMIPolyPatch&,
|
||||||
|
const polyBoundaryMesh&
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct given the original patch and resetting the
|
||||||
|
// face list and boundary mesh information
|
||||||
|
cyclicACMIPolyPatch
|
||||||
|
(
|
||||||
|
const cyclicACMIPolyPatch& pp,
|
||||||
|
const polyBoundaryMesh& bm,
|
||||||
|
const label index,
|
||||||
|
const label newSize,
|
||||||
|
const label newStart,
|
||||||
|
const word& nbrPatchName,
|
||||||
|
const word& nonOverlapPatchName
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Construct given the original patch and a map
|
||||||
|
cyclicACMIPolyPatch
|
||||||
|
(
|
||||||
|
const cyclicACMIPolyPatch& 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 cyclicACMIPolyPatch(*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 cyclicACMIPolyPatch
|
||||||
|
(
|
||||||
|
*this,
|
||||||
|
bm,
|
||||||
|
index,
|
||||||
|
newSize,
|
||||||
|
newStart,
|
||||||
|
neighbPatchName(),
|
||||||
|
nonOverlapPatchName_
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- 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 cyclicACMIPolyPatch
|
||||||
|
(
|
||||||
|
*this,
|
||||||
|
bm,
|
||||||
|
index,
|
||||||
|
mapAddressing,
|
||||||
|
newStart
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//- Destructor
|
||||||
|
virtual ~cyclicACMIPolyPatch();
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
// Access
|
||||||
|
|
||||||
|
//- Reset the updated flag
|
||||||
|
inline void setUpdated(bool flag) const;
|
||||||
|
|
||||||
|
//- Return access to the updated flag
|
||||||
|
inline bool updated() const;
|
||||||
|
|
||||||
|
//- Return access to the original patch face areas
|
||||||
|
inline const vectorField& faceAreas0() const;
|
||||||
|
|
||||||
|
//- Non-overlapping patch name
|
||||||
|
inline const word& nonOverlapPatchName() const;
|
||||||
|
|
||||||
|
//- Non-overlapping patch ID
|
||||||
|
virtual label nonOverlapPatchID() const;
|
||||||
|
|
||||||
|
//- Return a const reference to the non-overlapping patch
|
||||||
|
inline const polyPatch& nonOverlapPatch() const;
|
||||||
|
|
||||||
|
//- Return a reference to the non-overlapping patch
|
||||||
|
inline polyPatch& nonOverlapPatch();
|
||||||
|
|
||||||
|
//- Mask field where 1 = overlap, 0 = no-overlap
|
||||||
|
inline const scalarField& mask() const;
|
||||||
|
|
||||||
|
|
||||||
|
// Interpolations
|
||||||
|
|
||||||
|
//- Interpolate field
|
||||||
|
template<class Type>
|
||||||
|
tmp<Field<Type> > interpolate
|
||||||
|
(
|
||||||
|
const Field<Type>& fldCouple,
|
||||||
|
const Field<Type>& fldNonOverlap
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Interpolate tmp field
|
||||||
|
template<class Type>
|
||||||
|
tmp<Field<Type> > interpolate
|
||||||
|
(
|
||||||
|
const tmp<Field<Type> >& tFldCouple,
|
||||||
|
const tmp<Field<Type> >& tFldNonOverlap
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Low-level interpolate List
|
||||||
|
template<class Type, class CombineOp>
|
||||||
|
void interpolate
|
||||||
|
(
|
||||||
|
const UList<Type>& fldCouple,
|
||||||
|
const UList<Type>& fldNonOverlap,
|
||||||
|
const CombineOp& cop,
|
||||||
|
List<Type>& result
|
||||||
|
) const;
|
||||||
|
|
||||||
|
|
||||||
|
//- Calculate the patch geometry
|
||||||
|
virtual void calcGeometry
|
||||||
|
(
|
||||||
|
const primitivePatch& referPatch,
|
||||||
|
const pointField& thisCtrs,
|
||||||
|
const vectorField& thisAreas,
|
||||||
|
const pointField& thisCc,
|
||||||
|
const pointField& nbrCtrs,
|
||||||
|
const vectorField& nbrAreas,
|
||||||
|
const pointField& nbrCc
|
||||||
|
);
|
||||||
|
|
||||||
|
//- 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;
|
||||||
|
|
||||||
|
//- Write the polyPatch data as a dictionary
|
||||||
|
virtual void write(Ostream&) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#include "cyclicACMIPolyPatchI.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#ifdef NoRepository
|
||||||
|
#include "cyclicACMIPolyPatchTemplates.C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,83 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
inline void Foam::cyclicACMIPolyPatch::setUpdated(const bool flag) const
|
||||||
|
{
|
||||||
|
updated_ = flag;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool Foam::cyclicACMIPolyPatch::updated() const
|
||||||
|
{
|
||||||
|
return updated_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const Foam::vectorField& Foam::cyclicACMIPolyPatch::faceAreas0() const
|
||||||
|
{
|
||||||
|
return faceAreas0_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const Foam::word& Foam::cyclicACMIPolyPatch::nonOverlapPatchName() const
|
||||||
|
{
|
||||||
|
return nonOverlapPatchName_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const Foam::polyPatch& Foam::cyclicACMIPolyPatch::nonOverlapPatch() const
|
||||||
|
{
|
||||||
|
// note: use nonOverlapPatchID() as opposed to patch name to initialise
|
||||||
|
// demand-driven data
|
||||||
|
|
||||||
|
return this->boundaryMesh()[nonOverlapPatchID()];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::polyPatch& Foam::cyclicACMIPolyPatch::nonOverlapPatch()
|
||||||
|
{
|
||||||
|
// note: use nonOverlapPatchID() as opposed to patch name to initialise
|
||||||
|
// demand-driven data
|
||||||
|
|
||||||
|
return const_cast<polyPatch&>(this->boundaryMesh()[nonOverlapPatchID()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline const Foam::scalarField& Foam::cyclicACMIPolyPatch::mask() const
|
||||||
|
{
|
||||||
|
if (owner())
|
||||||
|
{
|
||||||
|
return AMI().srcWeightsSum();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return neighbPatch().AMI().tgtWeightsSum();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -0,0 +1,91 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2013 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/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::tmp<Foam::Field<Type> > Foam::cyclicACMIPolyPatch::interpolate
|
||||||
|
(
|
||||||
|
const Field<Type>& fldCouple,
|
||||||
|
const Field<Type>& fldNonOverlap
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
if (owner())
|
||||||
|
{
|
||||||
|
const scalarField& w = AMI().srcWeightsSum();
|
||||||
|
|
||||||
|
return
|
||||||
|
w*AMI().interpolateToSource(fldCouple)
|
||||||
|
+ (1.0 - w)*fldNonOverlap;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const scalarField& w = neighbPatch().AMI().tgtWeightsSum();
|
||||||
|
|
||||||
|
return
|
||||||
|
w*neighbPatch().AMI().interpolateToTarget(fldCouple)
|
||||||
|
+ (1.0 - w)*fldNonOverlap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::tmp<Foam::Field<Type> > Foam::cyclicACMIPolyPatch::interpolate
|
||||||
|
(
|
||||||
|
const tmp<Field<Type> >& tFldCouple,
|
||||||
|
const tmp<Field<Type> >& tFldNonOverlap
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return interpolate(tFldCouple(), tFldNonOverlap());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type, class CombineOp>
|
||||||
|
void Foam::cyclicACMIPolyPatch::interpolate
|
||||||
|
(
|
||||||
|
const UList<Type>& fldCouple,
|
||||||
|
const UList<Type>& fldNonOverlap,
|
||||||
|
const CombineOp& cop,
|
||||||
|
List<Type>& result
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
if (owner())
|
||||||
|
{
|
||||||
|
const scalarField& w = AMI().srcWeightsSum();
|
||||||
|
|
||||||
|
AMI().interpolateToSource(fldCouple, cop, result);
|
||||||
|
result = w*result + (1.0 - w)*fldNonOverlap;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const scalarField& w = neighbPatch().AMI().tgtWeightsSum();
|
||||||
|
|
||||||
|
neighbPatch().AMI().interpolateToTarget(fldCouple, cop, result);
|
||||||
|
result = w*result + (1.0 - w)*fldNonOverlap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -175,14 +175,23 @@ $(AMI)/AMIInterpolation/AMIPatchToPatchInterpolation.C
|
|||||||
$(AMI)/faceAreaIntersect/faceAreaIntersect.C
|
$(AMI)/faceAreaIntersect/faceAreaIntersect.C
|
||||||
$(AMI)/GAMG/interfaces/cyclicAMIGAMGInterface/cyclicAMIGAMGInterface.C
|
$(AMI)/GAMG/interfaces/cyclicAMIGAMGInterface/cyclicAMIGAMGInterface.C
|
||||||
$(AMI)/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.C
|
$(AMI)/GAMG/interfaceFields/cyclicAMIGAMGInterfaceField/cyclicAMIGAMGInterfaceField.C
|
||||||
|
$(AMI)/GAMG/interfaces/cyclicACMIGAMGInterface/cyclicACMIGAMGInterface.C
|
||||||
|
$(AMI)/GAMG/interfaceFields/cyclicACMIGAMGInterfaceField/cyclicACMIGAMGInterfaceField.C
|
||||||
|
|
||||||
AMICycPatches=$(AMI)/patches/cyclic
|
AMICycPatches=$(AMI)/patches/cyclicAMI
|
||||||
$(AMICycPatches)/cyclicAMILduInterfaceField/cyclicAMILduInterface.C
|
$(AMICycPatches)/cyclicAMILduInterfaceField/cyclicAMILduInterface.C
|
||||||
$(AMICycPatches)/cyclicAMILduInterfaceField/cyclicAMILduInterfaceField.C
|
$(AMICycPatches)/cyclicAMILduInterfaceField/cyclicAMILduInterfaceField.C
|
||||||
$(AMICycPatches)/cyclicAMIPolyPatch/cyclicAMIPolyPatch.C
|
$(AMICycPatches)/cyclicAMIPolyPatch/cyclicAMIPolyPatch.C
|
||||||
$(AMICycPatches)/cyclicAMIPointPatch/cyclicAMIPointPatch.C
|
$(AMICycPatches)/cyclicAMIPointPatch/cyclicAMIPointPatch.C
|
||||||
$(AMICycPatches)/cyclicAMIPointPatchField/cyclicAMIPointPatchFields.C
|
$(AMICycPatches)/cyclicAMIPointPatchField/cyclicAMIPointPatchFields.C
|
||||||
|
|
||||||
|
ACMICycPatches=$(AMI)/patches/cyclicACMI
|
||||||
|
$(ACMICycPatches)/cyclicACMILduInterfaceField/cyclicACMILduInterface.C
|
||||||
|
$(ACMICycPatches)/cyclicACMILduInterfaceField/cyclicACMILduInterfaceField.C
|
||||||
|
$(ACMICycPatches)/cyclicACMIPolyPatch/cyclicACMIPolyPatch.C
|
||||||
|
$(ACMICycPatches)/cyclicACMIPointPatch/cyclicACMIPointPatch.C
|
||||||
|
$(ACMICycPatches)/cyclicACMIPointPatchField/cyclicACMIPointPatchFields.C
|
||||||
|
|
||||||
mappedPatches/mappedPolyPatch/mappedPatchBase.C
|
mappedPatches/mappedPolyPatch/mappedPatchBase.C
|
||||||
mappedPatches/mappedPolyPatch/mappedPolyPatch.C
|
mappedPatches/mappedPolyPatch/mappedPolyPatch.C
|
||||||
mappedPatches/mappedPolyPatch/mappedWallPolyPatch.C
|
mappedPatches/mappedPolyPatch/mappedWallPolyPatch.C
|
||||||
|
|||||||
Reference in New Issue
Block a user