12 #ifndef SFCSORTBENCH_REFERENCEELEMENT_H 13 #define SFCSORTBENCH_REFERENCEELEMENT_H 15 #ifdef WITH_BLAS_LAPACK 27 #include "interpMatrices.h" 31 void dump_binary(
const T* in,
unsigned int n,
const char* fPrefix)
34 sprintf(fName,
"%s.bin",fPrefix);
35 std::ofstream ofile(fName,std::ios::binary);
37 ofile.write((
char*)&n,
sizeof(
int));
38 ofile.write((
char*)&in[0],
sizeof(T)*n);
47 void printArray_1D(
const T *a,
int length)
49 for (
int i = 0; i < length; i++) { std::cout<<a[i]<<
" "; }
55 void printArray_2D(
const T *a,
int length1,
int length2)
57 for (
int i = 0; i < length1; i++) {
58 for (
int j = 0; j < length2; j++) {
59 std::cout << a[i * length2 + j] <<
" ";
88 std::vector<double> u;
91 std::vector<double> r;
94 std::vector<double> u_0;
97 std::vector<double> u_1;
100 std::vector<double> g;
103 std::vector<double> w;
106 std::vector<double> wgll;
110 std::vector<double> ip_1D_0;
113 std::vector<double> ip_1D_1;
117 std::vector<double> ipT_1D_0;
120 std::vector<double> ipT_1D_1;
123 std::vector<double> Vr;
126 std::vector<double> Vu;
129 std::vector<double> Vg;
132 std::vector<double> gradVu;
135 std::vector<double> gradVr;
138 std::vector<double> gradVg;
141 std::vector<double> Dr;
144 std::vector<double> Dg;
147 std::vector<double> DgT;
150 std::vector<double> quad_1D;
153 std::vector<double> quadT_1D;
156 std::vector<double> Vu_0;
159 std::vector<double> Vu_1;
162 std::vector<double> im_vec1;
165 std::vector<double> im_vec2;
168 std::vector<double> Fr;
171 std::vector<double> gridT;
174 std::vector<double> out_p2c;
183 RefElement(
unsigned int dim,
unsigned int order);
186 inline int getOrder()
const {
return m_uiOrder;}
187 inline int getDim()
const {
return m_uiDimension;}
188 inline int get1DNumInterpolationPoints(){
return m_uiNrp;}
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()));}
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()));}
202 inline double * getImVec1() {
return &(*(im_vec1.begin()));}
203 inline double * getImVec2() {
return &(*(im_vec2.begin()));}
205 inline const double * getWgq()
const {
return &(*(w.begin()));}
206 inline const double * getWgll()
const {
return &(*(wgll.begin()));}
208 inline const double getElementSz()
const {
return (u.back()-u.front());}
224 double * im1=(
double *)&(*(im_vec1.begin()));
225 double * im2=(
double *)&(*(im_vec2.begin()));
230 DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),in,im1);
231 DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),im1,im2);
232 DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),im2,out);
235 DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),in,im1);
236 DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),im1,im2);
237 DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),im2,out);
241 DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),in,im1);
242 DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),im1,im2);
243 DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),im2,out);
246 DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),in,im1);
247 DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),im1,im2);
248 DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),im2,out);
251 DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),in,im1);
252 DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),im1,im2);
253 DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),im2,out);
256 DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),in,im1);
257 DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),im1,im2);
258 DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),im2,out);
261 DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_0.begin())),in,im1);
262 DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),im1,im2);
263 DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),im2,out);
266 DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),in,im1);
267 DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),im1,im2);
268 DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ip_1D_1.begin())),im2,out);
271 std::cout<<
"[refel][error]: invalid child number specified for 3D interpolation."<<std::endl;
289 assert(pw < m_uiNrp);
293 const unsigned int nx = m_uiNrp;
294 const unsigned int ny = m_uiNrp;
295 const unsigned int nz = m_uiNrp;
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};
300 const unsigned int c1d = 2*m_uiNrp-1;
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];
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];
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;
314 const unsigned int fd_1d = gridT.size();
315 const double * c = gridT.data();
320 double * out_p = (
double *)&(*(out_p2c.begin()));
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++)
327 out_p[ (k<<1u) * p2c2 + (j<<1u)*p2c1 + (i<<1u) ] = in[ k*pp2 + j*pp1 + i];
330 const unsigned int N =p2c1;
331 const unsigned int pw2 = pw<<1u;
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)
338 for(
unsigned int m=0; m < fd_1d ; m++)
339 s+= c[m]*out_p[ k*p2c2 + j * p2c1 + (i-4) + 2*m ];
341 out_p[ k * p2c2 + j*p2c1 + (i+1) ] =s;
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)
351 for(
unsigned int m=0; m < fd_1d ; m++)
352 s+= c[m]*out_p[ k * p2c2 + (j-4 + 2*m)* p2c1 + i ];
354 out_p[ k * p2c2 + (j+1)*p2c1 + (i) ] =s;
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)
364 for(
unsigned int m=0; m < fd_1d ; m++)
365 s+= c[m]*out_p[ (k-4 + 2*m) * p2c2 + (j)* p2c1 + i ];
367 out_p[ (k+1)* p2c2 + (j)*p2c1 + (i) ] =s;
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];
395 double * im1=(
double *)&(*(im_vec1.begin()));
396 double * im2=(
double *)&(*(im_vec2.begin()));
401 DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),in,im1);
402 DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),im1,im2);
403 DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),im2,out);
406 DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),in,im1);
407 DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),im1,im2);
408 DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),im2,out);
412 DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),in,im1);
413 DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),im1,im2);
414 DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),im2,out);
417 DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),in,im1);
418 DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),im1,im2);
419 DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),im2,out);
422 DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),in,im1);
423 DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),im1,im2);
424 DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),im2,out);
427 DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),in,im1);
428 DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),im1,im2);
429 DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),im2,out);
432 DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_0.begin())),in,im1);
433 DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),im1,im2);
434 DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),im2,out);
437 DENDRO_TENSOR_IIAX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),in,im1);
438 DENDRO_TENSOR_IAIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),im1,im2);
439 DENDRO_TENSOR_AIIX_APPLY_ELEM(m_uiNrp,&(*(ipT_1D_1.begin())),im2,out);
442 std::cout<<
"[refel][error]: invalid child number specified for 3D interpolation."<<std::endl;
447 #ifdef FEM_ACCUMILATE_ONES_TEST 448 for(
unsigned int node=0;node<(m_uiNrp*m_uiNrp*m_uiNrp);node++)
464 double * im1=(
double *)&(*(im_vec1.begin()));
465 double * im2=(
double *)&(*(im_vec2.begin()));
473 DENDRO_TENSOR_IAX_APPLY_ELEM_2D(m_uiNrp,&(*(ip_1D_0.begin())),in,im1);
474 DENDRO_TENSOR_AIX_APPLY_ELEM_2D(m_uiNrp,&(*(ip_1D_0.begin())),im1,out);
477 DENDRO_TENSOR_IAX_APPLY_ELEM_2D(m_uiNrp,&(*(ip_1D_1.begin())),in,im1);
478 DENDRO_TENSOR_AIX_APPLY_ELEM_2D(m_uiNrp,&(*(ip_1D_0.begin())),im1,out);
482 DENDRO_TENSOR_IAX_APPLY_ELEM_2D(m_uiNrp,&(*(ip_1D_0.begin())),in,im1);
483 DENDRO_TENSOR_AIX_APPLY_ELEM_2D(m_uiNrp,&(*(ip_1D_1.begin())),im1,out);
487 DENDRO_TENSOR_IAX_APPLY_ELEM_2D(m_uiNrp,&(*(ip_1D_1.begin())),in,im1);
488 DENDRO_TENSOR_AIX_APPLY_ELEM_2D(m_uiNrp,&(*(ip_1D_1.begin())),im1,out);
491 std::cout<<
"[refel][error]: invalid child number specified for 2D interpolation."<<std::endl;
509 double * im1=(
double *)&(*(im_vec1.begin()));
510 double * im2=(
double *)&(*(im_vec2.begin()));
516 DENDRO_TENSOR_IAX_APPLY_ELEM_2D(m_uiNrp,&(*(ipT_1D_0.begin())),in,im1);
517 DENDRO_TENSOR_AIX_APPLY_ELEM_2D(m_uiNrp,&(*(ipT_1D_0.begin())),im1,out);
520 DENDRO_TENSOR_IAX_APPLY_ELEM_2D(m_uiNrp,&(*(ipT_1D_1.begin())),in,im1);
521 DENDRO_TENSOR_AIX_APPLY_ELEM_2D(m_uiNrp,&(*(ipT_1D_0.begin())),im1,out);
525 DENDRO_TENSOR_IAX_APPLY_ELEM_2D(m_uiNrp,&(*(ipT_1D_0.begin())),in,im1);
526 DENDRO_TENSOR_AIX_APPLY_ELEM_2D(m_uiNrp,&(*(ipT_1D_1.begin())),im1,out);
530 DENDRO_TENSOR_IAX_APPLY_ELEM_2D(m_uiNrp,&(*(ipT_1D_1.begin())),in,im1);
531 DENDRO_TENSOR_AIX_APPLY_ELEM_2D(m_uiNrp,&(*(ipT_1D_1.begin())),im1,out);
534 std::cout<<
"[refel][error]: invalid child number specified for 2D interpolation."<<std::endl;
539 #ifdef FEM_ACCUMILATE_ONES_TEST 540 for(
unsigned int node=0;node<(m_uiNrp*m_uiNrp);node++)
561 for(
unsigned int i=0;i<m_uiNrp;i++)
564 for(
unsigned int j=0;j<m_uiNrp;j++)
566 out[i]+=ip_1D_0[j*m_uiNrp+i]*in[j];
571 for(
unsigned int i=0;i<m_uiNrp;i++)
574 for(
unsigned int j=0;j<m_uiNrp;j++)
576 out[i]+=ip_1D_1[j*m_uiNrp+i]*in[j];
582 std::cout<<
"[refel][error]: Invalid child number specified for 1D interpolation. "<<std::endl;
602 for(
unsigned int i=0;i<m_uiNrp;i++)
605 for(
unsigned int j=0;j<m_uiNrp;j++)
607 out[i]+=ipT_1D_0[j*m_uiNrp+i]*in[j];
612 for(
unsigned int i=0;i<m_uiNrp;i++)
615 for(
unsigned int j=0;j<m_uiNrp;j++)
617 out[i]+=ipT_1D_1[j*m_uiNrp+i]*in[j];
623 std::cout<<
"[refel][error]: Invalid child number specified for 1D interpolation. "<<std::endl;
628 #ifdef FEM_ACCUMILATE_ONES_TEST 629 for(
unsigned int node=0;node<(m_uiNrp);node++)
636 void generateHeaderFile(
char * fName);
638 void computeFilterOp(
unsigned int nc,
unsigned int s);
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.