/[escript]/branches/ripleygmg_from_3668/ripley/src/Brick.cpp
ViewVC logotype

Diff of /branches/ripleygmg_from_3668/ripley/src/Brick.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 3713 by caltinay, Tue Dec 6 04:43:29 2011 UTC revision 3722 by caltinay, Wed Dec 7 05:53:22 2011 UTC
# Line 376  void Brick::setToGradient(escript::Data& Line 376  void Brick::setToGradient(escript::Data&
376      } else if (out.getFunctionSpace().getTypeCode() == ReducedElements) {      } else if (out.getFunctionSpace().getTypeCode() == ReducedElements) {
377          /* GENERATOR SNIP_GRAD_REDUCED_ELEMENTS TOP */          /* GENERATOR SNIP_GRAD_REDUCED_ELEMENTS TOP */
378          const double tmp0_0 = -0.25/h0;          const double tmp0_0 = -0.25/h0;
         const double tmp0_4 = -0.25/h2;  
379          const double tmp0_1 = 0.25/h0;          const double tmp0_1 = 0.25/h0;
         const double tmp0_5 = 0.25/h2;  
380          const double tmp0_2 = -0.25/h1;          const double tmp0_2 = -0.25/h1;
381          const double tmp0_3 = 0.25/h1;          const double tmp0_3 = 0.25/h1;
382            const double tmp0_4 = -0.25/h2;
383            const double tmp0_5 = 0.25/h2;
384  #pragma omp parallel for  #pragma omp parallel for
385          for (index_t k2=0; k2 < m_NE2; ++k2) {          for (index_t k2=0; k2 < m_NE2; ++k2) {
386              for (index_t k1=0; k1 < m_NE1; ++k1) {              for (index_t k1=0; k1 < m_NE1; ++k1) {
# Line 405  void Brick::setToGradient(escript::Data& Line 405  void Brick::setToGradient(escript::Data&
405          /* GENERATOR SNIP_GRAD_REDUCED_ELEMENTS BOTTOM */          /* GENERATOR SNIP_GRAD_REDUCED_ELEMENTS BOTTOM */
406      } else if (out.getFunctionSpace().getTypeCode() == FaceElements) {      } else if (out.getFunctionSpace().getTypeCode() == FaceElements) {
407          /* GENERATOR SNIP_GRAD_FACES TOP */          /* GENERATOR SNIP_GRAD_FACES TOP */
408          if (m_faceOffset[0] > -1) {  #pragma omp parallel
409              const double tmp0_22 = 0.21132486540518711775/h1;          {
410              const double tmp0_16 = 0.16666666666666666667/h0;              if (m_faceOffset[0] > -1) {
411              const double tmp0_33 = 0.21132486540518711775/h2;                  const double tmp0_22 = 0.21132486540518711775/h1;
412              const double tmp0_0 = -0.62200846792814621559/h0;                  const double tmp0_16 = 0.16666666666666666667/h0;
413              const double tmp0_21 = -0.21132486540518711775/h1;                  const double tmp0_33 = 0.21132486540518711775/h2;
414              const double tmp0_17 = 0.62200846792814621559/h0;                  const double tmp0_0 = -0.62200846792814621559/h0;
415              const double tmp0_1 = -0.16666666666666666667/h0;                  const double tmp0_21 = -0.21132486540518711775/h1;
416              const double tmp0_20 = -0.78867513459481288225/h1;                  const double tmp0_17 = 0.62200846792814621559/h0;
417              const double tmp0_14 = -0.044658198738520451079/h0;                  const double tmp0_1 = -0.16666666666666666667/h0;
418              const double tmp0_2 = 0.16666666666666666667/h0;                  const double tmp0_20 = -0.78867513459481288225/h1;
419              const double tmp0_27 = 0.21132486540518711775/h1;                  const double tmp0_14 = -0.044658198738520451079/h0;
420              const double tmp0_15 = -0.16666666666666666667/h0;                  const double tmp0_2 = 0.16666666666666666667/h0;
421              const double tmp0_3 = 0.044658198738520451079/h0;                  const double tmp0_27 = 0.21132486540518711775/h1;
422              const double tmp0_26 = 0.78867513459481288225/h1;                  const double tmp0_15 = -0.16666666666666666667/h0;
423              const double tmp0_12 = -0.62200846792814621559/h0;                  const double tmp0_3 = 0.044658198738520451079/h0;
424              const double tmp0_25 = -0.78867513459481288225/h1;                  const double tmp0_26 = 0.78867513459481288225/h1;
425              const double tmp0_13 = 0.16666666666666666667/h0;                  const double tmp0_12 = -0.62200846792814621559/h0;
426              const double tmp0_24 = -0.21132486540518711775/h1;                  const double tmp0_25 = -0.78867513459481288225/h1;
427              const double tmp0_10 = 0.62200846792814621559/h0;                  const double tmp0_13 = 0.16666666666666666667/h0;
428              const double tmp0_11 = -0.16666666666666666667/h0;                  const double tmp0_24 = -0.21132486540518711775/h1;
429              const double tmp0_34 = 0.78867513459481288225/h2;                  const double tmp0_10 = 0.62200846792814621559/h0;
430              const double tmp0_35 = -0.78867513459481288225/h2;                  const double tmp0_11 = -0.16666666666666666667/h0;
431              const double tmp0_8 = 0.044658198738520451079/h0;                  const double tmp0_34 = 0.78867513459481288225/h2;
432              const double tmp0_29 = 0.78867513459481288225/h2;                  const double tmp0_35 = -0.78867513459481288225/h2;
433              const double tmp0_9 = 0.16666666666666666667/h0;                  const double tmp0_8 = 0.044658198738520451079/h0;
434              const double tmp0_30 = 0.21132486540518711775/h2;                  const double tmp0_29 = 0.78867513459481288225/h2;
435              const double tmp0_28 = -0.78867513459481288225/h2;                  const double tmp0_9 = 0.16666666666666666667/h0;
436              const double tmp0_32 = -0.21132486540518711775/h2;                  const double tmp0_30 = 0.21132486540518711775/h2;
437              const double tmp0_31 = -0.21132486540518711775/h2;                  const double tmp0_28 = -0.78867513459481288225/h2;
438              const double tmp0_18 = -0.62200846792814621559/h0;                  const double tmp0_32 = -0.21132486540518711775/h2;
439              const double tmp0_4 = -0.044658198738520451079/h0;                  const double tmp0_31 = -0.21132486540518711775/h2;
440              const double tmp0_19 = 0.044658198738520451079/h0;                  const double tmp0_18 = -0.62200846792814621559/h0;
441              const double tmp0_5 = 0.62200846792814621559/h0;                  const double tmp0_4 = -0.044658198738520451079/h0;
442              const double tmp0_6 = -0.16666666666666666667/h0;                  const double tmp0_19 = 0.044658198738520451079/h0;
443              const double tmp0_23 = 0.78867513459481288225/h1;                  const double tmp0_5 = 0.62200846792814621559/h0;
444              const double tmp0_7 = -0.044658198738520451079/h0;                  const double tmp0_6 = -0.16666666666666666667/h0;
445  #pragma omp parallel for                  const double tmp0_23 = 0.78867513459481288225/h1;
446              for (index_t k2=0; k2 < m_NE2; ++k2) {                  const double tmp0_7 = -0.044658198738520451079/h0;
447    #pragma omp for nowait
448                    for (index_t k2=0; k2 < m_NE2; ++k2) {
449                        for (index_t k1=0; k1 < m_NE1; ++k1) {
450                            const register double* f_000 = in.getSampleDataRO(INDEX3(0,k1,k2, m_N0,m_N1));
451                            const register double* f_001 = in.getSampleDataRO(INDEX3(0,k1,k2+1, m_N0,m_N1));
452                            const register double* f_101 = in.getSampleDataRO(INDEX3(1,k1,k2+1, m_N0,m_N1));
453                            const register double* f_111 = in.getSampleDataRO(INDEX3(1,k1+1,k2+1, m_N0,m_N1));
454                            const register double* f_110 = in.getSampleDataRO(INDEX3(1,k1+1,k2, m_N0,m_N1));
455                            const register double* f_011 = in.getSampleDataRO(INDEX3(0,k1+1,k2+1, m_N0,m_N1));
456                            const register double* f_010 = in.getSampleDataRO(INDEX3(0,k1+1,k2, m_N0,m_N1));
457                            const register double* f_100 = in.getSampleDataRO(INDEX3(1,k1,k2, m_N0,m_N1));
458                            double* o = out.getSampleDataRW(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));
459                            for (index_t i=0; i < numComp; ++i) {
460                                o[INDEX3(i,0,0,numComp,3)] = f_000[i]*tmp0_0 + f_011[i]*tmp0_4 + f_100[i]*tmp0_5 + f_111[i]*tmp0_3 + tmp0_1*(f_001[i] + f_010[i]) + tmp0_2*(f_101[i] + f_110[i]);
461                                o[INDEX3(i,1,0,numComp,3)] = f_000[i]*tmp0_20 + f_001[i]*tmp0_21 + f_010[i]*tmp0_23 + f_011[i]*tmp0_22;
462                                o[INDEX3(i,2,0,numComp,3)] = f_000[i]*tmp0_28 + f_001[i]*tmp0_29 + f_010[i]*tmp0_31 + f_011[i]*tmp0_30;
463                                o[INDEX3(i,0,1,numComp,3)] = f_000[i]*tmp0_6 + f_001[i]*tmp0_7 + f_010[i]*tmp0_12 + f_011[i]*tmp0_11 + f_100[i]*tmp0_13 + f_101[i]*tmp0_8 + f_110[i]*tmp0_10 + f_111[i]*tmp0_9;
464                                o[INDEX3(i,1,1,numComp,3)] = f_000[i]*tmp0_20 + f_001[i]*tmp0_21 + f_010[i]*tmp0_23 + f_011[i]*tmp0_22;
465                                o[INDEX3(i,2,1,numComp,3)] = f_000[i]*tmp0_32 + f_001[i]*tmp0_33 + f_010[i]*tmp0_35 + f_011[i]*tmp0_34;
466                                o[INDEX3(i,0,2,numComp,3)] = f_000[i]*tmp0_6 + f_001[i]*tmp0_12 + f_010[i]*tmp0_7 + f_011[i]*tmp0_11 + f_100[i]*tmp0_13 + f_101[i]*tmp0_10 + f_110[i]*tmp0_8 + f_111[i]*tmp0_9;
467                                o[INDEX3(i,1,2,numComp,3)] = f_000[i]*tmp0_24 + f_001[i]*tmp0_25 + f_010[i]*tmp0_27 + f_011[i]*tmp0_26;
468                                o[INDEX3(i,2,2,numComp,3)] = f_000[i]*tmp0_28 + f_001[i]*tmp0_29 + f_010[i]*tmp0_31 + f_011[i]*tmp0_30;
469                                o[INDEX3(i,0,3,numComp,3)] = f_000[i]*tmp0_14 + f_011[i]*tmp0_18 + f_100[i]*tmp0_19 + f_111[i]*tmp0_17 + tmp0_15*(f_001[i] + f_010[i]) + tmp0_16*(f_101[i] + f_110[i]);
470                                o[INDEX3(i,1,3,numComp,3)] = f_000[i]*tmp0_24 + f_001[i]*tmp0_25 + f_010[i]*tmp0_27 + f_011[i]*tmp0_26;
471                                o[INDEX3(i,2,3,numComp,3)] = f_000[i]*tmp0_32 + f_001[i]*tmp0_33 + f_010[i]*tmp0_35 + f_011[i]*tmp0_34;
472                            } /* end of component loop i */
473                        } /* end of k1 loop */
474                    } /* end of k2 loop */
475                } /* end of face 0 */
476                if (m_faceOffset[1] > -1) {
477                    const double tmp0_22 = 0.78867513459481288225/h1;
478                    const double tmp0_16 = 0.16666666666666666667/h0;
479                    const double tmp0_33 = 0.78867513459481288225/h2;
480                    const double tmp0_0 = -0.62200846792814621559/h0;
481                    const double tmp0_21 = 0.21132486540518711775/h1;
482                    const double tmp0_17 = 0.62200846792814621559/h0;
483                    const double tmp0_1 = -0.16666666666666666667/h0;
484                    const double tmp0_20 = -0.21132486540518711775/h1;
485                    const double tmp0_14 = -0.044658198738520451079/h0;
486                    const double tmp0_2 = 0.16666666666666666667/h0;
487                    const double tmp0_27 = -0.21132486540518711775/h1;
488                    const double tmp0_15 = -0.16666666666666666667/h0;
489                    const double tmp0_3 = 0.044658198738520451079/h0;
490                    const double tmp0_26 = 0.21132486540518711775/h1;
491                    const double tmp0_12 = -0.62200846792814621559/h0;
492                    const double tmp0_25 = 0.78867513459481288225/h1;
493                    const double tmp0_13 = 0.16666666666666666667/h0;
494                    const double tmp0_24 = -0.78867513459481288225/h1;
495                    const double tmp0_10 = 0.62200846792814621559/h0;
496                    const double tmp0_11 = -0.16666666666666666667/h0;
497                    const double tmp0_34 = -0.78867513459481288225/h2;
498                    const double tmp0_35 = -0.21132486540518711775/h2;
499                    const double tmp0_8 = 0.044658198738520451079/h0;
500                    const double tmp0_29 = 0.21132486540518711775/h2;
501                    const double tmp0_9 = 0.16666666666666666667/h0;
502                    const double tmp0_30 = -0.21132486540518711775/h2;
503                    const double tmp0_28 = 0.78867513459481288225/h2;
504                    const double tmp0_32 = 0.21132486540518711775/h2;
505                    const double tmp0_31 = -0.78867513459481288225/h2;
506                    const double tmp0_18 = -0.62200846792814621559/h0;
507                    const double tmp0_4 = -0.044658198738520451079/h0;
508                    const double tmp0_19 = 0.044658198738520451079/h0;
509                    const double tmp0_5 = 0.62200846792814621559/h0;
510                    const double tmp0_6 = -0.16666666666666666667/h0;
511                    const double tmp0_23 = -0.78867513459481288225/h1;
512                    const double tmp0_7 = -0.044658198738520451079/h0;
513    #pragma omp for nowait
514                    for (index_t k2=0; k2 < m_NE2; ++k2) {
515                        for (index_t k1=0; k1 < m_NE1; ++k1) {
516                            const register double* f_000 = in.getSampleDataRO(INDEX3(m_N0-2,k1,k2, m_N0,m_N1));
517                            const register double* f_001 = in.getSampleDataRO(INDEX3(m_N0-2,k1,k2+1, m_N0,m_N1));
518                            const register double* f_101 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2+1, m_N0,m_N1));
519                            const register double* f_111 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2+1, m_N0,m_N1));
520                            const register double* f_110 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2, m_N0,m_N1));
521                            const register double* f_011 = in.getSampleDataRO(INDEX3(m_N0-2,k1+1,k2+1, m_N0,m_N1));
522                            const register double* f_010 = in.getSampleDataRO(INDEX3(m_N0-2,k1+1,k2, m_N0,m_N1));
523                            const register double* f_100 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2, m_N0,m_N1));
524                            double* o = out.getSampleDataRW(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));
525                            for (index_t i=0; i < numComp; ++i) {
526                                o[INDEX3(i,0,0,numComp,3)] = f_000[i]*tmp0_0 + f_011[i]*tmp0_4 + f_100[i]*tmp0_5 + f_111[i]*tmp0_3 + tmp0_1*(f_001[i] + f_010[i]) + tmp0_2*(f_101[i] + f_110[i]);
527                                o[INDEX3(i,1,0,numComp,3)] = f_100[i]*tmp0_23 + f_101[i]*tmp0_20 + f_110[i]*tmp0_22 + f_111[i]*tmp0_21;
528                                o[INDEX3(i,2,0,numComp,3)] = f_100[i]*tmp0_31 + f_101[i]*tmp0_28 + f_110[i]*tmp0_30 + f_111[i]*tmp0_29;
529                                o[INDEX3(i,0,1,numComp,3)] = f_000[i]*tmp0_6 + f_001[i]*tmp0_7 + f_010[i]*tmp0_12 + f_011[i]*tmp0_11 + f_100[i]*tmp0_13 + f_101[i]*tmp0_8 + f_110[i]*tmp0_10 + f_111[i]*tmp0_9;
530                                o[INDEX3(i,1,1,numComp,3)] = f_100[i]*tmp0_23 + f_101[i]*tmp0_20 + f_110[i]*tmp0_22 + f_111[i]*tmp0_21;
531                                o[INDEX3(i,2,1,numComp,3)] = f_100[i]*tmp0_35 + f_101[i]*tmp0_32 + f_110[i]*tmp0_34 + f_111[i]*tmp0_33;
532                                o[INDEX3(i,0,2,numComp,3)] = f_000[i]*tmp0_6 + f_001[i]*tmp0_12 + f_010[i]*tmp0_7 + f_011[i]*tmp0_11 + f_100[i]*tmp0_13 + f_101[i]*tmp0_10 + f_110[i]*tmp0_8 + f_111[i]*tmp0_9;
533                                o[INDEX3(i,1,2,numComp,3)] = f_100[i]*tmp0_27 + f_101[i]*tmp0_24 + f_110[i]*tmp0_26 + f_111[i]*tmp0_25;
534                                o[INDEX3(i,2,2,numComp,3)] = f_100[i]*tmp0_31 + f_101[i]*tmp0_28 + f_110[i]*tmp0_30 + f_111[i]*tmp0_29;
535                                o[INDEX3(i,0,3,numComp,3)] = f_000[i]*tmp0_14 + f_011[i]*tmp0_18 + f_100[i]*tmp0_19 + f_111[i]*tmp0_17 + tmp0_15*(f_001[i] + f_010[i]) + tmp0_16*(f_101[i] + f_110[i]);
536                                o[INDEX3(i,1,3,numComp,3)] = f_100[i]*tmp0_27 + f_101[i]*tmp0_24 + f_110[i]*tmp0_26 + f_111[i]*tmp0_25;
537                                o[INDEX3(i,2,3,numComp,3)] = f_100[i]*tmp0_35 + f_101[i]*tmp0_32 + f_110[i]*tmp0_34 + f_111[i]*tmp0_33;
538                            } /* end of component loop i */
539                        } /* end of k1 loop */
540                    } /* end of k2 loop */
541                } /* end of face 1 */
542                if (m_faceOffset[2] > -1) {
543                    const double tmp0_22 = -0.044658198738520451079/h1;
544                    const double tmp0_16 = -0.16666666666666666667/h1;
545                    const double tmp0_33 = 0.21132486540518711775/h2;
546                    const double tmp0_0 = -0.78867513459481288225/h0;
547                    const double tmp0_21 = 0.16666666666666666667/h1;
548                    const double tmp0_17 = -0.62200846792814621559/h1;
549                    const double tmp0_1 = -0.21132486540518711775/h0;
550                    const double tmp0_20 = 0.044658198738520451079/h1;
551                    const double tmp0_14 = -0.16666666666666666667/h1;
552                    const double tmp0_2 = 0.21132486540518711775/h0;
553                    const double tmp0_27 = 0.044658198738520451079/h1;
554                    const double tmp0_15 = -0.044658198738520451079/h1;
555                    const double tmp0_3 = 0.78867513459481288225/h0;
556                    const double tmp0_26 = 0.16666666666666666667/h1;
557                    const double tmp0_12 = 0.16666666666666666667/h1;
558                    const double tmp0_25 = 0.62200846792814621559/h1;
559                    const double tmp0_13 = 0.62200846792814621559/h1;
560                    const double tmp0_24 = -0.62200846792814621559/h1;
561                    const double tmp0_10 = -0.044658198738520451079/h1;
562                    const double tmp0_11 = 0.044658198738520451079/h1;
563                    const double tmp0_34 = 0.78867513459481288225/h2;
564                    const double tmp0_35 = -0.78867513459481288225/h2;
565                    const double tmp0_8 = -0.62200846792814621559/h1;
566                    const double tmp0_29 = 0.78867513459481288225/h2;
567                    const double tmp0_9 = -0.16666666666666666667/h1;
568                    const double tmp0_30 = 0.21132486540518711775/h2;
569                    const double tmp0_28 = -0.78867513459481288225/h2;
570                    const double tmp0_32 = -0.21132486540518711775/h2;
571                    const double tmp0_31 = -0.21132486540518711775/h2;
572                    const double tmp0_18 = 0.16666666666666666667/h1;
573                    const double tmp0_4 = -0.21132486540518711775/h0;
574                    const double tmp0_19 = 0.62200846792814621559/h1;
575                    const double tmp0_5 = -0.78867513459481288225/h0;
576                    const double tmp0_6 = 0.78867513459481288225/h0;
577                    const double tmp0_23 = -0.16666666666666666667/h1;
578                    const double tmp0_7 = 0.21132486540518711775/h0;
579    #pragma omp for nowait
580                    for (index_t k2=0; k2 < m_NE2; ++k2) {
581                        for (index_t k0=0; k0 < m_NE0; ++k0) {
582                            const register double* f_000 = in.getSampleDataRO(INDEX3(k0,0,k2, m_N0,m_N1));
583                            const register double* f_001 = in.getSampleDataRO(INDEX3(k0,0,k2+1, m_N0,m_N1));
584                            const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,0,k2+1, m_N0,m_N1));
585                            const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,0,k2, m_N0,m_N1));
586                            const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,1,k2+1, m_N0,m_N1));
587                            const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,1,k2, m_N0,m_N1));
588                            const register double* f_011 = in.getSampleDataRO(INDEX3(k0,1,k2+1, m_N0,m_N1));
589                            const register double* f_010 = in.getSampleDataRO(INDEX3(k0,1,k2, m_N0,m_N1));
590                            double* o = out.getSampleDataRW(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));
591                            for (index_t i=0; i < numComp; ++i) {
592                                o[INDEX3(i,0,0,numComp,3)] = f_000[i]*tmp0_0 + f_001[i]*tmp0_1 + f_100[i]*tmp0_3 + f_101[i]*tmp0_2;
593                                o[INDEX3(i,1,0,numComp,3)] = f_000[i]*tmp0_8 + f_010[i]*tmp0_13 + f_101[i]*tmp0_10 + f_111[i]*tmp0_11 + tmp0_12*(f_011[i] + f_110[i]) + tmp0_9*(f_001[i] + f_100[i]);
594                                o[INDEX3(i,2,0,numComp,3)] = f_000[i]*tmp0_28 + f_001[i]*tmp0_29 + f_100[i]*tmp0_31 + f_101[i]*tmp0_30;
595                                o[INDEX3(i,0,1,numComp,3)] = f_000[i]*tmp0_0 + f_001[i]*tmp0_1 + f_100[i]*tmp0_3 + f_101[i]*tmp0_2;
596                                o[INDEX3(i,1,1,numComp,3)] = f_000[i]*tmp0_14 + f_001[i]*tmp0_15 + f_010[i]*tmp0_21 + f_011[i]*tmp0_20 + f_100[i]*tmp0_17 + f_101[i]*tmp0_16 + f_110[i]*tmp0_19 + f_111[i]*tmp0_18;
597                                o[INDEX3(i,2,1,numComp,3)] = f_000[i]*tmp0_32 + f_001[i]*tmp0_33 + f_100[i]*tmp0_35 + f_101[i]*tmp0_34;
598                                o[INDEX3(i,0,2,numComp,3)] = f_000[i]*tmp0_4 + f_001[i]*tmp0_5 + f_100[i]*tmp0_7 + f_101[i]*tmp0_6;
599                                o[INDEX3(i,1,2,numComp,3)] = f_000[i]*tmp0_14 + f_001[i]*tmp0_17 + f_010[i]*tmp0_21 + f_011[i]*tmp0_19 + f_100[i]*tmp0_15 + f_101[i]*tmp0_16 + f_110[i]*tmp0_20 + f_111[i]*tmp0_18;
600                                o[INDEX3(i,2,2,numComp,3)] = f_000[i]*tmp0_28 + f_001[i]*tmp0_29 + f_100[i]*tmp0_31 + f_101[i]*tmp0_30;
601                                o[INDEX3(i,0,3,numComp,3)] = f_000[i]*tmp0_4 + f_001[i]*tmp0_5 + f_100[i]*tmp0_7 + f_101[i]*tmp0_6;
602                                o[INDEX3(i,1,3,numComp,3)] = f_000[i]*tmp0_22 + f_010[i]*tmp0_27 + f_101[i]*tmp0_24 + f_111[i]*tmp0_25 + tmp0_23*(f_001[i] + f_100[i]) + tmp0_26*(f_011[i] + f_110[i]);
603                                o[INDEX3(i,2,3,numComp,3)] = f_000[i]*tmp0_32 + f_001[i]*tmp0_33 + f_100[i]*tmp0_35 + f_101[i]*tmp0_34;
604                            } /* end of component loop i */
605                        } /* end of k0 loop */
606                    } /* end of k2 loop */
607                } /* end of face 2 */
608                if (m_faceOffset[3] > -1) {
609                    const double tmp0_22 = 0.16666666666666666667/h1;
610                    const double tmp0_16 = 0.16666666666666666667/h1;
611                    const double tmp0_33 = -0.78867513459481288225/h2;
612                    const double tmp0_0 = -0.21132486540518711775/h0;
613                    const double tmp0_21 = -0.62200846792814621559/h1;
614                    const double tmp0_17 = 0.16666666666666666667/h1;
615                    const double tmp0_1 = 0.78867513459481288225/h0;
616                    const double tmp0_20 = -0.16666666666666666667/h1;
617                    const double tmp0_14 = 0.044658198738520451079/h1;
618                    const double tmp0_2 = -0.78867513459481288225/h0;
619                    const double tmp0_27 = -0.62200846792814621559/h1;
620                    const double tmp0_15 = 0.62200846792814621559/h1;
621                    const double tmp0_3 = 0.21132486540518711775/h0;
622                    const double tmp0_26 = -0.16666666666666666667/h1;
623                    const double tmp0_12 = -0.16666666666666666667/h1;
624                    const double tmp0_25 = -0.044658198738520451079/h1;
625                    const double tmp0_13 = -0.044658198738520451079/h1;
626                    const double tmp0_24 = 0.62200846792814621559/h1;
627                    const double tmp0_10 = 0.044658198738520451079/h1;
628                    const double tmp0_11 = -0.62200846792814621559/h1;
629                    const double tmp0_34 = -0.21132486540518711775/h2;
630                    const double tmp0_35 = 0.78867513459481288225/h2;
631                    const double tmp0_8 = 0.16666666666666666667/h1;
632                    const double tmp0_29 = -0.21132486540518711775/h2;
633                    const double tmp0_9 = 0.62200846792814621559/h1;
634                    const double tmp0_30 = -0.78867513459481288225/h2;
635                    const double tmp0_28 = 0.78867513459481288225/h2;
636                    const double tmp0_32 = 0.21132486540518711775/h2;
637                    const double tmp0_31 = 0.21132486540518711775/h2;
638                    const double tmp0_18 = -0.16666666666666666667/h1;
639                    const double tmp0_4 = -0.78867513459481288225/h0;
640                    const double tmp0_19 = -0.044658198738520451079/h1;
641                    const double tmp0_5 = 0.21132486540518711775/h0;
642                    const double tmp0_6 = -0.21132486540518711775/h0;
643                    const double tmp0_23 = 0.044658198738520451079/h1;
644                    const double tmp0_7 = 0.78867513459481288225/h0;
645    #pragma omp for nowait
646                    for (index_t k2=0; k2 < m_NE2; ++k2) {
647                        for (index_t k0=0; k0 < m_NE0; ++k0) {
648                            const register double* f_011 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2+1, m_N0,m_N1));
649                            const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2, m_N0,m_N1));
650                            const register double* f_010 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2, m_N0,m_N1));
651                            const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2+1, m_N0,m_N1));
652                            const register double* f_000 = in.getSampleDataRO(INDEX3(k0,m_N1-2,k2, m_N0,m_N1));
653                            const register double* f_001 = in.getSampleDataRO(INDEX3(k0,m_N1-2,k2+1, m_N0,m_N1));
654                            const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,m_N1-2,k2+1, m_N0,m_N1));
655                            const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,m_N1-2,k2, m_N0,m_N1));
656                            double* o = out.getSampleDataRW(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));
657                            for (index_t i=0; i < numComp; ++i) {
658                                o[INDEX3(i,0,0,numComp,3)] = f_010[i]*tmp0_2 + f_011[i]*tmp0_0 + f_110[i]*tmp0_1 + f_111[i]*tmp0_3;
659                                o[INDEX3(i,1,0,numComp,3)] = f_000[i]*tmp0_11 + f_010[i]*tmp0_9 + f_101[i]*tmp0_13 + f_111[i]*tmp0_10 + tmp0_12*(f_001[i] + f_100[i]) + tmp0_8*(f_011[i] + f_110[i]);
660                                o[INDEX3(i,2,0,numComp,3)] = f_010[i]*tmp0_30 + f_011[i]*tmp0_28 + f_110[i]*tmp0_29 + f_111[i]*tmp0_31;
661                                o[INDEX3(i,0,1,numComp,3)] = f_010[i]*tmp0_2 + f_011[i]*tmp0_0 + f_110[i]*tmp0_1 + f_111[i]*tmp0_3;
662                                o[INDEX3(i,1,1,numComp,3)] = f_000[i]*tmp0_18 + f_001[i]*tmp0_19 + f_010[i]*tmp0_16 + f_011[i]*tmp0_14 + f_100[i]*tmp0_21 + f_101[i]*tmp0_20 + f_110[i]*tmp0_15 + f_111[i]*tmp0_17;
663                                o[INDEX3(i,2,1,numComp,3)] = f_010[i]*tmp0_34 + f_011[i]*tmp0_32 + f_110[i]*tmp0_33 + f_111[i]*tmp0_35;
664                                o[INDEX3(i,0,2,numComp,3)] = f_010[i]*tmp0_6 + f_011[i]*tmp0_4 + f_110[i]*tmp0_5 + f_111[i]*tmp0_7;
665                                o[INDEX3(i,1,2,numComp,3)] = f_000[i]*tmp0_18 + f_001[i]*tmp0_21 + f_010[i]*tmp0_16 + f_011[i]*tmp0_15 + f_100[i]*tmp0_19 + f_101[i]*tmp0_20 + f_110[i]*tmp0_14 + f_111[i]*tmp0_17;
666                                o[INDEX3(i,2,2,numComp,3)] = f_010[i]*tmp0_30 + f_011[i]*tmp0_28 + f_110[i]*tmp0_29 + f_111[i]*tmp0_31;
667                                o[INDEX3(i,0,3,numComp,3)] = f_010[i]*tmp0_6 + f_011[i]*tmp0_4 + f_110[i]*tmp0_5 + f_111[i]*tmp0_7;
668                                o[INDEX3(i,1,3,numComp,3)] = f_000[i]*tmp0_25 + f_010[i]*tmp0_23 + f_101[i]*tmp0_27 + f_111[i]*tmp0_24 + tmp0_22*(f_011[i] + f_110[i]) + tmp0_26*(f_001[i] + f_100[i]);
669                                o[INDEX3(i,2,3,numComp,3)] = f_010[i]*tmp0_34 + f_011[i]*tmp0_32 + f_110[i]*tmp0_33 + f_111[i]*tmp0_35;
670                            } /* end of component loop i */
671                        } /* end of k0 loop */
672                    } /* end of k2 loop */
673                } /* end of face 3 */
674                if (m_faceOffset[4] > -1) {
675                    const double tmp0_22 = -0.16666666666666666667/h2;
676                    const double tmp0_16 = -0.62200846792814621559/h2;
677                    const double tmp0_33 = 0.044658198738520451079/h2;
678                    const double tmp0_0 = -0.78867513459481288225/h0;
679                    const double tmp0_21 = 0.044658198738520451079/h2;
680                    const double tmp0_17 = -0.16666666666666666667/h2;
681                    const double tmp0_1 = 0.78867513459481288225/h0;
682                    const double tmp0_20 = 0.16666666666666666667/h2;
683                    const double tmp0_14 = 0.78867513459481288225/h1;
684                    const double tmp0_2 = 0.21132486540518711775/h0;
685                    const double tmp0_27 = 0.62200846792814621559/h2;
686                    const double tmp0_15 = 0.21132486540518711775/h1;
687                    const double tmp0_3 = -0.21132486540518711775/h0;
688                    const double tmp0_26 = 0.16666666666666666667/h2;
689                    const double tmp0_12 = -0.21132486540518711775/h1;
690                    const double tmp0_25 = -0.044658198738520451079/h2;
691                    const double tmp0_13 = -0.78867513459481288225/h1;
692                    const double tmp0_24 = -0.16666666666666666667/h2;
693                    const double tmp0_10 = 0.21132486540518711775/h1;
694                    const double tmp0_11 = 0.78867513459481288225/h1;
695                    const double tmp0_34 = 0.16666666666666666667/h2;
696                    const double tmp0_35 = 0.62200846792814621559/h2;
697                    const double tmp0_8 = -0.78867513459481288225/h1;
698                    const double tmp0_29 = 0.16666666666666666667/h2;
699                    const double tmp0_9 = -0.21132486540518711775/h1;
700                    const double tmp0_30 = -0.044658198738520451079/h2;
701                    const double tmp0_28 = 0.044658198738520451079/h2;
702                    const double tmp0_32 = -0.62200846792814621559/h2;
703                    const double tmp0_31 = -0.16666666666666666667/h2;
704                    const double tmp0_18 = -0.044658198738520451079/h2;
705                    const double tmp0_4 = -0.21132486540518711775/h0;
706                    const double tmp0_19 = 0.62200846792814621559/h2;
707                    const double tmp0_5 = 0.21132486540518711775/h0;
708                    const double tmp0_6 = 0.78867513459481288225/h0;
709                    const double tmp0_23 = -0.62200846792814621559/h2;
710                    const double tmp0_7 = -0.78867513459481288225/h0;
711    #pragma omp for nowait
712                  for (index_t k1=0; k1 < m_NE1; ++k1) {                  for (index_t k1=0; k1 < m_NE1; ++k1) {
713                      const register double* f_000 = in.getSampleDataRO(INDEX3(0,k1,k2, m_N0,m_N1));                      for (index_t k0=0; k0 < m_NE0; ++k0) {
714                      const register double* f_001 = in.getSampleDataRO(INDEX3(0,k1,k2+1, m_N0,m_N1));                          const register double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,0, m_N0,m_N1));
715                      const register double* f_101 = in.getSampleDataRO(INDEX3(1,k1,k2+1, m_N0,m_N1));                          const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,0, m_N0,m_N1));
716                      const register double* f_111 = in.getSampleDataRO(INDEX3(1,k1+1,k2+1, m_N0,m_N1));                          const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,0, m_N0,m_N1));
717                      const register double* f_110 = in.getSampleDataRO(INDEX3(1,k1+1,k2, m_N0,m_N1));                          const register double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,0, m_N0,m_N1));
718                      const register double* f_011 = in.getSampleDataRO(INDEX3(0,k1+1,k2+1, m_N0,m_N1));                          const register double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,1, m_N0,m_N1));
719                      const register double* f_010 = in.getSampleDataRO(INDEX3(0,k1+1,k2, m_N0,m_N1));                          const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,1, m_N0,m_N1));
720                      const register double* f_100 = in.getSampleDataRO(INDEX3(1,k1,k2, m_N0,m_N1));                          const register double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,1, m_N0,m_N1));
721                      double* o = out.getSampleDataRW(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));                          const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,1, m_N0,m_N1));
722                      for (index_t i=0; i < numComp; ++i) {                          double* o = out.getSampleDataRW(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));
723                          o[INDEX3(i,0,0,numComp,3)] = f_000[i]*tmp0_0 + f_011[i]*tmp0_4 + f_100[i]*tmp0_5 + f_111[i]*tmp0_3 + tmp0_1*(f_001[i] + f_010[i]) + tmp0_2*(f_101[i] + f_110[i]);                          for (index_t i=0; i < numComp; ++i) {
724                          o[INDEX3(i,1,0,numComp,3)] = f_000[i]*tmp0_20 + f_001[i]*tmp0_21 + f_010[i]*tmp0_23 + f_011[i]*tmp0_22;                              o[INDEX3(i,0,0,numComp,3)] = f_000[i]*tmp0_0 + f_010[i]*tmp0_3 + f_100[i]*tmp0_1 + f_110[i]*tmp0_2;
725                          o[INDEX3(i,2,0,numComp,3)] = f_000[i]*tmp0_28 + f_001[i]*tmp0_29 + f_010[i]*tmp0_31 + f_011[i]*tmp0_30;                              o[INDEX3(i,1,0,numComp,3)] = f_000[i]*tmp0_8 + f_010[i]*tmp0_11 + f_100[i]*tmp0_9 + f_110[i]*tmp0_10;
726                          o[INDEX3(i,0,1,numComp,3)] = f_000[i]*tmp0_6 + f_001[i]*tmp0_7 + f_010[i]*tmp0_12 + f_011[i]*tmp0_11 + f_100[i]*tmp0_13 + f_101[i]*tmp0_8 + f_110[i]*tmp0_10 + f_111[i]*tmp0_9;                              o[INDEX3(i,2,0,numComp,3)] = f_000[i]*tmp0_16 + f_001[i]*tmp0_19 + f_110[i]*tmp0_18 + f_111[i]*tmp0_21 + tmp0_17*(f_010[i] + f_100[i]) + tmp0_20*(f_011[i] + f_101[i]);
727                          o[INDEX3(i,1,1,numComp,3)] = f_000[i]*tmp0_20 + f_001[i]*tmp0_21 + f_010[i]*tmp0_23 + f_011[i]*tmp0_22;                              o[INDEX3(i,0,1,numComp,3)] = f_000[i]*tmp0_0 + f_010[i]*tmp0_3 + f_100[i]*tmp0_1 + f_110[i]*tmp0_2;
728                          o[INDEX3(i,2,1,numComp,3)] = f_000[i]*tmp0_32 + f_001[i]*tmp0_33 + f_010[i]*tmp0_35 + f_011[i]*tmp0_34;                              o[INDEX3(i,1,1,numComp,3)] = f_000[i]*tmp0_12 + f_010[i]*tmp0_15 + f_100[i]*tmp0_13 + f_110[i]*tmp0_14;
729                          o[INDEX3(i,0,2,numComp,3)] = f_000[i]*tmp0_6 + f_001[i]*tmp0_12 + f_010[i]*tmp0_7 + f_011[i]*tmp0_11 + f_100[i]*tmp0_13 + f_101[i]*tmp0_10 + f_110[i]*tmp0_8 + f_111[i]*tmp0_9;                              o[INDEX3(i,2,1,numComp,3)] = f_000[i]*tmp0_22 + f_001[i]*tmp0_26 + f_010[i]*tmp0_25 + f_011[i]*tmp0_28 + f_100[i]*tmp0_23 + f_101[i]*tmp0_27 + f_110[i]*tmp0_24 + f_111[i]*tmp0_29;
730                          o[INDEX3(i,1,2,numComp,3)] = f_000[i]*tmp0_24 + f_001[i]*tmp0_25 + f_010[i]*tmp0_27 + f_011[i]*tmp0_26;                              o[INDEX3(i,0,2,numComp,3)] = f_000[i]*tmp0_4 + f_010[i]*tmp0_7 + f_100[i]*tmp0_5 + f_110[i]*tmp0_6;
731                          o[INDEX3(i,2,2,numComp,3)] = f_000[i]*tmp0_28 + f_001[i]*tmp0_29 + f_010[i]*tmp0_31 + f_011[i]*tmp0_30;                              o[INDEX3(i,1,2,numComp,3)] = f_000[i]*tmp0_8 + f_010[i]*tmp0_11 + f_100[i]*tmp0_9 + f_110[i]*tmp0_10;
732                          o[INDEX3(i,0,3,numComp,3)] = f_000[i]*tmp0_14 + f_011[i]*tmp0_18 + f_100[i]*tmp0_19 + f_111[i]*tmp0_17 + tmp0_15*(f_001[i] + f_010[i]) + tmp0_16*(f_101[i] + f_110[i]);                              o[INDEX3(i,2,2,numComp,3)] = f_000[i]*tmp0_22 + f_001[i]*tmp0_26 + f_010[i]*tmp0_23 + f_011[i]*tmp0_27 + f_100[i]*tmp0_25 + f_101[i]*tmp0_28 + f_110[i]*tmp0_24 + f_111[i]*tmp0_29;
733                          o[INDEX3(i,1,3,numComp,3)] = f_000[i]*tmp0_24 + f_001[i]*tmp0_25 + f_010[i]*tmp0_27 + f_011[i]*tmp0_26;                              o[INDEX3(i,0,3,numComp,3)] = f_000[i]*tmp0_4 + f_010[i]*tmp0_7 + f_100[i]*tmp0_5 + f_110[i]*tmp0_6;
734                          o[INDEX3(i,2,3,numComp,3)] = f_000[i]*tmp0_32 + f_001[i]*tmp0_33 + f_010[i]*tmp0_35 + f_011[i]*tmp0_34;                              o[INDEX3(i,1,3,numComp,3)] = f_000[i]*tmp0_12 + f_010[i]*tmp0_15 + f_100[i]*tmp0_13 + f_110[i]*tmp0_14;
735                      } /* end of component loop i */                              o[INDEX3(i,2,3,numComp,3)] = f_000[i]*tmp0_30 + f_001[i]*tmp0_33 + f_110[i]*tmp0_32 + f_111[i]*tmp0_35 + tmp0_31*(f_010[i] + f_100[i]) + tmp0_34*(f_011[i] + f_101[i]);
736                            } /* end of component loop i */
737                        } /* end of k0 loop */
738                  } /* end of k1 loop */                  } /* end of k1 loop */
739              } /* end of k2 loop */              } /* end of face 4 */
740          } /* end of face 0 */              if (m_faceOffset[5] > -1) {
741          if (m_faceOffset[1] > -1) {                  const double tmp0_22 = 0.16666666666666666667/h2;
742              const double tmp0_22 = 0.78867513459481288225/h1;                  const double tmp0_16 = 0.62200846792814621559/h2;
743              const double tmp0_16 = 0.16666666666666666667/h0;                  const double tmp0_33 = -0.044658198738520451079/h2;
744              const double tmp0_33 = 0.78867513459481288225/h2;                  const double tmp0_0 = -0.78867513459481288225/h0;
745              const double tmp0_0 = -0.62200846792814621559/h0;                  const double tmp0_21 = -0.16666666666666666667/h2;
746              const double tmp0_21 = 0.21132486540518711775/h1;                  const double tmp0_17 = 0.16666666666666666667/h2;
747              const double tmp0_17 = 0.62200846792814621559/h0;                  const double tmp0_1 = 0.78867513459481288225/h0;
748              const double tmp0_1 = -0.16666666666666666667/h0;                  const double tmp0_20 = -0.044658198738520451079/h2;
749              const double tmp0_20 = -0.21132486540518711775/h1;                  const double tmp0_14 = 0.21132486540518711775/h1;
750              const double tmp0_14 = -0.044658198738520451079/h0;                  const double tmp0_2 = -0.21132486540518711775/h0;
751              const double tmp0_2 = 0.16666666666666666667/h0;                  const double tmp0_27 = -0.16666666666666666667/h2;
752              const double tmp0_27 = -0.21132486540518711775/h1;                  const double tmp0_15 = 0.78867513459481288225/h1;
753              const double tmp0_15 = -0.16666666666666666667/h0;                  const double tmp0_3 = 0.21132486540518711775/h0;
754              const double tmp0_3 = 0.044658198738520451079/h0;                  const double tmp0_26 = -0.16666666666666666667/h2;
755              const double tmp0_26 = 0.21132486540518711775/h1;                  const double tmp0_12 = -0.21132486540518711775/h1;
756              const double tmp0_12 = -0.62200846792814621559/h0;                  const double tmp0_25 = 0.16666666666666666667/h2;
757              const double tmp0_25 = 0.78867513459481288225/h1;                  const double tmp0_13 = -0.78867513459481288225/h1;
758              const double tmp0_13 = 0.16666666666666666667/h0;                  const double tmp0_24 = 0.044658198738520451079/h2;
759              const double tmp0_24 = -0.78867513459481288225/h1;                  const double tmp0_10 = 0.78867513459481288225/h1;
760              const double tmp0_10 = 0.62200846792814621559/h0;                  const double tmp0_11 = 0.21132486540518711775/h1;
761              const double tmp0_11 = -0.16666666666666666667/h0;                  const double tmp0_34 = -0.62200846792814621559/h2;
762              const double tmp0_34 = -0.78867513459481288225/h2;                  const double tmp0_35 = -0.16666666666666666667/h2;
763              const double tmp0_35 = -0.21132486540518711775/h2;                  const double tmp0_8 = -0.78867513459481288225/h1;
764              const double tmp0_8 = 0.044658198738520451079/h0;                  const double tmp0_29 = -0.62200846792814621559/h2;
765              const double tmp0_29 = 0.21132486540518711775/h2;                  const double tmp0_9 = -0.21132486540518711775/h1;
766              const double tmp0_9 = 0.16666666666666666667/h0;                  const double tmp0_30 = 0.044658198738520451079/h2;
767              const double tmp0_30 = -0.21132486540518711775/h2;                  const double tmp0_28 = -0.044658198738520451079/h2;
768              const double tmp0_28 = 0.78867513459481288225/h2;                  const double tmp0_32 = 0.62200846792814621559/h2;
769              const double tmp0_32 = 0.21132486540518711775/h2;                  const double tmp0_31 = 0.16666666666666666667/h2;
770              const double tmp0_31 = -0.78867513459481288225/h2;                  const double tmp0_18 = 0.044658198738520451079/h2;
771              const double tmp0_18 = -0.62200846792814621559/h0;                  const double tmp0_4 = -0.21132486540518711775/h0;
772              const double tmp0_4 = -0.044658198738520451079/h0;                  const double tmp0_19 = -0.62200846792814621559/h2;
773              const double tmp0_19 = 0.044658198738520451079/h0;                  const double tmp0_5 = 0.21132486540518711775/h0;
774              const double tmp0_5 = 0.62200846792814621559/h0;                  const double tmp0_6 = -0.78867513459481288225/h0;
775              const double tmp0_6 = -0.16666666666666666667/h0;                  const double tmp0_23 = 0.62200846792814621559/h2;
776              const double tmp0_23 = -0.78867513459481288225/h1;                  const double tmp0_7 = 0.78867513459481288225/h0;
777              const double tmp0_7 = -0.044658198738520451079/h0;  #pragma omp for nowait
 #pragma omp parallel for  
             for (index_t k2=0; k2 < m_NE2; ++k2) {  
778                  for (index_t k1=0; k1 < m_NE1; ++k1) {                  for (index_t k1=0; k1 < m_NE1; ++k1) {
779                      const register double* f_000 = in.getSampleDataRO(INDEX3(m_N0-2,k1,k2, m_N0,m_N1));                      for (index_t k0=0; k0 < m_NE0; ++k0) {
780                      const register double* f_001 = in.getSampleDataRO(INDEX3(m_N0-2,k1,k2+1, m_N0,m_N1));                          const register double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,m_N2-1, m_N0,m_N1));
781                      const register double* f_101 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2+1, m_N0,m_N1));                          const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,m_N2-1, m_N0,m_N1));
782                      const register double* f_111 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2+1, m_N0,m_N1));                          const register double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,m_N2-1, m_N0,m_N1));
783                      const register double* f_110 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2, m_N0,m_N1));                          const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,m_N2-1, m_N0,m_N1));
784                      const register double* f_011 = in.getSampleDataRO(INDEX3(m_N0-2,k1+1,k2+1, m_N0,m_N1));                          const register double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,m_N2-2, m_N0,m_N1));
785                      const register double* f_010 = in.getSampleDataRO(INDEX3(m_N0-2,k1+1,k2, m_N0,m_N1));                          const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,m_N2-2, m_N0,m_N1));
786                      const register double* f_100 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2, m_N0,m_N1));                          const register double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,m_N2-2, m_N0,m_N1));
787                      double* o = out.getSampleDataRW(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));                          const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,m_N2-2, m_N0,m_N1));
788                      for (index_t i=0; i < numComp; ++i) {                          double* o = out.getSampleDataRW(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));
789                          o[INDEX3(i,0,0,numComp,3)] = f_000[i]*tmp0_0 + f_011[i]*tmp0_4 + f_100[i]*tmp0_5 + f_111[i]*tmp0_3 + tmp0_1*(f_001[i] + f_010[i]) + tmp0_2*(f_101[i] + f_110[i]);                          for (index_t i=0; i < numComp; ++i) {
790                          o[INDEX3(i,1,0,numComp,3)] = f_100[i]*tmp0_23 + f_101[i]*tmp0_20 + f_110[i]*tmp0_22 + f_111[i]*tmp0_21;                              o[INDEX3(i,0,0,numComp,3)] = f_001[i]*tmp0_0 + f_011[i]*tmp0_2 + f_101[i]*tmp0_1 + f_111[i]*tmp0_3;
791                          o[INDEX3(i,2,0,numComp,3)] = f_100[i]*tmp0_31 + f_101[i]*tmp0_28 + f_110[i]*tmp0_30 + f_111[i]*tmp0_29;                              o[INDEX3(i,1,0,numComp,3)] = f_001[i]*tmp0_8 + f_011[i]*tmp0_10 + f_101[i]*tmp0_9 + f_111[i]*tmp0_11;
792                          o[INDEX3(i,0,1,numComp,3)] = f_000[i]*tmp0_6 + f_001[i]*tmp0_7 + f_010[i]*tmp0_12 + f_011[i]*tmp0_11 + f_100[i]*tmp0_13 + f_101[i]*tmp0_8 + f_110[i]*tmp0_10 + f_111[i]*tmp0_9;                              o[INDEX3(i,2,0,numComp,3)] = f_000[i]*tmp0_19 + f_001[i]*tmp0_16 + f_110[i]*tmp0_20 + f_111[i]*tmp0_18 + tmp0_17*(f_011[i] + f_101[i]) + tmp0_21*(f_010[i] + f_100[i]);
793                          o[INDEX3(i,1,1,numComp,3)] = f_100[i]*tmp0_23 + f_101[i]*tmp0_20 + f_110[i]*tmp0_22 + f_111[i]*tmp0_21;                              o[INDEX3(i,0,1,numComp,3)] = f_001[i]*tmp0_0 + f_011[i]*tmp0_2 + f_101[i]*tmp0_1 + f_111[i]*tmp0_3;
794                          o[INDEX3(i,2,1,numComp,3)] = f_100[i]*tmp0_35 + f_101[i]*tmp0_32 + f_110[i]*tmp0_34 + f_111[i]*tmp0_33;                              o[INDEX3(i,1,1,numComp,3)] = f_001[i]*tmp0_12 + f_011[i]*tmp0_14 + f_101[i]*tmp0_13 + f_111[i]*tmp0_15;
795                          o[INDEX3(i,0,2,numComp,3)] = f_000[i]*tmp0_6 + f_001[i]*tmp0_12 + f_010[i]*tmp0_7 + f_011[i]*tmp0_11 + f_100[i]*tmp0_13 + f_101[i]*tmp0_10 + f_110[i]*tmp0_8 + f_111[i]*tmp0_9;                              o[INDEX3(i,2,1,numComp,3)] = f_000[i]*tmp0_26 + f_001[i]*tmp0_22 + f_010[i]*tmp0_28 + f_011[i]*tmp0_24 + f_100[i]*tmp0_29 + f_101[i]*tmp0_23 + f_110[i]*tmp0_27 + f_111[i]*tmp0_25;
796                          o[INDEX3(i,1,2,numComp,3)] = f_100[i]*tmp0_27 + f_101[i]*tmp0_24 + f_110[i]*tmp0_26 + f_111[i]*tmp0_25;                              o[INDEX3(i,0,2,numComp,3)] = f_001[i]*tmp0_4 + f_011[i]*tmp0_6 + f_101[i]*tmp0_5 + f_111[i]*tmp0_7;
797                          o[INDEX3(i,2,2,numComp,3)] = f_100[i]*tmp0_31 + f_101[i]*tmp0_28 + f_110[i]*tmp0_30 + f_111[i]*tmp0_29;                              o[INDEX3(i,1,2,numComp,3)] = f_001[i]*tmp0_8 + f_011[i]*tmp0_10 + f_101[i]*tmp0_9 + f_111[i]*tmp0_11;
798                          o[INDEX3(i,0,3,numComp,3)] = f_000[i]*tmp0_14 + f_011[i]*tmp0_18 + f_100[i]*tmp0_19 + f_111[i]*tmp0_17 + tmp0_15*(f_001[i] + f_010[i]) + tmp0_16*(f_101[i] + f_110[i]);                              o[INDEX3(i,2,2,numComp,3)] = f_000[i]*tmp0_26 + f_001[i]*tmp0_22 + f_010[i]*tmp0_29 + f_011[i]*tmp0_23 + f_100[i]*tmp0_28 + f_101[i]*tmp0_24 + f_110[i]*tmp0_27 + f_111[i]*tmp0_25;
799                          o[INDEX3(i,1,3,numComp,3)] = f_100[i]*tmp0_27 + f_101[i]*tmp0_24 + f_110[i]*tmp0_26 + f_111[i]*tmp0_25;                              o[INDEX3(i,0,3,numComp,3)] = f_001[i]*tmp0_4 + f_011[i]*tmp0_6 + f_101[i]*tmp0_5 + f_111[i]*tmp0_7;
800                          o[INDEX3(i,2,3,numComp,3)] = f_100[i]*tmp0_35 + f_101[i]*tmp0_32 + f_110[i]*tmp0_34 + f_111[i]*tmp0_33;                              o[INDEX3(i,1,3,numComp,3)] = f_001[i]*tmp0_12 + f_011[i]*tmp0_14 + f_101[i]*tmp0_13 + f_111[i]*tmp0_15;
801                      } /* end of component loop i */                              o[INDEX3(i,2,3,numComp,3)] = f_000[i]*tmp0_33 + f_001[i]*tmp0_30 + f_110[i]*tmp0_34 + f_111[i]*tmp0_32 + tmp0_31*(f_011[i] + f_101[i]) + tmp0_35*(f_010[i] + f_100[i]);
802                            } /* end of component loop i */
803                        } /* end of k0 loop */
804                  } /* end of k1 loop */                  } /* end of k1 loop */
805              } /* end of k2 loop */              } /* end of face 5 */
806          } /* end of face 1 */          } // end of parallel section
         if (m_faceOffset[2] > -1) {  
             const double tmp0_22 = -0.044658198738520451079/h1;  
             const double tmp0_16 = -0.16666666666666666667/h1;  
             const double tmp0_33 = 0.21132486540518711775/h2;  
             const double tmp0_0 = -0.78867513459481288225/h0;  
             const double tmp0_21 = 0.16666666666666666667/h1;  
             const double tmp0_17 = -0.62200846792814621559/h1;  
             const double tmp0_1 = -0.21132486540518711775/h0;  
             const double tmp0_20 = 0.044658198738520451079/h1;  
             const double tmp0_14 = -0.16666666666666666667/h1;  
             const double tmp0_2 = 0.21132486540518711775/h0;  
             const double tmp0_27 = 0.044658198738520451079/h1;  
             const double tmp0_15 = -0.044658198738520451079/h1;  
             const double tmp0_3 = 0.78867513459481288225/h0;  
             const double tmp0_26 = 0.16666666666666666667/h1;  
             const double tmp0_12 = 0.16666666666666666667/h1;  
             const double tmp0_25 = 0.62200846792814621559/h1;  
             const double tmp0_13 = 0.62200846792814621559/h1;  
             const double tmp0_24 = -0.62200846792814621559/h1;  
             const double tmp0_10 = -0.044658198738520451079/h1;  
             const double tmp0_11 = 0.044658198738520451079/h1;  
             const double tmp0_34 = 0.78867513459481288225/h2;  
             const double tmp0_35 = -0.78867513459481288225/h2;  
             const double tmp0_8 = -0.62200846792814621559/h1;  
             const double tmp0_29 = 0.78867513459481288225/h2;  
             const double tmp0_9 = -0.16666666666666666667/h1;  
             const double tmp0_30 = 0.21132486540518711775/h2;  
             const double tmp0_28 = -0.78867513459481288225/h2;  
             const double tmp0_32 = -0.21132486540518711775/h2;  
             const double tmp0_31 = -0.21132486540518711775/h2;  
             const double tmp0_18 = 0.16666666666666666667/h1;  
             const double tmp0_4 = -0.21132486540518711775/h0;  
             const double tmp0_19 = 0.62200846792814621559/h1;  
             const double tmp0_5 = -0.78867513459481288225/h0;  
             const double tmp0_6 = 0.78867513459481288225/h0;  
             const double tmp0_23 = -0.16666666666666666667/h1;  
             const double tmp0_7 = 0.21132486540518711775/h0;  
 #pragma omp parallel for  
             for (index_t k2=0; k2 < m_NE2; ++k2) {  
                 for (index_t k0=0; k0 < m_NE0; ++k0) {  
                     const register double* f_000 = in.getSampleDataRO(INDEX3(k0,0,k2, m_N0,m_N1));  
                     const register double* f_001 = in.getSampleDataRO(INDEX3(k0,0,k2+1, m_N0,m_N1));  
                     const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,0,k2+1, m_N0,m_N1));  
                     const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,0,k2, m_N0,m_N1));  
                     const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,1,k2+1, m_N0,m_N1));  
                     const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,1,k2, m_N0,m_N1));  
                     const register double* f_011 = in.getSampleDataRO(INDEX3(k0,1,k2+1, m_N0,m_N1));  
                     const register double* f_010 = in.getSampleDataRO(INDEX3(k0,1,k2, m_N0,m_N1));  
                     double* o = out.getSampleDataRW(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));  
                     for (index_t i=0; i < numComp; ++i) {  
                         o[INDEX3(i,0,0,numComp,3)] = f_000[i]*tmp0_0 + f_001[i]*tmp0_1 + f_100[i]*tmp0_3 + f_101[i]*tmp0_2;  
                         o[INDEX3(i,1,0,numComp,3)] = f_000[i]*tmp0_8 + f_010[i]*tmp0_13 + f_101[i]*tmp0_10 + f_111[i]*tmp0_11 + tmp0_12*(f_011[i] + f_110[i]) + tmp0_9*(f_001[i] + f_100[i]);  
                         o[INDEX3(i,2,0,numComp,3)] = f_000[i]*tmp0_28 + f_001[i]*tmp0_29 + f_100[i]*tmp0_31 + f_101[i]*tmp0_30;  
                         o[INDEX3(i,0,1,numComp,3)] = f_000[i]*tmp0_0 + f_001[i]*tmp0_1 + f_100[i]*tmp0_3 + f_101[i]*tmp0_2;  
                         o[INDEX3(i,1,1,numComp,3)] = f_000[i]*tmp0_14 + f_001[i]*tmp0_15 + f_010[i]*tmp0_21 + f_011[i]*tmp0_20 + f_100[i]*tmp0_17 + f_101[i]*tmp0_16 + f_110[i]*tmp0_19 + f_111[i]*tmp0_18;  
                         o[INDEX3(i,2,1,numComp,3)] = f_000[i]*tmp0_32 + f_001[i]*tmp0_33 + f_100[i]*tmp0_35 + f_101[i]*tmp0_34;  
                         o[INDEX3(i,0,2,numComp,3)] = f_000[i]*tmp0_4 + f_001[i]*tmp0_5 + f_100[i]*tmp0_7 + f_101[i]*tmp0_6;  
                         o[INDEX3(i,1,2,numComp,3)] = f_000[i]*tmp0_14 + f_001[i]*tmp0_17 + f_010[i]*tmp0_21 + f_011[i]*tmp0_19 + f_100[i]*tmp0_15 + f_101[i]*tmp0_16 + f_110[i]*tmp0_20 + f_111[i]*tmp0_18;  
                         o[INDEX3(i,2,2,numComp,3)] = f_000[i]*tmp0_28 + f_001[i]*tmp0_29 + f_100[i]*tmp0_31 + f_101[i]*tmp0_30;  
                         o[INDEX3(i,0,3,numComp,3)] = f_000[i]*tmp0_4 + f_001[i]*tmp0_5 + f_100[i]*tmp0_7 + f_101[i]*tmp0_6;  
                         o[INDEX3(i,1,3,numComp,3)] = f_000[i]*tmp0_22 + f_010[i]*tmp0_27 + f_101[i]*tmp0_24 + f_111[i]*tmp0_25 + tmp0_23*(f_001[i] + f_100[i]) + tmp0_26*(f_011[i] + f_110[i]);  
                         o[INDEX3(i,2,3,numComp,3)] = f_000[i]*tmp0_32 + f_001[i]*tmp0_33 + f_100[i]*tmp0_35 + f_101[i]*tmp0_34;  
                     } /* end of component loop i */  
                 } /* end of k0 loop */  
             } /* end of k2 loop */  
         } /* end of face 2 */  
         if (m_faceOffset[3] > -1) {  
             const double tmp0_22 = 0.16666666666666666667/h1;  
             const double tmp0_16 = 0.16666666666666666667/h1;  
             const double tmp0_33 = -0.78867513459481288225/h2;  
             const double tmp0_0 = -0.21132486540518711775/h0;  
             const double tmp0_21 = -0.62200846792814621559/h1;  
             const double tmp0_17 = 0.16666666666666666667/h1;  
             const double tmp0_1 = 0.78867513459481288225/h0;  
             const double tmp0_20 = -0.16666666666666666667/h1;  
             const double tmp0_14 = 0.044658198738520451079/h1;  
             const double tmp0_2 = -0.78867513459481288225/h0;  
             const double tmp0_27 = -0.62200846792814621559/h1;  
             const double tmp0_15 = 0.62200846792814621559/h1;  
             const double tmp0_3 = 0.21132486540518711775/h0;  
             const double tmp0_26 = -0.16666666666666666667/h1;  
             const double tmp0_12 = -0.16666666666666666667/h1;  
             const double tmp0_25 = -0.044658198738520451079/h1;  
             const double tmp0_13 = -0.044658198738520451079/h1;  
             const double tmp0_24 = 0.62200846792814621559/h1;  
             const double tmp0_10 = 0.044658198738520451079/h1;  
             const double tmp0_11 = -0.62200846792814621559/h1;  
             const double tmp0_34 = -0.21132486540518711775/h2;  
             const double tmp0_35 = 0.78867513459481288225/h2;  
             const double tmp0_8 = 0.16666666666666666667/h1;  
             const double tmp0_29 = -0.21132486540518711775/h2;  
             const double tmp0_9 = 0.62200846792814621559/h1;  
             const double tmp0_30 = -0.78867513459481288225/h2;  
             const double tmp0_28 = 0.78867513459481288225/h2;  
             const double tmp0_32 = 0.21132486540518711775/h2;  
             const double tmp0_31 = 0.21132486540518711775/h2;  
             const double tmp0_18 = -0.16666666666666666667/h1;  
             const double tmp0_4 = -0.78867513459481288225/h0;  
             const double tmp0_19 = -0.044658198738520451079/h1;  
             const double tmp0_5 = 0.21132486540518711775/h0;  
             const double tmp0_6 = -0.21132486540518711775/h0;  
             const double tmp0_23 = 0.044658198738520451079/h1;  
             const double tmp0_7 = 0.78867513459481288225/h0;  
 #pragma omp parallel for  
             for (index_t k2=0; k2 < m_NE2; ++k2) {  
                 for (index_t k0=0; k0 < m_NE0; ++k0) {  
                     const register double* f_011 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2+1, m_N0,m_N1));  
                     const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2, m_N0,m_N1));  
                     const register double* f_010 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2, m_N0,m_N1));  
                     const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2+1, m_N0,m_N1));  
                     const register double* f_000 = in.getSampleDataRO(INDEX3(k0,m_N1-2,k2, m_N0,m_N1));  
                     const register double* f_001 = in.getSampleDataRO(INDEX3(k0,m_N1-2,k2+1, m_N0,m_N1));  
                     const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,m_N1-2,k2+1, m_N0,m_N1));  
                     const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,m_N1-2,k2, m_N0,m_N1));  
                     double* o = out.getSampleDataRW(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));  
                     for (index_t i=0; i < numComp; ++i) {  
                         o[INDEX3(i,0,0,numComp,3)] = f_010[i]*tmp0_2 + f_011[i]*tmp0_0 + f_110[i]*tmp0_1 + f_111[i]*tmp0_3;  
                         o[INDEX3(i,1,0,numComp,3)] = f_000[i]*tmp0_11 + f_010[i]*tmp0_9 + f_101[i]*tmp0_13 + f_111[i]*tmp0_10 + tmp0_12*(f_001[i] + f_100[i]) + tmp0_8*(f_011[i] + f_110[i]);  
                         o[INDEX3(i,2,0,numComp,3)] = f_010[i]*tmp0_30 + f_011[i]*tmp0_28 + f_110[i]*tmp0_29 + f_111[i]*tmp0_31;  
                         o[INDEX3(i,0,1,numComp,3)] = f_010[i]*tmp0_2 + f_011[i]*tmp0_0 + f_110[i]*tmp0_1 + f_111[i]*tmp0_3;  
                         o[INDEX3(i,1,1,numComp,3)] = f_000[i]*tmp0_18 + f_001[i]*tmp0_19 + f_010[i]*tmp0_16 + f_011[i]*tmp0_14 + f_100[i]*tmp0_21 + f_101[i]*tmp0_20 + f_110[i]*tmp0_15 + f_111[i]*tmp0_17;  
                         o[INDEX3(i,2,1,numComp,3)] = f_010[i]*tmp0_34 + f_011[i]*tmp0_32 + f_110[i]*tmp0_33 + f_111[i]*tmp0_35;  
                         o[INDEX3(i,0,2,numComp,3)] = f_010[i]*tmp0_6 + f_011[i]*tmp0_4 + f_110[i]*tmp0_5 + f_111[i]*tmp0_7;  
                         o[INDEX3(i,1,2,numComp,3)] = f_000[i]*tmp0_18 + f_001[i]*tmp0_21 + f_010[i]*tmp0_16 + f_011[i]*tmp0_15 + f_100[i]*tmp0_19 + f_101[i]*tmp0_20 + f_110[i]*tmp0_14 + f_111[i]*tmp0_17;  
                         o[INDEX3(i,2,2,numComp,3)] = f_010[i]*tmp0_30 + f_011[i]*tmp0_28 + f_110[i]*tmp0_29 + f_111[i]*tmp0_31;  
                         o[INDEX3(i,0,3,numComp,3)] = f_010[i]*tmp0_6 + f_011[i]*tmp0_4 + f_110[i]*tmp0_5 + f_111[i]*tmp0_7;  
                         o[INDEX3(i,1,3,numComp,3)] = f_000[i]*tmp0_25 + f_010[i]*tmp0_23 + f_101[i]*tmp0_27 + f_111[i]*tmp0_24 + tmp0_22*(f_011[i] + f_110[i]) + tmp0_26*(f_001[i] + f_100[i]);  
                         o[INDEX3(i,2,3,numComp,3)] = f_010[i]*tmp0_34 + f_011[i]*tmp0_32 + f_110[i]*tmp0_33 + f_111[i]*tmp0_35;  
                     } /* end of component loop i */  
                 } /* end of k0 loop */  
             } /* end of k2 loop */  
         } /* end of face 3 */  
         if (m_faceOffset[4] > -1) {  
             const double tmp0_22 = -0.16666666666666666667/h2;  
             const double tmp0_16 = -0.62200846792814621559/h2;  
             const double tmp0_33 = 0.044658198738520451079/h2;  
             const double tmp0_0 = -0.78867513459481288225/h0;  
             const double tmp0_21 = 0.044658198738520451079/h2;  
             const double tmp0_17 = -0.16666666666666666667/h2;  
             const double tmp0_1 = 0.78867513459481288225/h0;  
             const double tmp0_20 = 0.16666666666666666667/h2;  
             const double tmp0_14 = 0.78867513459481288225/h1;  
             const double tmp0_2 = 0.21132486540518711775/h0;  
             const double tmp0_27 = 0.62200846792814621559/h2;  
             const double tmp0_15 = 0.21132486540518711775/h1;  
             const double tmp0_3 = -0.21132486540518711775/h0;  
             const double tmp0_26 = 0.16666666666666666667/h2;  
             const double tmp0_12 = -0.21132486540518711775/h1;  
             const double tmp0_25 = -0.044658198738520451079/h2;  
             const double tmp0_13 = -0.78867513459481288225/h1;  
             const double tmp0_24 = -0.16666666666666666667/h2;  
             const double tmp0_10 = 0.21132486540518711775/h1;  
             const double tmp0_11 = 0.78867513459481288225/h1;  
             const double tmp0_34 = 0.16666666666666666667/h2;  
             const double tmp0_35 = 0.62200846792814621559/h2;  
             const double tmp0_8 = -0.78867513459481288225/h1;  
             const double tmp0_29 = 0.16666666666666666667/h2;  
             const double tmp0_9 = -0.21132486540518711775/h1;  
             const double tmp0_30 = -0.044658198738520451079/h2;  
             const double tmp0_28 = 0.044658198738520451079/h2;  
             const double tmp0_32 = -0.62200846792814621559/h2;  
             const double tmp0_31 = -0.16666666666666666667/h2;  
             const double tmp0_18 = -0.044658198738520451079/h2;  
             const double tmp0_4 = -0.21132486540518711775/h0;  
             const double tmp0_19 = 0.62200846792814621559/h2;  
             const double tmp0_5 = 0.21132486540518711775/h0;  
             const double tmp0_6 = 0.78867513459481288225/h0;  
             const double tmp0_23 = -0.62200846792814621559/h2;  
             const double tmp0_7 = -0.78867513459481288225/h0;  
 #pragma omp parallel for  
             for (index_t k1=0; k1 < m_NE1; ++k1) {  
                 for (index_t k0=0; k0 < m_NE0; ++k0) {  
                     const register double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,0, m_N0,m_N1));  
                     const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,0, m_N0,m_N1));  
                     const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,0, m_N0,m_N1));  
                     const register double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,0, m_N0,m_N1));  
                     const register double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,1, m_N0,m_N1));  
                     const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,1, m_N0,m_N1));  
                     const register double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,1, m_N0,m_N1));  
                     const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,1, m_N0,m_N1));  
                     double* o = out.getSampleDataRW(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));  
                     for (index_t i=0; i < numComp; ++i) {  
                         o[INDEX3(i,0,0,numComp,3)] = f_000[i]*tmp0_0 + f_010[i]*tmp0_3 + f_100[i]*tmp0_1 + f_110[i]*tmp0_2;  
                         o[INDEX3(i,1,0,numComp,3)] = f_000[i]*tmp0_8 + f_010[i]*tmp0_11 + f_100[i]*tmp0_9 + f_110[i]*tmp0_10;  
                         o[INDEX3(i,2,0,numComp,3)] = f_000[i]*tmp0_16 + f_001[i]*tmp0_19 + f_110[i]*tmp0_18 + f_111[i]*tmp0_21 + tmp0_17*(f_010[i] + f_100[i]) + tmp0_20*(f_011[i] + f_101[i]);  
                         o[INDEX3(i,0,1,numComp,3)] = f_000[i]*tmp0_0 + f_010[i]*tmp0_3 + f_100[i]*tmp0_1 + f_110[i]*tmp0_2;  
                         o[INDEX3(i,1,1,numComp,3)] = f_000[i]*tmp0_12 + f_010[i]*tmp0_15 + f_100[i]*tmp0_13 + f_110[i]*tmp0_14;  
                         o[INDEX3(i,2,1,numComp,3)] = f_000[i]*tmp0_22 + f_001[i]*tmp0_26 + f_010[i]*tmp0_25 + f_011[i]*tmp0_28 + f_100[i]*tmp0_23 + f_101[i]*tmp0_27 + f_110[i]*tmp0_24 + f_111[i]*tmp0_29;  
                         o[INDEX3(i,0,2,numComp,3)] = f_000[i]*tmp0_4 + f_010[i]*tmp0_7 + f_100[i]*tmp0_5 + f_110[i]*tmp0_6;  
                         o[INDEX3(i,1,2,numComp,3)] = f_000[i]*tmp0_8 + f_010[i]*tmp0_11 + f_100[i]*tmp0_9 + f_110[i]*tmp0_10;  
                         o[INDEX3(i,2,2,numComp,3)] = f_000[i]*tmp0_22 + f_001[i]*tmp0_26 + f_010[i]*tmp0_23 + f_011[i]*tmp0_27 + f_100[i]*tmp0_25 + f_101[i]*tmp0_28 + f_110[i]*tmp0_24 + f_111[i]*tmp0_29;  
                         o[INDEX3(i,0,3,numComp,3)] = f_000[i]*tmp0_4 + f_010[i]*tmp0_7 + f_100[i]*tmp0_5 + f_110[i]*tmp0_6;  
                         o[INDEX3(i,1,3,numComp,3)] = f_000[i]*tmp0_12 + f_010[i]*tmp0_15 + f_100[i]*tmp0_13 + f_110[i]*tmp0_14;  
                         o[INDEX3(i,2,3,numComp,3)] = f_000[i]*tmp0_30 + f_001[i]*tmp0_33 + f_110[i]*tmp0_32 + f_111[i]*tmp0_35 + tmp0_31*(f_010[i] + f_100[i]) + tmp0_34*(f_011[i] + f_101[i]);  
                     } /* end of component loop i */  
                 } /* end of k0 loop */  
             } /* end of k1 loop */  
         } /* end of face 4 */  
         if (m_faceOffset[5] > -1) {  
             const double tmp0_22 = 0.16666666666666666667/h2;  
             const double tmp0_16 = 0.62200846792814621559/h2;  
             const double tmp0_33 = -0.044658198738520451079/h2;  
             const double tmp0_0 = -0.78867513459481288225/h0;  
             const double tmp0_21 = -0.16666666666666666667/h2;  
             const double tmp0_17 = 0.16666666666666666667/h2;  
             const double tmp0_1 = 0.78867513459481288225/h0;  
             const double tmp0_20 = -0.044658198738520451079/h2;  
             const double tmp0_14 = 0.21132486540518711775/h1;  
             const double tmp0_2 = -0.21132486540518711775/h0;  
             const double tmp0_27 = -0.16666666666666666667/h2;  
             const double tmp0_15 = 0.78867513459481288225/h1;  
             const double tmp0_3 = 0.21132486540518711775/h0;  
             const double tmp0_26 = -0.16666666666666666667/h2;  
             const double tmp0_12 = -0.21132486540518711775/h1;  
             const double tmp0_25 = 0.16666666666666666667/h2;  
             const double tmp0_13 = -0.78867513459481288225/h1;  
             const double tmp0_24 = 0.044658198738520451079/h2;  
             const double tmp0_10 = 0.78867513459481288225/h1;  
             const double tmp0_11 = 0.21132486540518711775/h1;  
             const double tmp0_34 = -0.62200846792814621559/h2;  
             const double tmp0_35 = -0.16666666666666666667/h2;  
             const double tmp0_8 = -0.78867513459481288225/h1;  
             const double tmp0_29 = -0.62200846792814621559/h2;  
             const double tmp0_9 = -0.21132486540518711775/h1;  
             const double tmp0_30 = 0.044658198738520451079/h2;  
             const double tmp0_28 = -0.044658198738520451079/h2;  
             const double tmp0_32 = 0.62200846792814621559/h2;  
             const double tmp0_31 = 0.16666666666666666667/h2;  
             const double tmp0_18 = 0.044658198738520451079/h2;  
             const double tmp0_4 = -0.21132486540518711775/h0;  
             const double tmp0_19 = -0.62200846792814621559/h2;  
             const double tmp0_5 = 0.21132486540518711775/h0;  
             const double tmp0_6 = -0.78867513459481288225/h0;  
             const double tmp0_23 = 0.62200846792814621559/h2;  
             const double tmp0_7 = 0.78867513459481288225/h0;  
 #pragma omp parallel for  
             for (index_t k1=0; k1 < m_NE1; ++k1) {  
                 for (index_t k0=0; k0 < m_NE0; ++k0) {  
                     const register double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,m_N2-1, m_N0,m_N1));  
                     const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,m_N2-1, m_N0,m_N1));  
                     const register double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,m_N2-1, m_N0,m_N1));  
                     const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,m_N2-1, m_N0,m_N1));  
                     const register double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,m_N2-2, m_N0,m_N1));  
                     const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,m_N2-2, m_N0,m_N1));  
                     const register double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,m_N2-2, m_N0,m_N1));  
                     const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,m_N2-2, m_N0,m_N1));  
                     double* o = out.getSampleDataRW(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));  
                     for (index_t i=0; i < numComp; ++i) {  
                         o[INDEX3(i,0,0,numComp,3)] = f_001[i]*tmp0_0 + f_011[i]*tmp0_2 + f_101[i]*tmp0_1 + f_111[i]*tmp0_3;  
                         o[INDEX3(i,1,0,numComp,3)] = f_001[i]*tmp0_8 + f_011[i]*tmp0_10 + f_101[i]*tmp0_9 + f_111[i]*tmp0_11;  
                         o[INDEX3(i,2,0,numComp,3)] = f_000[i]*tmp0_19 + f_001[i]*tmp0_16 + f_110[i]*tmp0_20 + f_111[i]*tmp0_18 + tmp0_17*(f_011[i] + f_101[i]) + tmp0_21*(f_010[i] + f_100[i]);  
                         o[INDEX3(i,0,1,numComp,3)] = f_001[i]*tmp0_0 + f_011[i]*tmp0_2 + f_101[i]*tmp0_1 + f_111[i]*tmp0_3;  
                         o[INDEX3(i,1,1,numComp,3)] = f_001[i]*tmp0_12 + f_011[i]*tmp0_14 + f_101[i]*tmp0_13 + f_111[i]*tmp0_15;  
                         o[INDEX3(i,2,1,numComp,3)] = f_000[i]*tmp0_26 + f_001[i]*tmp0_22 + f_010[i]*tmp0_28 + f_011[i]*tmp0_24 + f_100[i]*tmp0_29 + f_101[i]*tmp0_23 + f_110[i]*tmp0_27 + f_111[i]*tmp0_25;  
                         o[INDEX3(i,0,2,numComp,3)] = f_001[i]*tmp0_4 + f_011[i]*tmp0_6 + f_101[i]*tmp0_5 + f_111[i]*tmp0_7;  
                         o[INDEX3(i,1,2,numComp,3)] = f_001[i]*tmp0_8 + f_011[i]*tmp0_10 + f_101[i]*tmp0_9 + f_111[i]*tmp0_11;  
                         o[INDEX3(i,2,2,numComp,3)] = f_000[i]*tmp0_26 + f_001[i]*tmp0_22 + f_010[i]*tmp0_29 + f_011[i]*tmp0_23 + f_100[i]*tmp0_28 + f_101[i]*tmp0_24 + f_110[i]*tmp0_27 + f_111[i]*tmp0_25;  
                         o[INDEX3(i,0,3,numComp,3)] = f_001[i]*tmp0_4 + f_011[i]*tmp0_6 + f_101[i]*tmp0_5 + f_111[i]*tmp0_7;  
                         o[INDEX3(i,1,3,numComp,3)] = f_001[i]*tmp0_12 + f_011[i]*tmp0_14 + f_101[i]*tmp0_13 + f_111[i]*tmp0_15;  
                         o[INDEX3(i,2,3,numComp,3)] = f_000[i]*tmp0_33 + f_001[i]*tmp0_30 + f_110[i]*tmp0_34 + f_111[i]*tmp0_32 + tmp0_31*(f_011[i] + f_101[i]) + tmp0_35*(f_010[i] + f_100[i]);  
                     } /* end of component loop i */  
                 } /* end of k0 loop */  
             } /* end of k1 loop */  
         } /* end of face 5 */  
807          /* GENERATOR SNIP_GRAD_FACES BOTTOM */          /* GENERATOR SNIP_GRAD_FACES BOTTOM */
808      } else if (out.getFunctionSpace().getTypeCode() == ReducedFaceElements) {      } else if (out.getFunctionSpace().getTypeCode() == ReducedFaceElements) {
809          /* GENERATOR SNIP_GRAD_REDUCED_FACES TOP */          /* GENERATOR SNIP_GRAD_REDUCED_FACES TOP */
810          if (m_faceOffset[0] > -1) {  #pragma omp parallel
811              const double tmp0_0 = -0.25/h0;          {
812              const double tmp0_4 = -0.5/h2;              if (m_faceOffset[0] > -1) {
813              const double tmp0_1 = 0.25/h0;                  const double tmp0_0 = -0.25/h0;
814              const double tmp0_5 = 0.5/h2;                  const double tmp0_4 = -0.5/h2;
815              const double tmp0_2 = -0.5/h1;                  const double tmp0_1 = 0.25/h0;
816              const double tmp0_3 = 0.5/h1;                  const double tmp0_5 = 0.5/h2;
817  #pragma omp parallel for                  const double tmp0_2 = -0.5/h1;
818              for (index_t k2=0; k2 < m_NE2; ++k2) {                  const double tmp0_3 = 0.5/h1;
819    #pragma omp for nowait
820                    for (index_t k2=0; k2 < m_NE2; ++k2) {
821                        for (index_t k1=0; k1 < m_NE1; ++k1) {
822                            const register double* f_000 = in.getSampleDataRO(INDEX3(0,k1,k2, m_N0,m_N1));
823                            const register double* f_001 = in.getSampleDataRO(INDEX3(0,k1,k2+1, m_N0,m_N1));
824                            const register double* f_101 = in.getSampleDataRO(INDEX3(1,k1,k2+1, m_N0,m_N1));
825                            const register double* f_011 = in.getSampleDataRO(INDEX3(0,k1+1,k2+1, m_N0,m_N1));
826                            const register double* f_100 = in.getSampleDataRO(INDEX3(1,k1,k2, m_N0,m_N1));
827                            const register double* f_110 = in.getSampleDataRO(INDEX3(1,k1+1,k2, m_N0,m_N1));
828                            const register double* f_010 = in.getSampleDataRO(INDEX3(0,k1+1,k2, m_N0,m_N1));
829                            const register double* f_111 = in.getSampleDataRO(INDEX3(1,k1+1,k2+1, m_N0,m_N1));
830                            double* o = out.getSampleDataRW(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));
831                            for (index_t i=0; i < numComp; ++i) {
832                                o[INDEX3(i,0,0,numComp,3)] = tmp0_0*(f_000[i] + f_001[i] + f_010[i] + f_011[i]) + tmp0_1*(f_100[i] + f_101[i] + f_110[i] + f_111[i]);
833                                o[INDEX3(i,1,0,numComp,3)] = tmp0_2*(f_000[i] + f_001[i]) + tmp0_3*(f_010[i] + f_011[i]);
834                                o[INDEX3(i,2,0,numComp,3)] = tmp0_4*(f_000[i] + f_010[i]) + tmp0_5*(f_001[i] + f_011[i]);
835                            } /* end of component loop i */
836                        } /* end of k1 loop */
837                    } /* end of k2 loop */
838                } /* end of face 0 */
839                if (m_faceOffset[1] > -1) {
840                    const double tmp0_0 = -0.25/h0;
841                    const double tmp0_4 = 0.5/h2;
842                    const double tmp0_1 = 0.25/h0;
843                    const double tmp0_5 = -0.5/h2;
844                    const double tmp0_2 = -0.5/h1;
845                    const double tmp0_3 = 0.5/h1;
846    #pragma omp for nowait
847                    for (index_t k2=0; k2 < m_NE2; ++k2) {
848                        for (index_t k1=0; k1 < m_NE1; ++k1) {
849                            const register double* f_000 = in.getSampleDataRO(INDEX3(m_N0-2,k1,k2, m_N0,m_N1));
850                            const register double* f_001 = in.getSampleDataRO(INDEX3(m_N0-2,k1,k2+1, m_N0,m_N1));
851                            const register double* f_101 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2+1, m_N0,m_N1));
852                            const register double* f_011 = in.getSampleDataRO(INDEX3(m_N0-2,k1+1,k2+1, m_N0,m_N1));
853                            const register double* f_100 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2, m_N0,m_N1));
854                            const register double* f_110 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2, m_N0,m_N1));
855                            const register double* f_010 = in.getSampleDataRO(INDEX3(m_N0-2,k1+1,k2, m_N0,m_N1));
856                            const register double* f_111 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2+1, m_N0,m_N1));
857                            double* o = out.getSampleDataRW(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));
858                            for (index_t i=0; i < numComp; ++i) {
859                                o[INDEX3(i,0,0,numComp,3)] = tmp0_0*(f_000[i] + f_001[i] + f_010[i] + f_011[i]) + tmp0_1*(f_100[i] + f_101[i] + f_110[i] + f_111[i]);
860                                o[INDEX3(i,1,0,numComp,3)] = tmp0_2*(f_100[i] + f_101[i]) + tmp0_3*(f_110[i] + f_111[i]);
861                                o[INDEX3(i,2,0,numComp,3)] = tmp0_4*(f_101[i] + f_111[i]) + tmp0_5*(f_100[i] + f_110[i]);
862                            } /* end of component loop i */
863                        } /* end of k1 loop */
864                    } /* end of k2 loop */
865                } /* end of face 1 */
866                if (m_faceOffset[2] > -1) {
867                    const double tmp0_0 = -0.5/h0;
868                    const double tmp0_4 = -0.5/h2;
869                    const double tmp0_1 = 0.5/h0;
870                    const double tmp0_5 = 0.5/h2;
871                    const double tmp0_2 = -0.25/h1;
872                    const double tmp0_3 = 0.25/h1;
873    #pragma omp for nowait
874                    for (index_t k2=0; k2 < m_NE2; ++k2) {
875                        for (index_t k0=0; k0 < m_NE0; ++k0) {
876                            const register double* f_000 = in.getSampleDataRO(INDEX3(k0,0,k2, m_N0,m_N1));
877                            const register double* f_001 = in.getSampleDataRO(INDEX3(k0,0,k2+1, m_N0,m_N1));
878                            const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,0,k2+1, m_N0,m_N1));
879                            const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,0,k2, m_N0,m_N1));
880                            const register double* f_011 = in.getSampleDataRO(INDEX3(k0,1,k2+1, m_N0,m_N1));
881                            const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,1,k2, m_N0,m_N1));
882                            const register double* f_010 = in.getSampleDataRO(INDEX3(k0,1,k2, m_N0,m_N1));
883                            const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,1,k2+1, m_N0,m_N1));
884                            double* o = out.getSampleDataRW(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));
885                            for (index_t i=0; i < numComp; ++i) {
886                                o[INDEX3(i,0,0,numComp,3)] = tmp0_0*(f_000[i] + f_001[i]) + tmp0_1*(f_100[i] + f_101[i]);
887                                o[INDEX3(i,1,0,numComp,3)] = tmp0_2*(f_000[i] + f_001[i] + f_100[i] + f_101[i]) + tmp0_3*(f_010[i] + f_011[i] + f_110[i] + f_111[i]);
888                                o[INDEX3(i,2,0,numComp,3)] = tmp0_4*(f_000[i] + f_100[i]) + tmp0_5*(f_001[i] + f_101[i]);
889                            } /* end of component loop i */
890                        } /* end of k0 loop */
891                    } /* end of k2 loop */
892                } /* end of face 2 */
893                if (m_faceOffset[3] > -1) {
894                    const double tmp0_0 = -0.5/h0;
895                    const double tmp0_4 = 0.5/h2;
896                    const double tmp0_1 = 0.5/h0;
897                    const double tmp0_5 = -0.5/h2;
898                    const double tmp0_2 = 0.25/h1;
899                    const double tmp0_3 = -0.25/h1;
900    #pragma omp for nowait
901                    for (index_t k2=0; k2 < m_NE2; ++k2) {
902                        for (index_t k0=0; k0 < m_NE0; ++k0) {
903                            const register double* f_011 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2+1, m_N0,m_N1));
904                            const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2, m_N0,m_N1));
905                            const register double* f_010 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2, m_N0,m_N1));
906                            const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2+1, m_N0,m_N1));
907                            const register double* f_000 = in.getSampleDataRO(INDEX3(k0,m_N1-2,k2, m_N0,m_N1));
908                            const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,m_N1-2,k2+1, m_N0,m_N1));
909                            const register double* f_001 = in.getSampleDataRO(INDEX3(k0,m_N1-2,k2+1, m_N0,m_N1));
910                            const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,m_N1-2,k2, m_N0,m_N1));
911                            double* o = out.getSampleDataRW(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));
912                            for (index_t i=0; i < numComp; ++i) {
913                                o[INDEX3(i,0,0,numComp,3)] = tmp0_0*(f_010[i] + f_011[i]) + tmp0_1*(f_110[i] + f_111[i]);
914                                o[INDEX3(i,1,0,numComp,3)] = tmp0_2*(f_010[i] + f_011[i] + f_110[i] + f_111[i]) + tmp0_3*(f_000[i] + f_001[i] + f_100[i] + f_101[i]);
915                                o[INDEX3(i,2,0,numComp,3)] = tmp0_4*(f_011[i] + f_111[i]) + tmp0_5*(f_010[i] + f_110[i]);
916                            } /* end of component loop i */
917                        } /* end of k0 loop */
918                    } /* end of k2 loop */
919                } /* end of face 3 */
920                if (m_faceOffset[4] > -1) {
921                    const double tmp0_0 = -0.5/h0;
922                    const double tmp0_4 = -0.25/h2;
923                    const double tmp0_1 = 0.5/h0;
924                    const double tmp0_5 = 0.25/h2;
925                    const double tmp0_2 = -0.5/h1;
926                    const double tmp0_3 = 0.5/h1;
927    #pragma omp for nowait
928                  for (index_t k1=0; k1 < m_NE1; ++k1) {                  for (index_t k1=0; k1 < m_NE1; ++k1) {
929                      const register double* f_000 = in.getSampleDataRO(INDEX3(0,k1,k2, m_N0,m_N1));                      for (index_t k0=0; k0 < m_NE0; ++k0) {
930                      const register double* f_001 = in.getSampleDataRO(INDEX3(0,k1,k2+1, m_N0,m_N1));                          const register double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,0, m_N0,m_N1));
931                      const register double* f_101 = in.getSampleDataRO(INDEX3(1,k1,k2+1, m_N0,m_N1));                          const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,0, m_N0,m_N1));
932                      const register double* f_011 = in.getSampleDataRO(INDEX3(0,k1+1,k2+1, m_N0,m_N1));                          const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,0, m_N0,m_N1));
933                      const register double* f_100 = in.getSampleDataRO(INDEX3(1,k1,k2, m_N0,m_N1));                          const register double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,0, m_N0,m_N1));
934                      const register double* f_110 = in.getSampleDataRO(INDEX3(1,k1+1,k2, m_N0,m_N1));                          const register double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,1, m_N0,m_N1));
935                      const register double* f_010 = in.getSampleDataRO(INDEX3(0,k1+1,k2, m_N0,m_N1));                          const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,1, m_N0,m_N1));
936                      const register double* f_111 = in.getSampleDataRO(INDEX3(1,k1+1,k2+1, m_N0,m_N1));                          const register double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,1, m_N0,m_N1));
937                      double* o = out.getSampleDataRW(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));                          const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,1, m_N0,m_N1));
938                      for (index_t i=0; i < numComp; ++i) {                          double* o = out.getSampleDataRW(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));
939                          o[INDEX3(i,0,0,numComp,3)] = tmp0_0*(f_000[i] + f_001[i] + f_010[i] + f_011[i]) + tmp0_1*(f_100[i] + f_101[i] + f_110[i] + f_111[i]);                          for (index_t i=0; i < numComp; ++i) {
940                          o[INDEX3(i,1,0,numComp,3)] = tmp0_2*(f_000[i] + f_001[i]) + tmp0_3*(f_010[i] + f_011[i]);                              o[INDEX3(i,0,0,numComp,3)] = tmp0_0*(f_000[i] + f_010[i]) + tmp0_1*(f_100[i] + f_110[i]);
941                          o[INDEX3(i,2,0,numComp,3)] = tmp0_4*(f_000[i] + f_010[i]) + tmp0_5*(f_001[i] + f_011[i]);                              o[INDEX3(i,1,0,numComp,3)] = tmp0_2*(f_000[i] + f_100[i]) + tmp0_3*(f_010[i] + f_110[i]);
942                      } /* end of component loop i */                              o[INDEX3(i,2,0,numComp,3)] = tmp0_4*(f_000[i] + f_010[i] + f_100[i] + f_110[i]) + tmp0_5*(f_001[i] + f_011[i] + f_101[i] + f_111[i]);
943                            } /* end of component loop i */
944                        } /* end of k0 loop */
945                  } /* end of k1 loop */                  } /* end of k1 loop */
946              } /* end of k2 loop */              } /* end of face 4 */
947          } /* end of face 0 */              if (m_faceOffset[5] > -1) {
948          if (m_faceOffset[1] > -1) {                  const double tmp0_0 = -0.5/h0;
949              const double tmp0_0 = -0.25/h0;                  const double tmp0_4 = 0.25/h2;
950              const double tmp0_4 = 0.5/h2;                  const double tmp0_1 = 0.5/h0;
951              const double tmp0_1 = 0.25/h0;                  const double tmp0_5 = -0.25/h2;
952              const double tmp0_5 = -0.5/h2;                  const double tmp0_2 = -0.5/h1;
953              const double tmp0_2 = -0.5/h1;                  const double tmp0_3 = 0.5/h1;
954              const double tmp0_3 = 0.5/h1;  #pragma omp for nowait
 #pragma omp parallel for  
             for (index_t k2=0; k2 < m_NE2; ++k2) {  
955                  for (index_t k1=0; k1 < m_NE1; ++k1) {                  for (index_t k1=0; k1 < m_NE1; ++k1) {
956                      const register double* f_000 = in.getSampleDataRO(INDEX3(m_N0-2,k1,k2, m_N0,m_N1));                      for (index_t k0=0; k0 < m_NE0; ++k0) {
957                      const register double* f_001 = in.getSampleDataRO(INDEX3(m_N0-2,k1,k2+1, m_N0,m_N1));                          const register double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,m_N2-1, m_N0,m_N1));
958                      const register double* f_101 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2+1, m_N0,m_N1));                          const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,m_N2-1, m_N0,m_N1));
959                      const register double* f_011 = in.getSampleDataRO(INDEX3(m_N0-2,k1+1,k2+1, m_N0,m_N1));                          const register double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,m_N2-1, m_N0,m_N1));
960                      const register double* f_100 = in.getSampleDataRO(INDEX3(m_N0-1,k1,k2, m_N0,m_N1));                          const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,m_N2-1, m_N0,m_N1));
961                      const register double* f_110 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2, m_N0,m_N1));                          const register double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,m_N2-2, m_N0,m_N1));
962                      const register double* f_010 = in.getSampleDataRO(INDEX3(m_N0-2,k1+1,k2, m_N0,m_N1));                          const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,m_N2-2, m_N0,m_N1));
963                      const register double* f_111 = in.getSampleDataRO(INDEX3(m_N0-1,k1+1,k2+1, m_N0,m_N1));                          const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,m_N2-2, m_N0,m_N1));
964                      double* o = out.getSampleDataRW(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));                          const register double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,m_N2-2, m_N0,m_N1));
965                      for (index_t i=0; i < numComp; ++i) {                          double* o = out.getSampleDataRW(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));
966                          o[INDEX3(i,0,0,numComp,3)] = tmp0_0*(f_000[i] + f_001[i] + f_010[i] + f_011[i]) + tmp0_1*(f_100[i] + f_101[i] + f_110[i] + f_111[i]);                          for (index_t i=0; i < numComp; ++i) {
967                          o[INDEX3(i,1,0,numComp,3)] = tmp0_2*(f_100[i] + f_101[i]) + tmp0_3*(f_110[i] + f_111[i]);                              o[INDEX3(i,0,0,numComp,3)] = tmp0_0*(f_001[i] + f_011[i]) + tmp0_1*(f_101[i] + f_111[i]);
968                          o[INDEX3(i,2,0,numComp,3)] = tmp0_4*(f_101[i] + f_111[i]) + tmp0_5*(f_100[i] + f_110[i]);                              o[INDEX3(i,1,0,numComp,3)] = tmp0_2*(f_001[i] + f_101[i]) + tmp0_3*(f_011[i] + f_111[i]);
969                      } /* end of component loop i */                              o[INDEX3(i,2,0,numComp,3)] = tmp0_4*(f_001[i] + f_011[i] + f_101[i] + f_111[i]) + tmp0_5*(f_000[i] + f_010[i] + f_100[i] + f_110[i]);
970                            } /* end of component loop i */
971                        } /* end of k0 loop */
972                  } /* end of k1 loop */                  } /* end of k1 loop */
973              } /* end of k2 loop */              } /* end of face 5 */
974          } /* end of face 1 */          } // end of parallel section
         if (m_faceOffset[2] > -1) {  
             const double tmp0_0 = -0.5/h0;  
             const double tmp0_4 = -0.5/h2;  
             const double tmp0_1 = 0.5/h0;  
             const double tmp0_5 = 0.5/h2;  
             const double tmp0_2 = -0.25/h1;  
             const double tmp0_3 = 0.25/h1;  
 #pragma omp parallel for  
             for (index_t k2=0; k2 < m_NE2; ++k2) {  
                 for (index_t k0=0; k0 < m_NE0; ++k0) {  
                     const register double* f_000 = in.getSampleDataRO(INDEX3(k0,0,k2, m_N0,m_N1));  
                     const register double* f_001 = in.getSampleDataRO(INDEX3(k0,0,k2+1, m_N0,m_N1));  
                     const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,0,k2+1, m_N0,m_N1));  
                     const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,0,k2, m_N0,m_N1));  
                     const register double* f_011 = in.getSampleDataRO(INDEX3(k0,1,k2+1, m_N0,m_N1));  
                     const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,1,k2, m_N0,m_N1));  
                     const register double* f_010 = in.getSampleDataRO(INDEX3(k0,1,k2, m_N0,m_N1));  
                     const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,1,k2+1, m_N0,m_N1));  
                     double* o = out.getSampleDataRW(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));  
                     for (index_t i=0; i < numComp; ++i) {  
                         o[INDEX3(i,0,0,numComp,3)] = tmp0_0*(f_000[i] + f_001[i]) + tmp0_1*(f_100[i] + f_101[i]);  
                         o[INDEX3(i,1,0,numComp,3)] = tmp0_2*(f_000[i] + f_001[i] + f_100[i] + f_101[i]) + tmp0_3*(f_010[i] + f_011[i] + f_110[i] + f_111[i]);  
                         o[INDEX3(i,2,0,numComp,3)] = tmp0_4*(f_000[i] + f_100[i]) + tmp0_5*(f_001[i] + f_101[i]);  
                     } /* end of component loop i */  
                 } /* end of k0 loop */  
             } /* end of k2 loop */  
         } /* end of face 2 */  
         if (m_faceOffset[3] > -1) {  
             const double tmp0_0 = -0.5/h0;  
             const double tmp0_4 = 0.5/h2;  
             const double tmp0_1 = 0.5/h0;  
             const double tmp0_5 = -0.5/h2;  
             const double tmp0_2 = 0.25/h1;  
             const double tmp0_3 = -0.25/h1;  
 #pragma omp parallel for  
             for (index_t k2=0; k2 < m_NE2; ++k2) {  
                 for (index_t k0=0; k0 < m_NE0; ++k0) {  
                     const register double* f_011 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2+1, m_N0,m_N1));  
                     const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2, m_N0,m_N1));  
                     const register double* f_010 = in.getSampleDataRO(INDEX3(k0,m_N1-1,k2, m_N0,m_N1));  
                     const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,m_N1-1,k2+1, m_N0,m_N1));  
                     const register double* f_000 = in.getSampleDataRO(INDEX3(k0,m_N1-2,k2, m_N0,m_N1));  
                     const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,m_N1-2,k2+1, m_N0,m_N1));  
                     const register double* f_001 = in.getSampleDataRO(INDEX3(k0,m_N1-2,k2+1, m_N0,m_N1));  
                     const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,m_N1-2,k2, m_N0,m_N1));  
                     double* o = out.getSampleDataRW(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));  
                     for (index_t i=0; i < numComp; ++i) {  
                         o[INDEX3(i,0,0,numComp,3)] = tmp0_0*(f_010[i] + f_011[i]) + tmp0_1*(f_110[i] + f_111[i]);  
                         o[INDEX3(i,1,0,numComp,3)] = tmp0_2*(f_010[i] + f_011[i] + f_110[i] + f_111[i]) + tmp0_3*(f_000[i] + f_001[i] + f_100[i] + f_101[i]);  
                         o[INDEX3(i,2,0,numComp,3)] = tmp0_4*(f_011[i] + f_111[i]) + tmp0_5*(f_010[i] + f_110[i]);  
                     } /* end of component loop i */  
                 } /* end of k0 loop */  
             } /* end of k2 loop */  
         } /* end of face 3 */  
         if (m_faceOffset[4] > -1) {  
             const double tmp0_0 = -0.5/h0;  
             const double tmp0_4 = -0.25/h2;  
             const double tmp0_1 = 0.5/h0;  
             const double tmp0_5 = 0.25/h2;  
             const double tmp0_2 = -0.5/h1;  
             const double tmp0_3 = 0.5/h1;  
 #pragma omp parallel for  
             for (index_t k1=0; k1 < m_NE1; ++k1) {  
                 for (index_t k0=0; k0 < m_NE0; ++k0) {  
                     const register double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,0, m_N0,m_N1));  
                     const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,0, m_N0,m_N1));  
                     const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,0, m_N0,m_N1));  
                     const register double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,0, m_N0,m_N1));  
                     const register double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,1, m_N0,m_N1));  
                     const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,1, m_N0,m_N1));  
                     const register double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,1, m_N0,m_N1));  
                     const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,1, m_N0,m_N1));  
                     double* o = out.getSampleDataRW(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));  
                     for (index_t i=0; i < numComp; ++i) {  
                         o[INDEX3(i,0,0,numComp,3)] = tmp0_0*(f_000[i] + f_010[i]) + tmp0_1*(f_100[i] + f_110[i]);  
                         o[INDEX3(i,1,0,numComp,3)] = tmp0_2*(f_000[i] + f_100[i]) + tmp0_3*(f_010[i] + f_110[i]);  
                         o[INDEX3(i,2,0,numComp,3)] = tmp0_4*(f_000[i] + f_010[i] + f_100[i] + f_110[i]) + tmp0_5*(f_001[i] + f_011[i] + f_101[i] + f_111[i]);  
                     } /* end of component loop i */  
                 } /* end of k0 loop */  
             } /* end of k1 loop */  
         } /* end of face 4 */  
         if (m_faceOffset[5] > -1) {  
             const double tmp0_0 = -0.5/h0;  
             const double tmp0_4 = 0.25/h2;  
             const double tmp0_1 = 0.5/h0;  
             const double tmp0_5 = -0.25/h2;  
             const double tmp0_2 = -0.5/h1;  
             const double tmp0_3 = 0.5/h1;  
 #pragma omp parallel for  
             for (index_t k1=0; k1 < m_NE1; ++k1) {  
                 for (index_t k0=0; k0 < m_NE0; ++k0) {  
                     const register double* f_001 = in.getSampleDataRO(INDEX3(k0,k1,m_N2-1, m_N0,m_N1));  
                     const register double* f_101 = in.getSampleDataRO(INDEX3(k0+1,k1,m_N2-1, m_N0,m_N1));  
                     const register double* f_011 = in.getSampleDataRO(INDEX3(k0,k1+1,m_N2-1, m_N0,m_N1));  
                     const register double* f_111 = in.getSampleDataRO(INDEX3(k0+1,k1+1,m_N2-1, m_N0,m_N1));  
                     const register double* f_000 = in.getSampleDataRO(INDEX3(k0,k1,m_N2-2, m_N0,m_N1));  
                     const register double* f_100 = in.getSampleDataRO(INDEX3(k0+1,k1,m_N2-2, m_N0,m_N1));  
                     const register double* f_110 = in.getSampleDataRO(INDEX3(k0+1,k1+1,m_N2-2, m_N0,m_N1));  
                     const register double* f_010 = in.getSampleDataRO(INDEX3(k0,k1+1,m_N2-2, m_N0,m_N1));  
                     double* o = out.getSampleDataRW(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));  
                     for (index_t i=0; i < numComp; ++i) {  
                         o[INDEX3(i,0,0,numComp,3)] = tmp0_0*(f_001[i] + f_011[i]) + tmp0_1*(f_101[i] + f_111[i]);  
                         o[INDEX3(i,1,0,numComp,3)] = tmp0_2*(f_001[i] + f_101[i]) + tmp0_3*(f_011[i] + f_111[i]);  
                         o[INDEX3(i,2,0,numComp,3)] = tmp0_4*(f_001[i] + f_011[i] + f_101[i] + f_111[i]) + tmp0_5*(f_000[i] + f_010[i] + f_100[i] + f_110[i]);  
                     } /* end of component loop i */  
                 } /* end of k0 loop */  
             } /* end of k1 loop */  
         } /* end of face 5 */  
975          /* GENERATOR SNIP_GRAD_REDUCED_FACES BOTTOM */          /* GENERATOR SNIP_GRAD_REDUCED_FACES BOTTOM */
976      } else {      } else {
977          stringstream msg;          stringstream msg;
# Line 987  void Brick::setToIntegrals(vector<double Line 993  void Brick::setToIntegrals(vector<double
993  #pragma omp parallel  #pragma omp parallel
994          {          {
995              vector<double> int_local(numComp, 0);              vector<double> int_local(numComp, 0);
996  #pragma omp for  #pragma omp for nowait
997              for (index_t k2 = 0; k2 < m_NE2; ++k2) {              for (index_t k2 = 0; k2 < m_NE2; ++k2) {
998                  for (index_t k1 = 0; k1 < m_NE1; ++k1) {                  for (index_t k1 = 0; k1 < m_NE1; ++k1) {
999                      for (index_t k0 = 0; k0 < m_NE0; ++k0) {                      for (index_t k0 = 0; k0 < m_NE0; ++k0) {
# Line 1010  void Brick::setToIntegrals(vector<double Line 1016  void Brick::setToIntegrals(vector<double
1016  #pragma omp critical  #pragma omp critical
1017              for (index_t i=0; i<numComp; i++)              for (index_t i=0; i<numComp; i++)
1018                  integrals[i]+=int_local[i];                  integrals[i]+=int_local[i];
1019          }          } // end of parallel section
1020      } else if (arg.getFunctionSpace().getTypeCode() == ReducedElements) {      } else if (arg.getFunctionSpace().getTypeCode() == ReducedElements) {
1021          const double w_0 = h0*h1*h2;          const double w_0 = h0*h1*h2;
1022  #pragma omp parallel  #pragma omp parallel
1023          {          {
1024              vector<double> int_local(numComp, 0);              vector<double> int_local(numComp, 0);
1025  #pragma omp for  #pragma omp for nowait
1026              for (index_t k2 = 0; k2 < m_NE2; ++k2) {              for (index_t k2 = 0; k2 < m_NE2; ++k2) {
1027                  for (index_t k1 = 0; k1 < m_NE1; ++k1) {                  for (index_t k1 = 0; k1 < m_NE1; ++k1) {
1028                      for (index_t k0 = 0; k0 < m_NE0; ++k0) {                      for (index_t k0 = 0; k0 < m_NE0; ++k0) {
# Line 1031  void Brick::setToIntegrals(vector<double Line 1037  void Brick::setToIntegrals(vector<double
1037  #pragma omp critical  #pragma omp critical
1038              for (index_t i=0; i<numComp; i++)              for (index_t i=0; i<numComp; i++)
1039                  integrals[i]+=int_local[i];                  integrals[i]+=int_local[i];
1040          }          } // end of parallel section
1041      } else if (arg.getFunctionSpace().getTypeCode() == FaceElements) {      } else if (arg.getFunctionSpace().getTypeCode() == FaceElements) {
1042          const double w_0 = h1*h2/4.;          const double w_0 = h1*h2/4.;
1043          const double w_1 = h0*h2/4.;          const double w_1 = h0*h2/4.;
# Line 1040  void Brick::setToIntegrals(vector<double Line 1046  void Brick::setToIntegrals(vector<double
1046          {          {
1047              vector<double> int_local(numComp, 0);              vector<double> int_local(numComp, 0);
1048              if (m_faceOffset[0] > -1) {              if (m_faceOffset[0] > -1) {
1049  #pragma omp for  #pragma omp for nowait
1050                  for (index_t k2=0; k2 < m_NE2; ++k2) {                  for (index_t k2=0; k2 < m_NE2; ++k2) {
1051                      for (index_t k1=0; k1 < m_NE1; ++k1) {                      for (index_t k1=0; k1 < m_NE1; ++k1) {
1052                          const double* f = in.getSampleDataRO(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));                          const double* f = in.getSampleDataRO(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));
# Line 1056  void Brick::setToIntegrals(vector<double Line 1062  void Brick::setToIntegrals(vector<double
1062              }              }
1063    
1064              if (m_faceOffset[1] > -1) {              if (m_faceOffset[1] > -1) {
1065  #pragma omp for  #pragma omp for nowait
1066                  for (index_t k2=0; k2 < m_NE2; ++k2) {                  for (index_t k2=0; k2 < m_NE2; ++k2) {
1067                      for (index_t k1=0; k1 < m_NE1; ++k1) {                      for (index_t k1=0; k1 < m_NE1; ++k1) {
1068                          const double* f = in.getSampleDataRO(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));                          const double* f = in.getSampleDataRO(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));
# Line 1072  void Brick::setToIntegrals(vector<double Line 1078  void Brick::setToIntegrals(vector<double
1078              }              }
1079    
1080              if (m_faceOffset[2] > -1) {              if (m_faceOffset[2] > -1) {
1081  #pragma omp for  #pragma omp for nowait
1082                  for (index_t k2=0; k2 < m_NE2; ++k2) {                  for (index_t k2=0; k2 < m_NE2; ++k2) {
1083                      for (index_t k0=0; k0 < m_NE0; ++k0) {                      for (index_t k0=0; k0 < m_NE0; ++k0) {
1084                          const double* f = in.getSampleDataRO(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));                          const double* f = in.getSampleDataRO(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));
# Line 1088  void Brick::setToIntegrals(vector<double Line 1094  void Brick::setToIntegrals(vector<double
1094              }              }
1095    
1096              if (m_faceOffset[3] > -1) {              if (m_faceOffset[3] > -1) {
1097  #pragma omp for  #pragma omp for nowait
1098                  for (index_t k2=0; k2 < m_NE2; ++k2) {                  for (index_t k2=0; k2 < m_NE2; ++k2) {
1099                      for (index_t k0=0; k0 < m_NE0; ++k0) {                      for (index_t k0=0; k0 < m_NE0; ++k0) {
1100                          const double* f = in.getSampleDataRO(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));                          const double* f = in.getSampleDataRO(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));
# Line 1104  void Brick::setToIntegrals(vector<double Line 1110  void Brick::setToIntegrals(vector<double
1110              }              }
1111    
1112              if (m_faceOffset[4] > -1) {              if (m_faceOffset[4] > -1) {
1113  #pragma omp for  #pragma omp for nowait
1114                  for (index_t k1=0; k1 < m_NE1; ++k1) {                  for (index_t k1=0; k1 < m_NE1; ++k1) {
1115                      for (index_t k0=0; k0 < m_NE0; ++k0) {                      for (index_t k0=0; k0 < m_NE0; ++k0) {
1116                          const double* f = in.getSampleDataRO(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));                          const double* f = in.getSampleDataRO(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));
# Line 1120  void Brick::setToIntegrals(vector<double Line 1126  void Brick::setToIntegrals(vector<double
1126              }              }
1127    
1128              if (m_faceOffset[5] > -1) {              if (m_faceOffset[5] > -1) {
1129  #pragma omp for  #pragma omp for nowait
1130                  for (index_t k1=0; k1 < m_NE1; ++k1) {                  for (index_t k1=0; k1 < m_NE1; ++k1) {
1131                      for (index_t k0=0; k0 < m_NE0; ++k0) {                      for (index_t k0=0; k0 < m_NE0; ++k0) {
1132                          const double* f = in.getSampleDataRO(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));                          const double* f = in.getSampleDataRO(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));
# Line 1138  void Brick::setToIntegrals(vector<double Line 1144  void Brick::setToIntegrals(vector<double
1144  #pragma omp critical  #pragma omp critical
1145              for (index_t i=0; i<numComp; i++)              for (index_t i=0; i<numComp; i++)
1146                  integrals[i]+=int_local[i];                  integrals[i]+=int_local[i];
1147          }          } // end of parallel section
1148    
1149      } else if (arg.getFunctionSpace().getTypeCode() == ReducedFaceElements) {      } else if (arg.getFunctionSpace().getTypeCode() == ReducedFaceElements) {
1150          const double w_0 = h1*h2;          const double w_0 = h1*h2;
# Line 1148  void Brick::setToIntegrals(vector<double Line 1154  void Brick::setToIntegrals(vector<double
1154          {          {
1155              vector<double> int_local(numComp, 0);              vector<double> int_local(numComp, 0);
1156              if (m_faceOffset[0] > -1) {              if (m_faceOffset[0] > -1) {
1157  #pragma omp for  #pragma omp for nowait
1158                  for (index_t k2=0; k2 < m_NE2; ++k2) {                  for (index_t k2=0; k2 < m_NE2; ++k2) {
1159                      for (index_t k1=0; k1 < m_NE1; ++k1) {                      for (index_t k1=0; k1 < m_NE1; ++k1) {
1160                          const double* f = in.getSampleDataRO(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));                          const double* f = in.getSampleDataRO(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));
# Line 1160  void Brick::setToIntegrals(vector<double Line 1166  void Brick::setToIntegrals(vector<double
1166              }              }
1167    
1168              if (m_faceOffset[1] > -1) {              if (m_faceOffset[1] > -1) {
1169  #pragma omp for  #pragma omp for nowait
1170                  for (index_t k2=0; k2 < m_NE2; ++k2) {                  for (index_t k2=0; k2 < m_NE2; ++k2) {
1171                      for (index_t k1=0; k1 < m_NE1; ++k1) {                      for (index_t k1=0; k1 < m_NE1; ++k1) {
1172                          const double* f = in.getSampleDataRO(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));                          const double* f = in.getSampleDataRO(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));
# Line 1172  void Brick::setToIntegrals(vector<double Line 1178  void Brick::setToIntegrals(vector<double
1178              }              }
1179    
1180              if (m_faceOffset[2] > -1) {              if (m_faceOffset[2] > -1) {
1181  #pragma omp for  #pragma omp for nowait
1182                  for (index_t k2=0; k2 < m_NE2; ++k2) {                  for (index_t k2=0; k2 < m_NE2; ++k2) {
1183                      for (index_t k0=0; k0 < m_NE0; ++k0) {                      for (index_t k0=0; k0 < m_NE0; ++k0) {
1184                          const double* f = in.getSampleDataRO(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));                          const double* f = in.getSampleDataRO(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));
# Line 1184  void Brick::setToIntegrals(vector<double Line 1190  void Brick::setToIntegrals(vector<double
1190              }              }
1191    
1192              if (m_faceOffset[3] > -1) {              if (m_faceOffset[3] > -1) {
1193  #pragma omp for  #pragma omp for nowait
1194                  for (index_t k2=0; k2 < m_NE2; ++k2) {                  for (index_t k2=0; k2 < m_NE2; ++k2) {
1195                      for (index_t k0=0; k0 < m_NE0; ++k0) {                      for (index_t k0=0; k0 < m_NE0; ++k0) {
1196                          const double* f = in.getSampleDataRO(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));                          const double* f = in.getSampleDataRO(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));
# Line 1196  void Brick::setToIntegrals(vector<double Line 1202  void Brick::setToIntegrals(vector<double
1202              }              }
1203    
1204              if (m_faceOffset[4] > -1) {              if (m_faceOffset[4] > -1) {
1205  #pragma omp for  #pragma omp for nowait
1206                  for (index_t k1=0; k1 < m_NE1; ++k1) {                  for (index_t k1=0; k1 < m_NE1; ++k1) {
1207                      for (index_t k0=0; k0 < m_NE0; ++k0) {                      for (index_t k0=0; k0 < m_NE0; ++k0) {
1208                          const double* f = in.getSampleDataRO(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));                          const double* f = in.getSampleDataRO(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));
# Line 1208  void Brick::setToIntegrals(vector<double Line 1214  void Brick::setToIntegrals(vector<double
1214              }              }
1215    
1216              if (m_faceOffset[5] > -1) {              if (m_faceOffset[5] > -1) {
1217  #pragma omp for  #pragma omp for nowait
1218                  for (index_t k1=0; k1 < m_NE1; ++k1) {                  for (index_t k1=0; k1 < m_NE1; ++k1) {
1219                      for (index_t k0=0; k0 < m_NE0; ++k0) {                      for (index_t k0=0; k0 < m_NE0; ++k0) {
1220                          const double* f = in.getSampleDataRO(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));                          const double* f = in.getSampleDataRO(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));
# Line 1222  void Brick::setToIntegrals(vector<double Line 1228  void Brick::setToIntegrals(vector<double
1228  #pragma omp critical  #pragma omp critical
1229              for (index_t i=0; i<numComp; i++)              for (index_t i=0; i<numComp; i++)
1230                  integrals[i]+=int_local[i];                  integrals[i]+=int_local[i];
1231          }          } // end of parallel section
1232    
1233      } else {      } else {
1234          stringstream msg;          stringstream msg;
# Line 1232  void Brick::setToIntegrals(vector<double Line 1238  void Brick::setToIntegrals(vector<double
1238      }      }
1239  }  }
1240    
1241    void Brick::setToNormal(escript::Data& out) const
1242    {
1243        if (out.getFunctionSpace().getTypeCode() == FaceElements) {
1244    #pragma omp parallel
1245            {
1246                if (m_faceOffset[0] > -1) {
1247    #pragma omp for nowait
1248                    for (index_t k2 = 0; k2 < m_NE2; ++k2) {
1249                        for (index_t k1 = 0; k1 < m_NE1; ++k1) {
1250                            double* o = out.getSampleDataRW(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));
1251                            // set vector at four quadrature points
1252                            *o++ = -1.; *o++ = 0.; *o++ = 0.;
1253                            *o++ = -1.; *o++ = 0.; *o++ = 0.;
1254                            *o++ = -1.; *o++ = 0.; *o++ = 0.;
1255                            *o++ = -1.; *o++ = 0.; *o = 0.;
1256                        }
1257                    }
1258                }
1259    
1260                if (m_faceOffset[1] > -1) {
1261    #pragma omp for nowait
1262                    for (index_t k2 = 0; k2 < m_NE2; ++k2) {
1263                        for (index_t k1 = 0; k1 < m_NE1; ++k1) {
1264                            double* o = out.getSampleDataRW(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));
1265                            // set vector at four quadrature points
1266                            *o++ = 1.; *o++ = 0.; *o++ = 0.;
1267                            *o++ = 1.; *o++ = 0.; *o++ = 0.;
1268                            *o++ = 1.; *o++ = 0.; *o++ = 0.;
1269                            *o++ = 1.; *o++ = 0.; *o = 0.;
1270                        }
1271                    }
1272                }
1273    
1274                if (m_faceOffset[2] > -1) {
1275    #pragma omp for nowait
1276                    for (index_t k2 = 0; k2 < m_NE2; ++k2) {
1277                        for (index_t k0 = 0; k0 < m_NE0; ++k0) {
1278                            double* o = out.getSampleDataRW(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));
1279                            // set vector at four quadrature points
1280                            *o++ = 0.; *o++ = -1.; *o++ = 0.;
1281                            *o++ = 0.; *o++ = -1.; *o++ = 0.;
1282                            *o++ = 0.; *o++ = -1.; *o++ = 0.;
1283                            *o++ = 0.; *o++ = -1.; *o = 0.;
1284                        }
1285                    }
1286                }
1287    
1288                if (m_faceOffset[3] > -1) {
1289    #pragma omp for nowait
1290                    for (index_t k2 = 0; k2 < m_NE2; ++k2) {
1291                        for (index_t k0 = 0; k0 < m_NE0; ++k0) {
1292                            double* o = out.getSampleDataRW(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));
1293                            // set vector at four quadrature points
1294                            *o++ = 0.; *o++ = 1.; *o++ = 0.;
1295                            *o++ = 0.; *o++ = 1.; *o++ = 0.;
1296                            *o++ = 0.; *o++ = 1.; *o++ = 0.;
1297                            *o++ = 0.; *o++ = 1.; *o = 0.;
1298                        }
1299                    }
1300                }
1301    
1302                if (m_faceOffset[4] > -1) {
1303    #pragma omp for nowait
1304                    for (index_t k1 = 0; k1 < m_NE1; ++k1) {
1305                        for (index_t k0 = 0; k0 < m_NE0; ++k0) {
1306                            double* o = out.getSampleDataRW(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));
1307                            // set vector at four quadrature points
1308                            *o++ = 0.; *o++ = 0.; *o++ = -1.;
1309                            *o++ = 0.; *o++ = 0.; *o++ = -1.;
1310                            *o++ = 0.; *o++ = 0.; *o++ = -1.;
1311                            *o++ = 0.; *o++ = 0.; *o = -1.;
1312                        }
1313                    }
1314                }
1315    
1316                if (m_faceOffset[5] > -1) {
1317    #pragma omp for nowait
1318                    for (index_t k1 = 0; k1 < m_NE1; ++k1) {
1319                        for (index_t k0 = 0; k0 < m_NE0; ++k0) {
1320                            double* o = out.getSampleDataRW(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));
1321                            // set vector at four quadrature points
1322                            *o++ = 0.; *o++ = 0.; *o++ = 1.;
1323                            *o++ = 0.; *o++ = 0.; *o++ = 1.;
1324                            *o++ = 0.; *o++ = 0.; *o++ = 1.;
1325                            *o++ = 0.; *o++ = 0.; *o = 1.;
1326                        }
1327                    }
1328                }
1329            } // end of parallel section
1330        } else if (out.getFunctionSpace().getTypeCode() == ReducedFaceElements) {
1331    #pragma omp parallel
1332            {
1333                if (m_faceOffset[0] > -1) {
1334    #pragma omp for nowait
1335                    for (index_t k2 = 0; k2 < m_NE2; ++k2) {
1336                        for (index_t k1 = 0; k1 < m_NE1; ++k1) {
1337                            double* o = out.getSampleDataRW(m_faceOffset[0]+INDEX2(k1,k2,m_NE1));
1338                            *o++ = -1.;
1339                            *o++ = 0.;
1340                            *o = 0.;
1341                        }
1342                    }
1343                }
1344    
1345                if (m_faceOffset[1] > -1) {
1346    #pragma omp for nowait
1347                    for (index_t k2 = 0; k2 < m_NE2; ++k2) {
1348                        for (index_t k1 = 0; k1 < m_NE1; ++k1) {
1349                            double* o = out.getSampleDataRW(m_faceOffset[1]+INDEX2(k1,k2,m_NE1));
1350                            *o++ = 1.;
1351                            *o++ = 0.;
1352                            *o = 0.;
1353                        }
1354                    }
1355                }
1356    
1357                if (m_faceOffset[2] > -1) {
1358    #pragma omp for nowait
1359                    for (index_t k2 = 0; k2 < m_NE2; ++k2) {
1360                        for (index_t k0 = 0; k0 < m_NE0; ++k0) {
1361                            double* o = out.getSampleDataRW(m_faceOffset[2]+INDEX2(k0,k2,m_NE0));
1362                            *o++ = 0.;
1363                            *o++ = -1.;
1364                            *o = 0.;
1365                        }
1366                    }
1367                }
1368    
1369                if (m_faceOffset[3] > -1) {
1370    #pragma omp for nowait
1371                    for (index_t k2 = 0; k2 < m_NE2; ++k2) {
1372                        for (index_t k0 = 0; k0 < m_NE0; ++k0) {
1373                            double* o = out.getSampleDataRW(m_faceOffset[3]+INDEX2(k0,k2,m_NE0));
1374                            *o++ = 0.;
1375                            *o++ = 1.;
1376                            *o = 0.;
1377                        }
1378                    }
1379                }
1380    
1381                if (m_faceOffset[4] > -1) {
1382    #pragma omp for nowait
1383                    for (index_t k1 = 0; k1 < m_NE1; ++k1) {
1384                        for (index_t k0 = 0; k0 < m_NE0; ++k0) {
1385                            double* o = out.getSampleDataRW(m_faceOffset[4]+INDEX2(k0,k1,m_NE0));
1386                            *o++ = 0.;
1387                            *o++ = 0.;
1388                            *o = -1.;
1389                        }
1390                    }
1391                }
1392    
1393                if (m_faceOffset[5] > -1) {
1394    #pragma omp for nowait
1395                    for (index_t k1 = 0; k1 < m_NE1; ++k1) {
1396                        for (index_t k0 = 0; k0 < m_NE0; ++k0) {
1397                            double* o = out.getSampleDataRW(m_faceOffset[5]+INDEX2(k0,k1,m_NE0));
1398                            *o++ = 0.;
1399                            *o++ = 0.;
1400                            *o = 1.;
1401                        }
1402                    }
1403                }
1404            } // end of parallel section
1405    
1406        } else {
1407            stringstream msg;
1408            msg << "setToNormal() not implemented for "
1409                << functionSpaceTypeAsString(out.getFunctionSpace().getTypeCode());
1410            throw RipleyException(msg.str());
1411        }
1412    }
1413    
1414  Paso_SystemMatrixPattern* Brick::getPattern(bool reducedRowOrder,  Paso_SystemMatrixPattern* Brick::getPattern(bool reducedRowOrder,
1415                                              bool reducedColOrder) const                                              bool reducedColOrder) const
1416  {  {
# Line 1526  void Brick::populateSampleIds() Line 1705  void Brick::populateSampleIds()
1705          m_faceId[k]=k;          m_faceId[k]=k;
1706      }      }
1707    
1708      // generate face offset vector      // generate face offset vector and set face tags
1709      const IndexVector facesPerEdge = getNumFacesPerBoundary();      const IndexVector facesPerEdge = getNumFacesPerBoundary();
1710        const index_t LEFT=1, RIGHT=2, BOTTOM=10, TOP=20, FRONT=100, BACK=200;
1711        const index_t faceTag[] = { LEFT, RIGHT, BOTTOM, TOP, FRONT, BACK };
1712      m_faceOffset.assign(facesPerEdge.size(), -1);      m_faceOffset.assign(facesPerEdge.size(), -1);
1713        m_faceTags.clear();
1714      index_t offset=0;      index_t offset=0;
1715      for (size_t i=0; i<facesPerEdge.size(); i++) {      for (size_t i=0; i<facesPerEdge.size(); i++) {
1716          if (facesPerEdge[i]>0) {          if (facesPerEdge[i]>0) {
1717              m_faceOffset[i]=offset;              m_faceOffset[i]=offset;
1718              offset+=facesPerEdge[i];              offset+=facesPerEdge[i];
1719                m_faceTags.insert(m_faceTags.end(), facesPerEdge[i], faceTag[i]);
1720          }          }
1721      }      }
1722        setTagMap("left", LEFT);
1723        setTagMap("right", RIGHT);
1724        setTagMap("bottom", BOTTOM);
1725        setTagMap("top", TOP);
1726        setTagMap("front", FRONT);
1727        setTagMap("back", BACK);
1728        updateTagsInUse(FaceElements);
1729  }  }
1730    
1731  //protected  //protected

Legend:
Removed from v.3713  
changed lines
  Added in v.3722

  ViewVC Help
Powered by ViewVC 1.1.26