BUG: trackingInverseDistance: fix trackingInverseDistance. Fixes #736.

This commit is contained in:
mattijs
2019-01-17 18:21:38 +00:00
parent 56406493f6
commit 6ccdc77468
15 changed files with 504 additions and 282 deletions

View File

@ -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

View File

@ -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;

View File

@ -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());

View File

@ -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

View File

@ -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();
}
}
}
// ************************************************************************* //

View File

@ -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
);
};

View File

@ -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

View File

@ -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:

View File

@ -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
)

View File

@ -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);

View File

@ -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();
}

View File

@ -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())
{
// Initialise donor cell
globalDonor_.setSize(mesh_.nCells());
globalDonor_ = -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);
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();
}
// Print a bit
{
Info<< typeName << " : detected " << nZones
<< " mesh regions" << endl;
Info<< incrIndent;
forAll(nCellsPerZone, zonei)
{
Info<< indent<< "zone:" << zonei
<< " nCells:" << nCellsPerZone[zonei]
<< endl;
}
Info<< decrIndent;
}
// Do geometry update
if (doUpdate)
{
// Initialise donor cell
globalDonor_.setSize(mesh_.nCells());
globalDonor_ = -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);
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();
}
// Print a bit
{
Info<< typeName << " : detected " << nZones
<< " mesh regions" << endl;
Info<< incrIndent;
forAll(nCellsPerZone, zonei)
{
Info<< indent<< "zone:" << zonei
<< " nCells:" << nCellsPerZone[zonei]
<< endl;
}
Info<< decrIndent;
}
// Do geometry update
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

View File

@ -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);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -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;
};

View File

@ -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