OGS
IntegrationPointWriter.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#include <algorithm>
5#include <functional>
6#include <iterator>
7#include <memory>
8#include <optional>
9#include <string>
10#include <vector>
11
13
14#pragma once
15
16namespace MeshLib
17{
18class Mesh;
19class Properties;
20
22{
27 template <typename LocalAssemblerInterface, typename... Args>
29 std::string const& name,
30 int const n_components,
31 int const integration_order,
32 std::vector<std::unique_ptr<LocalAssemblerInterface>> const&
33 local_assemblers,
34 std::vector<double> (LocalAssemblerInterface::*getIpData)(Args...)
35 const,
36 Args&&... args)
37 : _name(name),
38 _n_components(n_components),
39 _integration_order(integration_order)
40 {
41 _callback = [&local_assemblers,
42 getIpData,
43 ... f_args = std::forward<Args>(args)]
44 {
45 // Result containing integration point data for each local
46 // assembler.
47 std::vector<std::vector<double>> result;
48 result.reserve(local_assemblers.size());
49
50 std::transform(begin(local_assemblers), end(local_assemblers),
51 std::back_inserter(result),
52 [&](auto const& la)
53 { return (*la.*getIpData)(f_args...); });
54
55 return result;
56 };
57 }
58
64 template <typename LocalAssemblerInterface, typename Accessor>
66 std::string const& name,
67 int const n_components,
68 int const integration_order,
69 std::vector<std::unique_ptr<LocalAssemblerInterface>> const&
70 local_assemblers,
71 Accessor accessor)
72 : _name(name),
73 _n_components(n_components),
74 _integration_order(integration_order)
75 {
76 _callback = [&local_assemblers, accessor]
77 {
78 // Result containing integration point data for each local
79 // assembler.
80 std::vector<std::vector<double>> result;
81 result.reserve(local_assemblers.size());
82
83 std::transform(begin(local_assemblers), end(local_assemblers),
84 std::back_inserter(result),
85 [&accessor](auto const& la)
86 { return accessor(*la); });
87
88 return result;
89 };
90 }
91
92 int numberOfComponents() const { return _n_components; }
93 int integrationOrder() const { return _integration_order; }
94 std::string name() const { return _name; }
95 std::vector<std::vector<double>> values() const { return _callback(); }
96
97private:
98 std::string const _name;
99 int const _n_components;
101 std::function<std::vector<std::vector<double>>()> _callback;
102};
103
112 MeshLib::Mesh& mesh,
113 std::vector<std::unique_ptr<IntegrationPointWriter>> const&
114 integration_point_writer);
115
119std::optional<IntegrationPointMetaData> getIntegrationPointMetaData(
120 MeshLib::Properties const& properties);
121} // namespace MeshLib
Property manager on mesh items. Class Properties manages scalar, vector or matrix properties....
std::optional< IntegrationPointMetaData > getIntegrationPointMetaData(MeshLib::Properties const &properties)
void addIntegrationPointDataToMesh(MeshLib::Mesh &mesh, std::vector< std::unique_ptr< IntegrationPointWriter > > const &integration_point_writer)
std::vector< std::vector< double > > values() const
std::function< std::vector< std::vector< double > >()> _callback
IntegrationPointWriter(std::string const &name, int const n_components, int const integration_order, std::vector< std::unique_ptr< LocalAssemblerInterface > > const &local_assemblers, Accessor accessor)
IntegrationPointWriter(std::string const &name, int const n_components, int const integration_order, std::vector< std::unique_ptr< LocalAssemblerInterface > > const &local_assemblers, std::vector< double >(LocalAssemblerInterface::*getIpData)(Args...) const, Args &&... args)