16 #ifndef dealii_tensor_product_manifold_h 17 #define dealii_tensor_product_manifold_h 72 :
public ChartManifold<dim, spacedim_A + spacedim_B, chartdim_A + chartdim_B>
79 static const unsigned int chartdim = chartdim_A + chartdim_B;
84 static const unsigned int spacedim = spacedim_A + spacedim_B;
96 virtual std::unique_ptr<Manifold<dim, spacedim_A + spacedim_B>>
97 clone()
const override;
118 std::unique_ptr<const ChartManifold<dim_A, spacedim_A, chartdim_A>>
121 std::unique_ptr<const ChartManifold<dim_B, spacedim_B, chartdim_B>>
133 namespace TensorProductManifoldImplementation
135 template <
int dim1,
int dim2>
140 for (
unsigned int d = 0;
d < dim1; ++
d)
142 for (
unsigned int d = 0;
d < dim2; ++
d)
147 template <
int dim1,
int dim2>
152 for (
unsigned int d = 0;
d < dim1; ++
d)
154 for (
unsigned int d = 0;
d < dim2; ++
d)
159 template <
int dim1,
int dim2>
165 for (
unsigned int d = 0;
d < dim1; ++
d)
167 for (
unsigned int d = 0;
d < dim2; ++
d)
168 p2[
d] = source[dim1 +
d];
191 :
ChartManifold<dim, spacedim_A + spacedim_B, chartdim_A + chartdim_B>(
210 std::unique_ptr<Manifold<dim, spacedim_A + spacedim_B>>
257 chartdim_B>::
spacedim> &space_point)
const 300 chartdim_B>::
chartdim> &chart_point)
const 352 chartdim_B>::
chartdim> &chart_point)
const 361 manifold_A->push_forward_gradient(chart_point_A);
363 manifold_B->push_forward_gradient(chart_point_B);
367 for (
unsigned int i = 0; i < chartdim_A; ++i)
368 for (
unsigned int j = 0; j < spacedim_A; ++j)
369 result[j][i] = result_A[j][i];
370 for (
unsigned int i = 0; i < chartdim_B; ++i)
371 for (
unsigned int j = 0; j < spacedim_B; ++j)
372 result[j + spacedim_A][i + chartdim_A] = result_B[j][i];
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.
std::unique_ptr< To > dynamic_unique_cast(std::unique_ptr< From > &&p)
virtual std::unique_ptr< Manifold< dim, spacedim_A+spacedim_B > > clone() const override
void split_point(const Point< dim1+dim2 > &source, Point< dim1 > &p1, Point< dim2 > &p2)
std::unique_ptr< const ChartManifold< dim_A, spacedim_A, chartdim_A > > manifold_A
#define DEAL_II_NAMESPACE_CLOSE
Point< dim1+dim2 > concat(const Point< dim1 > &p1, const Point< dim2 > &p2)
const Tensor< 1, chartdim > & get_periodicity() const
SymmetricTensor< 2, dim, Number > d(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
static const unsigned int spacedim
std::unique_ptr< const ChartManifold< dim_B, spacedim_B, chartdim_B > > manifold_B
TensorProductManifold(const ChartManifold< dim_A, spacedim_A, chartdim_A > &manifold_A, const ChartManifold< dim_B, spacedim_B, chartdim_B > &manifold_B)
#define DEAL_II_NAMESPACE_OPEN
Tensor< 1, dim1+dim2 > concat(const Tensor< 1, dim1 > &p1, const Tensor< 1, dim2 > &p2)