Block-Structured AMR Software Framework
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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
12// For all implicit functions, >0: body; =0: boundary; <0: fluid
13
14namespace amrex::EB2 {
15
16/********************************************************************************
17 * *
18 * Represents one term in a general polynomial *
19 * *
20 ********************************************************************************/
22{
23public:
24
26 Real coef;
27
30};
31
32template <unsigned int N>
33class PolyIF
34 : public GPUable
35{
36public:
37
39 PolyIF (const GpuArray<PolyTerm,N> & a_polynomial, bool a_inside = true)
40 : m_polynomial(a_polynomial),
41 m_sign( a_inside ? 1.0_rt : -1.0_rt )
42 {}
43
45 Real operator() (AMREX_D_DECL(Real x, Real y, Real z)) const noexcept
46 {
47 Real retval = 0.0_rt;
48 for (auto const& term : m_polynomial) {
49 retval += term.coef * AMREX_D_TERM( std::pow(x, term.powers[0]),
50 * std::pow(y, term.powers[1]),
51 * std::pow(z, term.powers[2]));
52 }
53 return m_sign*retval;
54 }
55
56 inline Real operator() (const RealArray& p) const noexcept {
57 return this->operator()(AMREX_D_DECL(p[0],p[1],p[2]));
58 }
59
60protected:
62 Real m_sign;
63};
64
65
66class PolynomialIF // No GPU support
67{
68public:
69
71 PolynomialIF (const Vector<PolyTerm> & a_polynomial, bool a_inside = true)
72 : m_polynomial(a_polynomial),
73 m_inside(a_inside),
74 m_sign( a_inside ? 1.0_rt : -1.0_rt ),
75 m_size(int(m_polynomial.size()))
76 {}
77
78 ~PolynomialIF () = default;
79 PolynomialIF (const PolynomialIF& rhs) = default;
80 PolynomialIF (PolynomialIF&& rhs) = default;
81 PolynomialIF& operator= (const PolynomialIF& rhs) = delete;
83
84 [[nodiscard]] inline
85 Real operator() (AMREX_D_DECL(Real x, Real y, Real z)) const noexcept
86 {
87 Real retval = 0.0_rt;
88 for (auto const& term : m_polynomial) {
89 retval += term.coef * AMREX_D_TERM( std::pow(x, term.powers[0]),
90 * std::pow(y, term.powers[1]),
91 * std::pow(z, term.powers[2]));
92 }
93 return m_sign*retval;
94 }
95
96 [[nodiscard]] inline Real operator() (const RealArray& p) const noexcept {
97 return this->operator()(AMREX_D_DECL(p[0],p[1],p[2]));
98 }
99
100protected:
103 Real m_sign;
105};
106
107}
108
109#endif
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
#define AMREX_D_TERM(a, b, c)
Definition AMReX_SPACE.H:129
Definition AMReX_EB2_IF_Polynomial.H:35
Real m_sign
Definition AMReX_EB2_IF_Polynomial.H:62
GpuArray< PolyTerm, N > m_polynomial
Definition AMReX_EB2_IF_Polynomial.H:61
AMREX_GPU_HOST_DEVICE Real operator()(AMREX_D_DECL(Real x, Real y, Real z)) const noexcept
Definition AMReX_EB2_IF_Polynomial.H:45
PolyIF(const GpuArray< PolyTerm, N > &a_polynomial, bool a_inside=true)
inside: is the fluid inside the ellipsoid?
Definition AMReX_EB2_IF_Polynomial.H:39
Definition AMReX_EB2_IF_Polynomial.H:22
Real coef
Coefficient of this polynomial term.
Definition AMReX_EB2_IF_Polynomial.H:26
IntVect powers
Powers of this polynomial term.
Definition AMReX_EB2_IF_Polynomial.H:29
Definition AMReX_EB2_IF_Polynomial.H:67
PolynomialIF(PolynomialIF &&rhs)=default
int m_size
Definition AMReX_EB2_IF_Polynomial.H:104
PolynomialIF(const PolynomialIF &rhs)=default
Real operator()(AMREX_D_DECL(Real x, Real y, Real z)) const noexcept
Definition AMReX_EB2_IF_Polynomial.H:85
Vector< PolyTerm > m_polynomial
Definition AMReX_EB2_IF_Polynomial.H:101
Real m_sign
Definition AMReX_EB2_IF_Polynomial.H:103
bool m_inside
Definition AMReX_EB2_IF_Polynomial.H:102
PolynomialIF(const Vector< PolyTerm > &a_polynomial, bool a_inside=true)
inside: is the fluid inside the ellipsoid?
Definition AMReX_EB2_IF_Polynomial.H:71
PolynomialIF & operator=(const PolynomialIF &rhs)=delete
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:27
Definition AMReX_FabArrayBase.H:32
Array< Real, AMREX_SPACEDIM > RealArray
Definition AMReX_Array.H:26
const int[]
Definition AMReX_BLProfiler.cpp:1664
Definition AMReX_EB2_IF_Base.H:11
Definition AMReX_Array.H:34