Dune-Fufem 2.11-git
Loading...
Searching...
No Matches
dunefunctionsfunctionalassembler.hh
Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2// vi: set et ts=4 sw=2 sts=2:
3
4// SPDX-FileCopyrightText: Copyright © DUNE-FUFEM Project contributors, see file AUTHORS.md
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
6
7#ifndef DUNE_FUFEM_ASSEMBERS_DUNEFUNCTIONSFUNCTIONALASSEMBLER_HH
8#define DUNE_FUFEM_ASSEMBERS_DUNEFUNCTIONSFUNCTIONALASSEMBLER_HH
9
10#ifndef DUNE_FUFEM_DISABLE_HEADER_DEPRECATION
11#warning This header is deprecated and will be removed after 2.11. Use the global assemblers from dune/assembler/defaultglobalassembler.hh instead.
12#endif
13
24
25#include <dune/istl/bvector.hh>
26
27#include <dune/grid/common/capabilities.hh>
28
29#include <dune/functions/backends/concepts.hh>
31
33
34
35
36namespace Dune {
37namespace Fufem {
38
39
46template <class TestBasis>
47class
48[[deprecated("This class will be removed after 2.11. Use Dune::Assembler::Assembler together with Dune::Fufem::Forms based local assemblers instead.")]]
50{
51 using GridView = typename TestBasis::GridView;
52
53 // SFINAE expression check for preprocess() method of local assembler
54 template <class LocalAssembler>
55 using LocalAssemblerPreprocess = decltype(std::declval<LocalAssembler>().preprocess(std::declval<typename TestBasis::LocalView>()));
56
57public:
59 [[deprecated("This class will be removed after 2.11. Use Dune::Assembler::Assembler together with Dune::Fufem::Forms based local assemblers instead.")]]
60 DuneFunctionsFunctionalAssembler(const TestBasis& tBasis) :
61 testBasis_(tBasis)
62 {}
63
64 template<class V>
65 static decltype(auto) toVectorBackend(V& v)
66 {
67 if constexpr (Dune::models<Dune::Functions::Concept::VectorBackend<TestBasis>, decltype(v)>())
68 return v;
69 else
71 }
72
73 template <class Vector, class LocalAssembler>
74 void assembleBulkEntries(Vector&& vector, LocalAssembler&& localAssembler) const
75 {
76 auto&& vectorBackend = toVectorBackend(vector);
77
78 auto testLocalView = testBasis_.localView();
79
80 if constexpr(Dune::Std::is_detected_v<LocalAssemblerPreprocess, LocalAssembler>)
81 localAssembler.preprocess(testLocalView);
82
83 using Field = std::decay_t<decltype(vectorBackend[testLocalView.index(0)])>;
85
86 auto localVector = LocalVector(testLocalView.maxSize());
87
88 for (const auto& element : elements(testBasis_.gridView()))
89 {
90 testLocalView.bind(element);
91
92 for (size_t i=0; i<testLocalView.tree().size(); ++i)
93 {
94 auto localRow = testLocalView.tree().localIndex(i);
95 localVector[localRow] = 0;
96 }
97
98 localAssembler(element, localVector, testLocalView);
99
100 // Add element stiffness matrix onto the global stiffness matrix
101 for (size_t i=0; i<testLocalView.tree().size(); ++i)
102 {
103 auto localRow = testLocalView.tree().localIndex(i);
104 auto row = testLocalView.index(localRow);
105 vectorBackend[row] += localVector[localRow];
106 }
107 }
108 }
109
110 template <class Vector, class LocalAssembler, class ElementPartition>
111 void assembleBulkEntries(Vector&& vector, LocalAssembler&& localAssembler, const ElementPartition& elementPartition, std::size_t threadCount) const
112 {
113 static_assert(Dune::Capabilities::viewThreadSafe<typename GridView::Grid>::v, "Trying to use thread parallel assembler but grid is not viewThreadSafe.");
114
115 auto&& vectorBackend = toVectorBackend(vector);
116
117 parallelAlgorithm(threadCount, [&, localAssembler](auto parallel) mutable {
118 auto testLocalView = testBasis_.localView();
119
120 if constexpr(Dune::Std::is_detected_v<LocalAssemblerPreprocess, LocalAssembler>)
121 localAssembler.preprocess(testLocalView);
122
123 using Field = std::decay_t<decltype(vectorBackend[testLocalView.index(0)])>;
125
126 auto localVector = LocalVector(testLocalView.maxSize());
127
128 parallel.coloredForEach(elementPartition, [&](const auto& element) {
129 testLocalView.bind(element);
130
131 for (size_t i=0; i<testLocalView.tree().size(); ++i)
132 {
133 auto localRow = testLocalView.tree().localIndex(i);
134 localVector[localRow] = 0;
135 }
136
137 localAssembler(element, localVector, testLocalView);
138
139 // Add element stiffness matrix onto the global stiffness matrix
140 for (size_t i=0; i<testLocalView.tree().size(); ++i)
141 {
142 auto localRow = testLocalView.tree().localIndex(i);
143 auto row = testLocalView.index(localRow);
144 vectorBackend[row] += localVector[localRow];
145 }
146 });
147 });
148 }
149
150
151 template <class Vector, class LocalAssembler>
152 void assembleBulk(Vector&& vector, LocalAssembler&& localAssembler) const
153 {
154 auto&& vectorBackend = toVectorBackend(vector);
155
156 vectorBackend.resize(testBasis_);
157 vectorBackend = 0.0;
158 assembleBulkEntries(vectorBackend, std::forward<LocalAssembler>(localAssembler));
159 }
160
161 template <class Vector, class LocalAssembler, class ElementPartition>
162 void assembleBulk(Vector&& vector, LocalAssembler&& localAssembler, const ElementPartition& elementPartition, std::size_t threadCount) const
163 {
164 auto&& vectorBackend = toVectorBackend(vector);
165
166 vectorBackend.resize(testBasis_);
167 vectorBackend = 0.0;
168 assembleBulkEntries(vectorBackend, std::forward<LocalAssembler>(localAssembler), elementPartition, threadCount);
169 }
170
171
172protected:
173 const TestBasis& testBasis_;
174};
175
176
184template <class TestBasis>
185[[deprecated("This function will be removed after 2.11. Use Dune::Assembler::Assembler together with Dune::Fufem::Forms based local assemblers instead.")]]
192
193
194
195} // namespace Fufem
196} // namespace Dune
197
198
199#endif // DUNE_FUFEM_ASSEMBERS_DUNEFUNCTIONSFUNCTIONALASSEMBLER_HH
200
auto istlVectorBackend(Vector &v)
int size() const
#define DUNE_NO_DEPRECATED_END
#define DUNE_NO_DEPRECATED_BEGIN
void parallelAlgorithm(std::size_t threadCount, F &&threadImp)
Utility for implementing parallel algorithms based on colored entity partitions.
Definition parallelalgorithm.hh:147
auto duneFunctionsFunctionalAssembler(const TestBasis &testBasis)
Create DuneFunctionsFunctionalAssembler.
Definition dunefunctionsfunctionalassembler.hh:186
Generic global assembler for functionals on a gridview.
Definition dunefunctionsfunctionalassembler.hh:50
void assembleBulkEntries(Vector &&vector, LocalAssembler &&localAssembler) const
Definition dunefunctionsfunctionalassembler.hh:74
const TestBasis & testBasis_
Definition dunefunctionsfunctionalassembler.hh:173
static decltype(auto) toVectorBackend(V &v)
Definition dunefunctionsfunctionalassembler.hh:65
DuneFunctionsFunctionalAssembler(const TestBasis &tBasis)
create assembler for grid
Definition dunefunctionsfunctionalassembler.hh:60
void assembleBulk(Vector &&vector, LocalAssembler &&localAssembler, const ElementPartition &elementPartition, std::size_t threadCount) const
Definition dunefunctionsfunctionalassembler.hh:162
void assembleBulkEntries(Vector &&vector, LocalAssembler &&localAssembler, const ElementPartition &elementPartition, std::size_t threadCount) const
Definition dunefunctionsfunctionalassembler.hh:111
void assembleBulk(Vector &&vector, LocalAssembler &&localAssembler) const
Definition dunefunctionsfunctionalassembler.hh:152
T forward(T... args)