13#ifndef dealii_tensor_product_manifold_h
14#define dealii_tensor_product_manifold_h
68 :
public ChartManifold<dim, spacedim_A + spacedim_B, chartdim_A + chartdim_B>
75 static const unsigned int chartdim = chartdim_A + chartdim_B;
80 static const unsigned int spacedim = spacedim_A + spacedim_B;
92 virtual std::unique_ptr<Manifold<dim, spacedim_A + spacedim_B>>
93 clone()
const override;
114 std::unique_ptr<const ChartManifold<dim_A, spacedim_A, chartdim_A>>
117 std::unique_ptr<const ChartManifold<dim_B, spacedim_B, chartdim_B>>
129 namespace TensorProductManifoldImplementation
131 template <
int dim1,
int dim2>
136 for (
unsigned int d = 0; d < dim1; ++d)
138 for (
unsigned int d = 0; d < dim2; ++d)
143 template <
int dim1,
int dim2>
148 for (
unsigned int d = 0; d < dim1; ++d)
150 for (
unsigned int d = 0; d < dim2; ++d)
155 template <
int dim1,
int dim2>
161 for (
unsigned int d = 0; d < dim1; ++d)
163 for (
unsigned int d = 0; d < dim2; ++d)
164 p2[d] = source[dim1 + d];
184 TensorProductManifold(
187 :
ChartManifold<dim, spacedim_A + spacedim_B, chartdim_A + chartdim_B>(
188 internal::TensorProductManifoldImplementation::concat(
189 manifold_A.get_periodicity(),
190 manifold_B.get_periodicity()))
191 , manifold_A(
Utilities::dynamic_unique_cast<
193 Manifold<dim_A, spacedim_A>>(manifold_A.clone()))
194 , manifold_B(
Utilities::dynamic_unique_cast<
196 Manifold<dim_B, spacedim_B>>(manifold_B.clone()))
206std::unique_ptr<Manifold<dim, spacedim_A + spacedim_B>>
213 chartdim_B>::clone()
const
221 chartdim_B>>(*manifold_A,
238 chartdim_B>::chartdim>
253 chartdim_B>::spacedim> &space_point)
const
281 chartdim_B>::spacedim>
296 chartdim_B>::chartdim> &chart_point)
const
325 chartdim_B>::chartdim,
332 chartdim_B>::spacedim>
341 push_forward_gradient(
348 chartdim_B>::chartdim> &chart_point)
const
357 manifold_A->push_forward_gradient(chart_point_A);
359 manifold_B->push_forward_gradient(chart_point_B);
363 for (
unsigned int i = 0; i < chartdim_A; ++i)
364 for (
unsigned int j = 0; j < spacedim_A; ++j)
365 result[j][i] = result_A[j][i];
366 for (
unsigned int i = 0; i < chartdim_B; ++i)
367 for (
unsigned int j = 0; j < spacedim_B; ++j)
368 result[j + spacedim_A][i + chartdim_A] = result_B[j][i];
Tensor product manifold of two ChartManifolds.
static const unsigned int chartdim
virtual Point< spacedim > push_forward(const Point< chartdim > &chart_point) const override
virtual DerivativeForm< 1, chartdim, spacedim > push_forward_gradient(const Point< chartdim > &chart_point) const override
static const unsigned int spacedim
virtual Point< chartdim > pull_back(const Point< spacedim > &space_point) const override
virtual std::unique_ptr< Manifold< dim, spacedim_A+spacedim_B > > clone() const override
std::unique_ptr< const ChartManifold< dim_B, spacedim_B, chartdim_B > > manifold_B
std::unique_ptr< const ChartManifold< dim_A, spacedim_A, chartdim_A > > manifold_A
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
Tensor< 1, dim1+dim2 > concat(const Tensor< 1, dim1 > &p1, const Tensor< 1, dim2 > &p2)
void split_point(const Point< dim1+dim2 > &source, Point< dim1 > &p1, Point< dim2 > &p2)