bool workflowControls::isStepCompleted() const { const word latestStep = lastCompletedStep(); if( latestStep.empty() ) return false; const label currVal = workflowSteps_.find(currentStep_)->second; const label latestVal = workflowSteps_.find(latestStep)->second; if( latestVal == currVal ) return true; return false; }
Foam::word Foam::Time::findInstance ( const fileName& dir, const word& name, const IOobject::readOption rOpt, const word& stopInstance ) const { // Note: if name is empty, just check the directory itself // check the current time directory if ( name.empty() ? isDir(path()/timeName()/dir) : ( isFile(path()/timeName()/dir/name) && IOobject(name, timeName(), dir, *this).headerOk() ) ) { if (debug) { Info<< "Time::findInstance" "(const fileName&, const word&, const IOobject::readOption)" << " : found \"" << name << "\" in " << timeName()/dir << endl; } return timeName(); } // Search back through the time directories to find the time // closest to and lower than current time instantList ts = times(); label instanceI; for (instanceI = ts.size()-1; instanceI >= 0; --instanceI) { if (ts[instanceI].value() <= timeOutputValue()) { break; } } // continue searching from here for (; instanceI >= 0; --instanceI) { if ( name.empty() ? isDir(path()/ts[instanceI].name()/dir) : ( isFile(path()/ts[instanceI].name()/dir/name) && IOobject(name, ts[instanceI].name(), dir, *this).headerOk() ) ) { if (debug) { Info<< "Time::findInstance" "(const fileName&, const word&, const IOobject::readOption)" << " : found \"" << name << "\" in " << ts[instanceI].name()/dir << endl; } return ts[instanceI].name(); } // Check if hit minimum instance if (ts[instanceI].name() == stopInstance) { if (debug) { Info<< "Time::findInstance" "(const fileName&, const word&" ", const IOobject::readOption, const word&)" << " : hit stopInstance " << stopInstance << endl; } if (rOpt == IOobject::MUST_READ) { FatalErrorIn ( "Time::findInstance" "(const fileName&, const word&" ", const IOobject::readOption, const word&)" ) << "Cannot find file \"" << name << "\" in directory " << dir << " in times " << timeName() << " down to " << stopInstance << exit(FatalError); } return ts[instanceI].name(); } } // not in any of the time directories, try constant // Note. This needs to be a hard-coded constant, rather than the // constant function of the time, because the latter points to // the case constant directory in parallel cases if ( name.empty() ? isDir(path()/constant()/dir) : ( isFile(path()/constant()/dir/name) && IOobject(name, constant(), dir, *this).headerOk() ) ) { if (debug) { Info<< "Time::findInstance" "(const fileName&, const word&, const IOobject::readOption)" << " : found \"" << name << "\" in " << constant()/dir << endl; } return constant(); } if (rOpt == IOobject::MUST_READ) { FatalErrorIn ( "Time::findInstance" "(const fileName&, const word&, const IOobject::readOption)" ) << "Cannot find file \"" << name << "\" in directory " << dir << " in times " << timeName() << " down to " << constant() << exit(FatalError); } return constant(); }
// Return components following the IOobject requirements // // behaviour // input IOobject(instance, local, name) // ----- ------ // "foo" ("", "", "foo") // "foo/bar" ("foo", "", "bar") // "/XXX" ERROR - no absolute path // "foo/bar/" ERROR - no name // "foo/xxx/bar" ("foo", "xxx", "bar") // "foo/xxx/yyy/bar" ("foo", "xxx/yyy", "bar") bool Foam::IOobject::IOobject::fileNameComponents ( const fileName& path, fileName& instance, fileName& local, word& name ) { instance.clear(); local.clear(); name.clear(); // called with directory if (isDir(path)) { WarningIn("IOobject::fileNameComponents(const fileName&, ...)") << " called with directory: " << path << "\n"; return false; } string::size_type first = path.find('/'); if (first == 0) { // called with absolute path WarningIn("IOobject::fileNameComponents(const fileName&, ...)") << "called with absolute path: " << path << "\n"; return false; } if (first == string::npos) { // no '/' found - no instance or local // check afterwards name.string::operator=(path); } else { instance = path.substr(0, first); string::size_type last = path.rfind('/'); if (last > first) { // with local local = path.substr(first+1, last-first-1); } // check afterwards name.string::operator=(path.substr(last+1)); } // check for valid (and stripped) name, regardless of the debug level if (name.empty() || string::stripInvalid<word>(name)) { WarningIn("IOobject::fileNameComponents(const fileName&, ...)") << "has invalid word for name: \"" << name << "\"\nwhile processing path: " << path << "\n"; return false; } return true; }