41class BoundaryLayerManifold :
public dealii::ChartManifold<dim, dim, dim>
44 BoundaryLayerManifold(dealii::Tensor<1, dim>
const & dimensions_in,
45 double const grid_stretch_factor_in)
47 dimensions = dimensions_in;
48 grid_stretch_factor = grid_stretch_factor_in;
56 push_forward(dealii::Point<dim>
const & xi)
const final
60 x[0] = xi[0] * dimensions[0] - dimensions[0] / 2.0;
61 x[1] = grid_transform_y(xi[1]);
64 x[2] = xi[2] * dimensions[2] - dimensions[2] / 2.0;
74 pull_back(dealii::Point<dim>
const & x)
const final
76 dealii::Point<dim> xi;
78 xi[0] = x[0] / dimensions[0] + 0.5;
79 xi[1] = inverse_grid_transform_y(x[1]);
82 xi[2] = x[2] / dimensions[2] + 0.5;
87 std::unique_ptr<dealii::Manifold<dim>>
90 return std::make_unique<BoundaryLayerManifold<dim>>(dimensions, grid_stretch_factor);
97 grid_transform_y(
double const & eta)
const
101 if(grid_stretch_factor >= 0)
102 y = dimensions[1] / 2.0 * std::tanh(grid_stretch_factor * (2. * eta - 1.)) /
103 std::tanh(grid_stretch_factor);
105 y = dimensions[1] / 2.0 * (2. * eta - 1.);
116 inverse_grid_transform_y(
double const & y)
const
120 if(grid_stretch_factor >= 0)
121 eta = (std::atanh(y * std::tanh(grid_stretch_factor) * 2.0 / dimensions[1]) /
122 grid_stretch_factor +
126 eta = (2. * y / dimensions[1] + 1.) / 2.0;
132 dealii::Tensor<1, dim> dimensions;
135 double grid_stretch_factor = 1.8;