Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_EB2_IF_Polynomial.H
Go to the documentation of this file.
1#ifndef AMREX_EB2_IF_POLYNOMIAL_H_
2#define AMREX_EB2_IF_POLYNOMIAL_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_EB2_IF_Base.H>
6#include <AMReX_Array.H>
7#include <AMReX_Vector.H>
8#include <AMReX_IntVect.H>
9#include <memory>
10#include <cmath>
11
18// For all implicit functions, >0: body; =0: boundary; <0: fluid
19
20namespace amrex::EB2 {
21
22/********************************************************************************
23 * *
24 * Represents one term in a general polynomial *
25 * *
26 ********************************************************************************/
29{
30public:
31
34
37};
38
39template <unsigned int N>
41class PolyIF
42 : public GPUable
43{
44public:
45
47 PolyIF (const GpuArray<PolyTerm,N> & a_polynomial, bool a_inside = true)
48 : m_polynomial(a_polynomial),
49 m_sign( a_inside ? 1.0_rt : -1.0_rt )
50 {}
51
55 {
56 Real retval = 0.0_rt;
57 for (auto const& term : m_polynomial) {
58 retval += term.coef * AMREX_D_TERM( std::pow(x, term.powers[0]),
59 * std::pow(y, term.powers[1]),
60 * std::pow(z, term.powers[2]));
61 }
62 return m_sign*retval;
63 }
64
66 AMREX_FORCE_INLINE Real operator() (const RealArray& p) const noexcept {
67 return this->operator()(AMREX_D_DECL(p[0],p[1],p[2]));
68 }
69
70protected:
73};
74
75
77class PolynomialIF // No GPU support
78{
79public:
80
82 PolynomialIF (const Vector<PolyTerm> & a_polynomial, bool a_inside = true)
83 : m_polynomial(a_polynomial),
84 m_inside(a_inside),
85 m_sign( a_inside ? 1.0_rt : -1.0_rt ),
86 m_size(int(m_polynomial.size()))
87 {}
88
89 ~PolynomialIF () = default;
90 PolynomialIF (const PolynomialIF& rhs) = default;
91 PolynomialIF (PolynomialIF&& rhs) = default;
92 PolynomialIF& operator= (const PolynomialIF& rhs) = delete;
94
95 [[nodiscard]] AMREX_FORCE_INLINE
97 {
98 Real retval = 0.0_rt;
99 for (auto const& term : m_polynomial) {
100 retval += term.coef * AMREX_D_TERM( std::pow(x, term.powers[0]),
101 * std::pow(y, term.powers[1]),
102 * std::pow(z, term.powers[2]));
103 }
104 return m_sign*retval;
105 }
106
108 [[nodiscard]] AMREX_FORCE_INLINE Real operator() (const RealArray& p) const noexcept {
109 return this->operator()(AMREX_D_DECL(p[0],p[1],p[2]));
110 }
111
112protected:
117};
118
119}
120
121#endif
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
#define AMREX_D_TERM(a, b, c)
Definition AMReX_SPACE.H:172
#define AMREX_D_DECL(a, b, c)
Definition AMReX_SPACE.H:171
GPU-ready polynomial implicit function with a fixed number of terms.
Definition AMReX_EB2_IF_Polynomial.H:43
Real m_sign
Definition AMReX_EB2_IF_Polynomial.H:72
GpuArray< PolyTerm, N > m_polynomial
Definition AMReX_EB2_IF_Polynomial.H:71
PolyIF(const GpuArray< PolyTerm, N > &a_polynomial, bool a_inside=true)
Store the polynomial terms and orientation (inside/outside).
Definition AMReX_EB2_IF_Polynomial.H:47
__host__ __device__ Real operator()(Real x, Real y, Real z) const noexcept
Evaluate the polynomial at explicit coordinates.
Definition AMReX_EB2_IF_Polynomial.H:54
Represents one monomial in a polynomial implicit function.
Definition AMReX_EB2_IF_Polynomial.H:29
Real coef
Coefficient of this polynomial term.
Definition AMReX_EB2_IF_Polynomial.H:33
IntVect powers
Powers of this polynomial term.
Definition AMReX_EB2_IF_Polynomial.H:36
Host-only dynamically-sized polynomial implicit function.
Definition AMReX_EB2_IF_Polynomial.H:78
PolynomialIF(PolynomialIF &&rhs)=default
int m_size
Definition AMReX_EB2_IF_Polynomial.H:116
PolynomialIF(const PolynomialIF &rhs)=default
Vector< PolyTerm > m_polynomial
Definition AMReX_EB2_IF_Polynomial.H:113
Real m_sign
Definition AMReX_EB2_IF_Polynomial.H:115
bool m_inside
Definition AMReX_EB2_IF_Polynomial.H:114
PolynomialIF(const Vector< PolyTerm > &a_polynomial, bool a_inside=true)
Store the term vector and orientation (inside/outside).
Definition AMReX_EB2_IF_Polynomial.H:82
PolynomialIF & operator=(const PolynomialIF &rhs)=delete
Real operator()(Real x, Real y, Real z) const noexcept
Definition AMReX_EB2_IF_Polynomial.H:96
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
Definition AMReX_FabArrayBase.H:33
const int[]
Definition AMReX_BLProfiler.cpp:1664
Array< Real, 3 > RealArray
Definition AMReX_Array.H:28
Marker base that denotes an implicit function callable on device kernels.
Definition AMReX_EB2_IF_Base.H:19
Fixed-size array that can be used on GPU.
Definition AMReX_Array.H:43