mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-12-28 03:37:59 +00:00
Merge branch 'master' of /home/dm4/OpenFOAM/OpenFOAM-dev
This commit is contained in:
@ -188,8 +188,25 @@ surfaces
|
||||
// cell, can be arbitrarily far away.
|
||||
type patchInternalField;
|
||||
patches ( ".*Wall.*" );
|
||||
distance 0.0001;
|
||||
interpolate true;
|
||||
|
||||
|
||||
// Optional: specify how to obtain sampling points from the patch
|
||||
// face centres (default is 'normal')
|
||||
//
|
||||
// //- Specify distance to offset in normal direction
|
||||
offsetMode normal;
|
||||
distance 0.1;
|
||||
//
|
||||
// //- Specify single uniform offset
|
||||
// offsetMode uniform;
|
||||
// offset (0 0 0.0001);
|
||||
//
|
||||
// //- Specify offset per patch face
|
||||
// offsetMode nonuniform;
|
||||
// offsets ((0 0 0.0001) (0 0 0.0002));
|
||||
|
||||
|
||||
// Optional: whether to leave as faces (=default) or triangulate
|
||||
// triangulate false;
|
||||
}
|
||||
|
||||
@ -186,7 +186,16 @@ void Foam::dynamicRefineFvMesh::readDict()
|
||||
).subDict(typeName + "Coeffs")
|
||||
);
|
||||
|
||||
correctFluxes_ = List<Pair<word> >(refineDict.lookup("correctFluxes"));
|
||||
List<Pair<word> > fluxVelocities = List<Pair<word> >
|
||||
(
|
||||
refineDict.lookup("correctFluxes")
|
||||
);
|
||||
// Rework into hashtable.
|
||||
correctFluxes_.resize(fluxVelocities.size());
|
||||
forAll(fluxVelocities, i)
|
||||
{
|
||||
correctFluxes_.insert(fluxVelocities[i][0], fluxVelocities[i][1]);
|
||||
}
|
||||
|
||||
dumpLevel_ = Switch(refineDict.lookup("dumpLevel"));
|
||||
}
|
||||
@ -289,23 +298,46 @@ Foam::dynamicRefineFvMesh::refine
|
||||
<< " split faces " << endl;
|
||||
}
|
||||
|
||||
forAll(correctFluxes_, i)
|
||||
HashTable<const surfaceScalarField*> fluxes
|
||||
(
|
||||
lookupClass<surfaceScalarField>()
|
||||
);
|
||||
forAllConstIter(HashTable<const surfaceScalarField*>, fluxes, iter)
|
||||
{
|
||||
if (!correctFluxes_.found(iter.key()))
|
||||
{
|
||||
WarningIn("dynamicRefineFvMesh::refine(const labelList&)")
|
||||
<< "Cannot find surfaceScalarField " << iter.key()
|
||||
<< " in user-provided flux mapping table "
|
||||
<< correctFluxes_ << endl
|
||||
<< " The flux mapping table is used to recreate the"
|
||||
<< " flux on newly created faces." << endl
|
||||
<< " Either add the entry if it is a flux or use ("
|
||||
<< iter.key() << " none) to suppress this warning."
|
||||
<< endl;
|
||||
continue;
|
||||
}
|
||||
|
||||
const word& UName = correctFluxes_[iter.key()];
|
||||
|
||||
if (UName == "none")
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (debug)
|
||||
{
|
||||
Info<< "Mapping flux " << correctFluxes_[i][0]
|
||||
<< " using interpolated flux " << correctFluxes_[i][1]
|
||||
Info<< "Mapping flux " << iter.key()
|
||||
<< " using interpolated flux " << UName
|
||||
<< endl;
|
||||
}
|
||||
surfaceScalarField& phi = const_cast<surfaceScalarField&>
|
||||
(
|
||||
lookupObject<surfaceScalarField>(correctFluxes_[i][0])
|
||||
);
|
||||
|
||||
surfaceScalarField& phi = const_cast<surfaceScalarField&>(*iter());
|
||||
const surfaceScalarField phiU
|
||||
(
|
||||
fvc::interpolate
|
||||
(
|
||||
lookupObject<volVectorField>(correctFluxes_[i][1])
|
||||
lookupObject<volVectorField>(UName)
|
||||
)
|
||||
& Sf()
|
||||
);
|
||||
@ -482,27 +514,51 @@ Foam::dynamicRefineFvMesh::unrefine
|
||||
const labelList& reversePointMap = map().reversePointMap();
|
||||
const labelList& reverseFaceMap = map().reverseFaceMap();
|
||||
|
||||
forAll(correctFluxes_, i)
|
||||
HashTable<const surfaceScalarField*> fluxes
|
||||
(
|
||||
lookupClass<surfaceScalarField>()
|
||||
);
|
||||
forAllConstIter(HashTable<const surfaceScalarField*>, fluxes, iter)
|
||||
{
|
||||
if (!correctFluxes_.found(iter.key()))
|
||||
{
|
||||
WarningIn("dynamicRefineFvMesh::refine(const labelList&)")
|
||||
<< "Cannot find surfaceScalarField " << iter.key()
|
||||
<< " in user-provided flux mapping table "
|
||||
<< correctFluxes_ << endl
|
||||
<< " The flux mapping table is used to recreate the"
|
||||
<< " flux on newly created faces." << endl
|
||||
<< " Either add the entry if it is a flux or use ("
|
||||
<< iter.key() << " none) to suppress this warning."
|
||||
<< endl;
|
||||
continue;
|
||||
}
|
||||
|
||||
const word& UName = correctFluxes_[iter.key()];
|
||||
|
||||
if (UName == "none")
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (debug)
|
||||
{
|
||||
Info<< "Mapping flux " << correctFluxes_[i][0]
|
||||
<< " using interpolated flux " << correctFluxes_[i][1]
|
||||
Info<< "Mapping flux " << iter.key()
|
||||
<< " using interpolated flux " << UName
|
||||
<< endl;
|
||||
}
|
||||
surfaceScalarField& phi = const_cast<surfaceScalarField&>
|
||||
(
|
||||
lookupObject<surfaceScalarField>(correctFluxes_[i][0])
|
||||
);
|
||||
surfaceScalarField phiU
|
||||
|
||||
surfaceScalarField& phi = const_cast<surfaceScalarField&>(*iter());
|
||||
const surfaceScalarField phiU
|
||||
(
|
||||
fvc::interpolate
|
||||
(
|
||||
lookupObject<volVectorField>(correctFluxes_[i][1])
|
||||
lookupObject<volVectorField>(UName)
|
||||
)
|
||||
& Sf()
|
||||
);
|
||||
|
||||
|
||||
forAllConstIter(Map<label>, faceToSplitPoint, iter)
|
||||
{
|
||||
label oldFaceI = iter.key();
|
||||
|
||||
@ -64,7 +64,7 @@ protected:
|
||||
Switch dumpLevel_;
|
||||
|
||||
//- Fluxes to map
|
||||
List<Pair<word> > correctFluxes_;
|
||||
HashTable<word> correctFluxes_;
|
||||
|
||||
//- Number of refinement/unrefinement steps done so far.
|
||||
label nRefinementIterations_;
|
||||
|
||||
@ -112,6 +112,10 @@ public:
|
||||
NORMAL // use face normal + distance
|
||||
};
|
||||
|
||||
static const NamedEnum<sampleMode, 4> sampleModeNames_;
|
||||
|
||||
static const NamedEnum<offsetMode, 3> offsetModeNames_;
|
||||
|
||||
|
||||
//- Helper class for finding nearest
|
||||
// Nearest:
|
||||
@ -146,10 +150,6 @@ private:
|
||||
|
||||
// Private data
|
||||
|
||||
static const NamedEnum<sampleMode, 4> sampleModeNames_;
|
||||
|
||||
static const NamedEnum<offsetMode, 3> offsetModeNames_;
|
||||
|
||||
//- Patch to sample
|
||||
const polyPatch& patch_;
|
||||
|
||||
|
||||
@ -58,24 +58,80 @@ Foam::sampledPatchInternalField::sampledPatchInternalField
|
||||
sampledPatch(name, mesh, dict),
|
||||
mappers_(patchIDs().size())
|
||||
{
|
||||
const scalar distance = readScalar(dict.lookup("distance"));
|
||||
|
||||
forAll(patchIDs(), i)
|
||||
mappedPatchBase::offsetMode mode = mappedPatchBase::NORMAL;
|
||||
if (dict.found("offsetMode"))
|
||||
{
|
||||
label patchI = patchIDs()[i];
|
||||
mappers_.set
|
||||
mode = mappedPatchBase::offsetModeNames_.read
|
||||
(
|
||||
i,
|
||||
new mappedPatchBase
|
||||
(
|
||||
mesh.boundaryMesh()[patchI],
|
||||
mesh.name(), // sampleRegion
|
||||
mappedPatchBase::NEARESTCELL, // sampleMode
|
||||
word::null, // samplePatch
|
||||
-distance // sample inside my domain
|
||||
)
|
||||
dict.lookup("offsetMode")
|
||||
);
|
||||
}
|
||||
|
||||
switch (mode)
|
||||
{
|
||||
case mappedPatchBase::NORMAL:
|
||||
{
|
||||
const scalar distance = readScalar(dict.lookup("distance"));
|
||||
forAll(patchIDs(), i)
|
||||
{
|
||||
mappers_.set
|
||||
(
|
||||
i,
|
||||
new mappedPatchBase
|
||||
(
|
||||
mesh.boundaryMesh()[patchIDs()[i]],
|
||||
mesh.name(), // sampleRegion
|
||||
mappedPatchBase::NEARESTCELL, // sampleMode
|
||||
word::null, // samplePatch
|
||||
-distance // sample inside my domain
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case mappedPatchBase::UNIFORM:
|
||||
{
|
||||
const point offset(dict.lookup("offset"));
|
||||
forAll(patchIDs(), i)
|
||||
{
|
||||
mappers_.set
|
||||
(
|
||||
i,
|
||||
new mappedPatchBase
|
||||
(
|
||||
mesh.boundaryMesh()[patchIDs()[i]],
|
||||
mesh.name(), // sampleRegion
|
||||
mappedPatchBase::NEARESTCELL, // sampleMode
|
||||
word::null, // samplePatch
|
||||
offset // sample inside my domain
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case mappedPatchBase::NONUNIFORM:
|
||||
{
|
||||
const pointField offsets(dict.lookup("offsets"));
|
||||
forAll(patchIDs(), i)
|
||||
{
|
||||
mappers_.set
|
||||
(
|
||||
i,
|
||||
new mappedPatchBase
|
||||
(
|
||||
mesh.boundaryMesh()[patchIDs()[i]],
|
||||
mesh.name(), // sampleRegion
|
||||
mappedPatchBase::NEARESTCELL, // sampleMode
|
||||
word::null, // samplePatch
|
||||
offsets // sample inside my domain
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -35,13 +35,14 @@ dynamicRefineFvMeshCoeffs
|
||||
// Stop refinement if maxCells reached
|
||||
maxCells 200000;
|
||||
// Flux field and corresponding velocity field. Fluxes on changed
|
||||
// faces get recalculated by interpolating the velocity.
|
||||
// faces get recalculated by interpolating the velocity. Use 'none'
|
||||
// on surfaceScalarFields that do not need to be reinterpolated.
|
||||
correctFluxes
|
||||
(
|
||||
(
|
||||
phi
|
||||
U
|
||||
)
|
||||
(phi U)
|
||||
(nHatf none)
|
||||
(rho*phi none)
|
||||
(ghf none)
|
||||
);
|
||||
// Write the refinement level as a volScalarField
|
||||
dumpLevel true;
|
||||
|
||||
Reference in New Issue
Block a user