18 RSMESH_ASSERT(degree >= 0 and degree <= 2);
20 template<
class DerivedPo
ints>
21 Eigen::MatrixXd evaluate(
const Eigen::MatrixBase<DerivedPoints>& points)
const {
25 template<
class DerivedPo
ints,
class DerivedGradPo
ints>
26 Eigen::MatrixXd evaluate(
const Eigen::MatrixBase<DerivedPoints> &points,
27 const Eigen::MatrixBase<DerivedGradPoints>& grad_points)
const {
28 auto mu = points.rows();
29 auto sigma = grad_points.rows();
30 Eigen::MatrixXd result(basis_size(), mu + dimension() * sigma);
35 for(index_t i = 0; i < mu; i ++) {
38 for(index_t i = 0; i < sigma; i ++) {
44 for(index_t i = 0; i < mu; i ++) {
45 auto p = points.row(i);
49 for(index_t i = 0; i < sigma; i ++) {
56 for(index_t i = 0; i < mu; i ++) {
57 auto p = points.row(i);
60 result(2, i) = p(0) * p(0);
62 for(index_t i = 0; i < sigma; i ++) {
64 auto p = grad_points.row(i);
67 result(2, i_x) = 2.0 * p(0);
78 for(index_t i = 0; i < mu; i ++) {
81 for(index_t i = 0; i < sigma; i ++) {
82 auto i_x = mu + 2 * i;
83 auto i_y = mu + 2 * i + 1;
89 for(index_t i =0 ; i < mu; i ++) {
90 auto p = points.row(i);
95 for(index_t i = 0; i < sigma; i ++) {
96 auto i_x = mu + 2 * i;
97 auto i_y = mu + 2 * i + 1;
100 result(1, i_x) = 1.0;
101 result(1, i_y) = 0.0;
102 result(2, i_x) = 0.0;
103 result(2, i_y) = 1.0;
107 for(index_t i = 0; i < mu; i ++) {
108 auto p = points.row(i);
112 result(3, i) = p(0) * p(0);
113 result(4, i) = p(0) * p(1);
114 result(5, i) = p(1) * p(1);
116 for(index_t i = 0; i < sigma; i ++) {
117 auto p = grad_points.row(i);
118 auto i_x = mu + 2 * i;
119 auto i_y = mu + 2 * i + 1;
120 result(0, i_x) = 0.0;
121 result(0, i_y) = 0.0;
122 result(1, i_x) = 1.0;
123 result(1, i_y) = 0.0;
124 result(2, i_x) = 0.0;
125 result(2, i_y) = 1.0;
126 result(3, i_x) = 2.0 * p(0);
127 result(3, i_y) = 0.0;
128 result(4, i_x) = p(1);
129 result(4, i_y) = p(0);
130 result(5, i_x) = 0.0;
131 result(5, i_y) = 2.0 * p(1);
135 RSMESH_UNREACHABLE();
142 for(index_t i = 0; i < mu; i ++) {
145 for(index_t i = 0; i < sigma; i ++) {
146 auto i_x = mu + 3 * i;
147 auto i_y = mu + 3 * i + 1;
148 auto i_z = mu + 3 * i + 2;
149 result(0, i_x) = 0.0;
150 result(0, i_y) = 0.0;
151 result(0, i_z) = 0.0;
155 for(index_t i = 0; i < mu; i ++) {
156 auto p = points.row(i);
162 for(index_t i = 0; i < sigma; i ++) {
163 auto i_x = mu + 3 * i;
164 auto i_y = mu + 3 * i + 1;
165 auto i_z = mu + 3 * i + 2;
166 result(0, i_x) = 0.0;
167 result(0, i_y) = 0.0;
168 result(0, i_z) = 0.0;
169 result(1, i_x) = 1.0;
170 result(1, i_y) = 0.0;
171 result(1, i_z) = 0.0;
172 result(2, i_x) = 0.0;
173 result(2, i_y) = 1.0;
174 result(2, i_z) = 0.0;
175 result(3, i_x) = 0.0;
176 result(3, i_y) = 0.0;
177 result(3, i_z) = 1.0;
181 for(index_t i = 0; i < mu; i ++) {
182 auto p = points.row(i);
187 result(4, i) = p(0) * p(0);
188 result(5, i) = p(0) * p(1);
189 result(6, i) = p(0) * p(2);
190 result(7, i) = p(1) * p(1);
191 result(8, i) = p(1) * p(2);
192 result(9, i) = p(2) * p(2);
194 for (index_t i = 0; i < sigma; i++) {
195 auto p = grad_points.row(i);
196 auto i_x = mu + 3 * i;
197 auto i_y = mu + 3 * i + 1;
198 auto i_z = mu + 3 * i + 2;
199 result(0, i_x) = 0.0;
200 result(0, i_y) = 0.0;
201 result(0, i_z) = 0.0;
202 result(1, i_x) = 1.0;
203 result(1, i_y) = 0.0;
204 result(1, i_z) = 0.0;
205 result(2, i_x) = 0.0;
206 result(2, i_y) = 1.0;
207 result(2, i_z) = 0.0;
208 result(3, i_x) = 0.0;
209 result(3, i_y) = 0.0;
210 result(3, i_z) = 1.0;
211 result(4, i_x) = 2.0 * p(0);
212 result(4, i_y) = 0.0;
213 result(4, i_z) = 0.0;
214 result(5, i_x) = p(1);
215 result(5, i_y) = p(0);
216 result(5, i_z) = 0.0;
217 result(6, i_x) = p(2);
218 result(6, i_y) = 0.0;
219 result(6, i_z) = p(0);
220 result(7, i_x) = 0.0;
221 result(7, i_y) = 2.0 * p(1);
222 result(7, i_z) = 0.0;
223 result(8, i_x) = 0.0;
224 result(8, i_y) = p(2);
225 result(8, i_z) = p(1);
226 result(9, i_x) = 0.0;
227 result(9, i_y) = 0.0;
228 result(9, i_z) = 2.0 * p(2);
232 RSMESH_UNREACHABLE();
237 RSMESH_UNREACHABLE();