3#include <deal.II/base/vectorization.h>
7#include <prismspf/config.h>
25 template <
unsigned int N,
typename T>
26 [[nodiscard]]
inline DEAL_II_ALWAYS_INLINE T
37 const T t1 = T(1) / sqrt(T(1) + x * x);
44 else if constexpr (N == 1)
48 else if constexpr (N == 2)
50 return T(2) * t2 - T(1);
52 else if constexpr (N == 3)
54 return t1 * (T(4) * t2 - T(3));
56 else if constexpr (N == 4)
58 return T(8) * t2 * t2 - T(8) * t2 + T(1);
63 return cos(T(N) * atan(x));
81 template <
unsigned int N,
typename T>
82 [[nodiscard]]
inline DEAL_II_ALWAYS_INLINE T
93 const T t1 = T(1) / sqrt(T(1) + x * x);
100 else if constexpr (N == 1)
104 else if constexpr (N == 2)
106 return T(2) * s1 * t1;
108 else if constexpr (N == 3)
110 return s1 * (T(3) - T(4) * s1 * s1);
112 else if constexpr (N == 4)
114 return T(4) * s1 * t1 * (T(1) - T(2) * s1 * s1);
119 return sin(T(N) * atan(x));
137 template <
unsigned int N,
typename T>
138 [[nodiscard]]
inline DEAL_II_ALWAYS_INLINE T
146 if constexpr (N <= 5)
149 const T t2 = t1 * t1;
150 const T t3 = t2 * t1;
151 const T t4 = t2 * t2;
152 const T t5 = t3 * t2;
153 const T t6 = t3 * t3;
154 const T t7 = t4 * t3;
155 const T t8 = t4 * t4;
156 const T t9 = t5 * t4;
157 const T t10 = t5 * t5;
158 const T t11 = t6 * t5;
159 const T t12 = t6 * t6;
161 if constexpr (N == 0)
165 else if constexpr (N == 1)
169 else if constexpr (N == 2)
171 return T(2) * t2 - T(1);
173 else if constexpr (N == 3)
175 return T(4) * t3 - T(3) * t1;
177 else if constexpr (N == 4)
179 return T(8) * t4 - T(8) * t2 + T(1);
181 else if constexpr (N == 5)
183 return T(16) * t5 - T(20) * t3 + T(5) * t1;
185 else if constexpr (N == 6)
187 return T(32) * t6 - T(48) * t4 + T(18) * t2 - T(1);
189 else if constexpr (N == 7)
191 return T(64) * t7 - T(112) * t5 + T(56) * t3 - T(7) * t1;
193 else if constexpr (N == 8)
195 return T(128) * t8 - T(256) * t6 + T(160) * t4 - T(32) * t2 + T(1);
197 else if constexpr (N == 9)
199 return T(256) * t9 - T(576) * t7 + T(432) * t5 - T(120) * t3 + T(9) * t1;
201 else if constexpr (N == 10)
203 return T(512) * t10 - T(1280) * t8 + T(1120) * t6 - T(400) * t4 + T(50) * t2 -
206 else if constexpr (N == 11)
208 return T(1024) * t11 - T(2816) * t9 + T(2816) * t7 - T(1232) * t5 +
209 T(220) * t3 - T(11) * t1;
211 else if constexpr (N == 12)
213 return T(2048) * t12 - T(6144) * t10 + T(6912) * t8 - T(3584) * t6 +
214 T(840) * t4 - T(72) * t2 + T(1);
219 return cos(T(N) * atan2(ny, nx));
237 template <
unsigned int N,
typename T>
238 [[nodiscard]]
inline DEAL_II_ALWAYS_INLINE T
246 if constexpr (N <= 5)
250 const T t2 = t1 * t1;
251 const T t3 = t2 * t1;
252 const T t4 = t2 * t2;
253 const T t5 = t3 * t2;
254 const T t6 = t3 * t3;
255 const T t7 = t4 * t3;
256 const T t8 = t4 * t4;
257 const T t9 = t5 * t4;
258 const T t10 = t5 * t5;
259 const T t11 = t6 * t5;
261 if constexpr (N == 0)
265 else if constexpr (N == 1)
269 else if constexpr (N == 2)
271 return T(2) * s1 * t1;
273 else if constexpr (N == 3)
275 return s1 * (T(4) * t2 - T(1));
277 else if constexpr (N == 4)
279 return s1 * (T(8) * t3 - T(4) * t1);
281 else if constexpr (N == 5)
283 return s1 * (T(16) * t4 - T(12) * t2 + T(1));
285 else if constexpr (N == 6)
287 return s1 * (T(32) * t5 - T(32) * t3 + T(6) * t1);
289 else if constexpr (N == 7)
291 return s1 * (T(64) * t6 - T(80) * t4 + T(24) * t2 - T(1));
293 else if constexpr (N == 8)
295 return s1 * (T(128) * t7 - T(192) * t5 + T(80) * t3 - T(8) * t1);
297 else if constexpr (N == 9)
299 return s1 * (T(256) * t8 - T(448) * t6 + T(240) * t4 - T(40) * t2 + T(1));
301 else if constexpr (N == 10)
304 (T(512) * t9 - T(1024) * t7 + T(672) * t5 - T(160) * t3 + T(10) * t1);
306 else if constexpr (N == 11)
308 return s1 * (T(1024) * t10 - T(2304) * t8 + T(1792) * t6 - T(560) * t4 +
311 else if constexpr (N == 12)
313 return s1 * (T(2048) * t11 - T(5120) * t9 + T(4608) * t7 - T(1792) * t5 +
314 T(280) * t3 - T(12) * t1);
319 return sin(T(N) * atan2(ny, nx));
337 template <
unsigned int N,
typename T>
338 [[nodiscard]]
inline DEAL_II_ALWAYS_INLINE T
339 cos_psi(
const T &nx,
const T &ny,
const T &nz)
noexcept
347 if constexpr (N <= 5)
350 const T t2 = t1 * t1;
351 const T t3 = t2 * t1;
352 const T t4 = t2 * t2;
353 const T t5 = t3 * t2;
354 const T t6 = t3 * t3;
355 const T t7 = t4 * t3;
356 const T t8 = t4 * t4;
357 const T t9 = t5 * t4;
358 const T t10 = t5 * t5;
359 const T t11 = t6 * t5;
360 const T t12 = t6 * t6;
362 if constexpr (N == 0)
366 else if constexpr (N == 1)
370 else if constexpr (N == 2)
372 return T(2) * t2 - T(1);
374 else if constexpr (N == 3)
376 return T(4) * t3 - T(3) * t1;
378 else if constexpr (N == 4)
380 return T(8) * t4 - T(8) * t2 + T(1);
382 else if constexpr (N == 5)
384 return T(16) * t5 - T(20) * t3 + T(5) * t1;
386 else if constexpr (N == 6)
388 return T(32) * t6 - T(48) * t4 + T(18) * t2 - T(1);
390 else if constexpr (N == 7)
392 return T(64) * t7 - T(112) * t5 + T(56) * t3 - T(7) * t1;
394 else if constexpr (N == 8)
396 return T(128) * t8 - T(256) * t6 + T(160) * t4 - T(32) * t2 + T(1);
398 else if constexpr (N == 9)
400 return T(256) * t9 - T(576) * t7 + T(432) * t5 - T(120) * t3 + T(9) * t1;
402 else if constexpr (N == 10)
404 return T(512) * t10 - T(1280) * t8 + T(1120) * t6 - T(400) * t4 + T(50) * t2 -
407 else if constexpr (N == 11)
409 return T(1024) * t11 - T(2816) * t9 + T(2816) * t7 - T(1232) * t5 +
410 T(220) * t3 - T(11) * t1;
412 else if constexpr (N == 12)
414 return T(2048) * t12 - T(6144) * t10 + T(6912) * t8 - T(3584) * t6 +
415 T(840) * t4 - T(72) * t2 + T(1);
420 return cos(T(N) * atan2(sqrt(nx * nx + ny * ny), nz));
438 template <
unsigned int N,
typename T>
439 [[nodiscard]]
inline DEAL_II_ALWAYS_INLINE T
440 sin_psi(
const T &nx,
const T &ny,
const T &nz)
noexcept
448 if constexpr (N <= 5)
450 const T s1 = sqrt(nx * nx + ny * ny);
452 const T t2 = t1 * t1;
453 const T t3 = t2 * t1;
454 const T t4 = t2 * t2;
455 const T t5 = t3 * t2;
456 const T t6 = t3 * t3;
457 const T t7 = t4 * t3;
458 const T t8 = t4 * t4;
459 const T t9 = t5 * t4;
460 const T t10 = t5 * t5;
461 const T t11 = t6 * t5;
463 if constexpr (N == 0)
467 else if constexpr (N == 1)
471 else if constexpr (N == 2)
473 return T(2) * s1 * t1;
475 else if constexpr (N == 3)
477 return s1 * (T(4) * t2 - T(1));
479 else if constexpr (N == 4)
481 return s1 * (T(8) * t3 - T(4) * t1);
483 else if constexpr (N == 5)
485 return s1 * (T(16) * t4 - T(12) * t2 + T(1));
487 else if constexpr (N == 6)
489 return s1 * (T(32) * t5 - T(32) * t3 + T(6) * t1);
491 else if constexpr (N == 7)
493 return s1 * (T(64) * t6 - T(80) * t4 + T(24) * t2 - T(1));
495 else if constexpr (N == 8)
497 return s1 * (T(128) * t7 - T(192) * t5 + T(80) * t3 - T(8) * t1);
499 else if constexpr (N == 9)
501 return s1 * (T(256) * t8 - T(448) * t6 + T(240) * t4 - T(40) * t2 + T(1));
503 else if constexpr (N == 10)
506 (T(512) * t9 - T(1024) * t7 + T(672) * t5 - T(160) * t3 + T(10) * t1);
508 else if constexpr (N == 11)
510 return s1 * (T(1024) * t10 - T(2304) * t8 + T(1792) * t6 - T(560) * t4 +
513 else if constexpr (N == 12)
515 return s1 * (T(2048) * t11 - T(5120) * t9 + T(4608) * t7 - T(1792) * t5 +
516 T(280) * t3 - T(12) * t1);
521 return sin(T(N) * atan2(sqrt(nx * nx + ny * ny), nz));
529PRISMS_PF_END_NAMESPACE
Definition conditional_ostreams.cc:20
Definition crystal_symmetry.h:12
DEAL_II_ALWAYS_INLINE T sin_theta(const T &nx, const T &ny) noexcept
Compute sin(N * theta) where theta = arctan(ny/nx).
Definition crystal_symmetry.h:239
DEAL_II_ALWAYS_INLINE T cos_theta(const T &nx, const T &ny) noexcept
Compute cos(N * theta) where theta = arctan(ny/nx).
Definition crystal_symmetry.h:139
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 crystal_symmetry.h:440
DEAL_II_ALWAYS_INLINE T sin_arctan(const T &x) noexcept
Compute sin(N * arctan(x)).
Definition crystal_symmetry.h:83
DEAL_II_ALWAYS_INLINE T cos_arctan(const T &x) noexcept
Compute cos(N * arctan(x)).
Definition crystal_symmetry.h:27
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 crystal_symmetry.h:339
inline ::dealii::VectorizedArray< Number, width > atan2(const ::dealii::VectorizedArray< Number, width > &y, const ::dealii::VectorizedArray< Number, width > &x)
Definition vectorized_operations.h:43