mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
201 lines
5.9 KiB
C
201 lines
5.9 KiB
C
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
\\ / O peration |
|
|
\\ / A nd |
|
|
\\/ M anipulation |
|
|
-------------------------------------------------------------------------------
|
|
| Copyright (C) 2013-2016 OpenFOAM Foundation
|
|
-------------------------------------------------------------------------------
|
|
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
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
|
|
|
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.ref();
|
|
|
|
forAll(pnf, facei)
|
|
{
|
|
pnf[facei] = iF[nbrFaceCells[facei]];
|
|
}
|
|
|
|
return tpnf;
|
|
}
|
|
|
|
|
|
// ************************************************************************* //
|