mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: Add templates file
This commit is contained in:
@ -0,0 +1,191 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2011-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 "conformalVoronoiMesh.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
template <class Triangulation>
|
||||
Foam::scalar Foam::conformalVoronoiMesh::calculateLoadUnbalance
|
||||
(
|
||||
const Triangulation& mesh
|
||||
) const
|
||||
{
|
||||
label nRealVertices = 0;
|
||||
|
||||
for
|
||||
(
|
||||
typename Triangulation::Finite_vertices_iterator vit
|
||||
= mesh.finite_vertices_begin();
|
||||
vit != mesh.finite_vertices_end();
|
||||
++vit
|
||||
)
|
||||
{
|
||||
// Only store real vertices that are not feature vertices
|
||||
if (vit->real() && !vit->featurePoint())
|
||||
{
|
||||
nRealVertices++;
|
||||
}
|
||||
}
|
||||
|
||||
scalar globalNRealVertices = returnReduce
|
||||
(
|
||||
nRealVertices,
|
||||
sumOp<label>()
|
||||
);
|
||||
|
||||
scalar unbalance = returnReduce
|
||||
(
|
||||
mag(1.0 - nRealVertices/(globalNRealVertices/Pstream::nProcs())),
|
||||
maxOp<scalar>()
|
||||
);
|
||||
|
||||
Info<< " Processor unbalance " << unbalance << endl;
|
||||
|
||||
return unbalance;
|
||||
}
|
||||
|
||||
|
||||
template <class Triangulation>
|
||||
bool Foam::conformalVoronoiMesh::distributeBackground(const Triangulation& mesh)
|
||||
{
|
||||
if (!Pstream::parRun())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Info<< nl << "Redistributing points" << endl;
|
||||
|
||||
timeCheck("Before distribute");
|
||||
|
||||
label iteration = 0;
|
||||
|
||||
scalar previousLoadUnbalance = 0;
|
||||
|
||||
while (true)
|
||||
{
|
||||
scalar maxLoadUnbalance = calculateLoadUnbalance(mesh);
|
||||
|
||||
if
|
||||
(
|
||||
maxLoadUnbalance <= cvMeshControls().maxLoadUnbalance()
|
||||
|| maxLoadUnbalance <= previousLoadUnbalance
|
||||
)
|
||||
{
|
||||
// If this is the first iteration, return false, if it was a
|
||||
// subsequent one, return true;
|
||||
return iteration != 0;
|
||||
}
|
||||
|
||||
previousLoadUnbalance = maxLoadUnbalance;
|
||||
|
||||
Info<< " Total number of vertices before redistribution "
|
||||
<< returnReduce(label(mesh.number_of_vertices()), sumOp<label>())
|
||||
<< endl;
|
||||
|
||||
const fvMesh& bMesh = decomposition_().mesh();
|
||||
|
||||
volScalarField cellWeights
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"cellWeights",
|
||||
bMesh.time().timeName(),
|
||||
bMesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE
|
||||
),
|
||||
bMesh,
|
||||
dimensionedScalar("weight", dimless, 1e-2),
|
||||
zeroGradientFvPatchScalarField::typeName
|
||||
);
|
||||
|
||||
meshSearch cellSearch(bMesh, polyMesh::FACEPLANES);
|
||||
|
||||
labelList cellVertices(bMesh.nCells(), 0);
|
||||
|
||||
for
|
||||
(
|
||||
typename Triangulation::Finite_vertices_iterator vit
|
||||
= mesh.finite_vertices_begin();
|
||||
vit != mesh.finite_vertices_end();
|
||||
++vit
|
||||
)
|
||||
{
|
||||
// Only store real vertices that are not feature vertices
|
||||
if (vit->real() && !vit->featurePoint())
|
||||
{
|
||||
pointFromPoint v = topoint(vit->point());
|
||||
|
||||
label cellI = cellSearch.findCell(v);
|
||||
|
||||
if (cellI == -1)
|
||||
{
|
||||
// Pout<< "findCell conformalVoronoiMesh::distribute "
|
||||
// << "findCell "
|
||||
// << vit->type() << " "
|
||||
// << vit->index() << " "
|
||||
// << v << " "
|
||||
// << cellI
|
||||
// << " find nearest cellI ";
|
||||
|
||||
cellI = cellSearch.findNearestCell(v);
|
||||
}
|
||||
|
||||
cellVertices[cellI]++;
|
||||
}
|
||||
}
|
||||
|
||||
forAll(cellVertices, cI)
|
||||
{
|
||||
// Give a small but finite weight for empty cells. Some
|
||||
// decomposition methods have difficulty with integer overflows in
|
||||
// the sum of the normalised weight field.
|
||||
cellWeights.internalField()[cI] = max
|
||||
(
|
||||
cellVertices[cI],
|
||||
1e-2
|
||||
);
|
||||
}
|
||||
|
||||
autoPtr<mapDistributePolyMesh> mapDist = decomposition_().distribute
|
||||
(
|
||||
cellWeights
|
||||
);
|
||||
|
||||
cellShapeControl_.shapeControlMesh().distribute(decomposition_);
|
||||
|
||||
distribute();
|
||||
|
||||
timeCheck("After distribute");
|
||||
|
||||
iteration++;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
Reference in New Issue
Block a user