diff --git a/applications/utilities/mesh/generation/extrude/extrudeMesh/extrudeMesh.C b/applications/utilities/mesh/generation/extrude/extrudeMesh/extrudeMesh.C index 02e18d2af926a1e9b2c8490586f69bcac7f43801..a726de250539152ba13bf14db699d290dcecc9b7 100644 --- a/applications/utilities/mesh/generation/extrude/extrudeMesh/extrudeMesh.C +++ b/applications/utilities/mesh/generation/extrude/extrudeMesh/extrudeMesh.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2015-2017 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2015-2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -48,6 +48,7 @@ Description #include "MeshedSurfaces.H" #include "globalIndex.H" #include "cellSet.H" +#include "fvMeshTools.H" #include "extrudedMesh.H" #include "extrudeModel.H" @@ -78,59 +79,6 @@ static const Enum<ExtrudeMode> ExtrudeModeNames }; -void createDummyFvMeshFiles(const polyMesh& mesh, const word& regionName) -{ - // Create dummy system/fv* - { - IOobject io - ( - "fvSchemes", - mesh.time().system(), - regionName, - mesh, - IOobject::NO_READ, - IOobject::NO_WRITE, - false - ); - - Info<< "Testing:" << io.objectPath() << endl; - - if (!io.typeHeaderOk<IOdictionary>(false)) - { - Info<< "Writing dummy " << regionName/io.name() << endl; - dictionary dummyDict; - dictionary divDict; - dummyDict.add("divSchemes", divDict); - dictionary gradDict; - dummyDict.add("gradSchemes", gradDict); - dictionary laplDict; - dummyDict.add("laplacianSchemes", laplDict); - - IOdictionary(io, dummyDict).regIOobject::write(); - } - } - { - IOobject io - ( - "fvSolution", - mesh.time().system(), - regionName, - mesh, - IOobject::NO_READ, - IOobject::NO_WRITE, - false - ); - - if (!io.typeHeaderOk<IOdictionary>(false)) - { - Info<< "Writing dummy " << regionName/io.name() << endl; - dictionary dummyDict; - IOdictionary(io, dummyDict).regIOobject::write(); - } - } -} - - label findPatchID(const polyBoundaryMesh& patches, const word& name) { const label patchID = patches.findPatchID(name); @@ -738,7 +686,7 @@ int main(int argc, char *argv[]) // Create dummy fvSchemes, fvSolution - createDummyFvMeshFiles(mesh, regionDir); + fvMeshTools::createDummyFvMeshFiles(mesh, regionDir, true); // Create actual mesh from polyTopoChange container autoPtr<mapPolyMesh> map = meshMod().makeMesh diff --git a/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/extrudeToRegionMesh.C b/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/extrudeToRegionMesh.C index 9f5e2219520009aac2639c5fbc4bbcb4a834d4c9..ab733f3ad66fe1b67fcf5b8f3b04f4f08bf68102 100644 --- a/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/extrudeToRegionMesh.C +++ b/applications/utilities/mesh/generation/extrude/extrudeToRegionMesh/extrudeToRegionMesh.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2015-2016 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2015-2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -353,59 +353,6 @@ void deleteEmptyPatches(fvMesh& mesh) } -void createDummyFvMeshFiles(const polyMesh& mesh, const word& regionName) -{ - // Create dummy system/fv* - { - IOobject io - ( - "fvSchemes", - mesh.time().system(), - regionName, - mesh, - IOobject::NO_READ, - IOobject::NO_WRITE, - false - ); - - Info<< "Testing:" << io.objectPath() << endl; - - if (!io.typeHeaderOk<IOdictionary>(true)) - { - Info<< "Writing dummy " << regionName/io.name() << endl; - dictionary dummyDict; - dictionary divDict; - dummyDict.add("divSchemes", divDict); - dictionary gradDict; - dummyDict.add("gradSchemes", gradDict); - dictionary laplDict; - dummyDict.add("laplacianSchemes", laplDict); - - IOdictionary(io, dummyDict).regIOobject::write(); - } - } - { - IOobject io - ( - "fvSolution", - mesh.time().system(), - regionName, - mesh, - IOobject::NO_READ, - IOobject::NO_WRITE, - false - ); - - if (!io.typeHeaderOk<IOdictionary>(true)) - { - Info<< "Writing dummy " << regionName/io.name() << endl; - dictionary dummyDict; - IOdictionary(io, dummyDict).regIOobject::write(); - } - } -} - - // Check zone either all internal or all external faces void checkZoneInside ( @@ -1642,7 +1589,7 @@ int main(int argc, char *argv[]) // Create dummy fv* files - createDummyFvMeshFiles(mesh, shellRegionName); + fvMeshTools::createDummyFvMeshFiles(mesh, shellRegionName, true); word meshInstance; diff --git a/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C b/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C index 3692adeeb0a326705de1fec011e3ed1dd24e2a6d..ebf6e7c65edaedb63a1f92e63f6b9ee6cde47bfe 100644 --- a/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C +++ b/applications/utilities/mesh/manipulation/splitMeshRegions/splitMeshRegions.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2015-2017 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2015-2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -584,56 +584,7 @@ autoPtr<mapPolyMesh> createRegionMesh ) { // Create dummy system/fv* - { - IOobject io - ( - "fvSchemes", - mesh.time().system(), - regionName, - mesh, - IOobject::NO_READ, - IOobject::NO_WRITE, - false - ); - - Info<< "Testing:" << io.objectPath() << endl; - - if (!io.typeHeaderOk<IOdictionary>(true)) - // if (!exists(io.objectPath())) - { - Info<< "Writing dummy " << regionName/io.name() << endl; - dictionary dummyDict; - dictionary divDict; - dummyDict.add("divSchemes", divDict); - dictionary gradDict; - dummyDict.add("gradSchemes", gradDict); - dictionary laplDict; - dummyDict.add("laplacianSchemes", laplDict); - - IOdictionary(io, dummyDict).regIOobject::write(); - } - } - { - IOobject io - ( - "fvSolution", - mesh.time().system(), - regionName, - mesh, - IOobject::NO_READ, - IOobject::NO_WRITE, - false - ); - - if (!io.typeHeaderOk<IOdictionary>(true)) - //if (!exists(io.objectPath())) - { - Info<< "Writing dummy " << regionName/io.name() << endl; - dictionary dummyDict; - IOdictionary(io, dummyDict).regIOobject::write(); - } - } - + fvMeshTools::createDummyFvMeshFiles(mesh, regionName, true); // Neighbour cellRegion. labelList coupledRegion(mesh.nBoundaryFaces()); diff --git a/src/Allwmake b/src/Allwmake index 7742d3502c06d1b0a3123669893e47a9a7c8a3cf..b5378ac63cc296dd74da06d2d36479a73d9fbc36 100755 --- a/src/Allwmake +++ b/src/Allwmake @@ -53,7 +53,6 @@ wmake $targetType topoChangerFvMesh parallel/Allwmake $targetType $* randomProcesses/Allwmake $targetType $* -wmake $targetType overset wmake $targetType ODE transportModels/Allwmake $targetType $* @@ -67,6 +66,7 @@ wmake $targetType fvOptions wmake $targetType fvMotionSolver mesh/Allwmake $targetType $* +wmake $targetType overset renumber/Allwmake $targetType $* fvAgglomerationMethods/Allwmake $targetType $* wmake $targetType waveModels diff --git a/src/dynamicMesh/fvMeshTools/fvMeshTools.C b/src/dynamicMesh/fvMeshTools/fvMeshTools.C index b45e84eda48e229e947767f16e942658b2e6c16d..2cd12e262637bb62315507ba0fbd2328d5cfc6be 100644 --- a/src/dynamicMesh/fvMeshTools/fvMeshTools.C +++ b/src/dynamicMesh/fvMeshTools/fvMeshTools.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2012-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2015-2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -667,4 +667,66 @@ Foam::autoPtr<Foam::fvMesh> Foam::fvMeshTools::newMesh } +void Foam::fvMeshTools::createDummyFvMeshFiles +( + const objectRegistry& mesh, + const word& regionName, + const bool verbose +) +{ + // Create dummy system/fv* + { + IOobject io + ( + "fvSchemes", + mesh.time().system(), + regionName, + mesh, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ); + + if (!io.typeHeaderOk<IOdictionary>(false)) + { + if (verbose) + { + Info<< "Writing dummy " << regionName/io.name() << endl; + } + dictionary dummyDict; + dictionary divDict; + dummyDict.add("divSchemes", divDict); + dictionary gradDict; + dummyDict.add("gradSchemes", gradDict); + dictionary laplDict; + dummyDict.add("laplacianSchemes", laplDict); + + IOdictionary(io, dummyDict).regIOobject::write(); + } + } + { + IOobject io + ( + "fvSolution", + mesh.time().system(), + regionName, + mesh, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ); + + if (!io.typeHeaderOk<IOdictionary>(false)) + { + if (verbose) + { + Info<< "Writing dummy " << regionName/io.name() << endl; + } + dictionary dummyDict; + IOdictionary(io, dummyDict).regIOobject::write(); + } + } +} + + // ************************************************************************* // diff --git a/src/dynamicMesh/fvMeshTools/fvMeshTools.H b/src/dynamicMesh/fvMeshTools/fvMeshTools.H index 78a6c4390ca46de745bcb7489d1f26a8da60e96c..b65832bbea3b48bbce01ab64d83c1e8fbe510322 100644 --- a/src/dynamicMesh/fvMeshTools/fvMeshTools.H +++ b/src/dynamicMesh/fvMeshTools/fvMeshTools.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2012-2016 OpenFOAM Foundation - \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd. + \\/ M anipulation | Copyright (C) 2015-2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -137,6 +137,14 @@ public: const IOobject& io, const bool masterOnlyReading ); + + //- Create additional fv* files + static void createDummyFvMeshFiles + ( + const objectRegistry& parent, + const word& regionName, + const bool verbose = false + ); }; diff --git a/src/overset/Make/options b/src/overset/Make/options index fc6854c46f4c61bcd20297567a11f85984141d7f..fb7f46e24e001259f083f3f012c782a0b8db4446 100644 --- a/src/overset/Make/options +++ b/src/overset/Make/options @@ -4,6 +4,7 @@ EXE_INC = \ -I$(LIB_SRC)/fileFormats/lnInclude \ + -I$(LIB_SRC)/mesh/blockMesh/lnInclude \ -I$(LIB_SRC)/surfMesh/lnInclude \ -I$(LIB_SRC)/sampling/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude \ @@ -15,4 +16,5 @@ EXE_INC = \ LIB_LIBS = \ -ldynamicFvMesh \ -lsampling \ + -lblockMesh \ -ldecompositionMethods diff --git a/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H b/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H index 9bb17601880e26a90b778e237afbda784820d9d4..476f359382dd71cf16a84441ae0f9fd3410399a7 100644 --- a/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H +++ b/src/overset/cellCellStencil/cellCellStencil/cellCellStencil.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2017-2018 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2017-2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -97,7 +97,12 @@ protected: //- Helper: create volScalarField for postprocessing. template<class Type> - tmp<volScalarField> createField(const word& name, UList<Type>&) const; + static tmp<volScalarField> createField + ( + const fvMesh& mesh, + const word& name, + const UList<Type>& + ); private: diff --git a/src/overset/cellCellStencil/cellCellStencil/cellCellStencilTemplates.C b/src/overset/cellCellStencil/cellCellStencil/cellCellStencilTemplates.C index d4318909767d506ee01d184a985a04c43951d10d..18c045ced2a58087a038b0405711721e6143cfa5 100644 --- a/src/overset/cellCellStencil/cellCellStencil/cellCellStencilTemplates.C +++ b/src/overset/cellCellStencil/cellCellStencil/cellCellStencilTemplates.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2018 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2018-2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -29,7 +29,12 @@ License template<class Type> Foam::tmp<Foam::volScalarField> -Foam::cellCellStencil::createField(const word& name, UList<Type>& psi) const +Foam::cellCellStencil::createField +( + const fvMesh& mesh, + const word& name, + const UList<Type>& psi +) { tmp<volScalarField> tfld ( @@ -38,13 +43,13 @@ Foam::cellCellStencil::createField(const word& name, UList<Type>& psi) const IOobject ( name, - mesh_.time().timeName(), - mesh_, + mesh.time().timeName(), + mesh, IOobject::NO_READ, IOobject::NO_WRITE, false ), - mesh_, + mesh, dimensionedScalar(dimless, Zero), zeroGradientFvPatchScalarField::typeName ) diff --git a/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C b/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C index 0e048a8c266f4170aed089c441d0b0ec1c130e5a..dba9cf6053ce6d917bb858abd2a6b8e987391e0d 100644 --- a/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C +++ b/src/overset/cellCellStencil/cellVolumeWeight/cellVolumeWeightCellCellStencil.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2014-2018 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2014-2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -155,12 +155,12 @@ void Foam::cellCellStencils::cellVolumeWeight::walkFront { allWeight[own] = fraction; - if (debug) - { - Pout<< " setting cell " - << mesh_.cellCentres()[own] - << " to " << fraction << endl; - } + //if (debug) + //{ + // Pout<< " setting cell " + // << mesh_.cellCentres()[own] + // << " to " << fraction << endl; + //} allCellTypes[own] = INTERPOLATED; newIsFront.set(mesh_.cells()[own]); } @@ -174,12 +174,12 @@ void Foam::cellCellStencils::cellVolumeWeight::walkFront { allWeight[nei] = fraction; - if (debug) - { - Pout<< " setting cell " - << mesh_.cellCentres()[nei] - << " to " << fraction << endl; - } + //if (debug) + //{ + // Pout<< " setting cell " + // << mesh_.cellCentres()[nei] + // << " to " << fraction << endl; + //} allCellTypes[nei] = INTERPOLATED; newIsFront.set(mesh_.cells()[nei]); @@ -928,6 +928,16 @@ bool Foam::cellCellStencils::cellVolumeWeight::update() } + if (debug) + { + tmp<volScalarField> tfld + ( + createField(mesh_, "allCellTypes", allCellTypes) + ); + tfld().write(); + } + + // Use the patch types and weights to decide what to do forAll(allPatchTypes, cellI) { @@ -977,15 +987,44 @@ bool Foam::cellCellStencils::cellVolumeWeight::update() } } + if (debug) + { + tmp<volScalarField> tfld + ( + createField(mesh_, "allCellTypes_patch", allCellTypes) + ); + //tfld.ref().correctBoundaryConditions(); + tfld().write(); + } + // Mark unreachable bits findHoles(globalCells, mesh_, zoneID, allStencil, allCellTypes); + if (debug) + { + tmp<volScalarField> tfld + ( + createField(mesh_, "allCellTypes_hole", allCellTypes) + ); + //tfld.ref().correctBoundaryConditions(); + tfld().write(); + } + // Add buffer interpolation layer around holes scalarField allWeight(mesh_.nCells(), Zero); walkFront(layerRelax, allCellTypes, allWeight); + if (debug) + { + tmp<volScalarField> tfld + ( + createField(mesh_, "allCellTypes_front", allCellTypes) + ); + //tfld.ref().correctBoundaryConditions(); + tfld().write(); + } // Check previous iteration cellTypes_ for any hole->calculated changes { @@ -1104,39 +1143,39 @@ bool Foam::cellCellStencils::cellVolumeWeight::update() } -// // Check previous iteration cellTypes_ for any hole->calculated changes -// { -// label nCalculated = 0; +// // Check previous iteration cellTypes_ for any hole->calculated changes +// { +// label nCalculated = 0; // -// forAll(cellTypes_, celli) -// { -// if (allCellTypes[celli] == CALCULATED && cellTypes_[celli] == HOLE) -// { -// if (allStencil[celli].size() == 0) -// { -// FatalErrorInFunction -// << "Cell:" << celli -// << " at:" << mesh_.cellCentres()[celli] -// << " zone:" << zoneID[celli] -// << " changed from hole to calculated" -// << " but there is no donor" -// << exit(FatalError); -// } -// else -// { -// allCellTypes[celli] = INTERPOLATED; -// nCalculated++; -// } -// } -// } +// forAll(cellTypes_, celli) +// { +// if (allCellTypes[celli] == CALCULATED && cellTypes_[celli] == HOLE) +// { +// if (allStencil[celli].size() == 0) +// { +// FatalErrorInFunction +// << "Cell:" << celli +// << " at:" << mesh_.cellCentres()[celli] +// << " zone:" << zoneID[celli] +// << " changed from hole to calculated" +// << " but there is no donor" +// << exit(FatalError); +// } +// else +// { +// allCellTypes[celli] = INTERPOLATED; +// nCalculated++; +// } +// } +// } // -// if (debug) -// { -// Pout<< "Detected " << nCalculated << " cells changing from hole" -// << " to calculated. Changed these to interpolated" -// << endl; -// } -// } +// if (debug) +// { +// Pout<< "Detected " << nCalculated << " cells changing from hole" +// << " to calculated. Changed these to interpolated" +// << endl; +// } +// } cellTypes_.transfer(allCellTypes); diff --git a/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C b/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C index 0d09a2330eb47d76a8a4bc3409eb35c4216d363d..1e019dab39495bb112be011fce03def9c14833b6 100644 --- a/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C +++ b/src/overset/cellCellStencil/inverseDistance/inverseDistanceCellCellStencil.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2017-2018 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2017-2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -1998,8 +1998,10 @@ bool Foam::cellCellStencils::inverseDistance::update() if (debug) { - tmp<volScalarField> tfld(createField("allCellTypes", allCellTypes)); - //tfld.ref().correctBoundaryConditions(); + tmp<volScalarField> tfld + ( + createField(mesh_, "allCellTypes", allCellTypes) + ); tfld().write(); } @@ -2041,9 +2043,8 @@ bool Foam::cellCellStencils::inverseDistance::update() { tmp<volScalarField> tfld ( - createField("allCellTypes_patch", allCellTypes) + createField(mesh_, "allCellTypes_patch", allCellTypes) ); - //tfld.ref().correctBoundaryConditions(); tfld().write(); } @@ -2054,9 +2055,8 @@ bool Foam::cellCellStencils::inverseDistance::update() { tmp<volScalarField> tfld ( - createField("allCellTypes_hole", allCellTypes) + createField(mesh_, "allCellTypes_hole", allCellTypes) ); - //tfld.ref().correctBoundaryConditions(); tfld().write(); } if (debug) @@ -2066,8 +2066,10 @@ bool Foam::cellCellStencils::inverseDistance::update() { stencilSize[celli] = allStencil[celli].size(); } - tmp<volScalarField> tfld(createField("allStencil_hole", stencilSize)); - //tfld.ref().correctBoundaryConditions(); + tmp<volScalarField> tfld + ( + createField(mesh_, "allStencil_hole", stencilSize) + ); tfld().write(); } @@ -2080,9 +2082,8 @@ bool Foam::cellCellStencils::inverseDistance::update() { tmp<volScalarField> tfld ( - createField("allCellTypes_front", allCellTypes) + createField(mesh_, "allCellTypes_front", allCellTypes) ); - //tfld.ref().correctBoundaryConditions(); tfld().write(); } @@ -2227,14 +2228,20 @@ bool Foam::cellCellStencils::inverseDistance::update() << endl; } } - tmp<volScalarField> tfld(createField("maxMagWeight", maxMagWeight)); + tmp<volScalarField> tfld + ( + createField(mesh_, "maxMagWeight", maxMagWeight) + ); tfld.ref().correctBoundaryConditions(); tfld().write(); } // Dump cell types { - tmp<volScalarField> tfld(createField("cellTypes", cellTypes_)); + tmp<volScalarField> tfld + ( + createField(mesh_, "cellTypes", cellTypes_) + ); tfld.ref().correctBoundaryConditions(); tfld().write(); } diff --git a/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C b/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C index a30a601d306622c6789d9256e883516f2f715b97..988404591f62579df97a939803485e566c28f6aa 100644 --- a/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C +++ b/src/overset/cellCellStencil/trackingInverseDistance/trackingInverseDistanceCellCellStencil.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2017-2018 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2017-2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -441,55 +441,55 @@ Foam::cellCellStencils::trackingInverseDistance::trackingInverseDistance inverseDistance(mesh, dict, false), globalCells_(mesh_.nCells()) { - if (doUpdate) - { - // Initialise donor cell - globalDonor_.setSize(mesh_.nCells()); - globalDonor_ = -1; + // Initialise donor cell + globalDonor_.setSize(mesh_.nCells()); + globalDonor_ = -1; - // Initialise mesh partitions - const labelIOList& zoneID = this->zoneID(); - label nZones = gMax(zoneID)+1; + // Initialise mesh partitions + const labelIOList& zoneID = this->zoneID(); + label nZones = gMax(zoneID)+1; - labelList nCellsPerZone(nZones, Zero); - forAll(zoneID, celli) - { - nCellsPerZone[zoneID[celli]]++; - } - Pstream::listCombineGather(nCellsPerZone, plusEqOp<label>()); - Pstream::listCombineScatter(nCellsPerZone); + labelList nCellsPerZone(nZones, Zero); + forAll(zoneID, celli) + { + nCellsPerZone[zoneID[celli]]++; + } + Pstream::listCombineGather(nCellsPerZone, plusEqOp<label>()); + Pstream::listCombineScatter(nCellsPerZone); - meshParts_.setSize(nZones); - forAll(meshParts_, zonei) - { - meshParts_.set - ( - zonei, - new fvMeshSubset(mesh_, zonei, zoneID) - ); + meshParts_.setSize(nZones); + forAll(meshParts_, zonei) + { + meshParts_.set + ( + zonei, + new fvMeshSubset(mesh_, zonei, zoneID) + ); - // Trigger early evaluation of mesh dimension - // (in case there are locally zero cells in mesh) - (void)meshParts_[zonei].subMesh().nGeometricD(); - } + // Trigger early evaluation of mesh dimension + // (in case there are locally zero cells in mesh) + (void)meshParts_[zonei].subMesh().nGeometricD(); + } - // Print a bit + // Print a bit + { + Info<< typeName << " : detected " << nZones + << " mesh regions" << endl; + Info<< incrIndent; + forAll(nCellsPerZone, zonei) { - Info<< typeName << " : detected " << nZones - << " mesh regions" << endl; - Info<< incrIndent; - forAll(nCellsPerZone, zonei) - { - Info<< indent<< "zone:" << zonei - << " nCells:" << nCellsPerZone[zonei] - << endl; - } - Info<< decrIndent; + Info<< indent<< "zone:" << zonei + << " nCells:" << nCellsPerZone[zonei] + << endl; } + Info<< decrIndent; + } - // Do geometry update + // Do geometry update + if (doUpdate) + { update(); } } @@ -550,12 +550,36 @@ bool Foam::cellCellStencils::trackingInverseDistance::update() meshSearches.set ( zonei, - new voxelMeshSearch(meshParts_[zonei].subMesh(), true) + new voxelMeshSearch + ( + meshParts_[zonei].subMesh(), + true + ) ); } } DebugInfo<< FUNCTION_NAME << " : Constructed cell voxel meshes" << endl; + PtrList<fvMesh> voxelMeshes; + if (debug) + { + voxelMeshes.setSize(meshSearches.size()); + forAll(meshSearches, zonei) + { + IOobject meshIO + ( + word("voxelMesh" + Foam::name(zonei)), + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ + ); + + Pout<< "Constructing voxel mesh " << meshIO.objectPath() << endl; + voxelMeshes.set(zonei, meshSearches[zonei].makeMesh(meshIO)); + } + } + + const boundBox& allBb(mesh_.bounds()); @@ -657,6 +681,24 @@ bool Foam::cellCellStencils::trackingInverseDistance::update() } DebugInfo<< FUNCTION_NAME << " : Calculated boundary voxel meshes" << endl; + if (debug) + { + forAll(patchParts, zonei) + { + const labelList voxelTypes(patchParts[zonei].values()); + const fvMesh& vm = voxelMeshes[zonei]; + tmp<volScalarField> tfld + ( + createField<label> + ( + vm, + "patchTypes", + voxelTypes + ) + ); + tfld().write(); + } + } // Current best guess for cells labelList allCellTypes(mesh_.nCells(), CALCULATED); @@ -698,7 +740,13 @@ bool Foam::cellCellStencils::trackingInverseDistance::update() srci, allCellTypes ); + } + } + for (label srci = 0; srci < meshParts_.size()-1; srci++) + { + for (label tgti = srci+1; tgti < meshParts_.size(); tgti++) + { markDonors ( pBufs, @@ -727,6 +775,15 @@ bool Foam::cellCellStencils::trackingInverseDistance::update() DebugInfo<< FUNCTION_NAME << " : Determined holes and donor-acceptors" << endl; + if (debug) + { + tmp<volScalarField> tfld + ( + createField(mesh_, "allCellTypes", allCellTypes) + ); + tfld().write(); + } + // Use the patch types and weights to decide what to do forAll(allPatchTypes, celli) @@ -753,15 +810,84 @@ bool Foam::cellCellStencils::trackingInverseDistance::update() } DebugInfo<< FUNCTION_NAME << " : Removed bad donors" << endl; + if (debug) + { + tmp<volScalarField> tfld + ( + createField(mesh_, "allCellTypes_patch", allCellTypes) + ); + tfld().write(); + } + + // Mark unreachable bits findHoles(globalCells_, mesh_, zoneID, allStencil, allCellTypes); DebugInfo<< FUNCTION_NAME << " : Flood-filled holes" << endl; + if (debug) + { + tmp<volScalarField> tfld + ( + createField(mesh_, "allCellTypes_hole", allCellTypes) + ); + tfld().write(); + } + // Add buffer interpolation layer(s) around holes scalarField allWeight(mesh_.nCells(), Zero); walkFront(layerRelax, allStencil, allCellTypes, allWeight); DebugInfo<< FUNCTION_NAME << " : Implemented layer relaxation" << endl; + if (debug) + { + tmp<volScalarField> tfld + ( + createField(mesh_, "allCellTypes_front", allCellTypes) + ); + tfld().write(); + } + + + // Check previous iteration cellTypes_ for any hole->calculated changes + { + label nCalculated = 0; + + forAll(cellTypes_, celli) + { + if (allCellTypes[celli] == CALCULATED && cellTypes_[celli] == HOLE) + { + if (allStencil[celli].size() == 0) + { + FatalErrorInFunction + //WarningInFunction + << "Cell:" << celli + << " at:" << mesh_.cellCentres()[celli] + << " zone:" << zoneID[celli] + << " changed from hole to calculated" + << " but there is no donor" + //<< endl; + << exit(FatalError); + } + else + { + Pout<< "cell:" << mesh_.cellCentres()[celli] + << " changed from hole to calculated" + << " using donors:" << allStencil[celli] + << endl; + allCellTypes[celli] = INTERPOLATED; + nCalculated++; + } + } + } + + if (debug) + { + Pout<< "Detected " << nCalculated << " cells changing from hole" + << " to calculated. Changed to interpolated" + << endl; + } + } + // Convert cell-cell addressing to stencil in compact notation diff --git a/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.C b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.C index 720b25d7610d55a5df8af4811c9a7379715e4039..dd331034992a4c283f50795730d8016df3aae3b2 100644 --- a/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.C +++ b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2017-2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -26,7 +26,11 @@ License #include "voxelMeshSearch.H" #include "polyMesh.H" #include "processorPolyPatch.H" - +#include "IOobject.H" +#include "fvMesh.H" +#include "block.H" +#include "emptyPolyPatch.H" +#include "fvMeshTools.H" /* * * * * * * * * * * * * * * Static Member Data * * * * * * * * * * * * * */ @@ -340,6 +344,14 @@ bool Foam::voxelMeshSearch::update() } + if (debug) + { + Pout<< "voxelMeshSearch : mesh:" << mesh_.name() + << " nDivs:" << nDivs_ + << " localBb:" << localBb_ << endl; + } + + //// Small optimisation: make sure the cell centre at least always //// returns the cell itself //const pointField& cellCentres = mesh_.cellCentres(); @@ -429,4 +441,106 @@ Foam::label Foam::voxelMeshSearch::findCell(const point& p) const } +Foam::autoPtr<Foam::fvMesh> Foam::voxelMeshSearch::makeMesh +( + const IOobject& io +) const +{ + const cellModel& hex = cellModel::ref(cellModel::HEX); + + cellShapeList cellShapes; + faceListList boundary; + pointField points; + { + //Info<< "Creating block" << endl; + + block b + ( + cellShape(hex, identity(8), false), + localBb_.points(), + blockEdgeList(), + blockFaceList(), + nDivs_, + List<gradingDescriptors>(12) + ); + + List<FixedList<label, 8>> bCells(b.cells()); + cellShapes.setSize(bCells.size()); + forAll(cellShapes, celli) + { + cellShapes[celli] = + cellShape(hex, labelList(bCells[celli]), false); + } + + //Info<< "Creating boundary faces" << endl; + + boundary.setSize(b.boundaryPatches().size()); + forAll(boundary, patchi) + { + faceList faces(b.boundaryPatches()[patchi].size()); + forAll(faces, facei) + { + faces[facei] = face(b.boundaryPatches()[patchi][facei]); + } + boundary[patchi].transfer(faces); + } + + points.transfer(const_cast<pointField&>(b.points())); + } + + //Info<< "Creating patch dictionaries" << endl; + wordList patchNames(boundary.size()); + forAll(patchNames, patchi) + { + patchNames[patchi] = "patch" + Foam::name(patchi); + } + + PtrList<dictionary> boundaryDicts(boundary.size()); + forAll(boundaryDicts, patchi) + { + boundaryDicts.set(patchi, new dictionary()); + dictionary& patchDict = boundaryDicts[patchi]; + patchDict.add("type", emptyPolyPatch::typeName); + } + + //Info<< "Creating polyMesh" << endl; + IOobject polyIO(io); + polyIO.readOpt() = IOobject::NO_READ; + polyMesh mesh + ( + //IOobject + //( + // polyMesh::defaultRegion, + // runTime.constant(), + // runTime, + // IOobject::NO_READ + //), + polyIO, + std::move(points), + cellShapes, + boundary, + patchNames, + boundaryDicts, + "defaultFaces", + emptyPolyPatch::typeName, + false + ); + + //Info<< "Writing polyMesh" << endl; + mesh.write(); + + //Info<< "Reading fvMesh" << endl; + + fvMeshTools::createDummyFvMeshFiles + ( + io.db(), + io.name() + ); + IOobject fvIO(io); + fvIO.readOpt() = IOobject::MUST_READ; + + return autoPtr<fvMesh>::New(fvIO); +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.H b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.H index 3f8bd0443489762a351fb6918974ca5743fc94f9..5c929fe44b62b7232656a03631730adee7f1b7a6 100644 --- a/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.H +++ b/src/overset/cellCellStencil/trackingInverseDistance/voxelMeshSearch.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2017 OpenCFD Ltd. + \\ / A nd | Copyright (C) 2017-2019 OpenCFD Ltd. \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -46,6 +46,8 @@ namespace Foam // Forward declaration of friend functions and operators class polyMesh; class OBJstream; +class IOobject; +class fvMesh; /*---------------------------------------------------------------------------*\ Class voxelMeshSearch Declaration @@ -60,7 +62,7 @@ class voxelMeshSearch //- Local mesh bounding box boundBox localBb_; - //- Number of points in all directions (for local mesh only) + //- Number of voxels in all directions (for local mesh only) labelVector nDivs_; //- Voxel to seed cell @@ -185,6 +187,10 @@ public: const boundBox&, const labelVector& ); + + //- Debug: construct fvMesh. Note: writes a dummy mesh to + // io.timeName()! TBD. + autoPtr<fvMesh> makeMesh(const IOobject&) const; }; diff --git a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSchemes b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSchemes index b92e920c3ed7639a081992cebd5cc4920979796f..ca1a726628bda56873007db0b7608a53879297dd 100644 --- a/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSchemes +++ b/tutorials/incompressible/overPimpleDyMFoam/simpleRotor/system/fvSchemes @@ -57,9 +57,11 @@ snGradSchemes oversetInterpolation { method inverseDistance; - searchBox (0 0 0)(0.01 0.01 0.01); searchBoxDivisions (100 100 1); + + //method trackingInverseDistance; + //searchBoxDivisions 2{(100 100 1)}; } fluxRequired