* R}^{\text{spacedim}}$, the second derivative a bilinear map from ${\mathbb
* R}^{\text{dim}} \times {\mathbb R}^{\text{dim}}$ to ${\mathbb
* R}^{\text{spacedim}}$ and so on. In deal.II we represent these derivaties
- * using objects of type DerivativeForm<1,dim,spacedim>,
- * DerivativeForm<2,dim,spacedim> and so on.
- * @author Sebastian Pauletti, 2011
+ * using objects of type DerivativeForm<1,dim,spacedim,Number>,
+ * DerivativeForm<2,dim,spacedim,Number> and so on.
+ * @author Sebastian Pauletti, 2011, Luca Heltai, 2015
*/
-template <int order, int dim, int spacedim>
+template <int order, int dim, int spacedim, typename Number=double>
class DerivativeForm
{
public:
/**
* Constructor from a second order tensor.
*/
- DerivativeForm (const Tensor<2,dim> &);
+ DerivativeForm (const Tensor<2,dim,Number> &);
/**
* Read-Write access operator.
*/
- Tensor<order,dim> &operator [] (const unsigned int i);
+ Tensor<order,dim,Number> &operator [] (const unsigned int i);
/**
* Read-only access operator.
*/
- const Tensor<order,dim> &operator [] (const unsigned int i) const;
+ const Tensor<order,dim,Number> &operator [] (const unsigned int i) const;
/**
* Assignment operator.
*/
- DerivativeForm &operator = (const DerivativeForm <order, dim, spacedim> &);
+ DerivativeForm &operator = (const DerivativeForm <order, dim, spacedim, Number> &);
/**
* Assignment operator.
*/
- DerivativeForm &operator = (const Tensor<2,dim> &);
+ DerivativeForm &operator = (const Tensor<2,dim, Number> &);
/**
* Assignment operator.
*/
- DerivativeForm &operator = (const Tensor<1,dim> &);
+ DerivativeForm &operator = (const Tensor<1,dim, Number> &);
/**
- * Converts a DerivativeForm <1,dim, dim> to Tensor<2,dim>. If the
+ * Converts a DerivativeForm <1,dim, dim> to Tensor<2,dim,Number>. If the
* derivative is the Jacobian of F, then Tensor[i] = grad(F^i).
*/
- operator Tensor<2,dim>() const;
+ operator Tensor<2,dim,Number>() const;
/**
- * Converts a DerivativeForm <1, dim, 1> to Tensor<1,dim>.
+ * Converts a DerivativeForm <1, dim, 1> to Tensor<1,dim,Number>.
*/
- operator Tensor<1,dim>() const;
+ operator Tensor<1,dim,Number>() const;
/**
* Return the transpose of a rectangular DerivativeForm, that is to say
* viewed as a two dimensional matrix.
*/
- DerivativeForm<1, spacedim, dim> transpose () const;
+ DerivativeForm<1, spacedim, dim, Number> transpose () const;
/**
* covariant matrix, namely $DF*G^{-1}$, where $G = DF^{t}*DF$. If $DF$ is
* square, covariant from gives $DF^{-t}$.
*/
- DerivativeForm<1, dim, spacedim> covariant_form() const;
+ DerivativeForm<1, dim, spacedim, Number> covariant_form() const;
/**
* Auxiliary function that computes (*this) * T^{t}
*/
- DerivativeForm<1, dim, spacedim> times_T_t (Tensor<2,dim> T) const;
+ DerivativeForm<1, dim, spacedim, Number> times_T_t (Tensor<2,dim,Number> T) const;
private:
/**
* Array of tensors holding the subelements.
*/
- Tensor<order,dim> tensor[spacedim];
+ Tensor<order,dim,Number> tensor[spacedim];
};
-template <int order, int dim, int spacedim>
+template <int order, int dim, int spacedim, typename Number>
inline
-DerivativeForm<order, dim, spacedim>::DerivativeForm ()
+DerivativeForm<order, dim, spacedim, Number>::DerivativeForm ()
{
// default constructor. not specifying an initializer list calls
// the default constructor of the subobjects, which initialize them
-template <int order, int dim, int spacedim>
+template <int order, int dim, int spacedim, typename Number>
inline
-DerivativeForm<order, dim, spacedim>::DerivativeForm(const Tensor<2,dim> &T)
+DerivativeForm<order, dim, spacedim, Number>::DerivativeForm(const Tensor<2,dim,Number> &T)
{
Assert( (dim == spacedim) && (order==1),
ExcMessage("Only allowed for square tensors."));
-template <int order, int dim, int spacedim>
+template <int order, int dim, int spacedim, typename Number>
inline
-DerivativeForm<order, dim, spacedim> &
-DerivativeForm<order, dim, spacedim>::
-operator = (const DerivativeForm<order, dim, spacedim> &ta)
+DerivativeForm<order, dim, spacedim, Number> &
+DerivativeForm<order, dim, spacedim, Number>::
+operator = (const DerivativeForm<order, dim, spacedim, Number> &ta)
{
for (unsigned int j=0; j<spacedim; ++j)
(*this)[j] = ta[j];
-template <int order, int dim, int spacedim>
+template <int order, int dim, int spacedim, typename Number>
inline
-DerivativeForm<order, dim, spacedim> &DerivativeForm<order, dim, spacedim>::
-operator = (const Tensor<2,dim> &ta)
+DerivativeForm<order, dim, spacedim, Number> &DerivativeForm<order, dim, spacedim, Number>::
+operator = (const Tensor<2,dim,Number> &ta)
{
Assert( (dim == spacedim) && (order==1),
ExcMessage("Only allowed for square tensors."));
-template <int order, int dim, int spacedim>
+template <int order, int dim, int spacedim, typename Number>
inline
-DerivativeForm<order, dim, spacedim> &DerivativeForm<order, dim, spacedim>::
-operator = (const Tensor<1,dim> &T)
+DerivativeForm<order, dim, spacedim, Number> &DerivativeForm<order, dim, spacedim, Number>::
+operator = (const Tensor<1,dim,Number> &T)
{
Assert( (1 == spacedim) && (order==1),
ExcMessage("Only allowed for spacedim==1 and order==1."));
-template <int order, int dim, int spacedim>
+template <int order, int dim, int spacedim, typename Number>
inline
-Tensor<order,dim> &DerivativeForm<order, dim, spacedim>::
+Tensor<order,dim,Number> &DerivativeForm<order, dim, spacedim, Number>::
operator[] (const unsigned int i)
{
Assert (i<spacedim, ExcIndexRange(i, 0, spacedim));
-template <int order, int dim, int spacedim>
+template <int order, int dim, int spacedim, typename Number>
inline
-const Tensor<order,dim> &DerivativeForm<order, dim, spacedim>::
+const Tensor<order,dim,Number> &DerivativeForm<order, dim, spacedim, Number>::
operator[] (const unsigned int i) const
{
Assert (i<spacedim, ExcIndexRange(i, 0, spacedim));
-template <int order, int dim, int spacedim>
+template <int order, int dim, int spacedim, typename Number>
inline
-DerivativeForm<order, dim, spacedim>::operator Tensor<1,dim>() const
+DerivativeForm<order, dim, spacedim, Number>::operator Tensor<1,dim,Number>() const
{
Assert( (1 == spacedim) && (order==1),
ExcMessage("Only allowed for spacedim==1."));
-template <int order, int dim, int spacedim>
+template <int order, int dim, int spacedim, typename Number>
inline
-DerivativeForm<order, dim, spacedim>::operator Tensor<2,dim>() const
+DerivativeForm<order, dim, spacedim, Number>::operator Tensor<2,dim,Number>() const
{
Assert( (dim == spacedim) && (order==1),
ExcMessage("Only allowed for square tensors."));
-
-
- Tensor<2,dim> t;
+ Tensor<2,dim,Number> t;
if ((dim == spacedim) && (order==1))
for (unsigned int j=0; j<dim; ++j)
-template <int order, int dim, int spacedim>
+template <int order, int dim, int spacedim, typename Number>
inline
-DerivativeForm<1,spacedim,dim>
-DerivativeForm<order,dim,spacedim>::
+DerivativeForm<1,spacedim,dim,Number>
+DerivativeForm<order,dim,spacedim,Number>::
transpose () const
{
Assert(order==1, ExcMessage("Only for rectangular DerivativeForm."));
- DerivativeForm<1,spacedim,dim> tt;
+ DerivativeForm<1,spacedim,dim,Number> tt;
for (unsigned int i=0; i<spacedim; ++i)
for (unsigned int j=0; j<dim; ++j)
-template <int order, int dim, int spacedim>
+template <int order, int dim, int spacedim, typename Number>
inline
-DerivativeForm<1, dim, spacedim>
-DerivativeForm<order,dim,spacedim>::times_T_t (Tensor<2,dim> T) const
+DerivativeForm<1, dim, spacedim,Number>
+DerivativeForm<order,dim,spacedim,Number>::times_T_t (Tensor<2,dim,Number> T) const
{
Assert( order==1, ExcMessage("Only for order == 1."));
- DerivativeForm<1,dim, spacedim> dest;
+ DerivativeForm<1,dim, spacedim,Number> dest;
for (unsigned int i=0; i<spacedim; ++i)
for (unsigned int j=0; j<dim; ++j)
dest[i][j] = (*this)[i] * T[j];
}
-template <int order, int dim, int spacedim>
+template <int order, int dim, int spacedim, typename Number>
inline
double
-DerivativeForm<order,dim,spacedim>::determinant () const
+DerivativeForm<order,dim,spacedim,Number>::determinant () const
{
Assert( order==1, ExcMessage("Only for order == 1."));
if (dim == spacedim)
{
- Tensor<2,dim> T = (Tensor<2,dim>)( (*this) );
+ Tensor<2,dim,Number> T = (Tensor<2,dim,Number>)( (*this) );
return dealii::determinant(T);
}
else
{
Assert( spacedim>dim, ExcMessage("Only for spacedim>dim."));
DerivativeForm<1,spacedim,dim> DF_t = this->transpose();
- Tensor<2, dim> G; //First fundamental form
+ Tensor<2,dim,Number> G; //First fundamental form
for (unsigned int i=0; i<dim; ++i)
for (unsigned int j=0; j<dim; ++j)
G[i][j] = DF_t[i] * DF_t[j];
-template <int order, int dim, int spacedim>
+template <int order, int dim, int spacedim, typename Number>
inline
-DerivativeForm<1,dim,spacedim>
-DerivativeForm<order,dim,spacedim>::covariant_form() const
+DerivativeForm<1,dim,spacedim,Number>
+DerivativeForm<order,dim,spacedim,Number>::covariant_form() const
{
if (dim == spacedim)
{
- Tensor<2,dim> DF_t (dealii::transpose(invert( (Tensor<2,dim>)(*this) )));
+ Tensor<2,dim,Number> DF_t (dealii::transpose(invert( (Tensor<2,dim,Number>)(*this) )));
DerivativeForm<1,dim, spacedim> result = DF_t;
return (result);
}
{
DerivativeForm<1,spacedim,dim> DF_t = this->transpose();
- Tensor<2, dim> G; //First fundamental form
+ Tensor<2,dim,Number> G; //First fundamental form
for (unsigned int i=0; i<dim; ++i)
for (unsigned int j=0; j<dim; ++j)
G[i][j] = DF_t[i] * DF_t[j];
}
-template <int order, int dim, int spacedim>
+template <int order, int dim, int spacedim, typename Number>
inline
std::size_t
-DerivativeForm<order, dim, spacedim>::memory_consumption ()
+DerivativeForm<order, dim, spacedim, Number>::memory_consumption ()
{
- return sizeof(DerivativeForm<order, dim, spacedim>);
+ return sizeof(DerivativeForm<order, dim, spacedim, Number>);
}
#endif // DOXYGEN
* @relates DerivativeForm
* @author Sebastian Pauletti, 2011
*/
-template <int spacedim, int dim>
+template <int spacedim, int dim, typename Number>
inline
-Tensor<1, spacedim>
-apply_transformation (const DerivativeForm<1,dim,spacedim> &DF,
- const Tensor<1,dim> &T)
+Tensor<1,spacedim,Number>
+apply_transformation (const DerivativeForm<1,dim,spacedim,Number> &DF,
+ const Tensor<1,dim,Number> &T)
{
- Tensor<1, spacedim> dest;
+ Tensor<1,spacedim,Number> dest;
for (unsigned int i=0; i<spacedim; ++i)
dest[i] = DF[i] * T;
return dest;
* @author Sebastian Pauletti, 2011
*/
//rank=2
-template <int spacedim, int dim>
+template <int spacedim, int dim, typename Number>
inline
DerivativeForm<1, spacedim, dim>
-apply_transformation (const DerivativeForm<1,dim,spacedim> &DF,
- const Tensor<2,dim> &T)
+apply_transformation (const DerivativeForm<1,dim,spacedim,Number> &DF,
+ const Tensor<2,dim,Number> &T)
{
DerivativeForm<1, spacedim, dim> dest;
* @relates DerivativeForm
* @author Sebastian Pauletti, 2011
*/
-template <int spacedim, int dim>
+template <int spacedim, int dim, typename Number>
inline
-Tensor<2, spacedim>
-apply_transformation (const DerivativeForm<1,dim,spacedim> &DF1,
- const DerivativeForm<1,dim,spacedim> &DF2)
+Tensor<2,spacedim,Number>
+apply_transformation (const DerivativeForm<1,dim,spacedim,Number> &DF1,
+ const DerivativeForm<1,dim,spacedim,Number> &DF2)
{
- Tensor<2, spacedim> dest;
+ Tensor<2,spacedim,Number> dest;
for (unsigned int i=0; i<spacedim; ++i)
dest[i] = apply_transformation(DF1, DF2[i]);
* @relates DerivativeForm
* @author Sebastian Pauletti, 2011
*/
-template <int dim, int spacedim>
+template <int dim, int spacedim, typename Number>
inline
-DerivativeForm<1,spacedim,dim>
-transpose (const DerivativeForm<1,dim,spacedim> &DF)
+DerivativeForm<1,spacedim,dim,Number>
+transpose (const DerivativeForm<1,dim,spacedim,Number> &DF)
{
- DerivativeForm<1,spacedim,dim> tt;
+ DerivativeForm<1,spacedim,dim,Number> tt;
tt = DF.transpose();
return tt;
}