Dendro  5.01
Dendro in Greek language means tree. The Dendro library is a large scale (262K cores on ORNL's Titan) distributed memory adaptive octree framework. The main goal of Dendro is to perform large scale multiphysics simulations efficeiently in mordern supercomputers. Dendro consists of efficient parallel data structures and algorithms to perform variational ( finite element) methods and finite difference mthods on 2:1 balanced arbitary adaptive octrees which enables the users to perform simulations raning from black holes (binary black hole mergers) to blood flow in human body, where applications ranging from relativity, astrophysics to biomedical engineering.
refel.h
1 //
2 // Created by milinda on 12/25/16.
3 //
4 
12 #ifndef SFCSORTBENCH_REFERENCEELEMENT_H
13 #define SFCSORTBENCH_REFERENCEELEMENT_H
14 
15 #ifdef WITH_BLAS_LAPACK
16  #include "basis.h"
17 #endif
18 
19 #include "tensor.h"
20 #include <fstream>
21 #include <iostream>
22 #include <vector>
23 #include <iomanip>
24 #include <math.h>
25 #include <cstring>
26 #include <assert.h>
27 #include "interpMatrices.h"
28 #include "binUtils.h"
29 
30 template<typename T>
31 void dump_binary(const T* in, unsigned int n, const char* fPrefix)
32 {
33  char fName[256];
34  sprintf(fName,"%s.bin",fPrefix);
35  std::ofstream ofile(fName,std::ios::binary);
36 
37  ofile.write((char*)&n, sizeof(int));
38  ofile.write((char*)&in[0], sizeof(T)*n);
39 
40  ofile.close();
41  return ;
42 
43 }
44 
45 
46 template <typename T>
47 void printArray_1D(const T *a, int length)
48 {
49  for (int i = 0; i < length; i++) { std::cout<<a[i]<<" "; }
50  std::cout<<std::endl;
51 }
52 
53 
54 template <typename T>
55 void printArray_2D(const T *a, int length1,int length2)
56 {
57  for (int i = 0; i < length1; i++) {
58  for (int j = 0; j < length2; j++) {
59  std::cout << a[i * length2 + j] << " ";
60  }
61  std::cout<<std::endl;
62  }
63  std::cout<<std::endl;
64 }
65 
66 
67 
68 
69 class RefElement{
70 
71 
72 private :
74  int m_uiDimension;
76  int m_uiOrder;
78  int m_uiNp;
80  int m_uiNfp;
82  int m_uiNrp;
83 
85  unsigned int m_uiVol;
86 
88  std::vector<double> u;
89 
91  std::vector<double> r;
92 
94  std::vector<double> u_0;
95 
97  std::vector<double> u_1;
98 
100  std::vector<double> g;
101 
103  std::vector<double> w;
104 
106  std::vector<double> wgll;
107 
108 
110  std::vector<double> ip_1D_0;
111 
113  std::vector<double> ip_1D_1;
114 
115 
117  std::vector<double> ipT_1D_0;
118 
120  std::vector<double> ipT_1D_1;
121 
123  std::vector<double> Vr;
124 
126  std::vector<double> Vu;
127 
129  std::vector<double> Vg;
130 
132  std::vector<double> gradVu;
133 
135  std::vector<double> gradVr;
136 
138  std::vector<double> gradVg;
139 
141  std::vector<double> Dr;
142 
144  std::vector<double> Dg;
145 
147  std::vector<double> DgT;
148 
150  std::vector<double> quad_1D;
151 
153  std::vector<double> quadT_1D;
154 
156  std::vector<double> Vu_0;
157 
159  std::vector<double> Vu_1;
160 
162  std::vector<double> im_vec1;
163 
165  std::vector<double> im_vec2;
166 
168  std::vector<double> Fr;
169 
171  std::vector<double> gridT;
172 
174  std::vector<double> out_p2c;
175 
176 
177 
178 
179 
180 
181 public:
182  RefElement();
183  RefElement(unsigned int dim, unsigned int order);
184  ~RefElement();
185  // some getter methods to access required data.
186  inline int getOrder() const {return m_uiOrder;}
187  inline int getDim() const {return m_uiDimension;}
188  inline int get1DNumInterpolationPoints(){return m_uiNrp;}
189 
190  inline const double * getIMChild0() const {return &(*(ip_1D_0.begin()));}
191  inline const double * getIMChild1() const {return &(*(ip_1D_1.begin()));}
192  inline const double * getIMTChild0() const { return &(*(ipT_1D_0.begin()));}
193  inline const double * getIMTChild1() const {return &(*(ipT_1D_1.begin()));}
194 
195  inline const double * getQ1d() const {return &(*(quad_1D.begin()));}
196  inline const double * getQT1d()const {return &(*(quadT_1D.begin()));}
197  inline const double * getDg1d()const {return &(*(Dg.begin()));}
198  inline const double * getDgT1d()const {return &(*(DgT.begin()));}
199  inline const double * getDr1d()const {return &(*(Dr.begin()));}
200  inline const double * getFr1D() const {return &(*(Fr.begin()));}
201 
202  inline double * getImVec1() {return &(*(im_vec1.begin()));}
203  inline double * getImVec2() {return &(*(im_vec2.begin()));}
204 
205  inline const double * getWgq()const {return &(*(w.begin()));}
206  inline const double * getWgll()const {return &(*(wgll.begin()));}
207 
208  inline const double getElementSz()const {return (u.back()-u.front());}
209 
210 
211 
221  inline void I3D_Parent2Child(const double * in, double* out, unsigned int childNum ) const
222  {
223 
224  double * im1=(double *)&(*(im_vec1.begin()));
225  double * im2=(double *)&(*(im_vec2.begin()));
226 
227  switch (childNum)
228  {
229  case 0:
230  DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),in,im1); // along x
231  DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),im1,im2); // along y
232  DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),im2,out); // along z
233  break;
234  case 1:
235  DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),in,im1); // along x
236  DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),im1,im2); // along y
237  DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),im2,out); // along z
238 
239  break;
240  case 2:
241  DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),in,im1); // along x
242  DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),im1,im2); // along y
243  DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),im2,out); // along z
244  break;
245  case 3:
246  DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),in,im1); // along x
247  DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),im1,im2); // along y
248  DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),im2,out); // along z
249  break;
250  case 4:
251  DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),in,im1); // along x
252  DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),im1,im2); // along y
253  DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),im2,out); // along z
254  break;
255  case 5:
256  DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),in,im1); // along x
257  DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),im1,im2); // along y
258  DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),im2,out); // along z
259  break;
260  case 6:
261  DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),in,im1); // along x
262  DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),im1,im2); // along y
263  DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),im2,out); // along z
264  break;
265  case 7:
266  DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),in,im1); // along x
267  DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),im1,im2); // along y
268  DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),im2,out); // along z
269  break;
270  default:
271  std::cout<<"[refel][error]: invalid child number specified for 3D interpolation."<<std::endl;
272  break;
273 
274  }
275 
276 
277 
278  }
279 
287  inline void I3D_Parent2Child_FD(const double* in, double* out,unsigned int pw=3) const
288  {
289  assert(pw < m_uiNrp);
290  assert(m_uiNrp>2);
291 
292  // only works for higher order (hard coded)
293  const unsigned int nx = m_uiNrp;
294  const unsigned int ny = m_uiNrp;
295  const unsigned int nz = m_uiNrp;
296 
297  const unsigned int sz_p[3] = {nx + 2*pw , ny + 2*pw , nz + 2*pw};
298  const unsigned int sz_c[3] = {2*m_uiNrp-1 + 2*pw,2*m_uiNrp-1 + 2*pw,2*m_uiNrp-1 + 2*pw};
299 
300  const unsigned int c1d = 2*m_uiNrp-1;
301 
302  const unsigned int pp1 = sz_p[0];
303  const unsigned int pp2 = sz_p[0]*sz_p[1];
304  const unsigned int pp3 = sz_p[0]*sz_p[1]*sz_p[2];
305 
306  const unsigned int cc1 = sz_c[0];
307  const unsigned int cc2 = sz_c[0]*sz_c[1];
308  const unsigned int cc3 = sz_c[0]*sz_c[1]*sz_c[2];
309 
310  const unsigned int p2c1 = (pp1*2-1);
311  const unsigned int p2c2 = (pp1*2-1)*p2c1;
312  const unsigned int p2c3 = (pp1*2-1)*p2c2;
313 
314  const unsigned int fd_1d = gridT.size();
315  const double * c = gridT.data();
316  // const unsigned int fd_1d=4;
317  // const double c[fd_1d] = {-1/16.0 , 9/16.0,9/16.0, -1/16.0};
318 
319  // replacement array for p2c resolution.
320  double * out_p = (double *)&(*(out_p2c.begin()));
321 
322 
323  for(unsigned int k=0; k < sz_p[2]; k++)
324  for(unsigned int j=0; j < sz_p[1]; j++)
325  for(unsigned int i=0; i< sz_p[0]; i++)
326  {
327  out_p[ (k<<1u) * p2c2 + (j<<1u)*p2c1 + (i<<1u) ] = in[ k*pp2 + j*pp1 + i];
328  }
329 
330  const unsigned int N =p2c1;
331  const unsigned int pw2 = pw<<1u;
332  // along x direction.
333  for(unsigned int k=0; k < N; k+=2)
334  for(unsigned int j=0; j < N; j+=2)
335  for(unsigned int i=pw2; i< N-pw2-2; i+=2)
336  {
337  double s =0;
338  for(unsigned int m=0; m < fd_1d ; m++)
339  s+= c[m]*out_p[ k*p2c2 + j * p2c1 + (i-4) + 2*m ];
340 
341  out_p[ k * p2c2 + j*p2c1 + (i+1) ] =s;
342  }
343 
344 
345  // along y direction.
346  for(unsigned int k=0; k < N; k+=2)
347  for(unsigned int j=pw2; j < N-pw2-2; j+=2)
348  for(unsigned int i=pw2; i< N-pw2; i+=1)
349  {
350  double s =0;
351  for(unsigned int m=0; m < fd_1d ; m++)
352  s+= c[m]*out_p[ k * p2c2 + (j-4 + 2*m)* p2c1 + i ];
353 
354  out_p[ k * p2c2 + (j+1)*p2c1 + (i) ] =s;
355  }
356 
357 
358  // along z direction.
359  for(unsigned int k=pw2; k < N-pw2-2; k+=2)
360  for(unsigned int j=pw2; j < N-pw2; j+=1)
361  for(unsigned int i=pw2; i< N-pw2; i+=1)
362  {
363  double s =0;
364  for(unsigned int m=0; m < fd_1d ; m++)
365  s+= c[m]*out_p[ (k-4 + 2*m) * p2c2 + (j)* p2c1 + i ];
366 
367  out_p[ (k+1)* p2c2 + (j)*p2c1 + (i) ] =s;
368  }
369 
370 
371  for(unsigned int k=pw2; k < N-pw2; k+=1)
372  for(unsigned int j=pw2; j < N-pw2; j+=1)
373  for(unsigned int i=pw2; i< N-pw2; i+=1)
374  out[ (k-pw2)*c1d*c1d + (j-pw2)*c1d + (i-pw2)] = out_p[ k* p2c2 + j* p2c1 + i];
375 
376 
377 
378  return ;
379 
380  }
381 
382 
393  inline void I3D_Child2Parent(const double * in, double* out, unsigned int childNum ) const
394  {
395  double * im1=(double *)&(*(im_vec1.begin()));
396  double * im2=(double *)&(*(im_vec2.begin()));
397 
398  switch (childNum)
399  {
400  case 0:
401  DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),in,im1); // along x
402  DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),im1,im2); // along y
403  DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),im2,out); // along z
404  break;
405  case 1:
406  DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),in,im1); // along x
407  DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),im1,im2); // along y
408  DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),im2,out); // along z
409 
410  break;
411  case 2:
412  DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),in,im1); // along x
413  DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),im1,im2); // along y
414  DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),im2,out); // along z
415  break;
416  case 3:
417  DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),in,im1); // along x
418  DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),im1,im2); // along y
419  DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),im2,out); // along z
420  break;
421  case 4:
422  DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),in,im1); // along x
423  DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),im1,im2); // along y
424  DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),im2,out); // along z
425  break;
426  case 5:
427  DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),in,im1); // along x
428  DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),im1,im2); // along y
429  DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),im2,out); // along z
430  break;
431  case 6:
432  DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),in,im1); // along x
433  DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),im1,im2); // along y
434  DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),im2,out); // along z
435  break;
436  case 7:
437  DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),in,im1); // along x
438  DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),im1,im2); // along y
439  DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),im2,out); // along z
440  break;
441  default:
442  std::cout<<"[refel][error]: invalid child number specified for 3D interpolation."<<std::endl;
443  break;
444 
445  }
446 
447  #ifdef FEM_ACCUMILATE_ONES_TEST
448  for(unsigned int node=0;node<(m_uiNrp*m_uiNrp*m_uiNrp);node++)
449  out[node]=1.0;
450  #endif
451  }
452 
453 
460  inline void I2D_Parent2Child(const double * in, double* out, unsigned int childNum) const
461  {
462 
463 
464  double * im1=(double *)&(*(im_vec1.begin()));
465  double * im2=(double *)&(*(im_vec2.begin()));
466 
467 
468 
469  switch (childNum)
470  {
471 
472  case 0:
473  DENDRO_TENSOR_IAX_APPLY_ELEM_2D(m_uiNrp,&(*(ip_1D_0.begin())),in,im1); // along x
474  DENDRO_TENSOR_AIX_APPLY_ELEM_2D(m_uiNrp,&(*(ip_1D_0.begin())),im1,out); // along y (in 3d z)
475  break;
476  case 1:
477  DENDRO_TENSOR_IAX_APPLY_ELEM_2D(m_uiNrp,&(*(ip_1D_1.begin())),in,im1); // along x
478  DENDRO_TENSOR_AIX_APPLY_ELEM_2D(m_uiNrp,&(*(ip_1D_0.begin())),im1,out); // along y (in 3d z)
479  break;
480 
481  case 2:
482  DENDRO_TENSOR_IAX_APPLY_ELEM_2D(m_uiNrp,&(*(ip_1D_0.begin())),in,im1); // along x
483  DENDRO_TENSOR_AIX_APPLY_ELEM_2D(m_uiNrp,&(*(ip_1D_1.begin())),im1,out); // along y (in 3d z)
484  break;
485 
486  case 3:
487  DENDRO_TENSOR_IAX_APPLY_ELEM_2D(m_uiNrp,&(*(ip_1D_1.begin())),in,im1); // along x
488  DENDRO_TENSOR_AIX_APPLY_ELEM_2D(m_uiNrp,&(*(ip_1D_1.begin())),im1,out); // along y (in 3d z)
489  break;
490  default:
491  std::cout<<"[refel][error]: invalid child number specified for 2D interpolation."<<std::endl;
492  break;
493 
494  }
495 
496 
497  }
498 
505  inline void I2D_Child2Parent(const double * in, double* out, unsigned int childNum) const
506  {
507 
508 
509  double * im1=(double *)&(*(im_vec1.begin()));
510  double * im2=(double *)&(*(im_vec2.begin()));
511 
512  switch (childNum)
513  {
514 
515  case 0:
516  DENDRO_TENSOR_IAX_APPLY_ELEM_2D(m_uiNrp,&(*(ipT_1D_0.begin())),in,im1); // along x
517  DENDRO_TENSOR_AIX_APPLY_ELEM_2D(m_uiNrp,&(*(ipT_1D_0.begin())),im1,out); // along y (in 3d z)
518  break;
519  case 1:
520  DENDRO_TENSOR_IAX_APPLY_ELEM_2D(m_uiNrp,&(*(ipT_1D_1.begin())),in,im1); // along x
521  DENDRO_TENSOR_AIX_APPLY_ELEM_2D(m_uiNrp,&(*(ipT_1D_0.begin())),im1,out); // along y (in 3d z)
522  break;
523 
524  case 2:
525  DENDRO_TENSOR_IAX_APPLY_ELEM_2D(m_uiNrp,&(*(ipT_1D_0.begin())),in,im1); // along x
526  DENDRO_TENSOR_AIX_APPLY_ELEM_2D(m_uiNrp,&(*(ipT_1D_1.begin())),im1,out); // along y (in 3d z)
527  break;
528 
529  case 3:
530  DENDRO_TENSOR_IAX_APPLY_ELEM_2D(m_uiNrp,&(*(ipT_1D_1.begin())),in,im1); // along x
531  DENDRO_TENSOR_AIX_APPLY_ELEM_2D(m_uiNrp,&(*(ipT_1D_1.begin())),im1,out); // along y (in 3d z)
532  break;
533  default:
534  std::cout<<"[refel][error]: invalid child number specified for 2D interpolation."<<std::endl;
535  break;
536 
537  }
538 
539  #ifdef FEM_ACCUMILATE_ONES_TEST
540  for(unsigned int node=0;node<(m_uiNrp*m_uiNrp);node++)
541  out[node]=1.0;
542  #endif
543 
544 
545  }
546 
547 
548 
555  inline void I1D_Parent2Child(const double * in,double * out,unsigned int childNUm) const
556  {
557 
558  switch (childNUm)
559  {
560  case 0:
561  for(unsigned int i=0;i<m_uiNrp;i++)
562  {
563  out[i]=0.0;
564  for(unsigned int j=0;j<m_uiNrp;j++)
565  {
566  out[i]+=ip_1D_0[j*m_uiNrp+i]*in[j];
567  }
568  }
569  break;
570  case 1:
571  for(unsigned int i=0;i<m_uiNrp;i++)
572  {
573  out[i]=0.0;
574  for(unsigned int j=0;j<m_uiNrp;j++)
575  {
576  out[i]+=ip_1D_1[j*m_uiNrp+i]*in[j];
577  }
578  }
579  break;
580 
581  default:
582  std::cout<<"[refel][error]: Invalid child number specified for 1D interpolation. "<<std::endl;
583  break;
584 
585  }
586 
587  }
588 
589 
596  inline void I1D_Child2Parent(const double * in,double * out,unsigned int childNUm) const
597  {
598 
599  switch (childNUm)
600  {
601  case 0:
602  for(unsigned int i=0;i<m_uiNrp;i++)
603  {
604  out[i]=0.0;
605  for(unsigned int j=0;j<m_uiNrp;j++)
606  {
607  out[i]+=ipT_1D_0[j*m_uiNrp+i]*in[j];
608  }
609  }
610  break;
611  case 1:
612  for(unsigned int i=0;i<m_uiNrp;i++)
613  {
614  out[i]=0.0;
615  for(unsigned int j=0;j<m_uiNrp;j++)
616  {
617  out[i]+=ipT_1D_1[j*m_uiNrp+i]*in[j];
618  }
619  }
620  break;
621 
622  default:
623  std::cout<<"[refel][error]: Invalid child number specified for 1D interpolation. "<<std::endl;
624  break;
625 
626  }
627 
628  #ifdef FEM_ACCUMILATE_ONES_TEST
629  for(unsigned int node=0;node<(m_uiNrp);node++)
630  out[node]=1.0;
631  #endif
632 
633  }
634 
635 
636  void generateHeaderFile(char * fName);
637 
638  void computeFilterOp(unsigned int nc, unsigned int s);
639 
640 };
641 
642 #endif //SFCSORTBENCH_REFERENCEELEMENT_H
void I2D_Parent2Child(const double *in, double *out, unsigned int childNum) const
Definition: refel.h:460
void I3D_Parent2Child_FD(const double *in, double *out, unsigned int pw=3) const
performs parent to child interpolation in FD stencil.
Definition: refel.h:287
void I3D_Parent2Child(const double *in, double *out, unsigned int childNum) const
This is computed in way that 3d coordinates changes in the order of z, y, x Which means first we need...
Definition: refel.h:221
void I1D_Parent2Child(const double *in, double *out, unsigned int childNUm) const
Definition: refel.h:555
void I1D_Child2Parent(const double *in, double *out, unsigned int childNUm) const
Definition: refel.h:596
void I2D_Child2Parent(const double *in, double *out, unsigned int childNum) const
Definition: refel.h:505
RefElement()
Definition: refel.cpp:16
void I3D_Child2Parent(const double *in, double *out, unsigned int childNum) const
This is computed in way that 3d coordinates changes in the order of z, y, x Which means first we need...
Definition: refel.h:393
A set of efficient functions that use binary operations to perform some small computations.
Definition: refel.h:69