Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_EB2_IF_Rotation.H
Go to the documentation of this file.
1#ifndef AMREX_EB2_IF_ROTATION_H_
2#define AMREX_EB2_IF_ROTATION_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_EB2_IF_Base.H>
6#include <AMReX_Array.H>
7#include <type_traits>
8#include <cmath>
9
16// For all implicit functions, >0: body; =0: boundary; <0: fluid
17
18namespace amrex::EB2 {
19
20template <class F>
23{
24public:
25
27 RotationIF (F a_f, Real angle, int dir)
28 : m_f(std::move(a_f)),
29 m_cos_angle(std::cos(angle)),
30 m_sin_angle(std::sin(angle)),
31 m_dir(dir)
32 {}
33
34// Note that angle is measured in radians
35#if (AMREX_SPACEDIM==2)
36 [[nodiscard]] AMREX_FORCE_INLINE Real operator() (const RealArray& p) const noexcept
37 {
38 Real x = p[0]*m_cos_angle + p[1]*m_sin_angle;
39 Real y = -p[0]*m_sin_angle + p[1]*m_cos_angle;
40 return m_f({x, y});
41 }
42
43 template <class U=F, std::enable_if_t<IsGPUable<U>::value,int> = 0>
45 Real operator() (Real x, Real y) const noexcept
46 {
47 return m_f( x*m_cos_angle + y*m_sin_angle,
49 }
50#endif
51
52#if (AMREX_SPACEDIM==3)
53 [[nodiscard]] AMREX_FORCE_INLINE Real operator() (const RealArray& p) const noexcept
54 {
55 switch(m_dir) {
56 case(0):
57 {
58 Real y = p[1]*m_cos_angle + p[2]*m_sin_angle;
59 Real z = -p[1]*m_sin_angle + p[2]*m_cos_angle;
60 return m_f({p[0], y, z});
61 }
62 case(1):
63 {
64 Real x = p[0]*m_cos_angle - p[2]*m_sin_angle;
65 Real z = p[0]*m_sin_angle + p[2]*m_cos_angle;
66 return m_f({x, p[1], z});
67 }
68 default:
69 {
70 Real x = p[0]*m_cos_angle + p[1]*m_sin_angle;
71 Real y = -p[0]*m_sin_angle + p[1]*m_cos_angle;
72 return m_f({x, y, p[2]});
73 }
74 }
75 }
76
77 template <class U=F, std::enable_if_t<IsGPUable<U>::value,int> = 0>
79 Real operator() (Real x, Real y, Real z) const noexcept
80 {
81 switch(m_dir) {
82 case(0):
83 {
84 return m_f(x,
87 }
88 case(1):
89 {
90 return m_f(x*m_cos_angle - z*m_sin_angle,
91 y,
93 }
94 default:
95 {
96 return m_f( x*m_cos_angle + y*m_sin_angle,
98 z);
99 }
100 }
101 }
102#endif
103
104protected:
105
109 int m_dir;
110};
111
112template <class F>
113struct IsGPUable<RotationIF<F>, std::enable_if_t<IsGPUable<F>::value>>
114 : std::true_type {};
115
116template <class F>
118rotate (F&&f, const Real angle, const int dir)
119{
120 return RotationIF<std::decay_t<F>>(std::forward<F>(f),angle, dir);
121}
122
123}
124
125#endif
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
Rotate an implicit surface around one of the coordinate axes.
Definition AMReX_EB2_IF_Rotation.H:23
Real operator()(const RealArray &p) const noexcept
Definition AMReX_EB2_IF_Rotation.H:53
int m_dir
Definition AMReX_EB2_IF_Rotation.H:109
Real m_sin_angle
Definition AMReX_EB2_IF_Rotation.H:108
Real m_cos_angle
Definition AMReX_EB2_IF_Rotation.H:107
F m_f
Definition AMReX_EB2_IF_Rotation.H:106
RotationIF(F a_f, Real angle, int dir)
Store the child implicit function and rotation parameters.
Definition AMReX_EB2_IF_Rotation.H:27
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
Definition AMReX_FabArrayBase.H:33
constexpr RotationIF< std::decay_t< F > > rotate(F &&f, const Real angle, const int dir)
Definition AMReX_EB2_IF_Rotation.H:118
Array< Real, 3 > RealArray
Definition AMReX_Array.H:28
Type trait that reports whether a functor derives from GPUable.
Definition AMReX_EB2_IF_Base.H:24