ENH: Added new bladeForces function object

Calculates thrust, drag, torque and lift/drag/pressure coefficients
of single or multiple blades (eg, propeller, turbine blades)

This function object differs from the propellerInfo and forces
function objects in that all forces are calculated within the local
cylindrical coordinate system, which yields thrust and drag values
within the expected reference frame.

The output comprises:
- coefficients per radial bin
- area-weighted total coefficients
- integrated forces and torque

For convenient post-processing, the results are also written in a VTK
(.vtp) output format. All surface results are registered internally,
which makes them available for other function objects.
This commit is contained in:
Mark Olesen
2025-06-13 14:33:48 +02:00
parent 3c4e226130
commit 1078234f18
28 changed files with 3272 additions and 0 deletions

View File

@ -1,5 +1,6 @@
forces/forces.C
forceCoeffs/forceCoeffs.C
bladeForces/bladeForces.cxx
propellerInfo/propellerInfo.C
LIB = $(FOAM_LIBBIN)/libforces

View File

@ -0,0 +1,406 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2024-2025 OpenCFD Ltd.
-------------------------------------------------------------------------------
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/>.
Class
Foam::functionObjects::bladeForces
Group
grpForcesFunctionObjects
Description
Computes forces and coefficients over a given list of patches by integrating
pressure and viscous forces and moments.
Forces and moments are output in their constituent components
within the user-defined cylindrical coordinate system:
- thrust
- drag
- torque
Operands:
\table
Operand | Type | Location
input | - | -
output file | dat | postProcessing/\<FO\>/\<time\>/\<file\>s
\endtable
where \c \<file\>s:
\verbatim
force.dat | Forces (thrust drag torque)
C_d.dat | Cd values (per bin)
C_l.dat | Cl values (per bin)
C_p.dat | Cp values (per bin)
\endverbatim
Usage
Minimal example by using \c system/controlDict.functions:
\verbatim
<namePrefix>
{
// Mandatory entries
type bladeForces;
libs (forces);
patches (<wordRes>);
// Optional entries
writeFields <bool>;
fieldsInterval <int>;
useNamePrefix <bool>;
// Mandatory entries
origin (0 0 0);
axis (1 0 0);
n 25;
// Conditional optional entries
p <word>;
U <word>;
rho <word>;
rhoInf <scalar>; // enabled if rho=rhoInf
pRef <scalar>;
Uref <scalar>;
// Inherited entries
...
}
\endverbatim
where the entries mean:
\table
Property | Description | Type | Reqd | Deflt
type | Type name: bladeForces | word | yes | -
libs | Library name: forces | word | yes | -
patches | Names of operand patches | wordRes | yes | -
writeFields | Flag to write surface with fields | bool | no | false
fieldsInterval | Frequency of writeInterval for writeFields | int | no | 0
useNamePrefix | Flag to include prefix for field names | bool | no | false
outputName | Name for registered surface and VTP output | word | no | <name>
origin | Origin of cylindrical coordinate system | vector | yes | -
axis | Axis of cylindrical coordinate system | vector | yes | -
n | Rotation speed [rev/sec] | scalar | yes | -
rpm | Rotation speed [rev/min] | scalar | no | -
p | Name of pressure field | word | no | p
U | Name of velocity field | word | no | U
rho | Name of density field | word | no | rho
rhoInf | Value of reference density | scalar | cndtnl | 1
pRef | Value of reference pressure | scalar | cndtnl | 0
Uref | Magnitude of inlet reference axial velocity | scalar | yes | -
radius | The blade outer radius | scalar | no | 1
nRadial | Divisions in radial direction | label | no | 10
lefthand | Using a left-hand blade | bool | false | false
nearCellValue | Patch velocity extrapolated from fluid | bool | no | false
\endtable
Experimental entries (may be removed in the future):
\table
Property | Description | Type | Reqd | Deflt
geometricVelocity | Patch velocity based on position | bool | no | false
mag.thrust | Ignore sign for thrust values | bool | false | false
mag.drag | Ignore sign for drag values | bool | false | false
\endtable
The inherited entries are elaborated in:
- \link functionObject.H \endlink
- \link writeFile.H \endlink
- \link coordinateSystem.H \endlink
Note
- For incompressible cases, set \c rho to \c rhoInf.
You will then be required to provide a \c rhoInf
value corresponding to the constant freestream density.
- \c writeControl and \c writeInterval entries of function
object do control when to output force/coefficients files and fields.
SourceFiles
bladeForces.cxx
\*---------------------------------------------------------------------------*/
#ifndef Foam_functionObjects_bladeForces_H
#define Foam_functionObjects_bladeForces_H
#include "fvMeshFunctionObject.H"
#include "writeFile.H"
#include "cylindricalCS.H"
#include "volFieldsFwd.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace functionObjects
{
/*---------------------------------------------------------------------------*\
Class bladeForces Declaration
\*---------------------------------------------------------------------------*/
class bladeForces
:
public fvMeshFunctionObject,
public writeFile
{
// Private Data
// Results
//- Sum of thrust forces (axial)
scalar sumThrust_;
//- Sum of drag forces (tangential)
scalar sumDrag_;
//- Sum of torque moments (tangential)
scalar sumTorque_;
//- Overall blade area (single side)
scalar totalArea_;
//- Overall drag coefficient (area-averaged of bin coefficients)
scalar totalCd_;
//- Overall lift coefficient (area-averaged of bin coefficients)
scalar totalCl_;
//- Overall pressure coefficient (area-averaged of bin coefficients)
scalar totalCp_;
//- Blade area (single side) per radial band
scalarList bandArea_;
//- Drag coefficient per radial band
scalarList bandCd_;
//- Lift coefficient per radial band
scalarList bandCl_;
//- Pressure coefficient per radial band
scalarList bandCp_;
// Geometric Information
//- Selected operand patches
labelList patchIDs_;
//- Max (or reference) blade radius
scalar refRadius_;
//- Number of divisions in radial direction
label nRadialDiv_;
//- Rotational speed (revolutions per second)
scalar revPerSec_;
//- Cylindrical coordinate system used for force and torque
coordSystem::cylindrical cylCoord_;
// Read from dictionary
//- Reference axial velocity
scalar Uref_;
//- Reference pressure
scalar pRef_;
//- Reference density (for incompressible)
scalar rhoRef_;
//- Name of pressure field (default: "p")
word pName_;
//- Name of velocity field (default: "U")
word UName_;
//- Name of density field (default: "rho")
word rhoName_;
//- Name for registred surface and VTP output.
// Default is the functionObject::name()
word outputName_;
//- Internal counter, incremented when write() is called.
label writeCounter_;
//- Write surface/fields interval.
// A value <= 1 means write surface/fields at each write().
label fieldsInterval_;
//- Flag of initialisation (internal)
bool initialised_;
//- Flag to write force and moment fields
bool writeFields_;
//- Using a left-hand blade (flips orientation of drag value)
bool lefthand_;
//- Extrapolate velocity to patch
bool nearCellValue_;
//- Blade speed based on position [experimental]
bool useGeometricVelocity_;
//- Ignore sign for thrust values [experimental]
bool useMagThrust_;
//- Ignore sign for drag values [experimental]
bool useMagDrag_;
// File streams
//- File stream for forces, torque and summary
autoPtr<OFstream> forceFilePtr_;
//- File stream for areas (in radial bins)
autoPtr<OFstream> areaFilePtr_;
//- File stream for coefficient of drag (in radial bins)
autoPtr<OFstream> CdFilePtr_;
//- File stream for coefficient of lift (in radial bins)
autoPtr<OFstream> ClFilePtr_;
//- File stream for coefficient of pressure (in radial bins)
autoPtr<OFstream> CpFilePtr_;
// Private Member Functions
//- Initialise containers and fields
void initialise();
//- Write surface (VTK format) and fields
void writeSurface() const;
// Evaluation
//- Return the effective stress (viscous + turbulent) for patch
tmp<symmTensorField> devRhoReff
(
const tensorField& gradUp,
const label patchi
) const;
//- Return dynamic viscosity field
tmp<volScalarField> mu() const;
//- Return rho if specified otherwise rhoRef
tmp<volScalarField> rho() const;
//- Return rho if specified otherwise rhoRef for patch
tmp<scalarField> rho(const label patchi) const;
//- Return rhoRef if the pressure field is dynamic (i.e. p/rho),
//- otherwise return 1
scalar rho(const volScalarField& p) const;
// I-O
//- Create the integrated-data files
void createIntegratedDataFiles();
//- Write integrated data to files
void writeIntegratedDataFiles();
public:
//- Runtime type information
TypeName("bladeForces");
// Constructors
//- Construct from Time and dictionary
bladeForces
(
const word& name,
const Time& runTime,
const dictionary& dict,
const bool readFields = true
);
//- Construct from objectRegistry and dictionary
bladeForces
(
const word& name,
const objectRegistry& obr,
const dictionary& dict,
const bool readFields = true
);
//- No copy construct
bladeForces(const bladeForces&) = delete;
//- No copy assignment
void operator=(const bladeForces&) = delete;
//- Destructor
virtual ~bladeForces() = default;
// Member Functions
//- The integrated thrust force (axial)
scalar thrust() const noexcept { return sumThrust_; }
//- The integrated drag force (tangential)
scalar drag() const noexcept { return sumDrag_; }
//- The integrated torque
scalar torque() const noexcept { return sumTorque_; }
//- Calculate forces, torque, coefficients
void calculate();
//- Read the dictionary
virtual bool read(const dictionary& dict);
//- Execute the function object
virtual bool execute();
//- Write to data files/fields and to streams
virtual bool write();
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace functionObjects
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,69 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2506 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
_bladeForces
{
type bladeForces;
libs (bladeForces);
// timeStart 10;
executeControl timeStep;
executeInterval 1;
writeControl timeStep;
writeInterval 1;
writeFields true;
//fieldsInterval 3;
// All blades
patches ("propeller.*");
// Single blade
patches ("propeller.*blade0");
// Base name for VTP output and surface storage
// outputName blade;
rho rhoInf; // Indicates incompressible
log true;
rhoInf 1; // Redundant for compressible
origin (0 0 0); // Rotation around centre line
axis (1 0 0);
radius 0.5;
nRadial 10;
n 100; // rotation speed [rev/sec]
Uref 10; // axial speed [m/s]
pRef 0;
nearCellValue true; // output: use cell velocity near surfaces
// geometricVelocity true; // output: experimental
}
blade0
{
${../_bladeForces};
// Single blade
patches ("propeller.*blade0");
// Base name for VTP output and surface storage
// outputName blade;
}
// Cleanup
#remove _bladeForces
// ************************************************************************* //

View File

@ -0,0 +1,58 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2506 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volVectorField;
object U;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 1 -1 0 0 0 0];
internalField uniform (0 0 0);
boundaryField
{
#includeEtc "caseDicts/setConstraintTypes"
inlet
{
type fixedValue;
value uniform (-5 0 0);
}
outlet
{
type inletOutlet;
inletValue uniform (0 0 0);
value uniform (0 0 0);
}
outerCylinder
{
type noSlip;
}
wall
{
type fixedValue;
value uniform (0 0 0);
}
"propeller.*"
{
type movingWallVelocity;
type fixedValue;
value uniform (0 0 0);
}
}
// ************************************************************************* //

View File

@ -0,0 +1,46 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2506 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object epsilon;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -3 0 0 0 0];
internalField uniform 0.0495;
boundaryField
{
#includeEtc "caseDicts/setConstraintTypes"
inlet
{
type fixedValue;
value $internalField;
}
outlet
{
type inletOutlet;
inletValue $internalField;
value $internalField;
}
wall
{
type epsilonWallFunction;
value $internalField;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,46 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2506 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object k;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -2 0 0 0 0];
internalField uniform 0.06;
boundaryField
{
#includeEtc "caseDicts/setConstraintTypes"
inlet
{
type fixedValue;
value $internalField;
}
outlet
{
type inletOutlet;
inletValue $internalField;
value $internalField;
}
wall
{
type kqRWallFunction;
value $internalField;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,45 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2506 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object nut;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -1 0 0 0 0];
internalField uniform 0;
boundaryField
{
#includeEtc "caseDicts/setConstraintTypes"
inlet
{
type calculated;
value uniform 0;
}
outlet
{
type calculated;
value uniform 0;
}
wall
{
type nutkWallFunction;
value uniform 0;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,43 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2506 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object p;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 2 -2 0 0 0 0];
internalField uniform 0;
boundaryField
{
#includeEtc "caseDicts/setConstraintTypes"
inlet
{
type zeroGradient;
}
outlet
{
type fixedValue;
value uniform 0;
}
wall
{
type zeroGradient;
}
}
// ************************************************************************* //

View File

@ -0,0 +1,12 @@
#!/bin/sh
cd "${0%/*}" || exit # Run from this directory
. ${WM_PROJECT_DIR:?}/bin/tools/CleanFunctions # Tutorial clean functions
#------------------------------------------------------------------------------
cleanCase0
# Remove surfaces and features
rm -rf constant/triSurface
rm -rf constant/extendedFeatureEdgeMesh
#------------------------------------------------------------------------------

View File

@ -0,0 +1,22 @@
#!/bin/sh
cd "${0%/*}" || exit # Run from this directory
. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions
#------------------------------------------------------------------------------
if notTest "$@"
then
./Allrun.pre
# Already decomposed:
restore0Dir -processor
# Already decomposed:
## runApplication decomposePar
runParallel $(getApplication)
runApplication reconstructPar
fi
#------------------------------------------------------------------------------

View File

@ -0,0 +1,13 @@
#!/bin/sh
cd "${0%/*}" || exit # Run from this directory
. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions
#------------------------------------------------------------------------------
if notTest "$@"
then
runParallel -o -s postpro $(getApplication) -postProcess -latestTime
fi
#------------------------------------------------------------------------------

View File

@ -0,0 +1,28 @@
#!/bin/sh
cd "${0%/*}" || exit # Run from this directory
. ${WM_PROJECT_DIR:?}/bin/tools/RunFunctions # Tutorial run functions
#------------------------------------------------------------------------------
# Copy propeller surface from resources directory
cp -rf \
"$FOAM_TUTORIALS"/resources/geometry/propeller1 \
constant/triSurface
runApplication surfaceBooleanFeatures intersection propeller.obj hub.obj
runApplication blockMesh
runApplication surfaceFeatureExtract
runApplication decomposePar
runParallel snappyHexMesh -overwrite
runParallel checkMesh
runParallel renumberMesh -overwrite
# Force removal of fields generated by snappy
rm -rf 0
#------------------------------------------------------------------------------

View File

@ -0,0 +1,34 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2506 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object dynamicMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// dynamicFvMesh dynamicMotionSolverFvMesh;
dynamicFvMesh staticFvMesh;
motionSolverLibs (fvMotionSolvers);
motionSolver solidBody;
cellZone innerCylinderSmall;
solidBodyMotionFunction rotatingMotion;
origin (0 0 0);
axis (1 0 0);
omega -158; // rad/s (negative since it is a left-hand propeller)
// ************************************************************************* //

View File

@ -0,0 +1,22 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2506 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object transportProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
transportModel Newtonian;
nu 1e-6;
// ************************************************************************* //

View File

@ -0,0 +1,29 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2506 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object turbulenceProperties;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
simulationType RAS;
RAS
{
RASModel kEpsilon;
turbulence on;
printCoeffs on;
}
// ************************************************************************* //

View File

@ -0,0 +1,88 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2506 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
// Common settings
_bladeForces
{
type bladeForces;
libs (forces);
writeControl timeStep;
writeInterval 1;
writeFields true;
fieldsInteval 1;
// All blades
patches ("propeller.*");
// Base name for output
outputName blades;
lefthand true; // left-hand blade
rho rhoInf; // Indicates incompressible
log true;
rhoInf 1; // Redundant for compressible
origin (0 0 0); // Rotation around centre line
axis (1 0 0);
radius 0.5; // Reference radius size
nRadial 10; // Number of radial bins
n 25; // rotation speed [rev/sec]
Uref 5; // axial speed [m/s]
pRef 0;
nearCellValue true; // extrapolate cell value
// geometricVelocity true;
}
blade0
{
${../_bladeForces};
// Single blade
patches ("propeller.*blade0");
outputName blade0;
}
blade1
{
${../_bladeForces};
// Single blade
patches ("propeller.*blade1");
outputName blade1;
}
blade2
{
${../blade0};
// Single blade
patches ("propeller.*blade2");
outputName blade2;
}
blade3
{
${../blade0};
// Single blade
patches ("propeller.*blade3");
outputName blade3;
}
// Cleanup
#remove _bladeForces
// ************************************************************************* //

View File

@ -0,0 +1,87 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2506 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object blockMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
scale 1;
x_min -1;
x_max 2;
y_min -1;
y_max 1;
z_min -1;
z_max 1;
xdim 0.05;
ydim 0.05;
zdim 0.05;
nx #eval #{ round(($x_max - $x_min) / $xdim) #};
ny #eval #{ round(($y_max - $y_min) / $ydim) #};
nz #eval #{ round(($z_max - $z_min) / $zdim) #};
vertices
(
($x_min $y_min $z_min) // 0
($x_max $y_min $z_min) // 1
($x_max $y_max $z_min) // 2
($x_min $y_max $z_min) // 3
($x_min $y_min $z_max) // 4
($x_max $y_min $z_max) // 5
($x_max $y_max $z_max) // 6
($x_min $y_max $z_max) // 7
);
blocks
(
hex (0 1 2 3 4 5 6 7) ($nx $ny $nz) grading (1 1 1)
);
edges
(
);
boundary
(
walls
{
type wall;
faces
(
(0 2) // y-min
(0 3) // y-max
(0 4) // z-min
(0 5) // z-max
);
}
inlet
{
type patch;
faces
(
(0 1) // x-max
);
}
outlet
{
type patch;
faces
(
(0 0) // x-min
);
}
);
// ************************************************************************* //

View File

@ -0,0 +1,61 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2312 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
application pimpleFoam;
startFrom startTime;
startTime 0;
stopAt endTime;
endTime 0.1;
deltaT 1e-5;
writeControl adjustable;
writeInterval 0.001;
purgeWrite 0;
writeFormat binary;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable true;
adjustTimeStep yes;
maxCo 2;
startFrom latestTime;
functions
{
// #includeFunc Q
#include "bladeForces"
}
// ************************************************************************* //

View File

@ -0,0 +1,27 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2312 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object decomposeParDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
numberOfSubdomains 32;
method hierarchical;
coeffs
{
n (4 4 2);
}
// ************************************************************************* //

View File

@ -0,0 +1,58 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2312 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object fvSchemes;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
ddtSchemes
{
default Euler;
}
gradSchemes
{
default Gauss linear;
grad(p) Gauss linear;
grad(U) cellLimited Gauss linear 1;
}
divSchemes
{
default none;
div(phi,U) Gauss linearUpwind grad(U);
turbulence Gauss upwind;
div(phi,k) $turbulence;
div(phi,epsilon) $turbulence;
div((nuEff*dev2(T(grad(U))))) Gauss linear;
}
laplacianSchemes
{
default Gauss linear limited corrected 0.33;
}
interpolationSchemes
{
default linear;
}
snGradSchemes
{
default limited corrected 0.33;
}
// ************************************************************************* //

View File

@ -0,0 +1,79 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2312 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object fvSolution;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
solvers
{
"pcorr.*"
{
solver GAMG;
tolerance 1e-2;
relTol 0;
smoother DICGaussSeidel;
cacheAgglomeration no;
maxIter 50;
}
p
{
$pcorr;
tolerance 1e-5;
relTol 0.01;
}
pFinal
{
$p;
tolerance 1e-6;
relTol 0;
}
"(U|k|epsilon)"
{
solver smoothSolver;
smoother symGaussSeidel;
tolerance 1e-6;
relTol 0.1;
}
"(U|k|epsilon)Final"
{
solver smoothSolver;
smoother symGaussSeidel;
tolerance 1e-6;
relTol 0;
}
}
PIMPLE
{
correctPhi no;
nOuterCorrectors 2;
nCorrectors 1;
nNonOrthogonalCorrectors 0;
}
relaxationFactors
{
"(U|k|epsilon).*" 1;
}
cache
{
grad(U);
}
// ************************************************************************* //

View File

@ -0,0 +1,466 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2506 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object snappyHexMeshDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Which of the steps to run
castellatedMesh true;
snap true;
addLayers false;
// Geometry. Definition of all surfaces. All surfaces are of class
// searchableSurface.
// Surfaces are used
// - to specify refinement for any mesh cell intersecting it
// - to specify refinement for any mesh cell inside/outside/near
// - to 'snap' the mesh boundary to the surface
geometry
{
hub.obj
{
type triSurfaceMesh;
name hub;
regions
{
stdHub_1p5 { name stdHub_1p5; }
}
}
transmission.obj
{
type triSurfaceMesh;
name transmission;
regions
{
STI_YEH_Index-0 { name STI_YEH_Index-0; }
}
}
propeller.obj
{
type triSurfaceMesh;
name propeller;
regions
{
propeller_SS_blade3 { name propeller_SS_blade3; }
propeller_SS_LE_blade3 { name propeller_SS_LE_blade3; }
propeller_SS_TE_blade3 { name propeller_SS_TE_blade3; }
propeller_PS_blade3 { name propeller_PS_blade3; }
propeller_PS_LE_blade3 { name propeller_PS_LE_blade3; }
propeller_PS_TE_blade3 { name propeller_PS_TE_blade3; }
propeller_tip_blade3 { name propeller_tip_blade3; }
propeller_tip_LE_blade3 { name propeller_tip_LE_blade3; }
propeller_tip_TE_blade3 { name propeller_tip_TE_blade3; }
propeller_root_blade3 { name propeller_root_blade3; }
propeller_root_LE_blade3 { name propeller_root_LE_blade3; }
propeller_root_TE_blade3 { name propeller_root_TE_blade3; }
propeller_SS_blade2 { name propeller_SS_blade2; }
propeller_SS_LE_blade2 { name propeller_SS_LE_blade2; }
propeller_SS_TE_blade2 { name propeller_SS_TE_blade2; }
propeller_PS_blade2 { name propeller_PS_blade2; }
propeller_PS_LE_blade2 { name propeller_PS_LE_blade2; }
propeller_PS_TE_blade2 { name propeller_PS_TE_blade2; }
propeller_tip_blade2 { name propeller_tip_blade2; }
propeller_tip_LE_blade2 { name propeller_tip_LE_blade2; }
propeller_tip_TE_blade2 { name propeller_tip_TE_blade2; }
propeller_root_blade2 { name propeller_root_blade2; }
propeller_root_LE_blade2 { name propeller_root_LE_blade2; }
propeller_root_TE_blade2 { name propeller_root_TE_blade2; }
propeller_SS_blade1 { name propeller_SS_blade1; }
propeller_SS_LE_blade1 { name propeller_SS_LE_blade1; }
propeller_SS_TE_blade1 { name propeller_SS_TE_blade1; }
propeller_PS_blade1 { name propeller_PS_blade1; }
propeller_PS_LE_blade1 { name propeller_PS_LE_blade1; }
propeller_PS_TE_blade1 { name propeller_PS_TE_blade1; }
propeller_tip_blade1 { name propeller_tip_blade1; }
propeller_tip_LE_blade1 { name propeller_tip_LE_blade1; }
propeller_tip_TE_blade1 { name propeller_tip_TE_blade1; }
propeller_root_blade1 { name propeller_root_blade1; }
propeller_root_LE_blade1 { name propeller_root_LE_blade1; }
propeller_root_TE_blade1 { name propeller_root_TE_blade1; }
propeller_SS_blade0 { name propeller_SS_blade0; }
propeller_SS_LE_blade0 { name propeller_SS_LE_blade0; }
propeller_SS_TE_blade0 { name propeller_SS_TE_blade0; }
propeller_PS_blade0 { name propeller_PS_blade0; }
propeller_PS_LE_blade0 { name propeller_PS_LE_blade0; }
propeller_PS_TE_blade0 { name propeller_PS_TE_blade0; }
propeller_tip_blade0 { name propeller_tip_blade0; }
propeller_tip_LE_blade0 { name propeller_tip_LE_blade0; }
propeller_tip_TE_blade0 { name propeller_tip_TE_blade0; }
propeller_root_blade0 { name propeller_root_blade0; }
propeller_root_LE_blade0 { name propeller_root_LE_blade0; }
propeller_root_TE_blade0 { name propeller_root_TE_blade0; }
}
}
}
// Settings for the castellatedMesh generation.
castellatedMeshControls
{
// Refinement parameters
// ~~~~~~~~~~~~~~~~~~~~~
// If local number of cells is >= maxLocalCells on any processor
// switches from from refinement followed by balancing
// (current method) to (weighted) balancing before refinement.
maxLocalCells 10000000;
// Overall cell limit (approximately). Refinement will stop immediately
// upon reaching this number so a refinement level might not complete.
// Note that this is the number of cells before removing the part which
// is not 'visible' from the keepPoint. The final number of cells might
// actually be a lot less.
maxGlobalCells 200000000;
// The surface refinement loop might spend lots of iterations refining just a
// few cells. This setting will cause refinement to stop if <= minimumRefine
// are selected for refinement. Note: it will at least do one iteration
// (unless the number of cells to refine is 0)
minRefinementCells 0;
// Allow a certain level of imbalance during refining
// (since balancing is quite expensive)
// Expressed as fraction of perfect balance (= overall number of cells /
// nProcs). 0=balance always.
maxLoadUnbalance 0.10;
// Number of buffer layers between different levels.
// 1 means normal 2:1 refinement restriction, larger means slower
// refinement.
nCellsBetweenLevels 3;
// Explicit feature edge refinement
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Specifies a level for any cell intersected by its edges.
// This is a featureEdgeMesh, read from constant/triSurface for now.
features
(
// {
// file "innerCylinderSmall.eMesh";
// level 4;
// }
// {
// file "outerCylinder.eMesh";
// level 0;
// }
{
file "hub.eMesh";
level 0;
}
{
file "transmission.eMesh";
level 0;
}
{
file "propeller.eMesh";
level 0;
}
{
file "propeller_hub_intersection.eMesh";
level 0;
}
);
// Surface based refinement
// ~~~~~~~~~~~~~~~~~~~~~~~~
// Specifies two levels for every surface. The first is the minimum level,
// every cell intersecting a surface gets refined up to the minimum level.
// The second level is the maximum level. Cells that 'see' multiple
// intersections where the intersections make an
// angle > resolveFeatureAngle get refined up to the maximum level.
refinementSurfaces
{
// innerCylinderSmall
// {
// level (4 4);
//
// faceType boundary;
// cellZone innerCylinderSmall;
// faceZone innerCylinderSmall;
// cellZoneInside inside;
// }
// outerCylinder
// {
// level (0 0);
// }
hub
{
level (4 4);
}
transmission
{
level (4 4);
}
propeller
{
level (4 4);
// regions
// {
// ".*_LE_.*" { level (6 7); }
// ".*_TE_.*" { level (6 7); }
// }
}
}
// Resolve sharp angles
resolveFeatureAngle 30;
// Region-wise refinement
// ~~~~~~~~~~~~~~~~~~~~~~
// Specifies refinement level for cells in relation to a surface. One of
// three modes
// - distance. 'levels' specifies per distance to the surface the
// wanted refinement level. The distances need to be specified in
// descending order.
// - inside. 'levels' is only one entry and only the level is used. All
// cells inside the surface get refined up to the level. The surface
// needs to be closed for this to be possible.
// - outside. Same but cells outside.
refinementRegions
{
// innerCylinder
// {
// mode inside;
// levels ((1E15 3));
// }
// innerCylinderSmall
// {
// mode inside;
// levels ((1E15 4));
// }
}
// Mesh selection
// ~~~~~~~~~~~~~~
// After refinement patches get added for all refinementSurfaces and
// all cells intersecting the surfaces get put into these patches. The
// section reachable from the locationInMesh is kept.
// NOTE: This point should never be on a face, always inside a cell, even
// after refinement.
locationInMesh (0.01 -0.5 0.01);
// Whether any faceZones (as specified in the refinementSurfaces)
// are only on the boundary of corresponding cellZones or also allow
// free-standing zone faces. Not used if there are no faceZones.
allowFreeStandingZoneFaces false;
}
// Settings for the snapping.
snapControls
{
//- Number of patch smoothing iterations before finding correspondence
// to surface
nSmoothPatch 3;
//- Relative distance for points to be attracted by surface feature point
// or edge. True distance is this factor times local
// maximum edge length.
tolerance 1.0;
//- Number of mesh displacement relaxation iterations.
nSolveIter 300;
//- Maximum number of snapping relaxation iterations. Should stop
// before upon reaching a correct mesh.
nRelaxIter 5;
// Feature snapping
// Number of feature edge snapping iterations.
// Leave out altogether to disable.
nFeatureSnapIter 10;
// Detect (geometric only) features by sampling the surface
// (default=false).
implicitFeatureSnap true;
// Use castellatedMeshControls::features (default = true)
explicitFeatureSnap false;
// Detect features between multiple surfaces
// (only for explicitFeatureSnap, default = false)
multiRegionFeatureSnap true;
}
// Settings for the layer addition.
addLayersControls
{
// Are the thickness parameters below relative to the undistorted
// size of the refined cell outside layer (true) or absolute sizes (false).
relativeSizes true;
// Per final patch (so not geometry!) the layer information
layers
{
}
// Expansion factor for layer mesh
expansionRatio 1.0;
// Wanted thickness of final added cell layer. If multiple layers
// is the thickness of the layer furthest away from the wall.
// Relative to undistorted size of cell outside layer.
// See relativeSizes parameter.
finalLayerThickness 0.3;
// Minimum thickness of cell layer. If for any reason layer
// cannot be above minThickness do not add layer.
// Relative to undistorted size of cell outside layer.
minThickness 0.1;
// If points get not extruded do nGrow layers of connected faces that are
// also not grown. This helps convergence of the layer addition process
// close to features.
// Note: changed(corrected) w.r.t 1.7.x! (didn't do anything in 1.7.x)
nGrow 0;
// Advanced settings
// When not to extrude surface. 0 is flat surface, 90 is when two faces
// are perpendicular
featureAngle 30;
// Maximum number of snapping relaxation iterations. Should stop
// before upon reaching a correct mesh.
nRelaxIter 3;
// Number of smoothing iterations of surface normals
nSmoothSurfaceNormals 1;
// Number of smoothing iterations of interior mesh movement direction
nSmoothNormals 3;
// Smooth layer thickness over surface patches
nSmoothThickness 10;
// Stop layer growth on highly warped cells
maxFaceThicknessRatio 0.5;
// Reduce layer growth where ratio thickness to medial
// distance is large
maxThicknessToMedialRatio 0.3;
// Angle used to pick up medial axis points
// Note: changed(corrected) w.r.t 1.7.x! 90 degrees corresponds to 130
// in 1.7.x.
minMedialAxisAngle 90;
// Create buffer region for new layer terminations
nBufferCellsNoExtrude 0;
// Overall max number of layer addition iterations. The mesher will exit
// if it reaches this number of iterations; possibly with an illegal
// mesh.
nLayerIter 50;
}
// Generic mesh quality settings. At any undoable phase these determine
// where to undo.
meshQualityControls
{
//- Maximum non-orthogonality allowed. Set to 180 to disable.
maxNonOrtho 65;
//- Max skewness allowed. Set to <0 to disable.
maxBoundarySkewness 20;
maxInternalSkewness 4;
//- Max concaveness allowed. Is angle (in degrees) below which concavity
// is allowed. 0 is straight face, <0 would be convex face.
// Set to 180 to disable.
maxConcave 80;
//- Minimum pyramid volume. Is absolute volume of cell pyramid.
// Set to a sensible fraction of the smallest cell volume expected.
// Set to very negative number (e.g. -1E30) to disable.
minVol 1e-13;
//- Minimum quality of the tet formed by the face-centre
// and variable base point minimum decomposition triangles and
// the cell centre. This has to be a positive number for tracking
// to work. Set to very negative number (e.g. -1E30) to
// disable.
// <0 = inside out tet,
// 0 = flat tet
// 1 = regular tet
minTetQuality -1; // 1e-30;
//- Minimum face area. Set to <0 to disable.
minArea -1;
//- Minimum face twist. Set to <-1 to disable. dot product of face normal
// and face centre triangles normal
minTwist 0.01;
//- Minimum normalised cell determinant
// 1 = hex, <= 0 = folded or flattened illegal cell
minDeterminant 0.001;
//- minFaceWeight (0 -> 0.5)
minFaceWeight 0.05;
//- minVolRatio (0 -> 1)
minVolRatio 0.01;
//must be >0 for Fluent compatibility
minTriangleTwist -1;
// Advanced
//- Number of error distribution iterations
nSmoothScale 4;
//- Amount to scale back displacement at error points
errorReduction 0.75;
// Optional : some meshing phases allow usage of relaxed rules.
// See e.g. addLayersControls::nRelaxedIter.
relaxed
{
//- Maximum non-orthogonality allowed. Set to 180 to disable.
maxNonOrtho 75;
}
}
// Merge tolerance. Is fraction of overall bounding box of initial mesh.
// Note: the write tolerance needs to be higher than this.
mergeTolerance 1e-6;
// ************************************************************************* //

View File

@ -0,0 +1,53 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2506 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object surfaceFeatureExtractDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
//innerCylinder.obj
//{
// #include "surfaceFeatureExtractDict.defaults"
//}
//innerCylinderSmall.obj
//{
// #include "surfaceFeatureExtractDict.defaults"
//}
//outerCylinder.obj
//{
// #include "surfaceFeatureExtractDict.defaults"
//}
hub.obj
{
#include "surfaceFeatureExtractDict.defaults"
}
transmission.obj
{
#include "surfaceFeatureExtractDict.defaults"
}
propeller.obj
{
#include "surfaceFeatureExtractDict.defaults"
}
// ************************************************************************* //

View File

@ -0,0 +1,15 @@
// How to obtain raw features (extractFromFile || extractFromSurface)
extractionMethod extractFromSurface;
// Mark edges whose adjacent surface normals are at an angle less
// than includedAngle as features
// - 0 : selects no edges
// - 180: selects all edges
includedAngle 150;
trimFeatures
{
// Remove features with fewer than the specified number of edges
minElem 10;
}

Binary file not shown.