ASPECT
spherical_shell.h
Go to the documentation of this file.
1 // ------------------------------------------------------
2 //
3 // SPDX-License-Identifier: GPL-2.0-or-later
4 //
5 // SPDX-FileCopyrightText: Copyright (C) 2011-2026 by the ASPECT authors.
6 //
7 // This file is part of ASPECT.
8 //
9 // Detailed license information governing the source code and
10 // contributions can be found in the folder LICENSES and in
11 // LICENSE and CONTRIBUTING.md at the top level directory.
12 //
13 // ------------------------------------------------------
14 
15 
16 #ifndef _aspect_geometry_model_spherical_shell_h
17 #define _aspect_geometry_model_spherical_shell_h
18 
21 
22 namespace aspect
23 {
24  namespace GeometryModel
25  {
26  namespace internal
27  {
32  template <int dim>
33  class SphericalManifoldWithTopography : public aspect::SphericalManifold<dim>
34  {
35  public:
39  SphericalManifoldWithTopography(const std::shared_ptr<const InitialTopographyModel::Interface<dim>> topography,
40  const double inner_radius,
41  const double outer_radius);
42 
47 
51  virtual std::unique_ptr<Manifold<dim, dim>>
52  clone() const override;
53 
59  push_forward_from_sphere (const Point<dim> &p) const;
60 
66  pull_back_to_sphere (const Point<dim> &p) const;
67 
75  virtual Point<dim>
77  const Point<dim> &p2,
78  const double w) const override;
79 
84  virtual Tensor<1, dim>
86  const Point<dim> &x2) const override;
87 
103  virtual Tensor<1, dim>
105  const typename Triangulation<dim, dim>::face_iterator &face,
106  const Point<dim> &p) const override;
107 
111  virtual void
113  const typename Triangulation<dim, dim>::face_iterator &face,
114  typename Manifold<dim, dim>::FaceVertexNormals &face_vertex_normals)
115  const override;
116 
117 
132  virtual void
133  get_new_points(const ArrayView<const Point<dim>> &surrounding_points,
134  const Table<2, double> &weights,
135  ArrayView<Point<dim>> new_points) const override;
136 
141  virtual Point<dim>
142  get_new_point(const ArrayView<const Point<dim>> &vertices,
143  const ArrayView<const double> &weights) const override;
148  double topography_for_point (const Point<dim> &x_y_z) const;
149 
150  private:
154  const std::shared_ptr<const InitialTopographyModel::Interface<dim>> topo;
155 
159  const double R0, R1;
160  };
161 
162  }
163 
174  template <int dim>
175  class SphericalShell : public Interface<dim>, public SimulatorAccess<dim>
176  {
177  public:
181  SphericalShell() = default;
182 
191  void initialize () override;
192 
196  void create_coarse_mesh (parallel::distributed::Triangulation<dim> &coarse_grid) const override;
197 
205  double length_scale () const override;
206 
220  double depth(const Point<dim> &position) const override;
221 
226  double height_above_reference_surface(const Point<dim> &position) const override;
227 
231  Point<dim> representative_point(const double depth) const override;
232 
236  double maximal_depth() const override;
237 
259  std::set<types::boundary_id>
260  get_used_boundary_indicators () const override;
261 
267  std::map<std::string,types::boundary_id>
268  get_symbolic_boundary_names_map () const override;
269 
274  std::set<std::pair<std::pair<types::boundary_id, types::boundary_id>, unsigned int>>
275  get_periodic_boundary_pairs () const override;
276 
283  void
284  adjust_positions_for_periodicity (Point<dim> &position,
285  const ArrayView<Point<dim>> &connected_positions = {},
286  const ArrayView<Tensor<1, dim>> &connected_velocities = {}) const override;
287 
293  bool
294  has_curved_elements() const override;
295 
301  bool
302  point_is_in_domain(const Point<dim> &point) const override;
303 
308  aspect::Utilities::Coordinates::CoordinateSystem natural_coordinate_system() const override;
309 
315  std::array<double,dim> cartesian_to_natural_coordinates(const Point<dim> &position) const override;
316 
322  Point<dim> natural_to_cartesian_coordinates(const std::array<double,dim> &position) const override;
323 
324 
328  static
329  void
331 
335  void
336  parse_parameters (ParameterHandler &prm) override;
337 
341  double
342  inner_radius () const;
343 
347  double
348  outer_radius () const;
349 
353  double
354  opening_angle () const;
355 
360  void
362  AffineConstraints<double> &constraints) const override;
363 
367  void
369  const DoFHandler<dim> &dof_handler,
370  const unsigned int level,
371  AffineConstraints<double> &constraints) const override;
372 
373  private:
381  {
384  slices
385  } custom_mesh;
386 
392 
397  unsigned int n_slices;
398 
403  std::vector<double> R_values_list;
404 
409  double R0;
414  double R1;
415 
420  double phi;
421 
427 
433  bool periodic;
434 
446  std::unique_ptr<const internal::SphericalManifoldWithTopography<dim>> manifold;
447 
451  static constexpr types::manifold_id my_manifold_id = 99;
452 
457  void set_manifold_ids (parallel::distributed::Triangulation<dim> &triangulation) const;
458  };
459  }
460 }
461 
462 
463 #endif
virtual Point< dim > get_new_point(const ArrayView< const Point< dim >> &vertices, const ArrayView< const double > &weights) const override
std::unique_ptr< const internal::SphericalManifoldWithTopography< dim > > manifold
virtual Point< dim > get_intermediate_point(const Point< dim > &p1, const Point< dim > &p2, const double w) const override
const std::shared_ptr< const InitialTopographyModel::Interface< dim > > topo
void make_periodicity_constraints(const FaceIterator &face_1, const std_cxx20::type_identity_t< FaceIterator > &face_2, AffineConstraints< number > &constraints, const ComponentMask &component_mask={}, const types::geometric_orientation combined_orientation=numbers::default_geometric_orientation, const FullMatrix< double > &matrix=FullMatrix< double >(), const std::vector< unsigned int > &first_vector_components=std::vector< unsigned int >(), const number periodicity_factor=1.)
virtual std::unique_ptr< Manifold< dim, dim > > clone() const override
SphericalManifoldWithTopography(const std::shared_ptr< const InitialTopographyModel::Interface< dim >> topography, const double inner_radius, const double outer_radius)
void declare_parameters(ParameterHandler &prm)
Point< dim > push_forward_from_sphere(const Point< dim > &p) const
Tensor< 2, dim, Number > w(const Tensor< 2, dim, Number > &F, const Tensor< 2, dim, Number > &dF_dt)
unsigned int level
virtual void get_new_points(const ArrayView< const Point< dim >> &surrounding_points, const Table< 2, double > &weights, ArrayView< Point< dim >> new_points) const override
virtual void get_normals_at_vertices(const typename Triangulation< dim, dim >::face_iterator &face, typename Manifold< dim, dim >::FaceVertexNormals &face_vertex_normals) const override
Point< dim > pull_back_to_sphere(const Point< dim > &p) const
void make_periodicity_constraints_on_level(const FaceIterator &face_1, const std_cxx20::type_identity_t< FaceIterator > &face_2, const unsigned int level, AffineConstraints< number > &constraints, const ComponentMask &component_mask={}, const types::geometric_orientation combined_orientation=numbers::default_geometric_orientation, const FullMatrix< double > &matrix=FullMatrix< double >(), const std::vector< unsigned int > &first_vector_components=std::vector< unsigned int >(), const number periodicity_factor=1.)
std::array< Tensor< 1, spacedim >, GeometryInfo< dim >::vertices_per_face > FaceVertexNormals
virtual Tensor< 1, dim > normal_vector(const typename Triangulation< dim, dim >::face_iterator &face, const Point< dim > &p) const override
double topography_for_point(const Point< dim > &x_y_z) const
virtual Tensor< 1, dim > get_tangent_vector(const Point< dim > &x1, const Point< dim > &x2) const override
*  *  const Number outer_radius