/home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/discretization/FV/assembler/assembly_context.hh Source File#

DiFfRG: /home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/discretization/FV/assembler/assembly_context.hh Source File
DiFfRG
Discretization Framework for functional Renormalization Group flows
assembly_context.hh
Go to the documentation of this file.
1#pragma once
2
4
5#include <concepts>
6#include <cstddef>
7#include <iterator>
8#include <limits>
9#include <utility>
10#include <vector>
11
12namespace DiFfRG
13{
14 namespace FV
15 {
16 namespace KurganovTadmor
17 {
18 // The pre-assembly hook is called separately for residual and jacobian assembly.
19 // A model must not assume one hook call per solver step or timestep.
21
22 template <int dim_, typename NumberType_, std::size_t n_components_> class FaceAssemblyView
23 {
24 public:
25 static constexpr int dim = dim_;
26 static constexpr std::size_t n_components = n_components_;
27 using NumberType = NumberType_;
29
30 FaceAssemblyView(const dealii::Point<dim> &point, const dealii::Tensor<1, dim> &normal,
31 const double jxw, const bool boundary, const unsigned int cell_index,
32 const unsigned int face_index, const unsigned int neighbor_cell_index,
36 {
37 }
38
39 const dealii::Point<dim> &point() const { return point_; }
40 const dealii::Tensor<1, dim> &normal() const { return normal_; }
41 double jxw() const { return jxw_; }
42 bool at_boundary() const { return boundary_; }
43 unsigned int cell_index() const { return cell_index_; }
44 unsigned int face_index() const { return face_index_; }
45 unsigned int neighbor_cell_index() const { return neighbor_cell_index_; }
47
48 private:
49 dealii::Point<dim> point_;
50 dealii::Tensor<1, dim> normal_;
51 double jxw_ = 0.;
52 bool boundary_ = false;
53 unsigned int cell_index_ = 0;
54 unsigned int face_index_ = 0;
55 unsigned int neighbor_cell_index_ = std::numeric_limits<unsigned int>::max();
57 };
58
59 template <int dim_, typename NumberType_, std::size_t n_components_> class CellAssemblyView
60 {
61 public:
62 static constexpr int dim = dim_;
63 static constexpr std::size_t n_components = n_components_;
64 using NumberType = NumberType_;
66
67 CellAssemblyView(const dealii::Point<dim> &point, const unsigned int cell_index,
70 {
71 }
72
73 const dealii::Point<dim> &point() const { return point_; }
74 unsigned int cell_index() const { return cell_index_; }
75 const CellStencilData &stencil() const { return stencil_; }
76
77 private:
78 dealii::Point<dim> point_;
79 unsigned int cell_index_ = 0;
81 };
82
83 template <typename Range>
85 requires {
86 typename Range::Context;
87 typename Range::NumberType;
88 typename Range::const_iterator;
89 {
90 Range::dim
91 } -> std::convertible_to<int>;
92 {
93 Range::n_components
94 } -> std::convertible_to<std::size_t>;
95 } &&
96 requires(const Range &range, const std::size_t i) {
97 {
98 range.begin()
99 } -> std::same_as<typename Range::const_iterator>;
100 {
101 range.end()
102 } -> std::same_as<typename Range::const_iterator>;
103 {
104 range.size()
105 } -> std::convertible_to<std::size_t>;
106 {
107 range[i]
108 } -> std::same_as<typename Range::Context>;
109 };
110
111 template <typename Range>
113 HasAssemblyViewRange<Range> && requires { typename Range::FaceAssemblyView; } &&
114 std::same_as<typename Range::Context, typename Range::FaceAssemblyView>;
115
116 template <typename Range>
118 HasAssemblyViewRange<Range> && requires { typename Range::CellAssemblyView; } &&
119 std::same_as<typename Range::Context, typename Range::CellAssemblyView>;
120
121 template <int dim_, typename NumberType_, std::size_t n_components_, typename Iterator, typename GeometryProvider>
123 {
124 public:
125 static constexpr int dim = dim_;
126 static constexpr std::size_t n_components = n_components_;
127 using NumberType = NumberType_;
131
133 {
134 public:
135 using iterator_category = std::random_access_iterator_tag;
136 using difference_type = std::ptrdiff_t;
139 using pointer = void;
140
141 const_iterator() = default;
142 const_iterator(const FaceAssemblyViewRange *range, const std::size_t index) : range_(range), index_(index) {}
143
144 value_type operator*() const { return (*range_)[index_]; }
146 {
147 return (*range_)[static_cast<std::size_t>(static_cast<difference_type>(index_) + offset)];
148 }
149
151 {
152 ++index_;
153 return *this;
154 }
156 {
157 auto copy = *this;
158 ++(*this);
159 return copy;
160 }
162 {
163 --index_;
164 return *this;
165 }
167 {
168 auto copy = *this;
169 --(*this);
170 return copy;
171 }
173 {
174 index_ = static_cast<std::size_t>(static_cast<difference_type>(index_) + offset);
175 return *this;
176 }
178 {
179 return *this += -offset;
180 }
181
182 friend const_iterator operator+(const const_iterator iterator, const difference_type offset)
183 {
184 auto copy = iterator;
185 copy += offset;
186 return copy;
187 }
188 friend const_iterator operator+(const difference_type offset, const const_iterator iterator)
189 {
190 return iterator + offset;
191 }
192 friend const_iterator operator-(const const_iterator iterator, const difference_type offset)
193 {
194 auto copy = iterator;
195 copy -= offset;
196 return copy;
197 }
198 friend difference_type operator-(const const_iterator &left, const const_iterator &right)
199 {
200 return static_cast<difference_type>(left.index_) - static_cast<difference_type>(right.index_);
201 }
202
203 friend bool operator==(const const_iterator &left, const const_iterator &right)
204 {
205 return left.range_ == right.range_ && left.index_ == right.index_;
206 }
207 friend bool operator!=(const const_iterator &left, const const_iterator &right) { return !(left == right); }
208 friend bool operator<(const const_iterator &left, const const_iterator &right)
209 {
210 return left.index_ < right.index_;
211 }
212 friend bool operator>(const const_iterator &left, const const_iterator &right) { return right < left; }
213 friend bool operator<=(const const_iterator &left, const const_iterator &right) { return !(right < left); }
214 friend bool operator>=(const const_iterator &left, const const_iterator &right) { return !(left < right); }
215
216 private:
218 std::size_t index_ = 0;
219 };
220
221 FaceAssemblyViewRange(const Iterator &begin, const Iterator &end, const SolutionReconstructionCache &cache,
222 GeometryProvider geometry_provider)
223 : cache_(cache), geometry_provider_(std::move(geometry_provider))
224 {
225 for (auto cell = begin; cell != end; ++cell) {
226 const auto cell_index = cell->active_cell_index();
227 for (const auto face_index : cell->face_indices()) {
228 const bool boundary = cell->at_boundary(face_index);
229 unsigned int neighbor_index = std::numeric_limits<unsigned int>::max();
230 if (!boundary) {
231 neighbor_index = cell->neighbor(face_index)->active_cell_index();
232 if (neighbor_index < cell_index) continue;
233 }
234 descriptors_.push_back({cell, face_index, boundary, neighbor_index});
235 }
236 }
237 }
238
239 const_iterator begin() const { return const_iterator(this, 0); }
240 const_iterator end() const { return const_iterator(this, descriptors_.size()); }
241 std::size_t size() const { return descriptors_.size(); }
242
243 Context operator[](const std::size_t index) const
244 {
245 const auto &descriptor = descriptors_[index];
246 const auto cell_index = descriptor.cell->active_cell_index();
247 const auto &reconstruction = cache_.face_reconstructions[cell_index][descriptor.face_index];
248 return Context(descriptor.cell->face(descriptor.face_index)->center(),
249 geometry_provider_.normal(descriptor.cell, descriptor.face_index),
250 geometry_provider_.jxw(descriptor.cell, descriptor.face_index), descriptor.boundary,
251 cell_index, descriptor.face_index, descriptor.neighbor_cell_index, reconstruction);
252 }
253
254 private:
255 struct Descriptor {
256 Iterator cell;
257 unsigned int face_index = 0;
258 bool boundary = false;
259 unsigned int neighbor_cell_index = std::numeric_limits<unsigned int>::max();
260 };
261
262 std::vector<Descriptor> descriptors_;
264 GeometryProvider geometry_provider_;
265 };
266
267 template <int dim_, typename NumberType_, std::size_t n_components_, typename Iterator>
269 {
270 public:
271 static constexpr int dim = dim_;
272 static constexpr std::size_t n_components = n_components_;
273 using NumberType = NumberType_;
277
279 {
280 public:
281 using iterator_category = std::random_access_iterator_tag;
282 using difference_type = std::ptrdiff_t;
285 using pointer = void;
286
287 const_iterator() = default;
288 const_iterator(const CellAssemblyViewRange *range, const std::size_t index) : range_(range), index_(index) {}
289
290 value_type operator*() const { return (*range_)[index_]; }
292 {
293 return (*range_)[static_cast<std::size_t>(static_cast<difference_type>(index_) + offset)];
294 }
295
297 {
298 ++index_;
299 return *this;
300 }
302 {
303 auto copy = *this;
304 ++(*this);
305 return copy;
306 }
308 {
309 --index_;
310 return *this;
311 }
313 {
314 auto copy = *this;
315 --(*this);
316 return copy;
317 }
319 {
320 index_ = static_cast<std::size_t>(static_cast<difference_type>(index_) + offset);
321 return *this;
322 }
324 {
325 return *this += -offset;
326 }
327
328 friend const_iterator operator+(const const_iterator iterator, const difference_type offset)
329 {
330 auto copy = iterator;
331 copy += offset;
332 return copy;
333 }
334 friend const_iterator operator+(const difference_type offset, const const_iterator iterator)
335 {
336 return iterator + offset;
337 }
338 friend const_iterator operator-(const const_iterator iterator, const difference_type offset)
339 {
340 auto copy = iterator;
341 copy -= offset;
342 return copy;
343 }
344 friend difference_type operator-(const const_iterator &left, const const_iterator &right)
345 {
346 return static_cast<difference_type>(left.index_) - static_cast<difference_type>(right.index_);
347 }
348
349 friend bool operator==(const const_iterator &left, const const_iterator &right)
350 {
351 return left.range_ == right.range_ && left.index_ == right.index_;
352 }
353 friend bool operator!=(const const_iterator &left, const const_iterator &right) { return !(left == right); }
354 friend bool operator<(const const_iterator &left, const const_iterator &right)
355 {
356 return left.index_ < right.index_;
357 }
358 friend bool operator>(const const_iterator &left, const const_iterator &right) { return right < left; }
359 friend bool operator<=(const const_iterator &left, const const_iterator &right) { return !(right < left); }
360 friend bool operator>=(const const_iterator &left, const const_iterator &right) { return !(left < right); }
361
362 private:
364 std::size_t index_ = 0;
365 };
366
367 CellAssemblyViewRange(const Iterator &begin, const Iterator &end, const SolutionReconstructionCache &cache)
368 : cache_(cache)
369 {
370 for (auto cell = begin; cell != end; ++cell)
371 descriptors_.push_back({cell, cell->active_cell_index()});
372 }
373
374 const_iterator begin() const { return const_iterator(this, 0); }
375 const_iterator end() const { return const_iterator(this, descriptors_.size()); }
376 std::size_t size() const { return descriptors_.size(); }
377
378 Context operator[](const std::size_t index) const
379 {
380 const auto &descriptor = descriptors_[index];
381 return Context(descriptor.cell->center(), descriptor.cell_index, cache_.cell_stencils[descriptor.cell_index]);
382 }
383
384 private:
385 struct Descriptor {
386 Iterator cell;
387 unsigned int cell_index = 0;
388 };
389
390 std::vector<Descriptor> descriptors_;
392 };
393
394 template <typename FaceRange, typename CellRange> class AssemblyContextView
395 {
396 public:
397 static_assert(FaceRange::dim == CellRange::dim);
398 static_assert(FaceRange::n_components == CellRange::n_components);
399
400 static constexpr int dim = FaceRange::dim;
401 static constexpr std::size_t n_components = FaceRange::n_components;
402 using NumberType = typename FaceRange::NumberType;
403 using FaceAssemblyViewRange = FaceRange;
404 using CellAssemblyViewRange = CellRange;
405
406 AssemblyContextView(FaceRange faces, CellRange cells) : faces_(std::move(faces)), cells_(std::move(cells)) {}
407
408 const FaceRange &faces() const { return faces_; }
409 const CellRange &cells() const { return cells_; }
410
411 private:
412 FaceRange faces_;
413 CellRange cells_;
414 };
415
416 template <typename Context>
418 requires(const Context &context) {
419 typename Context::FaceAssemblyViewRange;
420 typename Context::CellAssemblyViewRange;
421 typename Context::NumberType;
422 {
423 Context::dim
424 } -> std::convertible_to<int>;
425 {
426 Context::n_components
427 } -> std::convertible_to<std::size_t>;
428 {
429 context.faces()
430 } -> std::same_as<const typename Context::FaceAssemblyViewRange &>;
431 {
432 context.cells()
433 } -> std::same_as<const typename Context::CellAssemblyViewRange &>;
436
437 // Assembly context views are non-owning views over the per-solution reconstruction cache and
438 // active-cell iterators. They are valid only for the synchronous fv_kt_pre_assembly call.
439 template <typename Model, typename Context>
441 HasAssemblyContextView<Context> && requires(Model &model, const AssemblyStage stage, const Context &context) {
442 {
443 model.fv_kt_pre_assembly(stage, context)
444 } -> std::same_as<void>;
445 };
446
447 template <typename Model, HasAssemblyContextView Context>
448 void dispatch_fv_kt_pre_assembly(Model &model, const AssemblyStage stage, const Context &context)
449 {
450 if constexpr (HasFVKTAssemblyHook<Model, Context>) model.fv_kt_pre_assembly(stage, context);
451 }
452 } // namespace KurganovTadmor
453 } // namespace FV
454} // namespace DiFfRG
Definition assembly_context.hh:395
const FaceRange & faces() const
Definition assembly_context.hh:408
AssemblyContextView(FaceRange faces, CellRange cells)
Definition assembly_context.hh:406
CellRange cells_
Definition assembly_context.hh:413
static constexpr std::size_t n_components
Definition assembly_context.hh:401
CellRange CellAssemblyViewRange
Definition assembly_context.hh:404
FaceRange faces_
Definition assembly_context.hh:412
typename FaceRange::NumberType NumberType
Definition assembly_context.hh:402
FaceRange FaceAssemblyViewRange
Definition assembly_context.hh:403
static constexpr int dim
Definition assembly_context.hh:400
const CellRange & cells() const
Definition assembly_context.hh:409
friend bool operator>(const const_iterator &left, const const_iterator &right)
Definition assembly_context.hh:358
std::random_access_iterator_tag iterator_category
Definition assembly_context.hh:281
value_type operator*() const
Definition assembly_context.hh:290
const_iterator operator--(int)
Definition assembly_context.hh:312
const_iterator & operator+=(const difference_type offset)
Definition assembly_context.hh:318
const_iterator & operator-=(const difference_type offset)
Definition assembly_context.hh:323
friend bool operator<(const const_iterator &left, const const_iterator &right)
Definition assembly_context.hh:354
friend const_iterator operator-(const const_iterator iterator, const difference_type offset)
Definition assembly_context.hh:338
friend bool operator>=(const const_iterator &left, const const_iterator &right)
Definition assembly_context.hh:360
friend bool operator==(const const_iterator &left, const const_iterator &right)
Definition assembly_context.hh:349
const CellAssemblyViewRange * range_
Definition assembly_context.hh:363
friend const_iterator operator+(const const_iterator iterator, const difference_type offset)
Definition assembly_context.hh:328
friend bool operator<=(const const_iterator &left, const const_iterator &right)
Definition assembly_context.hh:359
const_iterator & operator--()
Definition assembly_context.hh:307
const_iterator operator++(int)
Definition assembly_context.hh:301
const_iterator(const CellAssemblyViewRange *range, const std::size_t index)
Definition assembly_context.hh:288
friend bool operator!=(const const_iterator &left, const const_iterator &right)
Definition assembly_context.hh:353
std::size_t index_
Definition assembly_context.hh:364
value_type operator[](const difference_type offset) const
Definition assembly_context.hh:291
friend const_iterator operator+(const difference_type offset, const const_iterator iterator)
Definition assembly_context.hh:334
Context value_type
Definition assembly_context.hh:283
std::ptrdiff_t difference_type
Definition assembly_context.hh:282
friend difference_type operator-(const const_iterator &left, const const_iterator &right)
Definition assembly_context.hh:344
const_iterator & operator++()
Definition assembly_context.hh:296
Definition assembly_context.hh:269
CellAssemblyViewRange(const Iterator &begin, const Iterator &end, const SolutionReconstructionCache &cache)
Definition assembly_context.hh:367
const_iterator begin() const
Definition assembly_context.hh:374
const_iterator end() const
Definition assembly_context.hh:375
std::vector< Descriptor > descriptors_
Definition assembly_context.hh:390
KurganovTadmor::CellAssemblyView< dim, NumberType, n_components > CellAssemblyView
Definition assembly_context.hh:274
static constexpr int dim
Definition assembly_context.hh:271
Context operator[](const std::size_t index) const
Definition assembly_context.hh:378
const SolutionReconstructionCache & cache_
Definition assembly_context.hh:391
std::size_t size() const
Definition assembly_context.hh:376
NumberType_ NumberType
Definition assembly_context.hh:273
CellAssemblyView Context
Definition assembly_context.hh:275
static constexpr std::size_t n_components
Definition assembly_context.hh:272
Definition assembly_context.hh:60
static constexpr std::size_t n_components
Definition assembly_context.hh:63
CellAssemblyView(const dealii::Point< dim > &point, const unsigned int cell_index, const CellStencilData &stencil)
Definition assembly_context.hh:67
const dealii::Point< dim > & point() const
Definition assembly_context.hh:73
const CellStencilData & stencil() const
Definition assembly_context.hh:75
unsigned int cell_index_
Definition assembly_context.hh:79
NumberType_ NumberType
Definition assembly_context.hh:64
unsigned int cell_index() const
Definition assembly_context.hh:74
dealii::Point< dim > point_
Definition assembly_context.hh:78
const CellStencilData & stencil_
Definition assembly_context.hh:80
static constexpr int dim
Definition assembly_context.hh:62
friend bool operator>(const const_iterator &left, const const_iterator &right)
Definition assembly_context.hh:212
friend bool operator<(const const_iterator &left, const const_iterator &right)
Definition assembly_context.hh:208
friend const_iterator operator-(const const_iterator iterator, const difference_type offset)
Definition assembly_context.hh:192
const_iterator & operator--()
Definition assembly_context.hh:161
value_type operator*() const
Definition assembly_context.hh:144
friend bool operator>=(const const_iterator &left, const const_iterator &right)
Definition assembly_context.hh:214
friend bool operator==(const const_iterator &left, const const_iterator &right)
Definition assembly_context.hh:203
const FaceAssemblyViewRange * range_
Definition assembly_context.hh:217
const_iterator(const FaceAssemblyViewRange *range, const std::size_t index)
Definition assembly_context.hh:142
friend const_iterator operator+(const const_iterator iterator, const difference_type offset)
Definition assembly_context.hh:182
friend bool operator<=(const const_iterator &left, const const_iterator &right)
Definition assembly_context.hh:213
const_iterator operator--(int)
Definition assembly_context.hh:166
std::size_t index_
Definition assembly_context.hh:218
std::random_access_iterator_tag iterator_category
Definition assembly_context.hh:135
const_iterator operator++(int)
Definition assembly_context.hh:155
Context value_type
Definition assembly_context.hh:137
const_iterator & operator-=(const difference_type offset)
Definition assembly_context.hh:177
friend bool operator!=(const const_iterator &left, const const_iterator &right)
Definition assembly_context.hh:207
const_iterator & operator+=(const difference_type offset)
Definition assembly_context.hh:172
friend const_iterator operator+(const difference_type offset, const const_iterator iterator)
Definition assembly_context.hh:188
std::ptrdiff_t difference_type
Definition assembly_context.hh:136
const_iterator & operator++()
Definition assembly_context.hh:150
friend difference_type operator-(const const_iterator &left, const const_iterator &right)
Definition assembly_context.hh:198
value_type operator[](const difference_type offset) const
Definition assembly_context.hh:145
Definition assembly_context.hh:123
static constexpr int dim
Definition assembly_context.hh:125
GeometryProvider geometry_provider_
Definition assembly_context.hh:264
const_iterator begin() const
Definition assembly_context.hh:239
const SolutionReconstructionCache & cache_
Definition assembly_context.hh:263
std::vector< Descriptor > descriptors_
Definition assembly_context.hh:262
std::size_t size() const
Definition assembly_context.hh:241
NumberType_ NumberType
Definition assembly_context.hh:127
Context operator[](const std::size_t index) const
Definition assembly_context.hh:243
KurganovTadmor::FaceAssemblyView< dim, NumberType, n_components > FaceAssemblyView
Definition assembly_context.hh:128
static constexpr std::size_t n_components
Definition assembly_context.hh:126
FaceAssemblyViewRange(const Iterator &begin, const Iterator &end, const SolutionReconstructionCache &cache, GeometryProvider geometry_provider)
Definition assembly_context.hh:221
const_iterator end() const
Definition assembly_context.hh:240
FaceAssemblyView Context
Definition assembly_context.hh:129
Definition assembly_context.hh:23
dealii::Tensor< 1, dim > normal_
Definition assembly_context.hh:50
const dealii::Point< dim > & point() const
Definition assembly_context.hh:39
unsigned int face_index() const
Definition assembly_context.hh:44
dealii::Point< dim > point_
Definition assembly_context.hh:49
const ReconstructionState & reconstruction() const
Definition assembly_context.hh:46
const ReconstructionState & reconstruction_
Definition assembly_context.hh:56
double jxw() const
Definition assembly_context.hh:41
FaceAssemblyView(const dealii::Point< dim > &point, const dealii::Tensor< 1, dim > &normal, const double jxw, const bool boundary, const unsigned int cell_index, const unsigned int face_index, const unsigned int neighbor_cell_index, const ReconstructionState &reconstruction)
Definition assembly_context.hh:30
NumberType_ NumberType
Definition assembly_context.hh:27
double jxw_
Definition assembly_context.hh:51
unsigned int cell_index_
Definition assembly_context.hh:53
unsigned int neighbor_cell_index() const
Definition assembly_context.hh:45
static constexpr std::size_t n_components
Definition assembly_context.hh:26
unsigned int cell_index() const
Definition assembly_context.hh:43
static constexpr int dim
Definition assembly_context.hh:25
bool at_boundary() const
Definition assembly_context.hh:42
bool boundary_
Definition assembly_context.hh:52
unsigned int face_index_
Definition assembly_context.hh:54
const dealii::Tensor< 1, dim > & normal() const
Definition assembly_context.hh:40
unsigned int neighbor_cell_index_
Definition assembly_context.hh:55
Definition assembly_context.hh:417
Definition assembly_context.hh:84
Definition assembly_context.hh:440
AssemblyStage
Definition assembly_context.hh:20
void dispatch_fv_kt_pre_assembly(Model &model, const AssemblyStage stage, const Context &context)
Definition assembly_context.hh:448
Definition complex_math.hh:10
Iterator cell
Definition assembly_context.hh:386
unsigned int cell_index
Definition assembly_context.hh:387
unsigned int neighbor_cell_index
Definition assembly_context.hh:259
Iterator cell
Definition assembly_context.hh:256
unsigned int face_index
Definition assembly_context.hh:257
Definition reconstruction_cache.hh:118
std::vector< CellStencilData< dim, NumberType, n_components > > cell_stencils
Definition reconstruction_cache.hh:128
std::vector< std::array< FaceReconstructionState< dim, NumberType, n_components >, n_faces > > face_reconstructions
Definition reconstruction_cache.hh:130