Nalu
Nalu: a generalized unstructured massively parallel low Mach flow code designed to support a variety of energy applications of interest (most notably Wind ECP) built on the Sierra Toolkit and Trilinos solver Tpetra/Epetra stack. The open source BSD, clause 3 license model has been chosen for the code base. See LICENSE for more information. http://NaluCFD.org
BSpline.h
Go to the documentation of this file.
1 #ifndef BSPLINE_H
2 #define BSPLINE_H
3 
4 #include <vector>
5 
6 namespace sierra {
7 namespace nalu {
8 
9 // Forward declarations
10 class H5IO;
11 
12 //====================================================================
13 //====================================================================
14 
26 class BSpline{
27  public:
28 
29  BSpline( const int order,
30  const int dimension,
31  const bool enableValueClipping=true );
32 
33  virtual ~BSpline();
34 
39  virtual BSpline * clone() const = 0;
40 
45  int get_order() const{return order_;}
46 
48  int get_dimension() const{return dim_;}
49 
54  virtual double value( const double* ) const = 0;
55 
56  double value( std::vector<double> & x ) const{ return value( &x[0] ); }
57 
63  virtual void read_hdf5( H5IO & io ) = 0;
64 
70  virtual void write_hdf5( H5IO & io ) const = 0;
71 
72  protected:
73 
74  int order_;
75  const int dim_;
77 
78  private:
79 
80  BSpline( const BSpline & ); // no copying
81  BSpline & operator=( const BSpline & ); // no assignment
82 
83 };
84 
85 //====================================================================
86 //====================================================================
87 
97 class BSpline1D : public BSpline{
98  public:
99 
109  BSpline1D( const int order,
110  const std::vector<double> & indepVars,
111  const std::vector<double> & depVars,
112  const bool allowClipping = true );
113 
118  BSpline1D( const bool allowClipping = true );
119 
121  BSpline1D( const BSpline1D& );
122 
124  BSpline * clone() const{ return new BSpline1D(*this); }
125 
126  ~BSpline1D();
127 
132  double value( const double* indepVar ) const;
133  inline double value( const double & x ) const{ return value(&x); }
134 
135  inline const std::vector<double> & get_control_pts() const{ return controlPts_; }
136  inline std::vector<double> & get_control_pts() { return controlPts_; }
137  inline const std::vector<double> & get_knot_vector() const{ return knots_; };
138 
139  inline int get_npts() const{ return npts_; }
140 
141  inline double get_maxval() const{ return maxIndepVarVal_; }
142  inline double get_minval() const{ return minIndepVarVal_; }
143 
144  inline const std::vector<double> & get_basisfun() const{ return basisFun_; }
145 
146  void sort_inputs( const std::vector<double> & indepVars,
147  const std::vector<double> & depVars,
148  std::vector<double> & sortedIndepVars,
149  std::vector<double> & sortedDepVars ) const;
150 
154  void dump();
155 
156  void write_hdf5( H5IO & io ) const;
157  void read_hdf5( H5IO & io );
158 
159  inline bool operator == (const BSpline1D& a ) const{
160  return ( a.npts_ == npts_ &&
161  a.maxIndepVarVal_ == maxIndepVarVal_ &&
162  a.minIndepVarVal_ == minIndepVarVal_ &&
163  a.knots_ == knots_ &&
164  a.controlPts_ == controlPts_ );
165  }
166 
167  inline bool operator != ( const BSpline1D& a ) const{ return !( *this==a ); }
168 
169  private:
170 
175  void compute_control_pts( const std::vector<double> & indepVars,
176  const std::vector<double> & depVars );
177 
178  int npts_;
179  double maxIndepVarVal_, minIndepVarVal_;
180  std::vector<double> knots_, controlPts_;
181  mutable std::vector<double> basisFun_;
182 
183  BSpline1D& operator=(const BSpline1D&); // no assignment
184 };
185 
186 //====================================================================
187 //====================================================================
188 
196 class BSpline2D : public BSpline{
197  public:
198 
210  BSpline2D( const int order,
211  const std::vector<double> & indepVars1,
212  const std::vector<double> & indepVars2,
213  const std::vector<double> & depVars,
214  const bool allowClipping = true );
215 
220  BSpline2D( const bool allowClipping = true );
221 
223  BSpline2D( const BSpline2D& );
224 
226  BSpline * clone() const{ return new BSpline2D(*this); }
227 
228  ~BSpline2D();
229 
234  double value( const double* indepVar ) const;
235 
236  void write_hdf5( H5IO & io ) const;
237  void read_hdf5( H5IO & io );
238 
239  inline bool operator == (const BSpline2D& a) const{
240  bool isEqual = true;
241  std::vector<const BSpline1D*>::const_iterator isp = dim2Splines_.begin();
242  std::vector<const BSpline1D*>::const_iterator ispa = a.dim2Splines_.begin();
243  for( ; isp!=dim2Splines_.end(); isp++, ispa++ )
244  isEqual = ( (**isp) == (**ispa) ) ? isEqual : false;
245  isEqual = (*a.sp1_ == *sp1_) ? isEqual : false;
246  return isEqual;
247  }
248 
249  inline bool operator != ( const BSpline2D& a ) const{ return !( *this==a ); }
250 
251  private:
252 
253  std::vector<const BSpline1D*> dim2Splines_;
255 
256  void compute_control_pts( const std::vector<double> & indepVars1,
257  const std::vector<double> & indepVars2,
258  const std::vector<double> & depVars );
259 
260  BSpline2D& operator=(const BSpline2D&); // no assignment
261 };
262 
263 //====================================================================
264 //====================================================================
265 
273 class BSpline3D : public BSpline{
274 
275  public:
276 
293  BSpline3D( const int order,
294  const std::vector<double> & x1,
295  const std::vector<double> & x2,
296  const std::vector<double> & x3,
297  const std::vector<double> & phi,
298  const bool allowClipping = true );
299 
304  BSpline3D( const bool allowClipping = true );
305 
307  BSpline3D( const BSpline3D& );
308 
310  BSpline * clone() const{ return new BSpline3D(*this); }
311 
312  ~BSpline3D();
313 
318  double value( const double* ) const;
319 
320  void write_hdf5( H5IO & io ) const;
321  void read_hdf5( H5IO & io );
322 
323  inline bool operator == (const BSpline3D& a) const{
324  bool isEqual = true;
325  std::vector<const BSpline2D*>::const_iterator isp = sp2d_.begin();
326  std::vector<const BSpline2D*>::const_iterator ispa = a.sp2d_.begin();
327  for( ; isp!=sp2d_.end(); isp++, ispa++ )
328  isEqual = ( **isp == **ispa ) ? isEqual : false;
329  isEqual = (*a.sp1_ == *sp1_) ? isEqual : false;
330  return isEqual;
331  }
332 
333  inline bool operator != ( const BSpline3D& a ) const{ return !( *this==a ); }
334 
335  private:
336 
337  const int n1_, n2_, n3_; // number of control points for each dimension
338  std::vector<const BSpline2D*> sp2d_;
340 
341  void compute_control_pts( const std::vector<double> & x1,
342  const std::vector<double> & x2,
343  const std::vector<double> & x3,
344  const std::vector<double> & phi );
345 
346  BSpline3D& operator=(const BSpline3D&); // no assignment
347 };
348 
349 //====================================================================
350 //====================================================================
351 
359 class BSpline4D : public BSpline{
360 
361  public:
362 
380  BSpline4D( const int order,
381  const std::vector<double> & x1,
382  const std::vector<double> & x2,
383  const std::vector<double> & x3,
384  const std::vector<double> & x4,
385  const std::vector<double> & phi,
386  const bool allowClipping = true );
387 
392  BSpline4D( const bool allowClipping = true );
393 
395  BSpline4D( const BSpline4D& );
396 
398  BSpline * clone() const{ return new BSpline4D(*this); }
399 
400  ~BSpline4D();
401 
406  double value( const double* x ) const;
407 
408  void write_hdf5( H5IO & io ) const;
409  void read_hdf5( H5IO & io );
410 
411  inline bool operator == (const BSpline4D& a) const{
412  bool isEqual = true;
413  std::vector<const BSpline3D*>::const_iterator isp = sp3d_.begin();
414  std::vector<const BSpline3D*>::const_iterator ispa = a.sp3d_.begin();
415  for( ; isp!=sp3d_.end(); isp++, ispa++ )
416  isEqual = ( **isp == **ispa ) ? isEqual : false;
417  isEqual = (*a.sp1_ == *sp1_) ? isEqual : false;
418  return isEqual;
419  }
420 
421  inline bool operator != ( const BSpline4D& a ) const{ return !( *this==a ); }
422 
423  private:
424 
425  const int n1_, n2_, n3_, n4_;
426  std::vector<const BSpline3D*> sp3d_;
428 
429  void compute_control_pts( const std::vector<double> & x1,
430  const std::vector<double> & x2,
431  const std::vector<double> & x3,
432  const std::vector<double> & x4,
433  const std::vector<double> & phi );
434 
435  BSpline4D& operator=(const BSpline4D&); // no assignment
436 };
437 
438 //====================================================================
439 //====================================================================
440 
448 class BSpline5D : public BSpline{
449 
450  public:
451 
470  BSpline5D( const int order,
471  const std::vector<double> & x1,
472  const std::vector<double> & x2,
473  const std::vector<double> & x3,
474  const std::vector<double> & x4,
475  const std::vector<double> & x5,
476  const std::vector<double> & phi,
477  const bool allowClipping = true );
478 
483  BSpline5D( const bool allowClipping = true );
484 
486  BSpline5D( const BSpline5D& );
487 
489  BSpline * clone() const{ return new BSpline5D(*this); }
490 
491  ~BSpline5D();
492 
497  double value( const double* x ) const;
498 
499  void write_hdf5( H5IO & io ) const;
500  void read_hdf5( H5IO & io );
501 
502  inline bool operator == (const BSpline5D& a) const{
503  bool isEqual = true;
504  std::vector<const BSpline4D*>::const_iterator isp = sp4d_.begin();
505  std::vector<const BSpline4D*>::const_iterator ispa = a.sp4d_.begin();
506  for( ; isp!=sp4d_.end(); isp++, ispa++ )
507  isEqual = ( **isp == **ispa ) ? isEqual : false;
508  isEqual = (*a.sp1_ == *sp1_) ? isEqual : false;
509  return isEqual;
510  }
511 
512  inline bool operator != ( const BSpline5D& a ) const{ return !( *this==a ); }
513 
514  private:
515 
516  const int n1_, n2_, n3_, n4_, n5_;
517  std::vector<const BSpline4D*> sp4d_;
519 
520  void compute_control_pts( const std::vector<double> & x1,
521  const std::vector<double> & x2,
522  const std::vector<double> & x3,
523  const std::vector<double> & x4,
524  const std::vector<double> & x5,
525  const std::vector<double> & phi );
526 
527  BSpline5D& operator=(const BSpline5D&); // no assignment
528 };
529 
530 //====================================================================
531 //====================================================================
532 
533 } // end nalu namespace
534 } // end sierra namespace
535 
536 #endif
virtual ~BSpline()
Definition: BSpline.C:201
BSpline & operator=(const BSpline &)
double value(std::vector< double > &x) const
Definition: BSpline.h:56
Definition: ABLForcingAlgorithm.C:26
Definition: BSpline.h:448
BSpline1D * sp1_
Definition: BSpline.h:518
Definition: BSpline.h:359
Definition: BSpline.h:273
Support for B-Spline of a curve.
Definition: BSpline.h:97
Definition: BSpline.h:196
Simple wrapper around the HDF5 library to make usage easier.
Definition: H5IO.h:57
BSpline * clone() const
copy this object and return a BSpline pointer
Definition: BSpline.h:226
BSpline * clone() const
copy this object and return a BSpline pointer
Definition: BSpline.h:398
virtual void read_hdf5(H5IO &io)=0
Read a spline from an HDF5 database.
double maxIndepVarVal_
Definition: BSpline.h:179
std::vector< const BSpline2D * > sp2d_
Definition: BSpline.h:338
std::vector< double > knots_
Definition: BSpline.h:180
const bool enableValueClipping_
Definition: BSpline.h:76
const std::vector< double > & get_knot_vector() const
Definition: BSpline.h:137
std::vector< double > basisFun_
Definition: BSpline.h:181
BSpline(const int order, const int dimension, const bool enableValueClipping=true)
Definition: BSpline.C:192
const int n4_
Definition: BSpline.h:425
double minIndepVarVal_
Definition: BSpline.h:179
std::vector< double > & get_control_pts()
Definition: BSpline.h:136
BSpline1D * sp1_
Definition: BSpline.h:339
double get_minval() const
Definition: BSpline.h:142
BSpline * clone() const
copy this object and return a BSpline pointer
Definition: BSpline.h:489
int npts_
Definition: BSpline.h:178
virtual BSpline * clone() const =0
Copy this object and return a BSpline pointer.
BSpline * clone() const
copy this object and return a BSpline pointer
Definition: BSpline.h:124
double get_maxval() const
Definition: BSpline.h:141
BSpline1D * sp1_
Definition: BSpline.h:427
Base class for B-Splines.
Definition: BSpline.h:26
std::vector< const BSpline1D * > dim2Splines_
Definition: BSpline.h:253
const std::vector< double > & get_basisfun() const
Definition: BSpline.h:144
int order_
Definition: BSpline.h:74
int get_npts() const
Definition: BSpline.h:139
const std::vector< double > & get_control_pts() const
Definition: BSpline.h:135
BSpline1D * sp1_
Definition: BSpline.h:254
virtual double value(const double *) const =0
Evaluate the dependent variable via interpolation at the given value of the dependent variable(s)...
BSpline * clone() const
copy this object and return a BSpline pointer
Definition: BSpline.h:310
const int dim_
Definition: BSpline.h:75
const int n5_
Definition: BSpline.h:516
int get_order() const
Query the order of accuracy for this spline.
Definition: BSpline.h:45
int get_dimension() const
Query the dimensionality of this spline (number of independent variables)
Definition: BSpline.h:48
virtual void write_hdf5(H5IO &io) const =0
Write a spline to an HDF5 database.
const int n3_
Definition: BSpline.h:337
std::vector< const BSpline4D * > sp4d_
Definition: BSpline.h:517
std::vector< double > controlPts_
Definition: BSpline.h:180
std::vector< const BSpline3D * > sp3d_
Definition: BSpline.h:426
double value(const double &x) const
Definition: BSpline.h:133