From 42feffc7944b98e2df62efd4fa93a9c7a747084d Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Sat, 11 Nov 2023 09:58:53 +0100 Subject: [PATCH] ENH: harmomize schemes-lookup and solution internal accessor names FIX: correct the schemes internal dictionary name - change from '.' to '/' delimiter as per 886ba89ddb1 (#1073) --- src/OpenFOAM/matrices/schemes/schemesLookup.C | 53 ++++---- src/OpenFOAM/matrices/schemes/schemesLookup.H | 61 +++++---- .../matrices/schemes/schemesLookupDetail.C | 6 +- src/OpenFOAM/matrices/solution/solution.C | 53 ++++++-- src/OpenFOAM/matrices/solution/solution.H | 119 ++++++++++++------ .../matrices/solution/solutionTemplates.C | 11 +- 6 files changed, 205 insertions(+), 98 deletions(-) diff --git a/src/OpenFOAM/matrices/schemes/schemesLookup.C b/src/OpenFOAM/matrices/schemes/schemesLookup.C index 1695b23b62..c9a1b02865 100644 --- a/src/OpenFOAM/matrices/schemes/schemesLookup.C +++ b/src/OpenFOAM/matrices/schemes/schemesLookup.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2015 OpenFOAM Foundation - Copyright (C) 2019-2022 OpenCFD Ltd. + Copyright (C) 2019-2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -102,6 +102,19 @@ void Foam::schemesLookup::read(const dictionary& dict) } +const Foam::dictionary& Foam::schemesLookup::selectedDict() const +{ + word select; + + if (readIfPresent("select", select, keyType::LITERAL)) + { + return subDict(select); + } + + return *this; +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::schemesLookup::schemesLookup @@ -136,7 +149,7 @@ Foam::schemesLookup::schemesLookup snGradSchemes_("snGradSchemes", objectPath()), laplacianSchemes_("laplacianSchemes", objectPath()), - fluxRequired_(objectPath() + ".fluxRequired"), + fluxRequired_(objectPath() / "fluxRequired"), fluxRequiredDefault_(false), steady_(false) { @@ -153,7 +166,7 @@ Foam::schemesLookup::schemesLookup if (readOpt() == IOobject::MUST_READ_IF_MODIFIED) { - read(schemesDict()); + read(selectedDict()); } } @@ -177,7 +190,7 @@ bool Foam::schemesLookup::read() { clear(); // Clear current settings except fluxRequired - read(schemesDict()); + read(selectedDict()); return true; } @@ -186,68 +199,58 @@ bool Foam::schemesLookup::read() } -const Foam::dictionary& Foam::schemesLookup::schemesDict() const -{ - if (found("select")) - { - return subDict(word(lookup("select"))); - } - return *this; -} - - Foam::ITstream& Foam::schemesLookup::ddtScheme(const word& name) const { - DebugInfo<< "Lookup ddtScheme for " << name << endl; + DebugInfo<< "Lookup ddt scheme for " << name << endl; return ddtSchemes_.lookup(name); } Foam::ITstream& Foam::schemesLookup::d2dt2Scheme(const word& name) const { - DebugInfo<< "Lookup d2dt2Scheme for " << name << endl; + DebugInfo<< "Lookup d2dt2 scheme for " << name << endl; return d2dt2Schemes_.lookup(name); } Foam::ITstream& Foam::schemesLookup::interpolationScheme(const word& name) const { - DebugInfo<< "Lookup interpolationScheme for " << name << endl; + DebugInfo<< "Lookup interpolation scheme for " << name << endl; return interpSchemes_.lookup(name); } Foam::ITstream& Foam::schemesLookup::divScheme(const word& name) const { - DebugInfo<< "Lookup divScheme for " << name << endl; + DebugInfo<< "Lookup div scheme for " << name << endl; return divSchemes_.lookup(name); } Foam::ITstream& Foam::schemesLookup::gradScheme(const word& name) const { - DebugInfo<< "Lookup gradScheme for " << name << endl; + DebugInfo<< "Lookup grad scheme for " << name << endl; return gradSchemes_.lookup(name); } Foam::ITstream& Foam::schemesLookup::lnGradScheme(const word& name) const { - DebugInfo<< "Lookup lnGradScheme for " << name << endl; + DebugInfo<< "Lookup lnGrad scheme for " << name << endl; return lnGradSchemes_.lookup(name); } Foam::ITstream& Foam::schemesLookup::snGradScheme(const word& name) const { - DebugInfo<< "Lookup snGradScheme for " << name << endl; + DebugInfo<< "Lookup snGrad scheme for " << name << endl; return snGradSchemes_.lookup(name); } Foam::ITstream& Foam::schemesLookup::laplacianScheme(const word& name) const { - DebugInfo<< "Lookup laplacianScheme for " << name << endl; + DebugInfo<< "Lookup laplacian scheme for " << name << endl; return laplacianSchemes_.lookup(name); } @@ -266,6 +269,12 @@ bool Foam::schemesLookup::fluxRequired(const word& name) const } +const Foam::dictionary& Foam::schemesLookup::schemesDict() const +{ + return selectedDict(); +} + + void Foam::schemesLookup::writeDicts(Ostream& os) const { ddtSchemes_.writeEntryOptional(os); diff --git a/src/OpenFOAM/matrices/schemes/schemesLookup.H b/src/OpenFOAM/matrices/schemes/schemesLookup.H index 68473daea5..357dbc1070 100644 --- a/src/OpenFOAM/matrices/schemes/schemesLookup.H +++ b/src/OpenFOAM/matrices/schemes/schemesLookup.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2015 OpenFOAM Foundation - Copyright (C) 2020-2022 OpenCFD Ltd. + Copyright (C) 2020-2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -30,10 +30,29 @@ Class Description Selector class for finite area/finite volume differencing schemes. - The schemes data are treated as MUST_READ_IF_MODIFIED even if - the requested readOption is nominally MUST_READ or READ_IF_PRESENT. - This allows run-time modifications to behave as expected. + The file will contain these types of entries: + \table + Name | Description | Type | Reqd | Default + ddtSchemes | ddt | dict | no | none + d2dt2Schemes | d2dt2 (currently only finite-area) | dict | no | none + interpolationSchemes | interpolation | dict | no | linear + divSchemes | div | dict | yes | - + gradSchemes | grad | dict | yes | - + lnGradSchemes | line-normal grad (finite-area) | dict | no | corrected + snGradSchemes | surface-normal grad | dict | no | corrected + laplacianSchemes | laplacian | dict | yes | - + fluxRequired | | dict | no | - + \endtable + \par select + This is a rarely used feature to select between different groups of + settings within the file. If unspecified, the file contents are used + directly. + +Note + The schemes data are treated as \c READ_MODIFIED even if the + requested \p readOption is nominally MUST_READ or READ_IF_PRESENT. + This allows run-time modifications to behave as expected.
The optional fallback dictionary content for constructors is used when a file is missing or for a NO_READ, with a null pointer being treated like an empty dictionary. @@ -154,6 +173,12 @@ class schemesLookup //- Read settings from the dictionary void read(const dictionary& dict); + //- The entire dictionary or the optional "select" sub-dictionary. + const dictionary& selectedDict() const; + + + // Generated Methods + //- No copy construct schemesLookup(const schemesLookup&) = delete; @@ -190,21 +215,15 @@ public: // Member Functions - //- The current schemes dictionary, respects the "select" keyword + //- True if default ddt scheme is steady-state + bool steady() const noexcept { return steady_; } + + //- True if default ddt scheme is not steady-state + bool transient() const noexcept { return !steady_; } + + //- The entire dictionary or the optional "select" sub-dictionary. const dictionary& schemesDict() const; - //- True if default ddtScheme is steady-state - bool steady() const noexcept - { - return steady_; - } - - //- True if default ddtScheme is not steady-state - bool transient() const noexcept - { - return !steady_; - } - // Lookup Access @@ -232,10 +251,10 @@ public: //- Get laplacian scheme for given name, or default ITstream& laplacianScheme(const word& name) const; - //- Get flux-required for given name, or default + //- Set flux-required for given name (mutable) void setFluxRequired(const word& name) const; - //- Set flux-required for given name (mutable) + //- Get flux-required for given name, or default bool fluxRequired(const word& name) const; @@ -289,7 +308,7 @@ public: return laplacianSchemes_.dict_; } - //- Access to flux required dictionary + //- Access flux-required dictionary const dictionary& fluxRequired() const noexcept { return fluxRequired_; @@ -346,7 +365,7 @@ public: return laplacianSchemes_.dict_; } - //- Access to flux required dictionary + //- Access flux-required dictionary dictionary& fluxRequired() noexcept { return fluxRequired_; diff --git a/src/OpenFOAM/matrices/schemes/schemesLookupDetail.C b/src/OpenFOAM/matrices/schemes/schemesLookupDetail.C index 1358ec6402..95a0d47356 100644 --- a/src/OpenFOAM/matrices/schemes/schemesLookupDetail.C +++ b/src/OpenFOAM/matrices/schemes/schemesLookupDetail.C @@ -5,7 +5,7 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2021 OpenCFD Ltd. + Copyright (C) 2021-2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -50,9 +50,9 @@ Foam::schemesLookup::lookupDetail::lookupDetail } else { - dict_.name() = parentDictPath + "." + name_; + dict_.name() = fileName::concat(parentDictPath, name_, '/'); } - default_.name() = dict_.name() + ".default"; + default_.name() = fileName::concat(dict_.name(), "default", '/'); } diff --git a/src/OpenFOAM/matrices/solution/solution.C b/src/OpenFOAM/matrices/solution/solution.C index cad46df74c..6e1a92bf48 100644 --- a/src/OpenFOAM/matrices/solution/solution.C +++ b/src/OpenFOAM/matrices/solution/solution.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation - Copyright (C) 2019-2022 OpenCFD Ltd. + Copyright (C) 2019-2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -41,7 +41,8 @@ namespace Foam // List of sub-dictionaries to rewrite static const Foam::List subDictNames ({ - "preconditioner", "smoother" + "preconditioner", + "smoother" }); @@ -142,6 +143,19 @@ void Foam::solution::read(const dictionary& dict) } +const Foam::dictionary& Foam::solution::selectedDict() const +{ + word select; + + if (readIfPresent("select", select, keyType::LITERAL)) + { + return subDict(select); + } + + return *this; +} + + // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // Foam::solution::solution @@ -183,7 +197,7 @@ Foam::solution::solution if (readOpt() == IOobject::MUST_READ_IF_MODIFIED) { - read(solutionDict()); + read(selectedDict()); } } @@ -201,7 +215,7 @@ Foam::solution::solution // * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // -// A non-default destructor since we had incomplete types in the header +// No default destructor in header (incomplete types) Foam::solution::~solution() {} @@ -283,6 +297,17 @@ bool Foam::solution::cache(const word& name) const } +// void Foam::solution::enableCache(const word& name) const +// { +// if (!cache_.found(name)) +// { +// DebugInfo<< "Cache: enable cache for " << name << endl; +// cache_.add(name, true); +// caching_ = true; +// } +// } + + bool Foam::solution::relaxField(const word& name) const { DebugInfo @@ -358,12 +383,20 @@ Foam::scalar Foam::solution::equationRelaxationFactor(const word& name) const const Foam::dictionary& Foam::solution::solutionDict() const { - if (found("select")) - { - return subDict(get("select")); - } + return selectedDict(); +} - return *this; + +const Foam::dictionary& Foam::solution::solutionDict(const word& name) const +{ + DebugInfo<< "Lookup subDict : " << name << endl; + return selectedDict().subDict(name); +} + + +const Foam::dictionary& Foam::solution::solversDict() const +{ + return solvers_; } @@ -385,7 +418,7 @@ bool Foam::solution::read() { if (regIOobject::read()) { - read(solutionDict()); + read(selectedDict()); return true; } diff --git a/src/OpenFOAM/matrices/solution/solution.H b/src/OpenFOAM/matrices/solution/solution.H index 65730fb8fb..5c32d227f7 100644 --- a/src/OpenFOAM/matrices/solution/solution.H +++ b/src/OpenFOAM/matrices/solution/solution.H @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2016 OpenFOAM Foundation - Copyright (C) 2020-2022 OpenCFD Ltd. + Copyright (C) 2020-2023 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -30,10 +30,43 @@ Class Description Selector class for relaxation factors, solver type and solution. - The solution data are treated as MUST_READ_IF_MODIFIED even if - the requested readOption is nominally MUST_READ or READ_IF_PRESENT. - This allows run-time modifications to behave as expected. + The file will contain these types of entries: + \par solvers { } + A sub-dictionary listing of linear solver settings. For example, + \verbatim + solvers + { + p + { + solver PCG; + preconditioner DIC; + tolerance 1e-06; + relTol 0.05; + } + } + \endverbatim + + \par select + This is a rarely used feature to select between different groups of + settings within the file. If unspecified, the file contents are used + directly. + + There are currently no other specified entries, but the file will + often also contain other solution specifications. For example, + \verbatim + PIMPLE + { + nOuterCorrectors 2; + nCorrectors 1; + nNonOrthogonalCorrectors 0; + } + \endverbatim + +Note + The solution data are treated as \c READ_MODIFIED even if the + requested \p readOption is nominally MUST_READ or READ_IF_PRESENT. + This allows run-time modifications to behave as expected.
The optional fallback dictionary content for constructors is used when a file is missing or for a NO_READ, with a null pointer being treated like an empty dictionary. @@ -100,6 +133,12 @@ class solution //- Read settings from the dictionary void read(const dictionary&); + //- The entire dictionary or the optional "select" sub-dictionary. + const dictionary& selectedDict() const; + + + // Generated Methods + //- No copy construct solution(const solution&) = delete; @@ -114,7 +153,7 @@ public: // Returns the number of settings changed static label upgradeSolverDict(dictionary& dict, const bool verbose=true); - //- Debug switch + //- Debug switch (registered name: "solution") static int debug; @@ -139,56 +178,64 @@ public: ); - //- Destructor + //- Destructor. Non-default in header (incomplete types) virtual ~solution(); // Member Functions - // Access + // Access - //- Return true if the given field should be cached - bool cache(const word& name) const; + //- True if the given field should be cached + bool cache(const word& name) const; - //- Return true if the relaxation factor is given for the field - bool relaxField(const word& name) const; + //- True if the relaxation factor is given for the field + bool relaxField(const word& name) const; - //- Return true if the relaxation factor is given for the equation - bool relaxEquation(const word& name) const; + //- True if the relaxation factor is given for the equation + bool relaxEquation(const word& name) const; - //- Return the relaxation factor for the given field - scalar fieldRelaxationFactor(const word& name) const; + //- The relaxation factor for the given field + scalar fieldRelaxationFactor(const word& name) const; - //- Return the relaxation factor for the given equation - scalar equationRelaxationFactor(const word& name) const; + //- The relaxation factor for the given equation + scalar equationRelaxationFactor(const word& name) const; - //- Return the selected sub-dictionary of solvers if the "select" - //- keyword is given, otherwise return the complete dictionary - const dictionary& solutionDict() const; + //- The entire dictionary or the optional "select" sub-dictionary. + const dictionary& solutionDict() const; - //- Return the solver controls dictionary for the given field - const dictionary& solverDict(const word& name) const; + //- Return \p name sub-dictionary within the solutionDict(). + // Same as \c solutionDict().subDict(...) + const dictionary& solutionDict(const word& name) const; - //- Return the solver controls dictionary for the given field - const dictionary& solver(const word& name) const; + //- The solver controls dictionary (all fields) + const dictionary& solversDict() const; + + //- The solver controls dictionary for the given field. + //- Same as \c solversDict().subDict(...) + const dictionary& solverDict(const word& name) const; + + //- The solver controls dictionary for the given field. + //- Same as solverDict(...) + const dictionary& solver(const word& name) const; - // Read + // Read - //- Read the solution dictionary - bool read(); + //- Read the solution dictionary + bool read(); - // Other + // Other - //- Helper for printing cache message - template - static void cachePrintMessage - ( - const char* message, - const word& name, - const FieldType& vf - ); + //- Helper for printing cache message + template + static void cachePrintMessage + ( + const char* message, + const word& name, + const FieldType& fld + ); }; diff --git a/src/OpenFOAM/matrices/solution/solutionTemplates.C b/src/OpenFOAM/matrices/solution/solutionTemplates.C index 4a72e9c669..0450b27f10 100644 --- a/src/OpenFOAM/matrices/solution/solutionTemplates.C +++ b/src/OpenFOAM/matrices/solution/solutionTemplates.C @@ -34,15 +34,14 @@ void Foam::solution::cachePrintMessage ( const char* message, const word& name, - const FieldType& vf + const FieldType& fld // == regIOobject ) { - if (solution::debug) + if (Foam::solution::debug) { - Info<< "Cache: " << message << token::SPACE << name - << ", originating from " << vf.name() - << " event No. " << vf.eventNo() - << endl; + Info<< "Cache: " << message << ' ' << name + << ", originating from " << fld.name() + << " event:" << fld.eventNo() << endl; } }