ASPECT
solution_evaluator.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) 2024-2025 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 #ifndef _aspect_solution_evaluator_h
16 #define _aspect_solution_evaluator_h
17 
18 #include <aspect/global.h>
19 
20 
22 
27 
28 namespace aspect
29 {
30  namespace internal
31  {
36  template <int dim>
38  {
39  public:
43  DynamicFEPointEvaluation(const unsigned int first_component, const unsigned int n_components)
44  : first_component (first_component),
45  n_components (n_components)
46  {}
47 
51  virtual ~DynamicFEPointEvaluation() = default;
52 
59  virtual void evaluate(const ArrayView<double> &solution_values,
60  const EvaluationFlags::EvaluationFlags flags) = 0;
61 
65  virtual
67  get_gradient(const unsigned int evaluation_point) const = 0;
68 
73  virtual
74  void
75  get_gradient(const unsigned int evaluation_point,
76  const ArrayView<Tensor<1,dim>> &gradients) const = 0;
77 
81  virtual
83  get_value(const unsigned int evaluation_point) const = 0;
84 
89  virtual
90  void
91  get_value(const unsigned int evaluation_point,
92  const ArrayView<double> &solution) const = 0;
93 
97  virtual
98  unsigned int
99  get_first_component() const final
100  {
101  return first_component;
102  }
103 
107  virtual
108  unsigned int
109  get_n_components() const final
110  {
111  return n_components;
112  }
113 
114  private:
118  unsigned int first_component;
119 
123  unsigned int n_components;
124  };
125  }
126 
132  template <int dim>
134  {
135  public:
141  SolutionEvaluator(const SimulatorAccess<dim> &simulator,
142  const UpdateFlags update_flags);
143 
148  void
149  reinit(const typename DoFHandler<dim>::active_cell_iterator &cell,
150  const ArrayView<Point<dim>> &positions);
151 
161  void
162  evaluate(const ArrayView<double> &solution_values,
163  const std::vector<EvaluationFlags::EvaluationFlags> &evaluation_flags);
164 
177  void get_solution(const unsigned int evaluation_point,
178  const ArrayView<double> &solution,
179  const std::vector<EvaluationFlags::EvaluationFlags> &evaluation_flags) const;
180 
193  void get_gradients(const unsigned int evaluation_point,
194  const ArrayView<Tensor<1, dim>> &gradients,
195  const std::vector<EvaluationFlags::EvaluationFlags> &evaluation_flags) const;
196 
202  get_velocity_or_fluid_velocity_evaluator(const bool use_fluid_velocity);
203 
208  get_mapping_info();
209 
213  unsigned int
214  n_components() const;
215 
216  private:
221 
228  std::unique_ptr<FEPointEvaluation<1, dim>> pressure;
230 
235  std::vector<std::unique_ptr<internal::DynamicFEPointEvaluation<dim>>> compositions;
236 
243  std::unique_ptr<FEPointEvaluation<dim, dim>> fluid_velocity;
244  std::unique_ptr<FEPointEvaluation<1, dim>> compaction_pressure;
245  std::unique_ptr<FEPointEvaluation<1, dim>> fluid_pressure;
246 
253  std::array<unsigned int, 3> melt_component_indices;
254 
260  };
261 
265  template <int dim>
266  std::unique_ptr<SolutionEvaluator<dim>>
267  construct_solution_evaluator(const SimulatorAccess<dim> &simulator_access,
268  const UpdateFlags update_flags);
269 }
270 
271 #endif
DynamicFEPointEvaluation(const unsigned int first_component, const unsigned int n_components)
virtual void evaluate(const ArrayView< double > &solution_values, const EvaluationFlags::EvaluationFlags flags)=0
virtual unsigned int get_n_components() const final
std::unique_ptr< FEPointEvaluation< 1, dim > > compaction_pressure
FEPointEvaluation< dim, dim > velocity
UpdateFlags
FEPointEvaluation< 1, dim > temperature
std::array< unsigned int, 3 > melt_component_indices
std::unique_ptr< FEPointEvaluation< dim, dim > > fluid_velocity
NonMatching::MappingInfo< dim > mapping_info
virtual small_vector< Tensor< 1, dim > > get_gradient(const unsigned int evaluation_point) const =0
std::unique_ptr< FEPointEvaluation< 1, dim > > pressure
virtual unsigned int get_first_component() const final
boost::container::small_vector< T, N > small_vector
Definition: global.h:255
virtual small_vector< double > get_value(const unsigned int evaluation_point) const =0
std::unique_ptr< FEPointEvaluation< 1, dim > > fluid_pressure
const SimulatorAccess< dim > & simulator_access
std::vector< std::unique_ptr< internal::DynamicFEPointEvaluation< dim > > > compositions
std::unique_ptr< SolutionEvaluator< dim > > construct_solution_evaluator(const SimulatorAccess< dim > &simulator_access, const UpdateFlags update_flags)