#include <deal.II/fe/fe_values.h>
#include <deal.II/fe/mapping.h>
#include <deal.II/fe/mapping_fe_field.h>
+#include <deal.II/fe/mapping_internal.h>
#include <deal.II/grid/tria_iterator.h>
{
case mapping_covariant_gradient:
{
- Assert(data.update_each & update_contravariant_transformation,
+ Assert(data.update_each & update_covariant_transformation,
typename FEValuesBase<dim>::ExcAccessToUninitializedField(
"update_covariant_transformation"));
for (unsigned int q = 0; q < output.size(); ++q)
- for (unsigned int i = 0; i < spacedim; ++i)
- for (unsigned int j = 0; j < spacedim; ++j)
- for (unsigned int k = 0; k < spacedim; ++k)
- {
- output[q][i][j][k] = data.covariant[q][j][0] *
- data.covariant[q][k][0] *
- input[q][i][0][0];
- for (unsigned int J = 0; J < dim; ++J)
- {
- const unsigned int K0 = (0 == J) ? 1 : 0;
- for (unsigned int K = K0; K < dim; ++K)
- output[q][i][j][k] += data.covariant[q][j][J] *
- data.covariant[q][k][K] *
- input[q][i][J][K];
- }
- }
+ output[q] =
+ internal::apply_covariant_gradient(data.covariant[q], input[q]);
+
return;
}
namespace internal
{
+ /**
+ * Map the gradient of a covariant vector field. For more information see the
+ * overload of Mapping::transform() which maps 2-differential forms from the
+ * reference cell to the physical cell.
+ */
+ template <int dim, int spacedim, typename Number>
+ Tensor<3, spacedim, Number>
+ apply_covariant_gradient(
+ const DerivativeForm<1, dim, spacedim, Number> &covariant,
+ const DerivativeForm<2, dim, spacedim, Number> &input);
+
/**
* Map the Hessian of a contravariant vector field. For more information see
* the overload of Mapping::transform() which maps 3-differential forms from
namespace internal
{
+ template <int dim, int spacedim, typename Number>
+ Tensor<3, spacedim, Number>
+ apply_covariant_gradient(
+ const DerivativeForm<1, dim, spacedim, Number> &covariant,
+ const DerivativeForm<2, dim, spacedim, Number> &input)
+ {
+ Tensor<3, spacedim, Number> output;
+ for (unsigned int i = 0; i < spacedim; ++i)
+ for (unsigned int j = 0; j < spacedim; ++j)
+ {
+ double tmp[dim];
+ for (unsigned int K = 0; K < dim; ++K)
+ {
+ tmp[K] = covariant[j][0] * input[i][0][K];
+ for (unsigned int J = 1; J < dim; ++J)
+ tmp[K] += covariant[j][J] * input[i][J][K];
+ }
+ for (unsigned int k = 0; k < spacedim; ++k)
+ {
+ output[i][j][k] = covariant[k][0] * tmp[0];
+ for (unsigned int K = 1; K < dim; ++K)
+ output[i][j][k] += covariant[k][K] * tmp[K];
+ }
+ }
+
+ return output;
+ }
+
+
+
template <int dim, int spacedim, typename Number>
inline Tensor<3, spacedim, Number>
apply_contravariant_hessian(
{
case mapping_covariant_gradient:
{
- Assert(data.update_each & update_contravariant_transformation,
+ Assert(data.update_each & update_covariant_transformation,
typename FEValuesBase<dim>::ExcAccessToUninitializedField(
"update_covariant_transformation"));
for (unsigned int q = 0; q < output.size(); ++q)
- for (unsigned int i = 0; i < spacedim; ++i)
- for (unsigned int j = 0; j < spacedim; ++j)
- {
- double tmp[dim];
- for (unsigned int K = 0; K < dim; ++K)
- {
- tmp[K] = data.covariant[q][j][0] * input[q][i][0][K];
- for (unsigned int J = 1; J < dim; ++J)
- tmp[K] += data.covariant[q][j][J] * input[q][i][J][K];
- }
- for (unsigned int k = 0; k < spacedim; ++k)
- {
- output[q][i][j][k] = data.covariant[q][k][0] * tmp[0];
- for (unsigned int K = 1; K < dim; ++K)
- output[q][i][j][k] += data.covariant[q][k][K] * tmp[K];
- }
- }
+ output[q] =
+ internal::apply_covariant_gradient(data.covariant[q], input[q]);
+
return;
}
{
case mapping_covariant_gradient:
{
- Assert(data.update_each & update_contravariant_transformation,
+ Assert(data.update_each & update_covariant_transformation,
typename FEValuesBase<dim>::ExcAccessToUninitializedField(
"update_covariant_transformation"));
for (unsigned int q = 0; q < output.size(); ++q)
- for (unsigned int i = 0; i < spacedim; ++i)
- for (unsigned int j = 0; j < spacedim; ++j)
- {
- double tmp[dim];
- for (unsigned int K = 0; K < dim; ++K)
- {
- tmp[K] = data.covariant[q][j][0] * input[q][i][0][K];
- for (unsigned int J = 1; J < dim; ++J)
- tmp[K] += data.covariant[q][j][J] * input[q][i][J][K];
- }
- for (unsigned int k = 0; k < spacedim; ++k)
- {
- output[q][i][j][k] = data.covariant[q][k][0] * tmp[0];
- for (unsigned int K = 1; K < dim; ++K)
- output[q][i][j][k] += data.covariant[q][k][K] * tmp[K];
- }
- }
+ output[q] =
+ internal::apply_covariant_gradient(data.covariant[q], input[q]);
+
return;
}
"update_covariant_transformation"));
for (unsigned int q = 0; q < output.size(); ++q)
- for (unsigned int i = 0; i < spacedim; ++i)
- for (unsigned int j = 0; j < spacedim; ++j)
- {
- double tmp[dim];
- const DerivativeForm<1, dim, spacedim> covariant =
- data.inverse_jacobians[q].transpose();
- for (unsigned int K = 0; K < dim; ++K)
- {
- tmp[K] = covariant[j][0] * input[q][i][0][K];
- for (unsigned int J = 1; J < dim; ++J)
- tmp[K] += covariant[j][J] * input[q][i][J][K];
- }
- for (unsigned int k = 0; k < spacedim; ++k)
- {
- output[q][i][j][k] = covariant[k][0] * tmp[0];
- for (unsigned int K = 1; K < dim; ++K)
- output[q][i][j][k] += covariant[k][K] * tmp[K];
- }
- }
+ {
+ const DerivativeForm<1, dim, spacedim> covariant =
+ data.inverse_jacobians[q].transpose();
+ output[q] =
+ internal::apply_covariant_gradient(covariant, input[q]);
+ }
return;
}