OGS
SecondaryVariable.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include "BaseLib/Algorithm.h"
10
11namespace NumLib
12{
14}
15
16namespace ProcessLib
17{
21{
32 using Function = std::function<GlobalVector const&(
33 const double t,
34 std::vector<GlobalVector*> const& x,
35 std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_table,
36 std::unique_ptr<GlobalVector>& result_cache)>;
37
38 template <typename F1, typename F2>
39 SecondaryVariableFunctions(const unsigned num_components_, F1&& eval_field_,
40 F2&& eval_residuals_)
41 : num_components(num_components_),
42 eval_field(std::forward<F1>(eval_field_)),
43 eval_residuals(std::forward<F2>(eval_residuals_))
44 {
45 // Used to detect nasty implicit conversions.
46 static_assert(
47 std::is_same_v<
48 GlobalVector const&,
49 typename std::invoke_result_t<
50 F1, double const, std::vector<GlobalVector*> const&,
51 std::vector<NumLib::LocalToGlobalIndexMap const*> const&,
52 std::unique_ptr<GlobalVector>&>>,
53 "The function eval_field_ does not return a const reference"
54 " to a GlobalVector");
55
56 static_assert(
57 std::is_same_v<
58 GlobalVector const&,
59 typename std::invoke_result_t<
60 F2, double const, std::vector<GlobalVector*> const&,
61 std::vector<NumLib::LocalToGlobalIndexMap const*> const&,
62 std::unique_ptr<GlobalVector>&>>,
63 "The function eval_residuals_ does not return a const reference"
64 " to a GlobalVector");
65 }
66
67 template <typename F1>
68 SecondaryVariableFunctions(const unsigned num_components_, F1&& eval_field_,
69 std::nullptr_t)
70 : num_components(num_components_),
71 eval_field(std::forward<F1>(eval_field_))
72 {
73 // Used to detect nasty implicit conversions.
74 static_assert(
75 std::is_same_v<
76 GlobalVector const&,
77 typename std::invoke_result_t<
78 F1, double const, std::vector<GlobalVector*> const&,
79 std::vector<NumLib::LocalToGlobalIndexMap const*> const&,
80 std::unique_ptr<GlobalVector>&>>,
81 "The function eval_field_ does not return a const reference"
82 " to a GlobalVector");
83 }
84
85 const unsigned num_components;
86
89
95};
96
99{
100 std::string const name;
101
104};
105
108{
109public:
111 void addNameMapping(std::string const& internal_name,
112 std::string const& external_name);
113
125 void addSecondaryVariable(std::string const& internal_name,
127
129 SecondaryVariable const& get(std::string const& external_name) const;
130
131 std::map<std::string, std::string>::const_iterator begin() const;
132 std::map<std::string, std::string>::const_iterator end() const;
133
134private:
137 std::map<std::string, std::string> _map_external_to_internal;
138
142 std::map<std::string, SecondaryVariable> _configured_secondary_variables;
143};
144
156template <typename LocalAssemblerCollection>
158 const unsigned num_components,
159 NumLib::Extrapolator& extrapolator,
160 LocalAssemblerCollection const& local_assemblers,
162 LocalAssemblerCollection>::IntegrationPointValuesMethod
163 integration_point_values_method)
164{
165 auto const eval_field =
166 [num_components, &extrapolator, &local_assemblers,
167 integration_point_values_method](
168 const double t,
169 std::vector<GlobalVector*> const& x,
170 std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_tables,
171 std::unique_ptr<GlobalVector>& /*result_cache*/
172 ) -> GlobalVector const&
173 {
174 auto const extrapolatables = NumLib::makeExtrapolatable(
175 local_assemblers, integration_point_values_method);
176 extrapolator.extrapolate(num_components, extrapolatables, t, x,
177 dof_tables);
178 return extrapolator.getNodalValues();
179 };
180
181 auto const eval_residuals =
182 [num_components, &extrapolator, &local_assemblers,
183 integration_point_values_method](
184 const double t,
185 std::vector<GlobalVector*> const& x,
186 std::vector<NumLib::LocalToGlobalIndexMap const*> const& dof_tables,
187 std::unique_ptr<GlobalVector>& /*result_cache*/
188 ) -> GlobalVector const&
189 {
190 auto const extrapolatables = NumLib::makeExtrapolatable(
191 local_assemblers, integration_point_values_method);
192 extrapolator.calculateResiduals(num_components, extrapolatables, t, x,
193 dof_tables);
194 return extrapolator.getElementResiduals();
195 };
196 return {num_components, eval_field, eval_residuals};
197}
198
205template <typename LocalAssemblerCollection, typename IPDataAccessor>
207 const unsigned num_components,
208 NumLib::Extrapolator& extrapolator,
209 LocalAssemblerCollection const& local_assemblers,
210 IPDataAccessor&& accessor)
211{
212 using LocalAssemblerInterface = std::remove_cvref_t<
213 decltype(*std::declval<LocalAssemblerCollection>()[0])>;
214 static_assert(std::is_invocable_r_v<std::vector<double>, IPDataAccessor,
216
217 if (num_components == 1)
218 {
219 auto method_wrapped =
220 [accessor](
221 LocalAssemblerInterface const& loc_asm, const double /*t*/,
222 std::vector<GlobalVector*> const& /*x*/,
223 std::vector<
224 NumLib::LocalToGlobalIndexMap const*> const& /*dof_table*/,
225 std::vector<double>& cache) -> std::vector<double> const&
226 {
227 cache = accessor(loc_asm);
228 return cache;
229 };
230
231 return makeExtrapolator(num_components, extrapolator, local_assemblers,
232 method_wrapped);
233 }
234
235 auto method_wrapped =
236 [accessor, num_components](
237 LocalAssemblerInterface const& loc_asm, const double /*t*/,
238 std::vector<GlobalVector*> const& /*x*/,
239 std::vector<
240 NumLib::LocalToGlobalIndexMap const*> const& /*dof_table*/,
241 std::vector<double>& cache) -> std::vector<double> const&
242 {
243 cache = accessor(loc_asm);
244 transposeInPlace(cache, cache.size() / num_components);
245 return cache;
246 };
247
248 return makeExtrapolator(num_components, extrapolator, local_assemblers,
249 method_wrapped);
250}
251
252} // namespace ProcessLib
MathLib::EigenVector GlobalVector
virtual GlobalVector const & getNodalValues() const =0
virtual void extrapolate(const unsigned num_components, ExtrapolatableElementCollection const &extrapolatables, const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table)=0
Extrapolates the given property from the given local assemblers.
virtual GlobalVector const & getElementResiduals() const =0
virtual void calculateResiduals(const unsigned num_components, ExtrapolatableElementCollection const &extrapolatables, const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table)=0
Handles configuration of several secondary variables from the project file.
SecondaryVariable const & get(std::string const &external_name) const
Returns the secondary variable with the given external name.
std::map< std::string, std::string > _map_external_to_internal
void addNameMapping(std::string const &internal_name, std::string const &external_name)
Register a variable with the given internal and external names.
std::map< std::string, std::string >::const_iterator begin() const
void addSecondaryVariable(std::string const &internal_name, SecondaryVariableFunctions &&fcts)
std::map< std::string, std::string >::const_iterator end() const
std::map< std::string, SecondaryVariable > _configured_secondary_variables
ExtrapolatableLocalAssemblerCollection< LocalAssemblerCollection > makeExtrapolatable(LocalAssemblerCollection const &local_assemblers, IntegrationPointValuesMethod integration_point_values_method)
std::vector< double > transposeInPlace(StoreValuesFunction const &store_values_function)
SecondaryVariableFunctions makeExtrapolator2(const unsigned num_components, NumLib::Extrapolator &extrapolator, LocalAssemblerCollection const &local_assemblers, IPDataAccessor &&accessor)
SecondaryVariableFunctions makeExtrapolator(const unsigned num_components, NumLib::Extrapolator &extrapolator, LocalAssemblerCollection const &local_assemblers, typename NumLib::ExtrapolatableLocalAssemblerCollection< LocalAssemblerCollection >::IntegrationPointValuesMethod integration_point_values_method)
SecondaryVariableFunctions(const unsigned num_components_, F1 &&eval_field_, F2 &&eval_residuals_)
std::function< GlobalVector const &( const double t, std::vector< GlobalVector * > const &x, std::vector< NumLib::LocalToGlobalIndexMap const * > const &dof_table, std::unique_ptr< GlobalVector > &result_cache)> Function
SecondaryVariableFunctions(const unsigned num_components_, F1 &&eval_field_, std::nullptr_t)
Function const eval_field
Computes the value of the field at every node of the underlying mesh.
const unsigned num_components
Number of components of the variable.
Stores information about a specific secondary variable.
SecondaryVariableFunctions fcts
Functions used for computing the secondary variable.
std::string const name
Name of the variable; used, e.g., for output.