Nektar++
Classes | Public Member Functions | Protected Attributes | Private Types | Private Member Functions | Private Attributes | Static Private Attributes | List of all members
Nektar::LibUtilities::Interpolator Class Reference

A class that contains algorithms for interpolation between pts fields, expansions and different meshes. More...

#include <Interpolator.h>

Inheritance diagram for Nektar::LibUtilities::Interpolator:
[legend]

Classes

class  PtsPoint
 

Public Member Functions

 Interpolator (InterpMethod method=eNoMethod, short int coordId=-1, NekDouble filtWidth=0.0, int maxPts=1000)
 Constructor of the Interpolator class. More...
 
void CalcWeights (const LibUtilities::PtsFieldSharedPtr ptsInField, LibUtilities::PtsFieldSharedPtr &ptsOutField, bool reuseTree=false)
 Compute interpolation weights without doing any interpolation. More...
 
void Interpolate (const LibUtilities::PtsFieldSharedPtr ptsInField, LibUtilities::PtsFieldSharedPtr &ptsOutField)
 Interpolate from a pts field to a pts field. More...
 
int GetDim () const
 returns the dimension of the Interpolator. Should be higher than the dimensions of the interpolated fields More...
 
NekDouble GetFiltWidth () const
 Returns the filter width. More...
 
int GetCoordId () const
 Returns the coordinate id along which the interpolation should be performed. More...
 
InterpMethod GetInterpMethod () const
 Returns the interpolation method used by this interpolator. More...
 
LibUtilities::PtsFieldSharedPtr GetInField () const
 Returns the input field. More...
 
LibUtilities::PtsFieldSharedPtr GetOutField () const
 Returns the output field. More...
 
void PrintStatistics ()
 Returns if the weights have already been computed. More...
 
template<typename FuncPointerT , typename ObjectPointerT >
void SetProgressCallback (FuncPointerT func, ObjectPointerT obj)
 sets a callback funtion which gets called every time the interpolation progresses More...
 

Protected Attributes

LibUtilities::PtsFieldSharedPtr m_ptsInField
 input field More...
 
LibUtilities::PtsFieldSharedPtr m_ptsOutField
 output field More...
 
std::function< void(const int position, const int goal)> m_progressCallback
 

Private Types

typedef boost::geometry::model::point< NekDouble, m_dim, boost::geometry::cs::cartesian > BPoint
 
typedef std::pair< BPoint, unsigned int > PtsPointPair
 
typedef boost::geometry::index::rtree< PtsPointPair, boost::geometry::index::rstar< 16 > > PtsRtree
 

Private Member Functions

void CalcW_Gauss (const PtsPoint &searchPt, const NekDouble sigma, const int maxPts=250)
 Computes interpolation weights using gaussian interpolation. More...
 
void CalcW_Linear (const PtsPoint &searchPt, int coordId)
 Computes interpolation weights using linear interpolation. More...
 
void CalcW_NNeighbour (const PtsPoint &searchPt)
 Computes interpolation weights using nearest neighbour interpolation. More...
 
void CalcW_Shepard (const PtsPoint &searchPt, int numPts)
 Computes interpolation weights using linear interpolation. More...
 
void CalcW_Quadratic (const PtsPoint &searchPt, int coordId)
 Computes interpolation weights using quadratic interpolation. More...
 
void SetupTree ()
 
void FindNeighbours (const PtsPoint &searchPt, std::vector< PtsPoint > &neighbourPts, const NekDouble dist, const unsigned int maxPts=1)
 Finds the nearest neighbours of a point. More...
 
void FindNNeighbours (const PtsPoint &searchPt, std::vector< PtsPoint > &neighbourPts, const unsigned int numPts=1)
 Finds the nearest neighbours of a point. More...
 

Private Attributes

InterpMethod m_method
 Interpolation Method. More...
 
std::shared_ptr< PtsRtreem_rtree
 A tree structure to speed up the neighbour search. Note that we fill it with an iterator, so instead of rstar, the packing algorithm is used. More...
 
Array< TwoD, NekDoublem_weights
 Interpolation weights for each neighbour. Structure: m_weights[physPtIdx][neighbourIdx]. More...
 
Array< TwoD, unsigned int > m_neighInds
 Indices of the relevant neighbours for each physical point. Structure: m_neighInds[ptIdx][neighbourIdx]. More...
 
NekDouble m_filtWidth
 Filter width used for some interpolation algorithms. More...
 
int m_maxPts
 Max number of interpolation points. More...
 
short int m_coordId
 coordinate id along which the interpolation should be performed More...
 

Static Private Attributes

static const int m_dim = 3
 dimension of this interpolator. Hardcoded to 3 More...
 

Detailed Description

A class that contains algorithms for interpolation between pts fields, expansions and different meshes.

Definition at line 73 of file LibUtilities/BasicUtils/Interpolator.h.

Member Typedef Documentation

◆ BPoint

typedef boost::geometry::model::point<NekDouble, m_dim, boost::geometry::cs::cartesian> Nektar::LibUtilities::Interpolator::BPoint
private

Definition at line 174 of file LibUtilities/BasicUtils/Interpolator.h.

◆ PtsPointPair

typedef std::pair<BPoint, unsigned int> Nektar::LibUtilities::Interpolator::PtsPointPair
private

Definition at line 175 of file LibUtilities/BasicUtils/Interpolator.h.

◆ PtsRtree

typedef boost::geometry::index::rtree<PtsPointPair, boost::geometry::index::rstar<16> > Nektar::LibUtilities::Interpolator::PtsRtree
private

Definition at line 178 of file LibUtilities/BasicUtils/Interpolator.h.

Constructor & Destructor Documentation

◆ Interpolator()

Nektar::LibUtilities::Interpolator::Interpolator ( InterpMethod  method = eNoMethod,
short int  coordId = -1,
NekDouble  filtWidth = 0.0,
int  maxPts = 1000 
)
inline

Constructor of the Interpolator class.

Parameters
methodinterpolation method, defaults to a sensible value if not set
coordIdcoordinate id along which the interpolation should be performed
filtWidthfilter width, required by some algorithms such as eGauss
maxPtslimit number of considered points

if method is not specified, the best algorithm is chosen automatically.

If coordId is not specified, a full 1D/2D/3D interpolation is performed without collapsing any coordinate.

filtWidth must be specified for the eGauss algorithm only.

Definition at line 94 of file LibUtilities/BasicUtils/Interpolator.h.

96 : m_method(method), m_filtWidth(filtWidth), m_maxPts(maxPts),
97 m_coordId(coordId)
98 {
99 }
int m_maxPts
Max number of interpolation points.
NekDouble m_filtWidth
Filter width used for some interpolation algorithms.
short int m_coordId
coordinate id along which the interpolation should be performed

Member Function Documentation

◆ CalcW_Gauss()

void Nektar::LibUtilities::Interpolator::CalcW_Gauss ( const PtsPoint searchPt,
const NekDouble  sigma,
const int  maxPts = 250 
)
private

Computes interpolation weights using gaussian interpolation.

Parameters
searchPtpoint for which the weights are computed
sigmastandard deviation of the gauss function

Performs an interpolation using gauss weighting. Ideal for filtering fields. The filter width should be half the FWHM (= 1.1774 sigma) and must be set in the constructor of the Interpolator class.

Definition at line 352 of file LibUtilities/BasicUtils/Interpolator.cpp.

354{
355 // find nearest neighbours
356 vector<PtsPoint> neighbourPts;
357 FindNeighbours(searchPt, neighbourPts, 4 * sigma, maxPts);
358 size_t numPts = neighbourPts.size();
359
360 // handle the cases that there was no or just one point within 4 * sigma
361 if (numPts == 0)
362 {
363 return;
364 }
365 if (numPts == 1)
366 {
367 m_neighInds[searchPt.idx][0] = neighbourPts.front().idx;
368 m_weights[searchPt.idx][0] = 1.0;
369
370 return;
371 }
372
373 NekDouble sigmaNew = 0.25 * neighbourPts.back().dist;
374
375 for (size_t i = 0; i < numPts; i++)
376 {
377 m_neighInds[searchPt.idx][i] = neighbourPts.at(i).idx;
378 }
379
380 NekDouble wSum = 0.0;
381 NekDouble ts2 = 2.0 * sigmaNew * sigmaNew;
382 for (size_t i = 0; i < numPts; ++i)
383 {
384 m_weights[searchPt.idx][i] =
385 exp(-1.0 * neighbourPts[i].dist * neighbourPts[i].dist / ts2);
386 wSum += m_weights[searchPt.idx][i];
387 }
388
389 for (size_t i = 0; i < numPts; ++i)
390 {
391 m_weights[searchPt.idx][i] = m_weights[searchPt.idx][i] / wSum;
392 }
393}
Array< TwoD, NekDouble > m_weights
Interpolation weights for each neighbour. Structure: m_weights[physPtIdx][neighbourIdx].
Array< TwoD, unsigned int > m_neighInds
Indices of the relevant neighbours for each physical point. Structure: m_neighInds[ptIdx][neighbourId...
void FindNeighbours(const PtsPoint &searchPt, std::vector< PtsPoint > &neighbourPts, const NekDouble dist, const unsigned int maxPts=1)
Finds the nearest neighbours of a point.
double NekDouble

References FindNeighbours(), Nektar::LibUtilities::Interpolator::PtsPoint::idx, m_neighInds, and m_weights.

Referenced by CalcWeights().

◆ CalcW_Linear()

void Nektar::LibUtilities::Interpolator::CalcW_Linear ( const PtsPoint searchPt,
int  m_coordId 
)
private

Computes interpolation weights using linear interpolation.

Parameters
searchPtpoint for which the weights are computed
m_coordIdcoordinate id along which the interpolation should be performed

Currently, only implemented for 1D

Definition at line 404 of file LibUtilities/BasicUtils/Interpolator.cpp.

405{
406 int npts = m_ptsInField->GetNpoints();
407 int i;
408
409 NekDouble coord = searchPt.coords[m_coordId];
410
411 for (i = 0; i < npts - 1; ++i)
412 {
413 if ((m_ptsInField->GetPointVal(0, i) <=
414 (coord + NekConstants::kNekZeroTol)) &&
415 (coord <=
416 (m_ptsInField->GetPointVal(0, i + 1) + NekConstants::kNekZeroTol)))
417 {
418 NekDouble pdiff = m_ptsInField->GetPointVal(0, i + 1) -
419 m_ptsInField->GetPointVal(0, i);
420
421 m_neighInds[searchPt.idx][0] = i;
422 m_neighInds[searchPt.idx][1] = i + 1;
423
424 m_weights[searchPt.idx][0] =
425 (m_ptsInField->GetPointVal(0, i + 1) - coord) / pdiff;
426 m_weights[searchPt.idx][1] =
427 (coord - m_ptsInField->GetPointVal(0, i)) / pdiff;
428
429 break;
430 }
431 }
432 ASSERTL0(i != npts - 1, "Failed to find coordinate " +
433 boost::lexical_cast<string>(coord) +
434 " within provided input points");
435}
#define ASSERTL0(condition, msg)
Definition: ErrorUtil.hpp:215
LibUtilities::PtsFieldSharedPtr m_ptsInField
input field
static const NekDouble kNekZeroTol

References ASSERTL0, Nektar::LibUtilities::Interpolator::PtsPoint::coords, Nektar::LibUtilities::Interpolator::PtsPoint::idx, Nektar::NekConstants::kNekZeroTol, m_coordId, m_neighInds, m_ptsInField, and m_weights.

Referenced by CalcWeights().

◆ CalcW_NNeighbour()

void Nektar::LibUtilities::Interpolator::CalcW_NNeighbour ( const PtsPoint searchPt)
private

Computes interpolation weights using nearest neighbour interpolation.

Parameters
searchPtpoint for which the weights are computed
m_coordIdcoordinate id along which the interpolation should be performed

Definition at line 445 of file LibUtilities/BasicUtils/Interpolator.cpp.

446{
447 // find nearest neighbours
448 vector<PtsPoint> neighbourPts;
449 // TODO: we currently dont handle the case when there are more than one
450 // most distant points (of same distance)
451 FindNNeighbours(searchPt, neighbourPts, 1);
452
453 m_neighInds[searchPt.idx][0] = neighbourPts[0].idx;
454 m_weights[searchPt.idx][0] = 1.0;
455}
void FindNNeighbours(const PtsPoint &searchPt, std::vector< PtsPoint > &neighbourPts, const unsigned int numPts=1)
Finds the nearest neighbours of a point.

References FindNNeighbours(), Nektar::LibUtilities::Interpolator::PtsPoint::idx, m_neighInds, and m_weights.

Referenced by CalcWeights().

◆ CalcW_Quadratic()

void Nektar::LibUtilities::Interpolator::CalcW_Quadratic ( const PtsPoint searchPt,
int  m_coordId 
)
private

Computes interpolation weights using quadratic interpolation.

Parameters
searchPtpoint for which the weights are computed
m_coordIdcoordinate id along which the interpolation should be performed

Currently, only implemented for 1D. Falls back to linear interpolation if only 2 values are available.

Definition at line 518 of file LibUtilities/BasicUtils/Interpolator.cpp.

519{
520 int npts = m_ptsInField->GetNpoints();
521 int i;
522
523 NekDouble coord = searchPt.coords[m_coordId];
524
525 for (i = 0; i < npts - 1; ++i)
526 {
527 if ((m_ptsInField->GetPointVal(0, i) <=
528 (coord + NekConstants::kNekZeroTol)) &&
529 (coord <=
530 (m_ptsInField->GetPointVal(0, i + 1) + NekConstants::kNekZeroTol)))
531 {
532 NekDouble pdiff = m_ptsInField->GetPointVal(0, i + 1) -
533 m_ptsInField->GetPointVal(0, i);
534 NekDouble h1, h2, h3;
535
536 if (i < npts - 2)
537 {
538 // forwards stencil
539 NekDouble pdiff2 = m_ptsInField->GetPointVal(0, i + 2) -
540 m_ptsInField->GetPointVal(0, i + 1);
541
542 h1 = (m_ptsInField->GetPointVal(0, i + 1) - coord) *
543 (m_ptsInField->GetPointVal(0, i + 2) - coord) /
544 (pdiff * (pdiff + pdiff2));
545 h2 = (coord - m_ptsInField->GetPointVal(0, i)) *
546 (m_ptsInField->GetPointVal(0, i + 2) - coord) /
547 (pdiff * pdiff2);
548 h3 = (coord - m_ptsInField->GetPointVal(0, i)) *
549 (coord - m_ptsInField->GetPointVal(0, i + 1)) /
550 ((pdiff + pdiff2) * pdiff2);
551
552 m_neighInds[searchPt.idx][0] = i;
553 m_neighInds[searchPt.idx][1] = i + 1;
554 m_neighInds[searchPt.idx][2] = i + 2;
555 }
556 else
557 {
558 // backwards stencil
559 NekDouble pdiff2 = m_ptsInField->GetPointVal(0, i) -
560 m_ptsInField->GetPointVal(0, i - 1);
561
562 h1 = (m_ptsInField->GetPointVal(0, i + 1) - coord) *
563 (coord - m_ptsInField->GetPointVal(0, i - 1)) /
564 (pdiff * pdiff2);
565 h2 = (coord - m_ptsInField->GetPointVal(0, i)) *
566 (coord - m_ptsInField->GetPointVal(0, i - 1)) /
567 (pdiff * (pdiff + pdiff2));
568 h3 = (m_ptsInField->GetPointVal(0, i) - coord) *
569 (m_ptsInField->GetPointVal(0, i + 1) - coord) /
570 ((pdiff + pdiff2) * pdiff);
571
572 m_neighInds[searchPt.idx][0] = i;
573 m_neighInds[searchPt.idx][1] = i + 1;
574 m_neighInds[searchPt.idx][2] = i - 1;
575 }
576
577 m_weights[searchPt.idx][0] = h1;
578 m_weights[searchPt.idx][1] = h2;
579 m_weights[searchPt.idx][2] = h3;
580
581 break;
582 }
583 }
584 ASSERTL0(i != npts - 1, "Failed to find coordinate " +
585 boost::lexical_cast<string>(coord) +
586 " within provided input points");
587}

References ASSERTL0, Nektar::LibUtilities::Interpolator::PtsPoint::coords, Nektar::LibUtilities::Interpolator::PtsPoint::idx, Nektar::NekConstants::kNekZeroTol, m_coordId, m_neighInds, m_ptsInField, and m_weights.

Referenced by CalcWeights().

◆ CalcW_Shepard()

void Nektar::LibUtilities::Interpolator::CalcW_Shepard ( const PtsPoint searchPt,
int  numPts 
)
private

Computes interpolation weights using linear interpolation.

Parameters
searchPtpoint for which the weights are computed
m_coordIdcoordinate id along which the interpolation should be performed

The algorithm is based on Shepard, D. (1968). A two-dimensional interpolation function for irregularly-spaced data. Proceedings of the 1968 23rd ACM National Conference. pp. 517–524.

In order to save memory, for n dimesnions, only 2^n points are considered. Contrary to Shepard, we use a fixed number of points with fixed weighting factors 1/d^n.

Definition at line 472 of file LibUtilities/BasicUtils/Interpolator.cpp.

473{
474 // find nearest neighbours
475 vector<PtsPoint> neighbourPts;
476 FindNNeighbours(searchPt, neighbourPts, numPts);
477
478 for (int i = 0; i < neighbourPts.size(); i++)
479 {
480 m_neighInds[searchPt.idx][i] = neighbourPts[i].idx;
481 }
482
483 // In case d < kNekZeroTol, use the exact point and return
484 for (int i = 0; i < neighbourPts.size(); ++i)
485 {
486 if (neighbourPts[i].dist <= NekConstants::kNekZeroTol)
487 {
488 m_weights[searchPt.idx][i] = 1.0;
489 return;
490 }
491 }
492
493 NekDouble wSum = 0.0;
494 for (int i = 0; i < neighbourPts.size(); ++i)
495 {
496 m_weights[searchPt.idx][i] = 1 / pow(double(neighbourPts[i].dist),
497 double(m_ptsInField->GetDim()));
498 wSum += m_weights[searchPt.idx][i];
499 }
500
501 for (int i = 0; i < neighbourPts.size(); ++i)
502 {
503 m_weights[searchPt.idx][i] = m_weights[searchPt.idx][i] / wSum;
504 }
505}

References FindNNeighbours(), Nektar::LibUtilities::Interpolator::PtsPoint::idx, Nektar::NekConstants::kNekZeroTol, m_neighInds, m_ptsInField, and m_weights.

Referenced by CalcWeights().

◆ CalcWeights()

void Nektar::LibUtilities::Interpolator::CalcWeights ( const LibUtilities::PtsFieldSharedPtr  ptsInField,
LibUtilities::PtsFieldSharedPtr ptsOutField,
bool  reuseTree = false 
)

Compute interpolation weights without doing any interpolation.

Parameters
ptsInFieldinput field
ptsOutFieldoutput field
reuseTreeif an r-tree has been constructed already, reuse it (e.g. for repeated calls over the same input points).

In and output fields must have the same dimension. The most suitable algorithm is chosen automatically if it wasnt set explicitly.

Definition at line 60 of file LibUtilities/BasicUtils/Interpolator.cpp.

63{
64 ASSERTL0(ptsInField->GetDim() <= m_dim, "too many dimensions in inField");
65 ASSERTL0(ptsOutField->GetDim() <= m_dim, "too many dimensions in outField");
66
67 m_ptsInField = ptsInField;
68 m_ptsOutField = ptsOutField;
69
70 size_t nOutPts = m_ptsOutField->GetNpoints();
71 int lastProg = 0;
72
73 // set a default method
74 if (m_method == eNoMethod)
75 {
76 if (m_ptsInField->GetDim() == 3)
77 {
79 }
80 else if (m_ptsInField->GetDim() == 1 || m_coordId >= 0)
81 {
83 }
84 else
85 {
87 }
88 }
89
90 if ((!m_rtree || !reuseTree) && m_method != eQuadratic)
91 {
92 SetupTree();
93 }
94
95 switch (m_method)
96 {
98 {
99 m_weights = Array<TwoD, NekDouble>(nOutPts, 1, 0.0);
100 m_neighInds = Array<TwoD, unsigned int>(nOutPts, 1, 0u);
101
102 for (size_t i = 0; i < nOutPts; ++i)
103 {
104 Array<OneD, NekDouble> tmp(m_dim, 0.0);
105 for (size_t j = 0; j < m_ptsOutField->GetDim(); ++j)
106 {
107 tmp[j] = m_ptsOutField->GetPointVal(j, i);
108 }
109 PtsPoint searchPt(i, tmp, 1E30);
110
111 CalcW_NNeighbour(searchPt);
112
113 int progress = int(100 * i / nOutPts);
114 if (m_progressCallback && progress > lastProg)
115 {
116 m_progressCallback(i, nOutPts);
117 lastProg = progress;
118 }
119 }
120
121 break;
122 }
123
124 case eQuadratic:
125 {
126 ASSERTL0(m_ptsInField->GetDim() == 1 || m_coordId >= 0,
127 "not implemented");
128
129 m_weights = Array<TwoD, NekDouble>(nOutPts, 3, 0.0);
130 m_neighInds = Array<TwoD, unsigned int>(nOutPts, 3, 0u);
131
132 for (size_t i = 0; i < nOutPts; ++i)
133 {
134 Array<OneD, NekDouble> tmp(m_dim, 0.0);
135 for (size_t j = 0; j < m_ptsOutField->GetDim(); ++j)
136 {
137 tmp[j] = m_ptsOutField->GetPointVal(j, i);
138 }
139 PtsPoint searchPt(i, tmp, 1E30);
140
141 if (m_ptsInField->GetNpoints() <= 2)
142 {
143 CalcW_Linear(searchPt, m_coordId);
144 }
145 else
146 {
147 CalcW_Quadratic(searchPt, m_coordId);
148 }
149
150 int progress = int(100 * i / nOutPts);
151 if (m_progressCallback && progress > lastProg)
152 {
153 m_progressCallback(i, nOutPts);
154 lastProg = progress;
155 }
156 }
157
158 break;
159 }
160
161 case eShepard:
162 {
163 int numPts = m_ptsInField->GetDim();
164 numPts = 1 << numPts; // 2 ^ numPts
165 numPts = min(numPts, int(m_ptsInField->GetNpoints() / 2));
166
167 m_weights = Array<TwoD, NekDouble>(nOutPts, numPts, 0.0);
168 m_neighInds = Array<TwoD, unsigned int>(nOutPts, numPts, 0u);
169
170 for (size_t i = 0; i < nOutPts; ++i)
171 {
172 Array<OneD, NekDouble> tmp(m_dim, 0.0);
173 for (size_t j = 0; j < m_ptsOutField->GetDim(); ++j)
174 {
175 tmp[j] = m_ptsOutField->GetPointVal(j, i);
176 }
177 PtsPoint searchPt(i, tmp, 1E30);
178
179 CalcW_Shepard(searchPt, numPts);
180
181 int progress = int(100 * i / nOutPts);
182 if (m_progressCallback && progress > lastProg)
183 {
184 m_progressCallback(i, nOutPts);
185 lastProg = progress;
186 }
187 }
188
189 break;
190 }
191
192 case eGauss:
193 {
195 "No filter width set");
196 // use m_filtWidth as FWHM
197 NekDouble sigma = m_filtWidth * 0.4246609001;
198
199 m_maxPts = min(m_maxPts, int(m_ptsInField->GetNpoints() / 2));
200
201 m_weights = Array<TwoD, NekDouble>(nOutPts, m_maxPts, 0.0);
202 m_neighInds = Array<TwoD, unsigned int>(nOutPts, m_maxPts, 0u);
203
204 for (size_t i = 0; i < nOutPts; ++i)
205 {
206 Array<OneD, NekDouble> tmp(m_dim, 0.0);
207 for (size_t j = 0; j < m_ptsOutField->GetDim(); ++j)
208 {
209 tmp[j] = m_ptsOutField->GetPointVal(j, i);
210 }
211 PtsPoint searchPt(i, tmp, 1E30);
212
213 CalcW_Gauss(searchPt, sigma, m_maxPts);
214
215 int progress = int(100 * i / nOutPts);
216 if (m_progressCallback && progress > lastProg)
217 {
218 m_progressCallback(i, nOutPts);
219 lastProg = progress;
220 }
221 }
222
223 break;
224 }
225
226 default:
227 NEKERROR(ErrorUtil::efatal, "Invalid interpolation m_method");
228 break;
229 }
230}
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mode...
Definition: ErrorUtil.hpp:209
static const int m_dim
dimension of this interpolator. Hardcoded to 3
std::shared_ptr< PtsRtree > m_rtree
A tree structure to speed up the neighbour search. Note that we fill it with an iterator,...
void CalcW_Linear(const PtsPoint &searchPt, int coordId)
Computes interpolation weights using linear interpolation.
void CalcW_NNeighbour(const PtsPoint &searchPt)
Computes interpolation weights using nearest neighbour interpolation.
void CalcW_Shepard(const PtsPoint &searchPt, int numPts)
Computes interpolation weights using linear interpolation.
void CalcW_Gauss(const PtsPoint &searchPt, const NekDouble sigma, const int maxPts=250)
Computes interpolation weights using gaussian interpolation.
std::function< void(const int position, const int goal)> m_progressCallback
void CalcW_Quadratic(const PtsPoint &searchPt, int coordId)
Computes interpolation weights using quadratic interpolation.
LibUtilities::PtsFieldSharedPtr m_ptsOutField
output field

References ASSERTL0, CalcW_Gauss(), CalcW_Linear(), CalcW_NNeighbour(), CalcW_Quadratic(), CalcW_Shepard(), Nektar::ErrorUtil::efatal, Nektar::LibUtilities::eGauss, Nektar::LibUtilities::eNearestNeighbour, Nektar::LibUtilities::eNoMethod, Nektar::LibUtilities::eQuadratic, Nektar::LibUtilities::eShepard, Nektar::NekConstants::kNekZeroTol, m_coordId, m_dim, m_filtWidth, m_maxPts, m_method, m_neighInds, m_progressCallback, m_ptsInField, m_ptsOutField, m_rtree, m_weights, NEKERROR, and SetupTree().

Referenced by Nektar::SolverUtils::SessionFunction::EvaluatePts(), and Interpolate().

◆ FindNeighbours()

void Nektar::LibUtilities::Interpolator::FindNeighbours ( const PtsPoint searchPt,
std::vector< PtsPoint > &  neighbourPts,
const NekDouble  dist,
const unsigned int  maxPts = 1 
)
private

Finds the nearest neighbours of a point.

Parameters
searchPtpoint for which the neighbours are searched
neighbourPtspossible neighbour points
distlimits the distance of the neighbours

Definition at line 673 of file LibUtilities/BasicUtils/Interpolator.cpp.

677{
678 BPoint searchBPoint(searchPt.coords[0], searchPt.coords[1],
679 searchPt.coords[2]);
680 BPoint bbMin(searchPt.coords[0] - dist, searchPt.coords[1] - dist,
681 searchPt.coords[2] - dist);
682 BPoint bbMax(searchPt.coords[0] + dist, searchPt.coords[1] + dist,
683 searchPt.coords[2] + dist);
684 bg::model::box<BPoint> bbox(bbMin, bbMax);
685
686 // find points within the distance box
687 std::vector<PtsPointPair> result;
688 if (maxPts >= 1)
689 {
690 m_rtree->query(bgi::within(bbox) && bgi::nearest(searchBPoint, maxPts),
691 std::back_inserter(result));
692 }
693 else
694 {
695 m_rtree->query(bgi::within(bbox), std::back_inserter(result));
696 }
697
698 // massage into or own format
699 for (int i = 0; i < result.size(); ++i)
700 {
701 int idx = result[i].second;
702 Array<OneD, NekDouble> coords(m_dim, 0.0);
703 for (int j = 0; j < m_ptsInField->GetDim(); ++j)
704 {
705 coords[j] = m_ptsInField->GetPointVal(j, idx);
706 }
707 NekDouble d = bg::distance(searchBPoint, result[i].first);
708
709 // discard points beyonf dist
710 if (d <= dist)
711 {
712 neighbourPts.push_back(PtsPoint(idx, coords, d));
713 }
714 }
715
716 sort(neighbourPts.begin(), neighbourPts.end());
717}
boost::geometry::model::point< NekDouble, m_dim, boost::geometry::cs::cartesian > BPoint
std::vector< double > d(NPUPPER *NPUPPER)

References Nektar::LibUtilities::Interpolator::PtsPoint::coords, Nektar::UnitTests::d(), m_dim, m_ptsInField, and m_rtree.

Referenced by CalcW_Gauss().

◆ FindNNeighbours()

void Nektar::LibUtilities::Interpolator::FindNNeighbours ( const PtsPoint searchPt,
std::vector< PtsPoint > &  neighbourPts,
const unsigned int  numPts = 1 
)
private

Finds the nearest neighbours of a point.

Parameters
searchPtpoint for which the neighbours are searched
neighbourPtspossible neighbour points
numPtslimits the number of neighbours found to the numPts nearest ones

Definition at line 639 of file LibUtilities/BasicUtils/Interpolator.cpp.

642{
643 std::vector<PtsPointPair> result;
644 BPoint searchBPoint(searchPt.coords[0], searchPt.coords[1],
645 searchPt.coords[2]);
646 m_rtree->query(bgi::nearest(searchBPoint, numPts),
647 std::back_inserter(result));
648
649 // massage into or own format
650 for (int i = 0; i < result.size(); ++i)
651 {
652 int idx = result[i].second;
653 Array<OneD, NekDouble> coords(m_dim, 0.0);
654 for (int j = 0; j < m_ptsInField->GetDim(); ++j)
655 {
656 coords[j] = m_ptsInField->GetPointVal(j, idx);
657 }
658 NekDouble d = bg::distance(searchBPoint, result[i].first);
659 neighbourPts.push_back(PtsPoint(idx, coords, d));
660 }
661
662 sort(neighbourPts.begin(), neighbourPts.end());
663}

References Nektar::LibUtilities::Interpolator::PtsPoint::coords, Nektar::UnitTests::d(), m_dim, m_ptsInField, and m_rtree.

Referenced by CalcW_NNeighbour(), and CalcW_Shepard().

◆ GetCoordId()

int Nektar::LibUtilities::Interpolator::GetCoordId ( ) const

Returns the coordinate id along which the interpolation should be performed.

Definition at line 295 of file LibUtilities/BasicUtils/Interpolator.cpp.

296{
297 return m_coordId;
298}

References m_coordId.

◆ GetDim()

int Nektar::LibUtilities::Interpolator::GetDim ( ) const

returns the dimension of the Interpolator. Should be higher than the dimensions of the interpolated fields

Definition at line 290 of file LibUtilities/BasicUtils/Interpolator.cpp.

291{
292 return m_dim;
293}

References m_dim.

◆ GetFiltWidth()

NekDouble Nektar::LibUtilities::Interpolator::GetFiltWidth ( ) const

Returns the filter width.

Definition at line 300 of file LibUtilities/BasicUtils/Interpolator.cpp.

301{
302 return m_filtWidth;
303}

References m_filtWidth.

◆ GetInField()

LibUtilities::PtsFieldSharedPtr Nektar::LibUtilities::Interpolator::GetInField ( ) const

Returns the input field.

Definition at line 310 of file LibUtilities/BasicUtils/Interpolator.cpp.

311{
312 return m_ptsInField;
313}

References m_ptsInField.

◆ GetInterpMethod()

InterpMethod Nektar::LibUtilities::Interpolator::GetInterpMethod ( ) const

Returns the interpolation method used by this interpolator.

Definition at line 305 of file LibUtilities/BasicUtils/Interpolator.cpp.

306{
307 return m_method;
308}

References m_method.

◆ GetOutField()

LibUtilities::PtsFieldSharedPtr Nektar::LibUtilities::Interpolator::GetOutField ( ) const

Returns the output field.

Definition at line 315 of file LibUtilities/BasicUtils/Interpolator.cpp.

316{
317 return m_ptsOutField;
318}

References m_ptsOutField.

◆ Interpolate()

void Nektar::LibUtilities::Interpolator::Interpolate ( const LibUtilities::PtsFieldSharedPtr  ptsInField,
LibUtilities::PtsFieldSharedPtr ptsOutField 
)

Interpolate from a pts field to a pts field.

Parameters
ptsInFieldinput field
ptsOutFieldoutput field

In and output fields must have the same dimension and number of fields. The most suitable algorithm is chosen automatically if it wasnt set explicitly.

Definition at line 242 of file LibUtilities/BasicUtils/Interpolator.cpp.

244{
245 ASSERTL0(ptsInField->GetNFields() == ptsOutField->GetNFields(),
246 "number of fields does not match");
247 ASSERTL0(ptsInField->GetDim() <= m_dim, "too many dimesions in inField");
248 ASSERTL0(ptsOutField->GetDim() <= m_dim, "too many dimesions in outField");
249
250 m_ptsInField = ptsInField;
251 m_ptsOutField = ptsOutField;
252
253 if (m_weights.GetRows() == 0)
254 {
256 }
257
258 ASSERTL0(m_weights.GetRows() == m_ptsOutField->GetNpoints(),
259 "weights dimension mismatch");
260
261 size_t nFields = m_ptsOutField->GetNFields();
262 size_t nOutPts = m_ptsOutField->GetNpoints();
263 size_t inDim = m_ptsInField->GetDim();
264
265 // interpolate points and transform
266 for (size_t i = 0; i < nFields; ++i)
267 {
268 for (size_t j = 0; j < nOutPts; ++j)
269 {
270 size_t nPts = m_weights.GetColumns();
271
272 // skip if there were no neighbours found for this point
273 if (nPts == 0)
274 {
275 continue;
276 }
277
278 NekDouble val = 0.0;
279 for (size_t k = 0; k < nPts; ++k)
280 {
281 size_t nIdx = m_neighInds[j][k];
282 val += m_weights[j][k] *
283 m_ptsInField->GetPointVal(inDim + i, nIdx);
284 }
285 m_ptsOutField->SetPointVal(m_ptsOutField->GetDim() + i, j, val);
286 }
287 }
288}
void CalcWeights(const LibUtilities::PtsFieldSharedPtr ptsInField, LibUtilities::PtsFieldSharedPtr &ptsOutField, bool reuseTree=false)
Compute interpolation weights without doing any interpolation.

References ASSERTL0, CalcWeights(), m_dim, m_neighInds, m_ptsInField, m_ptsOutField, and m_weights.

Referenced by Nektar::FieldUtils::Interpolator< T >::Interpolate().

◆ PrintStatistics()

void Nektar::LibUtilities::Interpolator::PrintStatistics ( )

Returns if the weights have already been computed.

Definition at line 320 of file LibUtilities/BasicUtils/Interpolator.cpp.

321{
322 int meanN = 0;
323 for (int i = 0; i < m_neighInds.GetRows(); ++i)
324 {
325 for (int j = 0; j < m_neighInds.GetColumns(); ++j)
326 {
327 if (m_neighInds[i][j] > 0)
328 {
329 meanN += 1;
330 }
331 }
332 }
333
334 cout << "Number of points: " << m_neighInds.GetRows() << endl;
335 if (m_neighInds.GetRows() > 0)
336 {
337 cout << "mean Number of Neighbours per point: "
338 << meanN / m_neighInds.GetRows() << endl;
339 }
340}

References m_neighInds.

Referenced by Nektar::SolverUtils::SessionFunction::EvaluatePts().

◆ SetProgressCallback()

template<typename FuncPointerT , typename ObjectPointerT >
void Nektar::LibUtilities::Interpolator::SetProgressCallback ( FuncPointerT  func,
ObjectPointerT  obj 
)
inline

sets a callback funtion which gets called every time the interpolation progresses

Definition at line 137 of file LibUtilities/BasicUtils/Interpolator.h.

138 {
140 std::bind(func, obj, std::placeholders::_1, std::placeholders::_2);
141 }

References m_progressCallback.

Referenced by Nektar::SolverUtils::SessionFunction::EvaluatePts(), Nektar::FieldUtils::ProcessInterpPoints::InterpolateFieldToPts(), Nektar::FieldUtils::ProcessInterpPtsToPts::InterpolatePtsToPts(), Nektar::FieldUtils::ProcessInterpField::v_Process(), and Nektar::FieldUtils::ProcessInterpPointDataToFld::v_Process().

◆ SetupTree()

void Nektar::LibUtilities::Interpolator::SetupTree ( )
private

Definition at line 589 of file LibUtilities/BasicUtils/Interpolator.cpp.

590{
591 std::vector<PtsPointPair> inPoints;
592 for (int i = 0; i < m_ptsInField->GetNpoints(); ++i)
593 {
594 Array<OneD, NekDouble> coords(3, 0.0);
595 for (int j = 0; j < m_ptsInField->GetDim(); ++j)
596 {
597 coords[j] = m_ptsInField->GetPointVal(j, i);
598 }
599 inPoints.push_back(
600 PtsPointPair(BPoint(coords[0], coords[1], coords[2]), i));
601 }
603 m_rtree->insert(inPoints.begin(), inPoints.end());
604
605 // remove duplicates from tree
606 for (auto &it : inPoints)
607 {
608 std::vector<PtsPointPair> result;
609
610 // find nearest 2 points (2 because one of these might be the one we
611 // are
612 // checking)
613 m_rtree->query(bgi::nearest(it.first, 2), std::back_inserter(result));
614
615 // in case any of these 2 points is too close, remove the current
616 // point
617 // from the tree
618 for (auto &it2 : result)
619 {
620 if (it.second != it2.second &&
621 bg::distance(it.first, it2.first) <= NekConstants::kNekZeroTol)
622 {
623 m_rtree->remove(it);
624 break;
625 }
626 }
627 }
628}
static std::shared_ptr< DataType > AllocateSharedPtr(const Args &...args)
Allocate a shared pointer from the memory pool.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr(), Nektar::NekConstants::kNekZeroTol, m_ptsInField, and m_rtree.

Referenced by CalcWeights().

Member Data Documentation

◆ m_coordId

short int Nektar::LibUtilities::Interpolator::m_coordId
private

coordinate id along which the interpolation should be performed

Definition at line 197 of file LibUtilities/BasicUtils/Interpolator.h.

Referenced by CalcW_Linear(), CalcW_Quadratic(), CalcWeights(), and GetCoordId().

◆ m_dim

const int Nektar::LibUtilities::Interpolator::m_dim = 3
staticprivate

dimension of this interpolator. Hardcoded to 3

Definition at line 171 of file LibUtilities/BasicUtils/Interpolator.h.

Referenced by CalcWeights(), FindNeighbours(), FindNNeighbours(), GetDim(), and Interpolate().

◆ m_filtWidth

NekDouble Nektar::LibUtilities::Interpolator::m_filtWidth
private

Filter width used for some interpolation algorithms.

Definition at line 193 of file LibUtilities/BasicUtils/Interpolator.h.

Referenced by CalcWeights(), and GetFiltWidth().

◆ m_maxPts

int Nektar::LibUtilities::Interpolator::m_maxPts
private

Max number of interpolation points.

Definition at line 195 of file LibUtilities/BasicUtils/Interpolator.h.

Referenced by CalcWeights().

◆ m_method

InterpMethod Nektar::LibUtilities::Interpolator::m_method
private

Interpolation Method.

Definition at line 181 of file LibUtilities/BasicUtils/Interpolator.h.

Referenced by CalcWeights(), and GetInterpMethod().

◆ m_neighInds

Array<TwoD, unsigned int> Nektar::LibUtilities::Interpolator::m_neighInds
private

Indices of the relevant neighbours for each physical point. Structure: m_neighInds[ptIdx][neighbourIdx].

Definition at line 191 of file LibUtilities/BasicUtils/Interpolator.h.

Referenced by CalcW_Gauss(), CalcW_Linear(), CalcW_NNeighbour(), CalcW_Quadratic(), CalcW_Shepard(), CalcWeights(), Interpolate(), and PrintStatistics().

◆ m_progressCallback

std::function<void(const int position, const int goal)> Nektar::LibUtilities::Interpolator::m_progressCallback
protected

Definition at line 149 of file LibUtilities/BasicUtils/Interpolator.h.

Referenced by CalcWeights(), and SetProgressCallback().

◆ m_ptsInField

LibUtilities::PtsFieldSharedPtr Nektar::LibUtilities::Interpolator::m_ptsInField
protected

◆ m_ptsOutField

LibUtilities::PtsFieldSharedPtr Nektar::LibUtilities::Interpolator::m_ptsOutField
protected

output field

Definition at line 147 of file LibUtilities/BasicUtils/Interpolator.h.

Referenced by CalcWeights(), GetOutField(), and Interpolate().

◆ m_rtree

std::shared_ptr<PtsRtree> Nektar::LibUtilities::Interpolator::m_rtree
private

A tree structure to speed up the neighbour search. Note that we fill it with an iterator, so instead of rstar, the packing algorithm is used.

Definition at line 185 of file LibUtilities/BasicUtils/Interpolator.h.

Referenced by CalcWeights(), FindNeighbours(), FindNNeighbours(), and SetupTree().

◆ m_weights

Array<TwoD, NekDouble> Nektar::LibUtilities::Interpolator::m_weights
private

Interpolation weights for each neighbour. Structure: m_weights[physPtIdx][neighbourIdx].

Definition at line 188 of file LibUtilities/BasicUtils/Interpolator.h.

Referenced by CalcW_Gauss(), CalcW_Linear(), CalcW_NNeighbour(), CalcW_Quadratic(), CalcW_Shepard(), CalcWeights(), and Interpolate().