40class BoundaryLayerManifold :
public dealii::ChartManifold<dim, dim, dim>
43 BoundaryLayerManifold(dealii::Tensor<1, dim>
const & dimensions_in,
44 double const grid_stretch_factor_in)
46 dimensions = dimensions_in;
47 grid_stretch_factor = grid_stretch_factor_in;
55 push_forward(dealii::Point<dim>
const & xi)
const final
59 x[0] = xi[0] * dimensions[0] - dimensions[0] / 2.0;
60 x[1] = grid_transform_y(xi[1]);
63 x[2] = xi[2] * dimensions[2] - dimensions[2] / 2.0;
73 pull_back(dealii::Point<dim>
const & x)
const final
75 dealii::Point<dim> xi;
77 xi[0] = x[0] / dimensions[0] + 0.5;
78 xi[1] = inverse_grid_transform_y(x[1]);
81 xi[2] = x[2] / dimensions[2] + 0.5;
86 std::unique_ptr<dealii::Manifold<dim>>
89 return std::make_unique<BoundaryLayerManifold<dim>>(dimensions, grid_stretch_factor);
96 grid_transform_y(
double const & eta)
const
100 if(grid_stretch_factor >= 0)
101 y = dimensions[1] / 2.0 * std::tanh(grid_stretch_factor * (2. * eta - 1.)) /
102 std::tanh(grid_stretch_factor);
104 y = dimensions[1] / 2.0 * (2. * eta - 1.);
115 inverse_grid_transform_y(
double const & y)
const
119 if(grid_stretch_factor >= 0)
120 eta = (std::atanh(y * std::tanh(grid_stretch_factor) * 2.0 / dimensions[1]) /
121 grid_stretch_factor +
125 eta = (2. * y / dimensions[1] + 1.) / 2.0;
131 dealii::Tensor<1, dim> dimensions;
134 double grid_stretch_factor = 1.8;