diff --git a/applications/test/Function1/Make/options b/applications/test/Function1/Make/options index b8e72a86c6e63b78d92aae9bb56e4ec20fda46b5..15bfa4c12cd1f3d7e02ceac38146fa389a9fc45c 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 43973975826b6a06bffd65842361b47330473b60..be8b1de67df1862b51b4e17858403a46dcfa2b8f 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 e13a90bfcc9177f720ff89bd95a0f4ba11e67095..3d0aad3c87a82fcc65f3b5d6e2760939a6b5f306 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 "<constant>/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 0000000000000000000000000000000000000000..2212656124993d19ef410e0803a9634ca8d6c437 --- /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 6b7a451a17238def1375aef4a7c6da396209a557..1c5a2bb693edf58127bb5c5c93f7138418d3ed85 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 60fe1d6a04a433d322c3a29169c96ca4ac94c8ce..36c764e895e31778d0cef37d2ce322b48fd940f1 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<Type>::Constant Function1<Type>(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<Type>::Constant template<class Type> -Foam::Function1Types::Constant<Type>::Constant(const Constant<Type>& cnst) +Foam::Function1Types::Constant<Type>::Constant(const Constant<Type>& rhs) : - Function1<Type>(cnst), - value_(cnst.value_) + Function1<Type>(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 03ad51f3798fc32843802f6634825c9c0e573815..4dfac6e68a794f05296463fe94a75fba95cb9df4 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 \<entryName\> returning the value <value>: + Usage - for entry \<entryName\> returning the value \<value\>, + can be specified is different formats. + + Inline specification: + \verbatim + <entryName> constant <value> + \endverbatim + + Dictionary format: \verbatim - <entryName> constant <value> + <entryName> + { + type constant; + value <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<Type>& cnst); + explicit Constant(const Constant<Type>& rhs); //- Construct and return a clone virtual tmp<Function1<Type>> clone() const @@ -117,7 +130,7 @@ public: //- Return value as a function of (scalar) independent variable virtual tmp<Field<Type>> 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 63705cce70ad71fc375d1fd0fef8b09158590f5e..08383ac1c93f1fc9aa2d578855b3fc05d864d952 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 5ff592788bcb5a6526d8abbb30ee343a15d9fd1b..41d4f5e06e5e3212c4fa7acdb396c12c849315df 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 ada2eaab2ee15c80b714439e4b88d6243c83130a..ae20893b4a3176c6b318a812bc3b87aa9a295f2c 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<Type>::New { // Dictionary entry + DebugInFunction + << "For " << entryName << " with dictionary entries: " + << flatOutput(coeffs->toc()) << nl; + coeffs->readEntry ( "type", @@ -62,17 +66,21 @@ Foam::Function1<Type>::New else if (eptr) { // Primitive entry - // - non-word : value for constant function // - word : the modelType + // - non-word : value for constant function - ITstream& is = eptr->stream(); + DebugInFunction + << "For " << entryName << " with primitive entry" << nl; - token firstToken(is); + ITstream& is = eptr->stream(); - 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<Type>(is); @@ -81,10 +89,6 @@ Foam::Function1<Type>::New new Function1Types::Constant<Type>(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 4aa9bf68ea29eb6281c408dafc1a53f4211c581b..a3191c7924e4e5ccb4a5ec834b8b92081b327748 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 b580f90d108a798358076ebb8389f4d6ed85f0fc..e167ebba3cb6a9cfb183faf60ee2f0abde11a3c8 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 + <entryName> { - 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 + <entryName> { - min 0.4; - max 1.4; - - value tableFile; - file "<system>/fanCurve.txt"; + type limitRange; + min 0.4; + max 1.4; + + value + { + type table; + file "<system>/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 9c19abc14b28e2cfe178da562efb0cb5bbc0a467..a072e0432d1b38e3c33fc666fee4bad4e7defc04 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 7966abe85a7742ec5fc5733de7d777dbdf93e9cb..b5b2cc6cfed6e84a0bc4612d548ea4a2932e899b 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,25 +28,12 @@ License #include "PolynomialEntry.H" -// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // template<class Type> -Foam::Function1Types::Polynomial<Type>::Polynomial -( - const word& entryName, - const dictionary& dict -) -: - Function1<Type>(entryName, dict), - coeffs_(), - canIntegrate_(true) +void Foam::Function1Types::Polynomial<Type>::checkCoefficients() { - ITstream& is = dict.lookup(entryName); - const word entryType(is); - - is >> coeffs_; - - if (!coeffs_.size()) + if (coeffs_.empty()) { FatalErrorInFunction << "Invalid (empty) polynomial coefficients for " @@ -54,64 +41,77 @@ Foam::Function1Types::Polynomial<Type>::Polynomial << exit(FatalError); } - forAll(coeffs_, i) + for (const auto& coeff : coeffs_) { - if (mag(coeffs_[i].second() + pTraits<Type>::one) < ROOTVSMALL) + if (mag(coeff.second() + pTraits<Type>::one) < ROOTVSMALL) { canIntegrate_ = false; break; } } - if (debug) + if (debug && !canIntegrate_) { - if (!canIntegrate_) - { - WarningInFunction - << "Polynomial " << this->name() << " cannot be integrated" - << endl; - } + WarningInFunction + << "Polynomial " << this->name() << " cannot be integrated" + << endl; } } +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + template<class Type> Foam::Function1Types::Polynomial<Type>::Polynomial ( const word& entryName, - const List<Tuple2<Type, Type>>& coeffs + const dictionary& dict ) : - Function1<Type>(entryName), - coeffs_(coeffs), + Function1<Type>(entryName, dict), + coeffs_(), canIntegrate_(true) { - if (!coeffs_.size()) - { - FatalErrorInFunction - << "Invalid (empty) polynomial coefficients for " - << this->name() << nl - << exit(FatalError); - } + const entry* eptr = dict.findEntry(entryName, keyType::LITERAL); - forAll(coeffs_, i) + if (eptr && eptr->isStream()) { - if (mag(coeffs_[i].second() + 1) < ROOTVSMALL) + // Primitive (inline) format. Eg, + // key polynomial ((0 0) (10 1)); + + ITstream& is = eptr->stream(); + if (is.peek().isWord()) { - canIntegrate_ = false; - break; + is.skip(); // Discard leading 'polynomial' } + is >> this->coeffs_; + dict.checkITstream(is, entryName); } - - if (debug) + else { - if (!canIntegrate_) - { - WarningInFunction - << "Polynomial " << this->name() << " cannot be integrated" - << endl; - } + // Dictionary format - "values" lookup. Eg, + // + // key { type polynomial; coeffs ((0 0) (10 1)); } + + dict.readEntry("coeffs", this->coeffs_); } + + this->checkCoefficients(); +} + + +template<class Type> +Foam::Function1Types::Polynomial<Type>::Polynomial +( + const word& entryName, + const List<Tuple2<Type, Type>>& coeffs +) +: + Function1<Type>(entryName), + coeffs_(coeffs), + canIntegrate_(true) +{ + 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 78724aa5ff52ca797d3aa67c4a96665e7add4c5c..6fc5cf924973d15fcbd175e0bb2b90a321b0e951 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 \<entryName\> that describes y = x^2 + 2x^3 + Inline specification: \verbatim <entryName> polynomial ( - (1 2) - (2 3) + (1 2) + (2 3) ); \endverbatim + Dictionary format: + \verbatim + <entryName> + { + 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<Tuple2<Type, Type>> 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<Type>&) = 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 86186109cd6ab5d5c8032a5d279c05f05210cc2c..7077203b59ca6eb4f2087e129f1c48d21beb3622 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<Type> | yes scale | Scaling function of type Function1<scalar> | yes + value | Function of type Function1<Type> | 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 f580978278789cba304ee6a2f6937f0b5345419f..64096352e7cdf5878e17c1417cc57f0a1fb78905 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 730dc29cb3ff0d2fe48441da1dc59183782d85b0..c79f6e12f3d3292bb0777de9f9393b236a4f6062 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 23f2e7d6c55c6794b50c448edcf960f9b8fa7340..cb57b8750231aeec565531f740759bbd53ef2e93 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<Type>::Table const dictionary& dict ) : - TableBase<Type>(entryName, dict) + TableBase<Type>(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<ISstream> 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<Type>::check(); } @@ -49,8 +91,36 @@ Foam::Function1Types::Table<Type>::Table template<class Type> Foam::Function1Types::Table<Type>::Table(const Table<Type>& tbl) : - TableBase<Type>(tbl) + TableBase<Type>(tbl), + fName_(tbl.fName_) {} +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +template<class Type> +void Foam::Function1Types::Table<Type>::writeData(Ostream& os) const +{ + Function1<Type>::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<Type>::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 279ac939bad15d19a3ba6af786584e141685b6a8..154e18c8e2c18f85f3930285146bef165117c71c 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 <entryName> table ( @@ -42,13 +44,43 @@ Description ); \endverbatim + Dictionary specification, external data reference. + \verbatim + <entryName> + { + type table; + file "<case>/path/tableValues"; + } + \endverbatim + + Dictionary specification, embedded content + Dictionary form. + \verbatim + <entryName> + { + 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<Type> { + // 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<Type>& 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 82361382bd2f2573761814b678f88b0217154a29..57b05c7f2ba3b9260251f0f9ad88596f64110d61 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 76d210a786407266e0782dfba928e652bb0eb6d2..cabe6e2d9fc165e4fefe958d2eb2c3de19666ebe 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 46078cea7d856f62c2dca263d50519a01b0af83b..805480f504bd7bf83995b482c80a80d61421111c 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 2393d949dcf6ebfe821632eb4693d1500481b464..8563f6663d83f19f931892be1d20b878c15c4b80 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 - <entryName> zero; + <entryName> zero; + \endverbatim + + In dictionary format: + \verbatim + <entryName> + { + 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 7c1a0332674d78275d485f356ef64fada2a2c534..7d536988e8c75900b7847e1e2cb79531d03d7e9b 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 52f2f4d73fe380c6d4c94db3b17433697e30a44e..d22271c839ccf515082bfd8aac99d4bbdf5244e6 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 8d4b6f524b5f12ffa10846d3d6ea62dcc2041f1d..fcdfaeacb1e407c2d0a8560c89552b34c74e7178 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 83950cc72c55b6414186b5eaec887d7c587e20df..275d316e4767086d4db2e22a54b805b073050134 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 88a41fe693d82f0086c2d92e89d195a9c84a29c7..37aec55d7e4173bba5406cf2977191220abaf96b 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 f5767756f0482d5a523251332175bc39452b91bb..df7ed6c00b157f7a5903d6a8e8e890ed0c4b4894 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 e4c7466f2344265ce159fe3355716e3e4dad2a69..e6a6daa638ab0139fb8835afaa217306bdd9326b 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 46237d09401da4eccc21cea7563bf833f9669458..1f0a1f10b5f640cf2ed3833cca508df121d90547 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 "<constant>/pistonPosition.dat"; outOfBounds clamp; interpolationScheme linear; } @@ -76,7 +75,7 @@ class freePiston : public engineTime { - // Private data + // Private Data autoPtr<Function1<scalar>> pistonPositionTime_; diff --git a/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchFields.C b/src/finiteVolume/fields/fvPatchFields/derived/fan/fanFvPatchFields.C index 7b260be5d6d3eeea9977eb9b1ec58a6b82dff7e2..c404004e312d784acf7669e1d21da73f1b1bd04f 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 7db246e11f614377c624748174c4af5542e32ada..3f3e0acd26eff03148e9d21010f7f9c1efb10590 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 "<constant>/fanCurve"; - outOfBounds clamp; + type table; + file "<constant>/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 7dd8331dbd444fb33059b91fa5568277f9112e2b..4bf7de873872346dcf746aeae7614f15b8b3f89b 100644 --- a/src/meshTools/PatchFunction1/ConstantField/ConstantField.C +++ b/src/meshTools/PatchFunction1/ConstantField/ConstantField.C @@ -101,52 +101,43 @@ Foam::PatchFunction1Types::ConstantField<Type>::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<Type>& list = fld; - is >> list; isUniform = false; - - const label currentSize = fld.size(); - if (currentSize != len) + is >> static_cast<List<Type>&>(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<Type>::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 33f85c81f237e372ba9319115f32805f765874ac..62ceceb3897c0e42c408a45ca97a2d7d4a1d8994 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<Type>::New { // Dictionary entry + DebugInFunction + << "For " << entryName << " with dictionary entries: " + << flatOutput(coeffs->toc()) << nl; + coeffs->readEntry ( "type", @@ -60,18 +64,21 @@ Foam::PatchFunction1<Type>::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 - ITstream& is = eptr->stream(); + DebugInFunction + << "For " << entryName << " with primitive entry" << nl; - token firstToken(is); + ITstream& is = eptr->stream(); - // Compatibility for reading straight fields - if (!firstToken.isWord()) + if (is.peek().isWord()) + { + modelType = is.peek().wordToken(); + } + else { - // A value - is.putBack(firstToken); + // A value - compatibility for reading uniform (constant) field const Type constValue = pTraits<Type>(is); @@ -88,8 +95,6 @@ Foam::PatchFunction1<Type>::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 1454b0dc718a0654d19944a8170a640560d73831..f2f02ad16449f29eb1c8b9c9650899fb50888e66 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 "<constant>/massLossRate"; + type table; + file "<constant>/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 b408bc25c1795b4b32e4e55f23a9a5f125a8a789..09476e5c55f0dcc0529cb4d09fc4798129ba585d 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 "<constant>/FluxVsdP.dat"; - // readerType openFoam; // Default + type table; + file "<constant>/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 54e5ed8675f55d9c7573db21936ed9260e0cc948..9f5f0cbfc7b55faf3a730894520f2f325aed3db6 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 "<system>/deltaTvalues"; + deltaT + { + type table; + file "<system>/deltaTvalues"; + } } minMaxp