35class DeformedCubeManifold :
public dealii::ChartManifold<dim, dim, dim>
38 DeformedCubeManifold(
double const left,
40 double const deformation,
41 unsigned int const frequency = 1)
42 : left(left), right(right), deformation(deformation), frequency(frequency)
47 push_forward(dealii::Point<dim>
const & chart_point)
const override
49 double sinval = deformation;
50 for(
unsigned int d = 0; d < dim; ++d)
52 std::sin(frequency * dealii::numbers::PI * (chart_point(d) - left) / (right - left));
53 dealii::Point<dim> space_point;
54 for(
unsigned int d = 0; d < dim; ++d)
55 space_point(d) = chart_point(d) + sinval;
61 pull_back(dealii::Point<dim>
const & space_point)
const override
63 dealii::Point<dim> x = space_point;
64 dealii::Point<dim> one;
65 for(
unsigned int d = 0; d < dim; ++d)
69 dealii::Tensor<1, dim> sinvals, residual;
71 for(
unsigned int d = 0; d < dim; ++d)
72 sinvals[d] = std::sin(frequency * dealii::numbers::PI * (x(d) - left) / (right - left));
73 double sinval = deformation;
74 for(
unsigned int d = 0; d < dim; ++d)
76 residual = space_point - (x + sinval * one);
79 while(residual.norm() > 1e-12 and its < 100)
81 dealii::Tensor<2, dim> jacobian;
82 for(
unsigned int d = 0; d < dim; ++d)
84 for(
unsigned int d = 0; d < dim; ++d)
87 deformation * frequency / (right - left) * dealii::numbers::PI *
88 std::cos(frequency * dealii::numbers::PI * (x(d) - left) / (right - left));
89 for(
unsigned int e = 0; e < dim; ++e)
91 sinval_der *= sinvals[e];
92 for(
unsigned int e = 0; e < dim; ++e)
93 jacobian[e][d] += sinval_der;
96 x += invert(jacobian) * residual;
98 for(
unsigned int d = 0; d < dim; ++d)
99 sinvals[d] = std::sin(frequency * dealii::numbers::PI * (x(d) - left) / (right - left));
100 sinval = deformation;
101 for(
unsigned int d = 0; d < dim; ++d)
102 sinval *= sinvals[d];
103 residual = space_point - (x + sinval * one);
108 AssertThrow(residual.norm() < 1e-12, dealii::ExcMessage(
"Newton for point did not converge."));
113 std::unique_ptr<dealii::Manifold<dim>>
114 clone()
const override
116 return std::make_unique<DeformedCubeManifold<dim>>(left, right, deformation, frequency);
122 double const deformation;
123 unsigned int const frequency;