From d82cc36c5af97e799a82fadf455e06d192ae1e65 Mon Sep 17 00:00:00 2001 From: Henry Weller Date: Mon, 29 Jan 2018 15:03:13 +0000 Subject: [PATCH] OpenFOAM: Added support for extended precision scalar OpenFOAM can now be compiled with single, double or long double scalars by setting the WM_PRECISION_OPTION environment variable to either SP, DP or LP respectively. On most 64bit systems long double is stored as 128bit but computed in the floating point hardware to 80bit. Due to the increased storage compared to double precision cache and memory access is significantly more time consuming causing a slow-down of floating point intensive operations by a factor of 2 to 3. --- .../populationBalanceModel.C | 12 +- etc/bashrc | 4 +- etc/config.csh/aliases | 3 +- etc/config.sh/aliases | 3 +- etc/controlDict | 1 + etc/cshrc | 4 +- src/OpenFOAM/Make/files | 1 + src/OpenFOAM/db/IOstreams/IOstreams/Istream.H | 5 +- src/OpenFOAM/db/IOstreams/IOstreams/Ostream.H | 5 +- .../db/IOstreams/Pstreams/UIPstream.C | 25 ++- .../db/IOstreams/Pstreams/UIPstream.H | 5 +- .../db/IOstreams/Pstreams/UOPstream.C | 30 +-- .../db/IOstreams/Pstreams/UOPstream.H | 5 +- src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C | 10 +- src/OpenFOAM/db/IOstreams/Sstreams/ISstream.H | 5 +- src/OpenFOAM/db/IOstreams/Sstreams/OSstream.C | 10 +- src/OpenFOAM/db/IOstreams/Sstreams/OSstream.H | 5 +- .../db/IOstreams/Sstreams/prefixOSstream.C | 9 +- .../db/IOstreams/Sstreams/prefixOSstream.H | 5 +- src/OpenFOAM/db/IOstreams/Tstreams/ITstream.C | 9 +- src/OpenFOAM/db/IOstreams/Tstreams/ITstream.H | 5 +- .../IOstreams/dummyISstream/dummyISstream.H | 9 +- .../db/IOstreams/dummyIstream/dummyIstream.H | 9 +- src/OpenFOAM/db/IOstreams/token/token.H | 23 ++- src/OpenFOAM/db/IOstreams/token/tokenI.H | 81 +++++++- src/OpenFOAM/db/IOstreams/token/tokenIO.C | 14 +- .../primitiveEntry/primitiveEntryIO.C | 6 +- src/OpenFOAM/dimensionSet/dimensionSet.C | 4 +- .../meshes/primitiveShapes/plane/plane.C | 5 +- .../longDoubleScalar/longDoubleScalar.C | 47 +++++ .../longDoubleScalar/longDoubleScalar.H | 175 ++++++++++++++++++ .../primitives/Scalar/scalar/scalar.H | 35 +++- src/OpenFOAM/primitives/one/one.H | 8 +- src/OpenFOAM/primitives/zero/zero.H | 8 +- src/Pstream/mpi/UPstream.C | 4 +- src/surfMesh/surfaceFormats/obj/OBJstream.C | 10 +- src/surfMesh/surfaceFormats/stl/STLpoint.H | 4 +- 37 files changed, 534 insertions(+), 69 deletions(-) create mode 100644 src/OpenFOAM/primitives/Scalar/longDoubleScalar/longDoubleScalar.C create mode 100644 src/OpenFOAM/primitives/Scalar/longDoubleScalar/longDoubleScalar.H diff --git a/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/populationBalanceModel/populationBalanceModel.C b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/populationBalanceModel/populationBalanceModel.C index bcf58ae4bc..2645778a7a 100644 --- a/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/populationBalanceModel/populationBalanceModel.C +++ b/applications/solvers/multiphase/reactingEulerFoam/phaseSystems/populationBalanceModel/populationBalanceModel/populationBalanceModel.C @@ -1344,11 +1344,15 @@ void Foam::diameterModels::populationBalanceModel::solve() d_() = dsm(); } - volScalarField fAlpha0 = - *sizeGroups_.first()*sizeGroups_.first()->phase(); + volScalarField fAlpha0 + ( + *sizeGroups_.first()*sizeGroups_.first()->phase() + ); - volScalarField fAlphaN = - *sizeGroups_.last()*sizeGroups_.last()->phase(); + volScalarField fAlphaN + ( + *sizeGroups_.last()*sizeGroups_.last()->phase() + ); Info<< this->name() << " sizeGroup phase fraction first, last = " << fAlpha0.weightedAverage(this->mesh().V()).value() diff --git a/etc/bashrc b/etc/bashrc index d92b469b07..476e476de2 100644 --- a/etc/bashrc +++ b/etc/bashrc @@ -2,7 +2,7 @@ # ========= | # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox # \\ / O peration | -# \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation +# \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation # \\/ M anipulation | #------------------------------------------------------------------------------ # License @@ -72,7 +72,7 @@ unset WM_COMPILER_ARCH WM_COMPILER_LIB_ARCH export WM_ARCH_OPTION=64 #- Precision: -# WM_PRECISION_OPTION = DP | SP +# WM_PRECISION_OPTION = SP | DP | LP export WM_PRECISION_OPTION=DP #- Label size: diff --git a/etc/config.csh/aliases b/etc/config.csh/aliases index 33bb0e4a98..09efd50a2c 100644 --- a/etc/config.csh/aliases +++ b/etc/config.csh/aliases @@ -2,7 +2,7 @@ # ========= | # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox # \\ / O peration | -# \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation +# \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation # \\/ M anipulation | #------------------------------------------------------------------------------ # License @@ -37,6 +37,7 @@ alias wm64 'wmSet WM_ARCH_OPTION=64' alias wm32 'wmSet WM_ARCH_OPTION=32' alias wmSP 'wmSet WM_PRECISION_OPTION=SP' alias wmDP 'wmSet WM_PRECISION_OPTION=DP' +alias wmLP 'wmSet WM_PRECISION_OPTION=LP' # Clear env alias wmUnset 'source $WM_PROJECT_DIR/etc/config.csh/unset' diff --git a/etc/config.sh/aliases b/etc/config.sh/aliases index f1fe0c13a4..13b2155640 100644 --- a/etc/config.sh/aliases +++ b/etc/config.sh/aliases @@ -2,7 +2,7 @@ # ========= | # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox # \\ / O peration | -# \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation +# \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation # \\/ M anipulation | #------------------------------------------------------------------------------ # License @@ -37,6 +37,7 @@ alias wm64='wmSet WM_ARCH_OPTION=64' alias wm32='wmSet WM_ARCH_OPTION=32' alias wmSP='wmSet WM_PRECISION_OPTION=SP' alias wmDP='wmSet WM_PRECISION_OPTION=DP' +alias wmLP='wmSet WM_PRECISION_OPTION=LP' # Clear env alias wmUnset='. $WM_PROJECT_DIR/etc/config.sh/unset' diff --git a/etc/controlDict b/etc/controlDict index 4868acff5a..6476561408 100644 --- a/etc/controlDict +++ b/etc/controlDict @@ -300,6 +300,7 @@ DebugSwitches ThermoParcel 0; UMIST 0; UMISTV 0; + UPstream 0; UpwindFitData 0; UpwindFitData 0; UpwindFitData 0; diff --git a/etc/cshrc b/etc/cshrc index d191e33521..87ac3c7b53 100644 --- a/etc/cshrc +++ b/etc/cshrc @@ -2,7 +2,7 @@ # ========= | # \\ / F ield | OpenFOAM: The Open Source CFD Toolbox # \\ / O peration | -# \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation +# \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation # \\/ M anipulation | #------------------------------------------------------------------------------ # License @@ -72,7 +72,7 @@ unsetenv WM_COMPILER_LIB_ARCH setenv WM_ARCH_OPTION 64 #- Precision: -# WM_PRECISION_OPTION = DP | SP +# WM_PRECISION_OPTION = SP | DP | LP setenv WM_PRECISION_OPTION DP #- Label size: diff --git a/src/OpenFOAM/Make/files b/src/OpenFOAM/Make/files index df86f1dc73..7479c40dd6 100644 --- a/src/OpenFOAM/Make/files +++ b/src/OpenFOAM/Make/files @@ -42,6 +42,7 @@ $(ints)/uLabel/uLabel.C $(ints)/lists/labelIOList.C $(ints)/lists/labelListIOList.C +primitives/Scalar/longDoubleScalar/longDoubleScalar.C primitives/Scalar/doubleScalar/doubleScalar.C primitives/Scalar/floatScalar/floatScalar.C primitives/Scalar/scalar/scalar.C diff --git a/src/OpenFOAM/db/IOstreams/IOstreams/Istream.H b/src/OpenFOAM/db/IOstreams/IOstreams/Istream.H index 984110e314..822e3d924d 100644 --- a/src/OpenFOAM/db/IOstreams/IOstreams/Istream.H +++ b/src/OpenFOAM/db/IOstreams/IOstreams/Istream.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -128,6 +128,9 @@ public: //- Read a doubleScalar virtual Istream& read(doubleScalar&) = 0; + //- Read a longDoubleScalar + virtual Istream& read(longDoubleScalar&) = 0; + //- Read binary block virtual Istream& read(char*, std::streamsize) = 0; diff --git a/src/OpenFOAM/db/IOstreams/IOstreams/Ostream.H b/src/OpenFOAM/db/IOstreams/IOstreams/Ostream.H index aada0b4f9a..44dacf3e90 100644 --- a/src/OpenFOAM/db/IOstreams/IOstreams/Ostream.H +++ b/src/OpenFOAM/db/IOstreams/IOstreams/Ostream.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -136,6 +136,9 @@ public: //- Write doubleScalar virtual Ostream& write(const doubleScalar) = 0; + //- Write longDoubleScalar + virtual Ostream& write(const longDoubleScalar) = 0; + //- Write binary block virtual Ostream& write(const char*, std::streamsize) = 0; diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C index 5707d2d5c9..5691ee6073 100644 --- a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C +++ b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -27,6 +27,7 @@ License #include "UIPstream.H" #include "int.H" #include "token.H" + #include @@ -243,6 +244,21 @@ Foam::Istream& Foam::UIPstream::read(token& t) return *this; } + // longDoubleScalar + case token::LONG_DOUBLE_SCALAR : + { + longDoubleScalar val; + if (read(val)) + { + t = val; + } + else + { + t.setBad(); + } + return *this; + } + // Character (returned as a single character word) or error default: { @@ -313,6 +329,13 @@ Foam::Istream& Foam::UIPstream::read(doubleScalar& val) } +Foam::Istream& Foam::UIPstream::read(longDoubleScalar& val) +{ + readFromBuffer(val); + return *this; +} + + Foam::Istream& Foam::UIPstream::read(char* data, std::streamsize count) { if (format() != BINARY) diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.H b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.H index b4aefe4446..47d221999f 100644 --- a/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.H +++ b/src/OpenFOAM/db/IOstreams/Pstreams/UIPstream.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -159,6 +159,9 @@ public: //- Read a doubleScalar Istream& read(doubleScalar&); + //- Read a longDoubleScalar + Istream& read(longDoubleScalar&); + //- Read binary block Istream& read(char*, std::streamsize); diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.C b/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.C index 6ac1743680..3bc384991a 100644 --- a/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.C +++ b/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -155,12 +155,12 @@ Foam::Ostream& Foam::UOPstream::write(const token& t) // Raw token output only supported for verbatim strings for now if (t.type() == token::VERBATIMSTRING) { - write(char(token::VERBATIMSTRING)); + writeToBuffer(char(token::VERBATIMSTRING)); write(t.stringToken()); } else if (t.type() == token::VARIABLE) { - write(char(token::VARIABLE)); + writeToBuffer(char(token::VARIABLE)); write(t.stringToken()); } else @@ -204,7 +204,7 @@ Foam::Ostream& Foam::UOPstream::write(const char* str) Foam::Ostream& Foam::UOPstream::write(const word& str) { - write(char(token::WORD)); + writeToBuffer(char(token::WORD)); size_t len = str.size(); writeToBuffer(len); @@ -216,7 +216,7 @@ Foam::Ostream& Foam::UOPstream::write(const word& str) Foam::Ostream& Foam::UOPstream::write(const string& str) { - write(char(token::STRING)); + writeToBuffer(char(token::STRING)); size_t len = str.size(); writeToBuffer(len); @@ -234,11 +234,11 @@ Foam::Ostream& Foam::UOPstream::writeQuoted { if (quoted) { - write(char(token::STRING)); + writeToBuffer(char(token::STRING)); } else { - write(char(token::WORD)); + writeToBuffer(char(token::WORD)); } size_t len = str.size(); @@ -251,7 +251,7 @@ Foam::Ostream& Foam::UOPstream::writeQuoted Foam::Ostream& Foam::UOPstream::write(const int32_t val) { - write(char(token::LABEL)); + writeToBuffer(char(token::LABEL)); writeToBuffer(val); return *this; } @@ -259,7 +259,7 @@ Foam::Ostream& Foam::UOPstream::write(const int32_t val) Foam::Ostream& Foam::UOPstream::write(const int64_t val) { - write(char(token::LABEL)); + writeToBuffer(char(token::LABEL)); writeToBuffer(val); return *this; } @@ -267,7 +267,7 @@ Foam::Ostream& Foam::UOPstream::write(const int64_t val) Foam::Ostream& Foam::UOPstream::write(const floatScalar val) { - write(char(token::FLOAT_SCALAR)); + writeToBuffer(char(token::FLOAT_SCALAR)); writeToBuffer(val); return *this; } @@ -275,7 +275,15 @@ Foam::Ostream& Foam::UOPstream::write(const floatScalar val) Foam::Ostream& Foam::UOPstream::write(const doubleScalar val) { - write(char(token::DOUBLE_SCALAR)); + writeToBuffer(char(token::DOUBLE_SCALAR)); + writeToBuffer(val); + return *this; +} + + +Foam::Ostream& Foam::UOPstream::write(const longDoubleScalar val) +{ + writeToBuffer(char(token::LONG_DOUBLE_SCALAR)); writeToBuffer(val); return *this; } diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.H b/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.H index 349ac52104..3af4aa6b6b 100644 --- a/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.H +++ b/src/OpenFOAM/db/IOstreams/Pstreams/UOPstream.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -168,6 +168,9 @@ public: //- Write doubleScalar Ostream& write(const doubleScalar); + //- Write longDoubleScalar + Ostream& write(const longDoubleScalar); + //- Write binary block Ostream& write(const char*, std::streamsize); diff --git a/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C b/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C index 94cf60f4fb..b7ccef7fe1 100644 --- a/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C +++ b/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -777,6 +777,14 @@ Foam::Istream& Foam::ISstream::read(doubleScalar& val) } +Foam::Istream& Foam::ISstream::read(longDoubleScalar& val) +{ + is_ >> val; + setState(is_.rdstate()); + return *this; +} + + // read binary block Foam::Istream& Foam::ISstream::read(char* buf, std::streamsize count) { diff --git a/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.H b/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.H index 3f6ebb42cd..2d53532cef 100644 --- a/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.H +++ b/src/OpenFOAM/db/IOstreams/Sstreams/ISstream.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -160,6 +160,9 @@ public: //- Read a doubleScalar virtual Istream& read(doubleScalar&); + //- Read a longDoubleScalar + virtual Istream& read(longDoubleScalar&); + //- Read binary block virtual Istream& read(char*, std::streamsize); diff --git a/src/OpenFOAM/db/IOstreams/Sstreams/OSstream.C b/src/OpenFOAM/db/IOstreams/Sstreams/OSstream.C index 0feb835340..b447042b07 100644 --- a/src/OpenFOAM/db/IOstreams/Sstreams/OSstream.C +++ b/src/OpenFOAM/db/IOstreams/Sstreams/OSstream.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -215,6 +215,14 @@ Foam::Ostream& Foam::OSstream::write(const doubleScalar val) } +Foam::Ostream& Foam::OSstream::write(const longDoubleScalar val) +{ + os_ << val; + setState(os_.rdstate()); + return *this; +} + + Foam::Ostream& Foam::OSstream::write(const char* buf, std::streamsize count) { if (format() != BINARY) diff --git a/src/OpenFOAM/db/IOstreams/Sstreams/OSstream.H b/src/OpenFOAM/db/IOstreams/Sstreams/OSstream.H index b43b46e564..93df27db89 100644 --- a/src/OpenFOAM/db/IOstreams/Sstreams/OSstream.H +++ b/src/OpenFOAM/db/IOstreams/Sstreams/OSstream.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -142,6 +142,9 @@ public: //- Write doubleScalar virtual Ostream& write(const doubleScalar); + //- Write longDoubleScalar + virtual Ostream& write(const longDoubleScalar); + //- Write binary block virtual Ostream& write(const char*, std::streamsize); diff --git a/src/OpenFOAM/db/IOstreams/Sstreams/prefixOSstream.C b/src/OpenFOAM/db/IOstreams/Sstreams/prefixOSstream.C index 5eb8c506ed..d0b165c618 100644 --- a/src/OpenFOAM/db/IOstreams/Sstreams/prefixOSstream.C +++ b/src/OpenFOAM/db/IOstreams/Sstreams/prefixOSstream.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -165,6 +165,13 @@ Foam::Ostream& Foam::prefixOSstream::write(const doubleScalar val) } +Foam::Ostream& Foam::prefixOSstream::write(const longDoubleScalar val) +{ + checkWritePrefix(); + return OSstream::write(val); +} + + Foam::Ostream& Foam::prefixOSstream::write ( const char* buf, diff --git a/src/OpenFOAM/db/IOstreams/Sstreams/prefixOSstream.H b/src/OpenFOAM/db/IOstreams/Sstreams/prefixOSstream.H index d372d6b144..0955005550 100644 --- a/src/OpenFOAM/db/IOstreams/Sstreams/prefixOSstream.H +++ b/src/OpenFOAM/db/IOstreams/Sstreams/prefixOSstream.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -133,6 +133,9 @@ public: //- Write doubleScalar virtual Ostream& write(const doubleScalar); + //- Write longDoubleScalar + virtual Ostream& write(const longDoubleScalar); + //- Write binary block virtual Ostream& write(const char*, std::streamsize); diff --git a/src/OpenFOAM/db/IOstreams/Tstreams/ITstream.C b/src/OpenFOAM/db/IOstreams/Tstreams/ITstream.C index c9dae12294..07d7f9f8b4 100644 --- a/src/OpenFOAM/db/IOstreams/Tstreams/ITstream.C +++ b/src/OpenFOAM/db/IOstreams/Tstreams/ITstream.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -147,6 +147,13 @@ Foam::Istream& Foam::ITstream::read(doubleScalar&) } +Foam::Istream& Foam::ITstream::read(longDoubleScalar&) +{ + NotImplemented; + return *this; +} + + Foam::Istream& Foam::ITstream::read(char*, std::streamsize) { NotImplemented; diff --git a/src/OpenFOAM/db/IOstreams/Tstreams/ITstream.H b/src/OpenFOAM/db/IOstreams/Tstreams/ITstream.H index 9a179e2d07..d4764e0ed8 100644 --- a/src/OpenFOAM/db/IOstreams/Tstreams/ITstream.H +++ b/src/OpenFOAM/db/IOstreams/Tstreams/ITstream.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -185,6 +185,9 @@ public: //- Read a doubleScalar virtual Istream& read(doubleScalar&); + //- Read a longDoubleScalar + virtual Istream& read(longDoubleScalar&); + //- Read binary block virtual Istream& read(char*, std::streamsize); diff --git a/src/OpenFOAM/db/IOstreams/dummyISstream/dummyISstream.H b/src/OpenFOAM/db/IOstreams/dummyISstream/dummyISstream.H index a774271a11..e002a8e73c 100644 --- a/src/OpenFOAM/db/IOstreams/dummyISstream/dummyISstream.H +++ b/src/OpenFOAM/db/IOstreams/dummyISstream/dummyISstream.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2017 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2017-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -119,6 +119,13 @@ public: return *this; } + //- Read a longDoubleScalar + virtual Istream& read(longDoubleScalar&) + { + NotImplemented; + return *this; + } + //- Read binary block virtual Istream& read(char*, std::streamsize) { diff --git a/src/OpenFOAM/db/IOstreams/dummyIstream/dummyIstream.H b/src/OpenFOAM/db/IOstreams/dummyIstream/dummyIstream.H index 9e8549820d..d2a1a3c949 100644 --- a/src/OpenFOAM/db/IOstreams/dummyIstream/dummyIstream.H +++ b/src/OpenFOAM/db/IOstreams/dummyIstream/dummyIstream.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2017 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2017-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -120,6 +120,13 @@ public: return *this; } + //- Read a longDoubleScalar + virtual Istream& read(longDoubleScalar&) + { + NotImplemented; + return *this; + } + //- Read binary block virtual Istream& read(char*, std::streamsize) { diff --git a/src/OpenFOAM/db/IOstreams/token/token.H b/src/OpenFOAM/db/IOstreams/token/token.H index 7229e58b86..adedf2ccbb 100644 --- a/src/OpenFOAM/db/IOstreams/token/token.H +++ b/src/OpenFOAM/db/IOstreams/token/token.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -73,11 +73,11 @@ class token public: //- Enumeration defining the types of token - enum tokenType + enum tokenType : char { - UNDEFINED, + UNDEFINED = 0, - PUNCTUATION, + PUNCTUATION = -127, WORD, VARIABLE, STRING, @@ -85,14 +85,14 @@ public: LABEL, FLOAT_SCALAR, DOUBLE_SCALAR, + LONG_DOUBLE_SCALAR, COMPOUND, ERROR }; - //- Standard punctuation tokens - enum punctuationToken + enum punctuationToken : char { NULL_TOKEN = '\0', SPACE = ' ', @@ -120,7 +120,6 @@ public: DIVIDE = '/' }; - //- Abstract base class for complex tokens class compound : @@ -260,6 +259,7 @@ private: label labelToken_; floatScalar floatScalarToken_; doubleScalar doubleScalarToken_; + longDoubleScalar* longDoubleScalarTokenPtr_; mutable compound* compoundTokenPtr_; }; @@ -309,6 +309,9 @@ public: //- Construct doubleScalar token inline token(const doubleScalar, label lineNumber=0); + //- Construct longDoubleScalar token + inline token(const longDoubleScalar, label lineNumber=0); + //- Construct from Istream token(Istream&); @@ -348,6 +351,9 @@ public: inline bool isDoubleScalar() const; inline doubleScalar doubleScalarToken() const; + inline bool isLongDoubleScalar() const; + inline longDoubleScalar longDoubleScalarToken() const; + inline bool isScalar() const; inline scalar scalarToken() const; @@ -395,6 +401,7 @@ public: inline void operator=(const label); inline void operator=(const floatScalar); inline void operator=(const doubleScalar); + inline void operator=(const longDoubleScalar); inline void operator=(compound*); @@ -408,6 +415,7 @@ public: inline bool operator==(const label) const; inline bool operator==(const floatScalar) const; inline bool operator==(const doubleScalar) const; + inline bool operator==(const longDoubleScalar) const; // Inequality @@ -419,6 +427,7 @@ public: inline bool operator!=(const label) const; inline bool operator!=(const floatScalar) const; inline bool operator!=(const doubleScalar) const; + inline bool operator!=(const longDoubleScalar) const; // IOstream operators diff --git a/src/OpenFOAM/db/IOstreams/token/tokenI.H b/src/OpenFOAM/db/IOstreams/token/tokenI.H index 2f0383c9b2..3c5f47bc50 100644 --- a/src/OpenFOAM/db/IOstreams/token/tokenI.H +++ b/src/OpenFOAM/db/IOstreams/token/tokenI.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -37,6 +37,10 @@ inline void Foam::token::clear() { delete stringTokenPtr_; } + else if (type_ == LONG_DOUBLE_SCALAR) + { + delete longDoubleScalarTokenPtr_; + } else if (type_ == COMPOUND) { if (compoundTokenPtr_->unique()) @@ -98,6 +102,11 @@ inline Foam::token::token(const token& t) doubleScalarToken_ = t.doubleScalarToken_; break; + case LONG_DOUBLE_SCALAR: + longDoubleScalarTokenPtr_ = + new longDoubleScalar(*t.longDoubleScalarTokenPtr_); + break; + case COMPOUND: compoundTokenPtr_ = t.compoundTokenPtr_; compoundTokenPtr_->refCount::operator++(); @@ -157,6 +166,14 @@ inline Foam::token::token(const doubleScalar s, label lineNumber) {} +inline Foam::token::token(const longDoubleScalar s, label lineNumber) +: + type_(LONG_DOUBLE_SCALAR), + longDoubleScalarTokenPtr_(new longDoubleScalar(s)), + lineNumber_(lineNumber) +{} + + // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // inline Foam::token::~token() @@ -307,9 +324,33 @@ inline Foam::doubleScalar Foam::token::doubleScalarToken() const } +inline bool Foam::token::isLongDoubleScalar() const +{ + return (type_ == LONG_DOUBLE_SCALAR); +} + +inline Foam::longDoubleScalar Foam::token::longDoubleScalarToken() const +{ + if (type_ == LONG_DOUBLE_SCALAR) + { + return *longDoubleScalarTokenPtr_; + } + else + { + parseError("longDoubleScalar"); + return 0.0; + } +} + + inline bool Foam::token::isScalar() const { - return (type_ == FLOAT_SCALAR || type_ == DOUBLE_SCALAR); + return + ( + type_ == FLOAT_SCALAR + || type_ == DOUBLE_SCALAR + || type_ == LONG_DOUBLE_SCALAR + ); } inline Foam::scalar Foam::token::scalarToken() const @@ -322,6 +363,10 @@ inline Foam::scalar Foam::token::scalarToken() const { return doubleScalarToken_; } + else if (type_ == LONG_DOUBLE_SCALAR) + { + return *longDoubleScalarTokenPtr_; + } else { parseError(pTraits::typeName); @@ -426,6 +471,11 @@ inline void Foam::token::operator=(const token& t) doubleScalarToken_ = t.doubleScalarToken_; break; + case LONG_DOUBLE_SCALAR: + longDoubleScalarTokenPtr_ = + new longDoubleScalar(*t.longDoubleScalarTokenPtr_); + break; + case COMPOUND: compoundTokenPtr_ = t.compoundTokenPtr_; compoundTokenPtr_->refCount::operator++(); @@ -490,6 +540,13 @@ inline void Foam::token::operator=(const doubleScalar s) doubleScalarToken_ = s; } +inline void Foam::token::operator=(const longDoubleScalar s) +{ + clear(); + type_ = LONG_DOUBLE_SCALAR; + longDoubleScalarTokenPtr_ = new longDoubleScalar(s); +} + inline void Foam::token::operator=(Foam::token::compound* cPtr) { clear(); @@ -530,6 +587,13 @@ inline bool Foam::token::operator==(const token& t) const case DOUBLE_SCALAR: return equal(doubleScalarToken_, t.doubleScalarToken_); + case LONG_DOUBLE_SCALAR: + return equal + ( + *longDoubleScalarTokenPtr_, + *t.longDoubleScalarTokenPtr_ + ); + case COMPOUND: return compoundTokenPtr_ == t.compoundTokenPtr_; @@ -574,6 +638,14 @@ inline bool Foam::token::operator==(const doubleScalar s) const return (type_ == DOUBLE_SCALAR && equal(doubleScalarToken_, s)); } +inline bool Foam::token::operator==(const longDoubleScalar s) const +{ + return + ( + type_ == LONG_DOUBLE_SCALAR && equal(*longDoubleScalarTokenPtr_, s) + ); +} + inline bool Foam::token::operator!=(const token& t) const { return !operator==(t); @@ -604,6 +676,11 @@ inline bool Foam::token::operator!=(const doubleScalar s) const return !operator==(s); } +inline bool Foam::token::operator!=(const longDoubleScalar s) const +{ + return !operator==(s); +} + inline bool Foam::token::operator!=(const label l) const { return !operator==(l); diff --git a/src/OpenFOAM/db/IOstreams/token/tokenIO.C b/src/OpenFOAM/db/IOstreams/token/tokenIO.C index 2a2a8a7006..7ba7fb284b 100644 --- a/src/OpenFOAM/db/IOstreams/token/tokenIO.C +++ b/src/OpenFOAM/db/IOstreams/token/tokenIO.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -88,6 +88,10 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const token& t) os << t.doubleScalarToken_; break; + case token::LONG_DOUBLE_SCALAR: + os << *t.longDoubleScalarTokenPtr_; + break; + case token::COMPOUND: os << *t.compoundTokenPtr_; break; @@ -179,6 +183,10 @@ ostream& Foam::operator<<(ostream& os, const InfoProxy& ip) os << " the doubleScalar " << t.doubleScalarToken(); break; + case token::LONG_DOUBLE_SCALAR: + os << " the longDoubleScalar " << t.longDoubleScalarToken(); + break; + case token::COMPOUND: { if (t.compoundToken().empty()) @@ -251,6 +259,10 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const InfoProxy& ip) os << " the doubleScalar " << t.doubleScalarToken(); break; + case token::LONG_DOUBLE_SCALAR: + os << " the longDoubleScalar " << t.longDoubleScalarToken(); + break; + case token::COMPOUND: { if (t.compoundToken().empty()) diff --git a/src/OpenFOAM/db/dictionary/primitiveEntry/primitiveEntryIO.C b/src/OpenFOAM/db/dictionary/primitiveEntry/primitiveEntryIO.C index 8777819d45..da4cbcac57 100644 --- a/src/OpenFOAM/db/dictionary/primitiveEntry/primitiveEntryIO.C +++ b/src/OpenFOAM/db/dictionary/primitiveEntry/primitiveEntryIO.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -96,7 +96,7 @@ bool Foam::primitiveEntry::read(const dictionary& dict, Istream& is) { is.fatalCheck ( - "primitiveEntry::readData(const dictionary&, Istream&)" + "primitiveEntry::read(const dictionary&, Istream&) start" ); label blockCount = 0; @@ -150,7 +150,7 @@ bool Foam::primitiveEntry::read(const dictionary& dict, Istream& is) is.fatalCheck ( - "primitiveEntry::readData(const dictionary&, Istream&)" + "primitiveEntry::read(const dictionary&, Istream&) end" ); if (currToken.good()) diff --git a/src/OpenFOAM/dimensionSet/dimensionSet.C b/src/OpenFOAM/dimensionSet/dimensionSet.C index e1d51f8f90..90f7606a50 100644 --- a/src/OpenFOAM/dimensionSet/dimensionSet.C +++ b/src/OpenFOAM/dimensionSet/dimensionSet.C @@ -31,8 +31,8 @@ License namespace Foam { -defineTypeNameAndDebug(dimensionSet, 1); -const scalar dimensionSet::smallExponent = small; + defineTypeNameAndDebug(dimensionSet, 1); + const scalar dimensionSet::smallExponent = small; } diff --git a/src/OpenFOAM/meshes/primitiveShapes/plane/plane.C b/src/OpenFOAM/meshes/primitiveShapes/plane/plane.C index 780fc02d3b..e0f9ed1ec2 100644 --- a/src/OpenFOAM/meshes/primitiveShapes/plane/plane.C +++ b/src/OpenFOAM/meshes/primitiveShapes/plane/plane.C @@ -322,9 +322,10 @@ Foam::scalar Foam::plane::normalIntersect const vector& dir ) const { - scalar denom = stabilise((dir & normal_), vSmall); + const scalar num = (point_ - pnt0) & normal_; + const scalar den = dir & normal_; - return ((point_ - pnt0) & normal_)/denom; + return mag(den) > mag(num)*vSmall ? num/den : vGreat; } diff --git a/src/OpenFOAM/primitives/Scalar/longDoubleScalar/longDoubleScalar.C b/src/OpenFOAM/primitives/Scalar/longDoubleScalar/longDoubleScalar.C new file mode 100644 index 0000000000..85d7f4d9d5 --- /dev/null +++ b/src/OpenFOAM/primitives/Scalar/longDoubleScalar/longDoubleScalar.C @@ -0,0 +1,47 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + +#include "longDoubleScalar.H" +#include "IOstreams.H" + +#include + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#define Scalar longDoubleScalar +#define ScalarVGreat longDoubleScalarVGreat +#define ScalarVSmall longDoubleScalarVSmall +#define ScalarRootVGreat longDoubleScalarRootVGreat +#define ScalarRootVSmall longDoubleScalarRootVSmall +#define readScalar readLongDoubleScalar +#include "Scalar.C" +#undef Scalar +#undef ScalarVGreat +#undef ScalarVSmall +#undef ScalarRootVGreat +#undef ScalarRootVSmall +#undef readScalar + +// ************************************************************************* // diff --git a/src/OpenFOAM/primitives/Scalar/longDoubleScalar/longDoubleScalar.H b/src/OpenFOAM/primitives/Scalar/longDoubleScalar/longDoubleScalar.H new file mode 100644 index 0000000000..93c1d87ff4 --- /dev/null +++ b/src/OpenFOAM/primitives/Scalar/longDoubleScalar/longDoubleScalar.H @@ -0,0 +1,175 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2018 OpenFOAM Foundation + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +Typedef + Foam::longDoubleScalar + +Description + Lang double precision floating point scalar type. + +SourceFiles + longDoubleScalar.C + +\*---------------------------------------------------------------------------*/ + +#ifndef longDoubleScalar_H +#define longDoubleScalar_H + +#include "doubleFloat.H" +#include "direction.H" +#include "word.H" + +#include +using std::numeric_limits; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +typedef long double longDoubleScalar; + +// Largest and smallest scalar values allowed in certain parts of the code. +static const longDoubleScalar longDoubleScalarVGreat + = numeric_limits::max()/10; +static const longDoubleScalar longDoubleScalarVSmall + = numeric_limits::min(); + +static const longDoubleScalar longDoubleScalarSmall + = 1e3*numeric_limits::epsilon(); +static const longDoubleScalar longDoubleScalarGreat + = 1.0/longDoubleScalarSmall; + +static const longDoubleScalar longDoubleScalarRootVGreat + = ::sqrtl(longDoubleScalarVGreat); +static const longDoubleScalar longDoubleScalarRootVSmall + = ::sqrtl(longDoubleScalarVSmall); + +static const longDoubleScalar longDoubleScalarRootGreat + = ::sqrtl(longDoubleScalarGreat); +static const longDoubleScalar longDoubleScalarRootSmall + = ::sqrtl(longDoubleScalarSmall); + +//- Read whole of buf as a scalar. Return true if succesful. +inline bool readScalar(const char* buf, longDoubleScalar& s) +{ + char* endPtr; + s = strtold(buf, &endPtr); + + return (*endPtr == '\0'); +} + +#define Scalar longDoubleScalar +#define ScalarVGreat longDoubleScalarVGreat +#define ScalarVSmall longDoubleScalarVSmall +#define ScalarRootVGreat longDoubleScalarRootVGreat +#define ScalarRootVSmall longDoubleScalarRootVSmall +#define readScalar readLongDoubleScalar + +inline Scalar mag(const Scalar s) +{ + return ::fabsl(s); +} + +#define MAXMINPOW(retType, type1, type2) \ + \ +MAXMIN(retType, type1, type2) \ + \ +inline double pow(const type1 s, const type2 e) \ +{ \ + return ::powl(Scalar(s), Scalar(e)); \ +} + +MAXMINPOW(Scalar, Scalar, Scalar) +MAXMINPOW(Scalar, Scalar, int) +MAXMINPOW(Scalar, int, Scalar) +MAXMINPOW(Scalar, Scalar, long) +MAXMINPOW(Scalar, long, Scalar) +MAXMINPOW(Scalar, Scalar, float) +MAXMINPOW(Scalar, float, Scalar) +MAXMINPOW(Scalar, Scalar, double) +MAXMINPOW(Scalar, double, Scalar) + +#undef MAXMINPOW + +#define transFunc(func) \ +inline Scalar func(const Scalar s) \ +{ \ + return ::func(s); \ +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "Scalar.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +inline Scalar hypot(const Scalar x, const Scalar y) +{ + return ::hypotl(x, y); +} + +inline Scalar atan2(const Scalar y, const Scalar x) +{ + return ::atan2l(y, x); +} + +inline Scalar jn(const int n, const Scalar s) +{ + return ::jnl(n, s); +} + +inline Scalar yn(const int n, const Scalar s) +{ + return ::ynl(n, s); +} + +#undef Scalar +#undef ScalarVGreat +#undef ScalarVSmall +#undef ScalarRootVGreat +#undef ScalarRootVSmall +#undef readScalar +#undef transFunc + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/OpenFOAM/primitives/Scalar/scalar/scalar.H b/src/OpenFOAM/primitives/Scalar/scalar/scalar.H index d8810c386f..6c11a950df 100644 --- a/src/OpenFOAM/primitives/Scalar/scalar/scalar.H +++ b/src/OpenFOAM/primitives/Scalar/scalar/scalar.H @@ -26,7 +26,7 @@ Typedef Description Single floating point number identical to float or double depending on - whether WM_SP or WM_DP is defined. + whether WM_SP, WM_DP or WM_LP is defined. SourceFiles scalar.C @@ -38,6 +38,7 @@ SourceFiles #include "floatScalar.H" #include "doubleScalar.H" +#include "longDoubleScalar.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -57,8 +58,6 @@ namespace Foam static const scalar rootSmall = floatScalarRootSmall; static const scalar vSmall = floatScalarVSmall; static const scalar rootVSmall = floatScalarRootVSmall; - - scalar readScalar(Istream& is); } #elif defined(WM_DP) @@ -77,10 +76,30 @@ namespace Foam static const scalar rootSmall = doubleScalarRootSmall; static const scalar vSmall = doubleScalarVSmall; static const scalar rootVSmall = doubleScalarRootVSmall; - - scalar readScalar(Istream& is); } +#elif defined(WM_LP) + +// Define scalar as a long double + +namespace Foam +{ + typedef longDoubleScalar scalar; + + static const scalar great = longDoubleScalarGreat; + static const scalar rootGreat = longDoubleScalarRootGreat; + static const scalar vGreat = longDoubleScalarVGreat; + static const scalar rootVGreat = longDoubleScalarRootVGreat; + static const scalar small = longDoubleScalarSmall; + static const scalar rootSmall = longDoubleScalarRootSmall; + static const scalar vSmall = longDoubleScalarVSmall; + static const scalar rootVSmall = longDoubleScalarRootVSmall; +} + +#else + + #error "Precision not set, please set either WM_SP, WM_DP or WM_LP" + #endif //- Deprecated limit constant for backward-compatibility @@ -96,15 +115,19 @@ namespace Foam static const scalar ROOTVSMALL = rootVSmall; } + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // -// Additional transcendental functions +// Additional global and transcendental functions namespace Foam { + scalar readScalar(Istream& is); + //- Inverse normalized incomplete gamma function scalar invIncGamma(const scalar a, const scalar P); } + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #endif diff --git a/src/OpenFOAM/primitives/one/one.H b/src/OpenFOAM/primitives/one/one.H index b9a88d4412..819cab1a33 100644 --- a/src/OpenFOAM/primitives/one/one.H +++ b/src/OpenFOAM/primitives/one/one.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -80,6 +80,12 @@ public: { return 1; } + + //- Return 1 for double + inline operator long double() const + { + return 1; + } }; diff --git a/src/OpenFOAM/primitives/zero/zero.H b/src/OpenFOAM/primitives/zero/zero.H index b0156929b6..65278c6bae 100644 --- a/src/OpenFOAM/primitives/zero/zero.H +++ b/src/OpenFOAM/primitives/zero/zero.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -85,6 +85,12 @@ public: { return 0; } + + //- Return 0 for double + inline operator long double() const + { + return 0; + } }; diff --git a/src/Pstream/mpi/UPstream.C b/src/Pstream/mpi/UPstream.C index 51306bf7f2..ab231d59df 100644 --- a/src/Pstream/mpi/UPstream.C +++ b/src/Pstream/mpi/UPstream.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2017 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -44,6 +44,8 @@ Note #define MPI_SCALAR MPI_FLOAT #elif defined(WM_DP) #define MPI_SCALAR MPI_DOUBLE +#elif defined(WM_LP) + #define MPI_SCALAR MPI_LONG_DOUBLE #endif // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/surfMesh/surfaceFormats/obj/OBJstream.C b/src/surfMesh/surfaceFormats/obj/OBJstream.C index 695e518528..6e24ccef85 100644 --- a/src/surfMesh/surfaceFormats/obj/OBJstream.C +++ b/src/surfMesh/surfaceFormats/obj/OBJstream.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2012-2016 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2012-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -105,7 +105,7 @@ Foam::Ostream& Foam::OBJstream::write(const word& str) Foam::Ostream& Foam::OBJstream::write(const string& str) { - OFstream::write(token::BEGIN_STRING); + OFstream::write(char(token::BEGIN_STRING)); int backslash = 0; for (string::const_iterator iter = str.begin(); iter != str.end(); ++iter) @@ -141,7 +141,7 @@ Foam::Ostream& Foam::OBJstream::write(const string& str) // silently drop any trailing backslashes // they would otherwise appear like an escaped end-quote - OFstream::write(token::END_STRING); + OFstream::write(char(token::END_STRING)); return *this; } @@ -154,7 +154,7 @@ Foam::Ostream& Foam::OBJstream::writeQuoted { if (quoted) { - OFstream::write(token::BEGIN_STRING); + OFstream::write(char(token::BEGIN_STRING)); int backslash = 0; for @@ -194,7 +194,7 @@ Foam::Ostream& Foam::OBJstream::writeQuoted // silently drop any trailing backslashes // they would otherwise appear like an escaped end-quote - OFstream::write(token::END_STRING); + OFstream::write(char(token::END_STRING)); } else { diff --git a/src/surfMesh/surfaceFormats/stl/STLpoint.H b/src/surfMesh/surfaceFormats/stl/STLpoint.H index eb0d9fccd2..28e1ad0095 100644 --- a/src/surfMesh/surfaceFormats/stl/STLpoint.H +++ b/src/surfMesh/surfaceFormats/stl/STLpoint.H @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2018 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -80,7 +80,7 @@ public: // Member Operators - #ifdef WM_DP + #if defined(WM_DP) || defined(WM_LP) //- Conversion to double-precision point inline operator point() const {