snappyHexMesh: Simplified and rationalised the region refinement level specification

The inside or outside region refinement level is now specified using the simple
"level <level>" entry in refinementRegions e.g.

    refinementRegions
    {
        refinementBox
        {
            mode    inside;
            level   5;
        }
    }

rather than

    refinementRegions
    {
        refinementBox
        {
            mode    inside;
            levels  ((1E15 5));
        }
    }

where the spurious "1E15" number is not used and the '((...))' is unnecessary clutter.
This commit is contained in:
Henry Weller
2021-06-15 13:20:44 +01:00
parent 7b7fa5a9af
commit be9fb841a1
20 changed files with 167 additions and 107 deletions

View File

@ -77,8 +77,8 @@ castellatedMeshControls
{ {
CAD CAD
{ {
mode inside; mode inside;
levels ((1E15 2)); level 2;
} }
} }

View File

@ -49,8 +49,8 @@ castellatedMeshControls
{ {
CAD CAD
{ {
mode inside; mode inside;
levels ((1E15 2)); level 2;
} }
} }

View File

@ -75,8 +75,8 @@ castellatedMeshControls
/* /*
rotatingZone rotatingZone
{ {
mode inside; mode inside;
levels ((1E15 2)); level 2;
} }
*/ */
} }

View File

@ -77,8 +77,8 @@ castellatedMeshControls
{ {
CAD CAD
{ {
mode inside; mode inside;
levels ((1E15 2)); level 2;
} }
} }

View File

@ -77,8 +77,8 @@ castellatedMeshControls
{ {
CAD CAD
{ {
mode inside; mode inside;
levels ((1E15 2)); level 2;
} }
} }

View File

@ -104,8 +104,8 @@ castellatedMeshControls
/* /*
rotatingZone rotatingZone
{ {
mode inside; mode inside;
levels ((1E15 2)); level 2;
} }
*/ */
} }

View File

@ -96,8 +96,8 @@ castellatedMeshControls
{ {
CAD CAD
{ {
mode inside; mode inside;
levels ((1E15 1)); level 1;
} }
} }

View File

@ -57,74 +57,56 @@ const Foam::NamedEnum<Foam::shellSurfaces::refineMode, 5>
void Foam::shellSurfaces::setAndCheckLevels void Foam::shellSurfaces::setAndCheckLevels
( (
const label shelli, const label shelli,
const List<Tuple2<scalar, label>>& distLevels const dictionary& dict
) )
{ {
if (modes_[shelli] != refineMode::distance && distLevels.size() != 1) const searchableSurface& shell = allGeometry_[shells_[shelli]];
if
(
modes_[shelli] == refineMode::inside
|| modes_[shelli] == refineMode::outside
)
{ {
FatalErrorInFunction if (!allGeometry_[shells_[shelli]].hasVolumeType())
<< "For refinement mode "
<< refineModeNames_[modes_[shelli]]
<< " specify only one distance+level."
<< " (its distance gets discarded)"
<< exit(FatalError);
}
// Extract information into separate distance and level
distances_[shelli].setSize(distLevels.size());
levels_[shelli].setSize(distLevels.size());
forAll(distLevels, j)
{
distances_[shelli][j] = distLevels[j].first();
levels_[shelli][j] = distLevels[j].second();
// Check in incremental order
if (j > 0)
{ {
if WarningInFunction
( << "Shell " << shell.name()
(distances_[shelli][j] <= distances_[shelli][j-1]) << " is not closed so testing for '"
|| (levels_[shelli][j] > levels_[shelli][j-1]) << refineModeNames_[modes_[shelli]]
) << "' may fail." << endl;
}
distances_[shelli].setSize(0);
levels_[shelli].setSize(1);
if (dict.found("levels") && !(dict.found("level")))
{
// Support 'levels' for backward compatibility
const List<Tuple2<scalar, label>> distLevels(dict.lookup("levels"));
if (distLevels.size() != 1)
{ {
FatalErrorInFunction FatalErrorInFunction
<< "For refinement mode " << "For refinement mode "
<< refineModeNames_[modes_[shelli]] << refineModeNames_[modes_[shelli]]
<< " : Refinement should be specified in order" << " specify only one distance+level."
<< " of increasing distance" << " (its distance gets discarded)"
<< " (and decreasing refinement level)." << endl
<< "Distance:" << distances_[shelli][j]
<< " refinementLevel:" << levels_[shelli][j]
<< exit(FatalError); << exit(FatalError);
} }
levels_[shelli][0] = distLevels[0].second();
} }
} else
const searchableSurface& shell = allGeometry_[shells_[shelli]];
if (modes_[shelli] == refineMode::distance)
{
Info<< "Refinement level according to distance to "
<< shell.name() << endl;
forAll(levels_[shelli], j)
{ {
Info<< " level " << levels_[shelli][j] if (dict.found("levels"))
<< " for all cells within " << distances_[shelli][j] {
<< " metre." << endl; IOWarningInFunction(dict)
} << "Found both 'level' and 'levels' entries, using 'level'."
} << endl;
else }
{
if (!allGeometry_[shells_[shelli]].hasVolumeType()) levels_[shelli][0] = readLabel(dict.lookup("level"));
{
FatalErrorInFunction
<< "Shell " << shell.name()
<< " does not support testing for "
<< refineModeNames_[modes_[shelli]] << endl
<< "Probably it is not closed."
<< exit(FatalError);
} }
if (modes_[shelli] == refineMode::inside) if (modes_[shelli] == refineMode::inside)
@ -138,6 +120,88 @@ void Foam::shellSurfaces::setAndCheckLevels
<< " for all cells outside " << shell.name() << endl; << " for all cells outside " << shell.name() << endl;
} }
} }
else if
(
modes_[shelli] == refineMode::insideSpan
|| modes_[shelli] == refineMode::outsideSpan
)
{
if (!allGeometry_[shells_[shelli]].hasVolumeType())
{
WarningInFunction
<< "Shell " << shell.name()
<< " is not closed so testing for '"
<< refineModeNames_[modes_[shelli]]
<< "' may fail." << endl;
}
distances_[shelli].setSize(1);
levels_[shelli].setSize(1);
const Tuple2<scalar, label> distLevel(dict.lookup("level"));
distances_[shelli][0] = distLevel.first();
levels_[shelli][0] = distLevel.second();
if (modes_[shelli] == refineMode::insideSpan)
{
Info<< "Refinement level " << levels_[shelli][0]
<< " for all cells inside " << shell.name()
<< " within distance " << distances_[shelli][0] << endl;
}
else
{
Info<< "Refinement level " << levels_[shelli][0]
<< " for all cells outside " << shell.name()
<< " within distance " << distances_[shelli][0] << endl;
}
}
else
{
const List<Tuple2<scalar, label>> distLevels(dict.lookup("levels"));
// Extract information into separate distance and level
distances_[shelli].setSize(distLevels.size());
levels_[shelli].setSize(distLevels.size());
forAll(distLevels, j)
{
distances_[shelli][j] = distLevels[j].first();
levels_[shelli][j] = distLevels[j].second();
// Check in incremental order
if (j > 0)
{
if
(
(distances_[shelli][j] <= distances_[shelli][j-1])
|| (levels_[shelli][j] > levels_[shelli][j-1])
)
{
FatalErrorInFunction
<< "For refinement mode "
<< refineModeNames_[modes_[shelli]]
<< " : Refinement should be specified in order"
<< " of increasing distance"
<< " (and decreasing refinement level)." << endl
<< "Distance:" << distances_[shelli][j]
<< " refinementLevel:" << levels_[shelli][j]
<< exit(FatalError);
}
}
}
if (modes_[shelli] == refineMode::distance)
{
Info<< "Refinement level according to distance to "
<< shell.name() << endl;
forAll(levels_[shelli], j)
{
Info<< " level " << levels_[shelli][j]
<< " for all cells within " << distances_[shelli][j]
<< " metre." << endl;
}
}
}
} }
@ -499,7 +563,7 @@ Foam::shellSurfaces::shellSurfaces
modes_[shelli] = refineModeNames_.read(dict.lookup("mode")); modes_[shelli] = refineModeNames_.read(dict.lookup("mode"));
// Read pairs of distance+level // Read pairs of distance+level
setAndCheckLevels(shelli, dict.lookup("levels")); setAndCheckLevels(shelli, dict);
if if
( (

View File

@ -2,7 +2,7 @@
========= | ========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | Website: https://openfoam.org \\ / O peration | Website: https://openfoam.org
\\ / A nd | Copyright (C) 2011-2020 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2021 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
@ -103,11 +103,7 @@ private:
// Private Member Functions // Private Member Functions
//- Helper function for initialisation. //- Helper function for initialisation.
void setAndCheckLevels void setAndCheckLevels(const label shelli, const dictionary& dict);
(
const label shelli,
const List<Tuple2<scalar, label>>&
);
//- Specifically orient triSurfaces using a calculated point outside. //- Specifically orient triSurfaces using a calculated point outside.
// Done since quite often triSurfaces not of consistent orientation // Done since quite often triSurfaces not of consistent orientation

View File

@ -229,13 +229,13 @@ castellatedMeshControls
{ {
innerCylinder innerCylinder
{ {
mode inside; mode inside;
levels ((1E15 4)); level 4;
} }
middleCylinder middleCylinder
{ {
mode inside; mode inside;
levels ((1E15 3)); level 3;
} }
} }

View File

@ -138,8 +138,8 @@ castellatedMeshControls
{ {
refinementBox refinementBox
{ {
mode inside; mode inside;
levels ((1E15 5)); level 5;
} }
} }

View File

@ -92,20 +92,20 @@ castellatedMeshControls
{ {
body body
{ {
mode distance; mode distance;
levels ((0.2 5)); levels ((0.2 5));
} }
"(wake|underbody)" "(wake|underbody)"
{ {
mode inside; mode inside;
levels ((1E15 4)); level 4;
} }
".*stream" ".*stream"
{ {
mode inside; mode inside;
levels ((1E15 3)); level 3;
} }
} }

View File

@ -145,8 +145,8 @@ castellatedMeshControls
{ {
refinementBox refinementBox
{ {
mode inside; mode inside;
levels ((1E15 4)); level 4;
} }
} }

View File

@ -56,8 +56,8 @@ castellatedMeshControls
{ {
refinementBox refinementBox
{ {
mode inside; mode inside;
levels ((1E15 2)); level 2;
} }
} }

View File

@ -145,8 +145,8 @@ castellatedMeshControls
{ {
// refinementBox // refinementBox
// { // {
// mode inside; // mode inside;
// levels ((1E15 4)); // level 4;
// } // }
} }

View File

@ -126,8 +126,8 @@ castellatedMeshControls
{ {
refineHole refineHole
{ {
mode inside; mode inside;
levels ((1E15 3)); level 3;
} }
} }

View File

@ -131,8 +131,8 @@ castellatedMeshControls
{ {
refineHole refineHole
{ {
mode inside; mode inside;
levels ((1E15 3)); level 3;
} }
} }

View File

@ -61,8 +61,8 @@ castellatedMeshControls
{ {
pipeWall pipeWall
{ {
mode insideSpan; mode insideSpan;
levels ((1000 2)); level (1000 2);
cellsAcrossSpan 40; cellsAcrossSpan 40;
} }
} }

View File

@ -229,13 +229,13 @@ castellatedMeshControls
{ {
innerCylinder innerCylinder
{ {
mode inside; mode inside;
levels ((1E15 4)); level 4;
} }
middleCylinder middleCylinder
{ {
mode inside; mode inside;
levels ((1E15 3)); level 3;
} }
} }

View File

@ -48,8 +48,8 @@ castellatedMeshControls
{ {
sloshingCylinder sloshingCylinder
{ {
mode inside; mode inside;
levels ((1E15 1)); level 1;
} }
} }