Skip to content

Commit

Permalink
Merge pull request idaholab#17496 from aprilnovak/fluid-api
Browse files Browse the repository at this point in the history
Improve UserObjectInterface errors
  • Loading branch information
loganharbour committed Apr 5, 2021
2 parents 73b789e + 3584652 commit 0dbb68a
Show file tree
Hide file tree
Showing 21 changed files with 575 additions and 200 deletions.
79 changes: 41 additions & 38 deletions framework/include/auxkernels/AuxKernel.h
Expand Up @@ -119,37 +119,40 @@ class AuxKernelTempl : public MooseObject,
const MaterialProperty<T> & getMaterialPropertyOlder(const std::string & name);

template <typename T>
const T & getUserObject(const UserObjectName & name);
const T & getUserObject(const std::string & param_name) const;
template <typename T>
const T & getUserObjectByName(const UserObjectName & name);
const T & getUserObjectByName(const UserObjectName & object_name) const;

const UserObject & getUserObjectBase(const UserObjectName & name);
const UserObject & getUserObjectBaseByName(const UserObjectName & name);
const UserObject & getUserObjectBase(const std::string & param_name) const;
const UserObject & getUserObjectBaseByName(const UserObjectName & object_name) const;

virtual const PostprocessorValue & getPostprocessorValue(const std::string & name,
unsigned int index = 0);
virtual const PostprocessorValue & getPostprocessorValueByName(const PostprocessorName & name);
const PostprocessorValue & getPostprocessorValue(const std::string & name,
unsigned int index = 0) const;
const PostprocessorValue & getPostprocessorValueByName(const PostprocessorName & name) const;

virtual const VectorPostprocessorValue &
getVectorPostprocessorValue(const std::string & name, const std::string & vector_name) override;
virtual const VectorPostprocessorValue &
const VectorPostprocessorValue &
getVectorPostprocessorValue(const std::string & name,
const std::string & vector_name) const override final;
const VectorPostprocessorValue &
getVectorPostprocessorValueByName(const VectorPostprocessorName &,
const std::string & vector_name) override;
const std::string & vector_name) const override final;

virtual const VectorPostprocessorValue & getVectorPostprocessorValue(
const std::string & name, const std::string & vector_name, bool needs_broadcast) override;
virtual const VectorPostprocessorValue &
const VectorPostprocessorValue &
getVectorPostprocessorValue(const std::string & name,
const std::string & vector_name,
bool needs_broadcast) const override final;
const VectorPostprocessorValue &
getVectorPostprocessorValueByName(const VectorPostprocessorName &,
const std::string & vector_name,
bool needs_broadcast) override;
bool needs_broadcast) const override final;

virtual const ScatterVectorPostprocessorValue &
const ScatterVectorPostprocessorValue &
getScatterVectorPostprocessorValue(const std::string & name,
const std::string & vector_name) override;
const std::string & vector_name) const override final;

virtual const ScatterVectorPostprocessorValue &
const ScatterVectorPostprocessorValue &
getScatterVectorPostprocessorValueByName(const std::string & name,
const std::string & vector_name) override;
const std::string & vector_name) const override final;

protected:
/**
Expand Down Expand Up @@ -245,13 +248,6 @@ class AuxKernelTempl : public MooseObject,
/// Quadrature point index
unsigned int _qp;

/// Depend AuxKernelTempls
mutable std::set<std::string> _depend_vars;
std::set<std::string> _supplied_vars;

/// Depend UserObjects
std::set<UserObjectName> _depend_uo;

/// number of local dofs for elemental variables
unsigned int _n_local_dofs;

Expand All @@ -275,6 +271,19 @@ class AuxKernelTempl : public MooseObject,
* ComputeValueType is \p RealVectorValue
*/
void setDofValueHelper(const ComputeValueType & dof_value);

/**
* Helper for adding the UserObject dependencies to _depend_uo.
*/
void addUserObjectDependencies(const std::string & param_name) const;
void addUserObjectDependenciesByName(const UserObjectName & object_name) const;

/// Depend AuxKernelTempls
mutable std::set<std::string> _depend_vars;
std::set<std::string> _supplied_vars;

/// Depend UserObjects
mutable std::set<UserObjectName> _depend_uo;
};

template <typename ComputeValueType>
Expand Down Expand Up @@ -348,25 +357,19 @@ AuxKernelTempl<ComputeValueType>::getMaterialPropertyOlder(const std::string & n
template <typename ComputeValueType>
template <typename T>
const T &
AuxKernelTempl<ComputeValueType>::getUserObject(const UserObjectName & name)
AuxKernelTempl<ComputeValueType>::getUserObject(const std::string & param_name) const
{
_depend_uo.insert(_pars.get<UserObjectName>(name));
auto & uo = UserObjectInterface::getUserObject<T>(name);
auto indirect_dependents = uo.getDependObjects();
for (auto & indirect_dependent : indirect_dependents)
_depend_uo.insert(indirect_dependent);
const auto & uo = UserObjectInterface::getUserObject<T>(param_name);
addUserObjectDependenciesByName(uo.name());
return uo;
}

template <typename ComputeValueType>
template <typename T>
const T &
AuxKernelTempl<ComputeValueType>::getUserObjectByName(const UserObjectName & name)
AuxKernelTempl<ComputeValueType>::getUserObjectByName(const UserObjectName & object_name) const
{
_depend_uo.insert(name);
auto & uo = UserObjectInterface::getUserObjectByName<T>(name);
auto indirect_dependents = uo.getDependObjects();
for (auto & indirect_dependent : indirect_dependents)
_depend_uo.insert(indirect_dependent);
const auto & uo = UserObjectInterface::getUserObjectByName<T>(object_name);
addUserObjectDependenciesByName(object_name);
return uo;
}
3 changes: 2 additions & 1 deletion framework/include/problems/FEProblemBase.h
Expand Up @@ -882,9 +882,10 @@ class FEProblemBase : public SubProblem, public Restartable
/**
* Get the user object by its name
* @param name The name of the user object being retrieved
* @param tid The thread of the user object (defaults to 0)
* @return Const reference to the user object
*/
const UserObject & getUserObjectBase(const std::string & name) const;
const UserObject & getUserObjectBase(const std::string & name, const THREAD_ID tid = 0) const;

/**
* Check if there if a user object of given name
Expand Down
3 changes: 2 additions & 1 deletion framework/include/userobject/DiscreteElementUserObject.h
Expand Up @@ -32,5 +32,6 @@ class DiscreteElementUserObject : public ElementUserObject
virtual void finalize() override final;
virtual void threadJoin(const UserObject &) override final;
/// @}
};

bool needThreadedCopy() const override final { return true; }
};
28 changes: 16 additions & 12 deletions framework/include/userobject/GeneralUserObject.h
Expand Up @@ -50,29 +50,33 @@ class GeneralUserObject : public UserObject,
/**
* Store dependency among same object types for proper execution order
*/
virtual const PostprocessorValue & getPostprocessorValue(const std::string & name,
unsigned int index = 0);
virtual const PostprocessorValue & getPostprocessorValueByName(const PostprocessorName & name);
const PostprocessorValue & getPostprocessorValue(const std::string & name,
unsigned int index = 0) const override final;
const PostprocessorValue &
getPostprocessorValueByName(const PostprocessorName & name) const override final;

virtual const VectorPostprocessorValue &
getVectorPostprocessorValue(const std::string & name, const std::string & vector_name) override;
virtual const VectorPostprocessorValue &
const VectorPostprocessorValue &
getVectorPostprocessorValue(const std::string & name,
const std::string & vector_name) const override final;
const VectorPostprocessorValue &
getVectorPostprocessorValueByName(const VectorPostprocessorName & name,
const std::string & vector_name) override;
const std::string & vector_name) const override final;

virtual const VectorPostprocessorValue & getVectorPostprocessorValue(
const std::string & name, const std::string & vector_name, bool use_broadcast) override;
virtual const VectorPostprocessorValue &
const VectorPostprocessorValue &
getVectorPostprocessorValue(const std::string & name,
const std::string & vector_name,
bool use_broadcast) const override final;
const VectorPostprocessorValue &
getVectorPostprocessorValueByName(const VectorPostprocessorName & name,
const std::string & vector_name,
bool use_broadcast) override;
bool use_broadcast) const override final;

///@}

protected:
virtual void addReporterDependencyHelper(const ReporterName & state_name) override;

protected:
std::set<std::string> _depend_vars;
mutable std::set<std::string> _depend_vars;
std::set<std::string> _supplied_vars;
};
3 changes: 2 additions & 1 deletion framework/include/userobject/ThreadedGeneralUserObject.h
Expand Up @@ -21,5 +21,6 @@ class ThreadedGeneralUserObject : public GeneralUserObject
virtual ~ThreadedGeneralUserObject() = default;
virtual void threadJoin(const UserObject &) override;
virtual void subdomainSetup() override{};
};

bool needThreadedCopy() const override final { return true; }
};
70 changes: 45 additions & 25 deletions framework/include/userobject/UserObject.h
Expand Up @@ -175,31 +175,37 @@ class UserObject : public MooseObject,
}

template <typename T>
const T & getUserObject(const std::string & name)
const T & getUserObject(const std::string & param_name) const
{
_depend_uo.insert(_pars.get<UserObjectName>(name));
return UserObjectInterface::getUserObject<T>(name);
const auto & uo = UserObjectInterface::getUserObject<T>(param_name);
_depend_uo.insert(_pars.get<UserObjectName>(param_name));
return uo;
}

template <typename T>
const T & getUserObjectByName(const UserObjectName & name)
const T & getUserObjectByName(const UserObjectName & object_name) const
{
_depend_uo.insert(name);
return UserObjectInterface::getUserObjectByName<T>(name);
const auto & uo = UserObjectInterface::getUserObjectByName<T>(object_name);
_depend_uo.insert(object_name);
return uo;
}

const UserObject & getUserObjectBase(const UserObjectName & name)
const UserObject & getUserObjectBase(const UserObjectName & param_name) const
{
return getUserObjectBaseByName(_pars.get<UserObjectName>(name));
const auto & uo = UserObjectInterface::getUserObjectBase(param_name);
_depend_uo.insert(uo.name());
return uo;
}

const UserObject & getUserObjectBaseByName(const UserObjectName & name)
const UserObject & getUserObjectBaseByName(const UserObjectName & object_name) const
{
_depend_uo.insert(name);
return UserObjectInterface::getUserObjectBaseByName(name);
const auto & uo = UserObjectInterface::getUserObjectBaseByName(object_name);
_depend_uo.insert(object_name);
return uo;
}

const PostprocessorValue & getPostprocessorValue(const std::string & name, unsigned int index = 0)
virtual const PostprocessorValue & getPostprocessorValue(const std::string & name,
unsigned int index = 0) const
{
if (hasPostprocessor(name, index))
{
Expand All @@ -214,60 +220,74 @@ class UserObject : public MooseObject,
return PostprocessorInterface::getPostprocessorValue(name, index);
}

const PostprocessorValue & getPostprocessorValueByName(const PostprocessorName & name)
virtual const PostprocessorValue &
getPostprocessorValueByName(const PostprocessorName & name) const
{
_depend_uo.insert(name);
return PostprocessorInterface::getPostprocessorValueByName(name);
}

const VectorPostprocessorValue & getVectorPostprocessorValue(const std::string & name,
const std::string & vector_name)
virtual const VectorPostprocessorValue &
getVectorPostprocessorValue(const std::string & name,
const std::string & vector_name) const override
{
_depend_uo.insert(_pars.get<VectorPostprocessorName>(name));
return VectorPostprocessorInterface::getVectorPostprocessorValue(name, vector_name);
}

const VectorPostprocessorValue &
virtual const VectorPostprocessorValue &
getVectorPostprocessorValueByName(const VectorPostprocessorName & name,
const std::string & vector_name)
const std::string & vector_name) const override
{
_depend_uo.insert(name);
return VectorPostprocessorInterface::getVectorPostprocessorValueByName(name, vector_name);
}

const VectorPostprocessorValue & getVectorPostprocessorValue(const std::string & name,
const std::string & vector_name,
bool needs_broadcast)
virtual const VectorPostprocessorValue &
getVectorPostprocessorValue(const std::string & name,
const std::string & vector_name,
bool needs_broadcast) const override
{
_depend_uo.insert(_pars.get<VectorPostprocessorName>(name));
return VectorPostprocessorInterface::getVectorPostprocessorValue(
name, vector_name, needs_broadcast);
}

const VectorPostprocessorValue & getVectorPostprocessorValueByName(
const VectorPostprocessorName & name, const std::string & vector_name, bool needs_broadcast)
virtual const VectorPostprocessorValue &
getVectorPostprocessorValueByName(const VectorPostprocessorName & name,
const std::string & vector_name,
bool needs_broadcast) const override
{
_depend_uo.insert(name);
return VectorPostprocessorInterface::getVectorPostprocessorValueByName(
name, vector_name, needs_broadcast);
}

const ScatterVectorPostprocessorValue &
getScatterVectorPostprocessorValue(const std::string & name, const std::string & vector_name)
getScatterVectorPostprocessorValue(const std::string & name,
const std::string & vector_name) const override final
{
_depend_uo.insert(_pars.get<VectorPostprocessorName>(name));
return VectorPostprocessorInterface::getScatterVectorPostprocessorValue(name, vector_name);
}

const ScatterVectorPostprocessorValue &
getScatterVectorPostprocessorValueByName(const std::string & name,
const std::string & vector_name)
const std::string & vector_name) const override final
{
_depend_uo.insert(name);
return VectorPostprocessorInterface::getScatterVectorPostprocessorValueByName(name,
vector_name);
}

/**
* Whether or not a threaded copy of this object is needed when obtaining it in
* another object, like via the UserObjectInterface.
*
* Derived classes should override this as needed.
*/
virtual bool needThreadedCopy() const { return false; }

protected:
/// Reference to the Subproblem for this user object
SubProblem & _subproblem;
Expand All @@ -288,5 +308,5 @@ class UserObject : public MooseObject,
UserObject * _primary_thread_copy = nullptr;

/// Depend UserObjects that to be used by AuxKernel for finding the full UO dependency
std::set<UserObjectName> _depend_uo;
mutable std::set<UserObjectName> _depend_uo;
};

0 comments on commit 0dbb68a

Please sign in to comment.