ASPECT
introspection.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_introspection_h
17 #define _aspect_introspection_h
18 
19 #include <deal.II/base/index_set.h>
23 #include <deal.II/fe/fe.h>
24 
26 #include <aspect/parameters.h>
27 
28 #include <map>
29 
30 namespace aspect
31 {
36  template <int dim>
37  std::vector<VariableDeclaration<dim>>
38  construct_default_variables (const Parameters<dim> &parameters);
39 
40 
47  {
51  enum Type
52  {
54  stress = 1,
55  strain = 2,
57  porosity = 4,
58  density = 5,
59  entropy = 6,
61  generic = 8,
63  } type;
64 
68  constexpr static unsigned int n_types = 9;
69 
74  static
75  Type
76  parse_type(const std::string &input)
77  {
78  if (input == "chemical composition")
80  else if (input == "stress")
82  else if (input == "strain")
84  else if (input == "grain size")
86  else if (input == "porosity")
88  else if (input == "density")
90  else if (input == "entropy")
92  else if (input == "reaction progress")
94  else if (input == "generic")
96  else if (input == "unspecified")
98  else
99  AssertThrow(false, ExcMessage("Unknown compositional field type."));
100 
102  }
103 
108  static
109  std::string
111  {
112  switch (type)
113  {
115  return "chemical composition";
116  case stress:
117  return "stress";
118  case strain:
119  return "strain";
120  case grain_size:
121  return "grain size";
122  case porosity:
123  return "porosity";
124  case density:
125  return "density";
126  case entropy:
127  return "entropy";
128  case generic:
129  return "generic";
130  case unspecified:
131  return "unspecified";
132  default:
133  AssertThrow(false, ExcInternalError());
134  }
135 
136  return "";
137  }
138  };
139 
157  template <int dim>
159  {
160  public:
164  Introspection (const std::vector<VariableDeclaration<dim>> &variables,
165  const Parameters<dim> &parameters);
166 
167 
180  const unsigned int n_components;
181 
185  const unsigned int n_compositional_fields;
186 
192 
198 
204  {
205  std::array<unsigned int, dim> velocities;
206  unsigned int pressure;
207  unsigned int temperature;
208  std::vector<unsigned int> compositional_fields;
209  };
215 
221  const unsigned int n_blocks;
222 
228  {
229  unsigned int velocities;
230  unsigned int pressure;
231  unsigned int temperature;
232  std::vector<unsigned int> compositional_fields;
233 
241  std::vector<unsigned int> compositional_field_sparsity_pattern;
242  };
243 
249 
254  struct Extractors
255  {
256  Extractors (const ComponentIndices &component_indices);
257 
261  const std::vector<FEValuesExtractors::Scalar> compositional_fields;
262  };
263 
269 
280  {
281  unsigned int velocities;
282  unsigned int pressure;
283  unsigned int temperature;
284  std::vector<unsigned int> compositional_fields;
285  };
286 
292 
301  {
302  unsigned int max_degree;
303  unsigned int velocities;
304  unsigned int temperature;
305  std::vector<unsigned int> compositional_fields;
307  };
308 
314 
334  struct Quadratures
335  {
340  std::vector<Quadrature<dim>> compositional_fields;
342  };
343 
349 
359  {
365  };
366 
372 
379  {
381 
386 
391 
396 
403  std::vector<ComponentMask> compositional_fields;
404 
410  };
411 
418 
432  std::vector<types::global_dof_index> system_dofs_per_block;
433 
438  {
439  unsigned int local_dof_index;
440  unsigned int component_index;
441  };
442 
452  std::vector<StokesDoFInfo> stokes_dof_info;
453 
459  struct IndexSets
460  {
468 
476  std::vector<IndexSet> system_partitioning;
477 
486  std::vector<IndexSet> system_relevant_partitioning;
487 
493  std::vector<IndexSet> stokes_partitioning;
494 
502 
508 
514  };
515 
522 
528 
535 
552  const std::vector<unsigned int> &
553  get_composition_base_element_indices() const;
554 
562  const std::vector<unsigned int> &
563  get_compositional_field_indices_with_base_element(const unsigned int base_element_index) const;
564 
573  unsigned int
574  compositional_index_for_name (const std::string &name) const;
575 
582  std::string
583  name_for_compositional_index (const unsigned int index) const;
584 
588  const std::vector<std::string> &
589  get_composition_names () const;
590 
595  const std::vector<CompositionalFieldDescription> &
596  get_composition_descriptions () const;
597 
605  const std::vector<std::string> &
606  chemical_composition_field_names () const;
607 
615  const std::vector<unsigned int> &
616  chemical_composition_field_indices () const;
617 
625  unsigned int
626  n_chemical_composition_fields () const;
627 
636  bool
637  composition_type_exists (const CompositionalFieldDescription::Type &type) const;
638 
648  unsigned int
649  find_composition_type (const CompositionalFieldDescription::Type &type) const;
650 
659  bool
660  compositional_name_exists (const std::string &name) const;
661 
666  const std::vector<unsigned int> &
667  get_indices_for_fields_of_type (const CompositionalFieldDescription::Type &type) const;
668 
673  const std::vector<std::string> &
674  get_names_for_fields_of_type (const CompositionalFieldDescription::Type &type) const;
675 
680  unsigned int
681  get_number_of_fields_of_type (const CompositionalFieldDescription::Type &type) const;
682 
690  bool
691  is_stokes_component (const unsigned int component_index) const;
692 
702  void
703  initialize_stokes_dof_info (const FiniteElement<dim> &finite_element);
704 
712  bool
713  is_composition_component (const unsigned int component_index) const;
714 
715  private:
720  std::vector<std::string> composition_names;
721 
727  std::vector<CompositionalFieldDescription> composition_descriptions;
728 
734  std::vector<std::vector<std::string>> composition_names_for_type;
735 
741  std::vector<std::vector<unsigned int>> composition_indices_for_type;
742 
747  std::vector<unsigned int> composition_base_element_indices;
748 
754  std::map<unsigned int, std::vector<unsigned int>> compositional_field_indices_with_base_element;
755  };
756 }
757 
758 
759 #endif
std::vector< IndexSet > system_relevant_partitioning
const std::vector< bool > use_discontinuous_composition_discretization
std::map< unsigned int, std::vector< unsigned int > > compositional_field_indices_with_base_element
const FEValuesExtractors::Vector velocities
Quadrature< dim > compositional_field_max
std::vector< VariableDeclaration< dim > > construct_default_variables(const Parameters< dim > &parameters)
Parameters< dim >::AdvectionFieldMethod::Kind temperature_method
std::vector< unsigned int > compositional_fields
std::vector< unsigned int > compositional_fields
const unsigned int n_blocks
std::vector< std::vector< unsigned int > > composition_indices_for_type
std::vector< Quadrature< dim > > compositional_fields
#define AssertThrow(cond, exc)
const BaseElements base_elements
const PolynomialDegree polynomial_degree
const FEValuesExtractors::Scalar temperature
static ::ExceptionBase & ExcInternalError()
const unsigned int n_components
const Extractors extractors
std::vector< IndexSet > system_partitioning
std::vector< typename Parameters< dim >::AdvectionFieldMethod::Kind > compositional_field_methods
std::vector< CompositionalFieldDescription > composition_descriptions
enum aspect::CompositionalFieldDescription::Type type
std::vector< std::vector< std::string > > composition_names_for_type
const unsigned int n_compositional_fields
const ComponentIndices component_indices
std::vector< unsigned int > compositional_fields
std::vector< unsigned int > compositional_fields
static ::ExceptionBase & ExcMessage(std::string arg1)
const bool use_discontinuous_temperature_discretization
std::array< unsigned int, dim > velocities
std::vector< StokesDoFInfo > stokes_dof_info
const FaceQuadratures face_quadratures
const Quadratures quadratures
const BlockIndices block_indices
std::vector< unsigned int > compositional_field_sparsity_pattern
static std::string type_to_string(const Type type)
const std::vector< FEValuesExtractors::Scalar > compositional_fields
const FEValuesExtractors::Scalar pressure
const ComponentMasks component_masks
std::vector< types::global_dof_index > system_dofs_per_block
static constexpr unsigned int n_types
Definition: introspection.h:68
std::vector< unsigned int > composition_base_element_indices
std::vector< std::string > composition_names
std::vector< ComponentMask > compositional_fields
std::vector< IndexSet > stokes_partitioning
static Type parse_type(const std::string &input)
Definition: introspection.h:76