Skip to content

Commit

Permalink
Create templated duDotDu and duDotDotDu methods in SystemBase.
Browse files Browse the repository at this point in the history
Also create new virtual methods for DisplacedSystem override and type 
helper struct in MooseTypes. 

Refs idaholab#13913
  • Loading branch information
cticenhour committed Aug 20, 2019
1 parent dc163da commit 1cdbe99
Show file tree
Hide file tree
Showing 5 changed files with 147 additions and 8 deletions.
49 changes: 49 additions & 0 deletions framework/include/systems/SystemBase.h
Expand Up @@ -185,6 +185,24 @@ class SystemBase : public libMesh::ParallelObject
virtual const Number & duDotDu() const { return _du_dot_du; }
virtual const Number & duDotDotDu() const { return _du_dotdot_du; }

virtual VectorValue<Number> & vectorDuDotDu() { return _vector_du_dot_du; }
virtual VectorValue<Number> & vectorDuDotDotDu() { return _vector_du_dotdot_du; }
virtual const VectorValue<Number> & vectorDuDotDu() const { return _vector_du_dot_du; }
virtual const VectorValue<Number> & vectorDuDotDotDu() const { return _vector_du_dotdot_du; }

/**
* Template methods called by MooseVariableData in order to allow for both Number and
* VectorValue<Number> types. They will call the virtual duDotDu and duDotDotDu methods above.
*/
template <typename T>
typename Moose::RealToNumberHelper<T>::type & duDotDuTempl();
template <typename T>
typename Moose::RealToNumberHelper<T>::type & duDotDotDuTempl();
template <typename T>
const typename Moose::RealToNumberHelper<T>::type & duDotDuTempl() const;
template <typename T>
const typename Moose::RealToNumberHelper<T>::type & duDotDotDuTempl() const;

// non-const getters
virtual NumericVector<Number> * solutionUDot() = 0;
virtual NumericVector<Number> * solutionUDotOld() = 0;
Expand Down Expand Up @@ -766,6 +784,8 @@ class SystemBase : public libMesh::ParallelObject

Real _du_dot_du;
Real _du_dotdot_du;
RealVectorValue _vector_du_dot_du;
RealVectorValue _vector_du_dotdot_du;

/// Tagged vectors (pointer)
std::vector<NumericVector<Number> *> _tagged_vectors;
Expand Down Expand Up @@ -803,6 +823,35 @@ class SystemBase : public libMesh::ParallelObject
MooseObjectWarehouseBase<MooseVariableBase> _variable_warehouse;
};

/**
* Forward declaration of specialized templates
*/

template <>
Number & SystemBase::duDotDuTempl<Real>();
template <>
VectorValue<Number> & SystemBase::duDotDuTempl<RealVectorValue>();
template <>
Number & SystemBase::duDotDuTempl<RealEigenVector>();
template <>
Number & SystemBase::duDotDotDuTempl<Real>();
template <>
VectorValue<Number> & SystemBase::duDotDotDuTempl<RealVectorValue>();
template <>
Number & SystemBase::duDotDotDuTempl<RealEigenVector>();
template <>
const Number & SystemBase::duDotDuTempl<Real>() const;
template <>
const VectorValue<Number> & SystemBase::duDotDuTempl<RealVectorValue>() const;
template <>
const Number & SystemBase::duDotDuTempl<RealEigenVector>() const;
template <>
const Number & SystemBase::duDotDotDuTempl<Real>() const;
template <>
const VectorValue<Number> & SystemBase::duDotDotDuTempl<RealVectorValue>() const;
template <>
const Number & SystemBase::duDotDuTempl<RealEigenVector>() const;

#define PARALLEL_TRY

#define PARALLEL_CATCH _fe_problem.checkExceptionAndStopSolve();
18 changes: 18 additions & 0 deletions framework/include/utils/MooseTypes.h
Expand Up @@ -252,6 +252,24 @@ struct DOFType<RealVectorValue>
{
typedef Real type;
};

template <typename>
struct RealToNumberHelper;
template <>
struct RealToNumberHelper<Real>
{
typedef Number type;
};
template <template <typename> class Wrapper>
struct RealToNumberHelper<Wrapper<Real>>
{
typedef Wrapper<Number> type;
};
template <>
struct RealToNumberHelper<RealEigenVector>
{
typedef Number type;
};
} // MOOSE

template <typename OutputType>
Expand Down
4 changes: 2 additions & 2 deletions framework/include/variables/MooseVariableData.h
Expand Up @@ -649,9 +649,9 @@ class MooseVariableData
/// nodal values of u_dotdot_old
DoFValue _dof_values_dotdot_old;
/// nodal values of derivative of u_dot wrt u
DoFValue _dof_du_dot_du;
MooseArray<Number> _dof_du_dot_du;
/// nodal values of derivative of u_dotdot wrt u
DoFValue _dof_du_dotdot_du;
MooseArray<Number> _dof_du_dotdot_du;

/// u
FieldVariableValue _u;
Expand Down
72 changes: 72 additions & 0 deletions framework/src/systems/SystemBase.C
Expand Up @@ -541,6 +541,78 @@ SystemBase::restoreOldSolutions()
}
}

template <>
Number & SystemBase::duDotDuTempl<Real>()
{
return duDotDu();
}

template <>
VectorValue<Number> & SystemBase::duDotDuTempl<RealVectorValue>()
{
return vectorDuDotDu();
}

template <>
Number & SystemBase::duDotDuTempl<RealEigenVector>()
{
return duDotDu();
}

template <>
Number & SystemBase::duDotDotDuTempl<Real>()
{
return duDotDotDu();
}

template <>
VectorValue<Number> & SystemBase::duDotDotDuTempl<RealVectorValue>()
{
return vectorDuDotDotDu();
}

template <>
Number & SystemBase::duDotDotDuTempl<RealEigenVector>()
{
return duDotDotDu();
}

template <>
const Number & SystemBase::duDotDuTempl<Real>() const
{
return duDotDu();
}

template <>
const VectorValue<Number> & SystemBase::duDotDuTempl<RealVectorValue>() const
{
return vectorDuDotDu();
}

template <>
const Number & SystemBase::duDotDuTempl<RealEigenVector>() const
{
return duDotDu();
}

template <>
const Number & SystemBase::duDotDotDuTempl<Real>() const
{
return duDotDotDu();
}

template <>
const VectorValue<Number> & SystemBase::duDotDotDuTempl<RealVectorValue>() const
{
return vectorDuDotDotDu();
}

template <>
const Number & SystemBase::duDotDotDuTempl<RealEigenVector>() const
{
return duDotDotDu();
}

NumericVector<Number> &
SystemBase::addVector(const std::string & vector_name, const bool project, const ParallelType type)
{
Expand Down
12 changes: 6 additions & 6 deletions framework/src/variables/MooseVariableData.C
Expand Up @@ -1155,8 +1155,8 @@ MooseVariableData<OutputType>::computeMonomialValues()
Real u_dotdot = 0;
Real u_dot_old = 0;
Real u_dotdot_old = 0;
const Real & du_dot_du = _sys.duDotDu();
const Real & du_dotdot_du = _sys.duDotDotDu();
const VectorValue<OutputType> & du_dot_du = _sys.duDotDuTempl<OutputType>();
const VectorValue<OutputType> & du_dotdot_du = _sys.duDotDotDuTempl<OutputType>();

if (_need_dof_values)
_dof_values[0] = soln;
Expand Down Expand Up @@ -2218,13 +2218,13 @@ MooseVariableData<OutputType>::fetchDoFValues()
{
_dof_du_dot_du.resize(n);
for (decltype(n) i = 0; i < n; ++i)
_dof_du_dot_du[i] = _sys.duDotDu();
_dof_du_dot_du[i] = _sys.duDotDuTempl<OutputType>();
}
if (_need_du_dotdot_du || _need_dof_du_dotdot_du)
{
_dof_du_dotdot_du.resize(n);
for (decltype(n) i = 0; i < n; ++i)
_dof_du_dotdot_du[i] = _sys.duDotDotDu();
_dof_du_dotdot_du[i] = _sys.duDotDotDuTempl<OutputType>();
}
}

Expand Down Expand Up @@ -2311,13 +2311,13 @@ MooseVariableData<RealEigenVector>::fetchDoFValues()
{
_dof_du_dot_du.resize(n);
for (decltype(n) i = 0; i < n; ++i)
_dof_du_dot_du[i] = _sys.duDotDu();
_dof_du_dot_du[i] = _sys.duDotDuTempl<RealEigenVector>();
}
if (_need_du_dotdot_du || _need_dof_du_dotdot_du)
{
_dof_du_dotdot_du.resize(n);
for (decltype(n) i = 0; i < n; ++i)
_dof_du_dotdot_du[i] = _sys.duDotDotDu();
_dof_du_dotdot_du[i] = _sys.duDotDotDuTempl<RealEigenVector>();
}
}

Expand Down

0 comments on commit 1cdbe99

Please sign in to comment.