16 #ifndef dealii_tensor_product_manifold_h 17 #define dealii_tensor_product_manifold_h 19 #include <deal.II/base/config.h> 21 #include <deal.II/base/point.h> 22 #include <deal.II/base/std_cxx14/memory.h> 23 #include <deal.II/base/subscriptor.h> 25 #include <deal.II/grid/manifold.h> 27 DEAL_II_NAMESPACE_OPEN
71 :
public ChartManifold<dim, spacedim_A + spacedim_B, chartdim_A + chartdim_B>
78 static const unsigned int chartdim = chartdim_A + chartdim_B;
83 static const unsigned int spacedim = spacedim_A + spacedim_B;
95 virtual std::unique_ptr<Manifold<dim, spacedim_A + spacedim_B>>
96 clone()
const override;
146 namespace TensorProductManifoldImplementation
148 template <
int dim1,
int dim2>
153 for (
unsigned int d = 0; d < dim1; ++d)
155 for (
unsigned int d = 0; d < dim2; ++d)
160 template <
int dim1,
int dim2>
165 for (
unsigned int d = 0; d < dim1; ++d)
167 for (
unsigned int d = 0; d < dim2; ++d)
172 template <
int dim1,
int dim2>
178 for (
unsigned int d = 0; d < dim1; ++d)
180 for (
unsigned int d = 0; d < dim2; ++d)
181 p2[d] = source[dim1 + d];
204 :
ChartManifold<dim, spacedim_A + spacedim_B, chartdim_A + chartdim_B>(
205 internal::TensorProductManifoldImplementation::concat(
208 , manifold_A(&manifold_A)
209 , manifold_B(&manifold_B)
219 std::unique_ptr<Manifold<dim, spacedim_A + spacedim_B>>
234 chartdim_B>>(*manifold_A,
266 chartdim_B>::
spacedim> &space_point)
const 270 internal::TensorProductManifoldImplementation::split_point(space_point,
277 return internal::TensorProductManifoldImplementation::concat(result_A,
309 chartdim_B>::
chartdim> &chart_point)
const 313 internal::TensorProductManifoldImplementation::split_point(chart_point,
320 return internal::TensorProductManifoldImplementation::concat(result_A,
361 chartdim_B>::
chartdim> &chart_point)
const 365 internal::TensorProductManifoldImplementation::split_point(chart_point,
376 for (
unsigned int i = 0; i < chartdim_A; ++i)
377 for (
unsigned int j = 0; j < spacedim_A; ++j)
378 result[j][i] = result_A[j][i];
379 for (
unsigned int i = 0; i < chartdim_B; ++i)
380 for (
unsigned int j = 0; j < spacedim_B; ++j)
381 result[j + spacedim_A][i + chartdim_A] = result_B[j][i];
388 DEAL_II_NAMESPACE_CLOSE
virtual DerivativeForm< 1, chartdim, spacedim > push_forward_gradient(const Point< chartdim > &chart_point) const override
virtual Point< spacedim > push_forward(const Point< chartdim > &chart_point) const override
static const unsigned int chartdim
virtual Point< chartdim > pull_back(const Point< spacedim > &space_point) const override
Tensor product manifold of two ChartManifolds.
virtual std::unique_ptr< Manifold< dim, spacedim_A+spacedim_B > > clone() const override
virtual DerivativeForm< 1, chartdim, spacedim > push_forward_gradient(const Point< chartdim > &chart_point) const
static const unsigned int spacedim
TensorProductManifold(const ChartManifold< dim_A, spacedim_A, chartdim_A > &manifold_A, const ChartManifold< dim_B, spacedim_B, chartdim_B > &manifold_B)
const Tensor< 1, chartdim > & get_periodicity() const
virtual Point< spacedim > push_forward(const Point< chartdim > &chart_point) const =0
virtual Point< chartdim > pull_back(const Point< spacedim > &space_point) const =0