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 patch=0

View File

@ -33,9 +33,9 @@ Please see the relevant guides:
[repo openfoam]: https://develop.openfoam.com/Development/OpenFOAM-plus/ [repo openfoam]: https://develop.openfoam.com/Development/OpenFOAM-plus/
[repo third]: https://develop.openfoam.com/Development/ThirdParty-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-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-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 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-readme]: https://develop.openfoam.com/Development/ThirdParty-plus/blob/develop/README.md

View File

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

View File

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

View File

@ -15,7 +15,8 @@ The [third-party][repo third] directory includes a
[build guide][link third-build]. [build guide][link third-build].
Some known build issues related to specific compiler and VTK library versions 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, If you need to change the default versions for third-party libraries,
or use system libraries for some components, please some additional or use system libraries for some components, please some additional
@ -94,10 +95,10 @@ simpleFoam
OpenFOAM ships with ParaView sources for post-processing OpenFOAM OpenFOAM ships with ParaView sources for post-processing OpenFOAM
field results. However, the paraview version distributed with field results. However, the paraview version distributed with
the operating system or a [binary package][download ParaView] 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 If you do wish to compile ParaView from source, it is recommended
that you do so *after* completing an initial compilation of OpenFOAM. that you do so ***after*** completing an initial compilation of OpenFOAM.
This gets the process started much more quickly. At a later stage, This gets the process started much more quickly. At a later stage,
OpenFOAM can be updated to compile with paraview. Only the affected OpenFOAM can be updated to compile with paraview. Only the affected
applications will be compiled (eg, the blockMesh reader module) and the 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 openfoam]: https://develop.openfoam.com/Development/OpenFOAM-plus/
[repo third]: https://develop.openfoam.com/Development/ThirdParty-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-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 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-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) - fftw: 3.3.7 (recommended - required for FFT-related functionality)
- paraview: 5.5.2 (for visualization) - 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 To check the installed versions
| Program | To check the version | | Program | To check the version |
|---------------|-----------------------| |---------------|-----------------------|
| gcc | gcc --version | | gcc | gcc --version |
| icc | icc --version |
| cmake | cmake --version | | cmake | cmake --version |
| openmpi | orterun --version | | openmpi | orterun --version |
### Additional utilities ### Additional utilities
- flex - flex
@ -81,7 +87,6 @@ sudo zypper install cmake boost-devel mpfr-devel gmp-devel openmpi-devel gnuplot
This installs This installs
| Program | openSUSE | Program version | | Program | openSUSE | Program version |
|-----------|-----------|-----------------| |-----------|-----------|-----------------|
| gcc | 15.0 | 7.4.3 | | gcc | 15.0 | 7.4.3 |
@ -157,7 +162,7 @@ A partial list is given in the [ThirdParty requirements][link third-require].
<!-- OpenFOAM --> <!-- OpenFOAM -->
[link openfoam-readme]: https://develop.openfoam.com/Development/OpenFOAM-plus/blob/develop/README.md [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-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 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-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) # 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. # the 'plain' VTK sources.
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# USER EDITABLE PART: Changes made here may be lost with the next upgrade # 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) # 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. # the 'plain' VTK sources.
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# USER EDITABLE PART: Changes made here may be lost with the next upgrade # USER EDITABLE PART: Changes made here may be lost with the next upgrade

View File

@ -68,7 +68,8 @@ InfoSwitches
allowSystemOperations 1; allowSystemOperations 1;
// Allow space character in fileName (use with caution) // 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 namespace Foam
{ {
// Convert api number (YYMM) -> 20YY. Eg, 1906 -> 2019
static inline int apiYear()
{
return 2000 + (foamVersion::api / 100);
}
// manpage Footer // manpage Footer
static inline void printManFooter() static inline void printManFooter()
{ {
@ -40,7 +46,7 @@ static inline void printManFooter()
<< "Online documentation " << "Online documentation "
<< "https://www.openfoam.com/documentation/" << nl << "https://www.openfoam.com/documentation/" << nl
<< ".SH COPYRIGHT" << 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 * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
const char* const Foam::fileName::typeName = "fileName"; const char* const Foam::fileName::typeName = "fileName";
int Foam::fileName::debug(Foam::debug::debugSwitch(fileName::typeName, 0)); int Foam::fileName::debug(Foam::debug::debugSwitch(fileName::typeName, 0));
int Foam::fileName::allowSpaceInFileName int Foam::fileName::allowSpaceInFileName
( (
#ifdef _WIN32
Foam::debug::infoSwitch("allowSpaceInFileName", 1)
#else
Foam::debug::infoSwitch("allowSpaceInFileName", 0) Foam::debug::infoSwitch("allowSpaceInFileName", 0)
#endif
); );
const Foam::fileName Foam::fileName::null; const Foam::fileName Foam::fileName::null;

View File

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

View File

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

View File

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

View File

@ -71,22 +71,6 @@ void Foam::functionObjects::forces::createFiles()
momentBinFilePtr_ = createFile("momentBin"); momentBinFilePtr_ = createFile("momentBin");
writeBinHeader("Moment", momentBinFilePtr_()); 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() void Foam::functionObjects::forces::initialise()
{ {
@ -586,41 +613,20 @@ void Foam::functionObjects::forces::writeForces()
writeIntegratedForceMoment writeIntegratedForceMoment
( (
"forces", "forces",
force_[0], coordSys_.localVector(force_[0]),
force_[1], coordSys_.localVector(force_[1]),
force_[2], coordSys_.localVector(force_[2]),
forceFilePtr_ forceFilePtr_
); );
writeIntegratedForceMoment writeIntegratedForceMoment
( (
"moments", "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_[0]),
coordSys_.localVector(moment_[1]), coordSys_.localVector(moment_[1]),
coordSys_.localVector(moment_[2]), coordSys_.localVector(moment_[2]),
localMomentFilePtr_ momentFilePtr_
); );
}
Log << endl; Log << endl;
} }
@ -672,11 +678,6 @@ void Foam::functionObjects::forces::writeBinnedForceMoment
void Foam::functionObjects::forces::writeBins() void Foam::functionObjects::forces::writeBins()
{
writeBinnedForceMoment(force_, forceBinFilePtr_);
writeBinnedForceMoment(moment_, momentBinFilePtr_);
if (localSystem_)
{ {
List<Field<vector>> lf(3); List<Field<vector>> lf(3);
List<Field<vector>> lm(3); List<Field<vector>> lm(3);
@ -687,9 +688,8 @@ void Foam::functionObjects::forces::writeBins()
lm[1] = coordSys_.localVector(moment_[1]); lm[1] = coordSys_.localVector(moment_[1]);
lm[2] = coordSys_.localVector(moment_[2]); lm[2] = coordSys_.localVector(moment_[2]);
writeBinnedForceMoment(lf, localForceBinFilePtr_); writeBinnedForceMoment(lf, forceBinFilePtr_);
writeBinnedForceMoment(lm, localMomentBinFilePtr_); writeBinnedForceMoment(lm, momentBinFilePtr_);
}
} }
@ -711,10 +711,6 @@ Foam::functionObjects::forces::forces
momentFilePtr_(), momentFilePtr_(),
forceBinFilePtr_(), forceBinFilePtr_(),
momentBinFilePtr_(), momentBinFilePtr_(),
localForceFilePtr_(),
localMomentFilePtr_(),
localForceBinFilePtr_(),
localMomentBinFilePtr_(),
patchSet_(), patchSet_(),
pName_(word::null), pName_(word::null),
UName_(word::null), UName_(word::null),
@ -724,7 +720,6 @@ Foam::functionObjects::forces::forces
rhoRef_(VGREAT), rhoRef_(VGREAT),
pRef_(0), pRef_(0),
coordSys_(), coordSys_(),
localSystem_(false),
porosity_(false), porosity_(false),
nBin_(1), nBin_(1),
binDir_(Zero), binDir_(Zero),
@ -738,6 +733,7 @@ Foam::functionObjects::forces::forces
if (readFields) if (readFields)
{ {
read(dict); read(dict);
setCoordinateSystem(dict);
Log << endl; Log << endl;
} }
} }
@ -759,10 +755,6 @@ Foam::functionObjects::forces::forces
momentFilePtr_(), momentFilePtr_(),
forceBinFilePtr_(), forceBinFilePtr_(),
momentBinFilePtr_(), momentBinFilePtr_(),
localForceFilePtr_(),
localMomentFilePtr_(),
localForceBinFilePtr_(),
localMomentBinFilePtr_(),
patchSet_(), patchSet_(),
pName_(word::null), pName_(word::null),
UName_(word::null), UName_(word::null),
@ -772,7 +764,6 @@ Foam::functionObjects::forces::forces
rhoRef_(VGREAT), rhoRef_(VGREAT),
pRef_(0), pRef_(0),
coordSys_(), coordSys_(),
localSystem_(false),
porosity_(false), porosity_(false),
nBin_(1), nBin_(1),
binDir_(Zero), binDir_(Zero),
@ -786,6 +777,7 @@ Foam::functionObjects::forces::forces
if (readFields) if (readFields)
{ {
read(dict); read(dict);
setCoordinateSystem(dict);
Log << endl; Log << endl;
} }
@ -843,32 +835,6 @@ bool Foam::functionObjects::forces::read(const dictionary& dict)
Info<< " Reference pressure (pRef) set to " << pRef_ << endl; 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_); dict.readIfPresent("porosity", porosity_);
if (porosity_) if (porosity_)

View File

@ -192,18 +192,6 @@ protected:
//- Moment bins //- Moment bins
autoPtr<OFstream> momentBinFilePtr_; 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 // Read from dictionary
@ -234,9 +222,6 @@ protected:
//- Coordinate system used when evaluting forces/moments //- Coordinate system used when evaluting forces/moments
coordSystem::cartesian coordSys_; coordSystem::cartesian coordSys_;
//- Flag to indicate whether we are using a local coordinates
bool localSystem_;
//- Flag to include porosity effects //- Flag to include porosity effects
bool porosity_; bool porosity_;
@ -283,6 +268,14 @@ protected:
//- Write header for binned data //- Write header for binned data
void writeBinHeader(const word& header, Ostream& os) const; 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 //- Initialise the fields
void initialise(); void initialise();

View File

@ -30,7 +30,7 @@ Description
\heading Dictionary parameters \heading Dictionary parameters
\table \table
Property | Description | Required | Default Property | Description | Required | Default
type | code / searchableCone | selector | type | cone / searchableCone | selector |
point1 | coordinate of endpoint | yes | point1 | coordinate of endpoint | yes |
radius1 | radius at point1 | yes | radius1 | radius at point1 | yes |
innerRadius1| inner radius at point1 | no | 0 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 cd ${0%/*} || exit 1 # Run from this directory
. $WM_PROJECT_DIR/bin/tools/CleanFunctions # Tutorial clean functions . $WM_PROJECT_DIR/bin/tools/CleanFunctions # Tutorial clean functions
cleanTimeDirectories cleanCase
cleanPostProcessing
cleanFaMesh cleanFaMesh
rm -rf processor*
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------

View File

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

View File

@ -10,44 +10,20 @@ FoamFile
version 2.0; version 2.0;
format ascii; format ascii;
class volScalarField; class volScalarField;
location "0"; object MangrovesIndex;
object Cvf;
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 -1 0 0 0 0 0]; dimensions [0 0 0 0 0 0 0];
internalField uniform 0; internalField uniform 0;
boundaryField boundaryField
{ {
inlet ".*"
{ {
type calculated; type zeroGradient;
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;
} }
} }
// ************************************************************************* // // ************************************************************************* //

View File

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

View File

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