Nektar++
Public Member Functions | Protected Member Functions | List of all members
Nektar::SpatialDomains::RefRegionCylinder Class Reference

Derived class for the refinement surface region. More...

#include <RefRegionCylinder.h>

Inheritance diagram for Nektar::SpatialDomains::RefRegionCylinder:
[legend]

Public Member Functions

 RefRegionCylinder (const unsigned int coordim, NekDouble radius, std::vector< NekDouble > coord1, std::vector< NekDouble > coord2, std::vector< unsigned int > numModes, std::vector< unsigned int > numPoints)
 Constructor. More...
 
 ~RefRegionCylinder () override
 Destructor. More...
 
- Public Member Functions inherited from Nektar::SpatialDomains::RefRegion
 RefRegion (const unsigned int coordim, NekDouble m_radius, std::vector< NekDouble > coord1, std::vector< NekDouble > coord2, std::vector< unsigned int > numModes, std::vector< unsigned int > numPoints)
 Constructor. More...
 
virtual ~RefRegion ()
 Destructor. More...
 
virtual bool v_Contains (const Array< OneD, NekDouble > &coords)=0
 Pure virtual fuction. More...
 
std::vector< unsigned int > GetNumModes ()
 Get the number of modes to update expansion. More...
 
std::vector< unsigned int > GetNumPoints ()
 Get the number of quadrature points to update expansion. More...
 

Protected Member Functions

bool v_Contains (const Array< OneD, NekDouble > &coords) override
 Check if vertex is inside the surface region. More...
 

Additional Inherited Members

- Protected Attributes inherited from Nektar::SpatialDomains::RefRegion
unsigned int m_coordim
 Dimension of the coordinate (space dimension) More...
 
NekDouble m_radius
 Radius of the surface region. More...
 
std::vector< NekDoublem_coord1
 Coordinate 1. More...
 
std::vector< NekDoublem_coord2
 Coordinate 2. More...
 
std::vector< unsigned int > m_numModes
 Number of modes. More...
 
std::vector< unsigned int > m_numPoints
 Number of quadrature points. More...
 

Detailed Description

Derived class for the refinement surface region.

Definition at line 48 of file RefRegionCylinder.h.

Constructor & Destructor Documentation

◆ RefRegionCylinder()

Nektar::SpatialDomains::RefRegionCylinder::RefRegionCylinder ( const unsigned int  coordim,
NekDouble  radius,
std::vector< NekDouble coord1,
std::vector< NekDouble coord2,
std::vector< unsigned int >  numModes,
std::vector< unsigned int >  numPoints 
)

Constructor.

Definition at line 42 of file RefRegionCylinder.cpp.

48 : RefRegion(coordim, radius, coord1, coord2, numModes, numPoints)
49{
50}
RefRegion(const unsigned int coordim, NekDouble m_radius, std::vector< NekDouble > coord1, std::vector< NekDouble > coord2, std::vector< unsigned int > numModes, std::vector< unsigned int > numPoints)
Constructor.
Definition: RefRegion.cpp:45

◆ ~RefRegionCylinder()

Nektar::SpatialDomains::RefRegionCylinder::~RefRegionCylinder ( )
override

Destructor.

Definition at line 52 of file RefRegionCylinder.cpp.

53{
54}

Member Function Documentation

◆ v_Contains()

bool Nektar::SpatialDomains::RefRegionCylinder::v_Contains ( const Array< OneD, NekDouble > &  coords)
overrideprotectedvirtual

Check if vertex is inside the surface region.

Check if vertex is inside the cylinder.

Parameters
coordscoordinates of the vertex
Returns
true or false depending on if the vertex is inside or not of the surface defined by the user.

Implements Nektar::SpatialDomains::RefRegion.

Definition at line 63 of file RefRegionCylinder.cpp.

64{
65 const size_t dim = coords.size();
66 Array<OneD, NekDouble> e(dim, 0.0); // direction: rb - ra
67 Array<OneD, NekDouble> m(dim, 0.0); // momentum: ra x rb
68 NekDouble d = 0.0; // distance
69
70 // Direction
71 e[0] = m_coord2[0] - m_coord1[0];
72 e[1] = m_coord2[1] - m_coord1[1];
73 e[2] = m_coord2[2] - m_coord1[2];
74
75 // Cross product of vectors 'coord1' and 'coord2'
76 m[0] = m_coord1[1] * m_coord2[2] - m_coord1[2] * m_coord2[1];
77 m[1] = m_coord1[2] * m_coord2[0] - m_coord1[0] * m_coord2[2];
78 m[2] = m_coord1[0] * m_coord2[1] - m_coord1[1] * m_coord2[0];
79
80 // 1. Distance of P (coords) to line AB (coord1coord2) is equal or less than
81 // R
82 // d = || e x (rp - ra) || / || e ||
83
84 // rA - rP
85 Array<OneD, NekDouble> rpa(dim, 0.0);
86 rpa[0] = coords[0] - m_coord1[0];
87 rpa[1] = coords[1] - m_coord1[1];
88 rpa[2] = coords[2] - m_coord1[2];
89
90 // || e ||
91 NekDouble e_mod = sqrt(e[0] * e[0] + e[1] * e[1] + e[2] * e[2]);
92
93 // || e x (rp - ra) ||
94 Array<OneD, NekDouble> exrpa(dim, 0.0);
95 exrpa[0] = e[1] * rpa[2] - e[2] * rpa[1];
96 exrpa[1] = e[2] * rpa[0] - e[0] * rpa[2];
97 exrpa[2] = e[0] * rpa[1] - e[1] * rpa[0];
98
99 NekDouble exrpa_mod =
100 sqrt(exrpa[0] * exrpa[0] + exrpa[1] * exrpa[1] + exrpa[2] * exrpa[2]);
101
102 d = exrpa_mod / e_mod;
103 if (d >= m_radius)
104 {
105 return false;
106 }
107
108 // 2. Closest point Q on line AB to P
109 // rq = rp + (e x (m + e x rp)) / ||e||^{2}
110
111 // (m + e x rp)
112 Array<OneD, NekDouble> mpexrp(dim, 0.0);
113 mpexrp[0] = m[0] + e[1] * coords[2] - e[2] * coords[1];
114 mpexrp[1] = m[1] + e[2] * coords[0] - e[0] * coords[2];
115 mpexrp[2] = m[2] + e[0] * coords[1] - e[1] * coords[0];
116
117 // e x (m + e x rp) = numerator
118 Array<OneD, NekDouble> numerator(dim, 0.0);
119 numerator[0] = e[1] * mpexrp[2] - e[2] * mpexrp[1];
120 numerator[1] = e[2] * mpexrp[0] - e[0] * mpexrp[2];
121 numerator[2] = e[0] * mpexrp[1] - e[1] * mpexrp[0];
122
123 // rq
124 Array<OneD, NekDouble> rq(dim, 0.0);
125 rq[0] = coords[0] + (numerator[0] / pow(e_mod, 2));
126 rq[1] = coords[1] + (numerator[1] / pow(e_mod, 2));
127 rq[2] = coords[2] + (numerator[2] / pow(e_mod, 2));
128
129 // 3. The baricentric coordinates of Q(wa,wb) such that rq = wa*ra+wb*rb
130 // wa = ||rq x rb||/||m||, wb = ||rq x ra||/||m||
131 NekDouble wa = 0.0;
132 NekDouble wb = 0.0;
133
134 // ||m||
135 NekDouble m_mod = sqrt(m[0] * m[0] + m[1] * m[1] + m[2] * m[2]);
136 // m_mod > 0: condition
137 ASSERTL0(m_mod, "The cylinder axis must not go through the origin");
138
139 // ||rq x rb||
140 Array<OneD, NekDouble> rqxrb(dim, 0.0);
141 rqxrb[0] = rq[1] * m_coord2[2] - rq[2] * m_coord2[1];
142 rqxrb[1] = rq[2] * m_coord2[0] - rq[0] * m_coord2[2];
143 rqxrb[2] = rq[0] * m_coord2[1] - rq[1] * m_coord2[0];
144 NekDouble rqxrb_mod =
145 sqrt(rqxrb[0] * rqxrb[0] + rqxrb[1] * rqxrb[1] + rqxrb[2] * rqxrb[2]);
146
147 // ||rq x ra||
148 Array<OneD, NekDouble> rqxra(dim, 0.0);
149 rqxra[0] = rq[1] * m_coord1[2] - rq[2] * m_coord1[1];
150 rqxra[1] = rq[2] * m_coord1[0] - rq[0] * m_coord1[2];
151 rqxra[2] = rq[0] * m_coord1[1] - rq[1] * m_coord1[0];
152 NekDouble rqxra_mod =
153 sqrt(rqxra[0] * rqxra[0] + rqxra[1] * rqxra[1] + rqxra[2] * rqxra[2]);
154
155 // wa
156 wa = rqxrb_mod / m_mod;
157 // wb
158 wb = rqxra_mod / m_mod;
159
160 // 4. Check that point Q between A and B by making sure the baricentric
161 // coordinates are between 0 and 1.
162 if ((wa >= 0) && (wa <= 1) && (wb >= 0) && (wb <= 1))
163 {
164 return true;
165 }
166 else
167 {
168 return false;
169 }
170}
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:208
std::vector< NekDouble > m_coord2
Coordinate 2.
Definition: RefRegion.h:87
std::vector< NekDouble > m_coord1
Coordinate 1.
Definition: RefRegion.h:85
NekDouble m_radius
Radius of the surface region.
Definition: RefRegion.h:83
std::vector< double > d(NPUPPER *NPUPPER)
double NekDouble
scalarT< T > sqrt(scalarT< T > in)
Definition: scalar.hpp:294

References ASSERTL0, Nektar::UnitTests::d(), Nektar::SpatialDomains::RefRegion::m_coord1, Nektar::SpatialDomains::RefRegion::m_coord2, Nektar::SpatialDomains::RefRegion::m_radius, and tinysimd::sqrt().