ASPECT
introspection.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2011 - 2024 by the authors of the ASPECT code.
3 
4  This file is part of ASPECT.
5 
6  ASPECT is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2, or (at your option)
9  any later version.
10 
11  ASPECT is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with ASPECT; see the file LICENSE. If not see
18  <http://www.gnu.org/licenses/>.
19 */
20 
21 
22 #ifndef _aspect_introspection_h
23 #define _aspect_introspection_h
24 
25 #include <deal.II/base/index_set.h>
26 #include <deal.II/base/quadrature.h>
27 #include <deal.II/fe/component_mask.h>
28 #include <deal.II/fe/fe_values_extractors.h>
29 #include <deal.II/fe/fe.h>
30 
32 #include <aspect/parameters.h>
33 
34 #include <map>
35 
36 namespace aspect
37 {
42  template <int dim>
43  std::vector<VariableDeclaration<dim>>
44  construct_default_variables (const Parameters<dim> &parameters);
45 
46 
53  {
57  enum Type
58  {
60  stress = 1,
61  strain = 2,
63  porosity = 4,
64  density = 5,
65  entropy = 6,
66  generic = 7,
68  } type;
69 
73  constexpr static unsigned int n_types = 9;
74 
79  static
80  Type
81  parse_type(const std::string &input)
82  {
83  if (input == "chemical composition")
85  else if (input == "stress")
87  else if (input == "strain")
89  else if (input == "grain size")
91  else if (input == "porosity")
93  else if (input == "density")
95  else if (input == "entropy")
97  else if (input == "generic")
99  else if (input == "unspecified")
101  else
102  AssertThrow(false, ExcNotImplemented());
103 
105  }
106  };
107 
125  template <int dim>
127  {
128  public:
132  Introspection (const std::vector<VariableDeclaration<dim>> &variables,
133  const Parameters<dim> &parameters);
134 
135 
148  const unsigned int n_components;
149 
153  const unsigned int n_compositional_fields;
154 
160 
166 
172  {
173  std::array<unsigned int, dim> velocities;
174  unsigned int pressure;
175  unsigned int temperature;
176  std::vector<unsigned int> compositional_fields;
177  };
183 
189  const unsigned int n_blocks;
190 
196  {
197  unsigned int velocities;
198  unsigned int pressure;
199  unsigned int temperature;
200  std::vector<unsigned int> compositional_fields;
201 
209  std::vector<unsigned int> compositional_field_sparsity_pattern;
210  };
211 
217 
222  struct Extractors
223  {
224  Extractors (const ComponentIndices &component_indices);
225 
227  const FEValuesExtractors::Scalar pressure;
228  const FEValuesExtractors::Scalar temperature;
229  const std::vector<FEValuesExtractors::Scalar> compositional_fields;
230  };
231 
237 
248  {
249  unsigned int velocities;
250  unsigned int pressure;
251  unsigned int temperature;
252  std::vector<unsigned int> compositional_fields;
253  };
254 
260 
269  {
270  unsigned int max_degree;
271  unsigned int velocities;
272  unsigned int temperature;
273  std::vector<unsigned int> compositional_fields;
275  };
276 
282 
302  struct Quadratures
303  {
304  Quadrature<dim> velocities;
305  Quadrature<dim> pressure;
306  Quadrature<dim> temperature;
307  Quadrature<dim> compositional_field_max;
308  std::vector<Quadrature<dim>> compositional_fields;
309  Quadrature<dim> system;
310  };
311 
317 
327  {
328  Quadrature<dim-1> velocities;
329  Quadrature<dim-1> pressure;
330  Quadrature<dim-1> temperature;
331  Quadrature<dim-1> compositional_fields;
332  Quadrature<dim-1> system;
333  };
334 
340 
347  {
349 
353  ComponentMask velocities;
354 
358  ComponentMask pressure;
359 
363  ComponentMask temperature;
364 
371  std::vector<ComponentMask> compositional_fields;
372 
377  ComponentMask compositions;
378  };
379 
386 
400  std::vector<types::global_dof_index> system_dofs_per_block;
401 
406  {
407  unsigned int local_dof_index;
408  unsigned int component_index;
409  };
410 
420  std::vector<StokesDoFInfo> stokes_dof_info;
421 
427  struct IndexSets
428  {
436 
444  std::vector<IndexSet> system_partitioning;
445 
454  std::vector<IndexSet> system_relevant_partitioning;
455 
461  std::vector<IndexSet> stokes_partitioning;
462 
470 
476 
482  };
483 
490 
496 
503 
520  const std::vector<unsigned int> &
521  get_composition_base_element_indices() const;
522 
530  const std::vector<unsigned int> &
531  get_compositional_field_indices_with_base_element(const unsigned int base_element_index) const;
532 
541  unsigned int
542  compositional_index_for_name (const std::string &name) const;
543 
550  std::string
551  name_for_compositional_index (const unsigned int index) const;
552 
556  const std::vector<std::string> &
557  get_composition_names () const;
558 
563  const std::vector<CompositionalFieldDescription> &
564  get_composition_descriptions () const;
565 
573  const std::vector<std::string> &
574  chemical_composition_field_names () const;
575 
583  const std::vector<unsigned int> &
584  chemical_composition_field_indices () const;
585 
593  unsigned int
594  n_chemical_composition_fields () const;
595 
604  bool
605  composition_type_exists (const CompositionalFieldDescription::Type &type) const;
606 
616  unsigned int
617  find_composition_type (const CompositionalFieldDescription::Type &type) const;
618 
627  bool
628  compositional_name_exists (const std::string &name) const;
629 
634  const std::vector<unsigned int> &
635  get_indices_for_fields_of_type (const CompositionalFieldDescription::Type &type) const;
636 
641  const std::vector<std::string> &
642  get_names_for_fields_of_type (const CompositionalFieldDescription::Type &type) const;
643 
648  unsigned int
649  get_number_of_fields_of_type (const CompositionalFieldDescription::Type &type) const;
650 
658  bool
659  is_stokes_component (const unsigned int component_index) const;
660 
670  void
671  initialize_stokes_dof_info (const FiniteElement<dim> &finite_element);
672 
680  bool
681  is_composition_component (const unsigned int component_index) const;
682 
683  private:
688  std::vector<std::string> composition_names;
689 
695  std::vector<CompositionalFieldDescription> composition_descriptions;
696 
702  std::vector<std::vector<std::string>> composition_names_for_type;
703 
709  std::vector<std::vector<unsigned int>> composition_indices_for_type;
710 
715  std::vector<unsigned int> composition_base_element_indices;
716 
722  std::map<unsigned int, std::vector<unsigned int>> compositional_field_indices_with_base_element;
723  };
724 }
725 
726 
727 #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
::TrilinosWrappers::MPI::Vector Vector
Definition: global.h:295
const BaseElements base_elements
const PolynomialDegree polynomial_degree
const FEValuesExtractors::Scalar temperature
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
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
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:73
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:81