Commit e2d2f505 authored by mattijs's avatar mattijs
Browse files

ENH: snappyHexMesh: keep orientation of baffle

parent 03fa70e4
......@@ -369,7 +369,10 @@ int main(int argc, char *argv[])
// Add all the surface regions as patches
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
labelList globalToPatch;
//- Global surface region to patch (non faceZone surface) or patches
// (faceZone surfaces)
labelList globalToMasterPatch;
labelList globalToSlavePatch;
{
Info<< nl
<< "Adding patches for surface regions" << nl
......@@ -377,7 +380,8 @@ int main(int argc, char *argv[])
<< endl;
// From global region number to mesh patch.
globalToPatch.setSize(surfaces.nRegions(), -1);
globalToMasterPatch.setSize(surfaces.nRegions(), -1);
globalToSlavePatch.setSize(surfaces.nRegions(), -1);
Info<< "Patch\tType\tRegion" << nl
<< "-----\t----\t------"
......@@ -394,36 +398,111 @@ int main(int argc, char *argv[])
Info<< surfaces.names()[surfI] << ':' << nl << nl;
forAll(regNames, i)
if (surfaces.faceZoneNames()[surfI].empty())
{
label globalRegionI = surfaces.globalRegion(surfI, i);
label patchI;
if (surfacePatchInfo.set(globalRegionI))
// 'Normal' surface
forAll(regNames, i)
{
patchI = meshRefiner.addMeshedPatch
(
regNames[i],
surfacePatchInfo[globalRegionI]
);
label globalRegionI = surfaces.globalRegion(surfI, i);
label patchI;
if (surfacePatchInfo.set(globalRegionI))
{
patchI = meshRefiner.addMeshedPatch
(
regNames[i],
surfacePatchInfo[globalRegionI]
);
}
else
{
dictionary patchInfo;
patchInfo.set("type", wallPolyPatch::typeName);
patchI = meshRefiner.addMeshedPatch
(
regNames[i],
patchInfo
);
}
Info<< patchI << '\t' << mesh.boundaryMesh()[patchI].type()
<< '\t' << regNames[i] << nl;
globalToMasterPatch[globalRegionI] = patchI;
globalToSlavePatch[globalRegionI] = patchI;
}
else
}
else
{
// Zoned surface
forAll(regNames, i)
{
dictionary patchInfo;
patchInfo.set("type", wallPolyPatch::typeName);
patchI = meshRefiner.addMeshedPatch
(
regNames[i],
patchInfo
);
label globalRegionI = surfaces.globalRegion(surfI, i);
// Add master side patch
{
label patchI;
if (surfacePatchInfo.set(globalRegionI))
{
patchI = meshRefiner.addMeshedPatch
(
regNames[i],
surfacePatchInfo[globalRegionI]
);
}
else
{
dictionary patchInfo;
patchInfo.set("type", wallPolyPatch::typeName);
patchI = meshRefiner.addMeshedPatch
(
regNames[i],
patchInfo
);
}
Info<< patchI << '\t'
<< mesh.boundaryMesh()[patchI].type()
<< '\t' << regNames[i] << nl;
globalToMasterPatch[globalRegionI] = patchI;
}
// Add slave side patch
{
const word slaveName = regNames[i] + "_slave";
label patchI;
if (surfacePatchInfo.set(globalRegionI))
{
patchI = meshRefiner.addMeshedPatch
(
slaveName,
surfacePatchInfo[globalRegionI]
);
}
else
{
dictionary patchInfo;
patchInfo.set("type", wallPolyPatch::typeName);
patchI = meshRefiner.addMeshedPatch
(
slaveName,
patchInfo
);
}
Info<< patchI << '\t'
<< mesh.boundaryMesh()[patchI].type()
<< '\t' << slaveName << nl;
globalToSlavePatch[globalRegionI] = patchI;
}
}
Info<< patchI << '\t' << mesh.boundaryMesh()[patchI].type()
<< '\t' << regNames[i] << nl;
globalToPatch[globalRegionI] = patchI;
}
Info<< nl;
......@@ -479,7 +558,8 @@ int main(int argc, char *argv[])
meshRefiner,
decomposer,
distributor,
globalToPatch
globalToMasterPatch,
globalToSlavePatch
);
// Refinement parameters
......@@ -510,7 +590,8 @@ int main(int argc, char *argv[])
autoSnapDriver snapDriver
(
meshRefiner,
globalToPatch
globalToMasterPatch,
globalToSlavePatch
);
// Snap parameters
......@@ -544,7 +625,12 @@ int main(int argc, char *argv[])
{
cpuTime timer;
autoLayerDriver layerDriver(meshRefiner, globalToPatch);
autoLayerDriver layerDriver
(
meshRefiner,
globalToMasterPatch,
globalToSlavePatch
);
// Layer addition parameters
layerParameters layerParams(layerDict, mesh.boundaryMesh());
......
......@@ -2372,11 +2372,13 @@ void Foam::autoLayerDriver::getLayerCellsFaces
Foam::autoLayerDriver::autoLayerDriver
(
meshRefinement& meshRefiner,
const labelList& globalToPatch
const labelList& globalToMasterPatch,
const labelList& globalToSlavePatch
)
:
meshRefiner_(meshRefiner),
globalToPatch_(globalToPatch)
globalToMasterPatch_(globalToMasterPatch),
globalToSlavePatch_(globalToSlavePatch)
{}
......@@ -2435,7 +2437,12 @@ void Foam::autoLayerDriver::addLayers
// Create baffles (pairs of faces that share the same points)
// Baffles stored as owner and neighbour face that have been created.
List<labelPair> baffles;
meshRefiner_.createZoneBaffles(globalToPatch_, baffles);
meshRefiner_.createZoneBaffles
(
globalToMasterPatch_,
globalToSlavePatch_,
baffles
);
if (debug&meshRefinement::MESH)
{
......
......@@ -99,7 +99,10 @@ class autoLayerDriver
meshRefinement& meshRefiner_;
//- From surface region to patch
const labelList globalToPatch_;
const labelList globalToMasterPatch_;
//- From surface region to patch
const labelList globalToSlavePatch_;
......@@ -518,7 +521,8 @@ public:
autoLayerDriver
(
meshRefinement& meshRefiner,
const labelList& globalToPatch
const labelList& globalToMasterPatch,
const labelList& globalToSlavePatch
);
......
......@@ -1135,6 +1135,12 @@ void Foam::autoLayerDriver::medialAxisSmoothingInfo
<< " " << medialRatio.name()
<< " : ratio of medial distance to wall distance" << nl
<< endl;
meshRefiner_.mesh().setInstance(meshRefiner_.timeName());
meshRefiner_.write
(
debug,
mesh.time().path()/meshRefiner_.timeName()
);
dispVec.write();
medialDist.write();
medialVec.write();
......@@ -1409,6 +1415,94 @@ void Foam::autoLayerDriver::shrinkMeshMedialDistance
*dispVec[pointI];
}
//XXXXX
// // Smear displacement away from fixed values (medialRatio=0 or 1)
// {
// const edgeList& edges = mesh.edges();
// scalarField edgeWeight(edges.size(), 0.0);
// forAll(edges, edgeI)
// {
// if (isMasterEdge[edgeI])
// {
// scalar eMag = edges[edgeI].mag(mesh.points());
// if (eMag > VSMALL)
// {
// edgeWeight[edgeI] = 1.0/eMag;
// }
// else
// {
// edgeWeight[edgeI] = GREAT;
// }
// }
// }
// scalarField invSumWeight(mesh.nPoints());
// sumWeights(isMasterEdge, edgeWeight, invSumWeight);
//
//
// // Get smoothly varying patch field.
// Info<< "shrinkMeshDistance : Smoothing displacement ..." << endl;
//
// const scalar lambda = 0.33;
// const scalar mu = -0.34;
//
// pointField average(mesh.nPoints());
// for (label iter = 0; iter < 90; iter++)
// {
// // Calculate average of field
// averageNeighbours
// (
// mesh,
// edgeWeight,
// invSumWeight,
// displacement,
// average
// );
//
// forAll(displacement, i)
// {
// if (medialRatio[i] > SMALL && medialRatio[i] < 1-SMALL)
// {
// displacement[i] =
// (1-lambda)*displacement[i]
// +lambda*average[i];
// }
// }
//
//
// // Calculate average of field
// averageNeighbours
// (
// mesh,
// edgeWeight,
// invSumWeight,
// displacement,
// average
// );
//
// forAll(displacement, i)
// {
// if (medialRatio[i] > SMALL && medialRatio[i] < 1-SMALL)
// {
// displacement[i] = (1-mu)*displacement[i]+mu*average[i];
// }
// }
//
//
// // Do residual calculation every so often.
// if ((iter % 10) == 0)
// {
// Info<< " Iteration " << iter << " residual "
// << gSum(mag(displacement-average))
// /returnReduce(average.size(), sumOp<label>())
// << endl;
// }
// }
// }
//XXXXX
if (debug&meshRefinement::MESH || debug&meshRefinement::LAYERINFO)
{
const_cast<Time&>(mesh.time())++;
......
......@@ -57,13 +57,15 @@ Foam::autoRefineDriver::autoRefineDriver
meshRefinement& meshRefiner,
decompositionMethod& decomposer,
fvMeshDistribute& distributor,
const labelList& globalToPatch
const labelList& globalToMasterPatch,
const labelList& globalToSlavePatch
)
:
meshRefiner_(meshRefiner),
decomposer_(decomposer),
distributor_(distributor),
globalToPatch_(globalToPatch)
globalToMasterPatch_(globalToMasterPatch),
globalToSlavePatch_(globalToSlavePatch)
{}
......@@ -313,7 +315,8 @@ void Foam::autoRefineDriver::removeInsideCells
meshRefiner_.splitMesh
(
nBufferLayers, // nBufferLayers
globalToPatch_,
globalToMasterPatch_,
globalToSlavePatch_,
refineParams.keepPoints()[0]
);
......@@ -521,7 +524,8 @@ void Foam::autoRefineDriver::baffleAndSplitMesh
!handleSnapProblems, // merge free standing baffles?
motionDict,
const_cast<Time&>(mesh.time()),
globalToPatch_,
globalToMasterPatch_,
globalToSlavePatch_,
refineParams.keepPoints()[0]
);
}
......@@ -606,7 +610,8 @@ void Foam::autoRefineDriver::splitAndMergeBaffles
//true, // merge free standing baffles?
motionDict,
const_cast<Time&>(mesh.time()),
globalToPatch_,
globalToMasterPatch_,
globalToSlavePatch_,
refineParams.keepPoints()[0]
);
......
......@@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
\\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
......@@ -65,7 +65,10 @@ class autoRefineDriver
fvMeshDistribute& distributor_;
//- From surface region to patch
const labelList globalToPatch_;
const labelList globalToMasterPatch_;
//- From surface region to patch
const labelList globalToSlavePatch_;
// Private Member Functions
......@@ -146,7 +149,8 @@ public:
meshRefinement& meshRefiner,
decompositionMethod& decomposer,
fvMeshDistribute& distributor,
const labelList& globalToPatch
const labelList& globalToMasterPatch,
const labelList& globalToSlavePatch
);
......
......@@ -573,11 +573,13 @@ bool Foam::autoSnapDriver::outwardsDisplacement
Foam::autoSnapDriver::autoSnapDriver
(
meshRefinement& meshRefiner,
const labelList& globalToPatch
const labelList& globalToMasterPatch,
const labelList& globalToSlavePatch
)
:
meshRefiner_(meshRefiner),
globalToPatch_(globalToPatch)
globalToMasterPatch_(globalToMasterPatch),
globalToSlavePatch_(globalToSlavePatch)
{}
......@@ -1191,7 +1193,7 @@ Foam::autoPtr<Foam::mapPolyMesh> Foam::autoSnapDriver::repatchToSurface
if (hitSurface[i] != -1 && !isZonedFace.get(faceI))
{
closestPatch[i] = globalToPatch_
closestPatch[i] = globalToMasterPatch_
[
surfaces.globalRegion
(
......@@ -1265,7 +1267,12 @@ void Foam::autoSnapDriver::doSnap
// Create baffles (pairs of faces that share the same points)
// Baffles stored as owner and neighbour face that have been created.
List<labelPair> baffles;
meshRefiner_.createZoneBaffles(globalToPatch_, baffles);
meshRefiner_.createZoneBaffles
(
globalToMasterPatch_,
globalToSlavePatch_,
baffles
);
// Selectively 'forget' about the baffles, i.e. not check across them
......
......@@ -59,8 +59,11 @@ class autoSnapDriver
//- Mesh+surface
meshRefinement& meshRefiner_;
//- From surface region to patch
const labelList globalToPatch_;
//- From global surface region to master side patch
const labelList globalToMasterPatch_;
//- From global surface region to slave side patch
const labelList globalToSlavePatch_;
// Private Member Functions
......@@ -390,7 +393,8 @@ public:
autoSnapDriver
(
meshRefinement& meshRefiner,
const labelList& globalToPatch
const labelList& globalToMasterPatch,
const labelList& globalToSlavePatch
);
......
......@@ -573,7 +573,7 @@ void Foam::autoSnapDriver::calcNearestFacePointProperties
pFc[i] = pp.faceCentres()[faceI];
//label meshFaceI = pp.addressing()[faceI];
//pFid[i] = mesh.boundaryMesh().whichPatch(meshFaceI);
pFid[i] = globalToPatch_[faceSurfaceGlobalRegion[faceI]];
pFid[i] = globalToMasterPatch_[faceSurfaceGlobalRegion[faceI]];
}
}
......
......@@ -55,6 +55,7 @@ License
#include "searchableSurfaces.H"
#include "treeBoundBox.H"
#include "zeroGradientFvPatchFields.H"
#include "fvMeshTools.H"
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
......@@ -1700,7 +1701,7 @@ Foam::label Foam::meshRefinement::addPatch
oldToNew[addedPatchI] = insertPatchI;
// Shuffle into place
polyPatches.reorder(oldToNew);
polyPatches.reorder(oldToNew, true);
fvPatches.reorder(oldToNew);
reorderPatchFields<volScalarField>(mesh, oldToNew);
......@@ -1736,6 +1737,28 @@ Foam::label Foam::meshRefinement::addMeshedPatch
// Add patch
label patchI = addPatch(mesh_, name, patchInfo);
// dictionary patchDict(patchInfo);
// patchDict.set("nFaces", 0);
// patchDict.set("startFace", 0);
// autoPtr<polyPatch> ppPtr
// (
// polyPatch::New
// (
// name,
// patchDict,
// 0,
// mesh_.boundaryMesh()
// )
// );
// label patchI = fvMeshTools::addPatch
// (
// mesh_,
// ppPtr(),
// dictionary(), // optional field values
// calculatedFvPatchField<scalar>::typeName,
// true
// );
// Store
label sz = meshedPatches_.size();
meshedPatches_.setSize(sz+1);
......
......@@ -330,10 +330,11 @@ private:
// Baffle handling
//- Get faces to repatch. Returns map from face to patch.
Map<label> getZoneBafflePatches
Map<labelPair> getZoneBafflePatches
(
const bool allowBoundary,
const labelList& globalToPatch
const labelList& globalToMasterPatch,
const labelList& globalToSlavePatch
) const;
//- Geometric test on see whether face needs to be baffled:
......@@ -349,7 +350,7 @@ private:
//- Determine patches for baffles
void getBafflePatches
(
const labelList& globalToPatch,
const labelList& globalToMasterPatch,
const labelList& neiLevel,
const pointField& neiCc,
labelList& ownPatch,
......@@ -426,7 +427,7 @@ private:
const dictionary& motionDict,
const bool removeEdgeConnectedCells,
const scalarField& perpendicularAngle,
const labelList& globalToPatch
const labelList& globalToMasterPatch
) const;
......@@ -707,7 +708,8 @@ public:
const bool mergeFreeStanding,
const dictionary& motionDict,
Time& runTime,
const labelList& globalToPatch,
const labelList& globalToMasterPatch,
const labelList& globalToSlavePatch,
const point& keepPoint
);
......@@ -716,7 +718,8 @@ public:
autoPtr<mapPolyMesh> splitMesh
(
const label nBufferLayers,
const labelList& globalToPatch,
const labelList& globalToMasterPatch,
const labelList& globalToSlavePatch,
const point& keepPoint
);
......@@ -741,7 +744,8 @@ public:
// baffles.
autoPtr<mapPolyMesh> createZoneBaffles
(
const labelList& globalToPatch,
const labelList& globalToMasterPatch,