diff --git a/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleFoam.C b/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleFoam.C index 9b09d73bbe..858d83749e 100644 --- a/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleFoam.C +++ b/applications/solvers/compressible/rhoPimpleFoam/rhoPimpleFoam.C @@ -23,7 +23,7 @@ License Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Application - rhoSimpleFoam + rhoPimpleFoam Description Transient solver for turbulent flow of compressible fluids for diff --git a/applications/solvers/incompressible/pimpleFoam/Make/files b/applications/solvers/incompressible/pimpleFoam/Make/files index 92943d3370..f4ec4391df 100644 --- a/applications/solvers/incompressible/pimpleFoam/Make/files +++ b/applications/solvers/incompressible/pimpleFoam/Make/files @@ -1,3 +1,3 @@ pimpleFoam.C -EXE = $(FOAM_USER_APPBIN)/pimpleFoam +EXE = $(FOAM_APPBIN)/pimpleFoam diff --git a/applications/test/speed/Make/options b/applications/test/speed/Make/options index e69de29bb2..e680561987 100644 --- a/applications/test/speed/Make/options +++ b/applications/test/speed/Make/options @@ -0,0 +1 @@ +EXE_INC = /* -ffast-math -mtune=core2 */ diff --git a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C index 1df11e06da..4737f38e53 100644 --- a/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C +++ b/applications/utilities/mesh/generation/snappyHexMesh/snappyHexMesh.C @@ -370,7 +370,7 @@ int main(int argc, char *argv[]) // Refinement parameters refinementParameters refineParams(refineDict); - refineDriver.doRefine(refineDict, refineParams, wantSnap); + refineDriver.doRefine(refineDict, refineParams, wantSnap, motionDict); writeMesh ( diff --git a/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoHexMeshDriver.C b/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoHexMeshDriver.C index 48f52d7880..c07b950d0a 100644 --- a/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoHexMeshDriver.C +++ b/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoHexMeshDriver.C @@ -491,6 +491,8 @@ void Foam::autoHexMeshDriver::doMesh() if (wantRefine) { + const dictionary& motionDict = dict_.subDict("motionDict"); + autoRefineDriver refineDriver ( meshRefinerPtr_(), @@ -502,7 +504,7 @@ void Foam::autoHexMeshDriver::doMesh() // Get all the refinement specific params refinementParameters refineParams(dict_, 1); - refineDriver.doRefine(dict_, refineParams, wantSnap); + refineDriver.doRefine(dict_, refineParams, wantSnap, motionDict); // Write mesh writeMesh("Refined mesh"); diff --git a/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C b/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C index 7bbe58ff8f..ca0c0cbddc 100644 --- a/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C +++ b/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.C @@ -497,7 +497,8 @@ Foam::label Foam::autoRefineDriver::shellRefine void Foam::autoRefineDriver::baffleAndSplitMesh ( const refinementParameters& refineParams, - const bool handleSnapProblems + const bool handleSnapProblems, + const dictionary& motionDict ) { Info<< nl @@ -514,6 +515,7 @@ void Foam::autoRefineDriver::baffleAndSplitMesh ( handleSnapProblems, !handleSnapProblems, // merge free standing baffles? + motionDict, const_cast(mesh.time()), globalToPatch_, refineParams.keepPoints()[0] @@ -568,7 +570,8 @@ void Foam::autoRefineDriver::zonify void Foam::autoRefineDriver::splitAndMergeBaffles ( const refinementParameters& refineParams, - const bool handleSnapProblems + const bool handleSnapProblems, + const dictionary& motionDict ) { Info<< nl @@ -588,6 +591,7 @@ void Foam::autoRefineDriver::splitAndMergeBaffles ( handleSnapProblems, false, // merge free standing baffles? + motionDict, const_cast(mesh.time()), globalToPatch_, refineParams.keepPoints()[0] @@ -685,7 +689,8 @@ void Foam::autoRefineDriver::doRefine ( const dictionary& refineDict, const refinementParameters& refineParams, - const bool prepareForSnapping + const bool prepareForSnapping, + const dictionary& motionDict ) { Info<< nl @@ -734,13 +739,13 @@ void Foam::autoRefineDriver::doRefine ); // Introduce baffles at surface intersections - baffleAndSplitMesh(refineParams, prepareForSnapping); + baffleAndSplitMesh(refineParams, prepareForSnapping, motionDict); // Mesh is at its finest. Do optional zoning. zonify(refineParams); // Pull baffles apart - splitAndMergeBaffles(refineParams, prepareForSnapping); + splitAndMergeBaffles(refineParams, prepareForSnapping, motionDict); // Do something about cells with refined faces on the boundary if (prepareForSnapping) diff --git a/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.H b/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.H index 8aa33855de..f1747a29be 100644 --- a/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.H +++ b/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoRefineDriver.H @@ -46,7 +46,6 @@ namespace Foam class featureEdgeMesh; class refinementParameters; - /*---------------------------------------------------------------------------*\ Class autoRefineDriver Declaration \*---------------------------------------------------------------------------*/ @@ -112,7 +111,8 @@ class autoRefineDriver void baffleAndSplitMesh ( const refinementParameters& refineParams, - const bool handleSnapProblems + const bool handleSnapProblems, + const dictionary& motionDict ); //- Add zones @@ -121,7 +121,8 @@ class autoRefineDriver void splitAndMergeBaffles ( const refinementParameters& refineParams, - const bool handleSnapProblems + const bool handleSnapProblems, + const dictionary& motionDict ); //- Merge refined boundary faces (from exposing coarser cell) @@ -163,7 +164,8 @@ public: ( const dictionary& refineDict, const refinementParameters& refineParams, - const bool prepareForSnapping + const bool prepareForSnapping, + const dictionary& motionDict ); }; diff --git a/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C b/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C index cc866d13ca..520e6f69ef 100644 --- a/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C +++ b/src/autoMesh/autoHexMesh/autoHexMeshDriver/autoSnapDriver.C @@ -1294,6 +1294,169 @@ void Foam::autoSnapDriver::scaleMesh } +// After snapping: correct patching according to nearest surface. +// Code is very similar to calcNearestSurface. +// - calculate face-wise snap distance as max of point-wise +// - calculate face-wise nearest surface point +// - repatch face according to patch for surface point. +Foam::autoPtr Foam::autoSnapDriver::repatchToSurface +( + const snapParameters& snapParams, + const labelList& adaptPatchIDs +) +{ + const fvMesh& mesh = meshRefiner_.mesh(); + const refinementSurfaces& surfaces = meshRefiner_.surfaces(); + + Info<< "Repatching faces according to nearest surface ..." << endl; + + // Get the labels of added patches. + autoPtr ppPtr + ( + meshRefinement::makePatch + ( + mesh, + adaptPatchIDs + ) + ); + indirectPrimitivePatch& pp = ppPtr(); + + // Divide surfaces into zoned and unzoned + labelList zonedSurfaces; + labelList unzonedSurfaces; + getZonedSurfaces(zonedSurfaces, unzonedSurfaces); + + + // Faces that do not move + PackedList<1> isZonedFace(mesh.nFaces(), 0); + { + // 1. All faces on zoned surfaces + const wordList& faceZoneNames = surfaces.faceZoneNames(); + const faceZoneMesh& fZones = mesh.faceZones(); + + forAll(zonedSurfaces, i) + { + label zoneSurfI = zonedSurfaces[i]; + + label zoneI = fZones.findZoneID(faceZoneNames[zoneSurfI]); + + const faceZone& fZone = fZones[zoneI]; + + forAll(fZone, i) + { + isZonedFace.set(fZone[i], 1); + } + } + } + + + // Determine per pp face which patch it should be in + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + // Patch that face should be in + labelList closestPatch(pp.size(), -1); + { + // face snap distance as max of point snap distance + scalarField faceSnapDist(pp.size(), -GREAT); + { + // Distance to attract to nearest feature on surface + const scalarField snapDist(calcSnapDistance(snapParams, pp)); + + const faceList& localFaces = pp.localFaces(); + + forAll(localFaces, faceI) + { + const face& f = localFaces[faceI]; + + forAll(f, fp) + { + faceSnapDist[faceI] = max + ( + faceSnapDist[faceI], + snapDist[f[fp]] + ); + } + } + } + + pointField localFaceCentres(pp.size()); + forAll(pp, i) + { + localFaceCentres[i] = mesh.faceCentres()[pp.addressing()[i]]; + } + + // Get nearest surface and region + labelList hitSurface; + labelList hitRegion; + surfaces.findNearestRegion + ( + unzonedSurfaces, + localFaceCentres, + sqr(4*faceSnapDist), // sqr of attract distance + hitSurface, + hitRegion + ); + + // Get patch + forAll(pp, i) + { + label faceI = pp.addressing()[i]; + + if (hitSurface[i] != -1 && (isZonedFace.get(faceI) == 0)) + { + closestPatch[i] = globalToPatch_ + [ + surfaces.globalRegion + ( + hitSurface[i], + hitRegion[i] + ) + ]; + } + } + } + + + // Change those faces for which there is a different closest patch + // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + labelList ownPatch(mesh.nFaces(), -1); + labelList neiPatch(mesh.nFaces(), -1); + + const polyBoundaryMesh& patches = mesh.boundaryMesh(); + + forAll(patches, patchI) + { + const polyPatch& pp = patches[patchI]; + + forAll(pp, i) + { + ownPatch[pp.start()+i] = patchI; + neiPatch[pp.start()+i] = patchI; + } + } + + label nChanged = 0; + forAll(closestPatch, i) + { + label faceI = pp.addressing()[i]; + + if (closestPatch[i] != -1 && closestPatch[i] != ownPatch[faceI]) + { + ownPatch[faceI] = closestPatch[i]; + neiPatch[faceI] = closestPatch[i]; + nChanged++; + } + } + + Info<< "Repatched " << returnReduce(nChanged, sumOp