Merge branch 'develop' of develop.openfoam.com:Development/OpenFOAM-plus into develop

This commit is contained in:
sergio
2019-06-13 12:13:04 -07:00
committed by Andrew Heather
27 changed files with 551 additions and 553 deletions

View File

@ -1,121 +0,0 @@
OpenFOAM-1712
==================
Known Build Issues
==================
---------------------
Intel MPI (Gcc/Clang)
---------------------
Either I_MPI_ROOT or MPI_ROOT can be used to specify the Intel-MPI
installation directory path.
The ThirdParty build of ptscotch uses `mpiicc` for Intel-MPI
instead of the usual `mpicc`.
When gcc or clang are used, it is highly likely that the
I_MPI_CC environment variable also needs to be set accordingly.
See `mpiicc -help` for more information about environment variables.
--------------
Intel Compiler
--------------
Since OpenFOAM uses C++11, a fairly recent version is required.
The Intel compiler - icc (ICC) 17.0.1 20161005 is ok, but the
initial release - icc (ICC) 17.0.0 20160721 - has a bug that
will result in these types of error messages.
MatrixSpaceI.H(492): error: no instance of overloaded function
"Foam::MatrixSpace<Form, Cmpt, Mrows, Ncols>::Block<SubTensor,
BRowStart, BColStart>::operator=" matches the specified type
---
VTK
---
If using the runTimePostProcessing to create on-the-fly images, you
can simply just compile ParaView and these libraries will be used.
If you elect to use a separate VTK compilation (for example for
off-screen rendering), it is advisable to reuse the VTK libraries that
are provided with ParaView by making an appropriate symlink
prior to using makeVTK. This doesn't just reduce disk-space, but works
much better than using the VTK tar file.
Using runTimePostProcessing with the 'plain' VTK libraries does
generally work, but does not exit cleanly:
symbol lookup error: .../linux64Gcc/VTK-7.1.0/lib/libvtkCommonExecutionModel-7.1.so.1:
undefined symbol: _ZN33vtkFilteringInformationKeyManager13ClassFinalizeEv
symbol lookup error: .../linux64Gcc/VTK-7.1.0/lib/libvtkCommonDataModel-7.1.so.1:
undefined symbol: _ZN49vtkInformationQuadratureSchemeDefinitionVectorKeyD1Ev
This error appears to be suppressed if VTK is compiled with a Debug build-type.
-------------------------
Building on older systems
-------------------------
If the system gcc is too old for building OpenFOAM, a third-party gcc or
clang/llvm installation can be used. If building clang/llvm, note that
there are also minimum gcc/g++ requirements there:
Min gcc/g++
=========== ==========
4.4 llvm-3.4.2
4.7 llvm-3.5.2 - llvm-3.7.0
If your system compiler is too old to build the minimum required gcc or
clang/llvm, it is just simply too old.
---------------------------------
ThirdParty clang without gmp/mpfr
---------------------------------
If using ThirdParty clang without gmp/mpfr, the ThirdParty makeCGAL
script will need to be run manually and specify that there is no
gmp/mpfr. Eg,
cd $WM_THIRD_PARTY_DIR
./makeCGAL gmp-none mpfr-none
Subequent compilation with Allwmake will now run largely without any
problems, except that the components linking against CGAL
(foamyMesh and surfaceBooleanFeatures) will also try to link against
a nonexistent mpfr library. As a workaround, the link-dependency can
be removed in wmake/rules/General/CGAL :
CGAL_LIBS = \
-L$(BOOST_ARCH_PATH)/lib \
-L$(BOOST_ARCH_PATH)/lib$(WM_COMPILER_LIB_ARCH) \
-L$(CGAL_ARCH_PATH)/lib \
-L$(CGAL_ARCH_PATH)/lib$(WM_COMPILER_LIB_ARCH) \
-lCGAL
This is a temporary inconvenience until a more robust solution is found.
-------------------------
Building with spack
-------------------------
If you are building with spack, note that the depends_on for paraview
resolves poorly. The +qt dependency (for building the reader module)
may need to be specified as a preference by including the following in
your `~/.spack/packages.yaml` file:
packages:
paraview:
variants: +qt
It appears that spack will otherwise ignore any paraview+qt version
and attempt to install a paraview~qt version instead.
--

View File

@ -1,2 +1,2 @@
api=1904
api=1906
patch=0

View File

@ -33,9 +33,9 @@ Please see the relevant guides:
[repo openfoam]: https://develop.openfoam.com/Development/OpenFOAM-plus/
[repo third]: https://develop.openfoam.com/Development/ThirdParty-plus/
[link openfoam-issues]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/BuildIssues.txt
[link openfoam-readme]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/README.md
[link openfoam-config]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/etc/README.md
[link openfoam-issues]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/doc/BuildIssues.md
[link openfoam-config]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/doc/Config.md
[link openfoam-build]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/doc/Build.md
[link openfoam-require]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/doc/Requirements.md
[link third-readme]: https://develop.openfoam.com/Development/ThirdParty-plus/blob/develop/README.md

View File

@ -16,7 +16,7 @@
);
vsm.mapToVolume(Cs, Cvf.boundaryFieldRef());
Cvf.write();
//Cvf.write();
volVectorField U
(
@ -33,4 +33,4 @@
);
vsm.mapToVolume(Us, U.boundaryFieldRef());
U.write();
//U.write();

View File

@ -30,6 +30,7 @@ License
#include "LLTMatrix.H"
#include "Random.H"
#include "SortList.H"
#include "Switch.H"
#include <algorithm>
using namespace Foam;
@ -237,22 +238,14 @@ int main(int argc, char *argv[])
Info<< "# SquareMatrix<scalar> example:" << nl;
printMatrix(Info, S) << nl;
const label mRows = S.m();
const label nCols = S.n();
const label size = S.size();
const labelPair sizes = S.sizes();
const bool isEmpty = S.empty();
const long constPointer = long(S.cdata());
long pointer = long(S.data());
Info
<< "Number of rows =" << tab << mRows << nl
<< "Number of columns = " << tab << nCols << nl
<< "Number of elements = " << tab << size << nl
<< "Number of rows/columns = " << tab << sizes << nl
<< "Matrix is empty = " << tab << isEmpty << nl
<< "Constant pointer = " << tab << constPointer << nl
<< "Pointer = " << tab << pointer << nl
<< "Number of rows =" << tab << S.m() << nl
<< "Number of columns = " << tab << S.n() << nl
<< "Number of elements = " << tab << S.size() << nl
<< "Number of rows/columns = " << tab << S.sizes() << nl
<< "Matrix is empty = " << tab << Switch(S.empty()) << nl
<< "Constant pointer = " << tab << uintptr_t(S.cdata()) << nl
<< "Pointer = " << tab << uintptr_t(S.data()) << nl
<< nl;
horizontalLine();

View File

@ -15,7 +15,8 @@ The [third-party][repo third] directory includes a
[build guide][link third-build].
Some known build issues related to specific compiler and VTK library versions
can be found in the [$WM_PROJECT_DIR/BuildIssues.txt][link openfoam-issues] file.
can be found in the [$WM_PROJECT_DIR/doc/BuildIssues.md][link openfoam-issues]
file.
If you need to change the default versions for third-party libraries,
or use system libraries for some components, please some additional
@ -94,10 +95,10 @@ simpleFoam
OpenFOAM ships with ParaView sources for post-processing OpenFOAM
field results. However, the paraview version distributed with
the operating system or a [binary package][download ParaView]
will be sufficient, and avoids additional compilation complexity.
will often be sufficient, and avoids additional compilation complexity.
If do you wish to compile ParaView from sources, it is recommended
that you do so *after* completing an initial compilation of OpenFOAM.
If you do wish to compile ParaView from source, it is recommended
that you do so ***after*** completing an initial compilation of OpenFOAM.
This gets the process started much more quickly. At a later stage,
OpenFOAM can be updated to compile with paraview. Only the affected
applications will be compiled (eg, the blockMesh reader module) and the
@ -123,8 +124,9 @@ More details in the [ThirdParty build guide][link third-build].
[repo openfoam]: https://develop.openfoam.com/Development/OpenFOAM-plus/
[repo third]: https://develop.openfoam.com/Development/ThirdParty-plus/
[link openfoam-issues]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/BuildIssues.txt
[link openfoam-config]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/etc/README.md
[link openfoam-readme]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/README.md
[link openfoam-issues]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/doc/BuildIssues.md
[link openfoam-config]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/doc/Config.md
[link openfoam-build]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/doc/Build.md
[link openfoam-require]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/doc/Requirements.md
[link third-readme]: https://develop.openfoam.com/Development/ThirdParty-plus/blob/develop/README.md

111
doc/BuildIssues.md Normal file
View File

@ -0,0 +1,111 @@
## Known Build Issues (OpenFOAM-v1906)
### Intel MPI with Gcc/Clang)
Either `I_MPI_ROOT` (preferred) or `MPI_ROOT` can be used to specify
the Intel-MPI installation directory path.
The ThirdParty build of ptscotch uses `mpiicc` for Intel-MPI instead
of the usual `mpicc`. When gcc or clang are used, it is quite likely
that the `I_MPI_CC` environment variable also needs to be set
accordingly.
See `mpiicc -help` for more information about environment variables.
### VTK
If using the runTimePostProcessing to create on-the-fly images, you
can simply just compile ParaView and these libraries will be used.
If you elect to use a separate VTK compilation (for example for
off-screen rendering), it is advisable to reuse the VTK libraries that
are provided with ParaView by making an appropriate symlink
prior to using makeVTK. This doesn't just reduce disk-space, but works
much better than using the VTK tar file.
Using runTimePostProcessing with the *plain* VTK libraries does
generally work, but may not exit cleanly:
```
symbol lookup error: .../linux64Gcc/VTK-7.1.0/lib/libvtkCommonExecutionModel-7.1.so.1:
undefined symbol: _ZN33vtkFilteringInformationKeyManager13ClassFinalizeEv
symbol lookup error: .../linux64Gcc/VTK-7.1.0/lib/libvtkCommonDataModel-7.1.so.1:
undefined symbol: _ZN49vtkInformationQuadratureSchemeDefinitionVectorKeyD1Ev
```
This error appears to be suppressed if VTK is compiled with a `Debug` build-type.
### Building on older systems
If the system gcc is too old for building OpenFOAM, a third-party gcc or
clang/llvm installation can be used. If building clang/llvm, note that
there are also minimum gcc/g++ requirements as listed in the
detailed [build guide][link third-build].
If your system compiler is too old to build the minimum required gcc or
clang/llvm, it is just simply too old.
### ThirdParty clang without gmp/mpfr
If using ThirdParty clang without gmp/mpfr, the ThirdParty makeCGAL
script will need to be run manually and specify that there is no
gmp/mpfr. Eg,
```
cd $WM_THIRD_PARTY_DIR
./makeCGAL gmp-none mpfr-none
```
Subequent compilation with Allwmake will now run largely without any
problems, except that the components linking against CGAL
(foamyMesh and surfaceBooleanFeatures) will also try to link against
a nonexistent mpfr library. As a workaround, the link-dependency can
be removed in wmake/rules/General/CGAL :
```
CGAL_LIBS = \
-L$(BOOST_ARCH_PATH)/lib \
-L$(BOOST_ARCH_PATH)/lib$(WM_COMPILER_LIB_ARCH) \
-L$(CGAL_ARCH_PATH)/lib \
-L$(CGAL_ARCH_PATH)/lib$(WM_COMPILER_LIB_ARCH) \
-lCGAL
```
A robuster solution is still being sought.
### Building with spack
If you are building with spack, note that the `depends_on` for paraview
resolves poorly. The `+qt` dependency (for building the reader module)
may need to be specified as a preference by including the following in
your `~/.spack/packages.yaml` file:
```
packages:
paraview:
variants: +qt
```
It appears that spack will otherwise ignore any `paraview+qt` version
and attempt to install a `paraview~qt` version instead.
--
<!-- Links -->
[page ParaView]: http://www.paraview.org/
[download ParaView]: https://www.paraview.org/download/
<!-- OpenFOAM -->
[repo openfoam]: https://develop.openfoam.com/Development/OpenFOAM-plus/
[repo third]: https://develop.openfoam.com/Development/ThirdParty-plus/
[link openfoam-readme]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/README.md
[link openfoam-issues]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/doc/BuildIssues.md
[link openfoam-config]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/doc/Config.md
[link openfoam-build]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/doc/Build.md
[link openfoam-require]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/doc/Requirements.md
[link third-readme]: https://develop.openfoam.com/Development/ThirdParty-plus/blob/develop/README.md
[link third-build]: https://develop.openfoam.com/Development/ThirdParty-plus/blob/develop/BUILD.md
[link third-require]: https://develop.openfoam.com/Development/ThirdParty-plus/blob/develop/Requirements.md
---
Copyright 2019 OpenCFD Ltd

View File

@ -10,15 +10,21 @@ OpenFOAM requires a functioning C++11 compiler and `make` build toolchain.
- fftw: 3.3.7 (recommended - required for FFT-related functionality)
- paraview: 5.5.2 (for visualization)
If using the Intel&reg; compiler, `17.0.1 20161005` is the minimum
usable version.
To check the installed versions
| Program | To check the version |
|---------------|-----------------------|
| gcc | gcc --version |
| icc | icc --version |
| cmake | cmake --version |
| openmpi | orterun --version |
### Additional utilities
- flex
@ -81,7 +87,6 @@ sudo zypper install cmake boost-devel mpfr-devel gmp-devel openmpi-devel gnuplot
This installs
| Program | openSUSE | Program version |
|-----------|-----------|-----------------|
| gcc | 15.0 | 7.4.3 |
@ -157,7 +162,7 @@ A partial list is given in the [ThirdParty requirements][link third-require].
<!-- OpenFOAM -->
[link openfoam-readme]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/README.md
[link openfoam-config]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/etc/README.md
[link openfoam-config]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/doc/Config.md
[link openfoam-build]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/doc/Build.md
[link openfoam-require]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/doc/Requirements.md
[link third-readme]: https://develop.openfoam.com/Development/ThirdParty-plus/blob/develop/README.md

View File

@ -25,7 +25,7 @@
#
# It is recommended to use VTK sources from ParaView (5.0.1 or later)
#
# See BuildIssues.txt about problems that can be encountered when using
# See doc/BuildIssues.md about problems that can be encountered when using
# the 'plain' VTK sources.
#------------------------------------------------------------------------------
# USER EDITABLE PART: Changes made here may be lost with the next upgrade

View File

@ -26,7 +26,7 @@
#
# It is recommended to use VTK sources from ParaView (5.0.1 or later)
#
# See BuildIssues.txt about problems that can be encountered when using
# See doc/BuildIssues.md about problems that can be encountered when using
# the 'plain' VTK sources.
#------------------------------------------------------------------------------
# USER EDITABLE PART: Changes made here may be lost with the next upgrade

View File

@ -68,7 +68,8 @@ InfoSwitches
allowSystemOperations 1;
// Allow space character in fileName (use with caution)
allowSpaceInFileName 0;
// Default: 0 for non-Windows, 1 for Windows
//// allowSpaceInFileName 0;
}

View File

@ -33,6 +33,12 @@ License
namespace Foam
{
// Convert api number (YYMM) -> 20YY. Eg, 1906 -> 2019
static inline int apiYear()
{
return 2000 + (foamVersion::api / 100);
}
// manpage Footer
static inline void printManFooter()
{
@ -40,7 +46,7 @@ static inline void printManFooter()
<< "Online documentation "
<< "https://www.openfoam.com/documentation/" << nl
<< ".SH COPYRIGHT" << nl
<< "Copyright \\(co 2018 OpenCFD Ltd." << nl;
<< "Copyright \\(co 2018-" << apiYear() << " OpenCFD Ltd." << nl;
}

View File

@ -36,11 +36,18 @@ License
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
const char* const Foam::fileName::typeName = "fileName";
int Foam::fileName::debug(Foam::debug::debugSwitch(fileName::typeName, 0));
int Foam::fileName::allowSpaceInFileName
(
#ifdef _WIN32
Foam::debug::infoSwitch("allowSpaceInFileName", 1)
#else
Foam::debug::infoSwitch("allowSpaceInFileName", 0)
#endif
);
const Foam::fileName Foam::fileName::null;

View File

@ -109,12 +109,13 @@ bool Foam::functionObjects::stabilityBlendingFactor::init(bool first)
if (!residualPtr)
{
WarningInFunction
<< "Could not find residual file : " << residualName_
<< ".The residual mode won't be " << nl
<< "Could not find residual field : " << residualName_
<< ". The residual mode won't be " << nl
<< " considered for the blended field in the stability "
<< "blending factor. " << nl
<< " Add the corresponding residual function object. " << nl
<< " If the residual function object is already set "
<< " Please add the corresponding 'solverInfo'"
<< " function object with 'writeResidualFields true'." << nl
<< " If the solverInfo function object is already enabled "
<< "you might need to wait " << nl
<< " for the first iteration."
<< nl << endl;

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015-2017 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2015-2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2011-2016 OpenFOAM Foundation
@ -42,7 +42,6 @@ namespace Foam
namespace functionObjects
{
defineTypeNameAndDebug(forceCoeffs, 0);
addToRunTimeSelectionTable(functionObject, forceCoeffs, dictionary);
}
}
@ -61,12 +60,23 @@ void Foam::functionObjects::forceCoeffs::createFiles()
if (nBin_ > 1)
{
CmBinFilePtr_ = createFile("CmBin");
writeBinHeader("Moment coefficient bins", CmBinFilePtr_());
CdBinFilePtr_ = createFile("CdBin");
writeBinHeader("Drag coefficient bins", CdBinFilePtr_());
CsBinFilePtr_ = createFile("CsBin");
writeBinHeader("Side coefficient bins", CsBinFilePtr_());
ClBinFilePtr_ = createFile("ClBin");
writeBinHeader("Lift coefficient bins", ClBinFilePtr_());
CmRollBinFilePtr_ = createFile("CmRollBin");
writeBinHeader("Roll moment coefficient bins", CmRollBinFilePtr_());
CmPitchBinFilePtr_ = createFile("CmPitchBin");
writeBinHeader("Moment coefficient bins", CmPitchBinFilePtr_());
CmYawBinFilePtr_ = createFile("CmYawBin");
writeBinHeader("Yaw moment coefficient bins", CmYawBinFilePtr_());
}
}
}
@ -79,18 +89,28 @@ void Foam::functionObjects::forceCoeffs::writeIntegratedHeader
) const
{
writeHeader(os, "Force coefficients");
writeHeaderValue(os, "liftDir", liftDir_);
writeHeaderValue(os, "dragDir", dragDir_);
writeHeaderValue(os, "pitchAxis", pitchAxis_);
writeHeaderValue(os, "dragDir", coordSys_.e1());
writeHeaderValue(os, "sideDir", coordSys_.e2());
writeHeaderValue(os, "liftDir", coordSys_.e3());
writeHeaderValue(os, "rollAxis", coordSys_.e1());
writeHeaderValue(os, "pitchAxis", coordSys_.e2());
writeHeaderValue(os, "yawAxis", coordSys_.e3());
writeHeaderValue(os, "magUInf", magUInf_);
writeHeaderValue(os, "lRef", lRef_);
writeHeaderValue(os, "Aref", Aref_);
writeHeaderValue(os, "CofR", coordSys_.origin());
writeHeader(os, "");
writeCommented(os, "Time");
writeTabbed(os, "Cm");
writeTabbed(os, "Cd");
writeTabbed(os, "Cs");
writeTabbed(os, "Cl");
writeTabbed(os, "CmRoll");
writeTabbed(os, "CmPitch");
writeTabbed(os, "CmYaw");
writeTabbed(os, "Cd(f)");
writeTabbed(os, "Cd(r)");
writeTabbed(os, "Cs(f)");
writeTabbed(os, "Cs(r)");
writeTabbed(os, "Cl(f)");
writeTabbed(os, "Cl(r)");
os << endl;
@ -135,9 +155,9 @@ void Foam::functionObjects::forceCoeffs::writeBinHeader
writeHeader(os, "");
writeCommented(os, "Time");
for (label j = 0; j < nBin_; j++)
for (label j = 0; j < nBin_; ++j)
{
word jn(Foam::name(j) + ':');
const word jn(Foam::name(j) + ':');
writeTabbed(os, jn + "total");
writeTabbed(os, jn + "pressure");
writeTabbed(os, jn + "viscous");
@ -163,13 +183,13 @@ void Foam::functionObjects::forceCoeffs::writeIntegratedData
return;
}
scalar pressure = sum(coeff[0]);
scalar viscous = sum(coeff[1]);
scalar porous = sum(coeff[2]);
scalar total = pressure + viscous + porous;
const scalar pressure = sum(coeff[0]);
const scalar viscous = sum(coeff[1]);
const scalar porous = sum(coeff[2]);
const scalar total = pressure + viscous + porous;
Info<< " " << title << " : " << total << token::TAB
<< "("
<< '('
<< "pressure: " << pressure << token::TAB
<< "viscous: " << viscous;
@ -178,7 +198,7 @@ void Foam::functionObjects::forceCoeffs::writeIntegratedData
Info<< token::TAB << "porous: " << porous;
}
Info<< ")" << endl;
Info<< ')' << endl;
}
@ -190,7 +210,7 @@ void Foam::functionObjects::forceCoeffs::writeBinData
{
writeTime(os);
for (label bini = 0; bini < nBin_; bini++)
for (label bini = 0; bini < nBin_; ++bini)
{
scalar total = coeffs[0][bini] + coeffs[1][bini] + coeffs[2][bini];
@ -216,45 +236,35 @@ Foam::functionObjects::forceCoeffs::forceCoeffs
)
:
forces(name, runTime, dict),
liftDir_(Zero),
dragDir_(Zero),
pitchAxis_(Zero),
magUInf_(0.0),
lRef_(0.0),
Aref_(0.0),
magUInf_(Zero),
lRef_(Zero),
Aref_(Zero),
coeffFilePtr_(),
CmBinFilePtr_(),
CdBinFilePtr_(),
ClBinFilePtr_()
CsBinFilePtr_(),
ClBinFilePtr_(),
CmRollBinFilePtr_(),
CmPitchBinFilePtr_(),
CmYawBinFilePtr_()
{
read(dict);
setCoordinateSystem(dict, "liftDir", "dragDir");
Info<< endl;
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::functionObjects::forceCoeffs::~forceCoeffs()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::functionObjects::forceCoeffs::read(const dictionary& dict)
{
forces::read(dict);
// Directions for lift and drag forces, and pitch moment
dict.readEntry("liftDir", liftDir_);
dict.readEntry("dragDir", dragDir_);
dict.readEntry("pitchAxis", pitchAxis_);
// Free stream velocity magnitude
dict.readEntry("magUInf", magUInf_);
// If case is compressible we must read rhoInf (store in rhoRef_) to
// calculate the reference dynamic pressure
// - note: for incompressible, rhoRef_ is already initialised
// Note: for incompressible, rhoRef_ is already initialised
if (rhoName_ != "rhoInf")
{
dict.readEntry("rhoInf", rhoRef_);
@ -315,55 +325,94 @@ bool Foam::functionObjects::forceCoeffs::execute()
createFiles();
scalar pDyn = 0.5*rhoRef_*magUInf_*magUInf_;
// Storage for pressure, viscous and porous contributions to coeffs
List<Field<scalar>> momentCoeffs(3);
List<Field<scalar>> dragCoeffs(3);
List<Field<scalar>> sideCoeffs(3);
List<Field<scalar>> liftCoeffs(3);
List<Field<scalar>> rollMomentCoeffs(3);
List<Field<scalar>> pitchMomentCoeffs(3);
List<Field<scalar>> yawMomentCoeffs(3);
forAll(liftCoeffs, i)
{
momentCoeffs[i].setSize(nBin_);
dragCoeffs[i].setSize(nBin_);
sideCoeffs[i].setSize(nBin_);
liftCoeffs[i].setSize(nBin_);
rollMomentCoeffs[i].setSize(nBin_);
pitchMomentCoeffs[i].setSize(nBin_);
yawMomentCoeffs[i].setSize(nBin_);
}
// Calculate coefficients
scalar CmTot = 0;
scalar CdTot = 0;
scalar CsTot = 0;
scalar ClTot = 0;
scalar CmRollTot = 0;
scalar CmPitchTot = 0;
scalar CmYawTot = 0;
const scalar pDyn = 0.5*rhoRef_*sqr(magUInf_);
// Avoid divide by zero in 2D cases
const scalar momentScaling = 1.0/(Aref_*pDyn*lRef_ + SMALL);
const scalar forceScaling = 1.0/(Aref_*pDyn + SMALL);
forAll(liftCoeffs, i)
{
momentCoeffs[i] = (moment_[i] & pitchAxis_)/(Aref_*pDyn*lRef_);
dragCoeffs[i] = (force_[i] & dragDir_)/(Aref_*pDyn);
liftCoeffs[i] = (force_[i] & liftDir_)/(Aref_*pDyn);
const Field<vector> localForce(coordSys_.localVector(force_[i]));
const Field<vector> localMoment(coordSys_.localVector(moment_[i]));
dragCoeffs[i] = forceScaling*(localForce.component(0));
sideCoeffs[i] = forceScaling*(localForce.component(1));
liftCoeffs[i] = forceScaling*(localForce.component(2));
rollMomentCoeffs[i] = momentScaling*(localMoment.component(0));
pitchMomentCoeffs[i] = momentScaling*(localMoment.component(1));
yawMomentCoeffs[i] = momentScaling*(localMoment.component(2));
CmTot += sum(momentCoeffs[i]);
CdTot += sum(dragCoeffs[i]);
CsTot += sum(sideCoeffs[i]);
ClTot += sum(liftCoeffs[i]);
CmRollTot += sum(rollMomentCoeffs[i]);
CmPitchTot += sum(pitchMomentCoeffs[i]);
CmYawTot += sum(yawMomentCoeffs[i]);
}
scalar ClfTot = ClTot/2.0 + CmTot;
scalar ClrTot = ClTot/2.0 - CmTot;
// Single contributions to the front and rear
const scalar CdfTot = 0.5*CdTot + CmRollTot;
const scalar CdrTot = 0.5*CdTot - CmRollTot;
const scalar CsfTot = 0.5*CsTot + CmYawTot;
const scalar CsrTot = 0.5*CsTot - CmYawTot;
const scalar ClfTot = 0.5*ClTot + CmPitchTot;
const scalar ClrTot = 0.5*ClTot - CmPitchTot;
Log << type() << " " << name() << " execute:" << nl
<< " Coefficients" << nl;
writeIntegratedData("Cm", momentCoeffs);
writeIntegratedData("Cd", dragCoeffs);
writeIntegratedData("Cs", sideCoeffs);
writeIntegratedData("Cl", liftCoeffs);
writeIntegratedData("CmRoll", rollMomentCoeffs);
writeIntegratedData("CmPitch", pitchMomentCoeffs);
writeIntegratedData("CmYaw", yawMomentCoeffs);
Log << " Cd(f) : " << CdfTot << nl
<< " Cd(r) : " << CdrTot << nl;
Log << " Cs(f) : " << CsfTot << nl
<< " Cs(r) : " << CsrTot << nl;
Log << " Cl(f) : " << ClfTot << nl
<< " Cl(r) : " << ClrTot << nl
<< endl;
<< " Cl(r) : " << ClrTot << nl;
if (writeToFile())
{
writeTime(coeffFilePtr_());
coeffFilePtr_()
<< tab << CmTot << tab << CdTot
<< tab << ClTot << tab << ClfTot << tab << ClrTot << endl;
<< tab << CdTot << tab << CsTot << tab << ClTot
<< tab << CmRollTot << tab << CmPitchTot << tab << CmYawTot
<< tab << CdfTot << tab << CdrTot
<< tab << CsfTot << tab << CsrTot
<< tab << ClfTot << tab << ClrTot << endl;
if (nBin_ > 1)
{
@ -371,26 +420,41 @@ bool Foam::functionObjects::forceCoeffs::execute()
{
forAll(liftCoeffs, i)
{
for (label bini = 1; bini < nBin_; bini++)
for (label bini = 1; bini < nBin_; ++bini)
{
liftCoeffs[i][bini] += liftCoeffs[i][bini-1];
dragCoeffs[i][bini] += dragCoeffs[i][bini-1];
momentCoeffs[i][bini] += momentCoeffs[i][bini-1];
sideCoeffs[i][bini] += sideCoeffs[i][bini-1];
liftCoeffs[i][bini] += liftCoeffs[i][bini-1];
rollMomentCoeffs[i][bini] +=
rollMomentCoeffs[i][bini-1];
pitchMomentCoeffs[i][bini] +=
pitchMomentCoeffs[i][bini-1];
yawMomentCoeffs[i][bini] += yawMomentCoeffs[i][bini-1];
}
}
}
writeBinData(dragCoeffs, CdBinFilePtr_());
writeBinData(sideCoeffs, CsBinFilePtr_());
writeBinData(liftCoeffs, ClBinFilePtr_());
writeBinData(momentCoeffs, CmBinFilePtr_());
writeBinData(rollMomentCoeffs, CmRollBinFilePtr_());
writeBinData(pitchMomentCoeffs, CmPitchBinFilePtr_());
writeBinData(yawMomentCoeffs, CmYawBinFilePtr_());
}
}
// Write state/results information
{
setResult("Cm", CmTot);
setResult("Cd", CdTot);
setResult("Cs", CsTot);
setResult("Cl", ClTot);
setResult("CmRoll", CmRollTot);
setResult("CmPitch", CmPitchTot);
setResult("CmYaw", CmYawTot);
setResult("Cd(f)", CdfTot);
setResult("Cd(r)", CdrTot);
setResult("Cs(f)", CsfTot);
setResult("Cs(r)", CsrTot);
setResult("Cl(f)", ClfTot);
setResult("Cl(r)", ClrTot);
}

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2015 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2019 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
| Copyright (C) 2011-2016 OpenFOAM Foundation
@ -30,9 +30,18 @@ Group
grpForcesFunctionObjects
Description
Extends the forces functionObject by providing lift, drag and moment
coefficients. The data can optionally be output into bins, defined in a
given direction.
Extends the \c forces functionObject by providing coefficients for:
- drag, side and lift forces (Cd, Cs, and Cl)
- roll, pitch and yaw moments (CmRoll, CmPitch, and CmYaw)
- front and rear axle force contributions (C(f) and C(r)) wherein
\verbatim
Cd(f/r) = 0.5*Cd \pm CmRoll
Cs(f/r) = 0.5*Cs \pm CmYaw
Cl(f/r) = 0.5*Cl \pm CmPitch
\endverbatim
The data can optionally be output into bins, defined in a given direction.
The binned data provides the total and consitituent components per bin:
- total coefficient
@ -43,9 +52,12 @@ Description
Data is written into multiple files in the
postProcessing/\<functionObjectName\> directory:
- coefficient.dat : integrated coefficients over all geometries
- CmBin.dat : moment coefficient bins
- CdBin.dat : drag coefficient bins
- CsBin.dat : side coefficient bins
- ClBin.dat : lift coefficient bins
- CmRollBin.dat : roll moment coefficient bins
- CmPitchBin.dat : pitch moment coefficient bins
- CmYawBin.dat : yaw moment coefficient bins
Usage
Example of function object specification:
@ -58,12 +70,14 @@ Usage
log yes;
writeFields yes;
patches (walls);
liftDir (0 1 0);
dragDir (-1 0 0);
pitchAxis (0 0 1);
// input keywords for directions of force/moment coefficients
// refer below for options, and relations
magUInf 100;
lRef 3.5;
Aref 2.2;
porosity no;
binData
{
@ -76,26 +90,65 @@ Usage
Where the entries comprise:
\table
Property | Description | Required | Default value
Property | Description | Required | Default
type | Type name: forceCoeffs | yes |
log | Write force data to standard output | no | no
writeFields | Write the force and moment coefficient fields | no | no
writeFields | Write force,moment coefficient fields | no | no
patches | Patches included in the forces calculation | yes |
liftDir | Lift direction | yes |
dragDir | Drag direction | yes |
pitchAxis | Picth axis | yes |
magUInf | Free stream velocity magnitude | yes |
lRef | Reference length scale for moment calculations | yes |
Aref | Reference area | yes |
porosity | Flag to include porosity contributions | no | no
porosity | Include porosity contributions | no | false
\endtable
Bin data is optional, but if the dictionary is present, the entries must
be defined according o
be defined according to following:
\table
nBin | number of data bins | yes |
direction | direction along which bins are defined | yes |
cumulative | bin data accumulated with incresing distance | yes |
nBin | Number of data bins | yes |
direction | Direction along which bins are defined | yes |
cumulative | Bin data accumulated with incresing distance | yes |
\endtable
Input of force/moment coefficient directions:
- require an origin, and two orthogonal directions; the remaining orthogonal
direction is determined accordingly.
- can be added by the three options below.
\verbatim
CofR (0 0 0); // Centre of rotation
dragDir (1 0 0);
liftDir (0 0 1);
\endverbatim
\verbatim
origin (0 0 0);
e1 (1 0 0);
e3 (0 0 1); // combinations: (e1, e2) or (e2, e3) or (e3, e1)
\endverbatim
\verbatim
coordinateSystem
{
origin (0 0 0);
rotation
{
type axes;
e1 (1 0 0);
e3 (0 0 1); // combinations: (e1, e2) or (e2, e3) or (e3, e1)
}
}
\endverbatim
The default direction relations are shown below:
\table
Property | Description | Alias | Direction
dragDir | Drag direction | e1 | (1 0 0)
sideDir | Side force direction | e2 | (0 1 0)
liftDir | Lift direction | e3 | (0 0 1)
rollAxis | Roll axis | e1 | (1 0 0)
pitchAxis | Pitch axis | e2 | (0 1 0)
yawAxis | Yaw axis | e3 | (0 0 1)
\endtable
See also
@ -130,30 +183,18 @@ class forceCoeffs
{
// Private data
// Force coefficient geometry
//- Lift
vector liftDir_;
//- Drag
vector dragDir_;
//- Pitch
vector pitchAxis_;
// Free-stream conditions
//- Velocity magnitude
//- Free-stream velocity magnitude
scalar magUInf_;
// Reference scales
//- Length
//- Reference length [m]
scalar lRef_;
//- Area
//- Reference area [m^2]
scalar Aref_;
@ -162,15 +203,24 @@ class forceCoeffs
//- Integrated coefficients
autoPtr<OFstream> coeffFilePtr_;
//- Moment coefficient
autoPtr<OFstream> CmBinFilePtr_;
//- Drag coefficient
autoPtr<OFstream> CdBinFilePtr_;
//- Side coefficient
autoPtr<OFstream> CsBinFilePtr_;
//- Lift coefficient
autoPtr<OFstream> ClBinFilePtr_;
//- Roll moment coefficient
autoPtr<OFstream> CmRollBinFilePtr_;
//- Pitch moment coefficient
autoPtr<OFstream> CmPitchBinFilePtr_;
//- Yaw moment coefficient
autoPtr<OFstream> CmYawBinFilePtr_;
// Private Member Functions
@ -223,7 +273,7 @@ public:
//- Destructor
virtual ~forceCoeffs();
virtual ~forceCoeffs() = default;
// Member Functions
@ -231,7 +281,7 @@ public:
//- Read the forces data
virtual bool read(const dictionary&);
//- Execute, currently does nothing
//- Execute
virtual bool execute();
//- Write the forces
@ -249,3 +299,4 @@ public:
#endif
// ************************************************************************* //

View File

@ -71,22 +71,6 @@ void Foam::functionObjects::forces::createFiles()
momentBinFilePtr_ = createFile("momentBin");
writeBinHeader("Moment", momentBinFilePtr_());
}
if (localSystem_)
{
localForceFilePtr_ = createFile("localForce");
writeIntegratedHeader("Force", localForceFilePtr_());
localMomentFilePtr_ = createFile("localMoment");
writeIntegratedHeader("Moment", localMomentFilePtr_());
if (nBin_ > 1)
{
localForceBinFilePtr_ = createFile("localForceBin");
writeBinHeader("Force", localForceBinFilePtr_());
localMomentBinFilePtr_ = createFile("localMomentBin");
writeBinHeader("Moment", localMomentBinFilePtr_());
}
}
}
}
@ -169,6 +153,49 @@ void Foam::functionObjects::forces::writeBinHeader
}
void Foam::functionObjects::forces::setCoordinateSystem
(
const dictionary& dict,
const word& e3Name,
const word& e1Name
)
{
coordSys_.clear();
if (dict.readIfPresent<point>("CofR", coordSys_.origin()))
{
const vector e3 = e3Name == word::null ?
vector(0, 0, 1) : dict.get<vector>(e3Name);
const vector e1 = e1Name == word::null ?
vector(1, 0, 0) : dict.get<vector>(e1Name);
coordSys_ =
coordSystem::cartesian(coordSys_.origin(), e3, e1);
}
else
{
// The 'coordinateSystem' sub-dictionary is optional,
// but enforce use of a cartesian system if not found.
if (dict.found(coordinateSystem::typeName_()))
{
// New() for access to indirect (global) coordinate system
coordSys_ =
coordinateSystem::New
(
obr_,
dict,
coordinateSystem::typeName_()
);
}
else
{
coordSys_ = coordSystem::cartesian(dict);
}
}
}
void Foam::functionObjects::forces::initialise()
{
@ -586,41 +613,20 @@ void Foam::functionObjects::forces::writeForces()
writeIntegratedForceMoment
(
"forces",
force_[0],
force_[1],
force_[2],
coordSys_.localVector(force_[0]),
coordSys_.localVector(force_[1]),
coordSys_.localVector(force_[2]),
forceFilePtr_
);
writeIntegratedForceMoment
(
"moments",
moment_[0],
moment_[1],
moment_[2],
momentFilePtr_
);
if (localSystem_)
{
writeIntegratedForceMoment
(
"local forces",
coordSys_.localVector(force_[0]),
coordSys_.localVector(force_[1]),
coordSys_.localVector(force_[2]),
localForceFilePtr_
);
writeIntegratedForceMoment
(
"local moments",
coordSys_.localVector(moment_[0]),
coordSys_.localVector(moment_[1]),
coordSys_.localVector(moment_[2]),
localMomentFilePtr_
momentFilePtr_
);
}
Log << endl;
}
@ -673,11 +679,6 @@ void Foam::functionObjects::forces::writeBinnedForceMoment
void Foam::functionObjects::forces::writeBins()
{
writeBinnedForceMoment(force_, forceBinFilePtr_);
writeBinnedForceMoment(moment_, momentBinFilePtr_);
if (localSystem_)
{
List<Field<vector>> lf(3);
List<Field<vector>> lm(3);
lf[0] = coordSys_.localVector(force_[0]);
@ -687,9 +688,8 @@ void Foam::functionObjects::forces::writeBins()
lm[1] = coordSys_.localVector(moment_[1]);
lm[2] = coordSys_.localVector(moment_[2]);
writeBinnedForceMoment(lf, localForceBinFilePtr_);
writeBinnedForceMoment(lm, localMomentBinFilePtr_);
}
writeBinnedForceMoment(lf, forceBinFilePtr_);
writeBinnedForceMoment(lm, momentBinFilePtr_);
}
@ -711,10 +711,6 @@ Foam::functionObjects::forces::forces
momentFilePtr_(),
forceBinFilePtr_(),
momentBinFilePtr_(),
localForceFilePtr_(),
localMomentFilePtr_(),
localForceBinFilePtr_(),
localMomentBinFilePtr_(),
patchSet_(),
pName_(word::null),
UName_(word::null),
@ -724,7 +720,6 @@ Foam::functionObjects::forces::forces
rhoRef_(VGREAT),
pRef_(0),
coordSys_(),
localSystem_(false),
porosity_(false),
nBin_(1),
binDir_(Zero),
@ -738,6 +733,7 @@ Foam::functionObjects::forces::forces
if (readFields)
{
read(dict);
setCoordinateSystem(dict);
Log << endl;
}
}
@ -759,10 +755,6 @@ Foam::functionObjects::forces::forces
momentFilePtr_(),
forceBinFilePtr_(),
momentBinFilePtr_(),
localForceFilePtr_(),
localMomentFilePtr_(),
localForceBinFilePtr_(),
localMomentBinFilePtr_(),
patchSet_(),
pName_(word::null),
UName_(word::null),
@ -772,7 +764,6 @@ Foam::functionObjects::forces::forces
rhoRef_(VGREAT),
pRef_(0),
coordSys_(),
localSystem_(false),
porosity_(false),
nBin_(1),
binDir_(Zero),
@ -786,6 +777,7 @@ Foam::functionObjects::forces::forces
if (readFields)
{
read(dict);
setCoordinateSystem(dict);
Log << endl;
}
@ -843,32 +835,6 @@ bool Foam::functionObjects::forces::read(const dictionary& dict)
Info<< " Reference pressure (pRef) set to " << pRef_ << endl;
}
coordSys_.clear();
localSystem_ = false;
// Centre of rotation for moment calculations
// specified directly, from coordinate system, or implicitly (0 0 0)
if (!dict.readIfPresent<point>("CofR", coordSys_.origin()))
{
// The 'coordinateSystem' sub-dictionary is optional,
// but enforce use of a cartesian system.
if (dict.found(coordinateSystem::typeName_()))
{
// New() for access to indirect (global) coordinate system
coordSys_ =
coordinateSystem::New
(
obr_, dict, coordinateSystem::typeName_()
);
}
else
{
coordSys_ = coordSystem::cartesian(dict);
}
localSystem_ = true;
}
dict.readIfPresent("porosity", porosity_);
if (porosity_)

View File

@ -192,18 +192,6 @@ protected:
//- Moment bins
autoPtr<OFstream> momentBinFilePtr_;
//- Local force
autoPtr<OFstream> localForceFilePtr_;
//- Local moment
autoPtr<OFstream> localMomentFilePtr_;
//- Local force bins
autoPtr<OFstream> localForceBinFilePtr_;
//- Local moment bins
autoPtr<OFstream> localMomentBinFilePtr_;
// Read from dictionary
@ -234,9 +222,6 @@ protected:
//- Coordinate system used when evaluting forces/moments
coordSystem::cartesian coordSys_;
//- Flag to indicate whether we are using a local coordinates
bool localSystem_;
//- Flag to include porosity effects
bool porosity_;
@ -283,6 +268,14 @@ protected:
//- Write header for binned data
void writeBinHeader(const word& header, Ostream& os) const;
//- Set the co-ordinate system from dictionary and axes names
void setCoordinateSystem
(
const dictionary& dict,
const word& e3Name = word::null,
const word& e1Name = word::null
);
//- Initialise the fields
void initialise();

View File

@ -30,7 +30,7 @@ Description
\heading Dictionary parameters
\table
Property | Description | Required | Default
type | code / searchableCone | selector |
type | cone / searchableCone | selector |
point1 | coordinate of endpoint | yes |
radius1 | radius at point1 | yes |
innerRadius1| inner radius at point1 | no | 0

View File

@ -1,53 +0,0 @@
/*--------------------------------*- 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 volVectorField;
location "0";
object U;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 1 -1 0 0 0 0];
internalField uniform (0 0 0);
boundaryField
{
inlet
{
type calculated;
value uniform (0 0 0);
}
bound
{
type calculated;
value uniform (0 0 0);
}
outlet
{
type calculated;
value uniform (0 0 0);
}
bottom
{
type calculated;
value uniform (0 0 0);
}
top
{
type calculated;
value uniform (0.05 0 0);
}
}
// ************************************************************************* //

View File

@ -2,12 +2,7 @@
cd ${0%/*} || exit 1 # Run from this directory
. $WM_PROJECT_DIR/bin/tools/CleanFunctions # Tutorial clean functions
cleanTimeDirectories
cleanPostProcessing
cleanCase
cleanFaMesh
rm -rf processor*
#------------------------------------------------------------------------------

View File

@ -10,7 +10,7 @@ residuals
{
type solverInfo;
libs ("libutilityFunctionObjects.so");
writeFields true;
writeResidualFields true;
writeControl outputTime;
fields (p);
}

View File

@ -10,44 +10,20 @@ FoamFile
version 2.0;
format ascii;
class volScalarField;
location "0";
object Cvf;
object MangrovesIndex;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 -1 0 0 0 0 0];
dimensions [0 0 0 0 0 0 0];
internalField uniform 0;
boundaryField
{
inlet
".*"
{
type calculated;
value uniform 0;
}
bound
{
type calculated;
value uniform 0;
}
outlet
{
type calculated;
value uniform 0;
}
bottom
{
type calculated;
value uniform 0;
}
top
{
type calculated;
value uniform 0;
type zeroGradient;
}
}
// ************************************************************************* //

View File

@ -1,3 +1,4 @@
solid C
facet normal 0.0 1.0 0.0
outer loop
vertex 4.065 0.5475 0.25

View File

@ -1,5 +1,5 @@
#-------------------------------*- makefile -*---------------------------------
WM_VERSION = OPENFOAM=1904
WM_VERSION = OPENFOAM=1906
AR = ar
ARFLAGS = cr