mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: new PDRblockMesh mesh generation utility (issue #1216)
- While a rectilinear mesh can be created with blockMesh, not every mesh
created with blockMesh will satisfy the requirements for being a
rectilinear mesh.
This alternative to blockMesh uses a single block that is aligned
with the xy-z directions and specifications of the control points,
mesh divisions and expansion ratios. For example,
x
{
points ( -13.28 -0.10 6.0 19.19 );
nCells ( 10 12 10 );
ratios ( 0.2 1 5 );
}
y { ... }
z { ... }
With only one block, the boundary patch definition is simple and the
canonical face number is used directly. For example,
inlet
{
type patch;
faces ( 0 );
}
outlet
{
type patch;
faces ( 1 );
}
sides
{
type patch;
faces ( 2 3 );
}
...
- After a mesh is defined, it is trivial to retrieve mesh-related
information such as cell-volume, cell-centres for any i-j-k location
without an actual polyMesh.
STYLE: remove -noFunctionObjects from blockMesh
- no time loop, so function objects cannot be triggered anyhow.
This commit is contained in:
3
applications/test/PDRblockMesh/Make/files
Normal file
3
applications/test/PDRblockMesh/Make/files
Normal file
@ -0,0 +1,3 @@
|
||||
Test-PDRblockMesh.C
|
||||
|
||||
EXE = $(FOAM_USER_APPBIN)/Test-PDRblockMesh
|
||||
6
applications/test/PDRblockMesh/Make/options
Normal file
6
applications/test/PDRblockMesh/Make/options
Normal file
@ -0,0 +1,6 @@
|
||||
EXE_INC = \
|
||||
-DFULLDEBUG \
|
||||
-I$(LIB_SRC)/mesh/blockMesh/lnInclude
|
||||
|
||||
EXE_LIBS = \
|
||||
-lblockMesh
|
||||
224
applications/test/PDRblockMesh/Test-PDRblockMesh.C
Normal file
224
applications/test/PDRblockMesh/Test-PDRblockMesh.C
Normal file
@ -0,0 +1,224 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Description
|
||||
Test accessors for PDRblock
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#include "argList.H"
|
||||
#include "Time.H"
|
||||
#include "PDRblock.H"
|
||||
|
||||
using namespace Foam;
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
// Main program:
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
argList::noParallel();
|
||||
argList::noFunctionObjects();
|
||||
argList::addOption
|
||||
(
|
||||
"dict",
|
||||
"file",
|
||||
"Alternative dictionary for the PDRblockMesh description"
|
||||
);
|
||||
|
||||
#include "setRootCase.H"
|
||||
#include "createTime.H"
|
||||
|
||||
const word dictName("PDRblockMeshDict");
|
||||
|
||||
#include "setSystemRunTimeDictionaryIO.H"
|
||||
|
||||
Info<< "Reading " << dictName << nl << endl;
|
||||
|
||||
IOdictionary meshDict(dictIO);
|
||||
|
||||
PDRblock mesh(meshDict, true);
|
||||
|
||||
// Write summary
|
||||
Info<< "----------------" << nl
|
||||
<< "Mesh Information" << nl
|
||||
<< "----------------" << nl
|
||||
<< " " << "bounds: " << mesh.bounds() << nl
|
||||
<< " " << "nPoints: " << mesh.nPoints()
|
||||
<< " " << (mesh.sizes() + labelVector::one) << nl
|
||||
<< " " << "nCells: " << mesh.nCells()
|
||||
<< " " << mesh.sizes() << nl
|
||||
<< " " << "nFaces: " << mesh.nFaces() << nl
|
||||
<< " " << "nInternalFaces: " << mesh.nInternalFaces() << nl;
|
||||
|
||||
Info<< "----------------" << nl
|
||||
<< "Addressing" << nl
|
||||
<< "----------------" << nl
|
||||
<< " " << "volume: " << mesh.bounds().volume() << nl
|
||||
<< " " << "avg-vol: "<< (mesh.bounds().volume() / mesh.nCells()) << nl;
|
||||
|
||||
|
||||
Info<< nl << "Check sizes: " << mesh.bounds().span() << nl;
|
||||
|
||||
for (direction cmpt=0; cmpt < vector::nComponents; ++cmpt)
|
||||
{
|
||||
// Three different ways of getting the same information
|
||||
// not all are equally efficient
|
||||
|
||||
scalar totalWidth = 0;
|
||||
|
||||
// Using location
|
||||
forAll(mesh.grid()[cmpt], i)
|
||||
{
|
||||
totalWidth += mesh.grid()[cmpt].width(i);
|
||||
}
|
||||
|
||||
Info<< vector::componentNames[cmpt] << " min/max "
|
||||
<< minMax(mesh.grid()[cmpt])
|
||||
<< ' ' << mesh.grid()[cmpt].first()
|
||||
<< ' ' << mesh.grid()[cmpt].last()
|
||||
<< " " << mesh.grid()[cmpt].size() << " cells" << nl;
|
||||
|
||||
|
||||
// Use global (i,j,k) accessors, with mid-mesh for other directions
|
||||
|
||||
const label nx = mesh.sizes().x() / (cmpt == vector::X ? 1 : 2);
|
||||
const label ny = mesh.sizes().y() / (cmpt == vector::Y ? 1 : 2);
|
||||
const label nz = mesh.sizes().z() / (cmpt == vector::Z ? 1 : 2);
|
||||
|
||||
|
||||
scalar totalSpan = 0;
|
||||
scalar totalDelta = 0;
|
||||
|
||||
switch (cmpt)
|
||||
{
|
||||
case vector::X:
|
||||
{
|
||||
for (label i=0; i < nx; ++i)
|
||||
{
|
||||
totalSpan += mesh.span(i, ny, nz).x();
|
||||
totalDelta += mesh.dx(i);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case vector::Y:
|
||||
{
|
||||
for (label j=0; j < ny; ++j)
|
||||
{
|
||||
totalSpan += mesh.span(nx, j, nz).y();
|
||||
totalDelta += mesh.dy(j);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case vector::Z:
|
||||
{
|
||||
for (label k=0; k < nz; ++k)
|
||||
{
|
||||
totalSpan += mesh.span(nx, ny, k).z();
|
||||
totalDelta += mesh.dz(k);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
Info<< " width = " << totalWidth << " delta = " << totalDelta
|
||||
<< " span = " << totalSpan << nl;
|
||||
}
|
||||
|
||||
{
|
||||
const labelVector mid = mesh.sizes() / 2;
|
||||
|
||||
Info<< nl << "Mid-mesh information at " << mid << nl
|
||||
<< " centre = " << mesh.C(mid) << nl
|
||||
<< " volume = " << mesh.V(mid) << nl
|
||||
<< " length = " << mesh.width(mid) << nl;
|
||||
}
|
||||
|
||||
Info<< nl;
|
||||
|
||||
// Fatal with FULLDEBUG
|
||||
{
|
||||
const bool throwingError = FatalError.throwExceptions();
|
||||
|
||||
const label nx = mesh.sizes().x();
|
||||
const label ny = mesh.sizes().y();
|
||||
const label nz = mesh.sizes().z();
|
||||
|
||||
// Here we get error in x-y-z order
|
||||
try
|
||||
{
|
||||
mesh.checkIndex(nx, ny, nz);
|
||||
}
|
||||
catch (const Foam::error& err)
|
||||
{
|
||||
Info<< nl << "Expected: Caught accesor error\n "
|
||||
<< err.message().c_str() << nl;
|
||||
}
|
||||
|
||||
// No order for the error since it is called parameter-wise
|
||||
try
|
||||
{
|
||||
Info<< "centre at mesh(nx, ny, nz) = "
|
||||
<< mesh.C(mesh.sizes()) << nl;
|
||||
}
|
||||
catch (const Foam::error& err)
|
||||
{
|
||||
Info<< nl << "Expected: Caught accesor error\n "
|
||||
<< err.message().c_str() << nl;
|
||||
}
|
||||
|
||||
// Sizing error
|
||||
try
|
||||
{
|
||||
mesh.checkSizes(labelVector(nx+1, ny, nz));
|
||||
}
|
||||
catch (const Foam::error& err)
|
||||
{
|
||||
Info<< nl << "Expected: Caught sizing error\n "
|
||||
<< err.message().c_str() << nl;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
mesh.checkSizes(labelMax/4);
|
||||
}
|
||||
catch (const Foam::error& err)
|
||||
{
|
||||
Info<< nl << "Expected: Caught sizing error\n "
|
||||
<< err.message().c_str() << nl;
|
||||
}
|
||||
|
||||
FatalError.throwExceptions(throwingError);
|
||||
}
|
||||
|
||||
|
||||
Info<< "\nEnd\n" << nl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
78
applications/test/PDRblockMesh/box0/system/PDRblockMeshDict
Normal file
78
applications/test/PDRblockMesh/box0/system/PDRblockMeshDict
Normal file
@ -0,0 +1,78 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: v1812 |
|
||||
| \\ / A nd | Web: www.OpenFOAM.com |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
object PDRblockMeshDict;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
//- Point scaling (optional)
|
||||
scale 1.0;
|
||||
|
||||
x
|
||||
{
|
||||
points ( -13.28 -0.10 6.0 19.19 );
|
||||
nCells ( 10 12 10 );
|
||||
ratios ( -5.16 1 5.16 );
|
||||
}
|
||||
|
||||
y
|
||||
{
|
||||
points ( -12.98 0 5.50 18.48 );
|
||||
nCells ( 10 11 10 );
|
||||
ratios ( -5.16 1 5.16 );
|
||||
}
|
||||
|
||||
z
|
||||
{
|
||||
points ( 0.00 4.80 17.26 );
|
||||
nCells ( 10 10 );
|
||||
ratios ( 1 5.16 );
|
||||
}
|
||||
|
||||
|
||||
defaultPatch
|
||||
{
|
||||
name walls;
|
||||
type wall;
|
||||
}
|
||||
|
||||
|
||||
// Faces: 0=x-min, 1=x-max, 2=y-min, 3=y-max, 4=z-min, 5=z-max
|
||||
|
||||
boundary
|
||||
(
|
||||
outer
|
||||
{
|
||||
type patch;
|
||||
faces ( 0 1 2 3 5 );
|
||||
}
|
||||
|
||||
mergingFaces
|
||||
{
|
||||
type wall;
|
||||
faces ();
|
||||
}
|
||||
|
||||
blockedFaces
|
||||
{
|
||||
type wall;
|
||||
faces ();
|
||||
}
|
||||
|
||||
ground
|
||||
{
|
||||
type wall;
|
||||
faces ( 4 );
|
||||
}
|
||||
);
|
||||
|
||||
// ************************************************************************* //
|
||||
51
applications/test/PDRblockMesh/box0/system/controlDict
Normal file
51
applications/test/PDRblockMesh/box0/system/controlDict
Normal file
@ -0,0 +1,51 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: v1812 |
|
||||
| \\ / A nd | Web: www.OpenFOAM.com |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
location "system";
|
||||
object controlDict;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
libs ("libblockMesh.so");
|
||||
|
||||
application PDRblockMesh;
|
||||
|
||||
startFrom startTime;
|
||||
|
||||
startTime 0;
|
||||
|
||||
stopAt endTime;
|
||||
|
||||
endTime 0;
|
||||
|
||||
deltaT 0;
|
||||
|
||||
writeControl timeStep;
|
||||
|
||||
writeInterval 1;
|
||||
|
||||
purgeWrite 0;
|
||||
|
||||
writeFormat ascii;
|
||||
|
||||
writePrecision 8;
|
||||
|
||||
writeCompression off;
|
||||
|
||||
timeFormat general;
|
||||
|
||||
timePrecision 6;
|
||||
|
||||
runTimeModifiable true;
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
37
applications/test/PDRblockMesh/box0/system/fvSchemes
Normal file
37
applications/test/PDRblockMesh/box0/system/fvSchemes
Normal file
@ -0,0 +1,37 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: v1812 |
|
||||
| \\ / A nd | Web: www.OpenFOAM.com |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
location "system";
|
||||
object fvSchemes;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
ddtSchemes
|
||||
{}
|
||||
|
||||
gradSchemes
|
||||
{}
|
||||
|
||||
divSchemes
|
||||
{}
|
||||
|
||||
laplacianSchemes
|
||||
{}
|
||||
|
||||
interpolationSchemes
|
||||
{}
|
||||
|
||||
snGradSchemes
|
||||
{}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
18
applications/test/PDRblockMesh/box0/system/fvSolution
Normal file
18
applications/test/PDRblockMesh/box0/system/fvSolution
Normal file
@ -0,0 +1,18 @@
|
||||
/*--------------------------------*- C++ -*----------------------------------*\
|
||||
| ========= | |
|
||||
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||
| \\ / O peration | Version: v1812 |
|
||||
| \\ / A nd | Web: www.OpenFOAM.com |
|
||||
| \\/ M anipulation | |
|
||||
\*---------------------------------------------------------------------------*/
|
||||
FoamFile
|
||||
{
|
||||
version 2.0;
|
||||
format ascii;
|
||||
class dictionary;
|
||||
location "system";
|
||||
object fvSolution;
|
||||
}
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
// ************************************************************************* //
|
||||
Reference in New Issue
Block a user