FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
refinement_field.hpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#pragma once
7
10#include <kernel/geometry/index_set.hpp>
11
12#include <array>
13#include <cstddef>
14#include <vector>
15
16namespace FEAT::Geometry::Intern
17{
18 template<typename VertexMarking_, int size_>
20 {
21 static_assert(size_ > 0, "Invalid RefinementFieldTuple size. Must be greater than 0.");
22 public:
24 using VertexMarkingType = VertexMarking_;
25
27 static constexpr std::size_t size = size_;
28
30 std::array<VertexMarkingType, size_> levels;
31
34 {
35 ASSERT(idx < size);
36 return levels[idx];
37 }
38
41 {
42 ASSERT(idx < size);
43 return levels[idx];
44 }
45 };
46
47 template<typename VertexMarking_>
49 {
50 public:
51 using VertexMarkingType = VertexMarking_;
52
53 private:
54 std::vector<VertexMarkingType> _markings;
55
56 public:
57 explicit RefinementField(Index num_vertices) : _markings(num_vertices)
58 {
59 }
60
61 RefinementField(Index num_vertices, VertexMarkingType default_marking) : _markings(num_vertices, default_marking)
62 {
63 }
64
67 _markings(std::forward<std::vector<VertexMarkingType>>(other._markings))
68 {
69 }
70
73 {
74 if(this == &other)
75 {
76 return *this;
77 }
78
79 _markings = std::forward<std::vector<VertexMarkingType>>(other._markings);
80
81 return *this;
82 }
83
86
89
91 ~RefinementField() = default;
92
94 VertexMarkingType& operator[](Index idx)
95 {
96 ASSERT(idx < _markings.size());
97 return _markings[idx];
98 }
99
101 const VertexMarkingType& operator[](Index idx) const
102 {
103 ASSERT(idx < _markings.size());
104 return _markings[idx];
105 }
106
107 std::size_t size() const
108 {
109 return _markings.size();
110 }
111
112 template<int n_>
113 RefinementFieldTuple<VertexMarkingType, n_> get_tuple(const Geometry::IndexTuple<n_>& indices) const
114 {
115 RefinementFieldTuple<VertexMarkingType, n_> result = {};
116
117 for(int i(0); i < n_; ++i)
118 {
119 result[i] = _markings[indices[i]];
120 }
121 return result;
122 }
123 };
124} // namespace FEAT::Geometry::Intern
#define ASSERT(expr)
Debug-Assertion macro definition.
Definition: assertion.hpp:229
FEAT Kernel base header.
RefinementField & operator=(RefinementField &other)=delete
deleted copy-assign operator
VertexMarkingType & operator[](Index idx)
access operator
RefinementField(RefinementField &other)=delete
deleted copy-constructor
const VertexMarkingType & operator[](Index idx) const
const access operator
RefinementField & operator=(RefinementField &&other) noexcept
move-assign operator
RefinementField(RefinementField &&other) noexcept
move-constructor
VertexMarkingType & operator[](Index idx)
access operator
VertexMarking_ VertexMarkingType
Type of vertex marking.
const VertexMarkingType & operator[](Index idx) const
access operator
std::array< VertexMarkingType, size_ > levels
Tuple values.
static constexpr std::size_t size
Tuple size.
@ other
generic/other permutation strategy
std::uint64_t Index
Index data type.
Index Tuple class template.
Definition: index_set.hpp:35