From a1db98fae7ea5ddd0fa8c39b482e44b17e57fe53 Mon Sep 17 00:00:00 2001 From: mattijs Date: Tue, 10 Mar 2009 12:50:21 +0000 Subject: [PATCH] dependency checking --- .../db/objectRegistry/objectRegistry.C | 42 ++++++++- .../db/objectRegistry/objectRegistry.H | 6 ++ src/OpenFOAM/db/regIOobject/regIOobject.C | 88 +++++++++++++++++++ src/OpenFOAM/db/regIOobject/regIOobject.H | 22 +++++ src/OpenFOAM/db/regIOobject/regIOobjectI.H | 11 +++ 5 files changed, 167 insertions(+), 2 deletions(-) diff --git a/src/OpenFOAM/db/objectRegistry/objectRegistry.C b/src/OpenFOAM/db/objectRegistry/objectRegistry.C index 1038ecffa1..55cf75fb0f 100644 --- a/src/OpenFOAM/db/objectRegistry/objectRegistry.C +++ b/src/OpenFOAM/db/objectRegistry/objectRegistry.C @@ -55,7 +55,8 @@ Foam::objectRegistry::objectRegistry HashTable(nIoObjects), time_(t), parent_(t), - dbDir_(name()) + dbDir_(name()), + event_(1) {} @@ -69,7 +70,8 @@ Foam::objectRegistry::objectRegistry HashTable(nIoObjects), time_(io.time()), parent_(io.db()), - dbDir_(parent_.dbDir()/local()/name()) + dbDir_(parent_.dbDir()/local()/name()), + event_(1) { writeOpt() = IOobject::AUTO_WRITE; } @@ -135,6 +137,42 @@ const Foam::objectRegistry& Foam::objectRegistry::subRegistry } +Foam::label Foam::objectRegistry::getEvent() const +{ + label curEvent = event_++; + + if (event_ == labelMax) + { + WarningIn("objectRegistry::getEvent() const") + << "Event counter has overflowed. Resetting counter on all" + << " dependent objects." << endl + << "This might cause extra evaluations." << endl; + + // Reset event counter + curEvent = 1; + event_ = 2; + + for (const_iterator iter = begin(); iter != end(); ++iter) + { + const regIOobject& io = *iter(); + + if (objectRegistry::debug) + { + Pout<< "objectRegistry::getEvent() : " + << "resetting count on " << iter.key() << endl; + } + + if (io.eventNo() != 0) + { + const_cast(io).eventNo() = curEvent; + } + } + } + + return curEvent; +} + + bool Foam::objectRegistry::checkIn(regIOobject& io) const { if (objectRegistry::debug) diff --git a/src/OpenFOAM/db/objectRegistry/objectRegistry.H b/src/OpenFOAM/db/objectRegistry/objectRegistry.H index ce67831457..2cba2778e1 100644 --- a/src/OpenFOAM/db/objectRegistry/objectRegistry.H +++ b/src/OpenFOAM/db/objectRegistry/objectRegistry.H @@ -64,6 +64,9 @@ class objectRegistry //- Local directory path of this objectRegistry relative to time fileName dbDir_; + //- Current event + mutable label event_; + // Private Member Functions @@ -151,6 +154,9 @@ public: template const Type& lookupObject(const word& name) const; + //- Return new event number. + label getEvent() const; + // Edit diff --git a/src/OpenFOAM/db/regIOobject/regIOobject.C b/src/OpenFOAM/db/regIOobject/regIOobject.C index 611dd5a923..cdde285126 100644 --- a/src/OpenFOAM/db/regIOobject/regIOobject.C +++ b/src/OpenFOAM/db/regIOobject/regIOobject.C @@ -50,6 +50,7 @@ Foam::regIOobject::regIOobject(const IOobject& io) registered_(false), ownedByRegistry_(false), lastModified_(0), + eventNo_(db().getEvent()), isPtr_(NULL) { // Register with objectRegistry if requested @@ -67,6 +68,7 @@ Foam::regIOobject::regIOobject(const regIOobject& rio) registered_(false), ownedByRegistry_(false), lastModified_(rio.lastModified_), + eventNo_(db().getEvent()), isPtr_(NULL) { // Do not register copy with objectRegistry @@ -81,6 +83,7 @@ Foam::regIOobject::regIOobject(const regIOobject& rio, bool registerCopy) registered_(false), ownedByRegistry_(false), lastModified_(rio.lastModified_), + eventNo_(db().getEvent()), isPtr_(NULL) { if (registerCopy && rio.registered_) @@ -158,6 +161,91 @@ void Foam::regIOobject::checkOut() } +bool Foam::regIOobject::uptodate(const word& a) const +{ + if (db().lookupObject(a).eventNo() >= eventNo_) + { + return false; + } + else + { + return true; + } +} + + +bool Foam::regIOobject::uptodate(const word& a, const word& b) const +{ + if + ( + db().lookupObject(a).eventNo() >= eventNo_ + || db().lookupObject(b).eventNo() >= eventNo_ + ) + { + return false; + } + else + { + return true; + } +} + + +bool Foam::regIOobject::uptodate +( + const word& a, + const word& b, + const word& c +) const +{ + if + ( + db().lookupObject(a).eventNo() >= eventNo_ + || db().lookupObject(b).eventNo() >= eventNo_ + || db().lookupObject(c).eventNo() >= eventNo_ + ) + { + return false; + } + else + { + return true; + } +} + + +bool Foam::regIOobject::uptodate +( + const word& a, + const word& b, + const word& c, + const word& d +) const +{ + if + ( + db().lookupObject(a).eventNo() >= eventNo_ + || db().lookupObject(b).eventNo() >= eventNo_ + || db().lookupObject(c).eventNo() >= eventNo_ + || db().lookupObject(d).eventNo() >= eventNo_ + ) + { + return false; + } + else + { + return true; + } +} + + +//- Flag me as uptodate +void Foam::regIOobject::setUptodate() +{ + eventNo_ = db().getEvent(); +} + + // Rename object and re-register with objectRegistry under new name void Foam::regIOobject::rename(const word& newName) { diff --git a/src/OpenFOAM/db/regIOobject/regIOobject.H b/src/OpenFOAM/db/regIOobject/regIOobject.H index 80829fa864..c816189f7f 100644 --- a/src/OpenFOAM/db/regIOobject/regIOobject.H +++ b/src/OpenFOAM/db/regIOobject/regIOobject.H @@ -45,6 +45,7 @@ SourceFiles // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + namespace Foam { @@ -70,6 +71,9 @@ private: //- Time of last modification mutable time_t lastModified_; + //- eventNo of last update + label eventNo_; + //- Istream for reading Istream* isPtr_; @@ -141,6 +145,24 @@ public: inline void release(); + // Dependency checking + + //- Event number at last update. + inline label eventNo() const; + + //- Event number at last update. + inline label& eventNo(); + + //- Am I uptodate with respect to other regIOobjects + bool uptodate(const word&) const; + bool uptodate(const word&, const word&) const; + bool uptodate(const word&, const word&, const word&) const; + bool uptodate(const word&, const word&, const word&, const word&) + const; + + //- Flag me as uptodate + void setUptodate(); + // Edit //- Rename diff --git a/src/OpenFOAM/db/regIOobject/regIOobjectI.H b/src/OpenFOAM/db/regIOobject/regIOobjectI.H index cef96647f7..fb74b995e6 100644 --- a/src/OpenFOAM/db/regIOobject/regIOobjectI.H +++ b/src/OpenFOAM/db/regIOobject/regIOobjectI.H @@ -80,4 +80,15 @@ void Foam::regIOobject::release() } +Foam::label Foam::regIOobject::eventNo() const +{ + return eventNo_; +} + +Foam::label& Foam::regIOobject::eventNo() +{ + return eventNo_; +} + + // ************************************************************************* //