diff --git a/src/OpenFOAM/Make/files b/src/OpenFOAM/Make/files index 7db14b3cff51c1de37b21850ea217293a421c94d..ed399ab983457b6636621ea9a1829144253963e0 100644 --- a/src/OpenFOAM/Make/files +++ b/src/OpenFOAM/Make/files @@ -327,6 +327,7 @@ $(IOobject)/IOobjectWriteHeader.C regIOobject = db/regIOobject /* $(regIOobject)/regIOobject.C in global.Cver */ +$(regIOobject)/regIOobjectMetaData.C $(regIOobject)/regIOobjectRead.C $(regIOobject)/regIOobjectWrite.C diff --git a/src/OpenFOAM/db/IOobjects/decomposedBlockData/decomposedBlockData.C b/src/OpenFOAM/db/IOobjects/decomposedBlockData/decomposedBlockData.C index 379ef7fdd262974dccb808e04b4746b6c0a73f6f..7470ad6c31268db7bf69e68069dd6dda415273c6 100644 --- a/src/OpenFOAM/db/IOobjects/decomposedBlockData/decomposedBlockData.C +++ b/src/OpenFOAM/db/IOobjects/decomposedBlockData/decomposedBlockData.C @@ -1024,6 +1024,12 @@ bool Foam::decomposedBlockData::writeObject osPtr.reset(new OFstream(objectPath(), IOstreamOption::BINARY)); + // Update meta-data for current state + const_cast<regIOobject&> + ( + static_cast<const regIOobject&>(*this) + ).updateMetaData(); + decomposedBlockData::writeHeader ( *osPtr, diff --git a/src/OpenFOAM/db/regIOobject/regIOobject.C b/src/OpenFOAM/db/regIOobject/regIOobject.C index d1dd2e90d32551dfe80fcc777cb847bff0f04a5d..94e77b8cc7cbdca6efd399ae6d50c3666df3697d 100644 --- a/src/OpenFOAM/db/regIOobject/regIOobject.C +++ b/src/OpenFOAM/db/regIOobject/regIOobject.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2017 OpenFOAM Foundation - Copyright (C) 2018-2019 OpenCFD Ltd. + Copyright (C) 2018-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -29,8 +29,9 @@ License #include "regIOobject.H" #include "Time.H" #include "polyMesh.H" -#include "registerSwitch.H" +#include "dictionary.H" #include "fileOperation.H" +#include "registerSwitch.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -73,7 +74,9 @@ Foam::regIOobject::regIOobject(const IOobject& io, const bool isTime) registered_(false), ownedByRegistry_(false), watchIndices_(), - eventNo_(isTime ? 0 : db().getEvent()) // No event for top-level Time + eventNo_(isTime ? 0 : db().getEvent()), // No event for top-level Time + metaDataPtr_(nullptr), + isPtr_(nullptr) { if (registerObject()) { @@ -90,6 +93,7 @@ Foam::regIOobject::regIOobject(const regIOobject& rio) ownedByRegistry_(false), watchIndices_(rio.watchIndices_), eventNo_(db().getEvent()), + metaDataPtr_(rio.metaDataPtr_.clone()), isPtr_(nullptr) { // Do not register copy with objectRegistry @@ -103,6 +107,7 @@ Foam::regIOobject::regIOobject(const regIOobject& rio, bool registerCopy) ownedByRegistry_(false), watchIndices_(), eventNo_(db().getEvent()), + metaDataPtr_(rio.metaDataPtr_.clone()), isPtr_(nullptr) { if (registerCopy) @@ -129,6 +134,7 @@ Foam::regIOobject::regIOobject ownedByRegistry_(false), watchIndices_(), eventNo_(db().getEvent()), + metaDataPtr_(rio.metaDataPtr_.clone()), isPtr_(nullptr) { if (registerCopy) @@ -152,6 +158,7 @@ Foam::regIOobject::regIOobject ownedByRegistry_(false), watchIndices_(), eventNo_(db().getEvent()), + metaDataPtr_(rio.metaDataPtr_.clone()), isPtr_(nullptr) { if (registerObject()) @@ -474,7 +481,7 @@ bool Foam::regIOobject::headerOk() void Foam::regIOobject::operator=(const IOobject& io) { // Close any file - isPtr_.clear(); + isPtr_.reset(nullptr); // Check out of objectRegistry checkOut(); diff --git a/src/OpenFOAM/db/regIOobject/regIOobject.H b/src/OpenFOAM/db/regIOobject/regIOobject.H index 262122f8bf5a0102238f3030750755463070ef6d..8c1a7c52073d9436fe899ef502ae3fd600c18c61 100644 --- a/src/OpenFOAM/db/regIOobject/regIOobject.H +++ b/src/OpenFOAM/db/regIOobject/regIOobject.H @@ -56,6 +56,8 @@ namespace Foam // Forward Declarations +class dictionary; + namespace functionEntries { class codeStream; @@ -106,6 +108,9 @@ private: //- eventNo of last update label eventNo_; + //- Dictionary for any meta-data + autoPtr<dictionary> metaDataPtr_; + //- Istream for reading autoPtr<ISstream> isPtr_; @@ -277,6 +282,21 @@ public: virtual void rename(const word& newName); + // Meta-data + + //- Return pointer to meta-data or nullptr + const dictionary* findMetaData() const noexcept; + + //- Get or create meta-data + dictionary& getMetaData() noexcept; + + //- Remove meta-data + void removeMetaData(); + + //- Update internal meta-data (eg, prior to writing) + virtual void updateMetaData(); + + // Reading //- Return complete path + object name if the file exists diff --git a/src/OpenFOAM/db/regIOobject/regIOobjectMetaData.C b/src/OpenFOAM/db/regIOobject/regIOobjectMetaData.C new file mode 100644 index 0000000000000000000000000000000000000000..146b4e1d0199268eca829d6e7ce6a0366d123063 --- /dev/null +++ b/src/OpenFOAM/db/regIOobject/regIOobjectMetaData.C @@ -0,0 +1,59 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2021 OpenCFD Ltd. +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "regIOobject.H" +#include "dictionary.H" + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +const Foam::dictionary* Foam::regIOobject::findMetaData() const noexcept +{ + return metaDataPtr_.get(); +} + + +Foam::dictionary& Foam::regIOobject::getMetaData() noexcept +{ + if (!metaDataPtr_) + { + metaDataPtr_.reset(new dictionary("meta")); + } + return *metaDataPtr_; +} + + +void Foam::regIOobject::removeMetaData() +{ + metaDataPtr_.reset(nullptr); +} + + +void Foam::regIOobject::updateMetaData() +{} + + +// ************************************************************************* // diff --git a/src/OpenFOAM/global/fileOperations/collatedFileOperation/collatedFileOperation.C b/src/OpenFOAM/global/fileOperations/collatedFileOperation/collatedFileOperation.C index 393b46ba15609cb8b3a1f4753c33530199a216bf..2176b033c93b968c6f401ade6f1fc013dbc5d0a3 100644 --- a/src/OpenFOAM/global/fileOperations/collatedFileOperation/collatedFileOperation.C +++ b/src/OpenFOAM/global/fileOperations/collatedFileOperation/collatedFileOperation.C @@ -237,6 +237,12 @@ bool Foam::fileOperations::collatedFileOperation::appendObject const bool isMaster = isMasterRank(proci); + // Update meta-data for current state + if (isMaster) + { + const_cast<regIOobject&>(io).updateMetaData(); + } + // Note: cannot do append + compression. This is a limitation // of ogzstream (or rather most compressed formats) @@ -379,6 +385,9 @@ bool Foam::fileOperations::collatedFileOperation::writeObject const Time& tm = io.time(); const fileName& inst = io.instance(); + // Update meta-data for current state + const_cast<regIOobject&>(io).updateMetaData(); + if (inst.isAbsolute() || !tm.processorCase()) { mkDir(io.path()); diff --git a/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.C b/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.C index f20e1562ca5ffdfa53407828a5fdb69729a9115a..bb35e2243a0d0913ebd3068935555b5b01c6b9ac 100644 --- a/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.C +++ b/src/OpenFOAM/global/fileOperations/fileOperation/fileOperation.C @@ -635,6 +635,9 @@ bool Foam::fileOperation::writeObject OSstream& os = *osPtr; + // Update meta-data for current state + const_cast<regIOobject&>(io).updateMetaData(); + // If any of these fail, return (leave error handling to Ostream class) const bool ok = diff --git a/src/OpenFOAM/global/fileOperations/masterUncollatedFileOperation/masterUncollatedFileOperation.C b/src/OpenFOAM/global/fileOperations/masterUncollatedFileOperation/masterUncollatedFileOperation.C index f46e0358189c848d822ed8664d1670c094529682..a31190a22aca899c49381dbc3302df40a9785e5f 100644 --- a/src/OpenFOAM/global/fileOperations/masterUncollatedFileOperation/masterUncollatedFileOperation.C +++ b/src/OpenFOAM/global/fileOperations/masterUncollatedFileOperation/masterUncollatedFileOperation.C @@ -2182,6 +2182,9 @@ bool Foam::fileOperations::masterUncollatedFileOperation::writeObject // Make sure to pick up any new times setTime(io.time()); + // Update meta-data for current state + const_cast<regIOobject&>(io).updateMetaData(); + autoPtr<OSstream> osPtr(NewOFstream(pathName, streamOpt, valid)); OSstream& os = *osPtr; diff --git a/src/OpenFOAM/meshes/polyMesh/zones/ZoneMesh/ZoneMesh.C b/src/OpenFOAM/meshes/polyMesh/zones/ZoneMesh/ZoneMesh.C index 734777b9e3c296efeb3e8ad39cb762f2e2f246f7..a97c20f56787d4ffd0754a357c9bde1c3dac93d3 100644 --- a/src/OpenFOAM/meshes/polyMesh/zones/ZoneMesh/ZoneMesh.C +++ b/src/OpenFOAM/meshes/polyMesh/zones/ZoneMesh/ZoneMesh.C @@ -644,6 +644,14 @@ void Foam::ZoneMesh<ZoneType, MeshType>::movePoints(const pointField& pts) } +template<class ZoneType, class MeshType> +void Foam::ZoneMesh<ZoneType, MeshType>::updateMetaData() +{ + dictionary& meta = this->getMetaData(); + meta.set("names", this->names()); +} + + template<class ZoneType, class MeshType> bool Foam::ZoneMesh<ZoneType, MeshType>::writeData(Ostream& os) const { diff --git a/src/OpenFOAM/meshes/polyMesh/zones/ZoneMesh/ZoneMesh.H b/src/OpenFOAM/meshes/polyMesh/zones/ZoneMesh/ZoneMesh.H index 492fbd4c12e33a6cf96adf449682c89724aaf8b4..a6dffca158d610783d2ec765c1f431d17f128376 100644 --- a/src/OpenFOAM/meshes/polyMesh/zones/ZoneMesh/ZoneMesh.H +++ b/src/OpenFOAM/meshes/polyMesh/zones/ZoneMesh/ZoneMesh.H @@ -232,9 +232,6 @@ public: //- Correct zone mesh after moving points void movePoints(const pointField& pts); - //- writeData member function required by regIOobject - bool writeData(Ostream& os) const; - // Member Operators @@ -269,6 +266,15 @@ public: ZoneType& operator()(const word& zoneName, const bool verbose=false); + // IO + + //- Update internal meta-data (eg, prior to writing) + void updateMetaData(); + + //- The writeData member function required by regIOobject + bool writeData(Ostream& os) const; + + // Ostream Operator friend Ostream& operator<< <ZoneType, MeshType>