mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
BUG: trackingInverseDistance: fix trackingInverseDistance. Fixes #736.
This commit is contained in:
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -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
|
||||
);
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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
|
||||
)
|
||||
|
||||
@ -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
|
||||
{
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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
|
||||
@ -440,8 +440,6 @@ Foam::cellCellStencils::trackingInverseDistance::trackingInverseDistance
|
||||
:
|
||||
inverseDistance(mesh, dict, false),
|
||||
globalCells_(mesh_.nCells())
|
||||
{
|
||||
if (doUpdate)
|
||||
{
|
||||
// Initialise donor cell
|
||||
globalDonor_.setSize(mesh_.nCells());
|
||||
@ -490,6 +488,8 @@ Foam::cellCellStencils::trackingInverseDistance::trackingInverseDistance
|
||||
|
||||
|
||||
// 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
|
||||
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
Reference in New Issue
Block a user