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

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

#include <RefRegionParallelogram.h>

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

Public Member Functions

 RefRegionParallelogram (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 ~RefRegionParallelogram ()
 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 RefRegionParallelogram.h.

Constructor & Destructor Documentation

◆ RefRegionParallelogram()

Nektar::SpatialDomains::RefRegionParallelogram::RefRegionParallelogram ( 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 RefRegionParallelogram.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:47

◆ ~RefRegionParallelogram()

Nektar::SpatialDomains::RefRegionParallelogram::~RefRegionParallelogram ( )
virtual

Destructor.

Definition at line 52 of file RefRegionParallelogram.cpp.

53{
54}

Member Function Documentation

◆ v_Contains()

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

Check if vertex is inside the surface region.

Check if vertex is inside the Parallelogram.

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 RefRegionParallelogram.cpp.

64{
65 // This is simplification for a two-dimenion domain of the algorithm in the
66 // RefRegionCylinder::v_Contains method.
67
68 const size_t dim = coords.size();
69 Array<OneD, NekDouble> e(dim, 0.0); // direction: rb - ra
70 Array<OneD, NekDouble> m(dim - 1, 0.0); // momentum: ra x rb
71 NekDouble d = 0.0; // distance
72
73 // Direction
74 e[0] = m_coord2[0] - m_coord1[0];
75 e[1] = m_coord2[1] - m_coord1[1];
76
77 // Cross product of vectors 'coord1'(ra) and 'coord2' (rb)
78 m[0] = m_coord1[0] * m_coord2[1] - m_coord1[1] * m_coord2[0];
79
80 // Distance of P (coords) to line AB (coord1coord2) is equal or less than R
81 // d = || e x (rp - ra) || / || e ||
82
83 // rA - rP
84 Array<OneD, NekDouble> rpa(dim, 0.0);
85 rpa[0] = coords[0] - m_coord1[0];
86 rpa[1] = coords[1] - m_coord1[1];
87
88 // || e ||
89 NekDouble e_mod = sqrt(e[0] * e[0] + e[1] * e[1]);
90
91 // || e x (rp - ra) ||
92 Array<OneD, NekDouble> exrpa(dim - 1, 0.0);
93 exrpa[0] = e[0] * rpa[1] - e[1] * rpa[0];
94
95 NekDouble exrpa_mod = sqrt(exrpa[0] * exrpa[0]);
96
97 d = exrpa_mod / e_mod;
98 if (d >= m_radius)
99 {
100 return false;
101 }
102
103 // Is P between the regions below?
104 // xa, xb plus the radius
105 // ya, yb plus the radius
106 Array<OneD, bool> insideFlag(dim, false);
107 for (int i = 0; i < dim; ++i)
108 {
109 if (m_coord1[i] < m_coord2[i])
110 {
111 if ((m_coord1[i] - m_radius < coords[i]) &&
112 (m_coord2[i] + m_radius > coords[i]))
113 {
114 insideFlag[i] = true;
115 }
116 }
117 else
118 {
119 if ((m_coord1[i] + m_radius > coords[i]) &&
120 (m_coord2[i] - m_radius < coords[i]))
121 {
122 insideFlag[i] = true;
123 }
124 }
125 }
126
127 if ((insideFlag[0] == true) && (insideFlag[1] == true))
128 {
129 return true;
130 }
131 else
132 {
133 return false;
134 }
135}
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 Nektar::UnitTests::d(), Nektar::SpatialDomains::RefRegion::m_coord1, Nektar::SpatialDomains::RefRegion::m_coord2, Nektar::SpatialDomains::RefRegion::m_radius, and tinysimd::sqrt().