T& Get(const std::string& ename, const FactoryBase* factory = NoFactory::get()) { const FactoryBase* fac = GetFactory(ename, factory); // printf("(l=%d) getting \"%20s\" generated by %10p [actually, generated by %p (%43s)]\n", // levelID_, ename.c_str(), factory, fac, fac->description().c_str()); TEUCHOS_TEST_FOR_EXCEPTION(!IsKey(fac, ename), Exceptions::RuntimeError, "\"" + ename + "\" not found"); if (!IsAvailable(ename, fac)) { TEUCHOS_TEST_FOR_EXCEPTION(NumRequests(fac, ename) < 1 && GetKeepFlag(ename, fac) == 0, Exceptions::RuntimeError, "\"" << ename << "\" has not been requested (counter = " << NumRequests(fac, ename) << ", " "KeepFlag = " << GetKeepFlag(ename, fac) << "). " << std::endl << "Generating factory:" << *fac << " NoFactory = " << NoFactory::get()); fac->CallBuild(*this); Release(*fac); } TEUCHOS_TEST_FOR_EXCEPTION(!IsAvailable(ename, fac), Exceptions::RuntimeError, "MueLu::Level::Get(): factory did not produce expected output. " "\"" << ename << "\" has not been generated by " << *fac); return map_[fac][ename]->template GetData<T>(); }
//! Delete data that have been retained after the setup phase (using Keep(), AddKeepFlag(), or internal MueLu logic). // Special cases: // - If entry (ename, factory) does not exist, nothing is done. // - If entry exists but counter !=, entry cannot be desallocated before counter set to 0 (using Release()) so an exeption is thrown. void Delete(const std::string& ename, const FactoryBase* factory) { // Note: do not add default value for input parameter 'factory' if (!IsKey(ename, factory)) { return; } // if entry (ename, factory) does not exist, nothing is done. // Precondition: // Delete() should only be called if counter == 0 // Note: It better to throw an exception rather than deleting the data if counter != 0 because users are not supposed to manipulate data with counter != 0 TEUCHOS_TEST_FOR_EXCEPTION(IsRequested(ename, factory) == true, Exceptions::RuntimeError, "MueLu::Level::Delete(): IsRequested() == true. Ref counter != 0. You are not allowed to delete data that are still in use."); // If counter == 0 and entry exists, this means that a keep flag is set. Or there is an internal logic problem. TEUCHOS_TEST_FOR_EXCEPTION(GetKeepFlag(ename, factory) == 0, Exceptions::RuntimeError, "MueLu::Level::Delete(), Keep flag == 0?"); RemoveKeepFlag(ename, factory, MueLu::All); // will delete the data if counter == 0 // Post condition: data must have been deleted TEUCHOS_TEST_FOR_EXCEPTION(IsAvailable(ename, factory) == true, Exceptions::RuntimeError, "MueLu::Level::Delete(): Internal error (Post condition). Data have not been deleted."); }
void Set(const std::string& ename, const T& entry, const FactoryBase* factory = NoFactory::get()) { const FactoryBase* fac = GetFactory(ename, factory); if (fac == NoFactory::get()) { // Any data set with a NoFactory gets UserData keep flag by default AddKeepFlag(ename, NoFactory::get(), MueLu::UserData); } // Store entry only if data have been requested (or any keep flag) if (IsRequested(ename, factory) || GetKeepFlag(ename, factory) != 0) { TEUCHOS_TEST_FOR_EXCEPTION(!IsKey(factory, ename), Exceptions::RuntimeError, "" + ename + " not found in"); map_[factory][ename]->SetData(entry); } else { GetOStream(Warnings0) << "Level::Set: unable to store \"" << ename << "\" generated by factory " << factory << " on level " << toString(GetLevelID()) << ", as it has not been requested and no keep flags were set for it" << std::endl; } } // Set
//! Test if a keep flag is set for variable 'ename' generated by 'factory' //! The input parameter keep can be a combination of flags. IsKept() will then return true if at least one of the flag is set. //! Note: There is no default parameter for IsKept() because it might be confusing (user generally wants to test IsKept with keep=MueLu::Keep but classes Level and Needs generally use keep = All) bool IsKept(const std::string& ename, const FactoryBase* factory, KeepType keep) const { return GetKeepFlag(ename, factory) & keep; }
//! Alias for IsKept(ename, factory, keep) with factory = NoFactory::get() bool IsKept(const std::string& ename, KeepType keep) const { return GetKeepFlag(ename, NoFactory::get()) & keep; }