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...
 
virtual ~RefRegionCylinder ()
 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 50 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 44 of file RefRegionCylinder.cpp.

50 : RefRegion(coordim, radius, coord1, coord2, numModes, numPoints)
51{
52}
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:47

◆ ~RefRegionCylinder()

Nektar::SpatialDomains::RefRegionCylinder::~RefRegionCylinder ( )
virtual

Destructor.

Definition at line 54 of file RefRegionCylinder.cpp.

55{
56}

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 65 of file RefRegionCylinder.cpp.

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