From 399c21d76c46392739cc045b024d46cfe39bd7b6 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Tue, 20 Apr 2021 11:15:41 +0200 Subject: [PATCH] ENH: adjustments for Function1/PatchFunction1 - additional debug information - improve support for dictionary specification of constant, polynomial and table entries. These previously only worked properly for primitiveEntry, which causes confusion. - extend table Function1 to include TableFile functionality. Simplifies switching and modifying content. --- applications/test/Function1/Make/options | 13 +-- applications/test/Function1/Test-Function1.C | 5 +- .../case1/constant/function1Properties | 35 +++++- .../Function1/case1/constant/table-values | 9 ++ .../primitives/functions/Function1/CSV/CSV.H | 4 +- .../functions/Function1/Constant/Constant.C | 32 ++++-- .../functions/Function1/Constant/Constant.H | 25 +++-- .../functions/Function1/Cosine/Cosine.H | 4 +- .../functions/Function1/Function1/Function1.H | 2 +- .../Function1/Function1/Function1New.C | 26 +++-- .../Function1/Function1/function1Base.H | 2 +- .../Function1/LimitRange/LimitRange.H | 33 +++--- .../functions/Function1/One/OneConstant.H | 6 +- .../PolynomialEntry.C | 102 +++++++++--------- .../PolynomialEntry.H | 31 ++++-- .../functions/Function1/Scale/Scale.H | 6 +- .../functions/Function1/Sine/Sine.H | 4 +- .../functions/Function1/Square/Square.H | 4 +- .../functions/Function1/Table/Table.C | 82 ++++++++++++-- .../functions/Function1/Table/Table.H | 58 ++++++++-- .../functions/Function1/Table/TableBase.H | 4 +- .../functions/Function1/TableFile/TableFile.H | 7 +- .../functions/Function1/Uniform/Uniform.H | 4 +- .../functions/Function1/Zero/ZeroConstant.H | 17 ++- .../Function1/halfCosineRamp/halfCosineRamp.H | 4 +- .../Function1/linearRamp/linearRamp.H | 4 +- .../Function1/quadraticRamp/quadraticRamp.H | 4 +- .../quarterCosineRamp/quarterCosineRamp.H | 4 +- .../quarterSineRamp/quarterSineRamp.H | 4 +- .../functions/Function1/ramp/ramp.H | 4 +- .../functions/Function1/step/stepFunction.H | 4 +- src/engine/engineTime/freePiston/freePiston.H | 13 ++- .../derived/fan/fanFvPatchFields.C | 2 - .../fanPressureFvPatchScalarField.H | 10 +- .../ConstantField/ConstantField.C | 47 ++++---- .../PatchFunction1/PatchFunction1New.C | 25 +++-- .../fireFoam/LES/compartmentFire/0/U | 6 +- .../pimpleFoam/RAS/TJunctionFan/0.orig/p | 7 +- .../laminar/steamInjection/system/controlDict | 7 +- 39 files changed, 437 insertions(+), 223 deletions(-) create mode 100644 applications/test/Function1/case1/constant/table-values rename src/OpenFOAM/primitives/functions/Function1/{PolynomialEntry => Polynomial}/PolynomialEntry.C (78%) rename src/OpenFOAM/primitives/functions/Function1/{PolynomialEntry => Polynomial}/PolynomialEntry.H (86%) diff --git a/applications/test/Function1/Make/options b/applications/test/Function1/Make/options index b8e72a86c6..15bfa4c12c 100644 --- a/applications/test/Function1/Make/options +++ b/applications/test/Function1/Make/options @@ -1,15 +1,6 @@ EXE_INC = \ - -DFULLDEBUG -g -O0 \ - -I$(LIB_SRC)/lagrangian/intermediate/lnInclude \ - -I$(LIB_SRC)/thermophysicalModels/radiation/lnInclude \ - -I$(LIB_SRC)/thermophysicalModels/thermophysicalFunctions/lnInclude \ - -I$(LIB_SRC)/finiteVolume/lnInclude \ + -DFULLDEBUG -g \ -I$(LIB_SRC)/meshTools/lnInclude EXE_LIBS = \ - -llagrangianIntermediate \ - -lradiationModels \ - -lregionModels \ - -lfiniteVolume \ - -lmeshTools \ - -lsampling + -lmeshTools diff --git a/applications/test/Function1/Test-Function1.C b/applications/test/Function1/Test-Function1.C index 4397397582..be8b1de67d 100644 --- a/applications/test/Function1/Test-Function1.C +++ b/applications/test/Function1/Test-Function1.C @@ -32,7 +32,8 @@ Description \*---------------------------------------------------------------------------*/ -#include "fvCFD.H" +#include "argList.H" +#include "IOstreams.H" #include "Function1.H" #include "scalarIndList.H" #include "scalarField.H" @@ -40,6 +41,8 @@ Description #include "linearInterpolationWeights.H" #include "splineInterpolationWeights.H" +using namespace Foam; + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // int main(int argc, char *argv[]) diff --git a/applications/test/Function1/case1/constant/function1Properties b/applications/test/Function1/case1/constant/function1Properties index e13a90bfcc..3d0aad3c87 100644 --- a/applications/test/Function1/case1/constant/function1Properties +++ b/applications/test/Function1/case1/constant/function1Properties @@ -26,11 +26,44 @@ x ); -function1 table +constant1 constant 100; + +table1 table ( (0 0)(10 1) ); +table2 +{ + type table; + values + ( + (0 0)(10 1) + ); +} + +table3 +{ + type table; + file "/table-values"; +} + +poly1 polynomial +( + (0 1) + (1 1) +); + +poly2 +{ + type polynomial; + coeffs + ( + (0 1) + (1 1) + ); +} + function2 { type expression; diff --git a/applications/test/Function1/case1/constant/table-values b/applications/test/Function1/case1/constant/table-values new file mode 100644 index 0000000000..2212656124 --- /dev/null +++ b/applications/test/Function1/case1/constant/table-values @@ -0,0 +1,9 @@ +// -*- C++ -*- +// Some table values + +( + (0 0) + (20 1) +); + +// ************************************************************************* // diff --git a/src/OpenFOAM/primitives/functions/Function1/CSV/CSV.H b/src/OpenFOAM/primitives/functions/Function1/CSV/CSV.H index 6b7a451a17..1c5a2bb693 100644 --- a/src/OpenFOAM/primitives/functions/Function1/CSV/CSV.H +++ b/src/OpenFOAM/primitives/functions/Function1/CSV/CSV.H @@ -53,8 +53,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef CSV_H -#define CSV_H +#ifndef Function1Types_CSV_H +#define Function1Types_CSV_H #include "Function1.H" #include "TableBase.H" diff --git a/src/OpenFOAM/primitives/functions/Function1/Constant/Constant.C b/src/OpenFOAM/primitives/functions/Function1/Constant/Constant.C index 60fe1d6a04..36c764e895 100644 --- a/src/OpenFOAM/primitives/functions/Function1/Constant/Constant.C +++ b/src/OpenFOAM/primitives/functions/Function1/Constant/Constant.C @@ -52,9 +52,29 @@ Foam::Function1Types::Constant::Constant Function1(entryName, dict), value_(Zero) { - ITstream& is = dict.lookup(entryName); - word entryType(is); - is >> value_; + const entry* eptr = dict.findEntry(entryName, keyType::LITERAL); + + if (eptr && eptr->isStream()) + { + // Primitive (inline) format. Eg, + // - key constant 1.2; + // - key 1.2; + + ITstream& is = eptr->stream(); + if (is.peek().isWord()) + { + is.skip(); // Discard leading 'constant' + } + is >> value_; + dict.checkITstream(is, entryName); + } + else + { + // Dictionary format. Eg, + // key { type constant; value 1.2; } + + dict.readEntry("value", value_); + } } @@ -71,10 +91,10 @@ Foam::Function1Types::Constant::Constant template -Foam::Function1Types::Constant::Constant(const Constant& cnst) +Foam::Function1Types::Constant::Constant(const Constant& rhs) : - Function1(cnst), - value_(cnst.value_) + Function1(rhs), + value_(rhs.value_) {} diff --git a/src/OpenFOAM/primitives/functions/Function1/Constant/Constant.H b/src/OpenFOAM/primitives/functions/Function1/Constant/Constant.H index 03ad51f379..4dfac6e68a 100644 --- a/src/OpenFOAM/primitives/functions/Function1/Constant/Constant.H +++ b/src/OpenFOAM/primitives/functions/Function1/Constant/Constant.H @@ -30,18 +30,31 @@ Class Description Templated function that returns a constant value. - Usage - for entry \ returning the value : + Usage - for entry \ returning the value \, + can be specified is different formats. + + Inline specification: \verbatim - constant + constant + \endverbatim + + Dictionary format: + \verbatim + + { + type constant; + value ; + } \endverbatim SourceFiles Constant.C + ConstantI.H \*---------------------------------------------------------------------------*/ -#ifndef Constant_H -#define Constant_H +#ifndef Function1Types_Constant_H +#define Function1Types_Constant_H #include "Function1.H" @@ -93,7 +106,7 @@ public: Constant(const word& entryName, Istream& is); //- Copy constructor - explicit Constant(const Constant& cnst); + explicit Constant(const Constant& rhs); //- Construct and return a clone virtual tmp> clone() const @@ -117,7 +130,7 @@ public: //- Return value as a function of (scalar) independent variable virtual tmp> value(const scalarField& x) const; - //- Write in dictionary format + //- Write as primitive (inline) format virtual void writeData(Ostream& os) const; }; diff --git a/src/OpenFOAM/primitives/functions/Function1/Cosine/Cosine.H b/src/OpenFOAM/primitives/functions/Function1/Cosine/Cosine.H index 63705cce70..08383ac1c9 100644 --- a/src/OpenFOAM/primitives/functions/Function1/Cosine/Cosine.H +++ b/src/OpenFOAM/primitives/functions/Function1/Cosine/Cosine.H @@ -96,8 +96,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef function1Types_Cosine_H -#define function1Types_Cosine_H +#ifndef Function1Types_Cosine_H +#define Function1Types_Cosine_H #include "Sine.H" diff --git a/src/OpenFOAM/primitives/functions/Function1/Function1/Function1.H b/src/OpenFOAM/primitives/functions/Function1/Function1/Function1.H index 5ff592788b..41d4f5e06e 100644 --- a/src/OpenFOAM/primitives/functions/Function1/Function1/Function1.H +++ b/src/OpenFOAM/primitives/functions/Function1/Function1/Function1.H @@ -143,7 +143,7 @@ public: //- Construct from entry name explicit Function1(const word& entryName); - //- Construct from entry name and dictionary + //- Construct from entry name and dictionary (unused) Function1(const word& entryName, const dictionary& dict); //- Copy construct diff --git a/src/OpenFOAM/primitives/functions/Function1/Function1/Function1New.C b/src/OpenFOAM/primitives/functions/Function1/Function1/Function1New.C index ada2eaab2e..ae20893b4a 100644 --- a/src/OpenFOAM/primitives/functions/Function1/Function1/Function1New.C +++ b/src/OpenFOAM/primitives/functions/Function1/Function1/Function1New.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2017 OpenFOAM Foundation - Copyright (C) 2018-2020 OpenCFD Ltd. + Copyright (C) 2018-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -49,6 +49,10 @@ Foam::Function1::New { // Dictionary entry + DebugInFunction + << "For " << entryName << " with dictionary entries: " + << flatOutput(coeffs->toc()) << nl; + coeffs->readEntry ( "type", @@ -62,17 +66,21 @@ Foam::Function1::New else if (eptr) { // Primitive entry - // - non-word : value for constant function // - word : the modelType + // - non-word : value for constant function + + DebugInFunction + << "For " << entryName << " with primitive entry" << nl; ITstream& is = eptr->stream(); - token firstToken(is); - - if (!firstToken.isWord()) + if (is.peek().isWord()) { - // A value - is.putBack(firstToken); + modelType = is.peek().wordToken(); + } + else + { + // A value - compatibility for reading constant const Type constValue = pTraits(is); @@ -81,10 +89,6 @@ Foam::Function1::New new Function1Types::Constant(entryName, constValue) ); } - else - { - modelType = firstToken.wordToken(); - } // Fallthrough } diff --git a/src/OpenFOAM/primitives/functions/Function1/Function1/function1Base.H b/src/OpenFOAM/primitives/functions/Function1/Function1/function1Base.H index 4aa9bf68ea..a3191c7924 100644 --- a/src/OpenFOAM/primitives/functions/Function1/Function1/function1Base.H +++ b/src/OpenFOAM/primitives/functions/Function1/Function1/function1Base.H @@ -81,7 +81,7 @@ public: //- Construct from entry name explicit function1Base(const word& entryName); - //- Construct from entry name and dictionary + //- Construct from entry name and dictionary (unused) function1Base(const word& entryName, const dictionary& dict); //- Copy construct diff --git a/src/OpenFOAM/primitives/functions/Function1/LimitRange/LimitRange.H b/src/OpenFOAM/primitives/functions/Function1/LimitRange/LimitRange.H index b580f90d10..e167ebba3c 100644 --- a/src/OpenFOAM/primitives/functions/Function1/LimitRange/LimitRange.H +++ b/src/OpenFOAM/primitives/functions/Function1/LimitRange/LimitRange.H @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2020 OpenCFD Ltd. + Copyright (C) 2020-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -31,13 +31,13 @@ Description Example usage for limiting a polynomial: \verbatim - limitedPolyTest limitRange; - limitedPolyTestCoeffs + { - min 0.4; - max 1.4; + type limitRange; + min 0.4; + max 1.4; - value polynomial + value polynomial ( (5 1) (-2 2) @@ -53,16 +53,19 @@ Description - poly(x) for 0.4 < x < 1.4. - Example usage for limiting a table + Example usage for limiting a file-based table: \verbatim - limitedTableFileTest limitRange; - limitedTableFileTestCoeffs + { - min 0.4; - max 1.4; + type limitRange; + min 0.4; + max 1.4; - value tableFile; - file "/fanCurve.txt"; + value + { + type table; + file "/fanCurve.txt"; + } } \endverbatim @@ -79,8 +82,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef LimitRange_H -#define LimitRange_H +#ifndef Function1Types_LimitRange_H +#define Function1Types_LimitRange_H #include "Function1.H" diff --git a/src/OpenFOAM/primitives/functions/Function1/One/OneConstant.H b/src/OpenFOAM/primitives/functions/Function1/One/OneConstant.H index 9c19abc14b..a072e0432d 100644 --- a/src/OpenFOAM/primitives/functions/Function1/One/OneConstant.H +++ b/src/OpenFOAM/primitives/functions/Function1/One/OneConstant.H @@ -40,8 +40,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef OneConstant_H -#define OneConstant_H +#ifndef Function1Types_OneConstant_H +#define Function1Types_OneConstant_H #include "Function1.H" @@ -110,7 +110,7 @@ public: const scalarField& x2 ) const; - //- Write in dictionary format + //- Write as primitive (inline) format virtual void writeData(Ostream& os) const; }; diff --git a/src/OpenFOAM/primitives/functions/Function1/PolynomialEntry/PolynomialEntry.C b/src/OpenFOAM/primitives/functions/Function1/Polynomial/PolynomialEntry.C similarity index 78% rename from src/OpenFOAM/primitives/functions/Function1/PolynomialEntry/PolynomialEntry.C rename to src/OpenFOAM/primitives/functions/Function1/Polynomial/PolynomialEntry.C index 7966abe85a..b5b2cc6cfe 100644 --- a/src/OpenFOAM/primitives/functions/Function1/PolynomialEntry/PolynomialEntry.C +++ b/src/OpenFOAM/primitives/functions/Function1/Polynomial/PolynomialEntry.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation - Copyright (C) 2020 OpenCFD Ltd. + Copyright (C) 2020-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -28,6 +28,37 @@ License #include "PolynomialEntry.H" +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +template +void Foam::Function1Types::Polynomial::checkCoefficients() +{ + if (coeffs_.empty()) + { + FatalErrorInFunction + << "Invalid (empty) polynomial coefficients for " + << this->name() << nl + << exit(FatalError); + } + + for (const auto& coeff : coeffs_) + { + if (mag(coeff.second() + pTraits::one) < ROOTVSMALL) + { + canIntegrate_ = false; + break; + } + } + + if (debug && !canIntegrate_) + { + WarningInFunction + << "Polynomial " << this->name() << " cannot be integrated" + << endl; + } +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // template @@ -41,37 +72,31 @@ Foam::Function1Types::Polynomial::Polynomial coeffs_(), canIntegrate_(true) { - ITstream& is = dict.lookup(entryName); - const word entryType(is); + const entry* eptr = dict.findEntry(entryName, keyType::LITERAL); - is >> coeffs_; - - if (!coeffs_.size()) + if (eptr && eptr->isStream()) { - FatalErrorInFunction - << "Invalid (empty) polynomial coefficients for " - << this->name() << nl - << exit(FatalError); - } + // Primitive (inline) format. Eg, + // key polynomial ((0 0) (10 1)); - forAll(coeffs_, i) - { - if (mag(coeffs_[i].second() + pTraits::one) < ROOTVSMALL) + ITstream& is = eptr->stream(); + if (is.peek().isWord()) { - canIntegrate_ = false; - break; + is.skip(); // Discard leading 'polynomial' } + is >> this->coeffs_; + dict.checkITstream(is, entryName); + } + else + { + // Dictionary format - "values" lookup. Eg, + // + // key { type polynomial; coeffs ((0 0) (10 1)); } + + dict.readEntry("coeffs", this->coeffs_); } - if (debug) - { - if (!canIntegrate_) - { - WarningInFunction - << "Polynomial " << this->name() << " cannot be integrated" - << endl; - } - } + this->checkCoefficients(); } @@ -86,32 +111,7 @@ Foam::Function1Types::Polynomial::Polynomial coeffs_(coeffs), canIntegrate_(true) { - if (!coeffs_.size()) - { - FatalErrorInFunction - << "Invalid (empty) polynomial coefficients for " - << this->name() << nl - << exit(FatalError); - } - - forAll(coeffs_, i) - { - if (mag(coeffs_[i].second() + 1) < ROOTVSMALL) - { - canIntegrate_ = false; - break; - } - } - - if (debug) - { - if (!canIntegrate_) - { - WarningInFunction - << "Polynomial " << this->name() << " cannot be integrated" - << endl; - } - } + this->checkCoefficients(); } diff --git a/src/OpenFOAM/primitives/functions/Function1/PolynomialEntry/PolynomialEntry.H b/src/OpenFOAM/primitives/functions/Function1/Polynomial/PolynomialEntry.H similarity index 86% rename from src/OpenFOAM/primitives/functions/Function1/PolynomialEntry/PolynomialEntry.H rename to src/OpenFOAM/primitives/functions/Function1/Polynomial/PolynomialEntry.H index 78724aa5ff..6fc5cf9249 100644 --- a/src/OpenFOAM/primitives/functions/Function1/PolynomialEntry/PolynomialEntry.H +++ b/src/OpenFOAM/primitives/functions/Function1/Polynomial/PolynomialEntry.H @@ -6,6 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2017 OpenFOAM Foundation + Copyright (C) 2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -31,21 +32,35 @@ Description list of Tuple2's. Data is input in the form, e.g. for an entry \ that describes y = x^2 + 2x^3 + Inline specification: \verbatim polynomial ( - (1 2) - (2 3) + (1 2) + (2 3) ); \endverbatim + Dictionary format: + \verbatim + + { + type polynomial; + coeffs + ( + (1 2) + (2 3) + ); + } + \endverbatim + SourceFiles PolynomialEntry.C \*---------------------------------------------------------------------------*/ -#ifndef PolynomialEntry_H -#define PolynomialEntry_H +#ifndef Function1Types_Polynomial_H +#define Function1Types_Polynomial_H #include "Function1.H" #include "Tuple2.H" @@ -72,12 +87,15 @@ class Polynomial //- Polynomial coefficients - list of prefactor, exponent List> coeffs_; - //- Flag to indicate whether poly can be integrated + //- Flag to indicate whether polynomial can be integrated bool canIntegrate_; // Private Member Functions + //- Check coefficients and if polynomial can be integrated + void checkCoefficients(); + //- No copy assignment void operator=(const Polynomial&) = delete; @@ -125,8 +143,7 @@ public: //- Integrate between two (scalar) values virtual Type integrate(const scalar x1, const scalar x2) const; - - //- Write in dictionary format + //- Write as primitive (inline) format virtual void writeData(Ostream& os) const; }; diff --git a/src/OpenFOAM/primitives/functions/Function1/Scale/Scale.H b/src/OpenFOAM/primitives/functions/Function1/Scale/Scale.H index 86186109cd..7077203b59 100644 --- a/src/OpenFOAM/primitives/functions/Function1/Scale/Scale.H +++ b/src/OpenFOAM/primitives/functions/Function1/Scale/Scale.H @@ -63,8 +63,8 @@ Description Where: \table Property | Description | Required - value | Function of type Function1 | yes scale | Scaling function of type Function1 | yes + value | Function of type Function1 | yes \endtable SourceFiles @@ -72,8 +72,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef Scale_H -#define Scale_H +#ifndef Function1Types_Scale_H +#define Function1Types_Scale_H #include "Function1.H" diff --git a/src/OpenFOAM/primitives/functions/Function1/Sine/Sine.H b/src/OpenFOAM/primitives/functions/Function1/Sine/Sine.H index f580978278..64096352e7 100644 --- a/src/OpenFOAM/primitives/functions/Function1/Sine/Sine.H +++ b/src/OpenFOAM/primitives/functions/Function1/Sine/Sine.H @@ -98,8 +98,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef function1Types_Sine_H -#define function1Types_Sine_H +#ifndef Function1Types_Sine_H +#define Function1Types_Sine_H #include "Function1.H" diff --git a/src/OpenFOAM/primitives/functions/Function1/Square/Square.H b/src/OpenFOAM/primitives/functions/Function1/Square/Square.H index 730dc29cb3..c79f6e12f3 100644 --- a/src/OpenFOAM/primitives/functions/Function1/Square/Square.H +++ b/src/OpenFOAM/primitives/functions/Function1/Square/Square.H @@ -101,8 +101,8 @@ Note \*---------------------------------------------------------------------------*/ -#ifndef function1Types_Square_H -#define function1Types_Square_H +#ifndef Function1Types_Square_H +#define Function1Types_Square_H #include "Sine.H" diff --git a/src/OpenFOAM/primitives/functions/Function1/Table/Table.C b/src/OpenFOAM/primitives/functions/Function1/Table/Table.C index 23f2e7d6c5..cb57b87502 100644 --- a/src/OpenFOAM/primitives/functions/Function1/Table/Table.C +++ b/src/OpenFOAM/primitives/functions/Function1/Table/Table.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation - Copyright (C) 2019-2020 OpenCFD Ltd. + Copyright (C) 2019-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -37,11 +37,53 @@ Foam::Function1Types::Table::Table const dictionary& dict ) : - TableBase(entryName, dict) + TableBase(entryName, dict), + fName_() { - ITstream& is = dict.lookup(entryName); - const word entryType(is); - is >> this->table_; + const entry* eptr = dict.findEntry(entryName, keyType::LITERAL); + + if (eptr && eptr->isStream()) + { + // Primitive (inline) format. Eg, + // key table ((0 0) (10 1)); + + ITstream& is = eptr->stream(); + if (is.peek().isWord()) + { + is.skip(); // Discard leading 'table' + } + is >> this->table_; + dict.checkITstream(is, entryName); + } + else if (dict.readIfPresent("file", fName_)) + { + // Dictionary format - "file" lookup. Eg, + // key { type table; file "name"; } + + fileName expandedFile(fName_); + expandedFile.expand(); + + autoPtr isPtr(fileHandler().NewIFstream(expandedFile)); + if (isPtr && isPtr->good()) + { + *isPtr >> this->table_; + } + else + { + FatalIOErrorInFunction(dict) + << "Cannot open file: " << expandedFile << nl + << exit(FatalIOError); + } + } + else + { + // Dictionary format - "values" lookup. Eg, + // + // key { type table; values ((0 0) (10 1)); } + + dict.readEntry("values", this->table_); + } + TableBase::check(); } @@ -49,8 +91,36 @@ Foam::Function1Types::Table::Table template Foam::Function1Types::Table::Table(const Table& tbl) : - TableBase(tbl) + TableBase(tbl), + fName_(tbl.fName_) {} +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template +void Foam::Function1Types::Table::writeData(Ostream& os) const +{ + Function1::writeData(os); + os.endEntry(); + + os.beginBlock(word(this->name() + "Coeffs")); + + // Note: for TableBase write the dictionary entries it needs but not + // the values themselves + TableBase::writeEntries(os); + + if (fName_.empty()) + { + os.writeEntry("values", this->table_); + } + else + { + os.writeEntry("file", fName_); + } + + os.endBlock(); +} + + // ************************************************************************* // diff --git a/src/OpenFOAM/primitives/functions/Function1/Table/Table.H b/src/OpenFOAM/primitives/functions/Function1/Table/Table.H index 279ac939ba..154e18c8e2 100644 --- a/src/OpenFOAM/primitives/functions/Function1/Table/Table.H +++ b/src/OpenFOAM/primitives/functions/Function1/Table/Table.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2017 OpenFOAM Foundation - Copyright (C) 2019 OpenCFD Ltd. + Copyright (C) 2019-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -30,10 +30,12 @@ Class Description Templated table container function. - Items are stored in a list of Tuple2's. First column is always stored as - scalar entries. Data is read in Tuple2 form. + Items are stored in a list of Tuple2, with the first column always + being a scalar and the second column (the lookup value) in + required data type. Usage: + Inline specification. \verbatim table ( @@ -42,13 +44,43 @@ Description ); \endverbatim + Dictionary specification, external data reference. + \verbatim + + { + type table; + file "/path/tableValues"; + } + \endverbatim + + Dictionary specification, embedded content + Dictionary form. + \verbatim + + { + type table; + values + ( + (0.0 (1 2 3)) + (1.0 (4 5 6)) + ); + } + \endverbatim + +Note + The external data reference (using the \c file keyword) is + used in preference to the \c values specification. + +See Also + Foam::Function1Types::TableFile + SourceFiles Table.C \*---------------------------------------------------------------------------*/ -#ifndef Table_H -#define Table_H +#ifndef Function1Types_Table_H +#define Function1Types_Table_H #include "TableBase.H" @@ -68,6 +100,12 @@ class Table : public TableBase { + // Private Data + + //- Input name for file-based input (optional) + fileName fName_; + + // Private Member Functions //- No copy assignment @@ -81,10 +119,10 @@ public: // Constructors - //- Construct from entry name and dictionary + //- Construct from entry name and dictionary. Table(const word& entryName, const dictionary& dict); - //- Copy constructor + //- Copy construct explicit Table(const Table& tbl); //- Construct and return a clone @@ -96,6 +134,12 @@ public: //- Destructor virtual ~Table() = default; + + + // Member Functions + + //- Write coefficients in dictionary format + virtual void writeData(Ostream& os) const; }; diff --git a/src/OpenFOAM/primitives/functions/Function1/Table/TableBase.H b/src/OpenFOAM/primitives/functions/Function1/Table/TableBase.H index 82361382bd..57b05c7f2b 100644 --- a/src/OpenFOAM/primitives/functions/Function1/Table/TableBase.H +++ b/src/OpenFOAM/primitives/functions/Function1/Table/TableBase.H @@ -35,8 +35,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef TableBase_H -#define TableBase_H +#ifndef Function1Types_TableBase_H +#define Function1Types_TableBase_H #include "tableBounds.H" #include "Function1.H" diff --git a/src/OpenFOAM/primitives/functions/Function1/TableFile/TableFile.H b/src/OpenFOAM/primitives/functions/Function1/TableFile/TableFile.H index 76d210a786..cabe6e2d9f 100644 --- a/src/OpenFOAM/primitives/functions/Function1/TableFile/TableFile.H +++ b/src/OpenFOAM/primitives/functions/Function1/TableFile/TableFile.H @@ -51,13 +51,16 @@ Description ); \endverbatim +See Also + Foam::Function1Types::Table + SourceFiles TableFile.C \*---------------------------------------------------------------------------*/ -#ifndef TableFile_H -#define TableFile_H +#ifndef Function1Types_TableFile_H +#define Function1Types_TableFile_H #include "TableBase.H" diff --git a/src/OpenFOAM/primitives/functions/Function1/Uniform/Uniform.H b/src/OpenFOAM/primitives/functions/Function1/Uniform/Uniform.H index 46078cea7d..805480f504 100644 --- a/src/OpenFOAM/primitives/functions/Function1/Uniform/Uniform.H +++ b/src/OpenFOAM/primitives/functions/Function1/Uniform/Uniform.H @@ -43,8 +43,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef Uniform_H -#define Uniform_H +#ifndef Function1Types_Uniform_H +#define Function1Types_Uniform_H #include "Function1.H" diff --git a/src/OpenFOAM/primitives/functions/Function1/Zero/ZeroConstant.H b/src/OpenFOAM/primitives/functions/Function1/Zero/ZeroConstant.H index 2393d949dc..8563f6663d 100644 --- a/src/OpenFOAM/primitives/functions/Function1/Zero/ZeroConstant.H +++ b/src/OpenFOAM/primitives/functions/Function1/Zero/ZeroConstant.H @@ -31,8 +31,17 @@ Description Templated function that returns the corresponding 0 (zero). Usage: + Inline specification: \verbatim - zero; + zero; + \endverbatim + + In dictionary format: + \verbatim + + { + type zero; + } \endverbatim SourceFiles @@ -40,8 +49,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef ZeroConstant_H -#define ZeroConstant_H +#ifndef Function1Types_ZeroConstant_H +#define Function1Types_ZeroConstant_H #include "Function1.H" @@ -94,7 +103,7 @@ public: //- Integrate between two values virtual inline Type integrate(const scalar x1, const scalar x2) const; - //- Write in dictionary format + //- Write as primitive (inline) format virtual void writeData(Ostream& os) const; }; diff --git a/src/OpenFOAM/primitives/functions/Function1/halfCosineRamp/halfCosineRamp.H b/src/OpenFOAM/primitives/functions/Function1/halfCosineRamp/halfCosineRamp.H index 7c1a033267..7d536988e8 100644 --- a/src/OpenFOAM/primitives/functions/Function1/halfCosineRamp/halfCosineRamp.H +++ b/src/OpenFOAM/primitives/functions/Function1/halfCosineRamp/halfCosineRamp.H @@ -39,8 +39,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef halfCosineRamp_H -#define halfCosineRamp_H +#ifndef Function1Types_halfCosineRamp_H +#define Function1Types_halfCosineRamp_H #include "ramp.H" diff --git a/src/OpenFOAM/primitives/functions/Function1/linearRamp/linearRamp.H b/src/OpenFOAM/primitives/functions/Function1/linearRamp/linearRamp.H index 52f2f4d73f..d22271c839 100644 --- a/src/OpenFOAM/primitives/functions/Function1/linearRamp/linearRamp.H +++ b/src/OpenFOAM/primitives/functions/Function1/linearRamp/linearRamp.H @@ -39,8 +39,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef linearRamp_H -#define linearRamp_H +#ifndef Function1Types_linearRamp_H +#define Function1Types_linearRamp_H #include "ramp.H" diff --git a/src/OpenFOAM/primitives/functions/Function1/quadraticRamp/quadraticRamp.H b/src/OpenFOAM/primitives/functions/Function1/quadraticRamp/quadraticRamp.H index 8d4b6f524b..fcdfaeacb1 100644 --- a/src/OpenFOAM/primitives/functions/Function1/quadraticRamp/quadraticRamp.H +++ b/src/OpenFOAM/primitives/functions/Function1/quadraticRamp/quadraticRamp.H @@ -39,8 +39,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef quadraticRamp_H -#define quadraticRamp_H +#ifndef Function1Types_quadraticRamp_H +#define Function1Types_quadraticRamp_H #include "ramp.H" diff --git a/src/OpenFOAM/primitives/functions/Function1/quarterCosineRamp/quarterCosineRamp.H b/src/OpenFOAM/primitives/functions/Function1/quarterCosineRamp/quarterCosineRamp.H index 83950cc72c..275d316e47 100644 --- a/src/OpenFOAM/primitives/functions/Function1/quarterCosineRamp/quarterCosineRamp.H +++ b/src/OpenFOAM/primitives/functions/Function1/quarterCosineRamp/quarterCosineRamp.H @@ -39,8 +39,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef quarterCosineRamp_H -#define quarterCosineRamp_H +#ifndef Function1Types_quarterCosineRamp_H +#define Function1Types_quarterCosineRamp_H #include "ramp.H" diff --git a/src/OpenFOAM/primitives/functions/Function1/quarterSineRamp/quarterSineRamp.H b/src/OpenFOAM/primitives/functions/Function1/quarterSineRamp/quarterSineRamp.H index 88a41fe693..37aec55d7e 100644 --- a/src/OpenFOAM/primitives/functions/Function1/quarterSineRamp/quarterSineRamp.H +++ b/src/OpenFOAM/primitives/functions/Function1/quarterSineRamp/quarterSineRamp.H @@ -38,8 +38,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef quarterSineRamp_H -#define quarterSineRamp_H +#ifndef Function1Types_quarterSineRamp_H +#define Function1Types_quarterSineRamp_H #include "ramp.H" diff --git a/src/OpenFOAM/primitives/functions/Function1/ramp/ramp.H b/src/OpenFOAM/primitives/functions/Function1/ramp/ramp.H index f5767756f0..df7ed6c00b 100644 --- a/src/OpenFOAM/primitives/functions/Function1/ramp/ramp.H +++ b/src/OpenFOAM/primitives/functions/Function1/ramp/ramp.H @@ -66,8 +66,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef ramp_H -#define ramp_H +#ifndef Function1Types_ramp_H +#define Function1Types_ramp_H #include "Function1.H" diff --git a/src/OpenFOAM/primitives/functions/Function1/step/stepFunction.H b/src/OpenFOAM/primitives/functions/Function1/step/stepFunction.H index e4c7466f23..e6a6daa638 100644 --- a/src/OpenFOAM/primitives/functions/Function1/step/stepFunction.H +++ b/src/OpenFOAM/primitives/functions/Function1/step/stepFunction.H @@ -38,8 +38,8 @@ SourceFiles \*---------------------------------------------------------------------------*/ -#ifndef stepFunction_H -#define stepFunction_H +#ifndef Function1Types_stepFunction_H +#define Function1Types_stepFunction_H #include "ramp.H" diff --git a/src/engine/engineTime/freePiston/freePiston.H b/src/engine/engineTime/freePiston/freePiston.H index 46237d0940..1f0a1f10b5 100644 --- a/src/engine/engineTime/freePiston/freePiston.H +++ b/src/engine/engineTime/freePiston/freePiston.H @@ -36,15 +36,14 @@ Description For example, \verbatim - pistonPositionTime table ( (0 0.13) (0.020 0.03) ); + pistonPositionTime table ((0 0.13) (0.020 0.03)); \endverbatim - - or with a tableFile + or \verbatim - pistonPositionTime tableFile; - pistonPositionTimeCoeffs + pistonPositionTime { - fileName "data"; + type table; + file "/pistonPosition.dat"; outOfBounds clamp; interpolationScheme linear; } @@ -76,7 +75,7 @@ class freePiston : public engineTime { - // Private data + // Private Data autoPtr> pistonPositionTime_; diff --git a/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchFields.C b/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchFields.C index 7b260be5d6..c404004e31 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchFields.C +++ b/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchFields.C @@ -30,8 +30,6 @@ License #include "addToRunTimeSelectionTable.H" #include "volFields.H" #include "surfaceFields.H" -#include "Tuple2.H" -#include "PolynomialEntry.H" // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // diff --git a/src/finiteVolume/fields/fvPatchFields/derived/fanPressure/fanPressureFvPatchScalarField.H b/src/finiteVolume/fields/fvPatchFields/derived/fanPressure/fanPressureFvPatchScalarField.H index 7db246e11f..3f3e0acd26 100644 --- a/src/finiteVolume/fields/fvPatchFields/derived/fanPressure/fanPressureFvPatchScalarField.H +++ b/src/finiteVolume/fields/fvPatchFields/derived/fanPressure/fanPressureFvPatchScalarField.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation - Copyright (C) 2017-2020 OpenCFD Ltd + Copyright (C) 2017-2021 OpenCFD Ltd ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -71,11 +71,11 @@ Usage { type fanPressure; direction in; - fanCurve tableFile; - fanCurveCoeffs + fanCurve { - file "/fanCurve"; - outOfBounds clamp; + type table; + file "/fanCurve"; + outOfBounds clamp; // Optional out-of-bounds handling } p0 uniform 0; value uniform 0; diff --git a/src/meshTools/PatchFunction1/ConstantField/ConstantField.C b/src/meshTools/PatchFunction1/ConstantField/ConstantField.C index 7dd8331dbd..4bf7de8738 100644 --- a/src/meshTools/PatchFunction1/ConstantField/ConstantField.C +++ b/src/meshTools/PatchFunction1/ConstantField/ConstantField.C @@ -101,52 +101,43 @@ Foam::PatchFunction1Types::ConstantField::getValue } ITstream& is = eptr->stream(); - // Read first token - token firstToken(is); - - if (firstToken.isWord()) + if (is.peek().isWord()) { - if - ( - firstToken.wordToken() == "uniform" - || firstToken.wordToken() == "constant" - ) + const word contentType(is); + + if (contentType == "uniform" || contentType == "constant") { is >> uniformValue; - fld.setSize(len); + fld.resize(len); fld = uniformValue; } - else if (firstToken.wordToken() == "nonuniform") + else if (contentType == "nonuniform") { - List& list = fld; - is >> list; isUniform = false; - - const label currentSize = fld.size(); - if (currentSize != len) + is >> static_cast&>(fld); + const label lenRead = fld.size(); + if (len != lenRead) { if ( - len < currentSize + len < lenRead && FieldBase::allowConstructFromLargerSize ) { #ifdef FULLDEBUG IOWarningInFunction(dict) - << "Sizes do not match. " - << "Re-sizing " << currentSize - << " entries to " << len - << endl; + << "Sizes do not match. Truncating " << lenRead + << " entries to " << len << endl; #endif - // Resize (shrink) the data - fld.setSize(len); + // Truncate the data + fld.resize(len); } else { FatalIOErrorInFunction(dict) - << "size " << fld.size() - << " is not equal to the given value of " << len + << "size " << lenRead + << " is not equal to the expected length " << len << exit(FatalIOError); } } @@ -156,15 +147,15 @@ Foam::PatchFunction1Types::ConstantField::getValue isUniform = false; FatalIOErrorInFunction(dict) << "Expected keyword 'uniform', 'nonuniform' or 'constant'" - << ", found " << firstToken.wordToken() + << ", found " << contentType << exit(FatalIOError); } } else { - is.putBack(firstToken); + // Uniform (constant) field is >> uniformValue; - fld.setSize(len); + fld.resize(len); fld = uniformValue; } } diff --git a/src/meshTools/PatchFunction1/PatchFunction1/PatchFunction1New.C b/src/meshTools/PatchFunction1/PatchFunction1/PatchFunction1New.C index 33f85c81f2..62ceceb389 100644 --- a/src/meshTools/PatchFunction1/PatchFunction1/PatchFunction1New.C +++ b/src/meshTools/PatchFunction1/PatchFunction1/PatchFunction1New.C @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2018-2020 OpenCFD Ltd. + Copyright (C) 2018-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -49,6 +49,10 @@ Foam::PatchFunction1::New { // Dictionary entry + DebugInFunction + << "For " << entryName << " with dictionary entries: " + << flatOutput(coeffs->toc()) << nl; + coeffs->readEntry ( "type", @@ -60,18 +64,21 @@ Foam::PatchFunction1::New else if (eptr) { // Primitive entry - // - non-word : value for constant (uniform) function // - word : the modelType, or uniform/nonuniform + // - non-word : value for constant (uniform) function + + DebugInFunction + << "For " << entryName << " with primitive entry" << nl; ITstream& is = eptr->stream(); - token firstToken(is); - - // Compatibility for reading straight fields - if (!firstToken.isWord()) + if (is.peek().isWord()) { - // A value - is.putBack(firstToken); + modelType = is.peek().wordToken(); + } + else + { + // A value - compatibility for reading uniform (constant) field const Type constValue = pTraits(is); @@ -88,8 +95,6 @@ Foam::PatchFunction1::New ); } - modelType = firstToken.wordToken(); - // Looks like a normal field entry? if (modelType == "uniform" || modelType == "nonuniform") { diff --git a/tutorials/combustion/fireFoam/LES/compartmentFire/0/U b/tutorials/combustion/fireFoam/LES/compartmentFire/0/U index 1454b0dc71..f2f02ad164 100644 --- a/tutorials/combustion/fireFoam/LES/compartmentFire/0/U +++ b/tutorials/combustion/fireFoam/LES/compartmentFire/0/U @@ -24,10 +24,10 @@ boundaryField inlet { type flowRateInletVelocity; - massFlowRate tableFile; - massFlowRateCoeffs + massFlowRate { - file "/massLossRate"; + type table; + file "/massLossRate"; } value uniform (0 0 0); } diff --git a/tutorials/incompressible/pimpleFoam/RAS/TJunctionFan/0.orig/p b/tutorials/incompressible/pimpleFoam/RAS/TJunctionFan/0.orig/p index b408bc25c1..09476e5c55 100644 --- a/tutorials/incompressible/pimpleFoam/RAS/TJunctionFan/0.orig/p +++ b/tutorials/incompressible/pimpleFoam/RAS/TJunctionFan/0.orig/p @@ -25,11 +25,10 @@ boundaryField { type fanPressure; direction in; - fanCurve tableFile; - fanCurveCoeffs + fanCurve { - file "/FluxVsdP.dat"; - // readerType openFoam; // Default + type table; + file "/FluxVsdP.dat"; // outOfBounds clamp; // Default } //nonDimensional true; diff --git a/tutorials/multiphase/reactingTwoPhaseEulerFoam/laminar/steamInjection/system/controlDict b/tutorials/multiphase/reactingTwoPhaseEulerFoam/laminar/steamInjection/system/controlDict index 54e5ed8675..9f5f0cbfc7 100644 --- a/tutorials/multiphase/reactingTwoPhaseEulerFoam/laminar/steamInjection/system/controlDict +++ b/tutorials/multiphase/reactingTwoPhaseEulerFoam/laminar/steamInjection/system/controlDict @@ -59,8 +59,11 @@ functions type setTimeStep; libs (utilityFunctionObjects); enabled yes; - deltaT tableFile; - file "/deltaTvalues"; + deltaT + { + type table; + file "/deltaTvalues"; + } } minMaxp