ENH: patchRegion: test app for PatchEdgeFaceWave

This commit is contained in:
mattijs
2013-07-30 13:01:32 +01:00
parent f75138d1f6
commit db0036f34e
12 changed files with 682 additions and 0 deletions

View File

@ -0,0 +1,3 @@
Test-patchRegion.C
EXE = $(FOAM_USER_APPBIN)/Test-patchRegion

View File

@ -0,0 +1,7 @@
EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude
EXE_LIBS = \
-lfiniteVolume \
-lmeshTools

View File

@ -0,0 +1,2 @@
2013-05-27 Detect 'pinches' in patch (i.e., non-manifold on point). Run on
cavity_pinched subdirectory.

View File

@ -0,0 +1,157 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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/>.
Description
Detect point pinches
\*---------------------------------------------------------------------------*/
#include "argList.H"
#include "PatchTools.H"
#include "Time.H"
#include "polyMesh.H"
#include "patchEdgeFaceRegions.H"
#include "PatchEdgeFaceWave.H"
#include "globalIndex.H"
#include "syncTools.H"
using namespace Foam;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Main program:
int main(int argc, char *argv[])
{
argList::validArgs.append("patch");
# include "setRootCase.H"
# include "createTime.H"
const word patchName = args[1];
# include "createPolyMesh.H"
Info<< "Mesh read in = "
<< runTime.cpuTimeIncrement()
<< " s\n" << endl << endl;
const polyBoundaryMesh& pbm = mesh.boundaryMesh();
label patchI = pbm.findPatchID(patchName);
const polyPatch& patch = pbm[patchI];
Info<< "Patch:" << patch.name() << endl;
// Data on all edges and faces
List<patchEdgeFaceRegions> allEdgeInfo(patch.nEdges());
List<patchEdgeFaceRegions> allFaceInfo(patch.size());
// Determine parallel global indexing
const globalIndex globalNumbering(patch.size());
DynamicList<label> changedEdges(4*patch.size());
DynamicList<patchEdgeFaceRegions> changedInfo(changedEdges.size());
forAll(patch, faceI)
{
const labelList& fEdges = patch.faceEdges()[faceI];
label globalFaceI = globalNumbering.toGlobal(faceI);
forAll(fEdges, i)
{
changedEdges.append(fEdges[i]);
changedInfo.append
(
patchEdgeFaceRegions(labelPair(globalFaceI, globalFaceI))
);
}
}
// Walk
PatchEdgeFaceWave
<
primitivePatch,
patchEdgeFaceRegions
> calc
(
mesh,
patch,
changedEdges,
changedInfo,
allEdgeInfo,
allFaceInfo,
returnReduce(patch.nEdges(), sumOp<label>())
);
Info<< "Time now = " << runTime.timeName() << endl;
// Detect points with multiple regions
labelList duplicateRegion(patch.nPoints(), -1);
{
labelList currentRegion(patch.nPoints(), -1);
forAll(patch.localFaces(), faceI)
{
const face& f = patch.localFaces()[faceI];
forAll(f, fp)
{
label faceRegion = allFaceInfo[faceI].regions()[fp];
label pointI = f[fp];
if (currentRegion[pointI] == -1)
{
currentRegion[pointI] = faceRegion;
}
else if (currentRegion[pointI] != faceRegion)
{
if (duplicateRegion[pointI] == -1)
{
Pout<< "Multi region point:"
<< patch.localPoints()[pointI]
<< " with region:" << currentRegion[pointI]
<< " and region:" << faceRegion
<< endl;
duplicateRegion[pointI] = currentRegion[pointI];
}
}
}
}
}
Info<< "End\n" << endl;
return 0;
}
// ************************************************************************* //

View File

@ -0,0 +1,17 @@
constant/
cavity blockMesh
point (0.05 0.05 0.01) moved to (0.05 0.05 0.001)
0.005/
collapseEdges with
collapseEdgesCoeffs.minimumEdgeLength 0.0011;
so it collapses the one edge
processor*/0.005/
decomposePar
mpirun -np 2 Test-patchRegion -parallel

View File

@ -0,0 +1,75 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: dev |
| \\ / A nd | Web: www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
convertToMeters 0.1;
vertices
(
(0 0 0)
(1 0 0)
(1 1 0)
(0 1 0)
(0 0 0.1)
(1 0 0.1)
(1 1 0.1)
(0 1 0.1)
);
blocks
(
hex (0 1 2 3 4 5 6 7) (20 20 1) simpleGrading (1 1 1)
);
edges
(
);
boundary
(
movingWall
{
type wall;
faces
(
(3 7 6 2)
);
}
fixedWalls
{
type wall;
faces
(
(0 4 7 3)
(2 6 5 1)
(1 5 4 0)
);
}
frontAndBack
{
type empty;
faces
(
(0 3 2 1)
(4 5 6 7)
);
}
);
mergePatchPairs
(
);
// ************************************************************************* //

View File

@ -0,0 +1,21 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: dev |
| \\ / A nd | Web: www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "constant";
object transportProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
nu nu [ 0 2 -1 0 0 0 0 ] 0.01;
// ************************************************************************* //

View File

@ -0,0 +1,89 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: dev |
| \\ / A nd | Web: www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object collapseDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// If on, after collapsing check the quality of the mesh. If bad faces are
// generated then redo the collapsing with stricter filtering.
controlMeshQuality off;
collapseEdgesCoeffs
{
// Edges shorter than this absolute value will be merged
minimumEdgeLength 0.0011;
// The maximum angle between two edges that share a point attached to
// no other edges
maximumMergeAngle 30;
}
//collapseFacesCoeffs
//{
// // The initial face length factor
// initialFaceLengthFactor 0.5;
//
// // If the face can't be collapsed to an edge, and it has a span less than
// // the target face length multiplied by this coefficient, collapse it
// // to a point.
// maxCollapseFaceToPointSideLengthCoeff 0.3;
//
// // Allow early collapse of edges to a point
// allowEarlyCollapseToPoint on;
//
// // Fraction to premultiply maxCollapseFaceToPointSideLengthCoeff by if
// // allowEarlyCollapseToPoint is enabled
// allowEarlyCollapseCoeff 0.2;
//
// // Defining how close to the midpoint (M) of the projected
// // vertices line a projected vertex (X) can be before making this
// // an invalid edge collapse
// //
// // X---X-g----------------M----X-----------g----X--X
// //
// // Only allow a collapse if all projected vertices are outwith
// // guardFraction (g) of the distance form the face centre to the
// // furthest vertex in the considered direction
// guardFraction 0.1;
//}
//
//
//controlMeshQualityCoeffs
//{
// // Name of the dictionary that has the mesh quality coefficients used
// // by motionSmoother::checkMesh
// #include "meshQualityDict";
//
// // The amount that minimumEdgeLength will be reduced by for each
// // edge if that edge's collapse generates a poor quality face
// edgeReductionFactor 0.5;
//
// // The amount that initialFaceLengthFactor will be reduced by for each
// // face if its collapse generates a poor quality face
// faceReductionFactor $initialFaceLengthFactor;
//
// // Maximum number of smoothing iterations for the reductionFactors
// maximumSmoothingIterations 2;
//
// // Maximum number of outer iterations is mesh quality checking is enabled
// maximumIterations 10;
//
// // Maximum number of iterations deletion of a point can cause a bad face
// // to be constructed before it is forced to not be deleted
// maxPointErrorCount 5;
//}
// ************************************************************************* //

View File

@ -0,0 +1,54 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: dev |
| \\ / A nd | Web: www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
DebugSwitches
{
PatchEdgeFaceWave 1;
}
application icoFoam;
startFrom latestTime;
startTime 0;
stopAt endTime;
endTime 0.5;
deltaT 0.005;
writeControl timeStep;
writeInterval 20;
purgeWrite 0;
writeFormat ascii;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable true;
// ************************************************************************* //

View File

@ -0,0 +1,138 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: dev |
| \\ / A nd | Web: www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
note "mesh decomposition control dictionary";
object decomposeParDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
numberOfSubdomains 2;
//- Keep owner and neighbour on same processor for faces in zones:
// preserveFaceZones (heater solid1 solid3);
//- Keep owner and neighbour on same processor for faces in patches:
// (makes sense only for cyclic patches)
//preservePatches (cyclic_half0 cyclic_half1);
//- Keep all of faceSet on a single processor. This puts all cells
// connected with a point, edge or face on the same processor.
// (just having face connected cells might not guarantee a balanced
// decomposition)
// The processor can be -1 (the decompositionMethod chooses the processor
// for a good load balance) or explicitly provided (upsets balance).
//singleProcessorFaceSets ((f0 -1));
//- Use the volScalarField named here as a weight for each cell in the
// decomposition. For example, use a particle population field to decompose
// for a balanced number of particles in a lagrangian simulation.
// weightField dsmcRhoNMean;
//method scotch;
method hierarchical;
// method simple;
// method metis;
// method manual;
// method multiLevel;
// method structured; // does 2D decomposition of structured mesh
multiLevelCoeffs
{
// Decomposition methods to apply in turn. This is like hierarchical but
// fully general - every method can be used at every level.
level0
{
numberOfSubdomains 64;
//method simple;
//simpleCoeffs
//{
// n (2 1 1);
// delta 0.001;
//}
method scotch;
}
level1
{
numberOfSubdomains 4;
method scotch;
}
}
// Desired output
simpleCoeffs
{
n (2 1 1);
delta 0.001;
}
hierarchicalCoeffs
{
n (2 1 1);
delta 0.001;
order xyz;
}
metisCoeffs
{
/*
processorWeights
(
1
1
1
1
);
*/
}
scotchCoeffs
{
//processorWeights
//(
// 1
// 1
// 1
// 1
//);
//writeGraph true;
//strategy "b";
}
manualCoeffs
{
dataFile "decompositionData";
}
structuredCoeffs
{
// Patches to do 2D decomposition on. Structured mesh only; cells have
// to be in 'columns' on top of patches.
patches (movingWall);
// Method to use on the 2D subset
method scotch;
}
//// Is the case distributed? Note: command-line argument -roots takes
//// precedence
//distributed yes;
//// Per slave (so nProcs-1 entries) the directory above the case.
//roots
//(
// "/tmp"
// "/tmp"
//);
// ************************************************************************* //

View File

@ -0,0 +1,60 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: dev |
| \\ / A nd | Web: www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object fvSchemes;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
ddtSchemes
{
default Euler;
}
gradSchemes
{
default Gauss linear;
grad(p) Gauss linear;
}
divSchemes
{
default none;
div(phi,U) Gauss linear;
}
laplacianSchemes
{
default none;
laplacian(nu,U) Gauss linear orthogonal;
laplacian((1|A(U)),p) Gauss linear orthogonal;
}
interpolationSchemes
{
default linear;
interpolate(HbyA) linear;
}
snGradSchemes
{
default orthogonal;
}
fluxRequired
{
default no;
p ;
}
// ************************************************************************* //

View File

@ -0,0 +1,59 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: dev |
| \\ / A nd | Web: www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object fvSolution;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
solvers
{
p
{
//solver PCG;
//preconditioner DIC;
solver GAMG;
smoother GaussSeidel;
nPreSweeps 0;
nPostSweeps 2;
cacheAgglomeration on;
agglomerator faceAreaPair;
nCellsInCoarsestLevel 3;
mergeLevels 1;
processorAgglomerator none; //procFaces;
//nAgglomeratingCells 20;
tolerance 1e-06;
relTol 0;
}
U
{
solver PBiCG;
preconditioner DILU;
tolerance 1e-05;
relTol 0;
}
}
PISO
{
nCorrectors 2;
nNonOrthogonalCorrectors 0;
pRefCell 0;
pRefValue 0;
}
// ************************************************************************* //