6#include <deal.II/base/vectorization.h>
10#include <prismspf/config.h>
28 template <
unsigned int N,
typename T>
29 [[nodiscard]]
inline DEAL_II_ALWAYS_INLINE T
40 const T t1 = T(1) / sqrt(T(1) + x * x);
47 else if constexpr (N == 1)
51 else if constexpr (N == 2)
53 return T(2) * t2 - T(1);
55 else if constexpr (N == 3)
57 return t1 * (T(4) * t2 - T(3));
59 else if constexpr (N == 4)
61 return T(8) * t2 * t2 - T(8) * t2 + T(1);
66 return cos(T(N) * atan(x));
84 template <
unsigned int N,
typename T>
85 [[nodiscard]]
inline DEAL_II_ALWAYS_INLINE T
96 const T t1 = T(1) / sqrt(T(1) + x * x);
103 else if constexpr (N == 1)
107 else if constexpr (N == 2)
109 return T(2) * s1 * t1;
111 else if constexpr (N == 3)
113 return s1 * (T(3) - T(4) * s1 * s1);
115 else if constexpr (N == 4)
117 return T(4) * s1 * t1 * (T(1) - T(2) * s1 * s1);
122 return sin(T(N) * atan(x));
140 template <
unsigned int N,
typename T>
141 [[nodiscard]]
inline DEAL_II_ALWAYS_INLINE T
149 if constexpr (N <= 5)
152 const T t2 = t1 * t1;
153 const T t3 = t2 * t1;
154 const T t4 = t2 * t2;
155 const T t5 = t3 * t2;
156 const T t6 = t3 * t3;
157 const T t7 = t4 * t3;
158 const T t8 = t4 * t4;
159 const T t9 = t5 * t4;
160 const T t10 = t5 * t5;
161 const T t11 = t6 * t5;
162 const T t12 = t6 * t6;
164 if constexpr (N == 0)
168 else if constexpr (N == 1)
172 else if constexpr (N == 2)
174 return T(2) * t2 - T(1);
176 else if constexpr (N == 3)
178 return T(4) * t3 - T(3) * t1;
180 else if constexpr (N == 4)
182 return T(8) * t4 - T(8) * t2 + T(1);
184 else if constexpr (N == 5)
186 return T(16) * t5 - T(20) * t3 + T(5) * t1;
188 else if constexpr (N == 6)
190 return T(32) * t6 - T(48) * t4 + T(18) * t2 - T(1);
192 else if constexpr (N == 7)
194 return T(64) * t7 - T(112) * t5 + T(56) * t3 - T(7) * t1;
196 else if constexpr (N == 8)
198 return T(128) * t8 - T(256) * t6 + T(160) * t4 - T(32) * t2 + T(1);
200 else if constexpr (N == 9)
202 return T(256) * t9 - T(576) * t7 + T(432) * t5 - T(120) * t3 + T(9) * t1;
204 else if constexpr (N == 10)
206 return T(512) * t10 - T(1280) * t8 + T(1120) * t6 - T(400) * t4 + T(50) * t2 -
209 else if constexpr (N == 11)
211 return T(1024) * t11 - T(2816) * t9 + T(2816) * t7 - T(1232) * t5 +
212 T(220) * t3 - T(11) * t1;
214 else if constexpr (N == 12)
216 return T(2048) * t12 - T(6144) * t10 + T(6912) * t8 - T(3584) * t6 +
217 T(840) * t4 - T(72) * t2 + T(1);
222 return cos(T(N) * atan2(ny, nx));
240 template <
unsigned int N,
typename T>
241 [[nodiscard]]
inline DEAL_II_ALWAYS_INLINE T
249 if constexpr (N <= 5)
253 const T t2 = t1 * t1;
254 const T t3 = t2 * t1;
255 const T t4 = t2 * t2;
256 const T t5 = t3 * t2;
257 const T t6 = t3 * t3;
258 const T t7 = t4 * t3;
259 const T t8 = t4 * t4;
260 const T t9 = t5 * t4;
261 const T t10 = t5 * t5;
262 const T t11 = t6 * t5;
264 if constexpr (N == 0)
268 else if constexpr (N == 1)
272 else if constexpr (N == 2)
274 return T(2) * s1 * t1;
276 else if constexpr (N == 3)
278 return s1 * (T(4) * t2 - T(1));
280 else if constexpr (N == 4)
282 return s1 * (T(8) * t3 - T(4) * t1);
284 else if constexpr (N == 5)
286 return s1 * (T(16) * t4 - T(12) * t2 + T(1));
288 else if constexpr (N == 6)
290 return s1 * (T(32) * t5 - T(32) * t3 + T(6) * t1);
292 else if constexpr (N == 7)
294 return s1 * (T(64) * t6 - T(80) * t4 + T(24) * t2 - T(1));
296 else if constexpr (N == 8)
298 return s1 * (T(128) * t7 - T(192) * t5 + T(80) * t3 - T(8) * t1);
300 else if constexpr (N == 9)
302 return s1 * (T(256) * t8 - T(448) * t6 + T(240) * t4 - T(40) * t2 + T(1));
304 else if constexpr (N == 10)
307 (T(512) * t9 - T(1024) * t7 + T(672) * t5 - T(160) * t3 + T(10) * t1);
309 else if constexpr (N == 11)
311 return s1 * (T(1024) * t10 - T(2304) * t8 + T(1792) * t6 - T(560) * t4 +
314 else if constexpr (N == 12)
316 return s1 * (T(2048) * t11 - T(5120) * t9 + T(4608) * t7 - T(1792) * t5 +
317 T(280) * t3 - T(12) * t1);
322 return sin(T(N) * atan2(ny, nx));
340 template <
unsigned int N,
typename T>
341 [[nodiscard]]
inline DEAL_II_ALWAYS_INLINE T
342 cos_psi(
const T &nx,
const T &ny,
const T &nz)
noexcept
350 if constexpr (N <= 5)
353 const T t2 = t1 * t1;
354 const T t3 = t2 * t1;
355 const T t4 = t2 * t2;
356 const T t5 = t3 * t2;
357 const T t6 = t3 * t3;
358 const T t7 = t4 * t3;
359 const T t8 = t4 * t4;
360 const T t9 = t5 * t4;
361 const T t10 = t5 * t5;
362 const T t11 = t6 * t5;
363 const T t12 = t6 * t6;
365 if constexpr (N == 0)
369 else if constexpr (N == 1)
373 else if constexpr (N == 2)
375 return T(2) * t2 - T(1);
377 else if constexpr (N == 3)
379 return T(4) * t3 - T(3) * t1;
381 else if constexpr (N == 4)
383 return T(8) * t4 - T(8) * t2 + T(1);
385 else if constexpr (N == 5)
387 return T(16) * t5 - T(20) * t3 + T(5) * t1;
389 else if constexpr (N == 6)
391 return T(32) * t6 - T(48) * t4 + T(18) * t2 - T(1);
393 else if constexpr (N == 7)
395 return T(64) * t7 - T(112) * t5 + T(56) * t3 - T(7) * t1;
397 else if constexpr (N == 8)
399 return T(128) * t8 - T(256) * t6 + T(160) * t4 - T(32) * t2 + T(1);
401 else if constexpr (N == 9)
403 return T(256) * t9 - T(576) * t7 + T(432) * t5 - T(120) * t3 + T(9) * t1;
405 else if constexpr (N == 10)
407 return T(512) * t10 - T(1280) * t8 + T(1120) * t6 - T(400) * t4 + T(50) * t2 -
410 else if constexpr (N == 11)
412 return T(1024) * t11 - T(2816) * t9 + T(2816) * t7 - T(1232) * t5 +
413 T(220) * t3 - T(11) * t1;
415 else if constexpr (N == 12)
417 return T(2048) * t12 - T(6144) * t10 + T(6912) * t8 - T(3584) * t6 +
418 T(840) * t4 - T(72) * t2 + T(1);
423 return cos(T(N) * atan2(sqrt(nx * nx + ny * ny), nz));
441 template <
unsigned int N,
typename T>
442 [[nodiscard]]
inline DEAL_II_ALWAYS_INLINE T
443 sin_psi(
const T &nx,
const T &ny,
const T &nz)
noexcept
451 if constexpr (N <= 5)
453 const T s1 = sqrt(nx * nx + ny * ny);
455 const T t2 = t1 * t1;
456 const T t3 = t2 * t1;
457 const T t4 = t2 * t2;
458 const T t5 = t3 * t2;
459 const T t6 = t3 * t3;
460 const T t7 = t4 * t3;
461 const T t8 = t4 * t4;
462 const T t9 = t5 * t4;
463 const T t10 = t5 * t5;
464 const T t11 = t6 * t5;
466 if constexpr (N == 0)
470 else if constexpr (N == 1)
474 else if constexpr (N == 2)
476 return T(2) * s1 * t1;
478 else if constexpr (N == 3)
480 return s1 * (T(4) * t2 - T(1));
482 else if constexpr (N == 4)
484 return s1 * (T(8) * t3 - T(4) * t1);
486 else if constexpr (N == 5)
488 return s1 * (T(16) * t4 - T(12) * t2 + T(1));
490 else if constexpr (N == 6)
492 return s1 * (T(32) * t5 - T(32) * t3 + T(6) * t1);
494 else if constexpr (N == 7)
496 return s1 * (T(64) * t6 - T(80) * t4 + T(24) * t2 - T(1));
498 else if constexpr (N == 8)
500 return s1 * (T(128) * t7 - T(192) * t5 + T(80) * t3 - T(8) * t1);
502 else if constexpr (N == 9)
504 return s1 * (T(256) * t8 - T(448) * t6 + T(240) * t4 - T(40) * t2 + T(1));
506 else if constexpr (N == 10)
509 (T(512) * t9 - T(1024) * t7 + T(672) * t5 - T(160) * t3 + T(10) * t1);
511 else if constexpr (N == 11)
513 return s1 * (T(1024) * t10 - T(2304) * t8 + T(1792) * t6 - T(560) * t4 +
516 else if constexpr (N == 12)
518 return s1 * (T(2048) * t11 - T(5120) * t9 + T(4608) * t7 - T(1792) * t5 +
519 T(280) * t3 - T(12) * t1);
524 return sin(T(N) * atan2(sqrt(nx * nx + ny * ny), nz));
532PRISMS_PF_END_NAMESPACE
Definition conditional_ostreams.cc:20
DEAL_II_ALWAYS_INLINE T sin_theta(const T &nx, const T &ny) noexcept
Compute sin(N * theta) where theta = arctan(ny/nx).
Definition symmetry.h:242
DEAL_II_ALWAYS_INLINE T cos_arctan(const T &x) noexcept
Compute cos(N * arctan(x)).
Definition symmetry.h:30
DEAL_II_ALWAYS_INLINE T sin_arctan(const T &x) noexcept
Compute sin(N * arctan(x)).
Definition symmetry.h:86
DEAL_II_ALWAYS_INLINE T sin_psi(const T &nx, const T &ny, const T &nz) noexcept
Compute sin(N * psi) where theta = arctan(sqrt(nx^2+ny^2)/ny).
Definition symmetry.h:443
DEAL_II_ALWAYS_INLINE T cos_psi(const T &nx, const T &ny, const T &nz) noexcept
Compute cos(N * psi) where theta = arctan(sqrt(nx^2+ny^2)/ny).
Definition symmetry.h:342
DEAL_II_ALWAYS_INLINE T cos_theta(const T &nx, const T &ny) noexcept
Compute cos(N * theta) where theta = arctan(ny/nx).
Definition symmetry.h:142
inline ::dealii::VectorizedArray< Number, width > atan2(const ::dealii::VectorizedArray< Number, width > &y, const ::dealii::VectorizedArray< Number, width > &x)
Definition vectorized_operations.h:43